📄 lencod.c
字号:
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->max_num_references+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(!active_sps->frame_mbs_only_flag)
{
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_mem3Dint(img->nz_coeff, img->FrameSizeInMbs);
if(input->FMEnable)
free_mem_FME();
}
/*!
************************************************************************
* \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, m;
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(2,sizeof(int***))) == NULL)
no_mem_exit ("get_mem_mv: mv");
for (k=0; k<2; k++)
{
if (((*mv)[i][j][k] = (int***)calloc(img->max_num_references,sizeof(int**))) == NULL)
no_mem_exit ("get_mem_mv: mv");
for (l=0; l<img->max_num_references; l++)
{
if (((*mv)[i][j][k][l] = (int**)calloc(9,sizeof(int*))) == NULL)
no_mem_exit ("get_mem_mv: mv");
for (m=0; m<9; m++)
if (((*mv)[i][j][k][l][m] = (int*)calloc(2,sizeof(int))) == NULL)
no_mem_exit ("get_mem_mv: mv");
}
}
}
}
return 4*4*img->max_num_references*9*2*sizeof(int);
}
/*!
************************************************************************
* \brief
* Free memory from mv
* \par Input:
* int****** mv
************************************************************************
*/
void free_mem_mv (int****** mv)
{
int i, j, k, l, m;
for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
for (k=0; k<2; k++)
{
for (l=0; l<img->max_num_references; l++)
{
for (m=0; m<9; m++)
{
free (mv[i][j][k][l][m]);
}
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]->used=0;
frm->picbuf_short[0]->picID=-1;
frm->picbuf_short[0]->lt_picID=-1;
frm->short_used = 0; */
img->nb_references = 0;
}
/*!
************************************************************************
* \brief
* Set the image type for I,P and SP pictures (not B!)
************************************************************************
*/
void SetImgType()
{
if (input->intra_period == 0)
{
if (IMG_NUMBER == 0)
{
img->type = I_SLICE; // set image type for first image to I-frame
}
else
{
img->type = P_SLICE; // P-frame
if (input->sp_periodicity)
{
if ((IMG_NUMBER % input->sp_periodicity) ==0)
{
img->type=SP_SLICE;
}
}
}
}
else
{
if ((IMG_NUMBER%input->intra_period) == 0)
{
img->type = I_SLICE;
}
else
{
img->type = P_SLICE; // P-frame
if (input->sp_periodicity)
{
if ((IMG_NUMBER % input->sp_periodicity) ==0)
img->type=SP_SLICE;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -