diff options
author | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2009-09-18 16:27:55 +0300 |
---|---|---|
committer | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2009-09-18 17:12:53 +0300 |
commit | 350fc4f5a2f6f4fdf9cc689d786d525f6397df5d (patch) | |
tree | 4f133589230adc4d87d296d5b7300b811c941bdd /libvo/video_out.h | |
parent | 6847e5e297821bdb56ec978100243bc452f508f4 (diff) | |
download | mpv-350fc4f5a2f6f4fdf9cc689d786d525f6397df5d.tar.bz2 mpv-350fc4f5a2f6f4fdf9cc689d786d525f6397df5d.tar.xz |
core/VO: Allow VO drivers to add/modify frames
Add interfaces to allow VO drivers to add or remove frames from the
video stream and to alter timestamps. Currently this functionality
only works with in correct-pts mode. Use the new functionality in
vo_vdpau to properly support frame-adding deinterlace modes.
Frames added by the VDPAU deinterlacing code are now properly timed.
Before every second frame was always shown immediately (probably next
monitor refresh) after the previous one, even if you were watching
things in slow motion, and framestepping didn't stop at them at all.
When seeking the deinterlace algorithm is no longer fed a mix of
frames from old and new positions.
As a side effect of the changes a problem with resize events was also
fixed. Resizing calls video_to_output_surface() to render the frame at
the new resolution, but before this function also changed the list of
history frames, so resizing could give an image different from the
original one, and also corrupt next frames due to them seeing the
wrong history. Now the function has no such side effects. There are
more resize-related problems though that will be fixed in a later
commit.
The deint_mpi[] list of reserved frames is increased from 2 to 3
entries for reasons related to the above. Having 2 entries is enough
when you initially get a new frame in draw_image() because then you'll
have those two entries plus the new one for a total of 3 (the code
relied on the oldest mpi implicitly staying reserved for the duration
of the call even after usage count was decreased). However if you want
to be able to reproduce the rendering outside draw_image(), relying on
the explicitly reserved list only, then it needs to store 3 entries.
Diffstat (limited to 'libvo/video_out.h')
-rw-r--r-- | libvo/video_out.h | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/libvo/video_out.h b/libvo/video_out.h index a911bfdd03..4ddeaa827e 100644 --- a/libvo/video_out.h +++ b/libvo/video_out.h @@ -129,10 +129,14 @@ typedef struct vo_info_s struct vo; struct osd_state; +struct mp_image; struct vo_driver { // Driver uses new API bool is_new; + // Driver buffers or adds (deinterlace) frames and will keep track + // of pts values itself + bool buffer_frames; // This is set if the driver is not new and contains pointers to // old-API functions to be used instead of the ones below. @@ -164,6 +168,16 @@ struct vo_driver { */ int (*control)(struct vo *vo, uint32_t request, void *data); + void (*draw_image)(struct vo *vo, struct mp_image *mpi, double pts); + + /* + * Get extra frames from the VO, such as those added by VDPAU + * deinterlace. Preparing the next such frame if any could be done + * automatically by the VO after a previous flip_page(), but having + * it as a separate step seems to allow making code more robust. + */ + void (*get_buffered_frame)(struct vo *vo, bool eof); + /* * Draw a planar YUV slice to the buffer: * params: @@ -214,6 +228,10 @@ struct vo_old_functions { struct vo { int config_ok; // Last config call was successful? int config_count; // Total number of successful config calls + + bool frame_loaded; // Is there a next frame the VO could flip to? + double next_pts; // pts value of the next frame if any + const struct vo_driver *driver; void *priv; struct MPOpts *opts; @@ -251,11 +269,14 @@ int vo_config(struct vo *vo, uint32_t width, uint32_t height, void list_video_out(void); int vo_control(struct vo *vo, uint32_t request, void *data); +int vo_draw_image(struct vo *vo, struct mp_image *mpi, double pts); +int vo_get_buffered_frame(struct vo *vo, bool eof); int vo_draw_frame(struct vo *vo, uint8_t *src[]); int vo_draw_slice(struct vo *vo, uint8_t *src[], int stride[], int w, int h, int x, int y); void vo_draw_osd(struct vo *vo, struct osd_state *osd); void vo_flip_page(struct vo *vo); void vo_check_events(struct vo *vo); +void vo_seek_reset(struct vo *vo); void vo_destroy(struct vo *vo); |