]> git.sesse.net Git - vlc/commitdiff
mkv.cpp: added support for quicktime video codecs in mkv (tested with svq3)
authorSigmund Augdal Helberg <sigmunau@videolan.org>
Sat, 25 Sep 2004 23:36:55 +0000 (23:36 +0000)
committerSigmund Augdal Helberg <sigmunau@videolan.org>
Sat, 25 Sep 2004 23:36:55 +0000 (23:36 +0000)
Modules.am: link mkv demux with mp4 demux
mp4/*: export some functions needed by mkv demux

modules/demux/Modules.am
modules/demux/mkv.cpp
modules/demux/mp4/libmp4.c
modules/demux/mp4/libmp4.h

index 72c6d48927e52ab56185ee66e174713bdc7f386b..1f7c45abd2343e6628603a3bb2083e84ae32c76b 100644 (file)
@@ -8,7 +8,7 @@ SOURCES_rawdv = rawdv.c
 SOURCES_au = au.c
 SOURCES_wav = wav.c
 SOURCES_aac = aac.c
-SOURCES_mkv = mkv.cpp
+SOURCES_mkv = mkv.cpp mp4/libmp4.c mp4/drms.c
 SOURCES_livedotcom = livedotcom.cpp ../access/mms/asf.c ../access/mms/buffer.c
 SOURCES_nsv = nsv.c
 SOURCES_real = real.c
index 9f5bb17b9a10aa5ec04eab699a39db0f5c85e7a3..4423f0e7fd6a3f6e08945ddd558bf0573f3223d7 100644 (file)
@@ -75,6 +75,9 @@
 
 #include "ebml/StdIOCallback.h"
 
+extern "C" {
+   #include "mp4/libmp4.h"
+}
 #ifdef HAVE_ZLIB_H
 #   include <zlib.h>
 #endif
@@ -568,6 +571,24 @@ 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 ) );
+            MP4_Stream_t *p_mp4_stream = MP4_MemoryStream( p_demux->s,
+                                                           tk.i_extra_data,
+                                                           tk.p_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 );
+            free( p_box );
+            free( p_mp4_stream );
+        }
         else if( !strcmp( tk.psz_codec, "A_MS/ACM" ) )
         {
             if( tk.i_extra_data < (int)sizeof( WAVEFORMATEX ) )
index bdf973fa7527fc721a7dc75d81d7ba400a39452b..4f5924fc5a54a04a43aadcedb1586ea994bfb0ba 100644 (file)
@@ -324,7 +324,7 @@ int MP4_SeekStream( MP4_Stream_t *p_stream, off_t i_pos)
  *
  * RETURN : 0 if it fail, 1 otherwise
  *****************************************************************************/
-static int MP4_ReadBoxCommon( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
+int MP4_ReadBoxCommon( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
 {
     int      i_read;
     uint8_t  *p_peek;
@@ -1325,7 +1325,7 @@ static void MP4_FreeBox_sample_soun( MP4_Box_t *p_box )
 }
 
 
-static int MP4_ReadBox_sample_vide( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
+int MP4_ReadBox_sample_vide( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
 {
     unsigned int i;
 
@@ -1390,7 +1390,7 @@ static int MP4_ReadBox_sample_vide( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
 }
 
 
-static void MP4_FreeBox_sample_vide( MP4_Box_t *p_box )
+void MP4_FreeBox_sample_vide( MP4_Box_t *p_box )
 {
     FREE( p_box->data.p_sample_vide->p_qt_image_description );
 }
index 2551c57de2295e17af3ba61dfd4ba2df04e830fe..86edb9cecc4f6e64ed38f73be618fbf8e9f8c83b 100644 (file)
@@ -915,3 +915,8 @@ MP4_Box_t *MP4_BoxGet( MP4_Box_t *p_box, char *psz_fmt, ... );
  *****************************************************************************/
 int MP4_BoxCount( MP4_Box_t *p_box, char *psz_fmt, ... );
 
+MP4_Stream_t *MP4_MemoryStream( stream_t *s,
+                                int i_size, uint8_t *p_buffer );
+int MP4_ReadBoxCommon( MP4_Stream_t *p_stream, MP4_Box_t *p_box );
+int MP4_ReadBox_sample_vide( MP4_Stream_t *p_stream, MP4_Box_t *p_box );
+void MP4_FreeBox_sample_vide( MP4_Box_t *p_box );