📄 h.264
字号:
if (input->WeightedPrediction || input->WeightedBiprediction)
free(mref_frm_w);
if (input->WeightedPrediction || input->WeightedBiprediction)
free (Refbuf11_frm_w);
// free multiple ref frame buffers
// number of reference frames increased by one for next P-frame
if(input->successive_Bframe!=0 || input->StoredBPictures > 0)
{
// free last P-frame buffers for B-frame coding
free_mem3Dint(tmp_fwMV,2);
free_mem3Dint(tmp_bwMV,2);
free_mem3Dint(dfMV,2);
free_mem3Dint(dbMV,2);
free_mem2Dint(fw_refFrArr_frm);
free_mem2Dint(bw_refFrArr_frm);
if (input->direct_type)
{
free_mem2Dint(moving_block_frm);
free_mem2Dint(fwdir_refFrArr);
free_mem2Dint(bwdir_refFrArr);
}
} // end if B frame
free_mem2Dint(abp_type_FrArr);
free_mem2Dint(img4Y_tmp); // free temp quarter pel frame buffer
// free mem, allocated in init_img()
// free intra pred mode buffer for blocks
free_mem2Dint(img->ipredmode);
free(img->mb_data);
if(input->UseConstrainedIntraPred)
{
free (img->intra_block);
}
if (input->rdopt==2)
{
free(decs->resY[0]);
free(decs->resY);
free(decs->RefBlock[0]);
free(decs->RefBlock);
for (j=0; j<input->NoOfDecoders; j++)
{
free(decs->decY[j][0]);
free(decs->decY[j]);
free(decs->decY_best[j][0]);
free(decs->decY_best[j]);
for (i=0; i<img->buf_cycle+1; i++)
{
free(decs->decref[j][i][0]);
free(decs->decref[j][i]);
}
free(decs->decref[j]);
}
free(decs->decY);
free(decs->decY_best);
free(decs->decref);
free(decs->status_map[0]);
free(decs->status_map);
free(decs->dec_mb_mode[0]);
free(decs->dec_mb_mode);
}
if (input->RestrictRef)
{
free(pixel_map[0]);
free(pixel_map);
free(refresh_map[0]);
free(refresh_map);
}
if(input->InterlaceCodingOption != FRAME_CODING)
{
free_mem2D(imgY_com);
free_mem3D(imgUV_com,2);
free_mem2D(imgY_org_top); // free ref frame buffers
free_mem3D(imgUV_org_top,2);
free_mem2D(imgY_org_bot); // free ref frame buffers
free_mem3D(imgUV_org_bot,2);
// free multiple ref frame buffers
// number of reference frames increased by one for next P-frame
if (input->WeightedPrediction || input->WeightedBiprediction)
free(mref_fld_w);
if(input->successive_Bframe!=0 || input->StoredBPictures > 0)
{
// free last P-frame buffers for B-frame coding
free_mem2Dint(fw_refFrArr_top);
free_mem2Dint(bw_refFrArr_top);
free_mem2Dint(fw_refFrArr_bot);
free_mem2Dint(bw_refFrArr_bot);
if (input->direct_type)
{
free_mem2Dint(moving_block_top);
free_mem2Dint(moving_block_bot);
}
} // end if B frame
if ( input->WeightedPrediction || input->WeightedBiprediction)
free (Refbuf11_fld_w);
free_mem3Dint(tmp_mv_top,2);
free_mem3Dint(tmp_mv_bot,2);
free_mem2Dint(refFrArr_top);
free_mem2Dint(refFrArr_bot);
free_mem2Dint(abp_type_FrArr_top);
free_mem2Dint(abp_type_FrArr_bot);
}
// CAVLC mem free
for(j=0;j<img->width/MB_BLOCK_SIZE;j++)
{
free_mem3Dint(img->nz_coeff[j], img->height/MB_BLOCK_SIZE);
}
if (img->nz_coeff !=NULL) free(img->nz_coeff );
free_mem2Dint(img->field_anchor);
}
/*!
************************************************************************
* \brief
* Allocate memory for mv
* \par Input:
* Image Parameters struct img_par *img \n
* int****** mv
* \return memory size in bytes
************************************************************************
*/
int get_mem_mv (int****** mv)
{
int i, j, k, l;
if ((*mv = (int*****)calloc(4,sizeof(int****))) == NULL)
no_mem_exit ("get_mem_mv: mv");
for (i=0; i<4; i++)
{
if (((*mv)[i] = (int****)calloc(4,sizeof(int***))) == NULL)
no_mem_exit ("get_mem_mv: mv");
for (j=0; j<4; j++)
{
if (((*mv)[i][j] = (int***)calloc(img->buf_cycle,sizeof(int**))) == NULL)
no_mem_exit ("get_mem_mv: mv");
for (k=0; k<img->buf_cycle; k++)
{
if (((*mv)[i][j][k] = (int**)calloc(9,sizeof(int*))) == NULL)
no_mem_exit ("get_mem_mv: mv");
for (l=0; l<9; l++)
if (((*mv)[i][j][k][l] = (int*)calloc(2,sizeof(int))) == NULL)
no_mem_exit ("get_mem_mv: mv");
}
}
}
return 4*4*img->buf_cycle*9*2*sizeof(int);
}
/*!
************************************************************************
* \brief
* Free memory from mv
* \par Input:
* int****** mv
************************************************************************
*/
void free_mem_mv (int***** mv)
{
int i, j, k, l;
for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
for (k=0; k<img->buf_cycle; k++)
{
for (l=0; l<9; l++)
free (mv[i][j][k][l]);
free (mv[i][j][k]);
}
free (mv[i][j]);
}
free (mv[i]);
}
free (mv);
}
/*!
************************************************************************
* \brief
* Allocate memory for AC coefficients
************************************************************************
*/
int get_mem_ACcoeff (int***** cofAC)
{
int i, j, k;
if ((*cofAC = (int****)calloc (6, sizeof(int***))) == NULL) no_mem_exit ("get_mem_ACcoeff: cofAC");
for (k=0; k<6; k++)
{
if (((*cofAC)[k] = (int***)calloc (4, sizeof(int**))) == NULL) no_mem_exit ("get_mem_ACcoeff: cofAC");
for (j=0; j<4; j++)
{
if (((*cofAC)[k][j] = (int**)calloc (2, sizeof(int*))) == NULL) no_mem_exit ("get_mem_ACcoeff: cofAC");
for (i=0; i<2; i++)
{
if (((*cofAC)[k][j][i] = (int*)calloc (65, sizeof(int))) == NULL) no_mem_exit ("get_mem_ACcoeff: cofAC"); // 18->65 for ABT
}
}
}
return 6*4*2*65*sizeof(int);// 18->65 for ABT
}
/*!
************************************************************************
* \brief
* Allocate memory for DC coefficients
************************************************************************
*/
int get_mem_DCcoeff (int**** cofDC)
{
int j, k;
if ((*cofDC = (int***)calloc (3, sizeof(int**))) == NULL) no_mem_exit ("get_mem_DCcoeff: cofDC");
for (k=0; k<3; k++)
{
if (((*cofDC)[k] = (int**)calloc (2, sizeof(int*))) == NULL) no_mem_exit ("get_mem_DCcoeff: cofDC");
for (j=0; j<2; j++)
{
if (((*cofDC)[k][j] = (int*)calloc (65, sizeof(int))) == NULL) no_mem_exit ("get_mem_DCcoeff: cofDC"); // 18->65 for ABT
}
}
return 3*2*65*sizeof(int); // 18->65 for ABT
}
/*!
************************************************************************
* \brief
* Free memory of AC coefficients
************************************************************************
*/
void free_mem_ACcoeff (int**** cofAC)
{
int i, j, k;
for (k=0; k<6; k++)
{
for (i=0; i<4; i++)
{
for (j=0; j<2; j++)
{
free (cofAC[k][i][j]);
}
free (cofAC[k][i]);
}
free (cofAC[k]);
}
free (cofAC);
}
/*!
************************************************************************
* \brief
* Free memory of DC coefficients
************************************************************************
*/
void free_mem_DCcoeff (int*** cofDC)
{
int i, j;
for (j=0; j<3; j++)
{
for (i=0; i<2; i++)
{
free (cofDC[j][i]);
}
free (cofDC[j]);
}
free (cofDC);
}
/*!
************************************************************************
* \brief
* form frame picture from two field pictures
************************************************************************
*/
void combine_field()
{
int i;
for (i=0; i<img->height / 2; i++)
{
memcpy(imgY_com[i*2], enc_top_picture->imgY[i], img->width); // top field
memcpy(imgY_com[i*2 + 1], enc_bottom_picture->imgY[i], img->width); // bottom field
}
for (i=0; i<img->height_cr / 2; i++)
{
memcpy(imgUV_com[0][i*2], enc_top_picture->imgUV[0][i], img->width_cr);
memcpy(imgUV_com[0][i*2 + 1], enc_bottom_picture->imgUV[0][i], img->width_cr);
memcpy(imgUV_com[1][i*2], enc_top_picture->imgUV[1][i], img->width_cr);
memcpy(imgUV_com[1][i*2 + 1], enc_bottom_picture->imgUV[1][i], img->width_cr);
}
}
/*!
************************************************************************
* \brief
* RD decision of frame and field coding
************************************************************************
*/
int decide_fld_frame(float snr_frame_Y, float snr_field_Y, int bit_field, int bit_frame, double lambda_picture)
{
double cost_frame, cost_field;
cost_frame = bit_frame * lambda_picture + snr_frame_Y;
cost_field = bit_field * lambda_picture + snr_field_Y;
if (cost_field > cost_frame)
return (0);
else
return (1);
}
/*!
************************************************************************
* \brief
* Do some initializaiton work for encoding the 2nd IGOP
************************************************************************
*/
void process_2nd_IGOP()
{
Boolean FirstIGOPFinished = FALSE;
if ( img->number == input->no_frames-1 )
FirstIGOPFinished = TRUE;
if (input->NumFrameIn2ndIGOP==0) return;
if (!FirstIGOPFinished || In2ndIGOP) return;
In2ndIGOP = TRUE;
// img->number = -1;
start_frame_no_in_this_IGOP = input->no_frames;
start_tr_in_this_IGOP = (input->no_frames-1)*(input->jumpd+1) +1;
input->no_frames = input->no_frames + input->NumFrameIn2ndIGOP;
/* reset_buffers();
frm->picbuf_short[0]->u
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -