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>
pull/258/head
Clément Bœsch 8 years ago
commit f56a5fee37
  1. 49
      libavcodec/vp8_parser.c

@ -1,6 +1,4 @@
/* /*
* Copyright (C) 2008 Michael Niedermayer
*
* This file is part of FFmpeg. * This file is part of FFmpeg.
* *
* FFmpeg is free software; you can redistribute it and/or * 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 * 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, static int parse(AVCodecParserContext *s,
AVCodecContext *avctx, AVCodecContext *avctx,
const uint8_t **poutbuf, int *poutbuf_size, const uint8_t **poutbuf, int *poutbuf_size,
const uint8_t *buf, int buf_size) const uint8_t *buf, int buf_size)
{ {
s->pict_type = (buf[0] & 0x01) ? AV_PICTURE_TYPE_P unsigned int frame_type;
: AV_PICTURE_TYPE_I; 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 = buf;
*poutbuf_size = buf_size; *poutbuf_size = buf_size;

Loading…
Cancel
Save