ldecod.c
来自「这是最新的AVS代码中的视频部分。2006年9月份发布的。有需要的可能下载使用。」· C语言 代码 · 共 992 行 · 第 1/2 页
C
992 行
*/
int init_global_buffers(struct inp_par *inp, struct img_par *img)
{
int i,j;
int refnum;
int memory_size=0;
img->buf_cycle = inp->buf_cycle+1;
img->buf_cycle *= 2;
if(!progressive_sequence)
{
memory_size += get_mem2Dint(&refFrArr_top, vertical_size/(2*B8_SIZE), img->width/B8_SIZE);
memory_size += get_mem2Dint(&refFrArr_bot, vertical_size/(2*B8_SIZE), img->width/B8_SIZE);
memory_size += get_mem3Dint(&(img->mv_top),img->width/B8_SIZE +4, vertical_size/(2*B8_SIZE),3);
memory_size += get_mem3Dint(&(img->mv_bot),img->width/B8_SIZE +4, vertical_size/(2*B8_SIZE),3);
// int fw_refFrArr[72][88];
memory_size += get_mem2Dint(&(img->fw_refFrArr_top),vertical_size/(2*B8_SIZE),img->width/B8_SIZE);
// int bw_refFrArr[72][88];
memory_size += get_mem2Dint(&(img->bw_refFrArr_top),vertical_size/(2*B8_SIZE),img->width/B8_SIZE);
memory_size += get_mem2Dint(&(img->fw_refFrArr_bot),vertical_size/(2*B8_SIZE),img->width/B8_SIZE);
// int bw_refFrArr[72][88];
memory_size += get_mem2Dint(&(img->bw_refFrArr_bot),vertical_size/(2*B8_SIZE),img->width/B8_SIZE);
memory_size += get_mem3Dint(&(img->fw_mv_top),img->width/B8_SIZE +4, vertical_size/(2*B8_SIZE),3);
memory_size += get_mem3Dint(&(img->fw_mv_bot),img->width/B8_SIZE +4, vertical_size/(2*B8_SIZE),3);
memory_size += get_mem3Dint(&(img->bw_mv_top),img->width/B8_SIZE +4, vertical_size/(2*B8_SIZE),3);
memory_size += get_mem3Dint(&(img->bw_mv_bot),img->width/B8_SIZE +4, vertical_size/(2*B8_SIZE),3);
memory_size += get_mem3Dint(&(img->dfMV_top),img->width/B8_SIZE +4, vertical_size/(2*B8_SIZE),3);
memory_size += get_mem3Dint(&(img->dbMV_top),img->width/B8_SIZE +4, vertical_size/(2*B8_SIZE),3);
memory_size += get_mem3Dint(&(img->dfMV_bot),img->width/B8_SIZE +4, vertical_size/(2*B8_SIZE),3);
memory_size += get_mem3Dint(&(img->dbMV_bot),img->width/B8_SIZE +4, vertical_size/(2*B8_SIZE),3);
}
// allocate memory for imgY_prev
memory_size += get_mem2D(&imgY_prev, vertical_size, img->width);
memory_size += get_mem3D(&imgUV_prev, 2, vertical_size/2, img->width_cr);
// allocate memory for reference frames of each block: refFrArr
memory_size += get_mem2Dint(&refFrArr_frm, vertical_size/B8_SIZE, img->width/B8_SIZE);
// allocate memory for reference frame in find_snr
memory_size += get_mem2D(&imgY_ref, vertical_size, img->width);
memory_size += get_mem3D(&imgUV_ref, 2, vertical_size/2, img->width_cr);
// allocate memory in structure img
if(((mb_data) = (Macroblock *) calloc((img->width/MB_BLOCK_SIZE) * (vertical_size/MB_BLOCK_SIZE),sizeof(Macroblock))) == NULL)
no_mem_exit("init_global_buffers: mb_data");
if(((img->intra_block) = (int**)calloc((j=(img->width/MB_BLOCK_SIZE) * (vertical_size/MB_BLOCK_SIZE)),sizeof(int))) == NULL)
no_mem_exit("init_global_buffers: img->intra_block");
for (i=0; i<j; i++)
{
if ((img->intra_block[i] = (int*)calloc(4, sizeof(int))) == NULL)
no_mem_exit ("init_global_buffers: img->intra_block");
}
memory_size += get_mem3Dint(&(img->mv_frm),img->width/B8_SIZE +4, vertical_size/B8_SIZE,3);
memory_size += get_mem2Dint(&(img->ipredmode),img->width/B8_SIZE +2 , vertical_size/B8_SIZE +2);
memory_size += get_mem3Dint(&(img->dfMV),img->width/B8_SIZE +4, vertical_size/B8_SIZE,3);
memory_size += get_mem3Dint(&(img->dbMV),img->width/B8_SIZE +4, vertical_size/B8_SIZE,3);
memory_size += get_mem2Dint(&(img->fw_refFrArr_frm),vertical_size/B8_SIZE,img->width/B8_SIZE);
memory_size += get_mem2Dint(&(img->bw_refFrArr_frm),vertical_size/B8_SIZE,img->width/B8_SIZE);
memory_size += get_mem3Dint(&(img->fw_mv),img->width/B8_SIZE +4, vertical_size/B8_SIZE,3);
memory_size += get_mem3Dint(&(img->bw_mv),img->width/B8_SIZE +4, vertical_size/B8_SIZE,3);
// Prediction mode is set to -1 outside the frame, indicating that no prediction can be made from this part
for (i=0; i < img->width/(B8_SIZE)+2; i++)
{
for (j=0; j < vertical_size/(B8_SIZE)+2; j++)
{
img->ipredmode[i][j]=-1;
}
}
//by oliver 0512
img->buf_cycle = inp->buf_cycle+1;
// allocate frame buffer
for(refnum=0; refnum<3; refnum++)
for (i=0; i<3; i++)
{
if (i==0)
{
get_mem2D(&reference_frame[refnum][i],vertical_size,img->width);
}else
{
get_mem2D(&reference_frame[refnum][i],vertical_size/2,img->width_cr);
}
}
//allocate field buffer
if(!progressive_sequence)
{
for(refnum=0; refnum<6; refnum++)
for (i=0; i<3; i++)
{
if (i==0)
{
get_mem2D(&reference_field[refnum][i],vertical_size/2,img->width);
}else
{
get_mem2D(&reference_field[refnum][i],vertical_size/4,img->width_cr);
}
}
}
//forward reference frame buffer
ref_frm[0] = reference_frame[0]; //reference_frame[ref_index][yuv][height][width],ref_frm[ref_index][yuv][height][width]
ref_frm[1] = reference_frame[1];
current_frame = reference_frame[2];
//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
//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
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];
}
if(!progressive_sequence)
{
//forward reference frame buffer
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 + =
减小字号Ctrl + -
显示快捷键?