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

Audio

开发平台:

Visual C++

  1. /*!
  2.  ************************************************************************
  3.  * file  nalu.c
  4.  *
  5.  * brief
  6.  *    Decoder NALU support functions
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *    - Stephan Wenger   <stewe@cs.tu-berlin.de>
  11.  ************************************************************************
  12.  */
  13. #include "global.h"
  14. #include "nalu.h"
  15. #include "annexb.h"
  16. #include "rtp.h"
  17. /*!
  18.  *************************************************************************************
  19.  * brief
  20.  *    Converts a NALU to an RBSP
  21.  *
  22.  * param
  23.  *    nalu: nalu structure to be filled
  24.  *
  25.  * return
  26.  *    length of the RBSP in bytes
  27.  *************************************************************************************
  28.  */
  29. int NALUtoRBSP (NALU_t *nalu)
  30. {
  31.   assert (nalu != NULL);
  32.   nalu->len = EBSPtoRBSP (nalu->buf, nalu->len, 1) ;
  33.   return nalu->len ;
  34. }
  35. /*!
  36. ************************************************************************
  37. * brief
  38. *    Read the next NAL unit (with error handling)
  39. ************************************************************************
  40. */
  41. int read_next_nalu(FILE *bitstream, NALU_t *nalu)
  42. {
  43.   int ret;
  44.   if (params->FileFormat == PAR_OF_ANNEXB)
  45.     ret = GetAnnexbNALU (bitstream, nalu);
  46.   else
  47.     ret = GetRTPNALU (bitstream, nalu);
  48.   if (ret < 0)
  49.   {
  50.     snprintf (errortext, ET_SIZE, "Error while getting the NALU in file format %s, exitn", params->FileFormat==PAR_OF_ANNEXB?"Annex B":"RTP");
  51.     error (errortext, 601);
  52.   }
  53.   if (ret == 0)
  54.   {
  55.     FreeNALU(nalu);
  56.     return 0;
  57.   }
  58.   //In some cases, zero_byte shall be present. If current NALU is a VCL NALU, we can't tell
  59.   //whether it is the first VCL NALU at this point, so only non-VCL NAL unit is checked here.
  60.   CheckZeroByteNonVCL(nalu);
  61.   ret = NALUtoRBSP(nalu);
  62.   if (ret < 0)
  63.     error ("Invalid startcode emulation prevention found.", 602);
  64.   // Got a NALU
  65.   if (nalu->forbidden_bit)
  66.   {
  67.     error ("Found NALU with forbidden_bit set, bit error?", 603);
  68.   }
  69.   return nalu->len;
  70. }