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*); };