📄 ldecod.c
字号:
for (i=0; i<4; i++)
ref_fld[i] = reference_field[i];
ref_fld[4] = reference_field[5];
current_field = reference_field[4];
//luma for forward
for (j=0;j<4;j++)//ref_index = 0
{
mref_fld[j] = ref_fld[j][0];
}
//chroma for forward
for (j=0;j<4;j++)//ref_index = 0
for (i=0;i<2;i++) // chroma uv =0,1; 1,2 for reference_frame
{
mcef_fld[j][i] = ref_fld[j][i+1];
}
//luma for backward
//forward/backward reference buffer
for (i=0; i<2; i++)
{
f_ref_fld[i] = ref_fld[i+2]; //f_ref_frm[ref_index][yuv][height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
b_ref_fld[i] = ref_fld[1-i]; //b_ref_frm[ref_index][yuv][height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
}
for (j=0;j<2;j++)//ref_index = 0 luma = 0
{
mref_fref_fld[j] = f_ref_fld[j][0];
mref_bref_fld[j] = b_ref_fld[j][0];
}
//chroma for backward
for (j=0;j<2;j++)//ref_index = 0
for (i=0;i<2;i++) // chroma uv =0,1; 1,2 for reference_frame
{
mcef_fref_fld[j][i] = f_ref_fld[j][i+1];
mcef_bref_fld[j][i] = b_ref_fld[j][i+1];
}
}
if((mref = (byte***)calloc(4,sizeof(byte**))) == NULL)
no_mem_exit("alloc_mref: mcef");
if((mcef = (byte****)calloc(4,sizeof(byte***))) == NULL)
no_mem_exit("alloc_mref: mcef");
for (i=0; i<4; i++)
if((mcef[i] = (byte***)calloc(2,sizeof(byte**))) == NULL)
no_mem_exit("alloc_mref: mcef");
return (memory_size);
}
/*
*************************************************************************
* Function:Free allocated memory of frame size related global buffers
buffers are defined in global.h, allocated memory is allocated in
int init_global_buffers()
* Input:Input Parameters struct inp_par *inp, Image Parameters struct img_par *img
* Output:
* Return:
* Attention:
*************************************************************************
*/
void free_global_buffers(struct inp_par *inp, struct img_par *img)
{
int i,j;
free_mem2D(imgY_prev);
free_mem3D(imgUV_prev,2);
if(!progressive_sequence)
{
free (parity_fld);
for (i=0; i<6; i++)
for(j=0;j<3; j++)
{
free_mem2D(reference_field[i][j]);
}
}
free (mref);
for (i=0; i<2; i++)
free (mcef[i]);
free (mcef);
free_mem2D (imgY_ref);
free_mem3D (imgUV_ref,2);
// free mem, allocated for structure img
if (mb_data != NULL) free(mb_data);
j = (img->width/16)*(img->height/16);
for (i=0; i<j; i++)
{
free (img->intra_block[i]);
}
free (img->intra_block);
free_mem3Dint(img->mv_frm,img->width/B8_SIZE + 4);
free_mem2Dint (img->ipredmode);
free_mem3Dint(img->dfMV,img->width/B8_SIZE + 4);
free_mem3Dint(img->dbMV,img->width/B8_SIZE + 4);
free_mem2Dint(img->fw_refFrArr_frm);
free_mem2Dint(img->bw_refFrArr_frm);
free_mem3Dint(img->fw_mv,img->width/B8_SIZE + 4);
free_mem3Dint(img->bw_mv,img->width/B8_SIZE + 4);
for (i=0; i<3; i++)
for(j=0;j<3; j++)
{
free_mem2D(reference_frame[i][j]);
}
}
int get_direct_mv (int****** mv,int mb_x,int mb_y)
{
int i, j, k, l;
if ((*mv = (int*****)calloc(mb_y,sizeof(int****))) == NULL)
no_mem_exit ("get_mem_mv: mv");
for (i=0; i<mb_y; i++)
{
if (((*mv)[i] = (int****)calloc(mb_x,sizeof(int***))) == NULL)
no_mem_exit ("get_mem_mv: mv");
for (j=0; j<mb_x; j++)
{
if (((*mv)[i][j] = (int***)calloc(2,sizeof(int**))) == NULL)
no_mem_exit ("get_mem_mv: mv");
for (k=0; k<2; k++)
{
if (((*mv)[i][j][k] = (int**)calloc(2,sizeof(int*))) == NULL)
no_mem_exit ("get_mem_mv: mv");
for (l=0; l<2; l++)
if (((*mv)[i][j][k][l] = (int*)calloc(3,sizeof(int))) == NULL)
no_mem_exit ("get_mem_mv: mv");
}
}
}
return mb_x*mb_y*2*2*3*sizeof(int);
}
/*
*************************************************************************
* Function:Free memory from mv
* Input:int****** mv
* Output:
* Return:
* Attention:
*************************************************************************
*/
void free_direct_mv (int***** mv,int mb_x,int mb_y)
{
int i, j, k, l;
for (i=0; i<mb_y; i++)
{
for (j=0; j<mb_x; j++)
{
for (k=0; k<2; k++)
{
for (l=0; l<2; l++)
free (mv[i][j][k][l]);
free (mv[i][j][k]);
}
free (mv[i][j]);
}
free (mv[i]);
}
free (mv);
}
/*
*************************************************************************
* Function:update the decoder picture buffer
* Input:frame number in the bitstream and the video sequence
* Output:
* Return:
* Attention:
*************************************************************************
*/
void Update_Picture_Buffers()
{
unsigned char ***tmp;
int i,j;
tmp = ref_frm[1]; //ref[ref_index][yuv][height(height/2)][width] ref_index = 0,1 for P frame, ref_index = 0,1,2,3 for B frame
ref_frm[1] = ref_frm[0]; // ref_index = 0, for B frame, ref_index = 0,1 for B field
ref_frm[0] = current_frame;
current_frame = tmp;
//forward/backward reference buffer
f_ref_frm[0] = ref_frm[1]; //f_ref_frm[ref_index][yuv][height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
b_ref_frm[0] = ref_frm[0]; //b_ref_frm[ref_index][yuv][height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
//luma for forward
for (j=0;j<2;j++)//ref_index = 0
{
mref_frm[j] = ref_frm[j][0];
}
//chroma for forward
for (j=0;j<2;j++)//ref_index = 0
for (i=0;i<2;i++) // chroma uv =0,1; 1,2 for reference_frame
{
mcef_frm[j][i] = ref_frm[j][i+1];
}
//luma for backward
for (j=0;j<1;j++)//ref_index = 0 luma = 0
{
mref_fref_frm[j] = f_ref_frm[j][0];
mref_bref_frm[j] = b_ref_frm[j][0];
}
//chroma for backward
for (j=0;j<1;j++)//ref_index = 0
for (i=0;i<2;i++) // chroma uv =0,1; 1,2 for reference_frame
{
mcef_fref_frm[j][i] = f_ref_frm[j][i+1];
mcef_bref_frm[j][i] = b_ref_frm[j][i+1];
}
}
void Update_Picture_top_field()
{
unsigned char ***tmp;
int i,j;
//forward reference frame buffer
tmp = ref_fld[4];
for (i=4; i>0; i--)
ref_fld[i] = ref_fld[i-1];
ref_fld[0] = current_field;
current_field = tmp;
//forward/backward reference buffer
for (i=0; i<2; i++)
{
f_ref_fld[i] = ref_fld[i+2]; //f_ref_frm[ref_index][yuv][height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
b_ref_fld[i] = ref_fld[1-i]; //b_ref_frm[ref_index][yuv][height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
}
//luma for forward
for (j=0;j<4;j++)//ref_index = 0
{
mref_fld[j] = ref_fld[j][0];
}
//chroma for forward
for (j=0;j<4;j++)//ref_index = 0
for (i=0;i<2;i++) // chroma uv =0,1; 1,2 for reference_frame
{
mcef_fld[j][i] = ref_fld[j][i+1];
}
//luma for backward
for (j=0;j<2;j++)//ref_index = 0 luma = 0
{
mref_fref_fld[j] = f_ref_fld[j][0];
mref_bref_fld[j] = b_ref_fld[j][0];
}
//chroma for backward
for (j=0;j<2;j++)//ref_index = 0
for (i=0;i<2;i++) // chroma uv =0,1; 1,2 for reference_frame
{
mcef_fref_fld[j][i] = f_ref_fld[j][i+1];
mcef_bref_fld[j][i] = b_ref_fld[j][i+1];
}
}
void Update_Picture_bot_field()
{
unsigned char ***tmp;
int i,j;
//forward reference frame buffer
tmp = ref_fld[4];
for (i=4; i>0; i--)
ref_fld[i] = ref_fld[i-1];
ref_fld[0] = current_field;
current_field = tmp;
//forward/backward reference buffer
for (i=0; i<2; i++)
{
f_ref_fld[i] = ref_fld[i+2]; //f_ref_frm[ref_index][yuv][height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
b_ref_fld[i] = ref_fld[1-i]; //b_ref_frm[ref_index][yuv][height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
}
//luma for forward
for (j=0;j<4;j++)//ref_index = 0
{
mref_fld[j] = ref_fld[j][0];
}
//chroma for forward
for (j=0;j<4;j++)//ref_index = 0
for (i=0;i<2;i++) // chroma uv =0,1; 1,2 for reference_frame
{
mcef_fld[j][i] = ref_fld[j][i+1];
}
//luma for backward
for (j=0;j<2;j++)//ref_index = 0 luma = 0
{
mref_fref_fld[j] = f_ref_fld[j][0];
mref_bref_fld[j] = b_ref_fld[j][0];
}
//chroma for backward
for (j=0;j<2;j++)//ref_index = 0
for (i=0;i<2;i++) // chroma uv =0,1; 1,2 for reference_frame
{
mcef_fref_fld[j][i] = f_ref_fld[j][i+1];
mcef_bref_fld[j][i] = b_ref_fld[j][i+1];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -