/*
SMPEG - SDL MPEG Player Library
Copyright (C) 1999 Loki Entertainment Software
- Modified by Michel Darricau from eProcess <mdarricau@eprocess.fr> for popcorn -
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* A virtual class to provide basic MPEG playback actions */
#ifndef _MPEGACTION_H_
#define _MPEGACTION_H_
#include "SDL.h"
#include "MPEGfilter.h"
typedef enum {
MPEG_ERROR = -1,
MPEG_STOPPED,
MPEG_PLAYING
} MPEGstatus;
class MPEGaction {
public:
MPEGaction() {
playing = false;
paused = false;
looping = false;
play_time = 0.0;
}
virtual void Loop(bool toggle) {
looping = toggle;
}
virtual double Time(void) { /* Returns the time in seconds since start */
return play_time;
}
virtual void Play(void) = 0;
virtual void Stop(void) = 0;
virtual void Rewind(void) = 0;
virtual void ResetSynchro(double) = 0;
virtual void Skip(float seconds) = 0;
virtual void Pause(void) { /* A toggle action */
if ( paused ) {
paused = false;
Play();
} else {
Stop();
paused = true;
}
}
/* Michel Darricau from eProcess <mdarricau@eprocess.fr> conflict name in popcorn */
virtual MPEGstatus GetStatus(void) = 0;
protected:
bool playing;
bool paused;
bool looping;
double play_time;
bool force_exit;
void ResetPause(void) {
paused = false;
}
};
/* For getting info about the audio portion of the stream */
typedef struct MPEG_AudioInfo {
int mpegversion;
int mode;
int frequency;
int layer;
int bitrate;
int current_frame;
} MPEG_AudioInfo;
/* Audio action class */
class MPEGaudioaction : public MPEGaction {
public:
virtual bool GetAudioInfo(MPEG_AudioInfo *info) {
return(true);
}
virtual void Volume(int vol) = 0;
};
/* Matches the declaration of SDL_UpdateRect() */
typedef void(*MPEG_DisplayCallback)(SDL_Surface* dst, int x, int y,
unsigned int w, unsigned int h);
/* For getting info about the video portion of the stream */
typedef struct MPEG_VideoInfo {
int width;
int height;
int current_frame;
double current_fps;
} MPEG_VideoInfo;
/* Video action class */
class MPEGvideoaction : public MPEGaction {
public:
virtual void SetTimeSource(MPEGaudioaction *source) {
time_source = source;
}
virtual bool GetVideoInfo(MPEG_VideoInfo *info) {
return(false);
}
virtual bool SetDisplay(SDL_Surface *dst, SDL_mutex *lock,
MPEG_DisplayCallback callback) = 0;
virtual void MoveDisplay(int x, int y) = 0;
virtual void ScaleDisplayXY(int w, int h) = 0;
virtual void SetDisplayRegion(int x, int y, int w, int h) = 0;
virtual void RenderFrame(int frame) = 0;
virtual void RenderFinal(SDL_Surface *dst, int x, int y) = 0;
virtual SMPEG_Filter * Filter(SMPEG_Filter * filter) = 0;
protected:
MPEGaudioaction *time_source;
};
/* For getting info about the system portion of the stream */
typedef struct MPEG_SystemInfo {
int total_size;
int current_offset;
double total_time;
double current_time;
} MPEG_SystemInfo;
#endif /* _MPEGACTION_H_ */