📄 image.c
字号:
{
double lambda_picture;
int spframe = (img->type == SP_SLICE);
int bframe = (img->type == B_SLICE);
float snr_frame, snr_field;
int bit_frame, bit_field;
lambda_picture = 0.85 * pow (2, (img->qp - SHIFT_QP) / 3.0) * (bframe || spframe ? 4 : 1);
snr_frame = frame->distortion_y + frame->distortion_u + frame->distortion_v;
//! all distrortions of a field picture are accumulated in the top field
snr_field = top->distortion_y + top->distortion_u + top->distortion_v;
bit_field = top->bits_per_picture + bot->bits_per_picture;
bit_frame = frame->bits_per_picture;
return decide_fld_frame (snr_frame, snr_field, bit_field, bit_frame, lambda_picture);
}
/*!
************************************************************************
* \brief
* Field Mode Buffer
************************************************************************
*/
static void field_mode_buffer (int bit_field, float snr_field_y, float snr_field_u, float snr_field_v)
{
put_buffer_frame ();
snr->snr_y = snr_field_y;
snr->snr_u = snr_field_u;
snr->snr_v = snr_field_v;
}
/*!
************************************************************************
* \brief
* Frame Mode Buffer
************************************************************************
*/
static void frame_mode_buffer (int bit_frame, float snr_frame_y, float snr_frame_u, float snr_frame_v)
{
put_buffer_frame ();
if ((input->PicInterlace != FRAME_CODING)||(input->MbInterlace != FRAME_CODING))
{
img->height = img->height / 2;
img->height_cr = img->height_cr / 2;
img->number *= 2;
put_buffer_top ();
img->number++;
put_buffer_bot ();
img->number /= 2; // reset the img->number to field
img->height = input->img_height;
img->height_cr = input->img_height / 2;
img->total_number_mb =
(img->width * img->height) / (MB_BLOCK_SIZE * MB_BLOCK_SIZE);
snr->snr_y = snr_frame_y;
snr->snr_u = snr_frame_u;
snr->snr_v = snr_frame_v;
put_buffer_frame ();
}
}
/*!
************************************************************************
* \brief
* mmco initializations should go here
************************************************************************
*/
static void init_dec_ref_pic_marking_buffer()
{
img->dec_ref_pic_marking_buffer=NULL;
}
/*!
************************************************************************
* \brief
* Initializes the parameters for a new frame
************************************************************************
*/
static void init_frame ()
{
int i;
int prevP_no, nextP_no;
last_P_no = last_P_no_frm;
img->current_mb_nr = 0;
img->current_slice_nr = 0;
stat->bit_slice = 0;
img->mb_y = img->mb_x = 0;
img->block_y = img->pix_y = img->pix_c_y = 0;
img->block_x = img->pix_x = img->block_c_x = img->pix_c_x = 0;
if (img->type != B_SLICE)
{
img->tr = start_tr_in_this_IGOP + IMG_NUMBER * (input->jumpd + 1);
img->imgtr_last_P_frm = img->imgtr_next_P_frm;
img->imgtr_next_P_frm = img->tr;
#ifdef _ADAPT_LAST_GROUP_
if (input->last_frame && img->number + 1 == input->no_frames)
img->tr = input->last_frame;
#endif
if (IMG_NUMBER != 0 && input->successive_Bframe != 0) // B pictures to encode
nextP_tr_frm = img->tr;
//Rate control
if(!input->RCEnable) // without using rate control
{
if (img->type == I_SLICE)
img->qp = input->qp0; // set quant. parameter for I-frame
else
{
#ifdef _CHANGE_QP_
if (input->qp2start > 0 && img->tr >= input->qp2start)
img->qp = input->qpN2;
else
#endif
img->qp = input->qpN;
if (img->type == SP_SLICE)
{
img->qp = input->qpsp;
img->qpsp = input->qpsp_pred;
}
}
}
img->mb_y_intra = img->mb_y_upd; // img->mb_y_intra indicates which GOB to intra code for this frame
if (input->intra_upd > 0) // if error robustness, find next GOB to update
{
img->mb_y_upd = (IMG_NUMBER / input->intra_upd) % (img->height / MB_BLOCK_SIZE);
}
}
else
{
img->p_interval = input->jumpd + 1;
prevP_no = start_tr_in_this_IGOP + (IMG_NUMBER - 1) * img->p_interval;
nextP_no = start_tr_in_this_IGOP + (IMG_NUMBER) * img->p_interval;
#ifdef _ADAPT_LAST_GROUP_
last_P_no[0] = prevP_no;
for (i = 1; i < img->buf_cycle; i++)
last_P_no[i] = last_P_no[i - 1] - img->p_interval;
if (input->last_frame && img->number + 1 == input->no_frames)
{
nextP_no = input->last_frame;
img->p_interval = nextP_no - prevP_no;
}
#endif
img->b_interval =
(int) ((float) (input->jumpd + 1) / (input->successive_Bframe + 1.0) +
0.49999);
img->tr = prevP_no + img->b_interval * img->b_frame_to_code; // from prev_P
if (img->tr >= nextP_no)
img->tr = nextP_no - 1;
//Rate control
if(!input->RCEnable) // without using rate control
{
#ifdef _CHANGE_QP_
if (input->qp2start > 0 && img->tr >= input->qp2start)
img->qp = input->qpB2;
else
#endif
img->qp = input->qpB;
}
}
UpdateSubseqInfo (img->layer); // Tian Dong (Sept 2002)
UpdateSceneInformation (0, 0, 0, -1); // JVT-D099, scene information SEI, nothing included by default
//! Commented out by StW, needs fixing in SEI.h to keep the trace file clean
// PrepareAggregationSEIMessage ();
// JVT-D097
if (img->type != B_SLICE && input->num_slice_groups_minus1 == 1 && input->FmoType > 3)
{
if (fmo_evlv_NewPeriod)
FmoInitEvolvingMBAmap (input->FmoType, img->width / 16, img->height / 16, MBAmap);
FmoUpdateEvolvingMBAmap (input->FmoType, img->width / 16, img->height / 16, MBAmap);
}
// End JVT-D097
img->total_number_mb = (img->width * img->height) / (MB_BLOCK_SIZE * MB_BLOCK_SIZE);
img->no_output_of_prior_pics_flag = 0;
img->long_term_reference_flag = 0;
init_dec_ref_pic_marking_buffer();
}
/*!
************************************************************************
* \brief
* Initializes the parameters for a new field
************************************************************************
*/
static void init_field ()
{
int i;
int prevP_no, nextP_no;
last_P_no = last_P_no_fld;
img->current_mb_nr = 0;
img->current_slice_nr = 0;
stat->bit_slice = 0;
input->jumpd *= 2;
input->successive_Bframe *= 2;
img->number /= 2;
img->buf_cycle /= 2;
img->mb_y = img->mb_x = 0;
img->block_y = img->pix_y = img->pix_c_y = 0; // define vertical positions
img->block_x = img->pix_x = img->block_c_x = img->pix_c_x = 0; // define horizontal positions
if (img->type != B_SLICE)
{
img->tr = img->number * (input->jumpd + 2) + img->fld_type;
if (!img->fld_type)
{
img->imgtr_last_P_fld = img->imgtr_next_P_fld;
img->imgtr_next_P_fld = img->tr;
}
#ifdef _ADAPT_LAST_GROUP_
if (input->last_frame && img->number + 1 == input->no_frames)
img->tr = input->last_frame;
#endif
if (img->number != 0 && input->successive_Bframe != 0) // B pictures to encode
nextP_tr_fld = img->tr;
//Rate control
if(!input->RCEnable) // without using rate control
{
if (img->type == I_SLICE)
img->qp = input->qp0; // set quant. parameter for I-frame
else
{
#ifdef _CHANGE_QP_
if (input->qp2start > 0 && img->tr >= input->qp2start)
img->qp = input->qpN2;
else
#endif
img->qp = input->qpN;
if (img->type == SP_SLICE)
{
img->qp = input->qpsp;
img->qpsp = input->qpsp_pred;
}
}
}
img->mb_y_intra = img->mb_y_upd; // img->mb_y_intra indicates which GOB to intra code for this frame
if (input->intra_upd > 0) // if error robustness, find next GOB to update
{
img->mb_y_upd =
(img->number / input->intra_upd) % (img->width / MB_BLOCK_SIZE);
}
}
else
{
img->p_interval = input->jumpd + 2;
prevP_no = (img->number - 1) * img->p_interval + img->fld_type;
nextP_no = img->number * img->p_interval + img->fld_type;
#ifdef _ADAPT_LAST_GROUP_
if (!img->fld_type) // top field
{
last_P_no[0] = prevP_no + 1;
last_P_no[1] = prevP_no;
for (i = 1; i <= img->buf_cycle; i++)
{
last_P_no[2 * i] = last_P_no[2 * i - 2] - img->p_interval;
last_P_no[2 * i + 1] = last_P_no[2 * i - 1] - img->p_interval;
}
}
else // bottom field
{
last_P_no[0] = nextP_no - 1;
last_P_no[1] = prevP_no;
for (i = 1; i <= img->buf_cycle; i++)
{
last_P_no[2 * i] = last_P_no[2 * i - 2] - img->p_interval;
last_P_no[2 * i + 1] = last_P_no[2 * i - 1] - img->p_interval;
}
}
if (input->last_frame && img->number + 1 == input->no_frames)
{
nextP_no = input->last_frame;
img->p_interval = nextP_no - prevP_no;
}
#endif
img->b_interval =
(int) ((float) (input->jumpd + 1) / (input->successive_Bframe + 1.0) + 0.49999);
img->tr = prevP_no + (img->b_interval + 1) * img->b_frame_to_code; // from prev_P
if (img->tr >= nextP_no)
img->tr = nextP_no - 1; // ?????
//Rate control
if(!input->RCEnable) // without using rate control
{
#ifdef _CHANGE_QP_
if (input->qp2start > 0 && img->tr >= input->qp2start)
img->qp = input->qpB2;
else
#endif
img->qp = input->qpB;
}
}
input->jumpd /= 2;
input->successive_Bframe /= 2;
img->buf_cycle *= 2;
img->number = 2 * img->number + img->fld_type;
img->total_number_mb = (img->width * img->height) / (MB_BLOCK_SIZE * MB_BLOCK_SIZE);
}
#define Clip(min,max,val) (((val)<(min))?(min):(((val)>(max))?(max):(val)))
/*!
************************************************************************
* \brief
* Generate Full Pel Representation
************************************************************************
*/
static void GenerateFullPelRepresentation (pel_t ** Fourthpel,
pel_t * Fullpel, int xsize,
int ysize)
{
int x, y;
for (y = 0; y < ysize; y++)
for (x = 0; x < xsize; x++)
PutPel_11 (Fullpel, y, x, FastPelY_14 (Fourthpel, y * 4, x * 4, ysize, xsize), xsize);
}
/*!
************************************************************************
* \brief
* Upsample 4 times, store them in out4x. Color is simply copied
*
* \par Input:
* srcy, srcu, srcv, out4y, out4u, out4v
*
* \par Side Effects_
* Uses (writes) img4Y_tmp. This should be moved to a static variable
* in this module
************************************************************************/
void UnifiedOneForthPix (StorablePicture *s)
{
int is;
int i, j, j4;
int ie2, je2, jj, maxy;
byte **out4Y;
byte *ref11;
byte **imgY = s->imgY;
int img_width =s->size_x;
int img_height=s->size_y;
// don't upsample twice
if (s->imgY_ups || s->imgY_11)
return;
s->imgY_11 = malloc ((s->size_x * s->size_y) * sizeof (byte));
if (NULL == s->imgY_11)
no_mem_exit("alloc_storable_picture: s->imgY_11");
get_mem2D (&(s->imgY_ups), (2*IMG_PAD_SIZE + s->size_y)*4, (2*IMG_PAD_SIZE + s->size_x)*4);
if (input->WeightedPrediction || input->WeightedBiprediction)
{
s->imgY_11_w = malloc ((s->size_x * s->size_y) * sizeof (byte));
get_mem2D (&(s->imgY_ups_w), (2*IMG_PAD_SIZE + s->size_y)*4, (2*IMG_PAD_SIZE + s->size_x)*4);
}
out4Y = s->imgY_ups;
ref11 = s->imgY_11;
for (j = -IMG_PAD_SIZE; j < s->size_y + IMG_PAD_SIZE; j++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -