summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xine/BluRay/patches/xine-lib-1.1.16.3-ffmpeg-vc1-extradata.diff62
-rw-r--r--xine/BluRay/patches/xine-lib-1.1.16.3-ffmpeg-vc1-reopen.diff25
2 files changed, 87 insertions, 0 deletions
diff --git a/xine/BluRay/patches/xine-lib-1.1.16.3-ffmpeg-vc1-extradata.diff b/xine/BluRay/patches/xine-lib-1.1.16.3-ffmpeg-vc1-extradata.diff
new file mode 100644
index 00000000..c37c7e28
--- /dev/null
+++ b/xine/BluRay/patches/xine-lib-1.1.16.3-ffmpeg-vc1-extradata.diff
@@ -0,0 +1,62 @@
+--- src/combined/ffmpeg/ff_video_decoder.c 2009-04-16 14:24:20.000000000 +0300
++++ src/combined/ffmpeg/ff_video_decoder.c 2009-09-24 15:21:25.000000000 +0300
+@@ -1165,6 +1181,49 @@
+ }
+ }
+
++static int ff_vc1_find_header(ff_video_decoder_t *this, buf_element_t *buf)
++{
++ uint8_t *p = buf->content;
++
++ if (!p[0] && !p[1] && p[2] == 1 && p[3] == 0x0f) {
++ int i;
++
++ this->context->extradata = calloc(1, buf->size);
++ this->context->extradata_size = 0;
++
++ for (i = 0; i < buf->size && i < 128; i++) {
++ if (!p[i] && !p[i+1] && p[i+2]) {
++ lprintf("00 00 01 %02x at %d\n", p[i+3], i);
++ if (p[i+3] != 0x0e && p[i+3] != 0x0f)
++ break;
++ }
++ this->context->extradata[i] = p[i];
++ this->context->extradata_size++;
++ }
++
++ lprintf("ff_video_decoder: found VC1 sequence header\n");
++ return 1;
++ }
++
++ xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
++ "ffmpeg_video_dec: VC1 extradata missing !\n");
++ return 0;
++}
++
++static int ff_check_extradata(ff_video_decoder_t *this, unsigned int codec_type, buf_element_t *buf)
++{
++ if (this->context && this->context->extradata)
++ return 1;
++
++ switch (codec_type) {
++ case BUF_VIDEO_VC1:
++ return ff_vc1_find_header(this, buf);
++ default:;
++ }
++
++ return 1;
++}
++
+ #endif /* AVCODEC_HAS_REORDERED_OPAQUE */
+ static void ff_handle_buffer (ff_video_decoder_t *this, buf_element_t *buf) {
+ uint8_t *chunk_buf = this->buf;
+@@ -1176,6 +1235,9 @@
+ if (this->decoder_init_mode) {
+ int codec_type = buf->type & 0xFFFF0000;
+
++ if (!ff_check_extradata(this, codec_type, buf))
++ return;
++
+ /* init ffmpeg decoder */
+ init_video_codec(this, codec_type);
+ init_postprocess(this);
diff --git a/xine/BluRay/patches/xine-lib-1.1.16.3-ffmpeg-vc1-reopen.diff b/xine/BluRay/patches/xine-lib-1.1.16.3-ffmpeg-vc1-reopen.diff
new file mode 100644
index 00000000..745931b5
--- /dev/null
+++ b/xine/BluRay/patches/xine-lib-1.1.16.3-ffmpeg-vc1-reopen.diff
@@ -0,0 +1,25 @@
+--- src/combined/ffmpeg/ff_video_decoder.c 2009-04-16 14:24:20.000000000 +0300
++++ src/combined/ffmpeg/ff_video_decoder.c 2009-09-24 15:21:25.000000000 +0300
+@@ -340,6 +340,22 @@
+ return;
+ }
+
++ if (this->codec->id == CODEC_ID_VC1 &&
++ (!this->bih.biWidth || !this->bih.biHeight)) {
++ /* VC1 codec must be re-opened with correct width and height. */
++ avcodec_close(this->context);
++
++ if (avcodec_open (this->context, this->codec) < 0) {
++ pthread_mutex_unlock(&ffmpeg_lock);
++ xprintf (this->stream->xine, XINE_VERBOSITY_LOG,
++ _("ffmpeg_video_dec: couldn't open decoder (pass 2)\n"));
++ free(this->context);
++ this->context = NULL;
++ _x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_HANDLED, 0);
++ return;
++ }
++ }
++
+ if (this->class->thread_count > 1) {
+ avcodec_thread_init(this->context, this->class->thread_count);
+ this->context->thread_count = this->class->thread_count;