openbsd-ports/multimedia/xine-lib/patches/patch-src_xine-engine_video_out_c
dcoppa 6b929c59fb - Get rid of the use of libtool's -tag=disable-static.
- Merge in a whole bunch of various fixes from upstream and add
  comments for the existing fixes which didn't have a comment in
  the patch.

From Brad; OK sthen@
2011-05-11 09:05:54 +00:00

76 lines
3.5 KiB
Plaintext

$OpenBSD: patch-src_xine-engine_video_out_c,v 1.10 2011/05/11 09:05:55 dcoppa Exp $
- Disable decoder flush from video out to avoid decoding errors.
- Fixes two issues of video out standard cropping feature.
Resulting left and right cropping parameters should be multiple of 2.
Left cropping offset calculation to YUY2 frames fixed.
--- src/xine-engine/video_out.c.orig Mon May 9 21:02:46 2011
+++ src/xine-engine/video_out.c Mon May 9 21:10:23 2011
@@ -533,8 +533,8 @@ static int vo_frame_draw (vo_frame_t *img, xine_stream
xine_list_iterator_t ite;
/* add cropping requested by frontend */
- img->crop_left += this->crop_left;
- img->crop_right += this->crop_right;
+ img->crop_left = (img->crop_left + this->crop_left) & ~1;
+ img->crop_right = (img->crop_right + this->crop_right) & ~1;
img->crop_top += this->crop_top;
img->crop_bottom += this->crop_bottom;
@@ -1124,6 +1124,11 @@ static void paused_loop( vos_t *this, int64_t vpts )
pthread_mutex_unlock( &this->free_img_buf_queue->mutex );
}
+static void video_out_update_disable_flush_from_video_out(void *disable_decoder_flush_from_video_out, xine_cfg_entry_t *entry)
+{
+ *(int *)disable_decoder_flush_from_video_out = entry->num_value;
+}
+
static void *video_out_loop (void *this_gen) {
int64_t vpts, diff;
@@ -1131,6 +1136,7 @@ static void *video_out_loop (void *this_gen) {
vos_t *this = (vos_t *) this_gen;
int64_t next_frame_vpts = 0;
int64_t usec_to_sleep;
+ int disable_decoder_flush_from_video_out;
#ifndef WIN32
/* nice(-value) will fail silently for normal users.
@@ -1141,6 +1147,16 @@ static void *video_out_loop (void *this_gen) {
nice(-2);
#endif /* WIN32 */
+ disable_decoder_flush_from_video_out = this->xine->config->register_bool(this->xine->config, "engine.decoder.disable_flush_from_video_out", 0,
+ _("disable decoder flush from video out"),
+ _("video out causes a decoder flush when video out runs out of frames for displaying,\n"
+ "because the decoder hasn't deliverd new frames for quite a while.\n"
+ "flushing the decoder causes decoding errors for images decoded after the flush.\n"
+ "to avoid the decoding errors, decoder flush at video out should be disabled.\n\n"
+ "WARNING: as the flush was introduced to fix some issues when playing DVD still images, it is\n"
+ "likely that these issues may reappear in case they haven't been fixed differently meanwhile.\n"),
+ 20, video_out_update_disable_flush_from_video_out, &disable_decoder_flush_from_video_out);
+
/*
* here it is - the heart of xine (or rather: one of the hearts
* of xine) : the video output loop
@@ -1191,7 +1207,7 @@ static void *video_out_loop (void *this_gen) {
ite = xine_list_next(this->streams, ite)) {
xine_stream_t *stream = xine_list_get_value(this->streams, ite);
if (stream == XINE_ANON_STREAM) continue;
- if (stream->video_decoder_plugin && stream->video_fifo) {
+ if (stream->video_decoder_plugin && stream->video_fifo && !disable_decoder_flush_from_video_out) {
buf_element_t *buf;
lprintf ("flushing current video decoder plugin\n");
@@ -1741,7 +1757,7 @@ static vo_frame_t * crop_frame( xine_video_port_t *thi
yuy2_to_yuy2(
/* src */
img->base[0] + img->crop_top * img->pitches[0] +
- img->crop_left/2, img->pitches[0],
+ img->crop_left*2, img->pitches[0],
/* dst */
dupl->base[0], dupl->pitches[0],
/* width x height */