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

流媒体/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_media.h - provides CPlayerMedia class, which defines the
  23.  * interface to a particular media steam.
  24.  */
  25. #ifndef __PLAYER_MEDIA_H__
  26. #define __PLAYER_MEDIA_H__ 1
  27. #include <SDL.h>
  28. #include <SDL_thread.h>
  29. #include <sdp/sdp.h>
  30. #include <rtsp/rtsp_client.h>
  31. #include <rtp/rtp.h>
  32. #include "our_bytestream.h"
  33. #include "our_msg_queue.h"
  34. #include "codec_plugin.h"
  35. class CPlayerSession;
  36. class CAudioSync;
  37. class CVideoSync;
  38. class C2ConsecIpPort;
  39. class COurInByteStream;
  40. class CRtpByteStreamBase;
  41. class CPlayerMedia {
  42.  public:
  43.   CPlayerMedia(CPlayerSession *p);
  44.   ~CPlayerMedia();
  45.   /* API routine - create - for RTP stream */
  46.   int create_streaming(media_desc_t *sdp_media,
  47.        char *errmsg,
  48.        uint32_t errlen,
  49.        int on_demand,
  50.        int use_rtsp,
  51.        int media_number_in_session);
  52.   /* API routine - create - where we provide the bytestream */
  53.   int create_from_file (COurInByteStream *b, int is_video);
  54.   /* API routine - play, pause */
  55.   int do_play(double start_time_offset = 0.0);
  56.   int do_pause(void);
  57.   int is_video(void) { return (m_is_video); };
  58.   double get_max_playtime(void);
  59.   /* API routine - interface for decoding start/continue */
  60.   void start_decoding(void);
  61.   void bytestream_primed(void); 
  62.   /* API routine - ip port information */
  63.   uint16_t get_our_port (void) { return m_our_port; };
  64.   void set_server_port (uint16_t port) { m_server_port = port; };
  65.   uint16_t get_server_port (void) { return m_server_port; };
  66.   media_desc_t *get_sdp_media_desc (void) { return m_media_info; };
  67.   void set_source_addr (char *s)
  68.     {
  69.       if (m_source_addr != NULL) free(m_source_addr);
  70.       m_source_addr = s;
  71.     }
  72.   const char *get_source_addr(void);
  73.   CPlayerMedia *get_next (void) { return m_next; };
  74.   void set_next (CPlayerMedia *newone) { m_next = newone; };
  75.   int decode_thread(void);
  76.   /* Public RTP routines  - receive thread, callback, and routines to
  77.    * pass information from rtsp to rtp byte stream
  78.    */
  79.   int recv_thread(void);
  80.   void recv_callback(struct rtp *session, rtp_event *e);
  81.   void set_rtp_ssrc (uint32_t ssrc)
  82.     { m_rtp_ssrc = ssrc; m_rtp_ssrc_set = TRUE;};
  83.   void set_rtp_base_ts(uint32_t time);
  84.   void set_rtp_base_seq(uint16_t seq);
  85.   
  86.   void set_video_sync(CVideoSync *p) {m_video_sync = p;};
  87.   void set_audio_sync(CAudioSync *p) {m_audio_sync = p;};
  88.   const video_info_t *get_video_info (void) { return m_video_info; };
  89.   const audio_info_t *get_audio_info (void) { return m_audio_info; };
  90.   int create_video_plugin(const codec_plugin_t *p,
  91.   format_list_t *sdp_media,
  92.   video_info_t *video,
  93.   const uint8_t *user_data,
  94.   uint32_t userdata_size);
  95.   int create_audio_plugin(const codec_plugin_t *p,
  96.   format_list_t *sdp_media,
  97.   audio_info_t *audio,
  98.   const uint8_t *user_data,
  99.   uint32_t userdata_size);
  100.   void set_plugin_data (const codec_plugin_t *p, 
  101. codec_data_t *d, 
  102. video_vft_t *v, 
  103. audio_vft_t *a);
  104.   int get_plugin_status(char *buffer, uint32_t buflen);
  105.   void set_user_data (const uint8_t *udata, int length) {
  106.     m_user_data = udata;
  107.     m_user_data_size = length;
  108.   }
  109.   rtsp_session_t *get_rtsp_session(void) { return m_rtsp_session; };
  110.   void rtp_init_tcp(void);
  111.   void rtp_periodic(void);
  112.   void rtp_start(void);
  113.   void rtp_end(void);
  114.   int rtp_receive_packet(unsigned char interleaved, struct rtp_packet *, int len);
  115.   int rtcp_send_packet(uint8_t *buffer, int buflen);
  116.   int get_rtp_media_number (void) { return m_rtp_media_number_in_session; };
  117.  private:
  118.   int create_common(int is_video, char *errmsg, uint32_t errlen);
  119.   void wait_on_bytestream(void);
  120.   int m_streaming;
  121.   int m_is_video;
  122.   int m_paused;
  123.   CPlayerMedia *m_next;
  124.   CPlayerSession *m_parent;
  125.   media_desc_t *m_media_info;
  126.   format_list_t *m_media_fmt;        // format currently running.
  127.   rtsp_session_t *m_rtsp_session;
  128.   C2ConsecIpPort *m_ports;
  129.   in_port_t m_our_port;
  130.   in_port_t m_server_port;
  131.   char *m_source_addr;
  132.   time_t m_start_time;
  133.   int m_stream_ondemand;
  134.   int m_sync_time_set;
  135.   uint64_t m_sync_time_offset;
  136.   uint32_t m_rtptime_tickpersec;
  137.   double m_play_start_time;
  138.   // Receive thread variables
  139.   SDL_Thread *m_recv_thread;
  140.   /*************************************************************************
  141.    * RTP variables - used to pass info to the bytestream
  142.    *************************************************************************/
  143.   int m_rtp_ondemand;
  144.   int m_rtp_use_rtsp;
  145.   int m_rtp_media_number_in_session;
  146.   int m_rtp_buffering;
  147.   struct rtp *m_rtp_session;
  148.   CRtpByteStreamBase *m_rtp_byte_stream;
  149.   CMsgQueue m_rtp_msg_queue;
  150.   rtp_packet *m_head, *m_tail; 
  151.   uint32_t m_rtp_queue_len;
  152.   
  153.   // from rtsp...
  154.   int m_rtp_ssrc_set;
  155.   uint32_t m_rtp_ssrc;
  156.   int m_rtsp_base_ts_received;
  157.   uint32_t m_rtp_base_ts;
  158.   int m_rtsp_base_seq_received;
  159.   uint16_t m_rtp_base_seq;
  160.   int determine_payload_type_from_rtp(void);
  161.   void clear_rtp_packets(void);
  162.   // from rtcp, for broadcast, in case we get an RTCP before we determine
  163.   // the payload type
  164.   uint32_t m_rtcp_ntp_frac;
  165.   uint32_t m_rtcp_ntp_sec;
  166.   uint32_t m_rtcp_rtp_ts;
  167.   int m_rtcp_received;
  168.   volatile int m_rtp_inited;
  169.   /*************************************************************************
  170.    * Decoder thread variables
  171.    *************************************************************************/
  172.   SDL_Thread *m_decode_thread;
  173.   volatile int m_decode_thread_waiting;
  174.   SDL_sem *m_decode_thread_sem;
  175.   const codec_plugin_t *m_plugin;
  176.   codec_data_t *m_plugin_data;
  177.   
  178.   // State change variable
  179.   CMsgQueue m_decode_msg_queue;
  180.   // Private routines
  181.   int process_rtsp_transport(char *transport);
  182.   CAudioSync *m_audio_sync;
  183.   CVideoSync *m_video_sync;
  184.   void parse_decode_message(int &thread_stop, int &decoding);
  185.   COurInByteStream *m_byte_stream;
  186.   video_info_t *m_video_info;
  187.   audio_info_t *m_audio_info;
  188.   const uint8_t *m_user_data;
  189.   int m_user_data_size;
  190. };
  191. int process_rtsp_rtpinfo(char *rtpinfo, 
  192.  CPlayerSession *session,
  193.  CPlayerMedia *media);
  194. extern audio_vft_t audio_vft;
  195. extern video_vft_t video_vft;
  196. #ifdef _WIN32
  197. #include "player_util.h"
  198. DEFINE_MESSAGE_MACRO(media_message, "media")
  199. #else
  200. #define media_message(loglevel, fmt...) message(loglevel, "media", fmt)
  201. #endif
  202. #endif