--- modules/demux/mkv.cpp~	2006-12-29 00:54:00.000000000 +1100
+++ modules/demux/mkv.cpp	2006-12-30 17:42:48.000000000 +1100
@@ -2196,6 +2196,76 @@
         {
             tracks[i_track]->fmt.i_codec = VLC_FOURCC( 'm', 'p', 'g', 'v' );
         }
+        else if( !strncmp( tracks[i_track]->psz_codec, "V_THEORA", 8 ) )
+        {
+            uint8_t *p_data = tracks[i_track]->p_extra_data;
+            tracks[i_track]->fmt.i_codec = VLC_FOURCC( 't', 'h', 'e', 'o' );
+            if( tracks[i_track]->i_extra_data >= 4 ) {
+                if( p_data[0] == 2 ) {
+                    int i = 1;
+                    int i_size1 = 0, i_size2 = 0;
+                    p_data++;
+                    /* read size of first header packet */
+                    while( *p_data == 0xFF &&
+                           i < tracks[i_track]->i_extra_data )
+                    {
+                        i_size1 += *p_data;
+                        p_data++;
+                        i++;
+                    }
+                    i_size1 += *p_data;
+                    p_data++;
+                    i++;
+                    msg_Dbg( &sys.demuxer, "first theora header size %d", i_size1 );
+                    /* read size of second header packet */
+                    while( *p_data == 0xFF &&
+                           i < tracks[i_track]->i_extra_data )
+                    {
+                        i_size2 += *p_data;
+                        p_data++;
+                        i++;
+                    }
+                    i_size2 += *p_data;
+                    p_data++;
+                    i++;
+                    int i_size3 = tracks[i_track]->i_extra_data - i - i_size1
+                        - i_size2;
+                    msg_Dbg( &sys.demuxer, "second theora header size %d", i_size2 );
+                    msg_Dbg( &sys.demuxer, "third theora header size %d", i_size3 );
+                    tracks[i_track]->fmt.i_extra = i_size1 + i_size2 + i_size3
+                        + 6;
+                    if( i_size1 > 0 && i_size2 > 0 && i_size3 > 0  ) {
+                        tracks[i_track]->fmt.p_extra =
+                            malloc( tracks[i_track]->fmt.i_extra );
+                        uint8_t *p_out = (uint8_t*)tracks[i_track]->fmt.p_extra;
+                        *p_out++ = (i_size1>>8) & 0xFF;
+                        *p_out++ = i_size1 & 0xFF;
+                        memcpy( p_out, p_data, i_size1 );
+                        p_data += i_size1;
+                        p_out += i_size1;
+
+                        *p_out++ = (i_size2>>8) & 0xFF;
+                        *p_out++ = i_size2 & 0xFF;
+                        memcpy( p_out, p_data, i_size2 );
+                        p_data += i_size2;
+                        p_out += i_size2;
+
+                        *p_out++ = (i_size3>>8) & 0xFF;
+                        *p_out++ = i_size3 & 0xFF;
+                        memcpy( p_out, p_data, i_size3 );
+                        p_data += i_size3;
+                        p_out += i_size3;
+                    }
+                    else
+                    {
+                        msg_Err( &sys.demuxer, "inconsistant theora extradata" );
+                    }
+                }
+                else {
+                    msg_Err( &sys.demuxer, "Wrong number of ogg packets with theora headers (%d)", p_data[0] + 1 );
+                }
+            }
+        }
         else if( !strncmp( tracks[i_track]->psz_codec, "V_MPEG4", 7 ) )
         {
             if( !strcmp( tracks[i_track]->psz_codec, "V_MPEG4/MS/V3" ) )
