📄 image.c
字号:
img->tr=img->number*(input->jumpd+1);
#ifdef _ADAPT_LAST_GROUP_
if (input->last_frame && img->number+1 == input->no_frames)
img->tr=input->last_frame;
#endif
if(img->number!=0 && input->successive_Bframe != 0) // B pictures to encode
nextP_tr=img->tr;
if (img->type == INTRA_IMG)
img->qp = input->qp0; // set quant. parameter for I-frame
else
{
#ifdef _CHANGE_QP_
if (input->qp2start > 0 && img->tr >= input->qp2start)
img->qp = input->qpN2;
else
#endif
img->qp = input->qpN;
if (img->types==SP_IMG)
{
img->qp = input->qpsp;
img->qpsp = input->qpsp_pred;
}
}
img->mb_y_intra=img->mb_y_upd; // img->mb_y_intra indicates which GOB to intra code for this frame
if (input->intra_upd > 0) // if error robustness, find next GOB to update
{
img->mb_y_upd=(img->number/input->intra_upd) % (img->height/MB_BLOCK_SIZE);
}
}
else
{
img->p_interval = input->jumpd+1;
prevP_no = (img->number-1)*img->p_interval;
nextP_no = img->number*img->p_interval;
#ifdef _ADAPT_LAST_GROUP_
last_P_no[0] = prevP_no; for (i=1; i<img->buf_cycle; i++) last_P_no[i] = last_P_no[i-1]-img->p_interval;
if (input->last_frame && img->number+1 == input->no_frames)
{
nextP_no =input->last_frame;
img->p_interval =nextP_no - prevP_no;
}
#endif
img->b_interval = (int)((float)(input->jumpd+1)/(input->successive_Bframe+1.0)+0.49999);
img->tr= prevP_no+img->b_interval*img->b_frame_to_code; // from prev_P
if(img->tr >= nextP_no)
img->tr=nextP_no-1; // ?????
#ifdef _CHANGE_QP_
if (input->qp2start > 0 && img->tr >= input->qp2start)
img->qp = input->qpB2;
else
#endif
img->qp = input->qpB;
// initialize arrays
for(k=0; k<2; k++)
for(i=0; i<img->height/BLOCK_SIZE; i++)
for(j=0; j<img->width/BLOCK_SIZE+4; j++)
{
tmp_fwMV[k][i][j]=0;
tmp_bwMV[k][i][j]=0;
dfMV[k][i][j]=0;
dbMV[k][i][j]=0;
}
for(i=0; i<img->height/BLOCK_SIZE; i++)
for(j=0; j<img->width/BLOCK_SIZE; j++)
{
fw_refFrArr[i][j]=bw_refFrArr[i][j]=-1;
}
}
}
/*!
************************************************************************
* \brief
* Initializes the parameters for a new slice
************************************************************************
*/
void init_slice()
{
int i;
Slice *curr_slice = img->currentSlice;
DataPartition *dataPart;
Bitstream *currStream;
curr_slice->picture_id = img->tr%256;
curr_slice->slice_nr = img->current_slice_nr;
curr_slice->qp = img->qp;
curr_slice->start_mb_nr = img->current_mb_nr;
curr_slice->dp_mode = input->partition_mode;
curr_slice->slice_too_big = dummy_slice_too_big;
for (i=0; i<curr_slice->max_part_nr; i++)
{
dataPart = &(curr_slice->partArr[i]);
// in priciple it is possible to assign to each partition
// a different entropy coding method
if (input->symbol_mode == UVLC)
dataPart->writeSyntaxElement = writeSyntaxElement_UVLC;
else
dataPart->writeSyntaxElement = writeSyntaxElement_CABAC;
// A little hack until CABAC can handle non-byte aligned start positions StW!
// For UVLC, the stored_ positions in the bit buffer are necessary. For CABAC,
// the buffer is initialized to start at zero.
if (input->symbol_mode == UVLC && input->of_mode == PAR_OF_26L) // Stw: added PAR_OF_26L check
{
currStream = dataPart->bitstream;
currStream->bits_to_go = currStream->stored_bits_to_go;
currStream->byte_pos = currStream->stored_byte_pos;
currStream->byte_buf = currStream->stored_byte_buf;
}
else // anything but UVLC and PAR_OF_26L
{
currStream = dataPart->bitstream;
currStream->bits_to_go = 8;
currStream->byte_pos = 0;
currStream->byte_buf = 0;
}
}
}
/*!
************************************************************************
* \brief
* Reads new frame from file and sets frame_no
************************************************************************
*/
void read_one_new_frame()
{
int i, j, uv;
int status; // frame_no;
int frame_size = img->height*img->width*3/2;
if(img->type == B_IMG)
frame_no = (img->number-1)*(input->jumpd+1)+img->b_interval*img->b_frame_to_code;
else
{
frame_no = img->number*(input->jumpd+1);
#ifdef _ADAPT_LAST_GROUP_
if (input->last_frame && img->number+1 == input->no_frames)
frame_no=input->last_frame;
#endif
}
rewind (p_in);
status = fseek (p_in, frame_no * frame_size + input->infile_header, 0);
if (status != 0)
{
snprintf(errortext, ET_SIZE, "Error in seeking frame no: %d\n", frame_no);
error(errortext,1);
}
for (j=0; j < img->height; j++)
for (i=0; i < img->width; i++)
imgY_org[j][i]=fgetc(p_in);
for (uv=0; uv < 2; uv++)
for (j=0; j < img->height_cr ; j++)
for (i=0; i < img->width_cr; i++)
imgUV_org[uv][j][i]=fgetc(p_in);
}
/*!
************************************************************************
* \brief
* Writes reconstructed image(s) to file
* This can be done more elegant!
************************************************************************
*/
void write_reconstructed_image()
{
int i, j, k;
if (p_dec != NULL)
{
if(img->type != B_IMG)
{
// write reconstructed image (IPPP)
if(input->successive_Bframe==0)
{
for (i=0; i < img->height; i++)
for (j=0; j < img->width; j++)
fputc(min(imgY[i][j],255),p_dec);
for (k=0; k < 2; ++k)
for (i=0; i < img->height/2; i++)
for (j=0; j < img->width/2; j++)
fputc(min(imgUV[k][i][j],255),p_dec);
}
// write reconstructed image (IBPBP) : only intra written
else if (img->number==0 && input->successive_Bframe!=0)
{
for (i=0; i < img->height; i++)
for (j=0; j < img->width; j++)
fputc(min(imgY[i][j],255),p_dec);
for (k=0; k < 2; ++k)
for (i=0; i < img->height/2; i++)
for (j=0; j < img->width/2; j++)
fputc(min(imgUV[k][i][j],255),p_dec);
}
// next P picture. This is saved with recon B picture after B picture coding
if (img->number!=0 && input->successive_Bframe!=0)
{
for (i=0; i < img->height; i++)
for (j=0; j < img->width; j++)
nextP_imgY[i][j]=imgY[i][j];
for (k=0; k < 2; ++k)
for (i=0; i < img->height/2; i++)
for (j=0; j < img->width/2; j++)
nextP_imgUV[k][i][j]=imgUV[k][i][j];
}
}
else
{
for (i=0; i < img->height; i++)
for (j=0; j < img->width; j++)
fputc(min(imgY[i][j],255),p_dec);
for (k=0; k < 2; ++k)
for (i=0; i < img->height/2; i++)
for (j=0; j < img->width/2; j++)
fputc(min(imgUV[k][i][j],255),p_dec);
// If this is last B frame also store P frame
if(img->b_frame_to_code == input->successive_Bframe)
{
// save P picture
for (i=0; i < img->height; i++)
for (j=0; j < img->width; j++)
fputc(min(nextP_imgY[i][j],255),p_dec);
for (k=0; k < 2; ++k)
for (i=0; i < img->height/2; i++)
for (j=0; j < img->width/2; j++)
fputc(min(nextP_imgUV[k][i][j],255),p_dec);
}
}
}
}
/*!
************************************************************************
* \brief
* Choose interpolation method depending on MV-resolution
************************************************************************
*/
void interpolate_frame()
{ // write to mref[]
int rpic;
rpic = img->frame_cycle = img->number % img->buf_cycle;
if(input->mv_res)
oneeighthpix(0);
else
UnifiedOneForthPix(imgY, imgUV[0], imgUV[1],
mref[rpic], mcef[rpic][0], mcef[rpic][1],
Refbuf11[rpic]);
}
/*!
************************************************************************
* \brief
* Choose interpolation method depending on MV-resolution
************************************************************************
*/
void interpolate_frame_2() // write to mref_P
{
if(input->mv_res)
oneeighthpix(1);
else
UnifiedOneForthPix(imgY, imgUV[0], imgUV[1], mref_P, mcef_P[0], mcef_P[1], Refbuf11_P);
}
static void GenerateFullPelRepresentation (pel_t **Fourthpel, pel_t *Fullpel, int xsize, int ysize)
{
int x, y;
for (y=0; y<ysize; y++)
for (x=0; x<xsize; x++)
PutPel_11 (Fullpel, y, x, FastPelY_14 (Fourthpel, y*4, x*4));
}
/*!
************************************************************************
* \brief
* Upsample 4 times, store them in out4x. Color is simply copied
*
* \par Input:
* srcy, srcu, srcv, out4y, out4u, out4v
*
* \par Side Effects_
* Uses (writes) img4Y_tmp. This should be moved to a static variable
* in this module
************************************************************************/
void UnifiedOneForthPix (pel_t **imgY, pel_t** imgU, pel_t **imgV,
pel_t **out4Y, pel_t **outU, pel_t **outV,
pel_t *ref11)
{
int is;
int i,j,j4;
int ie2,je2,jj,maxy;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -