📄 image.c
字号:
length = gbuflen;
startcodepos = gstartcodepos;
memcpy ( Buf, gBuf, length );
}
else
{
do{
StartCodePosition = GetOneUnit(Buf,&startcodepos,&length); //jlzheng 7.5
#ifdef FLEXPICHEAD
if((Buf[startcodepos] < SLICE_START_CODE_MAX) && (Buf[startcodepos] >= SLICE_START_CODE_MIN))
{
temp = SliceHeader(Buf,startcodepos,length);
if(slice_picture_header_flag) //条带有图象头部分参数
{
img->current_mb_nr = temp;
part_first_slice_read_ok = TRUE;
return 999;
}
else //条带无图象头参数
continue;
}
#endif
}while ( ( Buf[startcodepos] != SEQUENCE_HEADER_CODE )
&& ( Buf[startcodepos] != EXTENSION_START_CODE )
&& ( Buf[startcodepos] != USER_DATA_START_CODE )
&& ( Buf[startcodepos] != VIDEO_EDIT_CODE )
&& ( Buf[startcodepos] != I_PICTURE_START_CODE )
&& ( Buf[startcodepos] != PB_PICTURE_START_CODE )
&& ( Buf[startcodepos] != SEQUENCE_END_CODE )
);
}
prevPictureheaderloss = 0;
#else
StartCodePosition = GetOneUnit(Buf,&startcodepos,&length); //jlzheng 7.5
#endif
switch(Buf[startcodepos])
{
case SEQUENCE_HEADER_CODE:
SequenceHeader(Buf,startcodepos,length);
break;
case EXTENSION_START_CODE:
extension_data(Buf,startcodepos,length);
break;
case USER_DATA_START_CODE:
user_data(Buf,startcodepos,length);
break;
case VIDEO_EDIT_CODE:
video_edit_code_data(Buf,startcodepos,length);
break;
case I_PICTURE_START_CODE:
I_Picture_Header(Buf,startcodepos,length);
calc_picture_distance(img);
free(Buf);
return SOP;
case PB_PICTURE_START_CODE:
PB_Picture_Header(Buf,startcodepos,length);
calc_picture_distance(img);
free(Buf);
return SOP;
case SEQUENCE_END_CODE:
free(Buf);
return EOS;
break;
default:
if (Buf[startcodepos]>=SLICE_START_CODE_MIN && Buf[startcodepos]<=SLICE_START_CODE_MAX) {
break;
} else {
printf("Can't find start code");
free(Buf);
return EOS;
}
}
}
}
/*
*************************************************************************
* Function:Initializes the parameters for a new frame
* Input:
* Output:
* Return:
* Attention:
*************************************************************************
*/
void init_frame(struct img_par *img, struct inp_par *inp)
{
static int first_P = TRUE;
int i,j;
img->top_bot = -1; // Yulj 2004.07.20
last_P_no = last_P_no_frm;
nextP_tr = nextP_tr_frm;
if (img->number == 0) // first picture
{
// nextP_tr=prevP_tr=img->tr; // Xiaozhen ZHENG
nextP_tr=prevP_tr=img->pic_distance; // Xiaozhen ZHENG, 2007.05.01
}
else if(img->type == I_IMG || img->type == P_IMG )
{
// nextP_tr=img->tr; // Commented by Xiaozhen ZHENG, 2007.05.01
nextP_tr=img->pic_distance; // Added by Xiaozhen ZHENG, 2007.05.01
if(first_P) // first P picture
{
first_P = FALSE;
P_interval=nextP_tr-prevP_tr; //! TO 4.11.2001 we get problems here in case the first P-Frame was lost
}
//added by Zheng Xiaozhen, HiSilicon, 2007.03.21 Begin
if (p_ref)
find_snr(snr,img,p_ref); // if ref sequence exist
if(pre_img_type == I_IMG){ // I picture
#ifdef BACKGROUND
if(pre_img_typeb == BACKGROUND_IMG)
fprintf(stdout,"%3d(G) %3d %5d %7.4f %7.4f %7.4f %5d\n",
FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time);
else
fprintf(stdout,"%3d(I) %3d %5d %7.4f %7.4f %7.4f %5d\n",
FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time);
#else
fprintf(stdout,"%3d(I) %3d %5d %7.4f %7.4f %7.4f %5d\n",
FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time);
#endif
}
else if(pre_img_type == P_IMG) // P pictures
{
if (pre_img_types == I_IMG){
#ifdef BACKGROUND
if(pre_img_typeb == BACKGROUND_IMG)
fprintf(stdout,"%3d(G) %3d %5d %7.4f %7.4f %7.4f %5d\n",
FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time); //jlzheng 7.3
else
fprintf(stdout,"%3d(I) %3d %5d %7.4f %7.4f %7.4f %5d\n",
FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time); //jlzheng 7.3
#else
fprintf(stdout,"%3d(I) %3d %5d %7.4f %7.4f %7.4f %5d\n",
FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time); //jlzheng 7.3
#endif
}
else{
#ifdef BACKGROUND
if(pre_img_typeb == BP_IMG)
fprintf(stdout,"%3d(S) %3d %5d %7.4f %7.4f %7.4f %5d\n",
FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time);
else
fprintf(stdout,"%3d(P) %3d %5d %7.4f %7.4f %7.4f %5d\n",
FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time);
#else
fprintf(stdout,"%3d(P) %3d %5d %7.4f %7.4f %7.4f %5d\n",
FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time);
#endif
}
}
report_frame(snr,pre_tmp_time);
//added by Zheng Xiaozhen, HiSilicon, 2007.03.21 End
write_prev_Pframe(img, p_out); // imgY_prev, imgUV_prev -> file
}
// allocate memory for frame buffers
if (img->number == 0)
{
init_global_buffers(inp, img);
}
for(i=0;i<img->width/(2*BLOCK_SIZE)+1;i++) // set edge to -1, indicate nothing to predict from
{
img->ipredmode[i+1][0]=-1;
img->ipredmode[i+1][img->height/(2*BLOCK_SIZE)+1]=-1;
}
for(j=0;j<img->height/(2*BLOCK_SIZE)+1;j++)
{
img->ipredmode[0][j+1]=-1;
img->ipredmode[img->width/(2*BLOCK_SIZE)+1][j+1]=-1;
}
img->ipredmode [0][0]=-1;
for(i=0; i<img->max_mb_nr; i++)
{
mb_data[i].slice_nr = -1;
}
#ifdef CRPS
//核心帧
if(cur_core_frame_flag)
{
//luma
mref[0] = core_reference_frame[core_frame_ref_num][0];
mref[1] = mref_frm[0];
mref_fref[0] = mref_fref_frm[0]; //mref_fref[ref_index][yuv]height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
mref_bref[0] = mref_bref_frm[0];
//chroma
mcef[0][0] = core_reference_frame[core_frame_ref_num][1]; //mcef[ref_index][uv][height][width]
mcef[0][1] = core_reference_frame[core_frame_ref_num][2];
mcef[1][0] = mcef_frm[0][0];
mcef[1][1] = mcef_frm[0][1];
mcef_fref[0][0] = mcef_fref_frm[0][0]; //mcef_fref[ref_index][uv][height/2][width]
mcef_fref[0][1] = mcef_fref_frm[0][1];
mcef_bref[0][0] = mcef_bref_frm[0][0];
mcef_bref[0][1] = mcef_bref_frm[0][1];
}
else
{
#endif
//luma
mref[0] = mref_frm[0]; //mref[ref_index][yuv]height(height/2)][width] ref_index=0,1 for P frame, ref_index = 0,1,2,3 for P field
mref[1] = mref_frm[1];
mref_fref[0] = mref_fref_frm[0]; //mref_fref[ref_index][yuv]height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
mref_bref[0] = mref_bref_frm[0];
//chroma
mcef[0][0] = mcef_frm[0][0]; //mcef[ref_index][uv][height][width]
mcef[0][1] = mcef_frm[0][1];
mcef[1][0] = mcef_frm[1][0];
mcef[1][1] = mcef_frm[1][1];
#ifdef BACKGROUND
mref[2] = background_frame[0];
mcef[2][0] = background_frame[1];
mcef[2][1] = background_frame[2];
#endif
mcef_fref[0][0] = mcef_fref_frm[0][0]; //mcef_fref[ref_index][uv][height/2][width]
mcef_fref[0][1] = mcef_fref_frm[0][1];
mcef_bref[0][0] = mcef_bref_frm[0][0];
mcef_bref[0][1] = mcef_bref_frm[0][1];
#ifdef CRPS
}
#endif
imgY = imgY_frm = current_frame[0];
imgUV = imgUV_frm = ¤t_frame[1];
img->mv = img->mv_frm;
refFrArr = refFrArr_frm;
img->fw_refFrArr = img->fw_refFrArr_frm;
img->bw_refFrArr = img->bw_refFrArr_frm;
}
void init_frame_buffer()
{
// //luma
// mref[0] = mref_frm[0]; //mref[ref_index][yuv]height(height/2)][width] ref_index=0,1 for P frame, ref_index = 0,1,2,3 for P field
// mref[1] = mref_frm[1];
// mref_fref[0] = mref_fref_frm[0]; //mref_fref[ref_index][yuv]height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
// mref_bref[0] = mref_bref_frm[0];
//
// //chroma
// mcef[0][0] = mcef_frm[0][0]; //mcef[ref_index][uv][height][width]
// mcef[0][1] = mcef_frm[0][1];
// mcef[1][0] = mcef_frm[1][0];
// mcef[1][1] = mcef_frm[1][1];
//
// mcef_fref[0][0] = mcef_fref_frm[0][0]; //mcef_fref[ref_index][uv][height/2][width]
// mcef_fref[0][1] = mcef_fref_frm[0][1];
// mcef_bref[0][0] = mcef_bref_frm[0][0];
// mcef_bref[0][1] = mcef_bref_frm[0][1];
imgY_frm = current_frame[0];
imgUV_frm = ¤t_frame[1];
}
void init_top(struct img_par *img, struct inp_par *inp)
{
int i,j;
img->top_bot = 0; // Yulj 2004.07.20
for(i=0;i<img->width/(2*BLOCK_SIZE)+1;i++) // set edge to -1, indicate nothing to predict from
{
img->ipredmode[i+1][0]=-1;
img->ipredmode[i+1][img->height/(2*BLOCK_SIZE)+1]=-1;
}
for(j=0;j<img->height/(2*BLOCK_SIZE)+1;j++)
{
img->ipredmode[0][j+1]=-1;
img->ipredmode[img->width/(2*BLOCK_SIZE)+1][j+1]=-1;
}
img->ipredmode [0][0]=-1;
for(i=0; i<img->max_mb_nr; i++)
{
mb_data[i].slice_nr = -1;
}
#ifdef CRPS
//核心帧
if(cur_core_frame_flag)
{
mref[0] = core_reference_field[2*core_frame_ref_num+1][0];
mref[1] = core_reference_field[2*core_frame_ref_num][0];
mref[2] = mref_fld[0];
mref[3] = mref_fld[1];
mcef[0][0] = core_reference_field[2*core_frame_ref_num+1][1];
mcef[1][0] = core_reference_field[2*core_frame_ref_num][1];
mcef[2][0] = mcef_fld[0][0];
mcef[3][0] = mcef_fld[1][0];
mcef[0][1] = core_reference_field[2*core_frame_ref_num+1][2];
mcef[1][1] = core_reference_field[2*core_frame_ref_num][2];
mcef[2][1] = mcef_fld[0][1];
mcef[3][1] = mcef_fld[1][1];
}
else
{
#endif
//luma
for (i=0;i<4;i++)
{
mref[i] = mref_fld[i]; //mref[ref_index][yuv]height(height/2)][width] ref_index=0,1 for P frame, ref_index = 0,1,2,3 for P field
}
//chroma
for(j=0;j<4;j++)
for(i=0;i<2;i++)
{
mcef[j][i] = mcef_fld[j][i]; //mcef[ref_index][uv][height][width]
}
#ifdef CRPS
}
#endif
//forward/backward
for (i=0;i<2;i++)
{
mref_fref[i] = mref_fref_fld[i]; //mref_fref[ref_index][yuv]height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
mref_bref[i] = mref_bref_fld[i];
}
for(j=0;j<2;j++)
for(i=0;i<2;i++)
{
mcef_fref[j][i] = mcef_fref_fld[j][i]; //mcef_fref[ref_index][uv][height/2][width]
mcef_bref[j][i] = mcef_bref_fld[j][i];
}
imgY = imgY_top = current_field[0];
imgUV = imgUV_top = ¤t_field[1];
img->mv = img->mv_top;
refFrArr = refFrArr_top;
img->fw_refFrArr = img->fw_refFrArr_top;
img->bw_refFrArr = img->bw_refFrArr_top;
}
void init_top_buffer()
{
int i,j;
//luma
for (i=0;i<4;i++)
{
mref[i] = mref_fld[i]; //mref[ref_index][yuv]height(height/2)][width] ref_index=0,1 for P frame, ref_index = 0,1,2,3 for P field
}
//chroma
for(j=0;j<4;j++)
for(i=0;i<2;i++)
{
mcef[j][i] = mcef_fld[j][i]; //mcef[ref_index][uv][height][width]
}
//forward/backward
for (i=0;i<2;i++)
{
mref_fref[i] = mref_fref_fld[i]; //mref_fref[ref_index][yuv]height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
mref_bref[i] = mref_bref_fld[i];
}
for(j=0;j<2;j++)
for(i=0;i<2;i++)
{
mcef_fref[j][i] = mcef_fref_fld[j][i]; //mcef_fref[ref_index][uv][height/2][width]
mcef_bref[j][i] = mcef_bref_fld[j][i];
}
imgY_top = current_field[0];
imgUV_top = ¤t_field[1];
img->mv = img->mv_top;
refFrArr = refFrArr_top;
img->fw_refFrArr = img->fw_refFrArr_top;
img->bw_refFrArr = img->bw_refFrArr_top;
}
void init_bot_buffer()
{
//luma
int i,j;
for (i=0;i<4;i++)
{
mref[i] = mref_fld[i]; //mref[ref_index][yuv]height(height/2)][width] ref_index=0,1 for P frame, ref_index = 0,1,2,3 for P field
}
//chroma
for(j=0;j<4;j++)
for(i=0;i<2;i++)
{
mcef[j][i] = mcef_fld[j][i]; //mcef[ref_index][uv][height][width]
}
//forward/backward
for (i=0;i<2;i++)
{
mref_fref[i] = mref_fref_fld[i]; //mref_fref[ref_index][yuv]height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
mref_bref[i] = mref_bref_fld[i];
}
for(j=0;j<2;j++)
for(i=0;i<2;i++)
{
mcef_fref[j][i] = mcef_fref_fld[j][i]; //mcef_fref[ref_index][uv][height/2][width]
mcef_bref[j][i] = mcef_bref_fld[j][i];
}
imgY_bot = current_field[0];
imgUV_bot = ¤t_field[1];
img->mv = img->mv_bot;
refFrArr = refFrArr_bot;
img->fw_refFrArr = img->fw_refFrArr_bot;
img->bw_refFrArr = img->bw_refFrArr_bot;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -