6b929c59fb
- 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@
76 lines
3.5 KiB
Plaintext
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 */
|