diff vp3.c @ 4935:b34f448e1a12 libavcodec

fix display of theora videos with visible size smaller than encoded size
author aurel
date Mon, 07 May 2007 15:43:01 +0000
parents 9ca9a53a848b
children 2e400c0e99f6
line wrap: on
line diff
--- a/vp3.c	Mon May 07 13:29:02 2007 +0000
+++ b/vp3.c	Mon May 07 15:43:01 2007 +0000
@@ -2371,6 +2371,7 @@
 static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
 {
     Vp3DecodeContext *s = avctx->priv_data;
+    int visible_width, visible_height;
 
     s->theora = get_bits_long(gb, 24);
     av_log(avctx, AV_LOG_INFO, "Theora bitstream version %X\n", s->theora);
@@ -2399,15 +2400,10 @@
         skip_bits(gb, 32); /* total number of blocks in a frame */
         skip_bits(gb, 4); /* total number of blocks in a frame */
         skip_bits(gb, 32); /* total number of macroblocks in a frame */
-
-        skip_bits(gb, 24); /* frame width */
-        skip_bits(gb, 24); /* frame height */
     }
-    else
-    {
-        skip_bits(gb, 24); /* frame width */
-        skip_bits(gb, 24); /* frame height */
-    }
+
+    visible_width  = get_bits_long(gb, 24);
+    visible_height = get_bits_long(gb, 24);
 
   if (s->theora >= 0x030200) {
     skip_bits(gb, 8); /* offset x */
@@ -2438,8 +2434,11 @@
 
 //    align_get_bits(gb);
 
-    avctx->width = s->width;
-    avctx->height = s->height;
+    if (   visible_width  <= s->width  && visible_width  > s->width-16
+        && visible_height <= s->height && visible_height > s->height-16)
+        avcodec_set_dimensions(avctx, visible_width, visible_height);
+    else
+        avcodec_set_dimensions(avctx, s->width, s->height);
 
     return 0;
 }