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

Reply via email to