📄 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 + -