]> git.sesse.net Git - vlc/blobdiff - modules/stream_out/mosaic_bridge.c
Qt: small visual change in Open Disk
[vlc] / modules / stream_out / mosaic_bridge.c
index 12f0309cef6dddb140b0530ba8fbb8f5a0ea0a11..247a7dfc22e0a91e14e3da2ab93fc145ee4e745b 100644 (file)
@@ -37,6 +37,7 @@
 #include <vlc_sout.h>
 #include <vlc_block.h>
 #include <vlc_codec.h>
+#include <vlc_meta.h>
 
 #include <vlc_image.h>
 #include <vlc_filter.h>
@@ -82,7 +83,6 @@ static void ReleasePicture( picture_t *p_pic )
     if( --p_pic->i_refcount > 0 )
         return;
 
-    assert( p_pic->p_sys );
     if( p_pic->p_sys )
     {
         pf_release_t pf_release = (pf_release_t)p_pic->p_sys;
@@ -91,6 +91,7 @@ static void ReleasePicture( picture_t *p_pic )
     }
     else
     {
+        free( p_pic->p_q );
         free( p_pic->p_data_orig );
         free( p_pic );
     }
@@ -168,33 +169,33 @@ static int yCallback( vlc_object_t *, char const *,
 
 #define CFG_PREFIX "sout-mosaic-bridge-"
 
-vlc_module_begin();
-    set_shortname( N_( "Mosaic bridge" ) );
-    set_description(N_("Mosaic bridge stream output") );
-    set_capability( "sout stream", 0 );
-    add_shortcut( "mosaic-bridge" );
+vlc_module_begin ()
+    set_shortname( N_( "Mosaic bridge" ) )
+    set_description(N_("Mosaic bridge stream output") )
+    set_capability( "sout stream", 0 )
+    add_shortcut( "mosaic-bridge" )
 
     add_string( CFG_PREFIX "id", "Id", NULL, ID_TEXT, ID_LONGTEXT,
-                false );
+                false )
     add_integer( CFG_PREFIX "width", 0, NULL, WIDTH_TEXT,
-                 WIDTH_LONGTEXT, true );
+                 WIDTH_LONGTEXT, true )
     add_integer( CFG_PREFIX "height", 0, NULL, HEIGHT_TEXT,
-                 HEIGHT_LONGTEXT, true );
+                 HEIGHT_LONGTEXT, true )
     add_string( CFG_PREFIX "sar", "1:1", NULL, RATIO_TEXT,
-                RATIO_LONGTEXT, false );
+                RATIO_LONGTEXT, false )
     add_string( CFG_PREFIX "chroma", 0, NULL, CHROMA_TEXT, CHROMA_LONGTEXT,
-                false );
+                false )
 
     add_module_list( CFG_PREFIX "vfilter", "video filter2",
-                     NULL, NULL, VFILTER_TEXT, VFILTER_LONGTEXT, false );
+                     NULL, NULL, VFILTER_TEXT, VFILTER_LONGTEXT, false )
 
     add_integer_with_range( CFG_PREFIX "alpha", 255, 0, 255, NULL,
-                            ALPHA_TEXT, ALPHA_LONGTEXT, false );
-    add_integer( CFG_PREFIX "x", -1, NULL, X_TEXT, X_LONGTEXT, false );
-    add_integer( CFG_PREFIX "y", -1, NULL, Y_TEXT, Y_LONGTEXT, false );
+                            ALPHA_TEXT, ALPHA_LONGTEXT, false )
+    add_integer( CFG_PREFIX "x", -1, NULL, X_TEXT, X_LONGTEXT, false )
+    add_integer( CFG_PREFIX "y", -1, NULL, Y_TEXT, Y_LONGTEXT, false )
 
-    set_callbacks( Open, Close );
-vlc_module_end();
+    set_callbacks( Open, Close )
+vlc_module_end ()
 
 static const char *const ppsz_sout_options[] = {
     "id", "width", "height", "sar", "vfilter", "chroma", "alpha", "x", "y", NULL
@@ -215,9 +216,7 @@ static int Open( vlc_object_t *p_this )
 
     p_sys = malloc( sizeof( sout_stream_sys_t ) );
     if( !p_sys )
-    {
         return VLC_ENOMEM;
-    }
 
     p_stream->p_sys = p_sys;
     p_sys->b_inited = false;
@@ -226,8 +225,7 @@ static int Open( vlc_object_t *p_this )
     var_Get( p_libvlc, "mosaic-lock", &val );
     p_sys->p_lock = val.p_address;
 
-    var_Get( p_stream, CFG_PREFIX "id", &val );
-    p_sys->psz_id = val.psz_string;
+    p_sys->psz_id = var_CreateGetString( p_stream, CFG_PREFIX "id" );
 
     p_sys->i_height =
         var_CreateGetIntegerCommand( p_stream, CFG_PREFIX "height" );
@@ -238,7 +236,7 @@ static int Open( vlc_object_t *p_this )
     var_AddCallback( p_stream, CFG_PREFIX "width", WidthCallback, p_stream );
 
     var_Get( p_stream, CFG_PREFIX "sar", &val );
-    if ( val.psz_string )
+    if( val.psz_string )
     {
         char *psz_parser = strchr( val.psz_string, ':' );
 
@@ -270,15 +268,18 @@ static int Open( vlc_object_t *p_this )
         memcpy( &p_sys->i_chroma, val.psz_string, 4 );
         msg_Dbg( p_stream, "Forcing image chroma to 0x%.8x (%4.4s)", p_sys->i_chroma, (char*)&p_sys->i_chroma );
     }
+    free( val.psz_string );
 
-#define INT_COMMAND( a ) \
+#define INT_COMMAND( a ) do { \
     var_Create( p_stream, CFG_PREFIX #a, \
                 VLC_VAR_INTEGER | VLC_VAR_DOINHERIT | VLC_VAR_ISCOMMAND ); \
     var_AddCallback( p_stream, CFG_PREFIX #a, a ## Callback, \
-                     p_stream );
-    INT_COMMAND( alpha )
-    INT_COMMAND( x )
-    INT_COMMAND( y )
+                     p_stream ); } while(0)
+    INT_COMMAND( alpha );
+    INT_COMMAND( x );
+    INT_COMMAND( y );
+
+#undef INT_COMMAND
 
     p_stream->pf_add    = Add;
     p_stream->pf_del    = Del;
