diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 729e77ab78519289edceef8bfeb1f6cd87c2aef1..2d42ce2d4a2b6260e42111ddb046711b5c979aa7 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -141,7 +141,7 @@ OBJS-$(CONFIG_SVQ1_ENCODER)            += svq1.o
 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 --git a/libavcodec/vp3.c b/libavcodec/vp3.c
index 23d97bf9cc62008ef8b635fb45e30bb9b8a9bded..0d882da32651f6765cc8b274331997b26c25af44 100644
--- a/libavcodec/vp3.c
+++ b/libavcodec/vp3.c
@@ -41,6 +41,7 @@
 #include "mpegvideo.h"
 
 #include "vp3data.h"
+#include "xiph.h"
 
 #define FRAGMENT_PIXELS 8
 
@@ -2574,8 +2575,9 @@ static int theora_decode_init(AVCodecContext *avctx)
     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 @@ static int theora_decode_init(AVCodecContext *avctx)
         return -1;
     }
 
-  for(i=0;i<3;i++) {
-    op_bytes = *(p++)<<8;
-    op_bytes += *(p++);
+    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;
+    }
 
-    init_get_bits(&gb, p, op_bytes);
-    p += op_bytes;
+  for(i=0;i<3;i++) {
+    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 @@ static int theora_decode_init(AVCodecContext *avctx)
             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;
   }