📄 mbuffer.c
字号:
// LPIR specifying long term index
pnq=r->Data;
islong=1;
break;
case 3:
// return; // Tian: I don't think it should return here. June 6, 2002
assert(r->Next == NULL); // Tian: for debug purpose, try to assert ... June 6, 2002
break;
}
// now scan the frame buffer for the needed frame
if ( r->RMPNI == 0 || r->RMPNI == 1 || r->RMPNI == 2 ) // the IF is added by Tian
{
found=0;
i=0;
while ((!found)&&(i<size))
{
if (((!islong)&&(!fr[i]->islong) && (fr[i]->picID==pnq)) ||
((islong)&&(fr[i]->islong) && (fr[i]->lt_picID==pnq)))
{
found=1;
index=i;
}
i++;
}
if (!found) error ("tried to remap non-existent picture",400);
// now do the actual reordering
/* cycle frame buffer */
f=fr[index];
for (i=index-1;i>=0;i--)
{
fr[i+1]=fr[i];
}
fr[0]=f;
// set the picture number prediction correctly
pnp=pnq;
}
img->currentSlice->rmpni_buffer = r->Next;
free( r );
r = img->currentSlice->rmpni_buffer;
}
// at last init mref, mcef and Refbuf from temporary structure
for (i=0;i<size;i++)
{
mref[i]=fr[i]->mref;
mcef[i]=fr[i]->mcef;
Refbuf11[i]=fr[i]->Refbuf11;
if (input->WeightedPrediction || input->WeightedBiprediction)
{
mref_w[i]=fr[i]->mref_w;
Refbuf11_w[i]=fr[i]->Refbuf11_w;
}
if(mref==mref_fld) parity_fld[i] = fr[i]->parity;
}
// free temporary memory
free (fr);
}
/*!
************************************************************************
* \brief
* (re)-allocate memory for Refbuf11 pointer structure
************************************************************************
*/
void alloc_Refbuf (ImageParameters *img)
{
// int num_frames = fb->long_size+fb->short_size;
// if (Refbuf11) free (Refbuf11);
int num_frames = frm->long_size+frm->short_size;
if (Refbuf11_frm) free (Refbuf11_frm);
if (input->WeightedBiprediction || input->WeightedPrediction)
if (Refbuf11_frm_w) free (Refbuf11_frm_w);
if (NULL == (Refbuf11_frm = malloc (num_frames * sizeof (pel_t *))))
no_mem_exit ("alloc_Refbuf: Refbuf11_frm");
if (input->WeightedBiprediction || input->WeightedPrediction)
if (NULL == (Refbuf11_frm_w = malloc (num_frames * sizeof (pel_t *))))
no_mem_exit ("alloc_Refbuf: Refbuf11_frm_w");
if(input->InterlaceCodingOption != FRAME_CODING)
{
num_frames = fld->long_size+fld->short_size;
if (Refbuf11_fld) free (Refbuf11_fld);
if (NULL == (Refbuf11_fld = malloc (num_frames * sizeof (pel_t *))))
no_mem_exit ("alloc_Refbuf: Refbuf11_fld");
if (input->WeightedBiprediction || input->WeightedPrediction)
if (NULL == (Refbuf11_fld_w = malloc (num_frames * sizeof (pel_t *))))
no_mem_exit ("alloc_Refbuf: Refbuf11_fld_w");
}
}
/*!
************************************************************************
* \brief
* init Refbuf pointer structure
************************************************************************
*/
void init_Refbuf(ImageParameters *img)
{
int i,j;
for (i=0,j=0;i<fb->short_used;i++)
{
Refbuf11[j]=fb->picbuf_short[i]->Refbuf11;
if (input->WeightedBiprediction || input->WeightedPrediction)
Refbuf11_w[j]=fb->picbuf_short[i]->Refbuf11_w;
j++;
}
for (i=0;i<fb->long_size;i++)
{
Refbuf11[j]=fb->picbuf_long[i]->Refbuf11;
if (input->WeightedBiprediction || input->WeightedPrediction)
Refbuf11_w[j]=fb->picbuf_long[i]->Refbuf11_w;
j++;
}
for (;j<fb->long_size+fb->short_size;j++)
{
Refbuf11[j]=NULL;
if (input->WeightedBiprediction || input->WeightedPrediction)
Refbuf11_w[j]=NULL;
}
}
/*!
************************************************************************
* \brief
* mark all frames except last decoded unused
************************************************************************
*/
void reset_buffers()
{
int i;
/* mark short term pictures unused */
for (i=1;i<fb->short_used;i++)
fb->picbuf_short[i]->used=0;
fb->short_used=1;
/* mark short term pictures unused */
for (i=0;i<fb->long_used;i++)
fb->picbuf_short[i]->used=0;
fb->long_used=0;
}
/*!
************************************************************************
* \brief
* store reconstructed frame in multiple reference buffer
************************************************************************
*/
void add_frame(ImageParameters *img)
{
int i;
Frame *f;
Boolean remove_last = FALSE;
/* delete frames with same short term ID */
if(mref==mref_frm) remove_short_term(img->pn);
if (fb->short_used == fb->short_size && fb==frm) remove_last = TRUE; // Tian: PLUS1
/* cycle frame buffer */
f=fb->picbuf_short[fb->short_size-1];
for (i=fb->short_size-2;i>=0;i--)
fb->picbuf_short[i+1]=fb->picbuf_short[i];
fb->picbuf_short[0]=f;
fb->picbuf_short[0]->used=1;
fb->picbuf_short[0]->picID=img->pn;
fb->picbuf_short[0]->frame_num_256=img->number % 256; // Tian Dong (Sept 2002)
fb->picbuf_short[0]->lt_picID=-1;
if(mref==mref_fld) fb->picbuf_short[0]->parity = img->fld_type;//0:Top Field / 1:Bottom Field
// indicate which layer and sub-seq current ref frame comes from.
// fb->picbuf_short[0]->layer_no=currPictureInfo.refFromLayerNumber;
// fb->picbuf_short[0]->sub_seq_no=currPictureInfo.refFromSubSequenceIdentifier;
(fb->short_used)++;
if (fb->short_used>fb->short_size)
fb->short_used=fb->short_size;
if (remove_last)
{
fb->picbuf_short[fb->short_size-1]->used=0;
fb->picbuf_short[fb->short_size-1]->picID=-1;
fb->picbuf_short[fb->short_size-1]->frame_num_256=-1; // Tian Dong (Sept 2002)
fb->picbuf_short[fb->short_size-1]->lt_picID=-1;
fb->short_used--;
printf("remove last........................\n");
}
}
void copy_mref()
{
int i,j,k;
// For MB level field/frame coding --
// temporary solution till we remove mref==mref_fld from pic level
// then we can use mref as the reference field buffer
if(input->InterlaceCodingOption >= MB_CODING)
{
for (i=0;i<fld->short_used;i++)
for (j=0;j<4*(input->img_height/2 + 2*IMG_PAD_SIZE);j++)
for(k=0;k<4*(img->width + 2*IMG_PAD_SIZE);k++)
{
mref_mbfld[i][j][k] = fld->picbuf_short[i]->mref[j][k];
if (input->WeightedPrediction || input->WeightedBiprediction)
mref_mbfld_w[i][j][k] = fld->picbuf_short[i]->mref_w[j][k];
}
// still need to do this regardless of mref==mref_fld is used or not
if(mref != mref_fld)
{
for (i=0,j=0;i<fld->short_used;i++)
{
mref_fld[j]=fld->picbuf_short[i]->mref;
if (input->WeightedPrediction || input->WeightedBiprediction)
mref_fld_w[j]=fld->picbuf_short[i]->mref_w;
mcef_fld[j]=fld->picbuf_short[i]->mcef;
j++;
}
for (i=0;i<fld->long_used;i++)
{
mref_fld[j]=fld->picbuf_long[i]->mref;
if (input->WeightedPrediction || input->WeightedBiprediction)
mref_fld_w[j]=fld->picbuf_long[i]->mref_w;
mcef_fld[j]=fld->picbuf_long[i]->mcef;
j++;
}
// set all other mref pointers to NULL !KS!
for (;j<fld->long_size+fld->short_size;j++)
{
mref_fld[j]=NULL;
if (input->WeightedPrediction || input->WeightedBiprediction)
mref_fld_w[j]=NULL;
mcef_fld[j]=NULL;
}
// need to do this, because MB level frame/field overwrites the current Refbuf11
for (i=0,j=0;i<fld->short_used;i++)
{
Refbuf11_fld[j]=fld->picbuf_short[i]->Refbuf11;
if (input->WeightedBiprediction || input->WeightedPrediction)
Refbuf11_fld_w[j]=fld->picbuf_short[i]->Refbuf11_w;
j++;
}
for (i=0;i<fld->long_size;i++)
{
Refbuf11_fld[j]=fld->picbuf_long[i]->Refbuf11;
if (input->WeightedBiprediction || input->WeightedPrediction)
Refbuf11_fld_w[j]=fld->picbuf_long[i]->Refbuf11_w;
j++;
}
for (;j<fld->long_size+fld->short_size;j++)
{
Refbuf11_fld[j]=NULL;
if (input->WeightedBiprediction || input->WeightedPrediction)
Refbuf11_fld_w[j]=NULL;
}
}
}
}
void alloc_ref_pic_list_reordering_buffer(Slice *currSlice)
{
int size = img->num_ref_pic_active_fwd_minus1+1;
if (img->type!=INTRA_IMG /* && img->type!=SI_IMG */)
{
if ((currSlice->remapping_of_pic_nums_idc_l0 = calloc(size,sizeof(int)))==NULL) no_mem_exit("alloc_ref_pic_list_reordering_buffer: remapping_of_pic_nums_idc_l0");
if ((currSlice->abs_diff_pic_num_minus1_l0 = calloc(size,sizeof(int)))==NULL) no_mem_exit("alloc_ref_pic_list_reordering_buffer: abs_diff_pic_num_minus1_l0");
if ((currSlice->long_term_pic_idx_l0 = calloc(size,sizeof(int)))==NULL) no_mem_exit("alloc_ref_pic_list_reordering_buffer: long_term_pic_idx_l0");
}
else
{
currSlice->remapping_of_pic_nums_idc_l0 = NULL;
currSlice->abs_diff_pic_num_minus1_l0 = NULL;
currSlice->long_term_pic_idx_l0 = NULL;
}
size = img->num_ref_pic_active_bwd_minus1+1;
if (img->type!=B_IMG)
{
if ((currSlice->remapping_of_pic_nums_idc_l1 = calloc(size,sizeof(int)))==NULL) no_mem_exit("alloc_ref_pic_list_reordering_buffer: remapping_of_pic_nums_idc_l1");
if ((currSlice->abs_diff_pic_num_minus1_l1 = calloc(size,sizeof(int)))==NULL) no_mem_exit("alloc_ref_pic_list_reordering_buffer: abs_diff_pic_num_minus1_l1");
if ((currSlice->long_term_pic_idx_l1 = calloc(size,sizeof(int)))==NULL) no_mem_exit("alloc_ref_pic_list_reordering_buffer: long_term_pic_idx_l1");
}
else
{
currSlice->remapping_of_pic_nums_idc_l1 = NULL;
currSlice->abs_diff_pic_num_minus1_l1 = NULL;
currSlice->long_term_pic_idx_l1 = NULL;
}
}
void free_ref_pic_list_reordering_buffer(Slice *currSlice)
{
if (currSlice->remapping_of_pic_nums_idc_l0)
free(currSlice->remapping_of_pic_nums_idc_l0);
if (currSlice->abs_diff_pic_num_minus1_l0)
free(currSlice->abs_diff_pic_num_minus1_l0);
if (currSlice->long_term_pic_idx_l0)
free(currSlice->long_term_pic_idx_l0);
currSlice->remapping_of_pic_nums_idc_l0 = NULL;
currSlice->abs_diff_pic_num_minus1_l0 = NULL;
currSlice->long_term_pic_idx_l0 = NULL;
if (currSlice->remapping_of_pic_nums_idc_l1)
free(currSlice->remapping_of_pic_nums_idc_l1);
if (currSlice->abs_diff_pic_num_minus1_l1)
free(currSlice->abs_diff_pic_num_minus1_l1);
if (currSlice->long_term_pic_idx_l1)
free(currSlice->long_term_pic_idx_l1);
currSlice->remapping_of_pic_nums_idc_l1 = NULL;
currSlice->abs_diff_pic_num_minus1_l1 = NULL;
currSlice->long_term_pic_idx_l1 = NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -