player_session.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_session.h - provides definitions for a CPlayerSession.
  23.  * CPlayerSession is the base class that provides a combination audio/video
  24.  * stream/file playback.
  25.  * This class should be the main interface between any outside functionality
  26.  * and the player window.
  27.  */
  28. #ifndef __PLAYER_SESSION_H__
  29. #define __PLAYER_SESSION_H__
  30. #include <rtsp/rtsp_client.h>
  31. #include <sdp/sdp.h>
  32. #include "our_msg_queue.h"
  33. #include "ip_port.h"
  34. typedef enum {
  35.   SESSION_PAUSED,
  36.   SESSION_BUFFERING,
  37.   SESSION_PLAYING,
  38.   SESSION_DONE
  39. } session_state_t;
  40. class CPlayerMedia;
  41. class CAudioSync;
  42. class CVideoSync;
  43. typedef void (*media_close_callback_f)(void *);
  44. class CPlayerSession {
  45.  public:
  46.   /*
  47.    * API routine - create player session.
  48.    */
  49.   CPlayerSession(CMsgQueue *master_queue,
  50.  SDL_sem *master_sem,
  51.  const char *name);
  52.   /*
  53.    * API routine - destroy session - free all sub-structures, cleans
  54.    * up rtsp, etc
  55.    */
  56.   ~CPlayerSession();
  57.   /*
  58.    * API routine - create a rtsp session with the url.  After that, you
  59.    * need to associate media
  60.    */
  61.   int create_streaming_broadcast(session_desc_t *sdp,
  62.  char *ermsg,
  63.  uint32_t errlen);
  64.   int create_streaming_ondemand(const char *url,
  65. char *errmsg,
  66. uint32_t errlen,
  67. int use_rtp_tcp);
  68.   /*
  69.    * API routine - play at time.  If start_from_begin is FALSE, start_time
  70.    * and we're paused, it will continue from where it left off.
  71.    */
  72.   int play_all_media(int start_from_begin = FALSE, double start_time = 0.0);
  73.   /*
  74.    * API routine - pause
  75.    */
  76.   int pause_all_media(void);
  77.   /*
  78.    * API routine for media set up - associate a created
  79.    * media with the session.
  80.    */
  81.   void add_media(CPlayerMedia *m);
  82.   /*
  83.    * API routine - returns sdp info for streamed session
  84.    */
  85.   session_desc_t *get_sdp_info (void) { return m_sdp_info;} ;
  86.   rtsp_client_t *get_rtsp_client (void) { return m_rtsp_client; };
  87.   /*
  88.    * API routine - after setting up media, need to set up sync thread
  89.    */
  90.   void set_up_sync_thread(void);
  91.   CVideoSync *set_up_video_sync(void);
  92.   CAudioSync *set_up_audio_sync(void);
  93.   /*
  94.    * API routine - get the current time
  95.    */
  96.   uint64_t get_playing_time (void) {
  97.     if (m_streaming && session_is_seekable() == 0) {
  98.       return (m_current_time - m_first_time_played);
  99.     }
  100.     return (m_current_time);
  101.   };
  102.   /*
  103.    * API routine - get max play time
  104.    */
  105.   double get_max_time (void);
  106.   /*
  107.    * Other API routines
  108.    */
  109.   int session_has_audio(void);
  110.   int session_has_video(void);
  111.   void set_audio_volume(int volume);
  112.   int get_audio_volume(void) { return m_audio_volume; };
  113.   void set_screen_location(int x, int y);
  114.   void set_screen_size(int scaletimes2, int fullscreen = 0);
  115.   void session_set_seekable (int seekable) {
  116.     m_seekable = seekable;
  117.   };
  118.   int session_is_seekable (void) {
  119.     return (m_seekable);
  120.   };
  121.   session_state_t get_session_state(void) {
  122.     return (m_session_state);
  123.   }
  124.   void set_media_close_callback (media_close_callback_f mccf,
  125.  void *mccd) {
  126.     m_media_close_callback = mccf;
  127.     m_media_close_callback_data = mccd;
  128.   }
  129.   int session_is_network (int &on_demand, int &rtp_over_rtsp) {
  130.     if (m_streaming == 0) {
  131.       return 0;
  132.     }
  133.     if (m_seekable) { 
  134.       on_demand = 1;
  135.       rtp_over_rtsp = m_rtp_over_rtsp;
  136.     } else {
  137.       on_demand = 0;
  138.       rtp_over_rtsp = 0;
  139.     }
  140. return 1;
  141.   }
  142.   /*
  143.    * Non-API routines - used for c interfaces, for sync task APIs.
  144.    */
  145.   void wake_sync_thread (void) {
  146.     SDL_SemPost(m_sync_sem);
  147.   }
  148.   int send_sync_thread_a_message(uint32_t msgval,
  149.  unsigned char *msg = NULL,
  150.  uint32_t msg_len = 0)
  151.     {
  152.       return (m_sync_thread_msg_queue.send_message(msgval, msg, msg_len, m_sync_sem));
  153.     };
  154.   int sync_thread(int state);
  155.   uint64_t get_current_time(void);
  156.   void audio_is_ready (uint64_t latency, uint64_t time);
  157.   void adjust_start_time(int64_t delta);
  158.   int session_control_is_aggregate (void) {
  159.     return m_session_control_is_aggregate;
  160.   };
  161.   void set_session_control (int is_aggregate) {
  162.     m_session_control_is_aggregate = is_aggregate;
  163.   }
  164.   CPlayerMedia *rtsp_url_to_media (const char *url);
  165.   int set_session_desc (int line, const char *desc);
  166.   const char *get_session_desc(int line);
  167.   void streaming_media_set_up(void) { m_streaming_media_set_up = 1; };
  168.   CIpPort **get_unused_ip_port_ptr(void) { return &m_unused_ports; };
  169.  private:
  170.   void process_sdl_events(void);
  171.   int process_msg_queue(int state);
  172.   int sync_thread_init(void);
  173.   int sync_thread_wait_sync(void);
  174.   int sync_thread_wait_audio(void);
  175.   int sync_thread_playing(void);
  176.   int sync_thread_paused(void);
  177.   int sync_thread_done(void);
  178.   const char *m_session_name;
  179.   const char *m_content_base;
  180.   int m_paused;
  181.   int m_streaming;
  182.   uint64_t m_current_time; // current time playing
  183.   uint64_t m_start;
  184.   uint64_t m_latency;
  185.   int m_clock_wrapped;
  186.   uint64_t m_play_start_time;
  187.   session_desc_t *m_sdp_info;
  188.   rtsp_client_t *m_rtsp_client;
  189.   CPlayerMedia *m_my_media;
  190.   CAudioSync *m_audio_sync;
  191.   CVideoSync *m_video_sync;
  192.   SDL_Thread *m_sync_thread;
  193.   SDL_sem *m_sync_sem;
  194.   CMsgQueue *m_master_msg_queue;
  195.   SDL_sem *m_master_msg_queue_sem;
  196.   CMsgQueue m_sync_thread_msg_queue;
  197.   range_desc_t *m_range;
  198.   int m_session_control_is_aggregate;
  199.   int m_waiting_for_audio;
  200.   int m_audio_volume;
  201.   int m_screen_scale;
  202.   int m_fullscreen;
  203.   int m_seekable;
  204.   volatile int m_sync_pause_done;
  205.   session_state_t m_session_state;
  206.   int m_screen_pos_x;
  207.   int m_screen_pos_y;
  208.   int m_hardware_error;
  209.   #define SESSION_DESC_COUNT 4
  210.   const char *m_session_desc[SESSION_DESC_COUNT];
  211.   media_close_callback_f m_media_close_callback;
  212.   void *m_media_close_callback_data;
  213.   int m_streaming_media_set_up;
  214.   CIpPort *m_unused_ports;
  215.   int m_rtp_over_rtsp;
  216.   uint64_t m_first_time_played;
  217. };
  218. int c_sync_thread(void *data);
  219. #endif