Here's the module header for a movie player object from the movie player
I've been mucking with..
How's this look?
Now a problem I see is how to handle colourmodels;
Oh and the void* is simply an override for a pointer to <self>.
This IS C I'm using :)
G'day, eh? :)
- Teunis
#define MOVIE_FLAG_CPU 1 /* int* == # of CPU's */
#define MOVIE_FLAG_PREBUFFER 2 /* long* == prebuffer size */
struct plugin_movieFile
{
struct plugin root;
void (*printInfo)(void*, FILE* stream);
void (*setFlags)(void*, int flag, void* data);
void* (*getFlags)(void*, int flag);
int (*openFile)(void*, char* path);
/* error codes as per setFile + std. errno */
int (*setFile)(void*, FILE* inf);
/* return values:
0 = success
<0: errno code; follow as per fread/...
special codes:
ENXIO == can't open this way; must use a path.
(quicktime and mpeg currently)
ENOEXEC == bad file format; (should be available on most platforms)
Passing an open file descriptor means the caller has to handle a lot of
the potential problems;
ie: EEXIST:file not found, EACCES:access denied, ...
*/
int (*closeFile)(void*);
/* 0==success; <0==errno */
/* positioning functions: may not be available on streamed data */
/* all functions: 0 == success (except where otherwise stated) */
int (*has_video)(void*); /* 1 if yes, 0 if no */
long (*get_video_length)(void*);
long (*get_video_position)(void*);
int (*set_video_position)(void*, long pos);
int (*video_colormodel_avail)(void*, int colormodel);
int (*video_set_colormodel)(void*, int colormodel);
int (*video_width)(void*);
int (*video_height)(void*);
int (*video_read_frame)(void*,
unsigned char** rows, int w, int h);
int (*has_audio)(void*); /* 1 if yes, 0 if no */
long (*get_audio_length)(void*);
long (*get_audio_position)(void*);
int (*set_audio_position)(void*, long pos);
int (*audio_channels)(void* dt);
long (*audio_rate)(void* dt);
int (*audio_read_frame)(void*,unsigned short* dst, size_t samples,
int channel);
/* for now, audio data must be 16-bit signed. Convert it if needed! */
float (*frame_rate)(void*);
int (*read_completely)(void*);
/* read file completely */
/* needed for thread-coherency */
int (*lock_read)(void*);
int (*unlock_read)(void*);
};