playback_window.h
上传用户:psq1974
上传日期:2007-01-06
资源大小:1195k
文件大小:5k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /* Copyright (C) 1998, 1999 State University of New York at Stony Brook
  2.    Author: Andrew V. Shuvalov ( andrew@ecsl.cs.sunysb.edu )
  3.    Software license is located in file "COPYING"
  4. */
  5. #ifndef _playback_window_h_
  6. #define _playback_window_h_
  7. #undef  HAVE_UNISTD_H
  8. #include <mtvp/mtvp.h>
  9. #undef   assert
  10. #include <string>
  11. #include <vector>
  12. #include <queue>
  13. #include <stack>
  14. #include "session.h"
  15. #include "basic_exception.h"
  16. #include "../../pusher/src/timeval.h"
  17. #include "../../pusher/src/sockaddr.h"
  18. #include "../../pusher/src/packet_header.h"
  19. #include "movie_item.h"
  20. /** manage mpeg player. Should be only single instance.
  21.     The new SIH plugin interface for mpeg-tv operates through URL.
  22.     So the play source is defined by calling COM_OPEN_STREAM_URL.
  23.     Plug-in doesn't handle the difference between playback and broadcast 
  24.     handles. Instead plug-in keeps all sockets on and build the map of 
  25.     all existing URL's to corresponding socket. If entry already exists in
  26.     the tree - no needs to re-open it.
  27.  */
  28. class PlaybackWindow 
  29. {
  30.   /** reference to Session */
  31.   Session &session;
  32.   /** only one player */
  33.   PMP_STRUCT Player;
  34.   /** always holds the latest push server control port */
  35.   Sockaddr pushServControlAddr;
  36.   /** send/receive messages to push server by UDP socket */
  37.   int serverSocketOut;
  38.   /** to compare incoming packets with */
  39.   //struct sockaddr_in serverSockaddr;
  40.   /** remember the time when last packet was received. Play if timeout */
  41.   Timeval lastPacketReceivedTime;
  42.   /** if stopped or paused - buffer incoming stream, if playing - put data 
  43.       immediately in pipe
  44.   */
  45.   int playerState;
  46.   /** what user wants */
  47.   int playerStateMustBe;
  48.   bool playerIsReady;
  49.   /** both playback window and SII plugin must be sinchronized
  50.       to the same mode
  51.   */
  52.   typedef enum { playback, broadcast } operatingModeT;
  53.   /** playback or broadcast mode. The stopped mode is not used - to keep
  54.       data consistent application should check playerStateMustBe.
  55.       The only difference between p. and b. modes is that in p. mode, when
  56.       stopped, client must post the stop message to push server. In
  57.       brcst mode, it just have to stop reading the port.
  58.   */
  59.   operatingModeT operatingMode;
  60.   /** remember the id of movie which is playing now
  61.    */
  62.   int currentMovieId;
  63.   /** this handler is used to deal with sih plugin.
  64.       To get the handler_id of an SIH plugin, you should ask for the
  65.       return status of the COM_SIH_LINK message.
  66.       If the status indicates that no error occured (i.e. if you get a
  67.       message of type A2G_COM_RETURN_SUCCESS in return), the handler_id
  68.       is passed back in the data.data_return_success.value of the
  69.       A2G_COM_RETURN_SUCCESS message.
  70.   */
  71.   int sih_handler_id;
  72.   /** When calling plug-in with flag PMP_FLAG_RETURN_STATUS, dispatcher may
  73.       take actions on return value. It must know, what command requested
  74.       status
  75.   */
  76.   typedef enum { nothing, plugin_link } command_requested_statusT;
  77.   /** value */
  78.   command_requested_statusT command_requested_status;
  79.   /** set flag that tell that player is in state of shutdown, don't throw
  80.       exceptions, etc.
  81.   */
  82.   bool cleanup_flag;
  83.   
  84. public:
  85.   PlaybackWindow( const char *argv0, Session &ses );
  86.   void prepare_to_die();
  87.   ~PlaybackWindow();
  88. protected:
  89.   /** don't open any listen socket at that time
  90.    */
  91.   void init_player( const char *argv0 );
  92. public:
  93.   /** At the beginning, player does not open any socket.
  94.       Player play is operated by 3 functions: playback_mode,
  95.       broadcast_mode and stop. Plugin is designed the way that you
  96.       must just post the URL which describe the protocol, optionally
  97.       the server and the listen sock number. It take care to open
  98.       socket. When stopped, player actually does not close the socket,
  99.       but discontinue to read it. Parameters of the push server are 
  100.       inside each movieFiles item
  101.   */
  102.   void playback_mode( const MovieFilesT &movieFiles, 
  103.       struct tm t, int movid );
  104.   void broadcast_mode( const string &url );
  105.   void stop();
  106.   /** periodically called */
  107.   void timeout();
  108. protected:
  109.   void check_player_msgs();
  110.   void process_feedback( const PMP_DATA_A2G *data, int size );
  111.   void wait_player_msg_sec( int sec );
  112. };
  113. /**
  114.  */
  115. class PlayerException : public BasicException {
  116. public:
  117.   PlayerException( int line, const char *format, ... );
  118. };
  119. /** prefix of URL that our plug-in may handle
  120.  */
  121. const char plugin_url_prefix[] = "sbvideo://";
  122. /** messages from player 
  123.  */
  124. struct mtv_msg {
  125.   /** params: debug - data is string, int_param is verbose level
  126.       timestamp - data is struct timeval
  127.   */
  128.   enum typeT { error = 0, debug = 1, timestamp = 2 };
  129.   typeT type;
  130.   int int_param;
  131.   /** the first byte
  132.    */
  133.   char data[1];
  134. };
  135. #endif  //  _playback_window_h_