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

Audio

开发平台:

Visual C++

  1. /*!
  2.  **************************************************************************************
  3.  * file
  4.  *    filehandle.c
  5.  * brief
  6.  *    Start and terminate sequences
  7.  * author
  8.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  9.  *      - Thomas Stockhammer            <stockhammer@ei.tum.de>
  10.  *      - Detlev Marpe                  <marpe@hhi.de>
  11.  ***************************************************************************************
  12.  */
  13. #include "contributors.h"
  14. #include "global.h"
  15. #include "enc_statistics.h"
  16. #include "rtp.h"
  17. #include "annexb.h"
  18. #include "parset.h"
  19. #include "mbuffer.h"
  20. /*!
  21.  ************************************************************************
  22.  * brief
  23.  *    Error handling procedure. Print error message to stderr and exit
  24.  *    with supplied code.
  25.  * param text
  26.  *    Error message
  27.  * param code
  28.  *    Exit code
  29.  ************************************************************************
  30.  */
  31. void error(char *text, int code)
  32. {
  33.   fprintf(stderr, "%sn", text);
  34.   flush_dpb();
  35.   exit(code);
  36. }
  37. /*!
  38.  ************************************************************************
  39.  * brief
  40.  *     This function generates and writes the PPS
  41.  *
  42.  ************************************************************************
  43.  */
  44. int write_PPS(int len, int PPS_id)
  45. {
  46.   NALU_t *nalu;
  47.   nalu = NULL;
  48.   nalu = GeneratePic_parameter_set_NALU (PPS_id);
  49.   len += WriteNALU (nalu);
  50.   FreeNALU (nalu);
  51.   return len;
  52. }
  53. /*!
  54.  ************************************************************************
  55.  * brief
  56.  *    This function opens the output files and generates the
  57.  *    appropriate sequence header
  58.  ************************************************************************
  59.  */
  60. int start_sequence(void)
  61. {
  62.   int i,len=0, total_pps = (params->GenerateMultiplePPS) ? 3 : 1;
  63.   NALU_t *nalu;
  64.   switch(params->of_mode)
  65.   {
  66.     case PAR_OF_ANNEXB:
  67.       OpenAnnexbFile (params->outfile);
  68.       WriteNALU = WriteAnnexbNALU;
  69.       break;
  70.     case PAR_OF_RTP:
  71.       OpenRTPFile (params->outfile);
  72.       WriteNALU = WriteRTPNALU;
  73.       break;
  74.     default:
  75.       snprintf(errortext, ET_SIZE, "Output File Mode %d not supported", params->of_mode);
  76.       error(errortext,1);
  77.       return 1;
  78.   }
  79.   //! As a sequence header, here we write both sequence and picture
  80.   //! parameter sets.  As soon as IDR is implemented, this should go to the
  81.   //! IDR part, as both parsets have to be transmitted as part of an IDR.
  82.   //! An alternative may be to consider this function the IDR start function.
  83.   nalu = NULL;
  84.   nalu = GenerateSeq_parameter_set_NALU ();
  85.   len += WriteNALU (nalu);
  86.   FreeNALU (nalu);
  87.   //! Lets write now the Picture Parameter sets. Output will be equal to the total number of bits spend here.
  88.   for (i=0;i<total_pps;i++)
  89.   {
  90.      len = write_PPS(len, i);
  91.   }
  92.   if (params->GenerateSEIMessage)
  93.   {
  94.     nalu = NULL;
  95.     nalu = GenerateSEImessage_NALU();
  96.     len += WriteNALU (nalu);
  97.     FreeNALU (nalu);
  98.   }
  99.   stats->bit_ctr_parametersets_n = len;
  100.   return 0;
  101. }
  102. /*!
  103.  ************************************************************************
  104.  * brief
  105.  *    This function opens the output files and generates the
  106.  *    appropriate sequence header
  107.  ************************************************************************
  108.  */
  109. int rewrite_paramsets(void)
  110. {
  111.   int i,len=0, total_pps = (params->GenerateMultiplePPS) ? 3 : 1;
  112.   NALU_t *nalu;
  113.   //! As a sequence header, here we write both sequence and picture
  114.   //! parameter sets.  As soon as IDR is implemented, this should go to the
  115.   //! IDR part, as both parsets have to be transmitted as part of an IDR.
  116.   //! An alternative may be to consider this function the IDR start function.
  117.   nalu = NULL;
  118.   nalu = GenerateSeq_parameter_set_NALU ();
  119.   len += WriteNALU (nalu);
  120.   FreeNALU (nalu);
  121.   //! Lets write now the Picture Parameter sets. Output will be equal to the total number of bits spend here.
  122.   for (i=0;i<total_pps;i++)
  123.   {
  124.      len = write_PPS(len, i);
  125.   }
  126.   if (params->GenerateSEIMessage)
  127.   {
  128.     nalu = NULL;
  129.     nalu = GenerateSEImessage_NALU();
  130.     len += WriteNALU (nalu);
  131.     FreeNALU (nalu);
  132.   }
  133.   stats->bit_ctr_parametersets_n = len;
  134.   return 0;
  135. }
  136. /*!
  137.  ************************************************************************
  138.  * brief
  139.  *     This function terminates the sequence and closes the
  140.  *     output files
  141.  ************************************************************************
  142.  */
  143. int terminate_sequence(void)
  144. {
  145. //  Bitstream *currStream;
  146.   // Mainly flushing of everything
  147.   // Add termination symbol, etc.
  148.   switch(params->of_mode)
  149.   {
  150.     case PAR_OF_ANNEXB:
  151.       CloseAnnexbFile();
  152.       break;
  153.     case PAR_OF_RTP:
  154.       CloseRTPFile();
  155.       return 0;
  156.     default:
  157.       snprintf(errortext, ET_SIZE, "Output File Mode %d not supported", params->of_mode);
  158.       error(errortext,1);
  159.       return 1;
  160.   }
  161.   return 1;   // make lint happy
  162. }