📄 image.c
字号:
}
void init_bot(struct img_par *img, struct inp_par *inp)
{
int i,j;
img->top_bot = 1; // Yulj 2004.07.20
img->current_mb_nr = 0;
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] = mref_fld[0];
mref[1] = core_reference_field[2*core_frame_ref_num+1][0];
mref[2] = core_reference_field[2*core_frame_ref_num][0];
mref[3] = mref_fld[1];
mcef[0][0] = mcef_fld[0][0];
mcef[1][0] = core_reference_field[2*core_frame_ref_num+1][1];
mcef[2][0] = core_reference_field[2*core_frame_ref_num][1];
mcef[3][0] = mcef_fld[1][0];
mcef[0][1] = mcef_fld[0][1];
mcef[1][1] = core_reference_field[2*core_frame_ref_num+1][2];
mcef[2][1] = core_reference_field[2*core_frame_ref_num][2];
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_bot = current_field[0];
imgUV = 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;
}
/*
*************************************************************************
* Function:
* Input:
* Output:
* Return:
* Attention:
*************************************************************************
*/
void split_field_top()
{
int i;
imgY = imgY_top;
imgUV = imgUV_top;
for (i=0; i<img->height; i++)
{
memcpy(imgY[i], imgY_frm[i*2], img->width);
}
for (i=0; i<img->height_cr; i++)
{
memcpy(imgUV[0][i], imgUV_frm[0][i*2], img->width_cr);
memcpy(imgUV[1][i], imgUV_frm[1][i*2], img->width_cr);
}
}
/*
*************************************************************************
* Function:extract bottom field from a frame
* Input:
* Output:
* Return:
* Attention:
*************************************************************************
*/
void split_field_bot()
{
int i;
imgY = imgY_bot;
imgUV = imgUV_bot;
for (i=0; i<img->height; i++)
{
memcpy(imgY[i], imgY_frm[i*2 + 1], img->width);
}
for (i=0; i<img->height_cr; i++)
{
memcpy(imgUV[0][i], imgUV_frm[0][i*2 + 1], img->width_cr);
memcpy(imgUV[1][i], imgUV_frm[1][i*2 + 1], img->width_cr);
}
}
/*
*************************************************************************
* Function:decodes one picture
* Input:
* Output:
* Return:
* Attention:
*************************************************************************
*/
void picture_data(struct img_par *img,struct inp_par *inp)
{
#ifdef ERROR_CONTROL
//核心帧
int tmp = 0;
int i = 0;
int pixelX = 0, pixelY = 0;
unsigned char MBisProcessed[MAX_MB_NR] = {0};
#endif
unsigned char *Buf;
int startcodepos,length;
const int mb_nr = img->current_mb_nr;
int mb_width = img->width/16;
Macroblock *currMB = &mb_data[mb_nr];
#ifdef FLEXPICHEAD
int last_okmb_pos = 0;
int last_errormb_pos = 0;
int mb_height = img->height/16;
if(part_first_slice_read_ok)
{
currStream->frame_bitoffset = currStream->frame_bitoffset;
CopyFromPreviousFrame(0, img->current_mb_nr-1);
}
else
#endif
currStream->frame_bitoffset = 0;
//currStream->frame_bitoffset = 0; // jlzheng 6.30
currentbitoffset = currStream->frame_bitoffset; // jlzheng 6.30
img->current_slice_nr = -1; // jlzheng 6.30
currentbitoffset = currStream->frame_bitoffset; // jlzheng 6.30
// currStream->frame_bitoffset = 0; // jlzheng 6.30
if ((Buf = (char*)calloc (MAX_CODED_FRAME_SIZE , sizeof(char))) == NULL)
no_mem_exit("GetAnnexbNALU: Buf"); //jlzheng 6.30
img->cod_counter=-1;
while (img->current_mb_nr<img->PicSizeInMbs) // loop over macroblocks
{
//decode slice header jlzheng 6.30
if(slice_set_enable || (!slice_set_enable&&img->current_mb_nr%mb_width ==0)) //added by mz, 2008.04
{
if(img->cod_counter<=0)
{
#ifdef FLEXPICHEAD
if(!part_first_slice_read_ok)
{
#endif
if(checkstartcode())
{
GetOneUnit(Buf,&startcodepos,&length);
#ifdef ERROR_CONTROL
//错误保护
if ( ( Buf[startcodepos] == SEQUENCE_HEADER_CODE)
|| ( Buf[startcodepos] == I_PICTURE_START_CODE)
|| ( Buf[startcodepos] == PB_PICTURE_START_CODE ) )
{
prevPictureheaderloss = 1;
memcpy ( gBuf, Buf, length );
gbuflen = length;
gstartcodepos = startcodepos;
img->current_mb_nr = 0;
#ifdef FLEXPICHEAD
last_errormb_pos = img->PicSizeInMbs;
CopyFromPreviousFrame(last_okmb_pos, img->PicSizeInMbs-1);
#endif
break;
}
tmp = SliceHeader(Buf,startcodepos,length);
#ifdef FLEXPICHEAD
if(tmp>mb_width*mb_height || tmp < 0)
{
CopyFromPreviousFrame(last_okmb_pos, img->PicSizeInMbs-1);//需要处理缺帧头的情况
break;
}
#endif
if ( MBisProcessed[tmp]==1)
{
#ifdef FLEXPICHEAD
CopyFromPreviousFrame(last_okmb_pos, img->PicSizeInMbs-1);
#endif
break;
}
img->current_mb_nr = tmp;
//错误保护 end
#ifdef FLEXPICHEAD
if (img->current_mb_nr != last_okmb_pos)//有SLICE丢失
CopyFromPreviousFrame(last_okmb_pos, img->current_mb_nr-1);
#endif
#else
SliceHeader(Buf,startcodepos,length);
#endif
img->current_slice_nr++;
img->cod_counter = -1; // Yulj 2004.07.15
}
#ifdef FLEXPICHEAD
}
part_first_slice_read_ok = FALSE;
#endif
}
} //decode slice header
if(img->current_mb_nr == 0)
img->current_slice_nr = 0;
mb_data[img->current_mb_nr].slice_nr = img->current_slice_nr; // jlzheng 6.30
//added by mz, 2008.04
if(slice_set_enable)
mb_data[img->current_mb_nr].slice_set_index = img->current_slice_set_index;
#if TRACE
// Here was the slice nr from the mb_data used. This slice number is only set after
// the reconstruction of an MB and hence here not yet valid
fprintf(p_trace,"\n*********** Pic: %i (I/P) MB: %i Slice: %i Type %d **********\n", img->tr, img->current_mb_nr, img->current_slice_nr, img->type);
#endif
// Initializes the current macroblock
start_macroblock(img,inp);
// Get the syntax elements from the NAL
read_one_macroblock(img,inp);
#ifdef ERROR_CONTROL
//错误保护
if( bBitstreamErr )
{
break;
}
#endif
// decode one macroblock
decode_one_macroblock(img,inp);
#ifdef ERROR_CONTROL
//错误保护
MBisProcessed[img->current_mb_nr] = 1;
#endif
img->current_mb_nr++;
#ifdef FLEXPICHEAD
last_okmb_pos = img->current_mb_nr;
#endif
}
free(Buf);
DeblockFrame (img, imgY, imgUV);
#ifdef BACKGROUND
{
int j;
int i;
if(img->type == P_IMG && img->typeb == BP_IMG){
for(j = 0; j < img->height/8; j++)
for(i = 0; i < img->width/8; i++)
refFrArr[j][i] = -1;
}
}
#endif
}
void top_field(struct img_par *img,struct inp_par *inp)
{
#ifdef ERROR_CONTROL
//错误保护
int tmp = 0;
int i = 0;
int pixelX = 0, pixelY = 0;
unsigned char MBisProcessed[MAX_MB_NR/2] = {0};
#endif
unsigned char *Buf;
int startcodepos,length;
const int mb_nr = img->current_mb_nr;
int mb_width = img->width/16;
Macroblock *currMB = &mb_data[mb_nr];
#ifdef FLEXPICHEAD
int last_okmb_pos = 0;
int last_errormb_pos = 0;
int mb_height = img->height/16;
if(part_first_slice_read_ok)
{
currStream->frame_bitoffset = currStream->frame_bitoffset;
CopyFromPreviousFrame(0, img->current_mb_nr-1);
}
else
#endif
currStream->frame_bitoffset = 0;
currentbitoffset = currStream->frame_bitoffset; // jlzheng 6.30
img->current_slice_nr = -1; // jlzheng 6.30
currentbitoffset = currStream->frame_bitoffset; // jlzheng 6.30
// currStream->frame_bitoffset = 0;
if ((Buf = (char*)calloc (MAX_CODED_FRAME_SIZE , sizeof(char))) == NULL)
no_mem_exit("GetAnnexbNALU: Buf"); //jlzheng
img->cod_counter=-1;
while (img->current_mb_nr<img->PicSizeInMbs) // loop over macroblocks
{
//decode slice header jlzheng 6.30
if(slice_set_enable ||(!slice_set_enable&&img->current_mb_nr%mb_width ==0)) //added by mz, 2008.04
{
if(img->cod_counter<=0)
{
#ifdef FLEXPICHEAD
if(!part_first_slice_read_ok)
{
#endif
if(checkstartcode())
{
GetOneUnit(Buf,&startcodepos,&length);
#ifdef ERROR_CONTROL
//错误保护
if ( ( Buf[startcodepos] == SEQUENCE_HEADER_CODE)
|| ( Buf[startcodepos] == I_PICTURE_START_CODE)
|| ( Buf[startcodepos] == PB_PICTURE_START_CODE ) )
{
prevPictureheaderloss = 1;
memcpy ( gBuf, Buf, length );
gbuflen = length;
gstartcodepos = startcodepos;
img->current_mb_nr = 0;
#ifdef FLEXPICHEAD
last_errormb_pos = img->PicSizeInMbs;
CopyFromPreviousFrame(last_okmb_pos, img->PicSizeInMbs-1);
#endif
break;
}
tmp = SliceHeader ( Buf, startcodepos, length );
#ifdef FLEXPICHEAD
if(tmp>mb_width*mb_height || tmp < 0)
{
CopyFromPreviousFrame(last_okmb_pos, img->PicSizeInMbs-1);//需要处理缺帧头的情况
break;
}
#endif
if ( ( MBisProcessed[tmp] == 1 ) || ( tmp >= img->PicSizeInMbs ) || ( tmp < 0 ) )
{
#ifdef FLEXPICHEAD
CopyFromPreviousFrame(last_okmb_pos, img->PicSizeInMbs-1);
#endif
break;
}
img->current_mb_nr = tmp;
//错误保护end
#ifdef FLEXPICHEAD
if (img->current_mb_nr != last_okmb_pos)//有SLICE丢失
CopyFromPreviousFrame(last_okmb_pos, img->current_mb_nr-1);
#endif
#else
SliceHeader(Buf,startcodepos,length);
#endif
img->current_slice_nr++;
img->cod_counter = -1; // Yulj 2004.07.15
}
#ifdef FLEXPICHEAD
}
part_first_slice_read_ok = FALSE;
#endif
}
} //decode slice header
if(img->current_mb_nr == 0)
img->current_slice_nr = 0;
mb_data[img->current_mb_nr].slice_nr = img->current_slice_nr; // jlzheng 6.30
//added by mz, 2008.04
if(slice_set_enable)
mb_data[img->current_mb_nr].slice_set_index = img->current_slice_set_index;
#if TRACE
// Here was the slice nr from the mb_data used. This slice number is only set after
// the reconstruction of an MB and hence here not yet valid
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -