#include <vlc_sout.h>
#include <vlc_block.h>
#include <vlc_codec.h>
+#include <vlc_meta.h>
#include <vlc_image.h>
#include <vlc_filter.h>
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;
}
else
{
+ free( p_pic->p_q );
free( p_pic->p_data_orig );
free( p_pic );
}
#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
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;
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" );
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, ':' );
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;
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 );
//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;
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;
}
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 );
}
/* 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 );
if ( p_new_pic == NULL )
{
msg_Err( p_stream, "image conversion failed" );
- p_pic->pf_release( p_pic );
+ picture_Release( p_pic );
continue;
}
}
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;
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 );