/*! ************************************************************************ * \brief * Write out not paired direct output fields. A second empty field is generated * and combined into the frame buffer. * \param fs * FrameStore that contains a single field * \param p_out * Output file ************************************************************************ */ void write_unpaired_field(FrameStore* fs, FILE *p_out) { StorablePicture *p; assert (fs->is_used<3); if(fs->is_used &1) { // we have a top field // construct an empty bottom field p = fs->top_field; fs->bottom_field = alloc_storable_picture(BOTTOM_FIELD, p->size_x, p->size_y, p->size_x_cr, p->size_y_cr); clear_picture(fs->bottom_field); dpb_combine_field(fs); write_picture (fs->frame, p_out); fs->is_used=3; } if(fs->is_used &2) { // we have a bottom field // construct an empty top field p = fs->bottom_field; fs->top_field = alloc_storable_picture(TOP_FIELD, p->size_x, p->size_y, p->size_x_cr, p->size_y_cr); clear_picture(fs->bottom_field); dpb_combine_field(fs); write_picture (fs->frame, p_out); fs->is_used=3; } }
/*! ************************************************************************ * \brief * Write out not paired direct output fields. A second empty field is generated * and combined into the frame buffer. * \param fs * FrameStore that contains a single field * \param p_out * Output file ************************************************************************ */ void write_unpaired_field(FrameStore* fs, FILE *p_out) { StorablePicture *p; assert (fs->is_used<3); if(fs->is_used &1) { // we have a top field // construct an empty bottom field p = fs->top_field; fs->bottom_field = alloc_storable_picture(BOTTOM_FIELD, p->size_x, 2*p->size_y, p->size_x_cr, 2*p->size_y_cr); clear_picture(fs->bottom_field); dpb_combine_field(fs); write_picture (fs->frame, p_out, TOP_FIELD); } if(fs->is_used &2) { // we have a bottom field // construct an empty top field p = fs->bottom_field; fs->top_field = alloc_storable_picture(TOP_FIELD, p->size_x, 2*p->size_y, p->size_x_cr, 2*p->size_y_cr); clear_picture(fs->top_field); fs ->top_field->frame_cropping_flag = fs->bottom_field->frame_cropping_flag; if(fs ->top_field->frame_cropping_flag) { fs ->top_field->frame_cropping_rect_top_offset = fs->bottom_field->frame_cropping_rect_top_offset; fs ->top_field->frame_cropping_rect_bottom_offset = fs->bottom_field->frame_cropping_rect_bottom_offset; fs ->top_field->frame_cropping_rect_left_offset = fs->bottom_field->frame_cropping_rect_left_offset; fs ->top_field->frame_cropping_rect_right_offset = fs->bottom_field->frame_cropping_rect_right_offset; } dpb_combine_field(fs); write_picture (fs->frame, p_out, BOTTOM_FIELD); } fs->is_used=3; }
/*! ************************************************************************ * \brief * Initializes the parameters for a new frame ************************************************************************ */ void init_frame(struct img_par *img, struct inp_par *inp) { int i,k,l,j; if (dec_picture) { // this may only happen on slice loss store_picture_in_dpb(dec_picture); } dec_picture = alloc_storable_picture (FRAME, img->width, img->height, img->width_cr, img->height_cr); dec_picture->poc=img->framepoc; dec_picture->top_poc=img->toppoc; dec_picture->bottom_poc=img->bottompoc; dec_picture->pic_num = img->frame_num; dec_picture->coded_frame = (img->structure==FRAME); // dec_picture->mb_adaptive_frame_field_flag = img->MbaffFrameFlag; for (i=0;i<listXsize[LIST_0];i++) { dec_picture->ref_pic_num[LIST_0][i]=listX[LIST_0][i]->poc; } for (i=0;i<listXsize[LIST_1];i++) { dec_picture->ref_pic_num[LIST_1][i]=listX[LIST_1][i]->poc; } if (img->MbaffFrameFlag) for (j=2;j<6;j++) for (i=0;i<listXsize[j];i++) { dec_picture->ref_pic_num[j][i]=listX[j][i]->poc; } img->current_slice_nr=0; if (img->type > SI_SLICE) { set_ec_flag(SE_PTYPE); img->type = P_SLICE; // concealed element } // allocate memory for frame buffers if (img->number == 0) { init_global_buffers(inp, img); } // CAVLC init for (i=0;i < (int)img->PicSizeInMbs; i++) for (k=0;k<4;k++) for (l=0;l<6;l++) img->nz_coeff[i][k][l]=-1; // CAVLC if(img->constrained_intra_pred_flag) { for (i=0; i<(int)img->PicSizeInMbs; i++) { img->intra_block[i] = 1; } } // WYK: Oct. 8, 2001. Set the slice_nr member of each MB to -1, to ensure correct when packet loss occurs // TO set Macroblock Map (mark all MBs as 'have to be concealed') for(i=0; i<(int)img->PicSizeInMbs; i++) { img->mb_data[i].slice_nr = -1; img->mb_data[i].ei_flag = 1; } }