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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SMPEG - SDL MPEG Player Library
  3.     Copyright (C) 1999  Loki Entertainment Software
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. */
  16. /* A virtual class to provide basic MPEG playback actions */
  17. #ifndef _MPEGACTION_H_
  18. #define _MPEGACTION_H_
  19. #include "SDL.h"
  20. #include "MPEGfilter.h"
  21. typedef enum {
  22.     MPEG_ERROR = -1,
  23.     MPEG_STOPPED,
  24.     MPEG_PLAYING
  25. } MPEGstatus;
  26. class MPEGaction {
  27. public:
  28.     MPEGaction() {
  29.         playing = false;
  30.         paused = false;
  31.         looping = false;
  32. play_time = 0.0;
  33.     }
  34.     virtual void Loop(bool toggle) {
  35.         looping = toggle;
  36.     }
  37.     virtual double Time(void) {  /* Returns the time in seconds since start */
  38.         return play_time;
  39.     }
  40.     virtual void Play(void) = 0;
  41.     virtual void Stop(void) = 0;
  42.     virtual void Rewind(void) = 0;
  43.     virtual void ResetSynchro(double) = 0;
  44.     virtual void Skip(float seconds) = 0;
  45.     virtual void Pause(void) {  /* A toggle action */
  46.         if ( paused ) {
  47.             paused = false;
  48.             Play();
  49.         } else {
  50.             Stop();
  51.             paused = true;
  52.         }
  53.     }
  54.     virtual MPEGstatus Status(void) = 0;
  55. protected:
  56.     bool playing;
  57.     bool paused;
  58.     bool looping;
  59.     double play_time;
  60.     void ResetPause(void) {
  61.         paused = false;
  62.     }
  63. };
  64. /* For getting info about the audio portion of the stream */
  65. typedef struct MPEG_AudioInfo {
  66.     int mpegversion;
  67.     int mode;
  68.     int frequency;
  69.     int layer;
  70.     int bitrate;
  71.     int current_frame;
  72. } MPEG_AudioInfo;
  73. /* Audio action class */
  74. class MPEGaudioaction : public MPEGaction {
  75. public:
  76.     virtual bool GetAudioInfo(MPEG_AudioInfo *info) {
  77.         return(true);
  78.     }
  79.     virtual void Volume(int vol) = 0;
  80. };
  81. /* Matches the declaration of SDL_UpdateRect() */
  82. typedef void(*MPEG_DisplayCallback)(SDL_Surface* dst, int x, int y,
  83.                                      unsigned int w, unsigned int h);
  84. /* For getting info about the video portion of the stream */
  85. typedef struct MPEG_VideoInfo {
  86.     int width;
  87.     int height;
  88.     int current_frame;
  89.     double current_fps;
  90. } MPEG_VideoInfo;
  91. /* Video action class */
  92. class MPEGvideoaction : public MPEGaction {
  93. public:
  94.     virtual void SetTimeSource(MPEGaudioaction *source) {
  95.         time_source = source;
  96.     }
  97.     virtual bool GetVideoInfo(MPEG_VideoInfo *info) {
  98.         return(false);
  99.     }
  100.     virtual bool SetDisplay(SDL_Surface *dst, SDL_mutex *lock,
  101.                                 MPEG_DisplayCallback callback) = 0;
  102.     virtual void MoveDisplay(int x, int y) = 0;
  103.     virtual void ScaleDisplayXY(int w, int h) = 0;
  104.     virtual void SetDisplayRegion(int x, int y, int w, int h) = 0;
  105.     virtual void RenderFrame(int frame) = 0;
  106.     virtual void RenderFinal(SDL_Surface *dst, int x, int y) = 0;
  107.     virtual SMPEG_Filter * Filter(SMPEG_Filter * filter) = 0;
  108. protected:
  109.     MPEGaudioaction *time_source;
  110. };
  111. /* For getting info about the system portion of the stream */
  112. typedef struct MPEG_SystemInfo {
  113.     int total_size;
  114.     int current_offset;
  115.     double total_time;
  116.     double current_time;
  117. } MPEG_SystemInfo;
  118. #endif /* _MPEGACTION_H_ */