/*
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 class used to parse and play MPEG streams */
#ifndef _MPEG_H_
#define _MPEG_H_
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "SDL.h"
#include "MPEGerror.h"
#include "MPEGstream.h"
#include "MPEGaction.h"
#include "MPEGaudio.h"
#include "MPEGvideo.h"
#include "MPEGsystem.h"
#include "MPEGfilter.h"
#define LENGTH_TO_CHECK_FOR_SYSTEM 0x50000 // Added by HanishKVC
/* The main MPEG class - parses system streams and creates other streams
A few design notes:
Making this derived from MPEGstream allows us to do system stream
parsing. We create an additional MPEG object for each type of
stream in the MPEG file because each needs a separate pointer to
the MPEG data. The MPEG stream then creates an accessor object to
do all the data parsing for that stream type. It's a little odd,
but seemed like the best way to implement stream parsing.
*/
class MPEG : public MPEGerror
{
public:
/* Michel Darricau from eProcess <mdarricau@eprocess.fr> need for override in popcorn */
MPEG():MPEGerror(){}
MPEG(bool Sdlaudio, char *addresse,char *asset,long buffersize){}
MPEG(const char * name, bool SDLaudio = true);
MPEG(int Mpeg_FD, bool SDLaudio = true);
MPEG(void *data, int size, bool SDLaudio = true);
MPEG(SDL_RWops *mpeg_source,bool SDLaudio = true);
virtual ~MPEG();
/* Initialize the MPEG */
void Init(SDL_RWops *mpeg_source, bool SDLaudio);
void InitErrorState();
/* Enable/Disable audio and video */
bool AudioEnabled(void);
void EnableAudio(bool enabled);
bool VideoEnabled(void);
void EnableVideo(bool enabled);
/* MPEG actions */
void Loop(bool toggle);
/* Michel Darricau from eProcess <mdarricau@eprocess.fr> need for override in popcorn */
virtual void Play(void);
void Stop(void);
void Rewind(void);
/* Michel Darricau from eProcess <mdarricau@eprocess.fr> need for override in popcorn */
virtual void Pause(void);
virtual void Seek(int bytes);
void Skip(float seconds);
/* Michel Darricau from eProcess <mdarricau@eprocess.fr> need for override in popcorn */
MPEGstatus GetStatus(void);
void GetSystemInfo(MPEG_SystemInfo *info);
/* MPEG audio actions */
bool GetAudioInfo(MPEG_AudioInfo *info);
void Volume(int vol);
bool WantedSpec(SDL_AudioSpec *wanted);
void ActualSpec(SDL_AudioSpec *actual);
MPEGaudio *GetAudio(void);
/* MPEG video actions */
bool GetVideoInfo(MPEG_VideoInfo *info);
bool SetDisplay(SDL_Surface *dst, SDL_mutex *lock,
MPEG_DisplayCallback callback);
void MoveDisplay(int x, int y);
void ScaleDisplayXY(int w, int h);
void SetDisplayRegion(int x, int y, int w, int h);
void RenderFrame(int frame);
void RenderFinal(SDL_Surface *dst, int x, int y);
SMPEG_Filter * Filter(SMPEG_Filter * filter);
public:
/* We need to have separate audio and video streams */
MPEGstream * audiostream;
MPEGstream * videostream;
MPEGsystem * system;
protected:
char *mpeg_mem; // Used to copy MPEG passed in as memory
SDL_RWops *source;
MPEGaudioaction *audioaction;
MPEGvideoaction *videoaction;
MPEGaudio *audio;
MPEGvideo *video;
bool audioaction_enabled;
bool videoaction_enabled;
bool sdlaudio;
bool loop;
bool pause;
void parse_stream_list();
bool seekIntoStream(int position);
};
#endif /* _MPEG_H_ */