[03/11] vp6: Support cropping to AVCodecContext.width/height

Message ID 1381320210-79941-3-git-send-email-martin@martin.st
State Committed
Headers show

Commit Message

Martin Storsjö Oct. 9, 2013, 12:03 p.m.
In these cases, there is no extradata but only the properly set
width/height values by the demuxer.

This makes sure VP6 in F4V files is cropped properly.

This is similar to what is done for H264 for letting the container
width/height override what's in the bitstream, since 30f515091.
---
 libavcodec/vp6.c |   18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

Comments

Luca Barbato Oct. 9, 2013, 12:10 p.m. | #1
On 09/10/13 14:03, Martin Storsjö wrote:
> In these cases, there is no extradata but only the properly set
> width/height values by the demuxer.
> 
> This makes sure VP6 in F4V files is cropped properly.
> 
> This is similar to what is done for H264 for letting the container
> width/height override what's in the bitstream, since 30f515091.
> ---
>  libavcodec/vp6.c |   18 ++++++++++++++----
>  1 file changed, 14 insertions(+), 4 deletions(-)
> 

Add some spaces.
Martin Storsjö Oct. 9, 2013, 12:32 p.m. | #2
On Wed, 9 Oct 2013, Luca Barbato wrote:

> On 09/10/13 14:03, Martin Storsjö wrote:
>> In these cases, there is no extradata but only the properly set
>> width/height values by the demuxer.
>> 
>> This makes sure VP6 in F4V files is cropped properly.
>> 
>> This is similar to what is done for H264 for letting the container
>> width/height override what's in the bitstream, since 30f515091.
>> ---
>>  libavcodec/vp6.c |   18 ++++++++++++++----
>>  1 file changed, 14 insertions(+), 4 deletions(-)
>> 
>
> Add some spaces.

Added spaces around the multplications (which were the only operators 
without spaces that I saw).

Ok'd by Kostya on irc.

// Martin

Patch

diff --git a/libavcodec/vp6.c b/libavcodec/vp6.c
index b8a9228..8b11daa 100644
--- a/libavcodec/vp6.c
+++ b/libavcodec/vp6.c
@@ -84,10 +84,20 @@  static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size,
         if (!s->macroblocks || /* first frame */
             16*cols != s->avctx->coded_width ||
             16*rows != s->avctx->coded_height) {
-            avcodec_set_dimensions(s->avctx, 16*cols, 16*rows);
-            if (s->avctx->extradata_size == 1) {
-                s->avctx->width  -= s->avctx->extradata[0] >> 4;
-                s->avctx->height -= s->avctx->extradata[0] & 0x0F;
+            if (s->avctx->extradata_size == 0 &&
+                FFALIGN(s->avctx->width,  16) == 16*cols &&
+                FFALIGN(s->avctx->height, 16) == 16*rows) {
+                // We assume this is properly signalled container cropping,
+                // in an F4V file. Just set the coded_width/height, don't
+                // touch the cropped ones.
+                s->avctx->coded_width  = 16*cols;
+                s->avctx->coded_height = 16*rows;
+            } else {
+                avcodec_set_dimensions(s->avctx, 16*cols, 16*rows);
+                if (s->avctx->extradata_size == 1) {
+                    s->avctx->width  -= s->avctx->extradata[0] >> 4;
+                    s->avctx->height -= s->avctx->extradata[0] & 0x0F;
+                }
             }
             res = VP56_SIZE_CHANGE;
         }