⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filehandle.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************************* COPYRIGHT AND WARRANTY INFORMATION** Copyright 2001, International Telecommunications Union, Geneva** DISCLAIMER OF WARRANTY** These software programs are available to the user without any* license fee or royalty on an "as is" basis. The ITU disclaims* any and all warranties, whether express, implied, or* statutory, including any implied warranties of merchantability* or of fitness for a particular purpose.  In no event shall the* contributor or the ITU be liable for any incidental, punitive, or* consequential damages of any kind whatsoever arising from the* use of these programs.** This disclaimer of warranty extends to the user of these programs* and user's customers, employees, agents, transferees, successors,* and assigns.** The ITU does not represent or warrant that the programs furnished* hereunder are free of infringement of any third-party patents.* Commercial implementations of ITU-T Recommendations, including* shareware, may be subject to royalty fees to patent holders.* Information regarding the ITU-T patent policy is available from* the ITU Web site at http://www.itu.int.** THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE ITU-T PATENT POLICY.*************************************************************************//*! ************************************************************************************** * \file *    filehandle.c * \brief *    Handles the operations how to write *    the generated symbols on the interim file format or some *    other specified output formats * \author *    Main contributors (see contributors.h for copyright, address and affiliation details) *      - Thomas Stockhammer            <stockhammer@ei.tum.de> *      - Detlev Marpe                  <marpe@hhi.de> *************************************************************************************** */#include "contributors.h"#include <string.h>#include <math.h>#include <time.h>#include <sys/timeb.h>#include <stdlib.h>#include <assert.h>#include <string.h>#include "global.h"#include "header.h"#include "rtp.h"// Global Varibalesstatic FILE *out;   //!< output file/*   The implemented solution for a unified picture header*//*! ************************************************************************ * \brief *    Error handling procedure. Print error message to stderr and exit *    with supplied code. * \param text *    Error message * \param code *    Exit code ************************************************************************ */void error(char *text, int code){  fprintf(stderr, "%s\n", text);  exit(code);}/*! ************************************************************************ * \brief *    This function opens the output files and generates the *    appropriate sequence header ************************************************************************ */int start_sequence(){  int len;  switch(input->of_mode)  {    case PAR_OF_26L:#ifndef H26L_LIB      if ((out=fopen(input->outfile,"wb"))==NULL)      {          snprintf(errortext, ET_SIZE, "Error open file %s  \n",input->outfile);          error(errortext,1);      }#endif      len = SequenceHeader(out);      return 0;    case PAR_OF_RTP:      if ((out=fopen(input->outfile,"wb"))==NULL)      {          snprintf(errortext, ET_SIZE, "Error open file %s  \n",input->outfile);          error(errortext,1);      }      len = SequenceHeader(out);      return len;          default:      snprintf(errortext, ET_SIZE, "Output File Mode %d not supported", input->of_mode);      error(errortext,1);      return 1;  }}/*! ************************************************************************ * \brief *     This function terminates the sequence and closes the *     output files ************************************************************************ */int terminate_sequence(){  Bitstream *currStream;  // Mainly flushing of everything  // Add termination symbol, etc.  switch(input->of_mode)  {    case PAR_OF_26L:      currStream = ((img->currentSlice)->partArr[0]).bitstream;      if (input->symbol_mode == UVLC)      {        // Current TML File Format        // Get the trailing bits of the last slice        currStream->bits_to_go  = currStream->stored_bits_to_go;        currStream->byte_pos    = currStream->stored_byte_pos;        currStream->byte_buf    = currStream->stored_byte_buf;        if (currStream->bits_to_go < 8)   // there are bits left in the last byte          currStream->streamBuffer[currStream->byte_pos++] = currStream->byte_buf;        // Write all remaining bits to output bitstream file#ifdef H26L_LIB        memcpy(&memout[memoutlength], currStream->streamBuffer, 			currStream->byte_pos);		memoutlength += currStream->byte_pos;#else        fwrite (currStream->streamBuffer, 1, currStream->byte_pos, out);        fclose(out);#endif      }      else      {        // CABAC File Format        fclose(out);      }      return 0;    case PAR_OF_RTP:      fclose (out);      return 0;    default:      snprintf(errortext, ET_SIZE, "Output File Mode %d not supported", input->of_mode);      error(errortext,1);      return 1;  }}/*! ************************************************************************ *  \brief *     This function generates the appropriate slice *     header * *  \return number of bits used for the picture header, including the PSC. * *  \par Side effects: *      Adds picture header symbols to the symbol buffer * *  \par Remarks: *      THIS IS AN INTERIM SOLUTION FOR A PICTURE HEADER, see VCEG-M79 *                                                                               \par *      Generates the Picture Header out of the information in img_par and inp-par, *      and writes it to the symbol buffer.  The structure of the Picture Header *      is discussed in VCEG-M79.  It is implemented as discussed there.  In addition, *      it is preceeded by a picture start code, a UVLC-codeword of LEN=31 and INFO = 0. *      It would have been possible to put information into this codeword, similar *      to designs earlier than TML 5.9.  But it is deemed that the waste of 15 *      data bits is acceptable considering the advantages of being able to search *      for a picture header quickly and easily, by looking for 30 consecutive, byte- *      aligned zero bits. *                                                                               \par *      The accounting of the header length (variable len) relies on the side effect *      of writeUVLCSymbol() that sets len and info in the symbol variable parameter *************************************************************************/int start_slice(SyntaxElement *sym){  EncodingEnvironmentPtr eep;  Slice *currSlice = img->currentSlice;  Bitstream *currStream;  int header_len;  int i;  switch(input->of_mode)  {    case PAR_OF_26L:      if (input->symbol_mode == UVLC)      {        currStream = (currSlice->partArr[0]).bitstream;        // the information given in the SliceHeader is far not enought if we want to be able        // to do some errorconcealment.        // So write PictureHeader and SliceHeader in any case.       header_len = PictureHeader();   // Picture Header       header_len += SliceHeader (0);  // Slice Header without Start Code               return header_len;      }      else      {                   // H.26: CABAC File Format        eep = &((currSlice->partArr[0]).ee_cabac);        currStream = (currSlice->partArr[0]).bitstream;        assert (currStream->bits_to_go == 8);        assert (currStream->byte_buf == 0);        assert (currStream->byte_pos == 0);        memset(currStream->streamBuffer, 0, 12);    // fill first 12 bytes with zeros (debug only)        // the information given in the SliceHeader is far not enought if we want to be able        // to do some errorconcealment.        // So write PictureHeader and SliceHeader in any case.        header_len = PictureHeader();   // Picture Header        header_len += SliceHeader (0);  // Slice Header without Start Code                // Note that PictureHeader() and SliceHeader() set the buffer pointers as a side effect        // Hence no need for adjusting it manually (and preserving space to be patched later        // reserve bits for d_MB_Nr        currStream->header_len = header_len;        currStream->header_byte_buffer = currStream->byte_buf;        currStream->byte_pos += ((31-currStream->bits_to_go)/8);        if ((31-currStream->bits_to_go)%8 != 0)          currStream->byte_pos++;        currStream->bits_to_go = 8;        currStream->byte_pos++;        // If there is an absolute need to communicate the partition size, this would be        // the space to insert it        arienco_start_encoding(eep, currStream->streamBuffer, &(currStream->byte_pos));        // initialize context models        init_contexts_MotionInfo(currSlice->mot_ctx, 1);        init_contexts_TextureInfo(currSlice->tex_ctx, 1);        return header_len;      }        case PAR_OF_RTP:      if (img->current_mb_nr == 0)                       // new picture        RTPUpdateTimestamp (img->tr);      if (input->symbol_mode == UVLC)      {        header_len=RTPSliceHeader();                      // generate the slice header        currStream = currSlice->partArr[0].bitstream;                if (header_len % 8 != 0)        {          currStream->byte_buf <<= currStream->bits_to_go;          currStream->bits_to_go=8;          currStream->streamBuffer[currStream->byte_pos++]=currStream->byte_buf;          currStream->byte_buf=0;        }        return header_len;      }      else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -