summaryrefslogtreecommitdiff
path: root/libavcodec/vp8_parser.c
diff options
context:
space:
mode:
authorClément Bœsch <u@pkh.me>2017-04-01 09:55:12 +0200
committerClément Bœsch <u@pkh.me>2017-04-01 10:17:32 +0200
commitf56a5fee374c5ec1794da6c9ca367d19485b5aec (patch)
treeafcc96b1d1ffa77b94690f066f6e28eada90c91b /libavcodec/vp8_parser.c
parent99e5d81ef997cb88b1a40e6f253f37f7cbf251d9 (diff)
parent182cf170a544bce069c8690c90b49381150a1f10 (diff)
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@pkh.me>
Diffstat (limited to 'libavcodec/vp8_parser.c')
-rw-r--r--libavcodec/vp8_parser.c49
1 files changed, 44 insertions, 5 deletions
diff --git a/libavcodec/vp8_parser.c b/libavcodec/vp8_parser.c
index afc7f991e6..609f5077d1 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;