annexb.c
资源名称:chapter15.rar [点击查看]
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:4k
源码类别:
Audio
开发平台:
Visual C++
- /*!
- *************************************************************************************
- * file annexb.c
- *
- * brief
- * Annex B Byte Stream format NAL Unit writing routines
- *
- * author
- * Main contributors (see contributors.h for copyright, address and affiliation details)
- * - Stephan Wenger <stewe@cs.tu-berlin.de>
- *************************************************************************************
- */
- #include "global.h"
- #include "nalucommon.h"
- static FILE *f = NULL; // the output file
- /*!
- ********************************************************************************************
- * brief
- * Writes a NALU to the Annex B Byte Stream
- *
- * return
- * number of bits written
- *
- ********************************************************************************************
- */
- int WriteAnnexbNALU (NALU_t *n)
- {
- int BitsWritten = 0;
- int offset = 0;
- int length = 4;
- static const byte startcode[] = {0,0,0,1};
- byte first_byte;
- assert (n != NULL);
- assert (n->forbidden_bit == 0);
- assert (f != NULL);
- assert (n->startcodeprefix_len == 3 || n->startcodeprefix_len == 4);
- // printf ("WriteAnnexbNALU: writing %d bytes w/ startcode_len %dn", n->len+1, n->startcodeprefix_len);
- if (n->startcodeprefix_len < 4)
- {
- offset = 1;
- length = 3;
- }
- if ( length != fwrite (startcode+offset, 1, length, f))
- {
- printf ("Fatal: cannot write %d bytes to bitstream file, exit (-1)n", length);
- exit (-1);
- }
- BitsWritten = (length) << 3;
- first_byte = (unsigned char) ((n->forbidden_bit << 7) | (n->nal_reference_idc << 5) | n->nal_unit_type);
- if ( 1 != fwrite (&first_byte, 1, 1, f))
- {
- printf ("Fatal: cannot write %d bytes to bitstream file, exit (-1)n", 1);
- exit (-1);
- }
- BitsWritten += 8;
- // printf ("First Byte %x, nal_ref_idc %x, nal_unit_type %dn", first_byte, n->nal_reference_idc, n->nal_unit_type);
- if (n->len != fwrite (n->buf, 1, n->len, f))
- {
- printf ("Fatal: cannot write %d bytes to bitstream file, exit (-1)n", n->len);
- exit (-1);
- }
- BitsWritten += n->len * 8;
- fflush (f);
- #if TRACE
- fprintf (p_trace, "nnAnnex B NALU w/ %s startcode, len %d, forbidden_bit %d, nal_reference_idc %d, nal_unit_type %dnn",
- n->startcodeprefix_len == 4?"long":"short", n->len + 1, n->forbidden_bit, n->nal_reference_idc, n->nal_unit_type);
- fflush (p_trace);
- #endif
- return BitsWritten;
- }
- /*!
- ********************************************************************************************
- * brief
- * Opens the output file for the bytestream
- *
- * param Filename
- * The filename of the file to be opened
- *
- * return
- * none. Function terminates the program in case of an error
- *
- ********************************************************************************************
- */
- void OpenAnnexbFile (char *Filename)
- {
- if ((f = fopen (Filename, "wb")) == NULL)
- {
- printf ("Fatal: cannot open Annex B bytestream file '%s', exit (-1)n", Filename);
- exit (-1);
- }
- }
- /*!
- ********************************************************************************************
- * brief
- * Closes the output bit stream file
- *
- * return
- * none. Funtion trerminates the program in case of an error
- ********************************************************************************************
- */
- void CloseAnnexbFile(void)
- {
- if (fclose (f))
- {
- printf ("Fatal: cannot close Annex B bytestream file, exit (-1)n");
- exit (-1);
- }
- }