]> git.sesse.net Git - vlc/blobdiff - modules/demux/mkv.cpp
Fix breakage in transcode file selection
[vlc] / modules / demux / mkv.cpp
index 9f5bb17b9a10aa5ec04eab699a39db0f5c85e7a3..1477151cea8805b8f5c097e7800f53ad0b2d666e 100644 (file)
@@ -75,6 +75,9 @@
 
 #include "ebml/StdIOCallback.h"
 
+extern "C" {
+   #include "mp4/libmp4.h"
+}
 #ifdef HAVE_ZLIB_H
 #   include <zlib.h>
 #endif
@@ -92,9 +95,12 @@ static int  Open ( vlc_object_t * );
 static void Close( vlc_object_t * );
 
 vlc_module_begin();
+    set_shortname( _("Matroska") );
     set_description( _("Matroska stream demuxer" ) );
     set_capability( "demux2", 50 );
     set_callbacks( Open, Close );
+    set_category( CAT_INPUT );
+    set_subcategory( SUBCAT_INPUT_DEMUX );
 
     add_bool( "mkv-seek-percent", 1, NULL,
             N_("Seek based on percent not time"),
@@ -277,7 +283,7 @@ typedef struct
     char         *psz_codec_download_url;
     
     /* encryption/compression */
-    vlc_bool_t   b_compression_zlib;
+    int           i_compression_type;
 
 } mkv_track_t;
 
@@ -568,6 +574,23 @@ static int Open( vlc_object_t * p_this )
                 tk.fmt.i_codec = VLC_FOURCC( 'm', 'p', '4', 'v' );
             }
         }
+        else if( !strcmp( tk.psz_codec, "V_QUICKTIME" ) )
+        {
+            MP4_Box_t *p_box = (MP4_Box_t*)malloc( sizeof( MP4_Box_t ) );
+            stream_t *p_mp4_stream = stream_MemoryNew( VLC_OBJECT(p_demux),
+                                                       tk.p_extra_data,
+                                                       tk.i_extra_data );
+            MP4_ReadBoxCommon( p_mp4_stream, p_box );
+            MP4_ReadBox_sample_vide( p_mp4_stream, p_box );
+            tk.fmt.i_codec = p_box->i_type;
+            tk.fmt.video.i_width = p_box->data.p_sample_vide->i_width;
+            tk.fmt.video.i_height = p_box->data.p_sample_vide->i_height;
+            tk.fmt.i_extra = p_box->data.p_sample_vide->i_qt_image_description;
+            tk.fmt.p_extra = malloc( tk.fmt.i_extra );
+            memcpy( tk.fmt.p_extra, p_box->data.p_sample_vide->p_qt_image_description, tk.fmt.i_extra );
+            MP4_FreeBox_sample_vide( p_box );
+            stream_MemoryDelete( p_mp4_stream, VLC_TRUE );
+        }
         else if( !strcmp( tk.psz_codec, "A_MS/ACM" ) )
         {
             if( tk.i_extra_data < (int)sizeof( WAVEFORMATEX ) )
@@ -1097,16 +1120,18 @@ static void BlockDecode( demux_t *p_demux, KaxBlock *block, mtime_t i_pts,
         DataBuffer &data = block->GetBuffer(i);
 
         p_block = MemToBlock( p_demux, data.Buffer(), data.Size() );
+
+        if( p_block == NULL )
+        {
+            break;
+        }
+
 #if defined(HAVE_ZLIB_H)
-        if( p_block != NULL && tk.b_compression_zlib )
+        if( tk.i_compression_type )
         {
             p_block = block_zlib_decompress( VLC_OBJECT(p_demux), p_block );
         }
 #endif
-        if( p_block == NULL )
-        {
-            break;
-        }
 
         if( tk.fmt.i_cat != VIDEO_ES )
             p_block->i_dts = p_block->i_pts = i_pts;
@@ -1863,7 +1888,7 @@ static void ParseTrackEntry( demux_t *p_demux, EbmlMaster *m )
     tk->psz_codec_info_url = NULL;
     tk->psz_codec_download_url = NULL;
     
-    tk->b_compression_zlib = VLC_FALSE;
+    tk->i_compression_type = MATROSKA_COMPRESSION_NONE;
 
     for( i = 0; i < m->ListSize(); i++ )
     {
@@ -2039,7 +2064,7 @@ static void ParseTrackEntry( demux_t *p_demux, EbmlMaster *m )
                                     MkvTree( p_demux, 6, "Compression Algorithm: %i", uint32(compalg) );
                                     if( uint32( compalg ) == 0 )
                                     {
-                                        tk->b_compression_zlib = VLC_TRUE;
+                                        tk->i_compression_type = MATROSKA_COMPRESSION_ZLIB;
                                     }
                                 }
                                 else