]> git.sesse.net Git - vlc/blobdiff - modules/demux/rawvid.c
Check malloc return value.
[vlc] / modules / demux / rawvid.c
index a36cc957cea89897511171ccaee46be7d755df72..add4213e0b12627334d2383119a72181ebc776f2 100644 (file)
  * Preamble
  *****************************************************************************/
 
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include <vlc/vlc.h>
 #include <vlc_demux.h>
 #include <vlc_vout.h>                                     /* vout_InitFormat */
@@ -58,23 +62,18 @@ static void Close( vlc_object_t * );
 vlc_module_begin();
     set_shortname( "Raw Video" );
     set_description( _("Raw video demuxer") );
-    set_capability( "demux2", 3 );
+    set_capability( "demux2", 10 );
     set_category( CAT_INPUT );
     set_subcategory( SUBCAT_INPUT_DEMUX );
     set_callbacks( Open, Close );
     add_shortcut( "rawvideo" );
     add_float( "rawvid-fps", 0, 0, FPS_TEXT, FPS_LONGTEXT, VLC_FALSE );
-        change_safe();
     add_integer( "rawvid-width", 0, 0, WIDTH_TEXT, WIDTH_LONGTEXT, 0 );
-        change_safe();
     add_integer( "rawvid-height", 0, 0, HEIGHT_TEXT, HEIGHT_LONGTEXT, 0 );
-        change_safe();
     add_string( "rawvid-chroma", NULL, NULL, CHROMA_TEXT, CHROMA_LONGTEXT,
                 VLC_TRUE );
-        change_safe();
     add_string( "rawvid-aspect-ratio", NULL, NULL,
                 ASPECT_RATIO_TEXT, ASPECT_RATIO_LONGTEXT, VLC_TRUE );
-        change_safe();
 vlc_module_end();
 
 /*****************************************************************************
@@ -166,6 +165,9 @@ static int Open( vlc_object_t * p_this )
     p_demux->pf_demux   = Demux;
     p_demux->pf_control = Control;
     p_demux->p_sys      = p_sys = malloc( sizeof( demux_sys_t ) );
+    if( !p_sys )
+        return VLC_EGENERIC;
+
     p_sys->i_pcr = 1;
 
     p_sys->b_y4m = b_y4m;
@@ -185,13 +187,13 @@ static int Open( vlc_object_t * p_this )
         /* TODO: handle interlacing */
 
 #define READ_FRAC( key, num, den ) \
-        buf = strchr( psz+9, key );\
+        buf = strstr( psz+9, key );\
         if( buf )\
         {\
-            char *end = strchr( buf, ' ' );\
+            char *end = strchr( buf+1, ' ' );\
             char *sep;\
             if( end ) *end = '\0';\
-            sep = strchr( buf, ':' );\
+            sep = strchr( buf+1, ':' );\
             if( sep )\
             {\
                 *sep = '\0';\
@@ -201,43 +203,47 @@ static int Open( vlc_object_t * p_this )
             {\
                 den = 1;\
             }\
-            num = atoi( buf+1 );\
+            num = atoi( buf+2 );\
             if( sep ) *sep = ':';\
             if( end ) *end = ' ';\
         }
-        READ_FRAC( 'W', i_width, a )
-        READ_FRAC( 'H', i_height, a )
-        READ_FRAC( 'F', a, b )
+        READ_FRAC( " W", i_width, a )
+        READ_FRAC( " H", i_height, a )
+        READ_FRAC( " F", a, b )
         p_sys->f_fps = (double)a/(double)b;
-        READ_FRAC( 'A', a, b )
+        READ_FRAC( " A", a, b )
         if( b != 0 ) i_aspect = a * VOUT_ASPECT_FACTOR / b;
 
-        buf = strchr( psz+9, 'C' );
+        buf = strstr( psz+9, " C" );
         if( buf )
         {
-            char *end = strchr( buf, ' ' );
+            char *end = strchr( buf+1, ' ' );
             if( end ) *end = '\0';
-            buf++;
-            if( !strncmp( buf, "C420jpeg", 8 ) )
+            buf+=2;
+            if( !strncmp( buf, "420jpeg", 7 ) )
             {
                 psz_chroma = strdup( "I420" );
             }
-            else if( !strncmp( buf, "C420paldv", 9 ) )
+            else if( !strncmp( buf, "420paldv", 8 ) )
             {
                 psz_chroma = strdup( "I420" );
             }
-            else if( !strncmp( buf, "C420", 4 ) )
+            else if( !strncmp( buf, "420", 3 ) )
             {
                 psz_chroma = strdup( "I420" );
             }
-            else if( !strncmp( buf, "C422", 4 ) )
+            else if( !strncmp( buf, "422", 3 ) )
             {
                 psz_chroma = strdup( "I422" );
             }
-            else if( !strncmp( buf, "C444", 4 ) )
+            else if( !strncmp( buf, "444", 3 ) )
             {
                 psz_chroma = strdup( "I444" );
             }
+            else if( !strncmp( buf, "mono", 3 ) )
+            {
+                psz_chroma = strdup( "GREY" );
+            }
             else
             {
                 msg_Warn( p_demux, "Unknown YUV4MPEG2 chroma type \"%s\"",