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

Audio

开发平台:

Visual C++

  1. /*!
  2.  ***********************************************************************
  3.  *  mainpage
  4.  *     This is the H.264/AVC decoder reference software. For detailed documentation
  5.  *     see the comments in each file.
  6.  *
  7.  *     The JM software web site is located at:
  8.  *     http://iphome.hhi.de/suehring/tml
  9.  *
  10.  *     For bug reporting and known issues see:
  11.  *     https://ipbt.hhi.de
  12.  *
  13.  *  author
  14.  *     The main contributors are listed in contributors.h
  15.  *
  16.  *  version
  17.  *     JM 14.2 (FRExt)
  18.  *
  19.  *  note
  20.  *     tags are used for document system "doxygen"
  21.  *     available at http://www.doxygen.org
  22.  */
  23. /*!
  24.  *  file
  25.  *     ldecod.c
  26.  *  brief
  27.  *     H.264/AVC reference decoder project main()
  28.  *  author
  29.  *     Main contributors (see contributors.h for copyright, address and affiliation details)
  30.  *     - Inge Lille-Lang鴜       <inge.lille-langoy@telenor.com>
  31.  *     - Rickard Sjoberg         <rickard.sjoberg@era.ericsson.se>
  32.  *     - Stephan Wenger          <stewe@cs.tu-berlin.de>
  33.  *     - Jani Lainema            <jani.lainema@nokia.com>
  34.  *     - Sebastian Purreiter     <sebastian.purreiter@mch.siemens.de>
  35.  *     - Byeong-Moon Jeon        <jeonbm@lge.com>
  36.  *     - Gabi Blaettermann
  37.  *     - Ye-Kui Wang             <wyk@ieee.org>
  38.  *     - Valeri George           <george@hhi.de>
  39.  *     - Karsten Suehring        <suehring@hhi.de>
  40.  *
  41.  ***********************************************************************
  42.  */
  43. #include "contributors.h"
  44. #include <sys/stat.h>
  45. #include "global.h"
  46. #include "rtp.h"
  47. #include "memalloc.h"
  48. #include "mbuffer.h"
  49. #include "leaky_bucket.h"
  50. #include "fmo.h"
  51. #include "annexb.h"
  52. #include "output.h"
  53. #include "cabac.h"
  54. #include "parset.h"
  55. #include "sei.h"
  56. #include "erc_api.h"
  57. #include "quant.h"
  58. #define JM          "14 (FRExt)"
  59. #define VERSION     "14.2"
  60. #define EXT_VERSION "(FRExt)"
  61. #define LOGFILE     "log.dec"
  62. #define DATADECFILE "dataDec.txt"
  63. #define TRACEFILE   "trace_dec.txt"
  64. extern objectBuffer_t *erc_object_list;
  65. extern ercVariables_t *erc_errorVar;
  66. extern ColocatedParams *Co_located;
  67. extern ColocatedParams *Co_located_JV[MAX_PLANE];  //!< Co_located to be used during 4:4:4 independent mode decoding
  68. // I have started to move the inp and img structures into global variables.
  69. // They are declared in the following lines.  Since inp is defined in conio.h
  70. // and cannot be overridden globally, it is defined here as input
  71. //
  72. // Everywhere, params-> and img-> can now be used either globally or with
  73. // the local override through the formal parameter mechanism
  74. extern FILE* bits;
  75. extern StorablePicture* dec_picture;
  76. struct inp_par    *params;       //!< input parameters from input configuration file
  77. struct snr_par    *snr;         //!< statistics
  78. ImageParameters   *img;         //!< image parameters
  79. int global_init_done = 0;
  80. /*!
  81.  ***********************************************************************
  82.  * brief
  83.  *   print help message and exit
  84.  ***********************************************************************
  85.  */
  86. void JMDecHelpExit (void)
  87. {
  88.   fprintf( stderr, "n   ldecod [-h] {[defdec.cfg] | {[-p pocScale][-i bitstream.264]...[-o output.yuv] [-r reference.yuv] [-uv]}}nn"
  89.     "## Parametersnn"
  90.     "## Optionsn"
  91.     "   -h  :  prints function usagen"
  92.     "       :  parse <defdec.cfg> for decoder operation.n"
  93.     "   -i  :  Input file name. n"
  94.     "   -o  :  Output file name. If not specified default output is set as test_dec.yuvnn"
  95.     "   -r  :  Reference file name. If not specified default output is set as test_rec.yuvnn"
  96.     "   -p  :  Poc Scale. n"
  97.     "   -uv :  write chroma components for monochrome streams(4:2:0)n"
  98.     "   -lp :  By default the deblocking filter for High Intra-Only profile is off nt  regardless of the flags in the bitstream. In the presence ofnt  this option, the loop filter usage will then be determined nt  by the flags and parameters in the bitstream.nn" 
  99.     "## Supported video file formatsn"
  100.     "   Input : .264 -> H.264 bitstream files. n"
  101.     "   Output: .yuv -> RAW file. Format depends on bitstream information. nn"
  102.     "## Examples of usage:n"
  103.     "   ldecodn"
  104.     "   ldecod  -hn"
  105.     "   ldecod  default.cfgn"
  106.     "   ldecod  -i bitstream.264 -o output.yuv -r reference.yuvn");
  107.   exit(-1);
  108. }
  109. void Configure(int ac, char *av[])
  110. {
  111.   int CLcount;
  112.   char *config_filename=NULL;
  113.   CLcount = 1;
  114.   strcpy(params->infile,"test.264");      //! set default bitstream name
  115.   strcpy(params->outfile,"test_dec.yuv"); //! set default output file name
  116.   strcpy(params->reffile,"test_rec.yuv"); //! set default reference file name
  117.   params->FileFormat = PAR_OF_ANNEXB;
  118.   params->ref_offset=0;
  119.   params->poc_scale=2;
  120.   params->silent = FALSE;
  121.   params->intra_profile_deblocking = 0;
  122. #ifdef _LEAKYBUCKET_
  123.   params->R_decoder=500000;          //! Decoder rate
  124.   params->B_decoder=104000;          //! Decoder buffer size
  125.   params->F_decoder=73000;           //! Decoder initial delay
  126.   strcpy(params->LeakyBucketParamFile,"leakybucketparam.cfg");    // file where Leaky Bucket params (computed by encoder) are stored
  127. #endif
  128.   if (ac==2)
  129.   {
  130.     if (0 == strncmp (av[1], "-h", 2))
  131.     {
  132.       JMDecHelpExit();
  133.     }
  134.     else if (0 == strncmp (av[1], "-s", 2))
  135.     {
  136.       params->silent = TRUE;
  137.     }
  138.     else
  139.     {
  140.       config_filename=av[1];
  141.       init_conf(params, av[1]);
  142.     }
  143.     CLcount=2;
  144.   }
  145.   if (ac>=3)
  146.   {
  147.     if (0 == strncmp (av[1], "-i", 2))
  148.     {
  149.       strcpy(params->infile,av[2]);
  150.       CLcount = 3;
  151.     }
  152.     if (0 == strncmp (av[1], "-h", 2))
  153.     {
  154.       JMDecHelpExit();
  155.     }
  156.     if (0 == strncmp (av[1], "-s", 2))
  157.     {
  158.       params->silent = TRUE;
  159.     }
  160.   }
  161.   // Parse the command line
  162.   while (CLcount < ac)
  163.   {
  164.     if (0 == strncmp (av[CLcount], "-h", 2))
  165.     {
  166.       JMDecHelpExit();
  167.     }
  168.     if (0 == strncmp (av[CLcount], "-s", 2))
  169.     {
  170.       params->silent = TRUE;
  171.       CLcount ++;
  172.     }
  173.     if (0 == strncmp (av[CLcount], "-i", 2))  //! Input file
  174.     {
  175.       strcpy(params->infile,av[CLcount+1]);
  176.       CLcount += 2;
  177.     }
  178.     else if (0 == strncmp (av[CLcount], "-o", 2))  //! Output File
  179.     {
  180.       strcpy(params->outfile,av[CLcount+1]);
  181.       CLcount += 2;
  182.     }
  183.     else if (0 == strncmp (av[CLcount], "-r", 2))  //! Reference File
  184.     {
  185.       strcpy(params->reffile,av[CLcount+1]);
  186.       CLcount += 2;
  187.     }
  188.     else if (0 == strncmp (av[CLcount], "-p", 2))  //! Poc Scale
  189.     {
  190.       sscanf (av[CLcount+1], "%d", &params->poc_scale);
  191.       CLcount += 2;
  192.     }
  193.     else if (0 == strncmp (av[CLcount], "-uv", 3))  //! indicate UV writing for 4:0:0
  194.     {
  195.       params->write_uv = 1;
  196.       CLcount ++;
  197.     }
  198.     else if (0 == strncmp (av[CLcount], "-lp", 3))  
  199.     {
  200.       params->intra_profile_deblocking = 1;
  201.       CLcount ++;
  202.     }
  203.     else
  204.     {
  205.       //config_filename=av[CLcount];
  206.       //init_conf(params, config_filename);
  207.       snprintf(errortext, ET_SIZE, "Invalid syntax. Use ldecod -h for proper usage");
  208.       error(errortext, 300);
  209.     }
  210.   }
  211. #if TRACE
  212.   if ((p_trace=fopen(TRACEFILE,"w"))==0)             // append new statistic at the end
  213.   {
  214.     snprintf(errortext, ET_SIZE, "Error open file %s!",TRACEFILE);
  215.     error(errortext,500);
  216.   }
  217. #endif
  218.   if ((p_out=open(params->outfile, OPENFLAGS_WRITE, OPEN_PERMISSIONS))==-1)
  219.   {
  220.     snprintf(errortext, ET_SIZE, "Error open file %s ",params->outfile);
  221.     error(errortext,500);
  222.   }
  223. /*  if ((p_out2=fopen("out.yuv","wb"))==0)
  224.   {
  225.     snprintf(errortext, ET_SIZE, "Error open file %s ",params->outfile);
  226.     error(errortext,500);
  227.   }*/
  228.   fprintf(stdout,"----------------------------- JM %s %s -----------------------------n", VERSION, EXT_VERSION);
  229.   fprintf(stdout," Decoder config file                    : %s n",config_filename);
  230.   fprintf(stdout,"--------------------------------------------------------------------------n");
  231.   fprintf(stdout," Input H.264 bitstream                  : %s n",params->infile);
  232.   fprintf(stdout," Output decoded YUV                     : %s n",params->outfile);
  233.   fprintf(stdout," Output status file                     : %s n",LOGFILE);
  234.   if ((p_ref=open(params->reffile,OPENFLAGS_READ))==-1)
  235.   {
  236.     fprintf(stdout," Input reference file                   : %s does not exist n",params->reffile);
  237.     fprintf(stdout,"                                          SNR values are not availablen");
  238.   }
  239.   else
  240.     fprintf(stdout," Input reference file                   : %s n",params->reffile);
  241.   fprintf(stdout,"--------------------------------------------------------------------------n");
  242. #ifdef _LEAKYBUCKET_
  243.   fprintf(stdout," Rate_decoder        : %8ld n",params->R_decoder);
  244.   fprintf(stdout," B_decoder           : %8ld n",params->B_decoder);
  245.   fprintf(stdout," F_decoder           : %8ld n",params->F_decoder);
  246.   fprintf(stdout," LeakyBucketParamFile: %s n",params->LeakyBucketParamFile); // Leaky Bucket Param file
  247.   calc_buffer(params);
  248.   fprintf(stdout,"--------------------------------------------------------------------------n");
  249. #endif
  250.   if (!params->silent)
  251.   {
  252.     fprintf(stdout,"POC must = frame# or field# for SNRs to be correctn");
  253.     fprintf(stdout,"--------------------------------------------------------------------------n");
  254.     fprintf(stdout,"  Frame          POC  Pic#   QP    SnrY     SnrU     SnrV   Y:U:V Time(ms)n");
  255.     fprintf(stdout,"--------------------------------------------------------------------------n");
  256.   }
  257. }
  258. /*!
  259.  ***********************************************************************
  260.  * brief
  261.  *    main function for TML decoder
  262.  ***********************************************************************
  263.  */
  264. int main(int argc, char **argv)
  265. {
  266.   int i;
  267.   int nplane;
  268.   // allocate memory for the structures
  269.   if ((params =  (struct inp_par *)calloc(1, sizeof(struct inp_par)))==NULL) no_mem_exit("main: params");
  270.   if ((snr   =  (struct snr_par *)calloc(1, sizeof(struct snr_par)))==NULL) no_mem_exit("main: snr");
  271.   if ((img   =  (ImageParameters *)calloc(1, sizeof(ImageParameters)))==NULL) no_mem_exit("main: img");
  272.   Configure (argc, argv);
  273.   init_old_slice();
  274.   switch (params->FileFormat)
  275.   {
  276.   case 0:
  277.     OpenBitstreamFile (params->infile);
  278.     break;
  279.   case 1:
  280.     OpenRTPFile (params->infile);
  281.     break;
  282.   default:
  283.     printf ("Unsupported file format %d, exitn", params->FileFormat);
  284.   }
  285.   // Allocate Slice data struct
  286.   malloc_slice(params,img);
  287.   init(img);
  288.   dec_picture = NULL;
  289.   dpb.init_done = 0;
  290.   g_nFrame = 0;
  291.   init_out_buffer();  
  292.   img->idr_psnr_number=params->ref_offset;
  293.   img->psnr_number=0;
  294.   img->number=0;
  295.   img->type = I_SLICE;
  296.   img->dec_ref_pic_marking_buffer = NULL;
  297.   // B pictures
  298.   Bframe_ctr = snr->frame_ctr = 0;
  299.   // time for total decoding session
  300.   tot_time = 0;
  301.   // reference flag initialization
  302.   for(i=0;i<17;i++)
  303.   {
  304.     ref_flag[i] = 1;
  305.   }
  306.   while (decode_one_frame(img, params, snr) != EOS)
  307.     ;
  308.   report(params, img, snr);
  309.   free_slice(img);
  310.   FmoFinit();
  311.   free_global_buffers();
  312.   flush_dpb();
  313. #if (PAIR_FIELDS_IN_OUTPUT)
  314.   flush_pending_output(p_out);
  315. #endif
  316.   CloseBitstreamFile();
  317.   close(p_out);
  318. //  fclose(p_out2);
  319.   if (p_ref!=-1)
  320.     close(p_ref);
  321. #if TRACE
  322.   fclose(p_trace);
  323. #endif
  324.   ercClose(erc_errorVar);
  325.   CleanUpPPS();
  326.   free_dpb();
  327.   uninit_out_buffer();
  328.   if( IS_INDEPENDENT(img) )
  329.   {
  330.     for( nplane=0; nplane<MAX_PLANE; nplane++ )
  331.     {
  332.       free_colocated(Co_located_JV[nplane]);   
  333.     }
  334.   }
  335.   else
  336.   {
  337.     free_colocated(Co_located);
  338.   }
  339.   free (params);
  340.   free (snr);
  341.   free (img);
  342.   //while( !kbhit() );
  343.   return 0;
  344. }
  345. /*!
  346.  ***********************************************************************
  347.  * brief
  348.  *    Initilize some arrays
  349.  ***********************************************************************
  350.  */
  351. void init(ImageParameters *img)  //!< image parameters
  352. {
  353.   img->oldFrameSizeInMbs = -1;
  354.   imgY_ref  = NULL;
  355.   imgUV_ref = NULL;
  356.   img->recovery_point = 0;
  357.   img->recovery_point_found = 0;
  358.   img->recovery_poc = 0x7fffffff; /* set to a max value */
  359. #if (ENABLE_OUTPUT_TONEMAPPING)
  360.   init_tone_mapping_sei();
  361. #endif
  362. }
  363. /*!
  364.  ***********************************************************************
  365.  * brief
  366.  *    Initialize FREXT variables
  367.  ***********************************************************************
  368.  */
  369. void init_frext(ImageParameters *img)  //!< image parameters
  370. {
  371.   //pel bitdepth init
  372.   img->bitdepth_luma_qp_scale   = 6 * (img->bitdepth_luma - 8);
  373.   if(img->bitdepth_luma > img->bitdepth_chroma || active_sps->chroma_format_idc == YUV400)
  374.     img->pic_unit_bitsize_on_disk = (img->bitdepth_luma > 8)? 16:8;
  375.   else
  376.     img->pic_unit_bitsize_on_disk = (img->bitdepth_chroma > 8)? 16:8;
  377.   img->dc_pred_value_comp[0]    = 1<<(img->bitdepth_luma - 1);
  378.   img->max_imgpel_value_comp[0] = (1<<img->bitdepth_luma) - 1;
  379.   img->mb_size[0][0] = img->mb_size[0][1] = MB_BLOCK_SIZE;
  380.   if (active_sps->chroma_format_idc != YUV400)
  381.   {
  382.     //for chrominance part
  383.     img->bitdepth_chroma_qp_scale = 6 * (img->bitdepth_chroma - 8);
  384.     img->dc_pred_value_comp[1]    = (1 << (img->bitdepth_chroma - 1));
  385.     img->dc_pred_value_comp[2]    = img->dc_pred_value_comp[1];
  386.     img->max_imgpel_value_comp[1] = (1 << img->bitdepth_chroma) - 1;
  387.     img->max_imgpel_value_comp[2] = (1 << img->bitdepth_chroma) - 1;
  388.     img->num_blk8x8_uv = (1 << active_sps->chroma_format_idc) & (~(0x1));
  389.     img->num_uv_blocks = (img->num_blk8x8_uv >> 1);
  390.     img->num_cdc_coeff = (img->num_blk8x8_uv << 1);
  391.     img->mb_size[1][0] = img->mb_size[2][0] = img->mb_cr_size_x  = (active_sps->chroma_format_idc==YUV420 || active_sps->chroma_format_idc==YUV422)?  8 : 16;
  392.     img->mb_size[1][1] = img->mb_size[2][1] = img->mb_cr_size_y  = (active_sps->chroma_format_idc==YUV444 || active_sps->chroma_format_idc==YUV422)? 16 :  8;
  393.   }
  394.   else
  395.   {
  396.     img->bitdepth_chroma_qp_scale = 0;
  397.     img->max_imgpel_value_comp[1] = 0;
  398.     img->max_imgpel_value_comp[2] = 0;
  399.     img->num_blk8x8_uv = 0;
  400.     img->num_uv_blocks = 0;
  401.     img->num_cdc_coeff = 0;
  402.     img->mb_size[1][0] = img->mb_size[2][0] = img->mb_cr_size_x  = 0;
  403.     img->mb_size[1][1] = img->mb_size[2][1] = img->mb_cr_size_y  = 0;
  404.   }
  405.   img->mb_size_blk[0][0] = img->mb_size_blk[0][1] = img->mb_size[0][0] >> 2;
  406.   img->mb_size_blk[1][0] = img->mb_size_blk[2][0] = img->mb_size[1][0] >> 2;
  407.   img->mb_size_blk[1][1] = img->mb_size_blk[2][1] = img->mb_size[1][1] >> 2;
  408.   img->mb_size_shift[0][0] = img->mb_size_shift[0][1] = CeilLog2_sf (img->mb_size[0][0]);
  409.   img->mb_size_shift[1][0] = img->mb_size_shift[2][0] = CeilLog2_sf (img->mb_size[1][0]);
  410.   img->mb_size_shift[1][1] = img->mb_size_shift[2][1] = CeilLog2_sf (img->mb_size[1][1]);
  411.   init_qp_process(img);
  412. }
  413. /*!
  414.  ************************************************************************
  415.  * brief
  416.  *    Read parameters from configuration file
  417.  *
  418.  * par Input:
  419.  *    Name of configuration filename
  420.  *
  421.  * par Output
  422.  *    none
  423.  ************************************************************************
  424.  */
  425. void init_conf(struct inp_par *inp, char *config_filename)
  426. {
  427.   FILE *fd;
  428.   int NAL_mode;
  429.   // picture error concealment
  430.   long int temp;
  431.   char tempval[100];
  432.   // read the decoder configuration file
  433.   if((fd=fopen(config_filename,"r")) == NULL)
  434.   {
  435.     snprintf(errortext, ET_SIZE, "Error: Control file %s not foundn",config_filename);
  436.     error(errortext, 300);
  437.   }
  438.   fscanf(fd,"%s",inp->infile);                // H.264 compressed input bitstream
  439.   fscanf(fd,"%*[^n]");
  440.   fscanf(fd,"%s",inp->outfile);               // RAW (YUV/RGB) output file
  441.   fscanf(fd,"%*[^n]");
  442.   fscanf(fd,"%s",inp->reffile);               // reference file
  443.   fscanf(fd,"%*[^n]");
  444.   fscanf(fd,"%d",&(inp->write_uv));           // write UV in YUV 4:0:0 mode
  445.   fscanf(fd,"%*[^n]");
  446.   fscanf(fd,"%d",&(NAL_mode));                // NAL mode
  447.   fscanf(fd,"%*[^n]");
  448.   switch(NAL_mode)
  449.   {
  450.   case 0:
  451.     inp->FileFormat = PAR_OF_ANNEXB;
  452.     break;
  453.   case 1:
  454.     inp->FileFormat = PAR_OF_RTP;
  455.     break;
  456.   default:
  457.     snprintf(errortext, ET_SIZE, "NAL mode %i is not supported", NAL_mode);
  458.     error(errortext,400);
  459.   }
  460.   fscanf(fd,"%d,",&inp->ref_offset);   // offset used for SNR computation
  461.   fscanf(fd,"%*[^n]");
  462.   fscanf(fd,"%d,",&inp->poc_scale);   // offset used for SNR computation
  463.   fscanf(fd,"%*[^n]");
  464.   if (inp->poc_scale < 1 || inp->poc_scale > 10)
  465.   {
  466.     snprintf(errortext, ET_SIZE, "Poc Scale is %d. It has to be within range 1 to 10",inp->poc_scale);
  467.     error(errortext,1);
  468.   }
  469.   inp->write_uv=1;
  470.   // picture error concealment
  471.   img->conceal_mode = inp->conceal_mode = 0;
  472.   img->ref_poc_gap = inp->ref_poc_gap = 2;
  473.   img->poc_gap = inp->poc_gap = 2;
  474. #ifdef _LEAKYBUCKET_
  475.   fscanf(fd,"%ld,",&inp->R_decoder);             // Decoder rate
  476.   fscanf(fd, "%*[^n]");
  477.   fscanf(fd,"%ld,",&inp->B_decoder);             // Decoder buffer size
  478.   fscanf(fd, "%*[^n]");
  479.   fscanf(fd,"%ld,",&inp->F_decoder);             // Decoder initial delay
  480.   fscanf(fd, "%*[^n]");
  481.   fscanf(fd,"%s",inp->LeakyBucketParamFile);    // file where Leaky Bucket params (computed by encoder) are stored
  482.   fscanf(fd,"%*[^n]");
  483. #endif
  484.   /* since error concealment parameters are added at the end of
  485.   decoder conf file we need to read the leakybucket params to get to
  486.   those parameters */
  487. #ifndef _LEAKYBUCKET_
  488.   fscanf(fd,"%ld,",&temp);
  489.   fscanf(fd, "%*[^n]");
  490.   fscanf(fd,"%ld,",&temp);
  491.   fscanf(fd, "%*[^n]");
  492.   fscanf(fd,"%ld,",&temp);
  493.   fscanf(fd, "%*[^n]");
  494.   fscanf(fd,"%s",tempval);
  495.   fscanf(fd,"%*[^n]");
  496. #endif
  497.   fscanf(fd,"%d",&inp->conceal_mode);   // Mode of Error Concealment
  498.   fscanf(fd,"%*[^n]");
  499.   img->conceal_mode = inp->conceal_mode;
  500.   fscanf(fd,"%d",&inp->ref_poc_gap);   // POC gap depending on pattern
  501.   fscanf(fd,"%*[^n]");
  502.   img->ref_poc_gap = inp->ref_poc_gap;
  503.   fscanf(fd,"%d",&inp->poc_gap);   // POC gap between consecutive frames in display order
  504.   fscanf(fd,"%*[^n]");
  505.   img->poc_gap = inp->poc_gap;
  506.   fscanf(fd,"%d,",&inp->silent);     // use silent decode mode
  507.   fscanf(fd,"%*[^n]");
  508.   fscanf(fd,"%d,",&inp->intra_profile_deblocking);     // use deblocking filter in intra only profile
  509.   fscanf(fd,"%*[^n]");
  510.   fclose (fd);
  511. }
  512. /*!
  513.  ************************************************************************
  514.  * brief
  515.  *    Reports the gathered information to appropriate outputs
  516.  *
  517.  * par Input:
  518.  *    struct inp_par *inp,
  519.  *    ImageParameters *img,
  520.  *    struct snr_par *stat
  521.  *
  522.  * par Output:
  523.  *    None
  524.  ************************************************************************
  525.  */
  526. void report(struct inp_par *inp, ImageParameters *img, struct snr_par *snr)
  527. {
  528.   #define OUTSTRING_SIZE 255
  529.   char string[OUTSTRING_SIZE];
  530.   FILE *p_log;
  531.   char yuv_formats[4][4]= { {"400"}, {"420"}, {"422"}, {"444"} };
  532. #ifndef WIN32
  533.   time_t  now;
  534.   struct tm *l_time;
  535. #else
  536.   char timebuf[128];
  537. #endif
  538.   if (params->silent == FALSE)
  539.   {
  540.     fprintf(stdout,"-------------------- Average SNR all frames ------------------------------n");
  541.     fprintf(stdout," SNR Y(dB)           : %5.2fn",snr->snra[0]);
  542.     fprintf(stdout," SNR U(dB)           : %5.2fn",snr->snra[1]);
  543.     fprintf(stdout," SNR V(dB)           : %5.2fn",snr->snra[2]);
  544.     fprintf(stdout," Total decoding time : %.3f sec (%.3f fps)n",tot_time*0.001,(snr->frame_ctr ) * 1000.0 / tot_time);
  545.     fprintf(stdout,"--------------------------------------------------------------------------n");
  546.     fprintf(stdout," Exit JM %s decoder, ver %s ",JM, VERSION);
  547.     fprintf(stdout,"n");
  548.   }
  549.   else
  550.   {
  551.     fprintf(stdout,"n----------------------- Decoding Completed -------------------------------n");
  552.     fprintf(stdout," Total decoding time : %.3f sec (%.3f fps)n",tot_time*0.001, (snr->frame_ctr) * 1000.0 / tot_time);
  553.     fprintf(stdout,"--------------------------------------------------------------------------n");
  554.     fprintf(stdout," Exit JM %s decoder, ver %s ",JM, VERSION);
  555.     fprintf(stdout,"n");
  556.   }
  557.   // write to log file
  558.   snprintf(string, OUTSTRING_SIZE, "%s", LOGFILE);
  559.   if ((p_log=fopen(string,"r"))==0)                    // check if file exist
  560.   {
  561.     if ((p_log=fopen(string,"a"))==0)
  562.     {
  563.       snprintf(errortext, ET_SIZE, "Error open file %s for appending",string);
  564.       error(errortext, 500);
  565.     }
  566.     else                                              // Create header to new file
  567.     {
  568.       fprintf(p_log," -------------------------------------------------------------------------------------------------------------------n");
  569.       fprintf(p_log,"|  Decoder statistics. This file is made first time, later runs are appended               |n");
  570.       fprintf(p_log," ------------------------------------------------------------------------------------------------------------------- n");
  571.       fprintf(p_log,"|   ver  | Date  | Time  |    Sequence        |#Img| Format  | YUV |Coding|SNRY 1|SNRU 1|SNRV 1|SNRY N|SNRU N|SNRV N|n");
  572.       fprintf(p_log," -------------------------------------------------------------------------------------------------------------------n");
  573.     }
  574.   }
  575.   else
  576.   {
  577.     fclose(p_log);
  578.     p_log=fopen(string,"a");                    // File exist,just open for appending
  579.   }
  580.   fprintf(p_log,"|%s/%-4s", VERSION, EXT_VERSION);
  581. #ifdef WIN32
  582.   _strdate( timebuf );
  583.   fprintf(p_log,"| %1.5s |",timebuf );
  584.   _strtime( timebuf);
  585.   fprintf(p_log," % 1.5s |",timebuf);
  586. #else
  587.   now = time ((time_t *) NULL); // Get the system time and put it into 'now' as 'calender time'
  588.   time (&now);
  589.   l_time = localtime (&now);
  590.   strftime (string, sizeof string, "%d-%b-%Y", l_time);
  591.   fprintf(p_log,"| %1.5s |",string );
  592.   strftime (string, sizeof string, "%H:%M:%S", l_time);
  593.   fprintf(p_log,"| %1.5s |",string );
  594. #endif
  595.   fprintf(p_log,"%20.20s|",inp->infile);
  596.   fprintf(p_log,"%3d |",img->number);
  597.   fprintf(p_log,"%4dx%-4d|", img->width, img->height);
  598.   fprintf(p_log," %s |", &(yuv_formats[img->yuv_format][0]));
  599.   if (active_pps)
  600.   {
  601.     if (active_pps->entropy_coding_mode_flag == UVLC)
  602.       fprintf(p_log," CAVLC|");
  603.     else
  604.       fprintf(p_log," CABAC|");
  605.   }
  606.   fprintf(p_log,"%6.3f|",snr->snr1[0]);
  607.   fprintf(p_log,"%6.3f|",snr->snr1[1]);
  608.   fprintf(p_log,"%6.3f|",snr->snr1[2]);
  609.   fprintf(p_log,"%6.3f|",snr->snra[0]);
  610.   fprintf(p_log,"%6.3f|",snr->snra[1]);
  611.   fprintf(p_log,"%6.3f|n",snr->snra[2]);
  612.   fclose(p_log);
  613.   snprintf(string, OUTSTRING_SIZE,"%s", DATADECFILE);
  614.   p_log=fopen(string,"a");
  615.   if(Bframe_ctr != 0) // B picture used
  616.   {
  617.     fprintf(p_log, "%3d %2d %2d %2.2f %2.2f %2.2f %5d "
  618.       "%2.2f %2.2f %2.2f %5d "
  619.       "%2.2f %2.2f %2.2f %5d %.3fn",
  620.       img->number, 0, img->qp,
  621.       snr->snr1[0],
  622.       snr->snr1[1],
  623.       snr->snr1[2],
  624.       0,
  625.       0.0,
  626.       0.0,
  627.       0.0,
  628.       0,
  629.       snr->snra[0],
  630.       snr->snra[1],
  631.       snr->snra[2],
  632.       0,
  633.       (double)0.001*tot_time/(img->number+Bframe_ctr-1));
  634.   }
  635.   else
  636.   {
  637.     fprintf(p_log, "%3d %2d %2d %2.2f %2.2f %2.2f %5d "
  638.       "%2.2f %2.2f %2.2f %5d "
  639.       "%2.2f %2.2f %2.2f %5d %.3fn",
  640.       img->number, 0, img->qp,
  641.       snr->snr1[0],
  642.       snr->snr1[1],
  643.       snr->snr1[2],
  644.       0,
  645.       0.0,
  646.       0.0,
  647.       0.0,
  648.       0,
  649.       snr->snra[0],
  650.       snr->snra[1],
  651.       snr->snra[2],
  652.       0,
  653.       (double)0.001*tot_time/img->number);
  654.   }
  655.   fclose(p_log);
  656. }
  657. /*!
  658.  ************************************************************************
  659.  * brief
  660.  *    Allocates a stand-alone partition structure.  Structure should
  661.  *    be freed by FreePartition();
  662.  *    data structures
  663.  *
  664.  * par Input:
  665.  *    n: number of partitions in the array
  666.  * par return
  667.  *    pointer to DataPartition Structure, zero-initialized
  668.  ************************************************************************
  669.  */
  670. DataPartition *AllocPartition(int n)
  671. {
  672.   DataPartition *partArr, *dataPart;
  673.   int i;
  674.   partArr = (DataPartition *) calloc(n, sizeof(DataPartition));
  675.   if (partArr == NULL)
  676.   {
  677.     snprintf(errortext, ET_SIZE, "AllocPartition: Memory allocation for Data Partition failed");
  678.     error(errortext, 100);
  679.   }
  680.   for (i=0; i<n; i++) // loop over all data partitions
  681.   {
  682.     dataPart = &(partArr[i]);
  683.     dataPart->bitstream = (Bitstream *) calloc(1, sizeof(Bitstream));
  684.     if (dataPart->bitstream == NULL)
  685.     {
  686.       snprintf(errortext, ET_SIZE, "AllocPartition: Memory allocation for Bitstream failed");
  687.       error(errortext, 100);
  688.     }
  689.     dataPart->bitstream->streamBuffer = (byte *) calloc(MAX_CODED_FRAME_SIZE, sizeof(byte));
  690.     if (dataPart->bitstream->streamBuffer == NULL)
  691.     {
  692.       snprintf(errortext, ET_SIZE, "AllocPartition: Memory allocation for streamBuffer failed");
  693.       error(errortext, 100);
  694.     }
  695.   }
  696.   return partArr;
  697. }
  698. /*!
  699.  ************************************************************************
  700.  * brief
  701.  *    Frees a partition structure (array).
  702.  *
  703.  * par Input:
  704.  *    Partition to be freed, size of partition Array (Number of Partitions)
  705.  *
  706.  * par return
  707.  *    None
  708.  *
  709.  * note
  710.  *    n must be the same as for the corresponding call of AllocPartition
  711.  ************************************************************************
  712.  */
  713. void FreePartition (DataPartition *dp, int n)
  714. {
  715.   int i;
  716.   assert (dp != NULL);
  717.   assert (dp->bitstream != NULL);
  718.   assert (dp->bitstream->streamBuffer != NULL);
  719.   for (i=0; i<n; i++)
  720.   {
  721.     free (dp[i].bitstream->streamBuffer);
  722.     free (dp[i].bitstream);
  723.   }
  724.   free (dp);
  725. }
  726. /*!
  727.  ************************************************************************
  728.  * brief
  729.  *    Allocates the slice structure along with its dependent
  730.  *    data structures
  731.  *
  732.  * par Input:
  733.  *    Input Parameters struct inp_par *inp,  ImageParameters *img
  734.  ************************************************************************
  735.  */
  736. void malloc_slice(struct inp_par *inp, ImageParameters *img)
  737. {
  738.   Slice *currSlice;
  739.   img->currentSlice = (Slice *) calloc(1, sizeof(Slice));
  740.   if ( (currSlice = img->currentSlice) == NULL)
  741.   {
  742.     snprintf(errortext, ET_SIZE, "Memory allocation for Slice datastruct in NAL-mode %d failed", inp->FileFormat);
  743.     error(errortext,100);
  744.   }
  745.   //  img->currentSlice->rmpni_buffer=NULL;
  746.   //! you don't know whether we do CABAC hre, hence initialize CABAC anyway
  747.   // if (inp->symbol_mode == CABAC)
  748.   if (1)
  749.   {
  750.     // create all context models
  751.     currSlice->mot_ctx = create_contexts_MotionInfo();
  752.     currSlice->tex_ctx = create_contexts_TextureInfo();
  753.   }
  754.   currSlice->max_part_nr = 3;  //! assume data partitioning (worst case) for the following mallocs()
  755.   currSlice->partArr = AllocPartition(currSlice->max_part_nr);
  756. }
  757. /*!
  758.  ************************************************************************
  759.  * brief
  760.  *    Memory frees of the Slice structure and of its dependent
  761.  *    data structures
  762.  *
  763.  * par Input:
  764.  *    Input Parameters struct inp_par *inp,  ImageParameters *img
  765.  ************************************************************************
  766.  */
  767. void free_slice(ImageParameters *img)
  768. {
  769.   Slice *currSlice = img->currentSlice;
  770.   FreePartition (currSlice->partArr, 3);
  771.   // if (inp->symbol_mode == CABAC)
  772.   if (1)
  773.   {
  774.     // delete all context models
  775.     delete_contexts_MotionInfo(currSlice->mot_ctx);
  776.     delete_contexts_TextureInfo(currSlice->tex_ctx);
  777.   }
  778.   free(img->currentSlice);
  779.   currSlice = NULL;
  780. }
  781. /*!
  782.  ************************************************************************
  783.  * brief
  784.  *    Dynamic memory allocation of frame size related global buffers
  785.  *    buffers are defined in global.h, allocated memory must be freed in
  786.  *    void free_global_buffers()
  787.  *
  788.  *  par Input:
  789.  *    Input Parameters struct inp_par *inp, Image Parameters ImageParameters *img
  790.  *
  791.  *  par Output:
  792.  *     Number of allocated bytes
  793.  ***********************************************************************
  794.  */
  795. int init_global_buffers(void)
  796. {
  797.   int memory_size=0;
  798.   int i;
  799.   if (global_init_done)
  800.   {
  801.     free_global_buffers();
  802.   }
  803.   // allocate memory for reference frame in find_snr
  804.   memory_size += get_mem2Dpel(&imgY_ref, img->height, img->width);
  805.   if (active_sps->chroma_format_idc != YUV400)
  806.     memory_size += get_mem3Dpel(&imgUV_ref, 2, img->height_cr, img->width_cr);
  807.   else
  808.     imgUV_ref=NULL;
  809.   // allocate memory in structure img
  810.   if( IS_INDEPENDENT(img) )
  811.   {
  812.     for( i=0; i<MAX_PLANE; i++ )
  813.     {
  814.       if(((img->mb_data_JV[i]) = (Macroblock *) calloc(img->FrameSizeInMbs, sizeof(Macroblock))) == NULL)
  815.         no_mem_exit("init_global_buffers: img->mb_data");
  816.     }
  817.     img->mb_data = NULL;
  818.   }
  819.   else
  820.   {
  821.     if(((img->mb_data) = (Macroblock *) calloc(img->FrameSizeInMbs, sizeof(Macroblock))) == NULL)
  822.       no_mem_exit("init_global_buffers: img->mb_data");
  823.   }
  824.   if(((img->intra_block) = (int*)calloc(img->FrameSizeInMbs, sizeof(int))) == NULL)
  825.     no_mem_exit("init_global_buffers: img->intra_block");
  826.   memory_size += get_mem2Dint(&PicPos,img->FrameSizeInMbs + 1,2);  //! Helper array to access macroblock positions. We add 1 to also consider last MB.
  827.   for (i = 0; i < (int) img->FrameSizeInMbs + 1;i++)
  828.   {
  829.     PicPos[i][0] = (i % img->PicWidthInMbs);
  830.     PicPos[i][1] = (i / img->PicWidthInMbs);
  831.   }
  832.   memory_size += get_mem2D(&(img->ipredmode), 4*img->FrameHeightInMbs, 4*img->PicWidthInMbs);
  833.   memory_size += get_mem3Dint(&(img->wp_weight), 2, MAX_REFERENCE_PICTURES, 3);
  834.   memory_size += get_mem3Dint(&(img->wp_offset), 6, MAX_REFERENCE_PICTURES, 3);
  835.   memory_size += get_mem4Dint(&(img->wbp_weight), 6, MAX_REFERENCE_PICTURES, MAX_REFERENCE_PICTURES, 3);
  836.   // CAVLC mem
  837.   memory_size += get_mem4Dint(&(img->nz_coeff), img->FrameSizeInMbs, 3, BLOCK_SIZE, BLOCK_SIZE);
  838.   memory_size += get_mem2Dint(&(img->siblock), img->FrameHeightInMbs, img->PicWidthInMbs);
  839.   global_init_done = 1;
  840.   img->oldFrameSizeInMbs = img->FrameSizeInMbs;
  841.   return (memory_size);
  842. }
  843. /*!
  844.  ************************************************************************
  845.  * brief
  846.  *    Free allocated memory of frame size related global buffers
  847.  *    buffers are defined in global.h, allocated memory is allocated in
  848.  *    int init_global_buffers()
  849.  *
  850.  * par Input:
  851.  *    Input Parameters struct inp_par *inp, Image Parameters ImageParameters *img
  852.  *
  853.  * par Output:
  854.  *    none
  855.  *
  856.  ************************************************************************
  857.  */
  858. void free_global_buffers(void)
  859. {
  860.   free_mem2Dpel (imgY_ref);
  861.   if (imgUV_ref)
  862.     free_mem3Dpel (imgUV_ref);
  863.   // CAVLC free mem
  864.   free_mem4Dint(img->nz_coeff);
  865.   free_mem2Dint(img->siblock);
  866.   // free mem, allocated for structure img
  867.   if (img->mb_data != NULL)
  868.     free(img->mb_data);
  869.   free_mem2Dint(PicPos);
  870.   free (img->intra_block);
  871.   free_mem2D(img->ipredmode);
  872.   free_mem3Dint(img->wp_weight);
  873.   free_mem3Dint(img->wp_offset);
  874.   free_mem4Dint(img->wbp_weight);
  875.   global_init_done = 0;
  876. }