Subversion Repositories Games.Descent

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 pmbaty 1
/* A class based on the MPEG stream class, used to parse the system stream */
2
 
3
/* - Modified by Michel Darricau from eProcess <mdarricau@eprocess.fr>  for popcorn - */
4
 
5
#ifndef _MPEGSYSTEM_H_
6
#define _MPEGSYSTEM_H_
7
#define USE_SYSTEM_TIMESTAMP
8
 
9
#include "SDL.h"
10
#include "SDL_thread.h"
11
#include "MPEGerror.h"
12
 
13
class MPEGstream;
14
 
15
/* MPEG System library
16
   by Vivien Chappelier */
17
 
18
/* The system class is necessary for splitting the MPEG stream into */
19
/* peaces of data that will be sent to the audio or video decoder.  */
20
 
21
class MPEGsystem : public MPEGerror
22
{
23
public:
24
        /* Michel Darricau from eProcess <mdarricau@eprocess.fr>  need for override in popcorn */
25
    MPEGsystem() {}
26
    MPEGsystem(SDL_RWops *mpeg_source);
27
    virtual ~MPEGsystem();
28
 
29
    /* Buffered I/O functions */
30
    void RequestBuffer();
31
    bool Wait();
32
    Uint32 Tell();
33
    void Rewind();
34
                /* Michel Darricau from eProcess <mdarricau@eprocess.fr>  need for override in popcorn */
35
    virtual void Start();
36
    void Stop();
37
    bool Eof() const;
38
                /* Michel Darricau from eProcess <mdarricau@eprocess.fr>  need for override in popcorn */
39
    virtual bool Seek(int length);
40
    virtual Uint32 TotalSize();
41
    virtual double TotalTime();
42
    virtual double TimeElapsedAudio(int atByte);
43
 
44
    /* Skip "seconds" seconds */
45
    void Skip(double seconds);
46
 
47
    /* Create all the streams present in the MPEG */
48
    MPEGstream ** GetStreamList();
49
 
50
    /* Insert a stream in the list */
51
    void add_stream(MPEGstream * stream);
52
 
53
    /* Search for a stream in the list */
54
    MPEGstream * get_stream(Uint8 stream_id);
55
 
56
    /* Test if a stream is in the list */
57
    Uint8 exist_stream(Uint8 stream_id, Uint8 mask);
58
 
59
    /* Reset all the system streams */
60
    void reset_all_streams();
61
 
62
    /* Set eof for all streams */
63
    void end_all_streams();
64
 
65
                /* Michel Darricau from eProcess <mdarricau@eprocess.fr>  need for override in popcorn */
66
    /* Seek the first header */
67
    virtual bool seek_first_header();
68
 
69
                /* Michel Darricau from eProcess <mdarricau@eprocess.fr>  need for override in popcorn */
70
    /* Seek the next header */
71
    virtual bool seek_next_header();
72
 
73
protected:
74
    /* Run the loop to fill the stream buffers */
75
    static bool SystemLoop(MPEGsystem *system);
76
 
77
                /* Michel Darricau from eProcess <mdarricau@eprocess.fr>  need for override in popcorn */
78
    /* Fill a buffer */
79
    virtual Uint8 FillBuffer();
80
 
81
    /* Read a new packet */
82
    virtual void Read();
83
 
84
    /* The system thread which fills the FIFO */
85
    static int SystemThread(void * udata);
86
 
87
    SDL_RWops *source;
88
 
89
    SDL_Thread * system_thread;
90
    bool system_thread_running;
91
 
92
    MPEGstream ** stream_list;
93
 
94
    Uint8 * read_buffer;
95
    Uint8 * pointer;
96
    int read_size;
97
    Uint32 read_total;
98
    Uint32 packet_total;
99
    int request;
100
    SDL_semaphore * request_wait;
101
    SDL_mutex * system_mutex;
102
 
103
    bool endofstream;
104
    bool errorstream;
105
 
106
    double frametime;
107
    double stream_timestamp;
108
 
109
#ifdef USE_SYSTEM_TIMESTAMP
110
    /* Current timestamp for this stream */
111
    double timestamp;
112
    double timedrift;
113
    double skip_timestamp;
114
#endif
115
};
116
#endif
117