Mercurial > mplayer.hg
changeset 30890:1c92dce71f3d
add support for lavf style extradata in vd_theora
author | aurel |
---|---|
date | Thu, 18 Mar 2010 21:53:02 +0000 |
parents | c0fe89cf9803 |
children | fdcf76890a16 |
files | libmpcodecs/vd_theora.c |
diffstat | 1 files changed, 17 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/libmpcodecs/vd_theora.c Thu Mar 18 20:57:49 2010 +0000 +++ b/libmpcodecs/vd_theora.c Thu Mar 18 21:53:02 2010 +0000 @@ -27,6 +27,8 @@ #include "vd_internal.h" +#include "libavutil/intreadwrite.h" + static const vd_info_t info = { "Theora/VP3", "theora", @@ -75,6 +77,8 @@ */ static int init(sh_video_t *sh){ theora_struct_t *context = NULL; + uint8_t *extradata = (uint8_t *)(sh->bih + 1); + int extradata_size = sh->bih->biSize - sizeof(*sh->bih); int errorCode = 0; ogg_packet op; int i; @@ -90,8 +94,21 @@ /* Read all header packets, pass them to theora_decode_header. */ for (i = 0; i < THEORA_NUM_HEADER_PACKETS; i++) { + if (extradata_size > 2) { + op.bytes = AV_RB16(extradata); + op.packet = extradata + 2; + op.b_o_s = 1; + if (extradata_size < op.bytes + 2) { + mp_msg(MSGT_DECAUDIO, MSGL_ERR, "Theora header too small\n"); + goto err_out; + } + extradata += op.bytes + 2; + extradata_size -= op.bytes + 2; + } else { op.bytes = ds_get_packet (sh->ds, &op.packet); op.b_o_s = 1; + } + if ( (errorCode = theora_decode_header (&context->inf, &context->cc, &op)) ) { mp_msg(MSGT_DECAUDIO, MSGL_ERR, "Broken Theora header; errorCode=%i!\n", errorCode);