📄 image.c
字号:
if( IS_INDEPENDENT(img) )
{
int colour_plane_id = img->colour_plane_id;
for( nplane=0; nplane<MAX_PLANE; nplane++ )
{
change_plane_JV( nplane );
DeblockPicture( img, dec_picture );
}
img->colour_plane_id = colour_plane_id;
make_frame_picture_JV();
}
else
{
DeblockPicture( img, dec_picture );
}
if (dec_picture->MbaffFrameFlag)
MbAffPostProc();
recfr.yptr = &dec_picture->imgY[0][0];
if (dec_picture->chroma_format_idc != YUV400)
{
recfr.uptr = &dec_picture->imgUV[0][0][0];
recfr.vptr = &dec_picture->imgUV[1][0][0];
}
//! this is always true at the beginning of a picture
ercStartMB = 0;
ercSegment = 0;
//! mark the start of the first segment
if (!dec_picture->MbaffFrameFlag)
{
ercStartSegment(0, ercSegment, 0 , erc_errorVar);
//! generate the segments according to the macroblock map
for(i = 1; i<dec_picture->PicSizeInMbs; i++)
{
if(img->mb_data[i].ei_flag != img->mb_data[i-1].ei_flag)
{
ercStopSegment(i-1, ercSegment, 0, erc_errorVar); //! stop current segment
//! mark current segment as lost or OK
if(img->mb_data[i-1].ei_flag)
ercMarkCurrSegmentLost(dec_picture->size_x, erc_errorVar);
else
ercMarkCurrSegmentOK(dec_picture->size_x, erc_errorVar);
ercSegment++; //! next segment
ercStartSegment(i, ercSegment, 0 , erc_errorVar); //! start new segment
ercStartMB = i;//! save start MB for this segment
}
}
//! mark end of the last segment
ercStopSegment(dec_picture->PicSizeInMbs-1, ercSegment, 0, erc_errorVar);
if(img->mb_data[i-1].ei_flag)
ercMarkCurrSegmentLost(dec_picture->size_x, erc_errorVar);
else
ercMarkCurrSegmentOK(dec_picture->size_x, erc_errorVar);
//! call the right error concealment function depending on the frame type.
erc_mvperMB /= dec_picture->PicSizeInMbs;
erc_img = img;
if(dec_picture->slice_type == I_SLICE || dec_picture->slice_type == SI_SLICE) // I-frame
ercConcealIntraFrame(&recfr, dec_picture->size_x, dec_picture->size_y, erc_errorVar);
else
ercConcealInterFrame(&recfr, erc_object_list, dec_picture->size_x, dec_picture->size_y, erc_errorVar, dec_picture->chroma_format_idc);
}
if (img->structure == FRAME) // buffer mgt. for frame mode
frame_postprocessing(img);
else
field_postprocessing(img); // reset all interlaced variables
structure = dec_picture->structure;
slice_type = dec_picture->slice_type;
frame_poc = dec_picture->frame_poc;
refpic = dec_picture->used_for_reference;
qp = dec_picture->qp;
pic_num = dec_picture->pic_num;
is_idr = dec_picture->idr_flag;
chroma_format_idc= dec_picture->chroma_format_idc;
store_picture_in_dpb(dec_picture);
dec_picture=NULL;
if (img->last_has_mmco_5)
{
img->pre_frame_num = 0;
}
if (params->silent == FALSE)
{
if (structure==TOP_FIELD || structure==FRAME)
{
if(slice_type == I_SLICE && is_idr) // IDR picture
strcpy(cslice_type,"IDR");
else if(slice_type == I_SLICE) // I picture
strcpy(cslice_type," I ");
else if(slice_type == P_SLICE) // P pictures
strcpy(cslice_type," P ");
else if(slice_type == SP_SLICE) // SP pictures
strcpy(cslice_type,"SP ");
else if (slice_type == SI_SLICE)
strcpy(cslice_type,"SI ");
else if(refpic) // stored B pictures
strcpy(cslice_type," B ");
else // B pictures
strcpy(cslice_type," b ");
if (structure==FRAME)
{
strncat(cslice_type,") ",8-strlen(cslice_type));
}
}
else if (structure==BOTTOM_FIELD)
{
if(slice_type == I_SLICE && is_idr) // IDR picture
strncat(cslice_type,"|IDR)",8-strlen(cslice_type));
else if(slice_type == I_SLICE) // I picture
strncat(cslice_type,"| I )",8-strlen(cslice_type));
else if(slice_type == P_SLICE) // P pictures
strncat(cslice_type,"| P )",8-strlen(cslice_type));
else if(slice_type == SP_SLICE) // SP pictures
strncat(cslice_type,"|SP )",8-strlen(cslice_type));
else if (slice_type == SI_SLICE)
strncat(cslice_type,"|SI )",8-strlen(cslice_type));
else if(refpic) // stored B pictures
strncat(cslice_type,"| B )",8-strlen(cslice_type));
else // B pictures
strncat(cslice_type,"| b )",8-strlen(cslice_type));
}
}
if ((structure==FRAME)||structure==BOTTOM_FIELD)
{
gettime (&(img->end_time)); // end time
tmp_time= timediff(&(img->start_time), &(img->end_time));
tot_time=tot_time + tmp_time;
sprintf(yuvFormat,"%s", yuv_types[chroma_format_idc]);
if (params->silent == FALSE)
{
if (p_ref != -1)
fprintf(stdout,"%05d(%s%5d %5d %5d %8.4f %8.4f %8.4f %s %7d\n",
frame_no, cslice_type, frame_poc, pic_num, qp, snr->snr[0], snr->snr[1], snr->snr[2], yuvFormat, (int)tmp_time);
else
fprintf(stdout,"%05d(%s%5d %5d %5d %s %7d\n",
frame_no, cslice_type, frame_poc, pic_num, qp, yuvFormat, (int)tmp_time);
}
else
fprintf(stdout,"Completed Decoding frame %05d.\r",snr->frame_ctr);
fflush(stdout);
if(slice_type == I_SLICE || slice_type == SI_SLICE || slice_type == P_SLICE || refpic) // I or P pictures
img->number++;
else
Bframe_ctr++; // B pictures
snr->frame_ctr++;
g_nFrame++;
}
img->current_mb_nr = -4712; // impossible value for debugging, StW
img->current_slice_nr = 0;
}
/*!
************************************************************************
* \brief
* write the encoding mode and motion vectors of current
* MB to the buffer of the error concealment module.
************************************************************************
*/
void ercWriteMBMODEandMV(Macroblock *currMB, ImageParameters *img,struct inp_par *inp)
{
extern objectBuffer_t *erc_object_list;
int i, ii, jj, currMBNum = img->current_mb_nr;
int mbx = xPosMB(currMBNum,dec_picture->size_x), mby = yPosMB(currMBNum,dec_picture->size_x);
objectBuffer_t *currRegion, *pRegion;
short*** mv;
currRegion = erc_object_list + (currMBNum<<2);
if(img->type != B_SLICE) //non-B frame
{
for (i=0; i<4; i++)
{
pRegion = currRegion + i;
pRegion->regionMode = (currMB->mb_type ==I16MB ? REGMODE_INTRA :
currMB->b8mode[i]==IBLOCK ? REGMODE_INTRA_8x8 :
currMB->b8mode[i]==0 ? REGMODE_INTER_COPY :
currMB->b8mode[i]==1 ? REGMODE_INTER_PRED : REGMODE_INTER_PRED_8x8);
if (currMB->b8mode[i]==0 || currMB->b8mode[i]==IBLOCK) // INTRA OR COPY
{
pRegion->mv[0] = 0;
pRegion->mv[1] = 0;
pRegion->mv[2] = 0;
}
else
{
ii = 4*mbx + (i & 0x01)*2;// + BLOCK_SIZE;
jj = 4*mby + (i >> 1 )*2;
if (currMB->b8mode[i]>=5 && currMB->b8mode[i]<=7) // SMALL BLOCKS
{
pRegion->mv[0] = (dec_picture->motion.mv[LIST_0][jj][ii][0] + dec_picture->motion.mv[LIST_0][jj][ii+1][0] + dec_picture->motion.mv[LIST_0][jj+1][ii][0] + dec_picture->motion.mv[LIST_0][jj+1][ii+1][0] + 2)/4;
pRegion->mv[1] = (dec_picture->motion.mv[LIST_0][jj][ii][1] + dec_picture->motion.mv[LIST_0][jj][ii+1][1] + dec_picture->motion.mv[LIST_0][jj+1][ii][1] + dec_picture->motion.mv[LIST_0][jj+1][ii+1][1] + 2)/4;
}
else // 16x16, 16x8, 8x16, 8x8
{
pRegion->mv[0] = dec_picture->motion.mv[LIST_0][jj][ii][0];
pRegion->mv[1] = dec_picture->motion.mv[LIST_0][jj][ii][1];
// pRegion->mv[0] = dec_picture->motion.mv[LIST_0][4*mby+(i/2)*2][4*mbx+(i%2)*2+BLOCK_SIZE][0];
// pRegion->mv[1] = dec_picture->motion.mv[LIST_0][4*mby+(i/2)*2][4*mbx+(i%2)*2+BLOCK_SIZE][1];
}
erc_mvperMB += iabs(pRegion->mv[0]) + iabs(pRegion->mv[1]);
pRegion->mv[2] = dec_picture->motion.ref_idx[LIST_0][jj][ii];
}
}
}
else //B-frame
{
for (i=0; i<4; i++)
{
ii = 4*mbx + (i%2)*2;// + BLOCK_SIZE;
jj = 4*mby + (i/2)*2;
pRegion = currRegion + i;
pRegion->regionMode = (currMB->mb_type ==I16MB ? REGMODE_INTRA :
currMB->b8mode[i]==IBLOCK ? REGMODE_INTRA_8x8 : REGMODE_INTER_PRED_8x8);
if (currMB->mb_type==I16MB || currMB->b8mode[i]==IBLOCK) // INTRA
{
pRegion->mv[0] = 0;
pRegion->mv[1] = 0;
pRegion->mv[2] = 0;
}
else
{
int idx = (dec_picture->motion.ref_idx[0][jj][ii]<0)?1:0;
// int idx = (currMB->b8mode[i]==0 && currMB->b8pdir[i]==2 ? LIST_0 : currMB->b8pdir[i]==1 ? LIST_1 : LIST_0);
// int idx = currMB->b8pdir[i]==0 ? LIST_0 : LIST_1;
mv = dec_picture->motion.mv[idx];
pRegion->mv[0] = (mv[jj][ii][0] + mv[jj][ii+1][0] + mv[jj+1][ii][0] + mv[jj+1][ii+1][0] + 2)/4;
pRegion->mv[1] = (mv[jj][ii][1] + mv[jj][ii+1][1] + mv[jj+1][ii][1] + mv[jj+1][ii+1][1] + 2)/4;
erc_mvperMB += iabs(pRegion->mv[0]) + iabs(pRegion->mv[1]);
pRegion->mv[2] = (dec_picture->motion.ref_idx[idx][jj][ii]);
/*
if (currMB->b8pdir[i]==0 || (currMB->b8pdir[i]==2 && currMB->b8mode[i]!=0)) // forward or bidirect
{
pRegion->mv[2] = (dec_picture->motion.ref_idx[LIST_0][jj][ii]);
///???? is it right, not only "img->fw_refFrArr[jj][ii-4]"
}
else
{
pRegion->mv[2] = (dec_picture->motion.ref_idx[LIST_1][jj][ii]);
// pRegion->mv[2] = 0;
}
*/
}
}
}
}
/*!
************************************************************************
* \brief
* set defaults for old_slice
* NAL unit of a picture"
************************************************************************
*/
void init_old_slice(void)
{
old_slice.field_pic_flag = 0;
old_slice.pps_id = INT_MAX;
old_slice.frame_num = INT_MAX;
old_slice.nal_ref_idc = INT_MAX;
old_slice.idr_flag = FALSE;
old_slice.pic_oder_cnt_lsb = UINT_MAX;
old_slice.delta_pic_oder_cnt_bottom = INT_MAX;
old_slice.delta_pic_order_cnt[0] = INT_MAX;
old_slice.delta_pic_order_cnt[1] = INT_MAX;
}
/*!
************************************************************************
* \brief
* save slice parameters that are needed for checking of "first VCL
* NAL unit of a picture"
************************************************************************
*/
void exit_slice(void)
{
old_slice.pps_id = img->currentSlice->pic_parameter_set_id;
old_slice.frame_num = img->frame_num;
old_slice.field_pic_flag = img->field_pic_flag;
if(img->field_pic_flag)
{
old_slice.bottom_field_flag = img->bottom_field_flag;
}
old_slice.nal_ref_idc = img->nal_reference_idc;
old_slice.idr_flag = img->idr_flag;
if (img->idr_flag)
{
old_slice.idr_pic_id = img->idr_pic_id;
}
if (active_sps->pic_order_cnt_type == 0)
{
old_slice.pic_oder_cnt_lsb = img->pic_order_cnt_lsb;
old_slice.delta_pic_oder_cnt_bottom = img->delta_pic_order_cnt_bottom;
}
if (active_sps->pic_order_cnt_type == 1)
{
old_slice.delta_pic_order_cnt[0] = img->delta_pic_order_cnt[0];
old_slice.delta_pic_order_cnt[1] = img->delta_pic_order_cnt[1];
}
}
/*!
************************************************************************
* \brief
* detect if current slice is "first VCL NAL unit of a picture"
************************************************************************
*/
int is_new_picture(void)
{
int result=0;
result |= (NULL==dec_picture);
result |= (old_slice.pps_id != img->currentSlice->pic_parameter_set_id);
result |= (old_slice.frame_num != img->frame_num);
result |= (old_slice.field_pic_flag != img->field_pic_flag);
if(img->field_pic_flag && old_slice.field_pic_flag)
{
result |= (old_slice.bottom_field_flag != img->bottom_field_flag);
}
result |= (old_slice.nal_ref_idc != img->nal_reference_idc) && ((old_slice.nal_ref_idc == 0) || (img->nal_reference_idc == 0));
result |= ( old_slice.idr_flag != img->idr_flag);
if (img->idr_flag && old_slice.idr_flag)
{
result |= (old_slice.idr_pic_id != img->idr_pic_id);
}
if (active_sps->pic_order_cnt_type == 0)
{
result |= (old_slice.pic_oder_cnt_lsb != img->pic_order_cnt_lsb);
result |= (old_slice.delta_pic_oder_cnt_bottom != img->delta_pic_order_cnt_bottom);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -