image.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:84k
源码类别:

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file image.c
  4.  *
  5.  * brief
  6.  *    Code one image/slice
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *     - Inge Lille-Langoy               <inge.lille-langoy@telenor.com>
  11.  *     - Rickard Sjoberg                 <rickard.sjoberg@era.ericsson.se>
  12.  *     - Jani Lainema                    <jani.lainema@nokia.com>
  13.  *     - Sebastian Purreiter             <sebastian.purreiter@mch.siemens.de>
  14.  *     - Byeong-Moon Jeon                <jeonbm@lge.com>
  15.  *     - Yoon-Seong Soh                  <yunsung@lge.com>
  16.  *     - Thomas Stockhammer              <stockhammer@ei.tum.de>
  17.  *     - Detlev Marpe                    <marpe@hhi.de>
  18.  *     - Guido Heising
  19.  *     - Thomas Wedi                     <wedi@tnt.uni-hannover.de>
  20.  *     - Ragip Kurceren                  <ragip.kurceren@nokia.com>
  21.  *     - Antti Hallapuro                 <antti.hallapuro@nokia.com>
  22.  *     - Alexis Michael Tourapis         <alexismt@ieee.org>
  23.  *     - Athanasios Leontaris            <aleon@dolby.com>
  24.  *************************************************************************************
  25.  */
  26. #include "contributors.h"
  27. #include <math.h>
  28. #include <time.h>
  29. #include <sys/timeb.h>
  30. #include "global.h"
  31. #include "filehandle.h"
  32. #include "mbuffer.h"
  33. #include "img_luma.h"
  34. #include "img_chroma.h"
  35. #include "img_distortion.h"
  36. #include "intrarefresh.h"
  37. #include "slice.h"
  38. #include "fmo.h"
  39. #include "sei.h"
  40. #include "memalloc.h"
  41. #include "nalu.h"
  42. #include "ratectl.h"
  43. #include "mb_access.h"
  44. #include "cabac.h"
  45. #include "context_ini.h"
  46. #include "enc_statistics.h"
  47. #include "conformance.h"
  48. #include "q_matrix.h"
  49. #include "q_offsets.h"
  50. #include "wp.h"
  51. #include "input.h"
  52. #include "image.h"
  53. #include "errdo.h"
  54. extern pic_parameter_set_rbsp_t *PicParSet[MAXPPS];
  55. extern void DeblockFrame(ImageParameters *img, imgpel **, imgpel ***);
  56. static void code_a_picture(Picture *pic);
  57. static void field_picture(Picture *top, Picture *bottom);
  58. static void prepare_enc_frame_picture (StorablePicture **stored_pic);
  59. static void writeout_picture(Picture *pic);
  60. static byte picture_structure_decision(Picture *frame, Picture *top, Picture *bot);
  61. static void distortion_fld (Picture *field_pic);
  62. static void field_mode_buffer (ImageParameters *img, InputParameters *params);
  63. static void frame_mode_buffer (ImageParameters *img, InputParameters *params);
  64. static void init_frame(ImageParameters *img);
  65. static void init_field(ImageParameters *img);
  66. static void put_buffer_frame(ImageParameters *img);
  67. static void put_buffer_top(ImageParameters *img);
  68. static void put_buffer_bot(ImageParameters *img);
  69. static void PaddAutoCropBorders (FrameFormat output, int img_size_x, int img_size_y, int img_size_x_cr, int img_size_y_cr);
  70. static void rdPictureCoding(void);
  71. #ifdef _ADAPT_LAST_GROUP_
  72. int *last_P_no;
  73. int *last_P_no_frm;
  74. int *last_P_no_fld;
  75. #endif
  76. int FrameNumberInFile;
  77. static void ReportFirstframe(time_t tmp_time, time_t me_time);
  78. static void ReportIntra(time_t tmp_time, time_t me_time);
  79. static void ReportSP(time_t tmp_time, time_t me_time);
  80. static void ReportP(time_t tmp_time, time_t me_time);
  81. static void ReportB(time_t tmp_time, time_t me_time);
  82. static void ReportNALNonVLCBits(time_t tmp_time, time_t me_time);
  83. StorablePicture *enc_picture;
  84. StorablePicture **enc_frame_picture;
  85. StorablePicture **enc_field_picture;
  86. StorablePicture *enc_frame_picture_JV[MAX_PLANE];  //!< enc_frame_picture to be used during 4:4:4 independent mode encoding
  87. void MbAffPostProc(void)
  88. {
  89.   imgpel temp[32][16];
  90.   imgpel ** imgY  = enc_picture->imgY;
  91.   imgpel ***imgUV = enc_picture->imgUV;
  92.   int i, y, x0, y0, uv;
  93.   if (img->yuv_format != YUV400)
  94.   {
  95.     for (i=0; i<(int)img->PicSizeInMbs; i+=2)
  96.     {
  97.       if (enc_picture->motion.mb_field[i])
  98.       {
  99.         get_mb_pos(i, img->mb_size[IS_LUMA], &x0, &y0);
  100.         for (y=0; y<(2*MB_BLOCK_SIZE);y++)
  101.           memcpy(&temp[y],&imgY[y0+y][x0], MB_BLOCK_SIZE * sizeof(imgpel));
  102.         for (y=0; y<MB_BLOCK_SIZE;y++)
  103.         {
  104.           memcpy(&imgY[y0+(2*y)][x0],temp[y], MB_BLOCK_SIZE * sizeof(imgpel));
  105.           memcpy(&imgY[y0+(2*y + 1)][x0],temp[y+ MB_BLOCK_SIZE], MB_BLOCK_SIZE * sizeof(imgpel));
  106.         }
  107.         x0 = x0 / (16/img->mb_cr_size_x);
  108.         y0 = y0 / (16/img->mb_cr_size_y);
  109.         for (uv=0; uv<2; uv++)
  110.         {
  111.           for (y=0; y < (2 * img->mb_cr_size_y); y++)
  112.             memcpy(&temp[y],&imgUV[uv][y0+y][x0], img->mb_cr_size_x * sizeof(imgpel));
  113.           for (y=0; y<img->mb_cr_size_y;y++)
  114.           {
  115.             memcpy(&imgUV[uv][y0+(2*y)][x0],temp[y], img->mb_cr_size_x * sizeof(imgpel));
  116.             memcpy(&imgUV[uv][y0+(2*y + 1)][x0],temp[y+ img->mb_cr_size_y], img->mb_cr_size_x * sizeof(imgpel));
  117.           }
  118.         }
  119.       }
  120.     }
  121.   }
  122.   else
  123.   {
  124.     for (i=0; i<(int)img->PicSizeInMbs; i+=2)
  125.     {
  126.       if (enc_picture->motion.mb_field[i])
  127.       {
  128.         get_mb_pos(i, img->mb_size[IS_LUMA], &x0, &y0);
  129.         for (y=0; y<(2*MB_BLOCK_SIZE);y++)
  130.           memcpy(&temp[y],&imgY[y0+y][x0], MB_BLOCK_SIZE * sizeof(imgpel));
  131.         for (y=0; y<MB_BLOCK_SIZE;y++)
  132.         {
  133.           memcpy(&imgY[y0+(2*y)][x0],temp[y], MB_BLOCK_SIZE * sizeof(imgpel));
  134.           memcpy(&imgY[y0+(2*y + 1)][x0],temp[y+ MB_BLOCK_SIZE], MB_BLOCK_SIZE * sizeof(imgpel));
  135.         }
  136.       }
  137.     }
  138.   }
  139. }
  140. /*!
  141.  ************************************************************************
  142.  * brief
  143.  *    Sets slice type
  144.  *
  145.  ************************************************************************
  146.  */
  147. void set_slice_type(int slice_type)
  148. {
  149.   img->type = slice_type;            // set slice type
  150.   img->RCMinQP = params->RCMinQP[img->type];
  151.   img->RCMaxQP = params->RCMaxQP[img->type];
  152. }
  153. void code_a_plane(ImageParameters *img, Picture *pic)
  154. {
  155.   unsigned int NumberOfCodedMBs = 0;
  156.   int SliceGroup = 0;
  157.   // The slice_group_change_cycle can be changed here.
  158.   // FmoInit() is called before coding each picture, frame or field
  159.   img->slice_group_change_cycle=1;
  160.   FmoInit(img, active_pps, active_sps);
  161.   FmoStartPicture ();           //! picture level initialization of FMO
  162.   CalculateQuantParam();
  163.   CalculateOffsetParam();
  164.   if(params->Transform8x8Mode)
  165.   {
  166.     CalculateQuant8Param();
  167.     CalculateOffset8Param();
  168.   }
  169.   reset_pic_bin_count();
  170.   img->bytes_in_picture = 0;
  171.   while (NumberOfCodedMBs < img->PicSizeInMbs)       // loop over slices
  172.   {
  173.     // Encode one SLice Group
  174.     while (!FmoSliceGroupCompletelyCoded (SliceGroup))
  175.     {
  176.       // Encode the current slice
  177.       NumberOfCodedMBs += encode_one_slice (SliceGroup, pic, NumberOfCodedMBs);
  178.       FmoSetLastMacroblockInSlice (img->current_mb_nr);
  179.       // Proceed to next slice
  180.       img->current_slice_nr++;
  181.       stats->bit_slice = 0;
  182.     }
  183.     // Proceed to next SliceGroup
  184.     SliceGroup++;
  185.   }
  186.   FmoEndPicture ();
  187.   if ((params->SkipDeBlockNonRef == 0) || (img->nal_reference_idc != 0))
  188.     DeblockFrame (img, enc_picture->imgY, enc_picture->imgUV); //comment out to disable deblocking filter 
  189. }
  190. /*!
  191.  ************************************************************************
  192.  * brief
  193.  *    Encodes a picture
  194.  *
  195.  *    This is the main picture coding loop.. It is called by all this
  196.  *    frame and field coding stuff after the img-> elements have been
  197.  *    set up.  Not sure whether it is useful for MB-adaptive frame/field
  198.  *    coding
  199.  ************************************************************************
  200.  */
  201. static void code_a_picture(Picture *pic)
  202. {
  203.   int pl;
  204.   int idr_refresh;
  205.   // currently this code only supports fixed enhancement layer distance
  206.   if ( params->idr_period && !params->adaptive_idr_period )
  207.     idr_refresh = (( ( img->frm_number - img->lastIDRnumber ) % params->idr_period ) == 0);
  208.   else if ( params->idr_period && params->adaptive_idr_period == 1 )
  209.     idr_refresh = (( ( img->frm_number - imax(img->lastIntraNumber, img->lastIDRnumber) ) % params->idr_period ) == 0);
  210.   else
  211.     idr_refresh = (img->frm_number == 0);
  212.   img->currentPicture = pic;
  213.   img->currentPicture->idr_flag = ((!IMG_NUMBER) && (!(img->structure==BOTTOM_FIELD)))
  214.     || (idr_refresh && (img->type == I_SLICE || img->type==SI_SLICE)&& (!(img->structure==BOTTOM_FIELD)));
  215.   pic->no_slices = 0;
  216.   RandomIntraNewPicture ();     //! Allocates forced INTRA MBs (even for fields!)
  217.   if( IS_INDEPENDENT( params ) )
  218.   {
  219.     for( pl=0; pl<MAX_PLANE; pl++ )
  220.     {
  221.       img->current_mb_nr = 0;
  222.       img->current_slice_nr = 0;
  223.       img->SumFrameQP = 0;
  224.       img->colour_plane_id = pl;
  225.       
  226.       code_a_plane(img, pic);
  227.     }
  228.   }
  229.   else
  230.   {
  231.     code_a_plane(img, pic);
  232.   }
  233.   if (img->MbaffFrameFlag)
  234.     MbAffPostProc();
  235. }
  236. void update_global_stats(StatParameters *cur_stats)
  237. {  
  238.   int i, j, k;
  239.   for (i = 0; i < 4; i++)
  240.     stats->intra_chroma_mode[i]    += cur_stats->intra_chroma_mode[i];
  241.   for (i = 0; i < 5; i++)
  242.   {
  243.     stats->quant[i]                += cur_stats->quant[i];
  244.     stats->num_macroblocks[i]      += cur_stats->num_macroblocks[i];
  245.     stats->bit_use_mb_type [i]     += cur_stats->bit_use_mb_type[i];
  246.     stats->bit_use_header  [i]     += cur_stats->bit_use_header[i];
  247.     stats->tmp_bit_use_cbp [i]     += cur_stats->tmp_bit_use_cbp[i];
  248.     stats->bit_use_coeffC  [i]     += cur_stats->bit_use_coeffC[i];
  249.     stats->bit_use_coeff[0][i]     += cur_stats->bit_use_coeff[0][i];
  250.     stats->bit_use_coeff[1][i]     += cur_stats->bit_use_coeff[1][i]; 
  251.     stats->bit_use_coeff[2][i]     += cur_stats->bit_use_coeff[2][i]; 
  252.     stats->bit_use_delta_quant[i]  += cur_stats->bit_use_delta_quant[i];
  253.     stats->bit_use_stuffingBits[i] += cur_stats->bit_use_stuffingBits[i];
  254.     for (k = 0; k < 2; k++)
  255.       stats->b8_mode_0_use[i][k] += cur_stats->b8_mode_0_use[i][k];
  256.     for (j = 0; j < 15; j++)
  257.     {
  258.       stats->mode_use[i][j]     += cur_stats->mode_use[i][j];
  259.       stats->bit_use_mode[i][j] += cur_stats->bit_use_mode[i][j];
  260.       for (k = 0; k < 2; k++)
  261.         stats->mode_use_transform[i][j][k] += cur_stats->mode_use_transform[i][j][k];
  262.     }
  263.   }
  264. }
  265. void free_pictures(int stored_pic)
  266. {
  267.   int i;
  268.   for (i = 0; i < 6; i++)
  269.   {
  270.     if (i != stored_pic)
  271.       free_storable_picture(enc_frame_picture[i]);        
  272.   }
  273. }
  274. /*!
  275.  ************************************************************************
  276.  * brief
  277.  *    Encodes one frame
  278.  ************************************************************************
  279.  */
  280. int encode_one_frame (void)
  281. {
  282.   static int prev_frame_no = 0; // POC200301
  283.   static int consecutive_non_reference_pictures = 0; // POC200301
  284.   int        i, j;
  285.   int   nplane;
  286.   //Rate control
  287.   int bits = 0;
  288. #ifdef _LEAKYBUCKET_
  289.   //extern long Bit_Buffer[20000];
  290.   extern unsigned long total_frame_buffer;
  291. #endif
  292.   TIME_T start_time;
  293.   TIME_T end_time;
  294.   time_t  tmp_time;
  295.   me_time = 0;
  296.   img->rd_pass = 0;
  297.   if( IS_INDEPENDENT(params) )
  298.   {
  299.     for( nplane=0; nplane<MAX_PLANE; nplane++ ){
  300.       enc_frame_picture_JV[nplane] = NULL;
  301.     }
  302.   }
  303.   for (i = 0; i < 6; i++)
  304.     enc_frame_picture[i]  = NULL;
  305.   gettime(&start_time);          // start time in ms
  306.   //Rate control
  307.   img->write_macroblock = FALSE;
  308.   /*
  309.   //Shankar Regunathan (Oct 2002)
  310.   //Prepare Panscanrect SEI payload
  311.   UpdatePanScanRectInfo ();
  312.   //Prepare Arbitrarydata SEI Payload
  313.   UpdateUser_data_unregistered ();
  314.   //Prepare Registered data SEI Payload
  315.   UpdateUser_data_registered_itu_t_t35 ();
  316.   //Prepare RandomAccess SEI Payload
  317.   UpdateRandomAccess ();
  318.   */
  319.   if ((params->ResendPPS) && (img->frm_number !=0))
  320.   {
  321.     stats->bit_ctr_parametersets_n = write_PPS(0, 0);
  322.     stats->bit_ctr_parametersets  += stats->bit_ctr_parametersets_n;
  323.   }
  324.   put_buffer_frame (img);      // sets the pointers to the frame structures
  325.                                // (and not to one of the field structures)
  326.   init_frame (img);
  327.   ReadOneFrame (FrameNumberInFile, params->infile_header, &params->source, &params->output);
  328.   PaddAutoCropBorders (params->output, img->width, img->height, img->width_cr, img->height_cr);
  329.   // set parameters for direct mode and deblocking filter
  330.   img->direct_spatial_mv_pred_flag = params->direct_spatial_mv_pred_flag;
  331.   img->DFDisableIdc                = params->DFDisableIdc[img->nal_reference_idc > 0][img->type];
  332.   img->DFAlphaC0Offset             = params->DFAlpha     [img->nal_reference_idc > 0][img->type];
  333.   img->DFBetaOffset                = params->DFBeta      [img->nal_reference_idc > 0][img->type];
  334.   img->AdaptiveRounding            = params->AdaptiveRounding; 
  335.   // Following code should consider optimal coding mode. Currently also does not support
  336.   // multiple slices per frame.
  337.   dist->frame_ctr++;
  338.   if(img->type == SP_SLICE)
  339.   {
  340.     if(params->sp2_frame_indicator)
  341.     { // switching SP frame encoding
  342.       sp2_frame_indicator=1;
  343.       read_SP_coefficients();
  344.     }
  345.   }
  346.   else
  347.   {
  348.     sp2_frame_indicator=0;
  349.   }
  350.   if ( params->WPMCPrecision )
  351.   {
  352.     wpxInitWPXPasses(params);
  353.     pWPX->curr_wp_rd_pass = pWPX->wp_rd_passes;
  354.     pWPX->curr_wp_rd_pass->algorithm = WP_REGULAR;
  355.   }
  356.   if (params->PicInterlace == FIELD_CODING)
  357.   {
  358.     //Rate control
  359.     if ( params->RCEnable && params->RCUpdateMode <= MAX_RC_MODE )
  360.       generic_RC->FieldControl = 1;
  361.     img->field_picture = 1;  // we encode fields
  362.     field_picture (field_pic[0], field_pic[1]);
  363.     img->fld_flag = TRUE;
  364.   }
  365.   else
  366.   {
  367.     int tmpFrameQP;
  368.     //Rate control
  369.     if ( params->RCEnable && params->RCUpdateMode <= MAX_RC_MODE )
  370.       generic_RC->FieldControl = 0;
  371.     img->field_picture = 0; // we encode a frame
  372.     //Rate control
  373.     if(params->RCEnable)
  374.       rc_init_frame(FrameNumberInFile);
  375.     if (params->GenerateMultiplePPS)
  376.       active_pps = PicParSet[0];
  377.     frame_picture (frame_pic[0], 0);
  378.     if ((params->RDPictureIntra || img->type!=I_SLICE) && params->RDPictureDecision)
  379.     {
  380.       rdPictureCoding();
  381.     }
  382.     tmpFrameQP = img->SumFrameQP; // call it here since rdPictureCoding buffers it and may modify it
  383.     if ((img->type==SP_SLICE) && (si_frame_indicator==0) && (params->si_frame_indicator))
  384.     {
  385.       // once the picture has been encoded as a primary SP frame encode as an SI frame
  386.       si_frame_indicator=1;
  387.       frame_picture (frame_pic_si, 0);
  388.     }
  389.     if ((img->type == SP_SLICE) && (params->sp_output_indicator))
  390.     {
  391.       // output the transformed and quantized coefficients (useful for switching SP frames)
  392.       output_SP_coefficients();
  393.     }
  394.     if (params->PicInterlace == ADAPTIVE_CODING)
  395.     {
  396.       //Rate control
  397.       if ( params->RCEnable && params->RCUpdateMode <= MAX_RC_MODE )
  398.         generic_RC->FieldControl=1;
  399.       img->write_macroblock = FALSE;
  400.       img->bot_MB = FALSE;
  401.       img->field_picture = 1;  // we encode fields
  402.       field_picture (field_pic[0], field_pic[1]);
  403.       if(img->rd_pass == 0)
  404.         img->fld_flag = picture_structure_decision (frame_pic[0], field_pic[0], field_pic[1]);
  405.       else if(img->rd_pass == 1)
  406.         img->fld_flag = picture_structure_decision (frame_pic[1], field_pic[0], field_pic[1]);
  407.       else
  408.         img->fld_flag = picture_structure_decision (frame_pic[2], field_pic[0], field_pic[1]);
  409.       if ( img->fld_flag )
  410.         tmpFrameQP = img->SumFrameQP;
  411.       update_field_frame_contexts (img->fld_flag);
  412.       //Rate control
  413.       if ( params->RCEnable && params->RCUpdateMode <= MAX_RC_MODE )
  414.         generic_RC->FieldFrame = !(img->fld_flag) ? 1 : 0;
  415.     }
  416.     else
  417.       img->fld_flag = FALSE;
  418.     img->SumFrameQP = tmpFrameQP;
  419.   }
  420.   stats->frame_counter++;
  421.   stats->frame_ctr[img->type]++;
  422.   // Here, img->structure may be either FRAME or BOTTOM FIELD depending on whether AFF coding is used
  423.   // The picture structure decision changes really only the fld_flag
  424.   if (img->fld_flag)            // field mode (use field when fld_flag=1 only)
  425.   {
  426.     field_mode_buffer (img, params);
  427.     writeout_picture (field_pic[0]);
  428.     writeout_picture (field_pic[1]);
  429.   }
  430.   else                          //frame mode
  431.   {
  432.     frame_mode_buffer (img, params);
  433.     if (img->type==SP_SLICE && si_frame_indicator == 1)
  434.     {
  435.       writeout_picture (frame_pic_si);
  436.       si_frame_indicator=0;
  437.     }
  438.     else
  439.     {
  440.       writeout_picture (frame_pic[img->rd_pass]);
  441.     }
  442.   }
  443.   if (frame_pic_si)
  444.   {
  445.     free_slice_list(frame_pic_si);
  446.   }
  447.   for (i = 0; i < img->frm_iter; i++)
  448.   {
  449.     if (frame_pic[i])
  450.     {
  451.       free_slice_list(frame_pic[i]);
  452.     }
  453.   }
  454.   if (field_pic)
  455.   {
  456.     for (i = 0; i < 2; i++)
  457.     {
  458.       if (field_pic[i])
  459.         free_slice_list(field_pic[i]);
  460.     }
  461.   }
  462.   /*
  463.   // Tian Dong (Sept 2002)
  464.   // in frame mode, the newly reconstructed frame has been inserted to the mem buffer
  465.   // and it is time to prepare the spare picture SEI payload.
  466.   if (params->InterlaceCodingOption == FRAME_CODING
  467.   && params->SparePictureOption && img->type != B_SLICE)
  468.   CalculateSparePicture ();
  469.   */
  470.   //Rate control
  471.   if(params->RCEnable)
  472.   {
  473.     // we could add here a function pointer!
  474.     bits = (int) (stats->bit_ctr - stats->bit_ctr_n);
  475.     if ( params->RCUpdateMode <= MAX_RC_MODE )
  476.       rc_update_pict_frame_ptr(quadratic_RC, bits);
  477.   }
  478.   if (params->PicInterlace == FRAME_CODING)
  479.   {
  480.     if ((params->rdopt == 3) && (img->nal_reference_idc != 0))
  481.     {
  482.       UpdateDecoders (params, img, enc_picture);      // simulate packet losses and move decoded image to reference buffers
  483.     }
  484.     if (params->RestrictRef)
  485.       UpdatePixelMap ();
  486.   }
  487.   compute_distortion();
  488.   // redundant pictures: save reconstruction to calculate SNR and replace reference picture
  489.   if(params->redundant_pic_flag)
  490.   {
  491.     int k;
  492.     if(key_frame)
  493.     {
  494.       for(j=0; j<img->height; j++)
  495.       {
  496.         memcpy(imgY_tmp[j], enc_frame_picture[0]->imgY[j], img->width * sizeof(imgpel));
  497.       }
  498.       for (k = 0; k < 2; k++)
  499.       {
  500.         for(j=0; j<img->height_cr; j++)
  501.         {
  502.           memcpy(imgUV_tmp[k][j], enc_frame_picture[0]->imgUV[k][j], img->width_cr * sizeof(imgpel));
  503.         }
  504.       }
  505.     }
  506.     if(redundant_coding)
  507.     {
  508.       for(j=0; j<img->height; j++)
  509.       {
  510.         memcpy(enc_frame_picture[0]->imgY[j], imgY_tmp[j], img->width * sizeof(imgpel));
  511.       }
  512.       for (k = 0; k < 2; k++)
  513.       {
  514.         for(j=0; j<img->height_cr; j++)
  515.         {
  516.           memcpy(enc_frame_picture[0]->imgUV[k][j], imgUV_tmp[k][j], img->width_cr * sizeof(imgpel));
  517.         }
  518.       }
  519.     }
  520.   }
  521.  
  522.   if (params->PicInterlace == ADAPTIVE_CODING)
  523.   {
  524.     if (img->fld_flag)
  525.     {
  526.       // store bottom field
  527.       store_picture_in_dpb(enc_field_picture[1]);
  528.       free_storable_picture(enc_frame_picture[0]);
  529.       free_storable_picture(enc_frame_picture[1]);
  530.       free_storable_picture(enc_frame_picture[2]);
  531.       update_global_stats(&enc_field_picture[0]->stats);
  532.       update_global_stats(&enc_field_picture[1]->stats);
  533.     }
  534.     else
  535.     {
  536.       // replace top with frame
  537.       if (img->rd_pass==2)
  538.       {
  539.         replace_top_pic_with_frame(enc_frame_picture[2]);
  540.         free_storable_picture(enc_frame_picture[0]);
  541.         free_storable_picture(enc_frame_picture[1]);
  542.       }
  543.       else if (img->rd_pass==1)
  544.       {
  545.         replace_top_pic_with_frame(enc_frame_picture[1]);
  546.         free_storable_picture(enc_frame_picture[0]);
  547.         free_storable_picture(enc_frame_picture[2]);
  548.       }
  549.       else
  550.       {
  551.         if(params->redundant_pic_flag==0 || (key_frame==0))
  552.         {
  553.           replace_top_pic_with_frame(enc_frame_picture[0]);
  554.           free_storable_picture(enc_frame_picture[1]);
  555.           free_storable_picture(enc_frame_picture[2]);
  556.         }
  557.       }
  558.       free_storable_picture(enc_field_picture[1]);
  559.       update_global_stats(&enc_frame_picture[img->rd_pass]->stats);
  560.     }
  561.   }
  562.   else
  563.   {
  564.     if (img->fld_flag)
  565.     {
  566.       store_picture_in_dpb(enc_field_picture[1]);
  567.       update_global_stats(&enc_field_picture[0]->stats);
  568.       update_global_stats(&enc_field_picture[1]->stats);
  569.     }
  570.     else
  571.     {
  572.       if ((params->redundant_pic_flag != 1) || (key_frame == 0))
  573.       {
  574.         store_picture_in_dpb (enc_frame_picture[img->rd_pass]);
  575.         update_global_stats(&enc_frame_picture[img->rd_pass]->stats);
  576.         free_pictures(img->rd_pass);
  577.       }
  578.     }
  579.   }
  580.   img->AverageFrameQP = isign(img->SumFrameQP) * ((iabs(img->SumFrameQP) + (int) (img->FrameSizeInMbs >> 1))/ (int) img->FrameSizeInMbs);
  581.   if ( params->RCEnable && params->RCUpdateMode <= MAX_RC_MODE && img->type != B_SLICE && params->basicunit < img->FrameSizeInMbs )
  582.     quadratic_RC->CurrLastQP = img->AverageFrameQP;
  583. #ifdef _LEAKYBUCKET_
  584.   // Store bits used for this frame and increment counter of no. of coded frames
  585.   Bit_Buffer[total_frame_buffer] = (int) (stats->bit_ctr - stats->bit_ctr_n);
  586.   total_frame_buffer++;
  587. #endif
  588.   // POC200301: Verify that POC coding type 2 is not used if more than one consecutive
  589.   // non-reference frame is requested or if decoding order is different from output order
  590.   if (img->pic_order_cnt_type == 2)
  591.   {
  592.     if (!img->nal_reference_idc) consecutive_non_reference_pictures++;
  593.     else consecutive_non_reference_pictures = 0;
  594.     if (frame_no < prev_frame_no || consecutive_non_reference_pictures>1)
  595.       error("POC type 2 cannot be applied for the coding pattern where the encoding /decoding order of pictures are different from the output order.n", -1);
  596.     prev_frame_no = frame_no;
  597.   }
  598.   gettime(&end_time);    // end time in ms
  599.   tmp_time  = timediff(&start_time, &end_time);
  600.   tot_time += tmp_time;
  601.   if (stats->bit_ctr_parametersets_n!=0)
  602.     ReportNALNonVLCBits(tmp_time, me_time);
  603.   if (img->frm_number == 0)
  604.     ReportFirstframe(tmp_time,me_time);
  605.   else
  606.   {
  607.     //Rate control
  608.     if(params->RCEnable)
  609.     {
  610.       if ((!params->PicInterlace) && (!params->MbInterlace))
  611.         bits = (int) (stats->bit_ctr - stats->bit_ctr_n);
  612.       else if ( params->RCUpdateMode <= MAX_RC_MODE )
  613.       {
  614.         bits = (int)(stats->bit_ctr - (quadratic_RC->Pprev_bits)); // used for rate control update
  615.         quadratic_RC->Pprev_bits = stats->bit_ctr;
  616.       }
  617.     }
  618.     stats->bit_counter[img->type] += stats->bit_ctr - stats->bit_ctr_n;
  619.     switch (img->type)
  620.     {
  621.     case I_SLICE:
  622.     case SI_SLICE:
  623.       ReportIntra(tmp_time,me_time);
  624.       break;
  625.     case SP_SLICE:
  626.       ReportSP(tmp_time,me_time);
  627.       break;
  628.     case B_SLICE:
  629.       ReportB(tmp_time,me_time);
  630.       break;
  631.     default:      // P
  632.       ReportP(tmp_time,me_time);
  633.     }
  634.   }
  635.   if (params->Verbose == 0)
  636.   {
  637.     //for (i = 0; i <= (img->number & 0x0F); i++)
  638.     //printf(".");
  639.     //printf("                              r");
  640.     printf("Completed Encoding Frame %05d.r",frame_no);
  641.   }
  642.   // Flush output statistics
  643.   fflush(stdout);
  644.   //Rate control
  645.   if(params->RCEnable)
  646.     rc_update_picture_ptr( bits );
  647.   stats->bit_ctr_n = stats->bit_ctr;
  648.   stats->bit_ctr_parametersets_n = 0;
  649.   if ( img->type == I_SLICE && img->nal_reference_idc)
  650.   {
  651.     //img->lastINTRA = frame_no;
  652.     // Lets also handle the possibility of backward GOPs and hierarchical structures 
  653.     if ( !(img->b_frame_to_code) )
  654.     {
  655.       img->lastINTRA       = imax(img->lastINTRA, frame_no);
  656.       img->lastIntraNumber = img->frm_number;
  657.     }
  658.     if ( img->currentPicture->idr_flag )
  659.     {
  660.       img->lastIDRnumber = img->frm_number;
  661.     }
  662.   }
  663.   return ((IMG_NUMBER == 0)? 0 : 1);
  664. }
  665. /*!
  666.  ************************************************************************
  667.  * brief
  668.  *    This function write out a picture
  669.  * return
  670.  *    0 if OK,                                                         n
  671.  *    1 in case of error
  672.  *
  673.  ************************************************************************
  674.  */
  675. static void writeout_picture(Picture *pic)
  676. {
  677.   int partition, slice;
  678.   Slice  *currSlice;
  679.   img->currentPicture = pic;
  680.   // loop over all slices of the picture
  681.   for (slice=0; slice < pic->no_slices; slice++)
  682.   {
  683.     currSlice = pic->slices[slice];
  684.     // loop over the partitions
  685.     for (partition=0; partition < currSlice->max_part_nr; partition++)
  686.     {
  687.       // write only if the partition has content
  688.       if (currSlice->partArr[partition].bitstream->write_flag )
  689.       {
  690.         stats->bit_ctr += WriteNALU (currSlice->partArr[partition].nal_unit);
  691.       }
  692.     }
  693.   }
  694. }
  695. void copy_params(StorablePicture *enc_picture, seq_parameter_set_rbsp_t *active_sps)
  696. {
  697.   enc_picture->frame_mbs_only_flag = active_sps->frame_mbs_only_flag;
  698.   enc_picture->frame_cropping_flag = active_sps->frame_cropping_flag;
  699.   enc_picture->chroma_format_idc   = active_sps->chroma_format_idc;
  700.   if (active_sps->frame_cropping_flag)
  701.   {
  702.     enc_picture->frame_cropping_rect_left_offset   = active_sps->frame_cropping_rect_left_offset;
  703.     enc_picture->frame_cropping_rect_right_offset  = active_sps->frame_cropping_rect_right_offset;
  704.     enc_picture->frame_cropping_rect_top_offset    = active_sps->frame_cropping_rect_top_offset;
  705.     enc_picture->frame_cropping_rect_bottom_offset = active_sps->frame_cropping_rect_bottom_offset;
  706.   }
  707.   else
  708.   {
  709.     enc_picture->frame_cropping_rect_left_offset   = 0;
  710.     enc_picture->frame_cropping_rect_right_offset  = 0;
  711.     enc_picture->frame_cropping_rect_top_offset    = 0;
  712.     enc_picture->frame_cropping_rect_bottom_offset = 0;
  713.   }
  714. }
  715. /*!
  716.  ************************************************************************
  717.  * brief
  718.  *    Prepare and allocate an encoded frame picture structure
  719.  ************************************************************************
  720.  */
  721. static void prepare_enc_frame_picture (StorablePicture **stored_pic)
  722. {
  723.   (*stored_pic)              = alloc_storable_picture ((PictureStructure) img->structure, img->width, img->height, img->width_cr, img->height_cr);
  724.   
  725.   img->ThisPOC               = img->framepoc;
  726.   (*stored_pic)->poc         = img->framepoc;
  727.   (*stored_pic)->top_poc     = img->toppoc;
  728.   (*stored_pic)->bottom_poc  = img->bottompoc;
  729.   (*stored_pic)->frame_poc   = img->framepoc;
  730.   (*stored_pic)->pic_num     = img->frame_num;
  731.   (*stored_pic)->frame_num   = img->frame_num;
  732.   (*stored_pic)->coded_frame = 1;
  733.   (*stored_pic)->MbaffFrameFlag = img->MbaffFrameFlag = (params->MbInterlace != FRAME_CODING);
  734.   
  735.   get_mb_block_pos           = img->MbaffFrameFlag ? get_mb_block_pos_mbaff : get_mb_block_pos_normal;
  736.   getNeighbour               = img->MbaffFrameFlag ? getAffNeighbour : getNonAffNeighbour;
  737.   enc_picture                = *stored_pic;
  738.   copy_params(enc_picture, active_sps);
  739. }
  740. static void calc_picture_bits(Picture *frame)
  741. {
  742.   int i, j;
  743.   Slice *thisSlice = NULL;
  744.   frame->bits_per_picture = 0;
  745.   for ( i = 0; i < frame->no_slices; i++ )
  746.   {
  747.     thisSlice = frame->slices[i];
  748.     for ( j = 0; j < thisSlice->max_part_nr; j++ )
  749.       frame->bits_per_picture += 8 * ((thisSlice->partArr[j]).bitstream)->byte_pos;
  750.   }
  751. }
  752. /*!
  753.  ************************************************************************
  754.  * brief
  755.  *    Encodes a frame picture
  756.  ************************************************************************
  757.  */
  758. void frame_picture (Picture *frame, int rd_pass)
  759. {
  760.   int nplane;
  761.   img->SumFrameQP = 0;
  762.   img->structure = FRAME;
  763.   img->PicSizeInMbs = img->FrameSizeInMbs;
  764.   //set mv limits to frame type
  765.   update_mv_limits(img, FALSE);
  766.   if( IS_INDEPENDENT(params) )
  767.   {
  768.     for( nplane=0; nplane<MAX_PLANE; nplane++ )
  769.     {
  770.       prepare_enc_frame_picture( &enc_frame_picture_JV[nplane] );      
  771.     }
  772.   }
  773.   else
  774.   {
  775.     prepare_enc_frame_picture( &enc_frame_picture[rd_pass] );
  776.   }
  777.   img->fld_flag = FALSE;
  778.   code_a_picture(frame);
  779.   if( IS_INDEPENDENT(params) )
  780.   {
  781.     make_frame_picture_JV();
  782.   }
  783.   calc_picture_bits(frame);
  784.   if (img->structure==FRAME)
  785.   {
  786.     find_distortion ();
  787.     frame->distortion = dist->metric[SSE];
  788.   }
  789. }
  790. /*!
  791.  ************************************************************************
  792.  * brief
  793.  *    Encodes a field picture, consisting of top and bottom field
  794.  ************************************************************************
  795.  */
  796. static void field_picture (Picture *top, Picture *bottom)
  797. {
  798.   //Rate control
  799.   int old_pic_type;              // picture type of top field used for rate control
  800.   int TopFieldBits;
  801.   img->SumFrameQP = 0;
  802.   //set mv limits to field type
  803.   update_mv_limits(img, TRUE);
  804.   //Rate control
  805.   old_pic_type = img->type;
  806.   img->number *= 2;
  807.   img->buf_cycle *= 2;
  808.   img->height    = (params->output.height + img->auto_crop_bottom) / 2;
  809.   img->height_cr = img->height_cr_frame / 2;
  810.   img->fld_flag  = TRUE;
  811.   img->PicSizeInMbs = img->FrameSizeInMbs/2;
  812.   // Top field
  813.   enc_field_picture[0]              = alloc_storable_picture ((PictureStructure) img->structure, img->width, img->height, img->width_cr, img->height_cr);
  814.   enc_field_picture[0]->poc         = img->toppoc;
  815.   enc_field_picture[0]->frame_poc   = img->toppoc;
  816.   enc_field_picture[0]->pic_num     = img->frame_num;
  817.   enc_field_picture[0]->frame_num   = img->frame_num;
  818.   enc_field_picture[0]->coded_frame = 0;
  819.   enc_field_picture[0]->MbaffFrameFlag = img->MbaffFrameFlag = FALSE;
  820.   get_mb_block_pos = get_mb_block_pos_normal;
  821.   getNeighbour = getNonAffNeighbour;
  822.   img->ThisPOC = img->toppoc;
  823.   img->structure = TOP_FIELD;
  824.   enc_picture = enc_field_picture[0];
  825.   copy_params(enc_picture, active_sps);
  826.   put_buffer_top (img);
  827.   init_field (img);
  828.   if (img->type == B_SLICE)       //all I- and P-frames
  829.     nextP_tr_fld--;
  830.   img->fld_flag = TRUE;
  831.   //Rate control
  832.   if(params->RCEnable && params->RCUpdateMode <= MAX_RC_MODE)
  833.     rc_init_top_field();
  834.   code_a_picture(field_pic[0]);
  835.   enc_picture->structure = TOP_FIELD;
  836.   store_picture_in_dpb(enc_field_picture[0]);
  837.   calc_picture_bits(top);
  838.   //Rate control
  839.   TopFieldBits=top->bits_per_picture;
  840.   //  Bottom field
  841.   enc_field_picture[1]  = alloc_storable_picture ((PictureStructure) img->structure, img->width, img->height, img->width_cr, img->height_cr);
  842.   enc_field_picture[1]->poc=img->bottompoc;
  843.   enc_field_picture[1]->frame_poc = img->bottompoc;
  844.   enc_field_picture[1]->pic_num = img->frame_num;
  845.   enc_field_picture[1]->frame_num = img->frame_num;
  846.   enc_field_picture[1]->coded_frame = 0;
  847.   enc_field_picture[1]->MbaffFrameFlag = img->MbaffFrameFlag = FALSE;
  848.   get_mb_block_pos = get_mb_block_pos_normal;
  849.   getNeighbour = getNonAffNeighbour;
  850.   img->ThisPOC = img->bottompoc;
  851.   img->structure = BOTTOM_FIELD;
  852.   enc_picture = enc_field_picture[1];
  853.   copy_params(enc_picture, active_sps);
  854.   put_buffer_bot (img);
  855.   img->number++;
  856.   init_field (img);
  857.   if (img->type == B_SLICE)       //all I- and P-frames
  858.     nextP_tr_fld++;             //check once coding B field
  859.  if (img->type == I_SLICE && params->IntraBottom!=1)
  860.    set_slice_type((params->BRefPictures == 2) ? B_SLICE : P_SLICE);
  861.   img->fld_flag = TRUE;
  862.   //Rate control
  863.   if(params->RCEnable && params->RCUpdateMode <= MAX_RC_MODE)
  864.     rc_init_bottom_field( TopFieldBits );
  865.   enc_picture->structure = BOTTOM_FIELD;
  866.   code_a_picture(field_pic[1]);
  867.   calc_picture_bits(bottom);
  868.   // the distortion for a field coded frame (consisting of top and bottom field)
  869.   // lives in the top->distortion variables, the bottom-> are dummies
  870.   distortion_fld (top);
  871. }
  872. /*!
  873.  ************************************************************************
  874.  * brief
  875.  *    form frame picture from two field pictures
  876.  ************************************************************************
  877.  */
  878. static void combine_field(void)
  879. {
  880.   int i, k;
  881.   for (i = 0; i < (img->height >> 1); i++)
  882.   {
  883.     memcpy(imgY_com[i*2],     enc_field_picture[0]->imgY[i], img->width*sizeof(imgpel));     // top field
  884.     memcpy(imgY_com[i*2 + 1], enc_field_picture[1]->imgY[i], img->width*sizeof(imgpel)); // bottom field
  885.   }
  886.   if (img->yuv_format != YUV400)
  887.   {
  888.     for (k = 0; k < 2; k++)
  889.     {
  890.       for (i = 0; i < (img->height_cr >> 1); i++)
  891.       {
  892.         memcpy(imgUV_com[k][i*2],     enc_field_picture[0]->imgUV[k][i], img->width_cr*sizeof(imgpel));
  893.         memcpy(imgUV_com[k][i*2 + 1], enc_field_picture[1]->imgUV[k][i], img->width_cr*sizeof(imgpel));
  894.       }
  895.     }
  896.   }
  897. }
  898. /*!
  899.  ************************************************************************
  900.  * brief
  901.  *    Distortion Field
  902.  ************************************************************************
  903.  */
  904. static void distortion_fld (Picture *field_pic)
  905. {
  906.   img->number /= 2;
  907.   img->buf_cycle /= 2;
  908.   img->height    = (params->output.height + img->auto_crop_bottom);
  909.   img->height_cr = img->height_cr_frame;
  910.   combine_field ();
  911.   pCurImg   = img_org_frm[0];
  912.   pImgOrg[0] = img_org_frm[0];
  913.   if (params->yuv_format != YUV400)
  914.   {
  915.     pImgOrg[1] = img_org_frm[1];
  916.     pImgOrg[2] = img_org_frm[2];
  917.   }
  918.   find_distortion ();   // find snr from original frame picture
  919.   field_pic->distortion = dist->metric[SSE];
  920. }
  921. /*!
  922.  ************************************************************************
  923.  * brief
  924.  *    RD decision of frame and field coding
  925.  ************************************************************************
  926.  */
  927. static byte decide_fld_frame(float snr_frame_Y, float snr_field_Y, int bit_field, int bit_frame, double lambda_picture)
  928. {
  929.   double cost_frame, cost_field;
  930.   cost_frame = bit_frame * lambda_picture + snr_frame_Y;
  931.   cost_field = bit_field * lambda_picture + snr_field_Y;
  932.   if (cost_field > cost_frame)
  933.     return FALSE;
  934.   else
  935.     return TRUE;
  936. }
  937. /*!
  938.  ************************************************************************
  939.  * brief
  940.  *    Picture Structure Decision
  941.  ************************************************************************
  942.  */
  943. static byte picture_structure_decision (Picture *frame, Picture *top, Picture *bot)
  944. {
  945.   double lambda_picture;
  946.   int bframe = (img->type == B_SLICE);
  947.   float sse_frame, sse_field;
  948.   int bit_frame, bit_field;
  949.   lambda_picture = 0.68 * pow (2, img->bitdepth_lambda_scale + ((img->qp - SHIFT_QP) / 3.0)) * (bframe ? 1 : 1);
  950.   sse_frame = frame->distortion.value[0] + frame->distortion.value[1] + frame->distortion.value[2];
  951.   //! all distrortions of a field picture are accumulated in the top field
  952.   sse_field = top->distortion.value[0] + top->distortion.value[1] + top->distortion.value[2];
  953.   bit_field = top->bits_per_picture + bot->bits_per_picture;
  954.   bit_frame = frame->bits_per_picture;
  955.   return decide_fld_frame (sse_frame, sse_field, bit_field, bit_frame, lambda_picture);
  956. }
  957. /*!
  958.  ************************************************************************
  959.  * brief
  960.  *    Field Mode Buffer
  961.  ************************************************************************
  962.  */
  963. static void field_mode_buffer (ImageParameters *img, InputParameters *params)
  964. {
  965.   put_buffer_frame (img);
  966. }
  967. /*!
  968.  ************************************************************************
  969.  * brief
  970.  *    Frame Mode Buffer
  971.  ************************************************************************
  972.  */
  973. static void frame_mode_buffer (ImageParameters *img, InputParameters *params)
  974. {
  975.   put_buffer_frame (img);
  976.   if ((params->PicInterlace != FRAME_CODING)||(params->MbInterlace != FRAME_CODING))
  977.   {
  978.     img->height = img->height / 2;
  979.     img->height_cr = img->height_cr / 2;
  980.     img->number *= 2;
  981.     put_buffer_top (img);
  982.     img->number++;
  983.     put_buffer_bot (img);
  984.     img->number /= 2;         // reset the img->number to field
  985.     img->height = (params->output.height + img->auto_crop_bottom);
  986.     img->height_cr = img->height_cr_frame;
  987.     put_buffer_frame (img);
  988.   }
  989. }
  990. /*!
  991.  ************************************************************************
  992.  * brief
  993.  *    mmco initializations should go here
  994.  ************************************************************************
  995.  */
  996. static void init_dec_ref_pic_marking_buffer(void)
  997. {
  998.   img->dec_ref_pic_marking_buffer=NULL;
  999. }
  1000. /*!
  1001.  ************************************************************************
  1002.  * brief
  1003.  *    Initializes the parameters for a new frame
  1004.  ************************************************************************
  1005.  */
  1006. static void init_frame (ImageParameters *img)
  1007. {
  1008.   int i, j;
  1009.   int prevP_no, nextP_no;
  1010.   last_P_no = last_P_no_frm;
  1011.   img->current_mb_nr = 0;
  1012.   img->current_slice_nr = 0;
  1013.   stats->bit_slice = 0;
  1014.   img->mb_y = img->mb_x = 0;
  1015.   img->block_y = img->pix_y = img->pix_c_y = 0;
  1016.   img->block_x = img->pix_x = img->block_c_x = img->pix_c_x = 0;
  1017.   // The 'slice_nr' of each macroblock is set to -1 here, to guarantee the correct encoding
  1018.   // with FMO (if no FMO, encoding is correct without following assignment),
  1019.   // for which MBs may not be encoded with scan order
  1020.   if( IS_INDEPENDENT(params) )
  1021.   {
  1022.     for( j=0; j<MAX_PLANE; j++ ){
  1023.       for(i=0;i< ((int) (img->FrameSizeInMbs));i++)
  1024.         img->mb_data_JV[j][i].slice_nr=-1;
  1025.     }
  1026.   }
  1027.   else
  1028.   {
  1029.     for(i = 0; i < ((int) (img->FrameSizeInMbs)); i++)
  1030.       img->mb_data[i].slice_nr = -1;
  1031.   }
  1032.   if (img->b_frame_to_code == 0)
  1033.   {
  1034.     img->tr = start_tr_in_this_IGOP + IMG_NUMBER * (params->jumpd + 1);
  1035. #ifdef _ADAPT_LAST_GROUP_
  1036.     if (params->last_frame && img->frm_number + 1 == params->no_frames)
  1037.       img->tr = params->last_frame;
  1038. #endif
  1039.     if (IMG_NUMBER != 0 && params->successive_Bframe != 0)     // B pictures to encode
  1040.       nextP_tr_frm = img->tr;
  1041.  
  1042.     //Rate control
  1043.     if(!params->RCEnable)                  // without using rate control
  1044.     {
  1045.       if (img->type == I_SLICE)
  1046.       {
  1047. #ifdef _CHANGE_QP_
  1048.         //QP oscillation for secondary SP frames
  1049.         if ((params->qp2start > 0 && img->tr >= params->qp2start && params->sp2_frame_indicator==0)||
  1050.           ( (params->qp2start > 0) && ( ( (img->tr ) % (2*params->qp2start) ) >=params->qp2start ) && (params->sp2_frame_indicator==1)))
  1051.           img->qp = params->qp02;
  1052.         else
  1053. #endif
  1054.           img->qp = params->qp0;   // set quant. parameter for I-frame
  1055.       }
  1056.       else
  1057.       {
  1058. #ifdef _CHANGE_QP_
  1059.         //QP oscillation for secondary SP frames
  1060.         if ((params->qp2start > 0 && img->tr >= params->qp2start && params->sp2_frame_indicator==0)||
  1061.           ( (params->qp2start > 0) && ( ( (img->tr ) % (2*params->qp2start) ) >=params->qp2start ) && (params->sp2_frame_indicator==1)))
  1062.           img->qp = params->qpN2 + (img->nal_reference_idc ? 0 : params->DispPQPOffset);
  1063.         else
  1064. #endif
  1065.           img->qp = params->qpN + (img->nal_reference_idc ? 0 : params->DispPQPOffset);
  1066.         if (img->type == SP_SLICE)
  1067.         {
  1068.           if ( (params->qp2start > 0) && ( ( (img->tr ) % (2*params->qp2start) ) >=params->qp2start ))
  1069.           {
  1070.             img->qp   = params->qpN2 - (params->qpN - params->qpsp);
  1071.             img->qpsp = params->qpN2 - (params->qpN - params->qpsp_pred);
  1072.           }
  1073.           else
  1074.           {
  1075.             img->qp = params->qpsp;
  1076.             img->qpsp = params->qpsp_pred;
  1077.           }
  1078.         }
  1079.       }
  1080.     }
  1081.     img->mb_y_intra = img->mb_y_upd;  //  img->mb_y_intra indicates which GOB to intra code for this frame
  1082.     if (params->intra_upd > 0) // if error robustness, find next GOB to update
  1083.     {
  1084.       img->mb_y_upd = (img->frm_number / params->intra_upd) % (img->height / MB_BLOCK_SIZE);
  1085.     }
  1086.   }
  1087.   else
  1088.   {
  1089.     img->p_interval = params->jumpd + 1;
  1090.     prevP_no = start_tr_in_this_IGOP + (IMG_NUMBER - 1) * img->p_interval;
  1091.     nextP_no = start_tr_in_this_IGOP + (IMG_NUMBER) * img->p_interval;
  1092. #ifdef _ADAPT_LAST_GROUP_
  1093.     last_P_no[0] = prevP_no;
  1094.     for (i = 1; i < img->buf_cycle; i++)
  1095.       last_P_no[i] = last_P_no[i - 1] - img->p_interval;
  1096.     if (params->last_frame && img->frm_number + 1 == params->no_frames)
  1097.     {
  1098.       nextP_no = params->last_frame;
  1099.       img->p_interval = nextP_no - prevP_no;
  1100.     }
  1101. #endif
  1102.     img->b_interval =
  1103.       ((double) (params->jumpd + 1) / (params->successive_Bframe + 1.0) );
  1104.     if (params->HierarchicalCoding == 3)
  1105.       img->b_interval = 1.0;
  1106.     if (params->HierarchicalCoding)
  1107.       img->tr = prevP_no + (int) (img->b_interval  * (double) (1 + gop_structure[img->b_frame_to_code - 1].display_no));      // from prev_P
  1108.     else
  1109.       img->tr = prevP_no + (int) (img->b_interval * (double) img->b_frame_to_code);      // from prev_P
  1110.     if (img->tr >= nextP_no)
  1111.       img->tr = nextP_no - 1;
  1112.     //Rate control
  1113.     if(!params->RCEnable && params->HierarchicalCoding == 0)                  // without using rate control
  1114.     {
  1115. #ifdef _CHANGE_QP_
  1116.       //QP oscillation for secondary SP frames
  1117.       if ((params->qp2start > 0 && img->tr >= params->qp2start && params->sp2_frame_indicator==0)||
  1118.         ( (params->qp2start > 0) && ( ( (img->tr ) % (2*params->qp2start) ) >=params->qp2start ) && (params->sp2_frame_indicator==1)))
  1119.       {
  1120.         img->qp = params->qpB2;
  1121.       }
  1122.       else
  1123. #endif
  1124.       {
  1125.         img->qp = params->qpB;
  1126.       }
  1127.       if (img->nal_reference_idc)
  1128.       {
  1129. #ifdef _CHANGE_QP_
  1130.         //QP oscillation for secondary SP frames
  1131.         if ((params->qp2start > 0 && img->tr >= params->qp2start && params->sp2_frame_indicator==0)||
  1132.           ( (params->qp2start > 0) && ( ( (img->tr ) % (2*params->qp2start) ) >=params->qp2start ) && (params->sp2_frame_indicator==1)))
  1133.         {
  1134.           img->qp = iClip3(-img->bitdepth_luma_qp_scale,51,params->qpB2 + params->qpBRS2Offset);
  1135.         }
  1136.         else
  1137. #endif
  1138.         {
  1139.           img->qp = iClip3(-img->bitdepth_luma_qp_scale,51,params->qpB + params->qpBRSOffset);
  1140.         }
  1141.       }
  1142.     }
  1143.     else if (!params->RCEnable && params->HierarchicalCoding !=0)
  1144.     {
  1145.       // Note that _CHANGE_QP_ does not anymore work for gop_structure. Needs to be fixed
  1146.       img->qp =  gop_structure[img->b_frame_to_code - 1].slice_qp;
  1147.     }
  1148.   }
  1149.   UpdateSubseqInfo (img->layer);        // Tian Dong (Sept 2002)
  1150.   UpdateSceneInformation (FALSE, 0, 0, -1); // JVT-D099, scene information SEI, nothing included by default
  1151.   //! Commented out by StW, needs fixing in SEI.h to keep the trace file clean
  1152.   //  PrepareAggregationSEIMessage ();
  1153.   // write tone mapping SEI message
  1154.   if (params->ToneMappingSEIPresentFlag)
  1155.   {
  1156.     UpdateToneMapping();
  1157.   }
  1158.   PrepareAggregationSEIMessage ();
  1159.   Write_SEI_NALU(0);
  1160.   img->no_output_of_prior_pics_flag = 0;
  1161.   img->long_term_reference_flag = 0;
  1162.   init_dec_ref_pic_marking_buffer();
  1163. }
  1164. /*!
  1165.  ************************************************************************
  1166.  * brief
  1167.  *    Initializes the parameters for a new field
  1168.  ************************************************************************
  1169.  */
  1170. static void init_field (ImageParameters *img)
  1171. {
  1172.   int i;
  1173.   int prevP_no, nextP_no;
  1174.   last_P_no = last_P_no_fld;
  1175.   img->current_mb_nr = 0;
  1176.   img->current_slice_nr = 0;
  1177.   stats->bit_slice = 0;
  1178.   params->jumpd *= 2;
  1179.   params->successive_Bframe *= 2;
  1180.   img->number /= 2;
  1181.   img->buf_cycle /= 2;
  1182.   img->mb_y = img->mb_x = 0;
  1183.   img->block_y = img->pix_y = img->pix_c_y = 0; // define vertical positions
  1184.   img->block_x = img->pix_x = img->block_c_x = img->pix_c_x = 0;        // define horizontal positions
  1185.   if (!img->b_frame_to_code)
  1186.   {
  1187.     img->tr = img->number * (params->jumpd + 2) + img->fld_type;
  1188. #ifdef _ADAPT_LAST_GROUP_
  1189.     if (params->last_frame && img->number + 1 == params->no_frames)
  1190.       img->tr = params->last_frame;
  1191. #endif
  1192.     if (img->number != 0 && params->successive_Bframe != 0)    // B pictures to encode
  1193.       nextP_tr_fld = img->tr;
  1194.       //Rate control
  1195.     if(!params->RCEnable)                  // without using rate control
  1196.     {
  1197.       if (img->type == I_SLICE)
  1198.       {
  1199. #ifdef _CHANGE_QP_
  1200.         //QP oscillation for secondary SP frames
  1201.         if ((params->qp2start > 0 && img->tr >= params->qp2start && params->sp2_frame_indicator==0)||
  1202.           ( (params->qp2start > 0) && ( ( (img->tr ) % (2*params->qp2start) ) >=params->qp2start ) && (params->sp2_frame_indicator==1)))
  1203.           img->qp = params->qp02;
  1204.         else
  1205. #endif
  1206.           img->qp = params->qp0;   // set quant. parameter for I-frame
  1207.       }
  1208.       else
  1209.       {
  1210. #ifdef _CHANGE_QP_
  1211.         //QP oscillation for secondary SP frames
  1212.         if ((params->qp2start > 0 && img->tr >= params->qp2start && params->sp2_frame_indicator==0)||
  1213.           ( (params->qp2start > 0) && ( ( (img->tr ) % (2*params->qp2start) ) >=params->qp2start ) && (params->sp2_frame_indicator==1)))
  1214.           img->qp = params->qpN2 + (img->nal_reference_idc ? 0 : params->DispPQPOffset);
  1215.         else
  1216. #endif
  1217.           img->qp = params->qpN + (img->nal_reference_idc ? 0 : params->DispPQPOffset);
  1218.         if (img->type == SP_SLICE)
  1219.         {
  1220.           if ( (params->qp2start > 0) && ( ( (img->tr ) % (2*params->qp2start) ) >=params->qp2start ))
  1221.           {
  1222.             img->qp = params->qpN2-(params->qpN-params->qpsp);
  1223.             img->qpsp = params->qpN2-(params->qpN-params->qpsp_pred);
  1224.           }
  1225.           else
  1226.           {
  1227.             img->qp = params->qpsp;
  1228.             img->qpsp = params->qpsp_pred;
  1229.           }
  1230.         }
  1231.       }
  1232.     }
  1233.     img->mb_y_intra = img->mb_y_upd;  //  img->mb_y_intra indicates which GOB to intra code for this frame
  1234.     if (params->intra_upd > 0) // if error robustness, find next GOB to update
  1235.     {
  1236.       img->mb_y_upd =
  1237.         (img->number / params->intra_upd) % (img->width / MB_BLOCK_SIZE);
  1238.     }
  1239.   }
  1240.   else
  1241.   {
  1242.     img->p_interval = params->jumpd + 2;
  1243.     prevP_no = (img->number - 1) * img->p_interval + img->fld_type;
  1244.     nextP_no = img->number * img->p_interval + img->fld_type;
  1245. #ifdef _ADAPT_LAST_GROUP_
  1246.     if (!img->fld_type)       // top field
  1247.     {
  1248.       last_P_no[0] = prevP_no + 1;
  1249.       last_P_no[1] = prevP_no;
  1250.       for (i = 1; i <= img->buf_cycle; i++)
  1251.       {
  1252.         last_P_no[2 * i] = last_P_no[2 * i - 2] - img->p_interval;
  1253.         last_P_no[2 * i + 1] = last_P_no[2 * i - 1] - img->p_interval;
  1254.       }
  1255.     }
  1256.     else                      // bottom field
  1257.     {
  1258.       last_P_no[0] = nextP_no - 1;
  1259.       last_P_no[1] = prevP_no;
  1260.       for (i = 1; i <= img->buf_cycle; i++)
  1261.       {
  1262.         last_P_no[2 * i] = last_P_no[2 * i - 2] - img->p_interval;
  1263.         last_P_no[2 * i + 1] = last_P_no[2 * i - 1] - img->p_interval;
  1264.       }
  1265.     }
  1266.     if (params->last_frame && img->number + 1 == params->no_frames)
  1267.     {
  1268.       nextP_no = params->last_frame;
  1269.       img->p_interval = nextP_no - prevP_no;
  1270.     }
  1271. #endif
  1272.     img->b_interval =
  1273.       ((double) (params->jumpd + 1) / (params->successive_Bframe + 1.0) );
  1274.     if (params->HierarchicalCoding == 3)
  1275.       img->b_interval = 1.0;
  1276.     if (params->HierarchicalCoding)
  1277.       img->tr = prevP_no + (int) ((img->b_interval + 1.0) * (double) (1 + gop_structure[img->b_frame_to_code - 1].display_no));      // from prev_P
  1278.     else
  1279.       img->tr = prevP_no + (int) ((img->b_interval + 1.0) * (double) img->b_frame_to_code);      // from prev_P
  1280.     if (img->tr >= nextP_no)
  1281.       img->tr = nextP_no - 1; // ?????
  1282.     //Rate control
  1283.     if(!params->RCEnable && params->HierarchicalCoding == 0)                  // without using rate control
  1284.     {
  1285. #ifdef _CHANGE_QP_
  1286.       //QP oscillation for secondary SP frames
  1287.       if ((params->qp2start > 0 && img->tr >= params->qp2start && params->sp2_frame_indicator==0)||
  1288.         ( (params->qp2start > 0) && ( ( (img->tr ) % (2*params->qp2start) ) >=params->qp2start ) && (params->sp2_frame_indicator==1)))
  1289.       {
  1290.         img->qp = params->qpB2;
  1291.       }
  1292.       else
  1293. #endif
  1294.         img->qp = params->qpB;
  1295.       if (img->nal_reference_idc)
  1296.       {
  1297. #ifdef _CHANGE_QP_
  1298.         //QP oscillation for secondary SP frames
  1299.         if ((params->qp2start > 0 && img->tr >= params->qp2start && params->sp2_frame_indicator==0)||
  1300.           ( (params->qp2start > 0) && ( ( (img->tr ) % (2*params->qp2start) ) >=params->qp2start ) && (params->sp2_frame_indicator==1)))
  1301.         {
  1302.           img->qp = iClip3(-img->bitdepth_luma_qp_scale,51,params->qpB2 + params->qpBRS2Offset);
  1303.         }
  1304.         else
  1305. #endif
  1306.           img->qp = iClip3(-img->bitdepth_luma_qp_scale,51,params->qpB + params->qpBRSOffset);
  1307.       }
  1308.     }
  1309.     else if (!params->RCEnable && params->HierarchicalCoding != 0)
  1310.     {
  1311.       img->qp =  gop_structure[img->b_frame_to_code - 1].slice_qp;
  1312.     }
  1313.   }
  1314.   params->jumpd /= 2;
  1315.   params->successive_Bframe /= 2;
  1316.   img->buf_cycle *= 2;
  1317.   img->number = 2 * img->number + img->fld_type;
  1318. }
  1319. /*!
  1320.  ************************************************************************
  1321.  * brief
  1322.  *    Upsample 4 times, store them in out4x.  Color is simply copied
  1323.  *
  1324.  * par Input:
  1325.  *    srcy, srcu, srcv, out4y, out4u, out4v
  1326.  *
  1327.  * par Side Effects_
  1328.  *    Uses (writes) img4Y_tmp.  This should be moved to a static variable
  1329.  *    in this module
  1330.  ************************************************************************/
  1331. void UnifiedOneForthPix (StorablePicture *s)
  1332. {
  1333.   int ypadded_size = s->size_y_padded;
  1334.   int xpadded_size = s->size_x_padded;
  1335.   // don't upsample twice
  1336.   if (s->imgY_sub)
  1337.     return;
  1338.   // Y component
  1339.   get_mem4Dpel (&(s->imgY_sub), 4, 4, ypadded_size, xpadded_size);
  1340.   if (NULL == s->imgY_sub)
  1341.     no_mem_exit("alloc_storable_picture: s->imgY_sub");
  1342.   s->p_img_sub[0] = s->imgY_sub;
  1343.   s->p_curr_img_sub = s->p_img_sub[0];
  1344.   if ( params->ChromaMCBuffer || img->P444_joined)
  1345.   {
  1346.     // UV components
  1347.     if ( img->yuv_format != YUV400 )
  1348.     {
  1349.       if ( img->yuv_format == YUV420 )
  1350.       {
  1351.         get_mem5Dpel (&(s->imgUV_sub), 2, 8, 8, ypadded_size>>1, xpadded_size>>1);
  1352.       }
  1353.       else if ( img->yuv_format == YUV422 )
  1354.       {
  1355.         get_mem5Dpel (&(s->imgUV_sub), 2, 4, 8, ypadded_size, xpadded_size>>1);
  1356.       }
  1357.       else
  1358.       { // YUV444
  1359.         get_mem5Dpel (&(s->imgUV_sub), 2, 4, 4, ypadded_size, xpadded_size);
  1360.       }
  1361.       s->p_img_sub[1] = s->imgUV_sub[0];
  1362.       s->p_img_sub[2] = s->imgUV_sub[1];
  1363.     }
  1364.     else
  1365.     {
  1366.       s->p_img_sub[1] = NULL;
  1367.       s->p_img_sub[2] = NULL;
  1368.     }
  1369.   }
  1370.   else
  1371.   {
  1372.     s->p_img_sub[1] = NULL;
  1373.     s->p_img_sub[2] = NULL;
  1374.   }
  1375.   s->p_curr_img = s->imgY;
  1376.   s->p_curr_img_sub = s->imgY_sub;
  1377.   // derive the subpixel images for first component
  1378.   getSubImagesLuma ( s );
  1379.   // and the sub-images for U and V
  1380.   if ( (img->yuv_format != YUV400) && (params->ChromaMCBuffer) )
  1381.   {
  1382.     if (img->P444_joined)
  1383.     {
  1384.       //U
  1385.       select_plane(PLANE_U);
  1386.       getSubImagesLuma (s);
  1387.       //V
  1388.       select_plane(PLANE_V);
  1389.       getSubImagesLuma (s);
  1390.       //Y
  1391.       select_plane(PLANE_Y);
  1392.     }
  1393.     else
  1394.       getSubImagesChroma( s );
  1395.   }
  1396. }
  1397. /*!
  1398.  ************************************************************************
  1399.  * brief
  1400.  *    Upsample 4 times, store them in out4x.  Color is simply copied
  1401.  *    for 4:4:4 Independent mode
  1402.  *
  1403.  * par Input:
  1404.  *    nplane
  1405.  *
  1406.  ************************************************************************/
  1407. void UnifiedOneForthPix_JV (int nplane, StorablePicture *s)
  1408. {
  1409.   int ypadded_size = s->size_y_padded;
  1410.   int xpadded_size = s->size_x_padded;
  1411.   if( nplane == 0 )
  1412.   {
  1413.     // don't upsample twice
  1414.     if (s->imgY_sub)
  1415.       return;
  1416.     // Y component
  1417.     get_mem4Dpel (&(s->imgY_sub), 4, 4, ypadded_size, xpadded_size);
  1418.     if (NULL == s->imgY_sub)
  1419.       no_mem_exit("UnifiedOneForthPix_JV: s->imgY_sub");
  1420.     // don't upsample twice
  1421.     if (s->imgUV_sub)
  1422.       return;
  1423.     // Y component
  1424.     get_mem5Dpel (&(s->imgUV_sub), 2, 4, 4, ypadded_size, xpadded_size);
  1425.     if (NULL == s->imgUV_sub)
  1426.       no_mem_exit("UnifiedOneForthPix_JV: s->imgUV_sub");
  1427.     s->p_img[0] = s->imgY;
  1428.     s->p_img[1] = s->imgUV[0];
  1429.     s->p_img[2] = s->imgUV[1];
  1430.     s->p_img_sub[0] = s->imgY_sub;
  1431.     s->p_img_sub[1] = s->imgUV_sub[0];
  1432.     s->p_img_sub[2] = s->imgUV_sub[1];
  1433.   }
  1434.   // derive the subpixel images for first component
  1435.   s->colour_plane_id = nplane;
  1436.   s->p_curr_img = s->p_img[nplane];
  1437.   s->p_curr_img_sub = s->p_img_sub[nplane];
  1438.   getSubImagesLuma ( s );
  1439. }
  1440.   /*!
  1441.  ************************************************************************
  1442.  * brief
  1443.  *    Just a placebo
  1444.  ************************************************************************
  1445.  */
  1446. Boolean dummy_slice_too_big (int bits_slice)
  1447. {
  1448.   return FALSE;
  1449. }
  1450. static inline void copy_motion_vectors_MB (ImageParameters *img, RD_DATA *rdopt)
  1451. {
  1452.   memcpy(&img->all_mv [LIST_0][0][0][0][0][0], &rdopt->all_mv [LIST_0][0][0][0][0][0], 2 * img->max_num_references * 9 * 4 * 4 * 2 * sizeof(short));  
  1453.   memcpy(&img->pred_mv[LIST_0][0][0][0][0][0], &rdopt->pred_mv[LIST_0][0][0][0][0][0], 2 * img->max_num_references * 9 * 4 * 4 * 2 * sizeof(short));
  1454. }
  1455. /*!
  1456. ***************************************************************************
  1457. // For MB level field/frame coding
  1458. ***************************************************************************
  1459. */
  1460. void copy_rdopt_data (Macroblock *currMB, int bot_block)
  1461. {
  1462.   int i, j;
  1463.   int bframe = (img->type == B_SLICE);
  1464.   int mode;
  1465.   short b8mode, b8pdir;
  1466.   int block_y;
  1467.   int list_offset = currMB->list_offset;
  1468.   mode                = rdopt->mode;
  1469.   currMB->mb_type     = rdopt->mb_type;    // copy mb_type
  1470.   currMB->cbp         = rdopt->cbp;        // copy cbp
  1471.   currMB->cbp_blk     = rdopt->cbp_blk;    // copy cbp_blk
  1472.   img->i16offset      = rdopt->i16offset;
  1473.   currMB->prev_qp  = rdopt->prev_qp;
  1474.   currMB->prev_dqp = rdopt->prev_dqp;
  1475.   currMB->prev_cbp = rdopt->prev_cbp;
  1476.   currMB->delta_qp = rdopt->delta_qp;
  1477.   currMB->qp       = rdopt->qp;
  1478.   update_qp (img, currMB);
  1479.   currMB->c_ipred_mode = rdopt->c_ipred_mode;
  1480.   memcpy(img->cofAC[0][0][0],rdopt->cofAC[0][0][0], (4 + img->num_blk8x8_uv) * 4 * 2 * 65 * sizeof(int));
  1481.   memcpy(img->cofDC[0][0],rdopt->cofDC[0][0], 3 * 2 * 18 * sizeof(int));
  1482.   for (j = 0; j < BLOCK_MULTIPLE; j++)
  1483.   {
  1484.     block_y = img->block_y + j;
  1485.     memcpy(&enc_picture->motion.ref_idx[LIST_0][block_y][img->block_x], rdopt->refar[LIST_0][j], BLOCK_MULTIPLE * sizeof(char));
  1486.     for (i = 0; i < BLOCK_MULTIPLE; i++)
  1487.       enc_picture->motion.ref_pic_id [LIST_0][block_y][img->block_x + i] =
  1488.       enc_picture->ref_pic_num[LIST_0 + list_offset][(short)enc_picture->motion.ref_idx[LIST_0][block_y][img->block_x+i]];
  1489.   }
  1490.   if (bframe)
  1491.   {
  1492.     for (j = 0; j < BLOCK_MULTIPLE; j++)
  1493.     {
  1494.       block_y = img->block_y + j;
  1495.       memcpy(&enc_picture->motion.ref_idx[LIST_1][block_y][img->block_x], rdopt->refar[LIST_1][j], BLOCK_MULTIPLE * sizeof(char));
  1496.       for (i = 0; i < BLOCK_MULTIPLE; i++)
  1497.         enc_picture->motion.ref_pic_id [LIST_1][block_y][img->block_x + i] =
  1498.         enc_picture->ref_pic_num[LIST_1 + list_offset][(short)enc_picture->motion.ref_idx[LIST_1][block_y][img->block_x + i]];
  1499.     }
  1500.   }
  1501.   //===== reconstruction values =====
  1502.   for (j = 0; j < MB_BLOCK_SIZE; j++)
  1503.     memcpy(&enc_picture->imgY[img->pix_y + j][img->pix_x],rdopt->rec_mbY[j], MB_BLOCK_SIZE * sizeof(imgpel));
  1504.   if (img->yuv_format != YUV400)
  1505.   {
  1506.     for (j = 0; j < img->mb_cr_size_y; j++)
  1507.     {
  1508.       memcpy(&enc_picture->imgUV[0][img->pix_c_y + j][img->pix_c_x], rdopt->rec_mb_cr[0][j], img->mb_cr_size_x * sizeof(imgpel));
  1509.       memcpy(&enc_picture->imgUV[1][img->pix_c_y + j][img->pix_c_x], rdopt->rec_mb_cr[1][j], img->mb_cr_size_x * sizeof(imgpel));
  1510.     }
  1511.   }
  1512.   memcpy(currMB->b8mode, rdopt->b8mode, 4 * sizeof(short));
  1513.   memcpy(currMB->b8pdir, rdopt->b8pdir, 4 * sizeof(short));
  1514.   currMB->luma_transform_size_8x8_flag = rdopt->luma_transform_size_8x8_flag;
  1515.   //==== intra prediction modes ====
  1516.   if (mode == P8x8)
  1517.   {
  1518.     memcpy(currMB->intra_pred_modes,rdopt->intra_pred_modes, MB_BLOCK_PARTITIONS * sizeof(char));
  1519.     for (j = img->block_y; j < img->block_y + BLOCK_MULTIPLE; j++)
  1520.       memcpy(&img->ipredmode[j][img->block_x],&rdopt->ipredmode[j][img->block_x], BLOCK_MULTIPLE * sizeof(char));
  1521.   }
  1522.   else if (mode != I4MB && mode != I8MB)
  1523.   {
  1524.     memset(currMB->intra_pred_modes,DC_PRED, MB_BLOCK_PARTITIONS * sizeof(char));
  1525.     for (j = img->block_y; j < img->block_y + BLOCK_MULTIPLE; j++)
  1526.       memset(&img->ipredmode[j][img->block_x],DC_PRED, BLOCK_MULTIPLE * sizeof(char));
  1527.   }
  1528.   else if (mode == I4MB || mode == I8MB)
  1529.   {
  1530.     memcpy(currMB->intra_pred_modes,rdopt->intra_pred_modes, MB_BLOCK_PARTITIONS * sizeof(char));
  1531.     memcpy(currMB->intra_pred_modes8x8,rdopt->intra_pred_modes8x8, MB_BLOCK_PARTITIONS * sizeof(char));
  1532.     for (j = img->block_y; j < img->block_y + BLOCK_MULTIPLE; j++) 
  1533.     {
  1534.       memcpy(&img->ipredmode[j][img->block_x],&rdopt->ipredmode[j][img->block_x], BLOCK_MULTIPLE * sizeof(char));
  1535.     }
  1536.   }
  1537.   if (img->MbaffFrameFlag || (params->UseRDOQuant && params->RDOQ_QP_Num > 1))
  1538.   {
  1539.     // motion vectors
  1540.     copy_motion_vectors_MB (img, rdopt);
  1541.     if (!IS_INTRA(currMB))
  1542.     {
  1543.       memset(currMB->bipred_me, 0, 4* sizeof(short));
  1544.       for (j = 0; j < 4; j++)
  1545.         for (i = 0; i < 4; i++)
  1546.         {
  1547.           b8mode = currMB->b8mode[i/2+2*(j/2)];
  1548.           b8pdir = currMB->b8pdir[i/2+2*(j/2)];
  1549.           if (b8pdir!=1)
  1550.           {
  1551.             enc_picture->motion.mv[LIST_0][j+img->block_y][i+img->block_x][0] = rdopt->all_mv[LIST_0][(short)rdopt->refar[LIST_0][j][i]][b8mode][j][i][0];
  1552.             enc_picture->motion.mv[LIST_0][j+img->block_y][i+img->block_x][1] = rdopt->all_mv[LIST_0][(short)rdopt->refar[LIST_0][j][i]][b8mode][j][i][1];
  1553.           }
  1554.           else
  1555.           {
  1556.             enc_picture->motion.mv[LIST_0][j+img->block_y][i+img->block_x][0] = 0;
  1557.             enc_picture->motion.mv[LIST_0][j+img->block_y][i+img->block_x][1] = 0;
  1558.           }
  1559.           if (bframe)
  1560.           {
  1561.             if (b8pdir!=0)
  1562.             {
  1563.               enc_picture->motion.mv[LIST_1][j+img->block_y][i+img->block_x][0] = rdopt->all_mv[LIST_1][(short)rdopt->refar[LIST_1][j][i]][b8mode][j][i][0];
  1564.               enc_picture->motion.mv[LIST_1][j+img->block_y][i+img->block_x][1] = rdopt->all_mv[LIST_1][(short)rdopt->refar[LIST_1][j][i]][b8mode][j][i][1];
  1565.             }
  1566.             else
  1567.             {
  1568.               enc_picture->motion.mv[LIST_1][j+img->block_y][i+img->block_x][0] = 0;
  1569.               enc_picture->motion.mv[LIST_1][j+img->block_y][i+img->block_x][1] = 0;
  1570.             }
  1571.           }
  1572.         }
  1573.     }
  1574.     else
  1575.     {
  1576.       for (j = 0; j < 4; j++)
  1577.         memset(enc_picture->motion.mv[LIST_0][j+img->block_y][img->block_x], 0, 2 * BLOCK_MULTIPLE * sizeof(short));
  1578.       if (bframe)
  1579.       {
  1580.         for (j = 0; j < 4; j++)
  1581.           memset(enc_picture->motion.mv[LIST_1][j+img->block_y][img->block_x], 0, 2 * BLOCK_MULTIPLE * sizeof(short));
  1582.       }
  1583.     }
  1584.   }
  1585. } // end of copy_rdopt_data
  1586. static void ReportNALNonVLCBits(time_t tmp_time, time_t me_time)
  1587. {
  1588.   //! Need to add type (i.e. SPS, PPS, SEI etc).
  1589.   if (params->Verbose != 0)
  1590.   printf ("%04d(NVB)%8d n", frame_no, stats->bit_ctr_parametersets_n);
  1591. }
  1592. static void ReportFirstframe(time_t tmp_time, time_t me_time)
  1593. {
  1594.   if (params->Verbose == 1)
  1595.   {
  1596.     printf ("%04d(IDR)%8d   %2d %7.3f %7.3f %7.3f %9d %7d    %3s    %dn",
  1597.       frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n),
  1598.       img->AverageFrameQP, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], (int)tmp_time, (int)me_time,
  1599.       img->fld_flag ? "FLD" : "FRM", img->nal_reference_idc);
  1600.   }
  1601.   else if (params->Verbose == 2)
  1602.   {
  1603.     int lambda = (int) img->lambda_me[I_SLICE][img->AverageFrameQP][0];
  1604.     if (params->Distortion[SSIM] == 1)
  1605.       printf ("%04d(IDR)%8d %1d %2d %2d %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f %9d %7d    %3s %5d   %2d %2d  %d   %dn",
  1606.       frame_no,(int) (stats->bit_ctr - stats->bit_ctr_n),0,
  1607.       img->AverageFrameQP, lambda, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], dist->metric[SSIM].value[0], dist->metric[SSIM].value[1], dist->metric[SSIM].value[2], (int)tmp_time, (int)me_time,
  1608.       img->fld_flag ? "FLD" : "FRM", intras, img->num_ref_idx_l0_active, img->num_ref_idx_l1_active,img->rd_pass, img->nal_reference_idc);
  1609.     else
  1610.       printf ("%04d(IDR)%8d %1d %2d %2d %7.3f %7.3f %7.3f %9d %7d    %3s %5d   %2d %2d  %d   %dn",
  1611.       frame_no,(int) (stats->bit_ctr - stats->bit_ctr_n),0,
  1612.       img->AverageFrameQP, lambda, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], (int)tmp_time, (int)me_time,
  1613.       img->fld_flag ? "FLD" : "FRM", intras, img->num_ref_idx_l0_active, img->num_ref_idx_l1_active,img->rd_pass, img->nal_reference_idc);
  1614.   }
  1615.   stats->bit_counter[I_SLICE] = stats->bit_ctr;
  1616.   stats->bit_ctr = 0;
  1617. }
  1618. static void ReportIntra(time_t tmp_time, time_t me_time)
  1619. {
  1620.   if (params->Verbose == 1)
  1621.   {
  1622.     if (img->currentPicture->idr_flag == TRUE)
  1623.       printf ("%04d(IDR)%8d   %2d %7.3f %7.3f %7.3f %9d %7d    %3s    %dn",
  1624.       frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n),
  1625.       img->AverageFrameQP, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], (int)tmp_time, (int)me_time,
  1626.       img->fld_flag ? "FLD" : "FRM", img->nal_reference_idc);
  1627.     else
  1628.       printf ("%04d(I)  %8d   %2d %7.3f %7.3f %7.3f %9d %7d    %3s    %dn",
  1629.       frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n),
  1630.       img->AverageFrameQP, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], (int)tmp_time, (int)me_time,
  1631.       img->fld_flag ? "FLD" : "FRM", img->nal_reference_idc);
  1632.   }
  1633.   else if (params->Verbose == 2)
  1634.   {
  1635.     int lambda = (int) img->lambda_me[I_SLICE][img->AverageFrameQP][0];
  1636.     if (params->Distortion[SSIM] == 1)
  1637.     {
  1638.       if (img->currentPicture->idr_flag == TRUE)
  1639.         printf ("%04d(IDR)%8d %1d %2d %2d %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f %9d %7d    %3s %5d   %2d %2d  %d   %dn",
  1640.         frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n), 0,
  1641.         img->AverageFrameQP, lambda, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], dist->metric[SSIM].value[0], dist->metric[SSIM].value[1], dist->metric[SSIM].value[2], (int)tmp_time, (int)me_time,
  1642.         img->fld_flag ? "FLD" : "FRM", intras, 
  1643.         img->num_ref_idx_l0_active, img->num_ref_idx_l1_active,img->rd_pass, img->nal_reference_idc);
  1644.       else
  1645.         printf ("%04d(I)  %8d %1d %2d %2d %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f %9d %7d    %3s %5d   %2d %2d  %d   %dn",
  1646.         frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n), 0,
  1647.         img->AverageFrameQP, lambda, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], dist->metric[SSIM].value[0], dist->metric[SSIM].value[1], dist->metric[SSIM].value[2], (int)tmp_time, (int)me_time,
  1648.         img->fld_flag ? "FLD" : "FRM", intras, img->num_ref_idx_l0_active, img->num_ref_idx_l1_active,img->rd_pass, img->nal_reference_idc);
  1649.     }
  1650.     else
  1651.     {
  1652.       if (img->currentPicture->idr_flag == TRUE)
  1653.         printf ("%04d(IDR)%8d %1d %2d %2d %7.3f %7.3f %7.3f %9d %7d    %3s %5d   %2d %2d  %d   %dn",
  1654.         frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n), 0,
  1655.         img->AverageFrameQP, lambda, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], (int)tmp_time, (int)me_time,
  1656.         img->fld_flag ? "FLD" : "FRM", intras, 
  1657.         img->num_ref_idx_l0_active, img->num_ref_idx_l1_active,img->rd_pass, img->nal_reference_idc);
  1658.       else
  1659.         printf ("%04d(I)  %8d %1d %2d %2d %7.3f %7.3f %7.3f %9d %7d    %3s %5d   %2d %2d  %d   %dn",
  1660.         frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n), 0,
  1661.         img->AverageFrameQP, lambda, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], (int)tmp_time, (int)me_time,
  1662.         img->fld_flag ? "FLD" : "FRM", intras, img->num_ref_idx_l0_active, img->num_ref_idx_l1_active,img->rd_pass, img->nal_reference_idc);
  1663.     }
  1664.   }
  1665. }
  1666. static void ReportSP(time_t tmp_time, time_t me_time)
  1667. {
  1668.   if (params->Verbose == 1)
  1669.   {
  1670.     printf ("%04d(SP) %8d   %2d %7.3f %7.3f %7.3f %9d %7d    %3s    %dn",
  1671.       frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n),
  1672.       img->AverageFrameQP, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], (int)tmp_time, (int)me_time,
  1673.       img->fld_flag ? "FLD" : "FRM", img->nal_reference_idc);
  1674.   }
  1675.   else if (params->Verbose == 2)
  1676.   {
  1677.     int lambda = (int) img->lambda_me[SP_SLICE][img->AverageFrameQP][0];    
  1678.     if (params->Distortion[SSIM] == 1)
  1679.       printf ("%04d(SP) %8d %1d %2d %2d %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f %9d %7d    %3s %5d   %2d %2d  %d   %dn",
  1680.       frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n), active_pps->weighted_pred_flag,
  1681.       img->AverageFrameQP, lambda, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], dist->metric[SSIM].value[0], dist->metric[SSIM].value[1], dist->metric[SSIM].value[2], (int)tmp_time, (int)me_time,
  1682.       img->fld_flag ? "FLD" : "FRM", intras, img->num_ref_idx_l0_active, img->num_ref_idx_l1_active,img->rd_pass, img->nal_reference_idc);
  1683.     else
  1684.       printf ("%04d(SP) %8d %1d %2d %2d %7.3f %7.3f %7.3f %9d %7d    %3s %5d   %2d %2d  %d   %dn",
  1685.       frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n), active_pps->weighted_pred_flag,
  1686.       img->AverageFrameQP, lambda, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], (int)tmp_time, (int)me_time,
  1687.       img->fld_flag ? "FLD" : "FRM", intras, img->num_ref_idx_l0_active, img->num_ref_idx_l1_active,img->rd_pass, img->nal_reference_idc);
  1688.   }
  1689. }
  1690. static void ReportB(time_t tmp_time, time_t me_time)
  1691. {
  1692.   if (params->Verbose == 1)
  1693.   {
  1694.     printf ("%04d(B)  %8d   %2d %7.3f %7.3f %7.3f %9d %7d    %3s    %dn",
  1695.       frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n),
  1696.       img->AverageFrameQP, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], (int)tmp_time, (int)me_time,
  1697.       img->fld_flag ? "FLD" : "FRM", img->nal_reference_idc);
  1698.   }
  1699.   else if (params->Verbose == 2)
  1700.   {
  1701.     int lambda = (int) img->lambda_me[img->nal_reference_idc ? 5 : B_SLICE][img->AverageFrameQP][0];    
  1702.     if (params->Distortion[SSIM] == 1)
  1703.       printf ("%04d(B)  %8d %1d %2d %2d %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f %9d %7d    %3s %5d %1d %2d %2d  %d   %dn",
  1704.       frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n), active_pps->weighted_bipred_idc,
  1705.       img->AverageFrameQP, lambda, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], dist->metric[SSIM].value[0], dist->metric[SSIM].value[1], dist->metric[SSIM].value[2], (int)tmp_time, (int)me_time,
  1706.       img->fld_flag ? "FLD" : "FRM", intras, img->direct_spatial_mv_pred_flag, img->num_ref_idx_l0_active, img->num_ref_idx_l1_active, img->rd_pass, img->nal_reference_idc);
  1707.     else
  1708.       printf ("%04d(B)  %8d %1d %2d %2d %7.3f %7.3f %7.3f %9d %7d    %3s %5d %1d %2d %2d  %d   %dn",
  1709.       frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n), active_pps->weighted_bipred_idc,
  1710.       img->AverageFrameQP, lambda, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], (int)tmp_time, (int)me_time,
  1711.       img->fld_flag ? "FLD" : "FRM", intras, img->direct_spatial_mv_pred_flag, img->num_ref_idx_l0_active, img->num_ref_idx_l1_active, img->rd_pass, img->nal_reference_idc);
  1712.   }
  1713. }
  1714. static void ReportP(time_t tmp_time, time_t me_time)
  1715. {
  1716.   if (params->Verbose == 1)
  1717.   {
  1718.     if(params->redundant_pic_flag==0)
  1719.     {
  1720.       printf ("%04d(P)  %8d   %2d %7.3f %7.3f %7.3f %9d %7d    %3s    %dn",
  1721.         frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n),
  1722.         img->AverageFrameQP, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], (int)tmp_time, (int)me_time,
  1723.         img->fld_flag ? "FLD" : "FRM", img->nal_reference_idc);
  1724.     }
  1725.     else
  1726.     {
  1727.       if(!redundant_coding)
  1728.       {
  1729.         printf ("%04d(P)  %8d   %2d %7.3f %7.3f %7.3f %9d %7d    %3s    %dn",
  1730.           frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n),
  1731.           img->AverageFrameQP, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], (int)tmp_time, (int)me_time,
  1732.           img->fld_flag ? "FLD" : "FRM", img->nal_reference_idc);
  1733.       }
  1734.       else
  1735.       { // report a redundant picture.
  1736.         printf ("    (R)  %8d   %2d %7.3f %7.3f %7.3f %9d %7d    %3s    %dn",
  1737.           (int) (stats->bit_ctr - stats->bit_ctr_n),
  1738.           img->AverageFrameQP, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], (int)tmp_time, (int)me_time,
  1739.           img->fld_flag ? "FLD" : "FRM", img->nal_reference_idc);
  1740.       }
  1741.     }
  1742.   }
  1743.   else if (params->Verbose == 2)
  1744.   {
  1745.     int lambda = (int) img->lambda_me[P_SLICE][img->AverageFrameQP][0];    
  1746.     if (params->Distortion[SSIM] == 1)
  1747.       printf ("%04d(P)  %8d %1d %2d %2d %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f %9d %7d    %3s %5d   %2d %2d  %d   %dn",
  1748.       frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n), active_pps->weighted_pred_flag,
  1749.       img->AverageFrameQP, lambda, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], dist->metric[SSIM].value[0], dist->metric[SSIM].value[1], dist->metric[SSIM].value[2], (int)tmp_time, (int)me_time,
  1750.       img->fld_flag ? "FLD" : "FRM", intras, img->num_ref_idx_l0_active, img->num_ref_idx_l1_active, img->rd_pass, img->nal_reference_idc);
  1751.     else
  1752.       printf ("%04d(P)  %8d %1d %2d %2d %7.3f %7.3f %7.3f %9d %7d    %3s %5d   %2d %2d  %d   %dn",
  1753.       frame_no, (int) (stats->bit_ctr - stats->bit_ctr_n), active_pps->weighted_pred_flag,
  1754.       img->AverageFrameQP, lambda, dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2], (int)tmp_time, (int)me_time,
  1755.       img->fld_flag ? "FLD" : "FRM", intras, img->num_ref_idx_l0_active, img->num_ref_idx_l1_active, img->rd_pass, img->nal_reference_idc);
  1756.   }
  1757. }
  1758. /*!
  1759.  ************************************************************************
  1760.  * brief
  1761.  *    Padding of automatically added border for picture sizes that are not
  1762.  *     multiples of macroblock/macroblock pair size
  1763.  *
  1764.  * param output
  1765.  *    Image dimensions
  1766.  * param img_size_x
  1767.  *    coded image horizontal size (luma)
  1768.  * param img_size_y
  1769.  *    code image vertical size (luma)
  1770.  * param img_size_x_cr
  1771.  *    coded image horizontal size (chroma)
  1772.  * param img_size_y_cr
  1773.  *    code image vertical size (chroma)
  1774.  ************************************************************************
  1775.  */
  1776. static void PaddAutoCropBorders (FrameFormat output, int img_size_x, int img_size_y, int img_size_x_cr, int img_size_y_cr)
  1777. {
  1778.   int x, y;
  1779.   // Luma or 1st component
  1780.   //padding right border
  1781.   if (output.width < img_size_x)
  1782.     for (y=0; y < output.height; y++)
  1783.       for (x = output.width; x < img_size_x; x++)
  1784.         pImgOrg[0] [y][x] = pImgOrg[0][y][x-1];
  1785.   //padding bottom border
  1786.   if (output.height < img_size_y)
  1787.     for (y = output.height; y<img_size_y; y++)
  1788.       memcpy(pImgOrg[0][y], pImgOrg[0][y - 1], img_size_x * sizeof(imgpel));
  1789.   // Chroma or all other components
  1790.   if (img->yuv_format != YUV400)
  1791.   {
  1792.     int k;
  1793.     for (k = 1; k < 3; k++)
  1794.     {
  1795.       //padding right border
  1796.       if (output.width_cr < img_size_x_cr)
  1797.         for (y=0; y < output.height_cr; y++)
  1798.           for (x = output.width_cr; x < img_size_x_cr; x++)
  1799.             pImgOrg [k][y][x] = pImgOrg[k][y][x-1];
  1800.       //padding bottom border
  1801.       if (output.height_cr < img_size_y_cr)
  1802.         for (y = output.height_cr; y<img_size_y_cr; y++)
  1803.           memcpy(pImgOrg[k][y], pImgOrg[k][y - 1], img_size_x_cr * sizeof(imgpel));
  1804.     }
  1805.   }
  1806. }
  1807. /*!
  1808.  ************************************************************************
  1809.  * brief
  1810.  *    Calculates the absolute frame number in the source file out
  1811.  *    of various variables in img-> and params->
  1812.  * return
  1813.  *    frame number in the file to be read
  1814.  * par side effects
  1815.  *    global variable frame_no updated -- dunno, for what this one is necessary
  1816.  ************************************************************************
  1817.  */
  1818. int CalculateFrameNumber(void)
  1819. {
  1820.   int frm_sign = (IMG_NUMBER && (IMG_NUMBER <= params->intra_delay)) ? -1 : 1;
  1821.   int delay    = (IMG_NUMBER <= params->intra_delay) ? params->intra_delay : 0;
  1822.   
  1823.   if (img->b_frame_to_code)
  1824.   {
  1825.     if ((IMG_NUMBER && (IMG_NUMBER <= params->intra_delay)))
  1826.     {
  1827.       if (params->HierarchicalCoding)
  1828.         frame_no = start_tr_in_this_IGOP + (params->intra_delay - IMG_NUMBER) * (params->jumpd + 1) + (int) (img->b_interval * (double) (1 + gop_structure[img->b_frame_to_code - 1].display_no));
  1829.       else
  1830.         frame_no = start_tr_in_this_IGOP + (params->intra_delay - IMG_NUMBER) * (params->jumpd + 1) + (int) (img->b_interval * (double) img->b_frame_to_code);
  1831.     }
  1832.     else
  1833.     {
  1834.       if (params->HierarchicalCoding)
  1835.         frame_no = start_tr_in_this_IGOP + (IMG_NUMBER - 1) * (params->jumpd + 1) + (int) (img->b_interval * (double) (1 + gop_structure[img->b_frame_to_code - 1].display_no));
  1836.       else
  1837.         frame_no = start_tr_in_this_IGOP + (IMG_NUMBER - 1) * (params->jumpd + 1) + (int) (img->b_interval * (double) img->b_frame_to_code);
  1838.     }
  1839.     //printf("frame_no %d %d %dn",frame_no,IMG_NUMBER - 1,(frm_sign * (IMG_NUMBER - 1) + params->intra_delay));
  1840.   }
  1841.   else
  1842.   {
  1843.     if (params->idr_period && params->EnableIDRGOP && img->frm_number && ((!params->adaptive_idr_period && (img->frm_number - img->lastIDRnumber ) % params->idr_period == 0)
  1844.       || (params->adaptive_idr_period == 1 && (img->frm_number - imax(img->lastIntraNumber, img->lastIDRnumber) ) % params->idr_period == 0)) )
  1845.     {
  1846.       delay = params->intra_delay;
  1847.       img->rewind_frame += params->jumpd;
  1848.       start_frame_no_in_this_IGOP = img->frm_number;
  1849.       start_tr_in_this_IGOP = (img->frm_number) * (params->jumpd + 1) - img->rewind_frame;      
  1850.     }
  1851.     frame_no = start_tr_in_this_IGOP + (frm_sign * IMG_NUMBER + delay) * (params->jumpd + 1);     
  1852. #ifdef _ADAPT_LAST_GROUP_
  1853.     if (params->last_frame && (img->frm_number + 1) == params->no_frames)
  1854.       frame_no = params->last_frame;
  1855. #endif
  1856.   }
  1857.   return frame_no;
  1858. }
  1859. /*!
  1860.  ************************************************************************
  1861.  * brief
  1862.  *    point to frame coding variables
  1863.  ************************************************************************
  1864.  */
  1865. static void put_buffer_frame(ImageParameters *img)
  1866. {
  1867.   pCurImg    = img_org_frm[0];
  1868.   pImgOrg[0] = img_org_frm[0];    
  1869.   if (img->yuv_format != YUV400)
  1870.   {
  1871.     pImgOrg[1] = img_org_frm[1];
  1872.     pImgOrg[2] = img_org_frm[2];
  1873.   }
  1874. }
  1875. /*!
  1876.  ************************************************************************
  1877.  * brief
  1878.  *    point to top field coding variables
  1879.  ************************************************************************
  1880.  */
  1881. static void put_buffer_top(ImageParameters *img)
  1882. {
  1883.   img->fld_type = 0;
  1884.   pCurImg    = img_org_top[0];
  1885.   pImgOrg[0] = img_org_top[0];
  1886.   if (img->yuv_format != YUV400)
  1887.   {
  1888.     pImgOrg[1] = img_org_top[1];
  1889.     pImgOrg[2] = img_org_top[2];
  1890.   }
  1891. }
  1892. /*!
  1893.  ************************************************************************
  1894.  * brief
  1895.  *    point to bottom field coding variables
  1896.  ************************************************************************
  1897.  */
  1898. static void put_buffer_bot(ImageParameters *img)
  1899. {
  1900.   img->fld_type = 1;
  1901.   pCurImg    = img_org_bot[0];  
  1902.   pImgOrg[0] = img_org_bot[0];
  1903.   if (img->yuv_format != YUV400)
  1904.   {
  1905.     pImgOrg[1] = img_org_bot[1];
  1906.     pImgOrg[2] = img_org_bot[2];
  1907.   }
  1908. }
  1909. /*!
  1910.  ************************************************************************
  1911.  * brief
  1912.  *    performs multi-pass encoding of same picture using different
  1913.  *    coding conditions
  1914.  ************************************************************************
  1915.  */
  1916. static void rdPictureCoding(void)
  1917. {
  1918.   int   second_qp = img->qp, rd_qp = img->qp;
  1919.   int   previntras = intras;
  1920.   int   prevtype = img->type;
  1921.   int   skip_encode = 0;
  1922.   pic_parameter_set_rbsp_t *sec_pps;
  1923.   int   tmpFrameQP = img->SumFrameQP;
  1924.   float rateRatio = 1.0F;
  1925.   if ( params->RCEnable )
  1926.     rc_save_state();
  1927.   if ( params->WPMCPrecision )
  1928.     pWPX->curr_wp_rd_pass = pWPX->wp_rd_passes + 1;
  1929.   if (img->type!=I_SLICE && params->GenerateMultiplePPS)
  1930.   {
  1931.     if (img->type==P_SLICE)
  1932.     {
  1933.       if ((params->RDPSliceWeightOnly != 2) && (TestWPPSlice(img, params, 0) == 1))
  1934.       {
  1935.         active_pps = PicParSet[1];
  1936.         if ( params->WPMCPrecision )
  1937.           pWPX->curr_wp_rd_pass->algorithm = WP_REGULAR;
  1938.       }
  1939.       else if ( params->WPMCPrecision )
  1940.         active_pps = PicParSet[1];
  1941.       else
  1942.       {
  1943.         skip_encode = params->RDPSliceWeightOnly;
  1944.         active_pps = PicParSet[0];
  1945.         if (!img->AdaptiveRounding)
  1946.         {
  1947.           img->qp-=1;
  1948.           if ( params->RCEnable )
  1949.             rateRatio = 1.15F;
  1950.         }
  1951.       }
  1952.     }
  1953.     else
  1954.     {
  1955.       active_pps = PicParSet[2];
  1956.       if ( params->WPMCPrecision )
  1957.         pWPX->curr_wp_rd_pass->algorithm = WP_REGULAR;
  1958.     }
  1959.   }
  1960.   else
  1961.   {
  1962.     if (!img->AdaptiveRounding)
  1963.     {
  1964.       img->qp-=1;
  1965.       if ( params->RCEnable )
  1966.         rateRatio = 1.15F;
  1967.     }
  1968.   }
  1969.   sec_pps = active_pps;
  1970.   second_qp = img->qp;
  1971.   img->write_macroblock = FALSE;
  1972.   if (skip_encode)
  1973.   {
  1974.     img->rd_pass = 0;
  1975.     enc_frame_picture[1] = NULL;
  1976.   }
  1977.   else
  1978.   {
  1979.     if(params->RCEnable)
  1980.       rc_init_frame_rdpic( rateRatio );
  1981.     img->qp = iClip3( img->RCMinQP, img->RCMaxQP, img->qp );
  1982.     frame_picture (frame_pic[1],1);
  1983.     img->rd_pass=picture_coding_decision(frame_pic[0], frame_pic[1], rd_qp);
  1984.   }
  1985.   //      update_rd_picture_contexts (img->rd_pass);
  1986.   if (img->rd_pass==0)
  1987.   {
  1988.     enc_picture=enc_frame_picture[0];
  1989.     if (img->type!=I_SLICE && params->GenerateMultiplePPS)
  1990.     {
  1991.       img->qp = rd_qp;
  1992.       active_pps = PicParSet[0];
  1993.     }
  1994.     else
  1995.     {
  1996.       img->qp = rd_qp;
  1997.     }
  1998.     intras = previntras;
  1999.     p_frame_pic = frame_pic[0];
  2000.   }
  2001.   else
  2002.   {
  2003.     previntras  = intras;
  2004.     p_frame_pic = frame_pic[1];
  2005.     tmpFrameQP  = img->SumFrameQP;
  2006.     if(params->RCEnable)
  2007.       rc_save_state();
  2008.   }
  2009.   // Final Encoding pass - note that we should
  2010.   // make this more flexible in a later version.
  2011.   if ( params->RCEnable )
  2012.     rateRatio = 1.0F;
  2013.   if ( params->WPMCPrecision )
  2014.     pWPX->curr_wp_rd_pass = pWPX->wp_rd_passes + 2;
  2015.   if (img->type != I_SLICE )
  2016.   {
  2017.     skip_encode = 0;
  2018.     img->qp    = rd_qp;
  2019.     if (img->type == P_SLICE && (intras * 100 )/img->FrameSizeInMbs >=75)
  2020.     {
  2021.       set_slice_type( I_SLICE );
  2022.       active_pps = PicParSet[0];
  2023.     }
  2024.     else if (img->type==P_SLICE)
  2025.     {
  2026.       if (params->GenerateMultiplePPS)
  2027.       {
  2028.         if ((params->RDPSliceWeightOnly != 2) && (TestWPPSlice(img, params, 0) == 1))
  2029.         {
  2030.           active_pps = PicParSet[1];
  2031.           if ( params->WPMCPrecision )
  2032.             pWPX->curr_wp_rd_pass->algorithm = WP_REGULAR;
  2033.         }
  2034.         else if ( params->WPMCPrecision == 2 )
  2035.           active_pps = PicParSet[1];
  2036.         else if (params->RDPSliceBTest && active_sps->profile_idc != 66)
  2037.         {
  2038.           set_slice_type( B_SLICE );
  2039.           active_pps = PicParSet[0];
  2040.         }
  2041.         else
  2042.         {
  2043.           skip_encode = params->RDPSliceWeightOnly;
  2044.           active_pps = PicParSet[0];
  2045.           if (!img->AdaptiveRounding)
  2046.           {
  2047.             img->qp+=1;
  2048.             if ( params->RCEnable )
  2049.               rateRatio = 0.85F;
  2050.           }
  2051.         }
  2052.       }
  2053.     }
  2054.     else
  2055.     {
  2056.       if (params->GenerateMultiplePPS && (params->RDBSliceWeightOnly != 2) && TestWPBSlice(img, params, 0) == 1)
  2057.       {
  2058.         active_pps = PicParSet[1];
  2059.         if ( params->WPMCPrecision )
  2060.           pWPX->curr_wp_rd_pass->algorithm = WP_REGULAR;
  2061.       }
  2062.       else if ( params->WPMCPrecision == 2 && (params->WPMCPrecBSlice == 2 || (params->WPMCPrecBSlice == 1 && img->nal_reference_idc) ) )
  2063.         active_pps = PicParSet[1];
  2064.       else
  2065.       {
  2066.         skip_encode = (params->RDBSliceWeightOnly == 1);
  2067.         img->qp = rd_qp + (img->nal_reference_idc ? - 1 : 1);
  2068.         if ( params->RCEnable )
  2069.           rateRatio = img->nal_reference_idc ? 1.15F : 0.85F;
  2070.         if ( params->WPMCPrecision )
  2071.           pWPX->curr_wp_rd_pass->algorithm = WP_REGULAR;
  2072.       }
  2073.     }
  2074.   }
  2075.   else
  2076.   {
  2077.     active_pps = PicParSet[0];
  2078.     if (!img->AdaptiveRounding)
  2079.       img->qp    = (rd_qp + 1);
  2080.   }
  2081.   img->write_macroblock = FALSE;
  2082.   if (skip_encode)
  2083.   {
  2084.     enc_frame_picture[2] = NULL;
  2085.     img->qp = rd_qp;
  2086.   }
  2087.   else
  2088.   {
  2089.     if(params->RCEnable)
  2090.       rc_init_frame_rdpic( rateRatio );
  2091.     img->qp = iClip3( img->RCMinQP, img->RCMaxQP, img->qp );
  2092.     frame_picture (frame_pic[2],2);
  2093.     if (img->rd_pass==0)
  2094.       img->rd_pass  = 2 * picture_coding_decision(frame_pic[0], frame_pic[2], rd_qp);
  2095.     else
  2096.       img->rd_pass +=     picture_coding_decision(frame_pic[1], frame_pic[2], rd_qp);
  2097.     if ( params->RCEnable && img->rd_pass == 2 )
  2098.       rc_save_state();
  2099.     if ( img->rd_pass == 2 )
  2100.       tmpFrameQP = img->SumFrameQP;
  2101.   }
  2102.   //update_rd_picture_contexts (img->rd_pass);
  2103.   if (img->rd_pass==0)
  2104.   {
  2105.     enc_picture = enc_frame_picture[0];
  2106.     set_slice_type( prevtype );
  2107.     active_pps  = PicParSet[0];
  2108.     img->qp     = rd_qp;
  2109.     intras      = previntras;
  2110.   }
  2111.   else if (img->rd_pass==1)
  2112.   {
  2113.     enc_picture = enc_frame_picture[1];
  2114.     set_slice_type( prevtype );
  2115.     active_pps  = sec_pps;
  2116.     img->qp     = second_qp;
  2117.     intras      = previntras;
  2118.   }
  2119.   if ( params->RCEnable )
  2120.     rc_restore_state();
  2121.   img->SumFrameQP = tmpFrameQP;
  2122. }
  2123. /*!
  2124. *************************************************************************************
  2125. * Brief
  2126. *     Output SP frames coefficients
  2127. *************************************************************************************
  2128. */
  2129. void output_SP_coefficients()
  2130. {
  2131.   int i,k;
  2132.   FILE *SP_coeff_file;
  2133.   if(number_sp2_frames==0)
  2134.   {
  2135.     if ((SP_coeff_file = fopen(params->sp_output_filename,"wb")) == NULL)
  2136.     {
  2137.       printf ("Fatal: cannot open SP output file '%s', exit (-1)n", params->sp_output_filename);
  2138.       exit (-1);
  2139.     }
  2140.     number_sp2_frames++;
  2141.   }
  2142.   else
  2143.   {
  2144.     if ((SP_coeff_file = fopen(params->sp_output_filename,"ab")) == NULL)
  2145.     {
  2146.       printf ("Fatal: cannot open SP output file '%s', exit (-1)n", params->sp_output_filename);
  2147.       exit (-1);
  2148.     }
  2149.   }
  2150.   for(i=0;i<img->height;i++)
  2151.   {
  2152.     fwrite(lrec[i],sizeof(int),img->width,SP_coeff_file);
  2153.   }
  2154.   for(k=0;k<2;k++)
  2155.   {
  2156.     for(i=0;i<img->height_cr;i++)
  2157.     {
  2158.       fwrite(lrec_uv[k][i],sizeof(int),img->width_cr,SP_coeff_file);
  2159.     }
  2160.   }
  2161.   fclose(SP_coeff_file);
  2162. }
  2163. /*!
  2164. *************************************************************************************
  2165. * Brief
  2166. *     Read SP frames coefficients
  2167. *************************************************************************************
  2168. */
  2169. void read_SP_coefficients()
  2170. {
  2171.   int i,k;
  2172.   FILE *SP_coeff_file;
  2173.   if ( (params->qp2start > 0) && ( ( (img->tr ) % (2*params->qp2start) ) >=params->qp2start ))
  2174.   {
  2175.     if ((SP_coeff_file = fopen(params->sp2_input_filename1,"rb")) == NULL)
  2176.     {
  2177.       printf ("Fatal: cannot open SP input file '%s', exit (-1)n", params->sp2_input_filename2);
  2178.       exit (-1);
  2179.     }
  2180.   }
  2181.   else
  2182.   {
  2183.     if ((SP_coeff_file = fopen(params->sp2_input_filename2,"rb")) == NULL)
  2184.     {
  2185.       printf ("Fatal: cannot open SP input file '%s', exit (-1)n", params->sp2_input_filename1);
  2186.       exit (-1);
  2187.     }
  2188.   }
  2189.   if (0 != fseek (SP_coeff_file, img->size * 3/2*number_sp2_frames*sizeof(int), SEEK_SET))
  2190.   {
  2191.     printf ("Fatal: cannot seek in SP input file, exit (-1)n");
  2192.     exit (-1);
  2193.   }
  2194.   number_sp2_frames++;
  2195.   for(i=0;i<img->height;i++)
  2196.   {
  2197.     if(img->width!=(int)fread(lrec[i],sizeof(int),img->width,SP_coeff_file))
  2198.     {
  2199.       printf ("Fatal: cannot read in SP input file, exit (-1)n");
  2200.       exit (-1);
  2201.     }
  2202.   }
  2203.   for(k=0;k<2;k++)
  2204.   {
  2205.     for(i=0;i<img->height_cr;i++)
  2206.     {
  2207.       if(img->width_cr!=(int)fread(lrec_uv[k][i],sizeof(int),img->width_cr,SP_coeff_file))
  2208.       {
  2209.         printf ("Fatal: cannot read in SP input file, exit (-1)n");
  2210.         exit (-1);
  2211.       }
  2212.     }
  2213.   }
  2214.   fclose(SP_coeff_file);
  2215. }
  2216. /*!
  2217. *************************************************************************************
  2218. * Brief
  2219. *     Select appropriate image plane (for 444 coding)
  2220. *************************************************************************************
  2221. */
  2222. void select_plane(ColorPlane color_plane)
  2223. {
  2224.   pCurImg                     = pImgOrg[color_plane];
  2225.   enc_picture->p_curr_img     = enc_picture->p_img[color_plane];
  2226.   enc_picture->p_curr_img_sub = enc_picture->p_img_sub[color_plane];
  2227.   img->max_imgpel_value       = img->max_imgpel_value_comp[color_plane];
  2228.   img->dc_pred_value          = img->dc_pred_value_comp[color_plane];
  2229.   img->curr_res               = img->mb_rres [color_plane];
  2230.   img->curr_prd               = img->mb_pred [color_plane];
  2231. }