# HG changeset patch # User aurel # Date 1174784966 0 # Node ID b62a3a46856c10b8201dd6ef2b0bf10501c507e6 # Parent 7595ead284022e20ae70d802d59445095a561b67 use generic xiph header spliting func to split theora headers Original thread: Date: Thu, 22 Mar 2007 20:23:08 -0400 Subject: [Ffmpeg-devel] [PATCH] Theora in MKV (GSoC '07 Qualification) diff -r 7595ead28402 -r b62a3a46856c Makefile --- a/Makefile Sun Mar 25 01:06:45 2007 +0000 +++ b/Makefile Sun Mar 25 01:09:26 2007 +0000 @@ -141,7 +141,7 @@ OBJS-$(CONFIG_SVQ3_DECODER) += h264.o OBJS-$(CONFIG_TARGA_DECODER) += targa.o OBJS-$(CONFIG_TARGA_ENCODER) += targaenc.o -OBJS-$(CONFIG_THEORA_DECODER) += vp3.o +OBJS-$(CONFIG_THEORA_DECODER) += vp3.o xiph.o OBJS-$(CONFIG_TIERTEXSEQVIDEO_DECODER) += tiertexseqv.o OBJS-$(CONFIG_TIFF_DECODER) += tiff.o lzw.o OBJS-$(CONFIG_TRUEMOTION1_DECODER) += truemotion1.o diff -r 7595ead28402 -r b62a3a46856c vp3.c --- a/vp3.c Sun Mar 25 01:06:45 2007 +0000 +++ b/vp3.c Sun Mar 25 01:09:26 2007 +0000 @@ -41,6 +41,7 @@ #include "mpegvideo.h" #include "vp3data.h" +#include "xiph.h" #define FRAGMENT_PIXELS 8 @@ -2574,8 +2575,9 @@ Vp3DecodeContext *s = avctx->priv_data; GetBitContext gb; int ptype; - uint8_t *p= avctx->extradata; - int op_bytes, i; + uint8_t *header_start[3]; + int header_len[3]; + int i; s->theora = 1; @@ -2585,12 +2587,14 @@ return -1; } + if (ff_split_xiph_headers(avctx->extradata, avctx->extradata_size, + 42, header_start, header_len) < 0) { + av_log(avctx, AV_LOG_ERROR, "Corrupt extradata\n"); + return -1; + } + for(i=0;i<3;i++) { - op_bytes = *(p++)<<8; - op_bytes += *(p++); - - init_get_bits(&gb, p, op_bytes); - p += op_bytes; + init_get_bits(&gb, header_start[i], header_len[i]); ptype = get_bits(&gb, 8); debug_vp3("Theora headerpacket type: %x\n", ptype); @@ -2620,8 +2624,8 @@ av_log(avctx, AV_LOG_ERROR, "Unknown Theora config packet: %d\n", ptype&~0x80); break; } - if(8*op_bytes != get_bits_count(&gb)) - av_log(avctx, AV_LOG_ERROR, "%d bits left in packet %X\n", 8*op_bytes - get_bits_count(&gb), ptype); + if(8*header_len[i] != get_bits_count(&gb)) + av_log(avctx, AV_LOG_ERROR, "%d bits left in packet %X\n", 8*header_len[i] - get_bits_count(&gb), ptype); if (s->theora < 0x030200) break; }