@@ -320,10 +321,8 @@ static sout_stream_id_t * Add( sout_stream_t *p_stream, es_format_t *p_fmt )
     char *psz_chain;
     int i;
 
-    if ( p_sys->b_inited )
-    {
+    if( p_sys->b_inited || p_fmt->i_cat != VIDEO_ES )
         return NULL;
-    }
 
     /* Create decoder object */
     p_sys->p_decoder = vlc_object_create( p_stream, VLC_OBJECT_DECODER );
@@ -355,11 +354,20 @@ static sout_stream_id_t * Add( sout_stream_t *p_stream, es_format_t *p_fmt )
     //p_sys->p_decoder->p_cfg = p_sys->p_video_cfg;
 
     p_sys->p_decoder->p_module =
-        module_Need( p_sys->p_decoder, "decoder", "$codec", 0 );
+        module_need( p_sys->p_decoder, "decoder", "$codec", false );
 
-    if( !p_sys->p_decoder->p_module )
+    if( !p_sys->p_decoder->p_module || !p_sys->p_decoder->pf_decode_video )
     {
-        msg_Err( p_stream, "cannot find decoder" );
+        if( p_sys->p_decoder->p_module )
+        {
+            msg_Err( p_stream, "instanciated a non video decoder" );
+            module_unneed( p_sys->p_decoder, p_sys->p_decoder->p_module );
+        }
+        else
+        {
+            msg_Err( p_stream, "cannot find decoder" );
+        }
+        free( p_sys->p_decoder->p_owner );
         vlc_object_detach( p_sys->p_decoder );
         vlc_object_release( p_sys->p_decoder );
         return NULL;
@@ -440,6 +448,10 @@ static sout_stream_id_t * Add( sout_stream_t *p_stream, es_format_t *p_fmt )
         filter_chain_AppendFromString( p_sys->p_vf2, psz_chain );
         free( psz_chain );
     }
+    else
+    {
+        p_sys->p_vf2 = NULL;
+    }
 
     return (sout_stream_id_t *)p_sys;
 }
@@ -453,17 +465,18 @@ static int Del( sout_stream_t *p_stream, sout_stream_id_t *id )
     bool b_last_es = true;
     int i;
 
-    if ( !p_sys->b_inited )
-    {
+    if( !p_sys->b_inited )
         return VLC_SUCCESS;
-    }
 
-    if ( p_sys->p_decoder != NULL )
+    if( p_sys->p_decoder != NULL )
     {
         decoder_owner_sys_t *p_owner = p_sys->p_decoder->p_owner;
 
         if( p_sys->p_decoder->p_module )
-            module_Unneed( p_sys->p_decoder, p_sys->p_decoder->p_module );
+            module_unneed( p_sys->p_decoder, p_sys->p_decoder->p_module );
+        if( p_sys->p_decoder->p_description )
+            vlc_meta_Delete( p_sys->p_decoder->p_description );
+
         vlc_object_detach( p_sys->p_decoder );
         vlc_object_release( p_sys->p_decoder );
 
@@ -481,7 +494,8 @@ static int Del( sout_stream_t *p_stream, sout_stream_id_t *id )
     }
 
     /* Destroy user specified video filters */
-    filter_chain_Delete( p_sys->p_vf2 );
+    if( p_sys->p_vf2 )
+        filter_chain_Delete( p_sys->p_vf2 );
 
     vlc_mutex_lock( p_sys->p_lock );
 
@@ -602,7 +616,7 @@ static int Send( sout_stream_t *p_stream, sout_stream_id_t *id,
             if ( p_new_pic == NULL )
             {
                 msg_Err( p_stream, "image conversion failed" );
-                p_pic->pf_release( p_pic );
+                picture_Release( p_pic );
                 continue;
             }
         }
@@ -623,13 +637,13 @@ static int Send( sout_stream_t *p_stream, sout_stream_id_t *id,
                                   p_sys->p_decoder->fmt_out.video.i_aspect )
                 != VLC_SUCCESS )
             {
-                p_pic->pf_release( p_pic );
+                picture_Release( p_pic );
                 free( p_new_pic );
                 msg_Err( p_stream, "image allocation failed" );
                 continue;
             }
 
-            vout_CopyPicture( p_stream, p_new_pic, p_pic );
+            picture_Copy( p_new_pic, p_pic );
         }
 
         p_new_pic->i_refcount = 1;
@@ -638,7 +652,7 @@ static int Send( sout_stream_t *p_stream, sout_stream_id_t *id,
         p_new_pic->p_sys = (picture_sys_t *)p_new_pic->pf_release;
         p_new_pic->pf_release = ReleasePicture;
         p_new_pic->date = p_pic->date;
-        p_pic->pf_release( p_pic );
+        picture_Release( p_pic );
 
         if( p_sys->p_vf2 )
             p_new_pic = filter_chain_VideoFilter( p_sys->p_vf2, p_new_pic );