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

流媒体/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 __RTP_BYTESTREAM_H__
  26. #define __RTP_BYTESTREAM_H__ 1
  27. #include "our_bytestream.h"
  28. #include "player_util.h"
  29. #include "rtp/rtp.h"
  30. #include <SDL.h>
  31. #include <SDL_thread.h>
  32. #include <sdp/sdp.h>
  33. class CRtpByteStreamBase : public COurInByteStream
  34. {
  35.  public:
  36.   CRtpByteStreamBase(const char *name,
  37.      format_list_t *fmt,
  38.      unsigned int rtp_pt,
  39.      int ondemand,
  40.      uint64_t tickpersec,
  41.      rtp_packet **head, 
  42.      rtp_packet **tail,
  43.      int rtp_seq_set,
  44.      uint16_t rtp_base_seq,
  45.      int rtp_ts_set,
  46.      uint32_t rtp_base_ts,
  47.      int rtcp_received,
  48.      uint32_t ntp_frac,
  49.      uint32_t ntp_sec,
  50.      uint32_t rtp_ts);
  51.   ~CRtpByteStreamBase();
  52.   int eof (void) { return m_eof; };
  53.   virtual void reset(void) {
  54.     player_debug_message("rtp bytestream reset");
  55.     init();
  56.     m_buffering = 0;
  57.     m_rtp_base_ts_set = 0;
  58.     m_rtp_base_seq_set = 0;
  59.   };
  60.   void set_skip_on_advance (uint32_t bytes_to_skip) {
  61.     m_skip_on_advance_bytes = bytes_to_skip;
  62.   };
  63.   double get_max_playtime (void) { 
  64.     if (m_fmt->media->media_range.have_range) {
  65.       return m_fmt->media->media_range.range_end;
  66.     } else if (m_fmt->media->parent->session_range.have_range) {
  67.       return m_fmt->media->parent->session_range.range_end;
  68.     }
  69.     return 0.0; 
  70.   };
  71.   // various routines for RTP interface.
  72.   void set_rtp_base_ts(uint32_t t) { m_rtp_base_ts_set = 1; m_rtp_base_ts = t;};
  73.   void set_rtp_base_seq(uint16_t s) { 
  74.     m_rtp_base_seq_set = 1;
  75.     m_rtp_base_seq = s;
  76.   };
  77.   void set_wallclock_offset (uint64_t wclock, uint32_t rtp_ts);
  78.   int rtp_ready (void) {
  79.     return (m_stream_ondemand | m_wallclock_offset_set);
  80.   };
  81.   void recv_callback(struct rtp *session, rtp_event *e);
  82.   virtual void flush_rtp_packets(void);
  83.   int recv_task(int waiting);
  84.   uint32_t get_last_rtp_timestamp (void) {return m_rtptime_last; };
  85.   void remove_packet_rtp_queue(rtp_packet *pak, int free);
  86.  protected:
  87.   void init(void);
  88.   // Make sure all classes call this to calculate real time.
  89.   uint64_t rtp_ts_to_msec(uint32_t ts, uint64_t &wrap_offset);
  90.   rtp_packet *m_head, *m_tail;
  91.   int m_offset_in_pak;
  92.   uint32_t m_skip_on_advance_bytes;
  93.   uint32_t m_ts;
  94.   uint64_t m_total;
  95.   int m_rtp_base_ts_set;
  96.   uint32_t m_rtp_base_ts;
  97.   int m_rtp_base_seq_set;
  98.   uint16_t m_rtp_base_seq;
  99.   uint64_t m_rtptime_tickpersec;
  100.   int m_stream_ondemand;
  101.   uint64_t m_wrap_offset;
  102.   int m_wallclock_offset_set;
  103.   uint64_t m_wallclock_offset;
  104.   uint32_t m_wallclock_rtp_ts;
  105.   uint64_t m_wallclock_offset_wrap;
  106.   void calculate_wallclock_offset_from_rtcp(uint32_t ntp_frac,
  107.     uint32_t ntp_sec,
  108.     uint32_t rtp_ts);
  109.   SDL_mutex *m_rtp_packet_mutex;
  110.   int m_buffering;
  111.   uint64_t m_rtp_buffer_time;
  112.   unsigned int m_rtp_pt;
  113.   virtual int check_rtp_frame_complete_for_payload_type(void);
  114.   virtual void rtp_done_buffering(void) {};
  115.   uint32_t m_rtptime_last;
  116.   int m_doing_add;
  117.   uint32_t m_add;
  118.   int m_recvd_pak;
  119.   int m_recvd_pak_timeout;
  120.   uint64_t m_recvd_pak_timeout_time;
  121.   uint64_t m_last_realtime;
  122.   format_list_t *m_fmt;
  123.   int m_eof;
  124.   int m_rtpinfo_set_from_pak;
  125. };
  126. class CRtpByteStream : public CRtpByteStreamBase
  127. {
  128.  public:
  129.   CRtpByteStream(const char *name,
  130.  format_list_t *fmt,
  131.  unsigned int rtp_pt,
  132.  int ondemand,
  133.  uint64_t tickpersec,
  134.  rtp_packet **head, 
  135.  rtp_packet **tail,
  136.  int rtp_seq_set,
  137.  uint16_t rtp_base_seq,
  138.  int rtp_ts_set,
  139.  uint32_t rtp_base_ts,
  140.  int rtcp_received,
  141.  uint32_t ntp_frac,
  142.  uint32_t ntp_sec,
  143.  uint32_t rtp_ts);
  144.   ~CRtpByteStream();
  145.   uint64_t start_next_frame(uint8_t **buffer, uint32_t *buflen,
  146.     void **userdata);
  147.   int can_skip_frame (void) { return 1; } ;
  148.   int skip_next_frame(uint64_t *ts, int *havesync, uint8_t **buffer,
  149.       uint32_t *buflen);
  150.   void used_bytes_for_frame(uint32_t bytes);
  151.   int have_no_data(void);
  152.   void flush_rtp_packets(void);
  153.   void reset(void);
  154.  protected:
  155.   uint8_t *m_buffer;
  156.   uint32_t m_buffer_len;
  157.   uint32_t m_buffer_len_max;
  158.   uint32_t m_bytes_used;
  159. };
  160. class CAudioRtpByteStream : public CRtpByteStream
  161. {
  162.  public:
  163.   CAudioRtpByteStream(unsigned int rtp_pt,
  164.       format_list_t *fmt,
  165.       int ondemand,
  166.       uint64_t tickpersec,
  167.       rtp_packet **head, 
  168.       rtp_packet **tail,
  169.       int rtp_seq_set,
  170.       uint16_t rtp_base_seq,
  171.       int rtp_ts_set,
  172.       uint32_t rtp_base_ts,
  173.       int rtcp_received,
  174.       uint32_t ntp_frac,
  175.       uint32_t ntp_sec,
  176.       uint32_t rtp_ts);
  177.   ~CAudioRtpByteStream();
  178.   int have_no_data(void);
  179.   int check_rtp_frame_complete_for_payload_type(void);
  180.   uint64_t start_next_frame(uint8_t **buffer, uint32_t *buflen,
  181.     void **userdata);
  182.   void reset(void);
  183.  private:
  184.   rtp_packet *m_working_pak;
  185. };
  186. int add_rtp_packet_to_queue(rtp_packet *pak,
  187.     rtp_packet **head,
  188.     rtp_packet **tail);
  189. #endif