📄 image.c
字号:
}
img->number /= 2; // reset the img->number to field
img->buf_cycle /= 2;
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, j, k;
int prevP_no, nextP_no;
if (input->InterlaceCodingOption >= MB_CODING)
img->structure = 3;
else
img->structure = 0; //frame coding
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;
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;
#ifdef _CHANGE_QP_
if (input->qp2start > 0 && img->tr >= input->qp2start)
img->qp = input->qpB2;
else
#endif
img->qp = input->qpB;
// initialize arrays
for (k = 0; k < 2; k++)
for (i = 0; i < img->height / BLOCK_SIZE; i++)
for (j = 0; j < img->width / BLOCK_SIZE + 4; j++)
{
tmp_fwMV[k][i][j] = 0;
tmp_bwMV[k][i][j] = 0;
dfMV[k][i][j] = 0;
dbMV[k][i][j] = 0;
}
for (i = 0; i < img->height / BLOCK_SIZE; i++)
for (j = 0; j < img->width / BLOCK_SIZE; j++)
{
fw_refFrArr[i][j] = bw_refFrArr[i][j] = -1;
}
}
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, j, k;
int prevP_no, nextP_no;
last_P_no = last_P_no_fld;
//picture structure
if (!img->fld_type)
img->structure = 1;
else
img->structure = 2;
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;
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; // ?????
#ifdef _CHANGE_QP_
if (input->qp2start > 0 && img->tr >= input->qp2start)
img->qp = input->qpB2;
else
#endif
img->qp = input->qpB;
// initialize arrays
for (k = 0; k < 2; k++)
for (i = 0; i < img->height / BLOCK_SIZE; i++)
for (j = 0; j < img->width / BLOCK_SIZE + 4; j++)
{
tmp_fwMV[k][i][j] = 0;
tmp_bwMV[k][i][j] = 0;
dfMV[k][i][j] = 0;
dbMV[k][i][j] = 0;
}
for (i = 0; i < img->height / BLOCK_SIZE; i++)
for (j = 0; j < img->width / BLOCK_SIZE; j++)
{
fw_refFrArr[i][j] = bw_refFrArr[i][j] = -1;
}
}
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
* Estimates reference picture weighting factors
************************************************************************
*/
static void estimate_weighting_factor ()
{
int i, j, n;
int x,z;
int dc_org = 0;
int index;
int comp;
int p0, pt;
int fwd_ref[MAX_REFERENCE_PICTURES], bwd_ref[MAX_REFERENCE_PICTURES];
int bframe = (img->type == B_SLICE);
int num_ref = min (img->number-((enc_picture!=enc_frame_picture)&&img->fld_type&&bframe), img->buf_cycle);
int dc_ref[MAX_REFERENCE_PICTURES];
int log_weight_denom;
int num_bwd_ref, num_fwd_ref;
pel_t* ref_pic;
pel_t* ref_pic_w;
int default_weight;
int default_weight_chroma;
luma_log_weight_denom = 5;
chroma_log_weight_denom = 5;
wp_luma_round = 1 << (luma_log_weight_denom - 1);
wp_chroma_round = 1 << (chroma_log_weight_denom - 1);
default_weight = 1<<luma_log_weight_denom;
default_weight_chroma = 1<<chroma_log_weight_denom;
/* set all values to defaults */
for (i = 0; i < 2; i++)
for (j = 0; j < MAX_REFERENCE_PICTURES; j++)
for (n = 0; n < 3; n++)
{
wp_weight[i][j][n] = default_weight;
wp_offset[i][j][n] = 0;
}
for (i = 0; i < img->height; i++)
for (j = 0; j < img->width; j++)
{
dc_org += imgY_org[i][j];
}
for (n = 0; n < num_ref; n++)
{
dc_ref[n] = 0;
ref_pic = listX[LIST_0][n]->imgY_11;
ref_pic_w = img->type==B_SLICE? Refbuf11_w [n] : Refbuf11_w[n];
// Y
for (i = 0; i < img->height * img->width; i++)
{
dc_ref[n] += ref_pic[i];
}
if (dc_ref[n] != 0)
weight[n][0] = (int) (default_weight * (double) dc_org / (double) dc_ref[n] + 0.5);
else
weight[n][0] = 2*default_weight; // only used when reference picture is black
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -