/*! ************************************************************************ * \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 * Directly output a picture without storing it in the DPB. Fields * are buffered before they are written to the file. * \param p * Picture for output * \param p_out * Output file ************************************************************************ */ void direct_output(StorablePicture *p, FILE *p_out) { if (p->structure==FRAME) { // we have a frame (or complementary field pair) // so output it directly flush_direct_output(p_out); write_picture (p, p_out, FRAME); if (p_ref) find_snr(snr, p, p_ref); free_storable_picture(p); return; } if (p->structure == TOP_FIELD) { if (out_buffer->is_used &1) flush_direct_output(p_out); out_buffer->top_field = p; out_buffer->is_used |= 1; } if (p->structure == BOTTOM_FIELD) { if (out_buffer->is_used &2) flush_direct_output(p_out); out_buffer->bottom_field = p; out_buffer->is_used |= 2; } if (out_buffer->is_used == 3) { // we have both fields, so output them dpb_combine_field(out_buffer); write_picture (out_buffer->frame, p_out, FRAME); if (p_ref) find_snr(snr, out_buffer->frame, p_ref); free_storable_picture(out_buffer->frame); out_buffer->frame = NULL; free_storable_picture(out_buffer->top_field); out_buffer->top_field = NULL; free_storable_picture(out_buffer->bottom_field); out_buffer->bottom_field = NULL; out_buffer->is_used = 0; } }