[FFmpeg-cvslog] Merge commit '182cf170a544bce069c8690c90b49381150a1f10'

Clément Bœsch git at videolan.org
Sat Apr 1 11:19:31 EEST 2017


ffmpeg | branch: master | Clément Bœsch <u at pkh.me> | Sat Apr  1 09:55:12 2017 +0200| [f56a5fee374c5ec1794da6c9ca367d19485b5aec] | committer: Clément Bœsch

Merge commit '182cf170a544bce069c8690c90b49381150a1f10'

* commit '182cf170a544bce069c8690c90b49381150a1f10':
  vp8: Return stream format information from parser

Return codes are adjusted to consume the whole packet in case of error
as the API does not allow returning AVERROR codes (a negative return
value is valid).

Merged-by: Clément Bœsch <u at pkh.me>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=f56a5fee374c5ec1794da6c9ca367d19485b5aec
---

 libavcodec/vp8_parser.c | 49 ++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 44 insertions(+), 5 deletions(-)

diff --git a/libavcodec/vp8_parser.c b/libavcodec/vp8_parser.c
index afc7f99..609f507 100644
--- a/libavcodec/vp8_parser.c
+++ b/libavcodec/vp8_parser.c
@@ -1,6 +1,4 @@
 /*
- * Copyright (C) 2008 Michael Niedermayer
- *
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
@@ -18,15 +16,56 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#include "parser.h"
+#include "libavutil/intreadwrite.h"
+
+#include "avcodec.h"
 
 static int parse(AVCodecParserContext *s,
                  AVCodecContext *avctx,
                  const uint8_t **poutbuf, int *poutbuf_size,
                  const uint8_t *buf, int buf_size)
 {
-    s->pict_type = (buf[0] & 0x01) ? AV_PICTURE_TYPE_P
-                                   : AV_PICTURE_TYPE_I;
+    unsigned int frame_type;
+    unsigned int profile;
+
+    if (buf_size < 3)
+        return buf_size;
+
+    frame_type = buf[0] & 1;
+    profile    = (buf[0] >> 1) & 7;
+    if (profile > 3) {
+        av_log(avctx, AV_LOG_ERROR, "Invalid profile %u.\n", profile);
+        return buf_size;
+    }
+
+    avctx->profile = profile;
+    s->key_frame   = frame_type == 0;
+    s->pict_type   = frame_type ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
+    s->format      = AV_PIX_FMT_YUV420P;
+    s->field_order = AV_FIELD_PROGRESSIVE;
+    s->picture_structure = AV_PICTURE_STRUCTURE_FRAME;
+
+    if (frame_type == 0) {
+        unsigned int sync_code;
+        unsigned int width, height;
+
+        if (buf_size < 10)
+            return buf_size;
+
+        sync_code = AV_RL24(buf + 3);
+        if (sync_code != 0x2a019d) {
+            av_log(avctx, AV_LOG_ERROR, "Invalid sync code %06x.\n", sync_code);
+            return buf_size;
+        }
+
+        width  = AV_RL16(buf + 6) & 0x3fff;
+        height = AV_RL16(buf + 8) & 0x3fff;
+
+        s->width        = width;
+        s->height       = height;
+        s->coded_width  = FFALIGN(width,  16);
+        s->coded_height = FFALIGN(height, 16);
+    }
 
     *poutbuf      = buf;
     *poutbuf_size = buf_size;


======================================================================

diff --cc libavcodec/vp8_parser.c
index afc7f99,fad652d..609f507
--- a/libavcodec/vp8_parser.c
+++ b/libavcodec/vp8_parser.c
@@@ -1,9 -1,7 +1,7 @@@
  /*
-  * Copyright (C) 2008 Michael Niedermayer
-  *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
@@@ -25,8 -25,47 +25,47 @@@ static int parse(AVCodecParserContext *
                   const uint8_t **poutbuf, int *poutbuf_size,
                   const uint8_t *buf, int buf_size)
  {
-     s->pict_type = (buf[0] & 0x01) ? AV_PICTURE_TYPE_P
-                                    : AV_PICTURE_TYPE_I;
+     unsigned int frame_type;
+     unsigned int profile;
+ 
+     if (buf_size < 3)
 -        return AVERROR_INVALIDDATA;
++        return buf_size;
+ 
+     frame_type = buf[0] & 1;
+     profile    = (buf[0] >> 1) & 7;
+     if (profile > 3) {
+         av_log(avctx, AV_LOG_ERROR, "Invalid profile %u.\n", profile);
 -        return AVERROR_INVALIDDATA;
++        return buf_size;
+     }
+ 
+     avctx->profile = profile;
+     s->key_frame   = frame_type == 0;
+     s->pict_type   = frame_type ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
+     s->format      = AV_PIX_FMT_YUV420P;
+     s->field_order = AV_FIELD_PROGRESSIVE;
+     s->picture_structure = AV_PICTURE_STRUCTURE_FRAME;
+ 
+     if (frame_type == 0) {
+         unsigned int sync_code;
+         unsigned int width, height;
+ 
+         if (buf_size < 10)
 -            return AVERROR_INVALIDDATA;
++            return buf_size;
+ 
+         sync_code = AV_RL24(buf + 3);
+         if (sync_code != 0x2a019d) {
+             av_log(avctx, AV_LOG_ERROR, "Invalid sync code %06x.\n", sync_code);
 -            return AVERROR_INVALIDDATA;
++            return buf_size;
+         }
+ 
+         width  = AV_RL16(buf + 6) & 0x3fff;
+         height = AV_RL16(buf + 8) & 0x3fff;
+ 
+         s->width        = width;
+         s->height       = height;
+         s->coded_width  = FFALIGN(width,  16);
+         s->coded_height = FFALIGN(height, 16);
+     }
  
      *poutbuf      = buf;
      *poutbuf_size = buf_size;



More information about the ffmpeg-cvslog mailing list