isma_rtp_bytestream.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  *              Bill May        wmay@cisco.com
  20.  */
  21. /*
  22.  * player_rtp_bytestream.h - provides an RTP bytestream for the codecs
  23.  * to access
  24.  */
  25. #ifndef __ISMA_RTP_BYTESTREAM_H__
  26. #define __ISMA_RTP_BYTESTREAM_H__ 1
  27. #include "rtp_bytestream.h"
  28. #include <mp4util/mpeg4_sdp.h>
  29. #include "bitstream/bitstream.h"
  30. //#define ISMA_RTP_DUMP_OUTPUT_TO_FILE 1
  31. //#define DEBUG_ISMA_RTP_FRAGS 1
  32. // fragment information
  33. typedef struct isma_frag_data_t {
  34.   struct isma_frag_data_t *frag_data_next;
  35.   rtp_packet *pak;
  36.   uint8_t *frag_ptr;
  37.   uint32_t frag_len;
  38. } isma_frag_data_t;
  39. typedef struct isma_frame_data_t {
  40.   struct isma_frame_data_t *frame_data_next;
  41.   rtp_packet *pak;
  42.   uint8_t *frame_ptr;
  43.   uint32_t frame_len;
  44.   int last_in_pak;
  45.   uint32_t rtp_timestamp;
  46.   int is_fragment;
  47.   isma_frag_data_t *frag_data;
  48. } isma_frame_data_t;
  49. class CIsmaAudioRtpByteStream : public CRtpByteStreamBase
  50. {
  51.  public:
  52.   CIsmaAudioRtpByteStream(format_list_t *media_fmt,
  53.   fmtp_parse_t *fmtp,
  54.   unsigned int rtp_pt,
  55.   int ondemand,
  56.   uint64_t tickpersec,
  57.   rtp_packet **head, 
  58.   rtp_packet **tail,
  59.   int rtp_seq_set,
  60.   uint16_t rtp_base_seq,
  61.   int rtp_ts_set,
  62.   uint32_t rtp_base_ts,
  63.   int rtcp_received,
  64.   uint32_t ntp_frac,
  65.   uint32_t ntp_sec,
  66.   uint32_t rtp_ts);
  67.   ~CIsmaAudioRtpByteStream();
  68.   void reset(void);
  69.   int have_no_data(void);
  70.   uint64_t start_next_frame(uint8_t **buffer, uint32_t *buflen,
  71.     void **userdata);
  72.   void used_bytes_for_frame(uint32_t byte);
  73.   void flush_rtp_packets(void);
  74.  private:
  75. #ifdef ISMA_RTP_DUMP_OUTPUT_TO_FILE
  76.   FILE *m_outfile;
  77. #endif
  78.   isma_frame_data_t *m_frame_data_head;
  79.   isma_frame_data_t *m_frame_data_on;
  80.   isma_frame_data_t *m_frame_data_free;
  81.   uint32_t m_frame_data_max;
  82.   uint32_t m_rtp_ts_add;
  83.   void process_packet_header(void);
  84.   int insert_frame_data(isma_frame_data_t *pak);
  85.   isma_frame_data_t *get_frame_data (void) {
  86.     isma_frame_data_t *pak;
  87.     if (m_frame_data_free == NULL) {
  88.       player_debug_message("Mallocing m_frame_data");
  89.       pak = (isma_frame_data_t *)malloc(sizeof(isma_frame_data_t));
  90.       if (pak == NULL) return NULL;
  91.     } else {
  92.       pak = m_frame_data_free;
  93.       m_frame_data_free = pak->frame_data_next;
  94.     }
  95.     pak->frame_data_next = NULL;
  96.     pak->last_in_pak = 0;
  97.     return (pak);
  98.   }
  99.   CBitstream m_header_bitstream;
  100.   fmtp_parse_t m_fmtp;
  101.   int m_min_first_header_bits;
  102.   int m_min_header_bits;
  103.   void get_au_header_bits(void);
  104.   void cleanup_frag(isma_frame_data_t * frame_data);
  105.   int process_fragment(rtp_packet *pak, isma_frame_data_t *frame_data);
  106.   uint8_t *m_frag_reass_buffer;
  107.   uint32_t m_frag_reass_size;
  108.   uint32_t m_frag_reass_size_max;
  109. };
  110. #endif