87 lines
2.8 KiB
Text
87 lines
2.8 KiB
Text
Introduction to the libvo API
|
|
|
|
|
|
I - choosing an output module
|
|
|
|
typedef struct vo_driver_s {
|
|
char * name;
|
|
vo_open_t * open;
|
|
} vo_driver_t;
|
|
|
|
vo_driver_t * vo_drivers (void);
|
|
|
|
going thru the driver array, we find the driver entry with the name we
|
|
want, and use the associated setup field in the next steps. If we do
|
|
not specify a given name, the first entry in the array is always the
|
|
most reasonable default.
|
|
|
|
|
|
II - initializing the output module
|
|
|
|
vo_instance_t * vo_open (vo_open_t * open);
|
|
|
|
this function returns a libvo instance ; this instance can then be
|
|
passed to libmpeg2
|
|
|
|
|
|
III - setting up a video mode
|
|
|
|
int vo_setup (vo_instance_t * this, int width, int height);
|
|
|
|
This function initializes the libvo instance with the desired
|
|
resolution. On success it returns 0.
|
|
|
|
|
|
IV - displaying frames
|
|
|
|
struct vo_frame_s {
|
|
uint8_t * base[3]; /* pointer to 3 planes */
|
|
void (* copy) (vo_frame_t * frame, uint8_t **);
|
|
...
|
|
};
|
|
|
|
vo_frame_t * vo_get_frame (vo_instance_t * this, int flags);
|
|
|
|
This function is used to get a frame buffer before we start decoding a
|
|
frame. The flags are : VO_TOP_FIELD, VO_BOTTOM_FIELD, VO_BOTH_FIELDS -
|
|
indicate which field(s) will be decoded first, and VO_PREDICTION_FLAG
|
|
- used if the frame will be used by the decoder to predict future
|
|
frames, and must thus be conserved in memory for a longer time.
|
|
|
|
The frames will not be queried in the display order ; however we can
|
|
make a few assumptions : all frames with the VO_PREDICTION_FLAG will
|
|
be queried in display order, and all frames without the
|
|
VO_PREDICTION_FLAG will be queried in display order too. The
|
|
prediction frames must be kept in memory for a longer time ; however
|
|
it is never necessary to keep more than two prediction frames at any
|
|
point in time.
|
|
|
|
The base pointers in the frame points to allocated arrays that the
|
|
decoder will use as buffers for the decompressed picture. The queried
|
|
frame is not displayed yet, so we can work in these buffers without
|
|
worrying about display artefacts.
|
|
|
|
The copy function, if not set to NULL, is to be called each time we're
|
|
done decompressing 16 lines (from either one or both fields, as
|
|
indicated in the vo_get_frame flags). After that the decoder is free
|
|
to overwrite the picture buffers if this is not a prediction
|
|
frame. The intent of the copy function is to enhance the cache
|
|
behaviour by letting the libvo process the yuv data just after it is
|
|
decompressed - while it is still fresh in the cache.
|
|
|
|
void vo_field (vo_frame_t * frame, int flags);
|
|
|
|
If we had started decoding only one of the fields, this is used to
|
|
indicate when we start decoding the second field.
|
|
|
|
void vo_draw (vo_frame_t * frame);
|
|
|
|
This is called when we're done working on this frame and we want it
|
|
actually displayed.
|
|
|
|
|
|
V - closing the output instance
|
|
|
|
void vo_close (vo_instance_t * this);
|
|
|
|
Close the output instance and free the associated memory
|