]> git.sesse.net Git - vlc/commitdiff
mkv.cpp: support for the new header stripping compression
authorSteve Lhomme <robux@videolan.org>
Sat, 22 Oct 2005 12:46:29 +0000 (12:46 +0000)
committerSteve Lhomme <robux@videolan.org>
Sat, 22 Oct 2005 12:46:29 +0000 (12:46 +0000)
modules/demux/mkv.cpp

index c86311035a21245c29f65b9b6b34d2fca14afb5c..7867d4b97bfe1304f77a28c3710e908b8cede5d1 100644 (file)
@@ -99,8 +99,11 @@ extern "C" {
 #   include <zlib.h>
 #endif
 
-#define MATROSKA_COMPRESSION_NONE 0
-#define MATROSKA_COMPRESSION_ZLIB 1
+#define MATROSKA_COMPRESSION_NONE  -1
+#define MATROSKA_COMPRESSION_ZLIB   0
+#define MATROSKA_COMPRESSION_BLIB   1
+#define MATROSKA_COMPRESSION_LZOX   2
+#define MATROSKA_COMPRESSION_HEADER 3
 
 #define MKVD_TIMECODESCALE 1000000
 
@@ -600,7 +603,8 @@ typedef struct
     char         *psz_codec_download_url;
     
     /* encryption/compression */
-    int           i_compression_type;
+    int                    i_compression_type;
+    KaxContentCompSettings *p_compression_data;
 
 } mkv_track_t;
 
@@ -1028,6 +1032,10 @@ public:
     {
         for( size_t i_track = 0; i_track < tracks.size(); i_track++ )
         {
+            if ( tracks[i_track]->p_compression_data )
+            {
+                delete tracks[i_track]->p_compression_data;
+            }
             if( tracks[i_track]->fmt.psz_description )
             {
                 free( tracks[i_track]->fmt.psz_description );
@@ -1833,11 +1841,11 @@ int matroska_segment_c::BlockGet( KaxBlock * & pp_block, int64_t *pi_ref1, int64
     }
 }
 
-static block_t *MemToBlock( demux_t *p_demux, uint8_t *p_mem, int i_mem)
+static block_t *MemToBlock( demux_t *p_demux, uint8_t *p_mem, int i_mem, size_t offset)
 {
     block_t *p_block;
-    if( !(p_block = block_New( p_demux, i_mem ) ) ) return NULL;
-    memcpy( p_block->p_buffer, p_mem, i_mem );
+    if( !(p_block = block_New( p_demux, i_mem + offset ) ) ) return NULL;
+    memcpy( p_block->p_buffer + offset, p_mem, i_mem );
     //p_block->i_rate = p_input->stream.control.i_rate;
     return p_block;
 }
@@ -1904,7 +1912,7 @@ static void BlockDecode( demux_t *p_demux, KaxBlock *block, mtime_t i_pts,
         block_t *p_init;
 
         msg_Dbg( p_demux, "sending header (%d bytes)", tk->i_data_init );
-        p_init = MemToBlock( p_demux, tk->p_data_init, tk->i_data_init );
+        p_init = MemToBlock( p_demux, tk->p_data_init, tk->i_data_init, 0 );
         if( p_init ) es_out_Send( p_demux->out, tk->p_es, p_init );
     }
     tk->b_inited = VLC_TRUE;
@@ -1931,7 +1939,10 @@ static void BlockDecode( demux_t *p_demux, KaxBlock *block, mtime_t i_pts,
 #endif
         data = &block->GetBuffer(i);
 
-        p_block = MemToBlock( p_demux, data->Buffer(), data->Size() );
+        if( tk->i_compression_type == MATROSKA_COMPRESSION_HEADER && tk->p_compression_data != NULL )
+            p_block = MemToBlock( p_demux, data->Buffer(), data->Size(), tk->p_compression_data->GetSize() );
+        else
+            p_block = MemToBlock( p_demux, data->Buffer(), data->Size(), 0 );
 
         if( p_block == NULL )
         {
@@ -1939,11 +1950,16 @@ static void BlockDecode( demux_t *p_demux, KaxBlock *block, mtime_t i_pts,
         }
 
 #if defined(HAVE_ZLIB_H)
-        if( tk->i_compression_type )
+        if( tk->i_compression_type == MATROSKA_COMPRESSION_ZLIB )
         {
             p_block = block_zlib_decompress( VLC_OBJECT(p_demux), p_block );
         }
+        else
 #endif
+        if( tk->i_compression_type == MATROSKA_COMPRESSION_HEADER )
+        {
+            memcpy( p_block->p_buffer, tk->p_compression_data->GetBuffer(), tk->p_compression_data->GetSize() );
+        }
 
         if ( tk->fmt.i_cat == NAV_ES )
         {
@@ -1984,7 +2000,7 @@ static void BlockDecode( demux_t *p_demux, KaxBlock *block, mtime_t i_pts,
         }
         tk->i_last_dts = p_block->i_dts;
 
-#if 1
+#if 0
 msg_Dbg( p_demux, "block i_dts: "I64Fd" / i_pts: "I64Fd, p_block->i_dts, p_block->i_pts);
 #endif
         if( strcmp( tk->psz_codec, "S_VOBSUB" ) )
@@ -4006,6 +4022,7 @@ void matroska_segment_c::ParseTrackEntry( KaxTrackEntry *m )
     tk->psz_codec_download_url = NULL;
     
     tk->i_compression_type = MATROSKA_COMPRESSION_NONE;
+    tk->p_compression_data = NULL;
 
     for( i = 0; i < m->ListSize(); i++ )
     {
@@ -4185,10 +4202,11 @@ void matroska_segment_c::ParseTrackEntry( KaxTrackEntry *m )
                                 {
                                     KaxContentCompAlgo &compalg = *(KaxContentCompAlgo*)l4;
                                     MkvTree( sys.demuxer, 6, "Compression Algorithm: %i", uint32(compalg) );
-                                    if( uint32( compalg ) == 0 )
-                                    {
-                                        tk->i_compression_type = MATROSKA_COMPRESSION_ZLIB;
-                                    }
+                                    tk->i_compression_type = uint32( compalg );
+                                }
+                                else if( MKV_IS_ID( l4, KaxContentCompSettings ) )
+                                {
+                                    tk->p_compression_data = new KaxContentCompSettings( *(KaxContentCompSettings*)l4 );
                                 }
                                 else
                                 {