# include "config.h"
#endif
-#include <errno.h> /* ENOMEM */
-
#include <vlc_common.h>
#include <vlc_plugin.h>
#include <vlc_sout.h>
#include <vlc_image.h>
#include <vlc_filter.h>
+#include <vlc_modules.h>
#include "../video_filter/mosaic.h"
struct sout_stream_sys_t
{
bridged_es_t *p_es;
- vlc_mutex_t *p_lock;
decoder_t *p_decoder;
image_handler_t *p_image; /* filter for resizing */
set_capability( "sout stream", 0 )
add_shortcut( "mosaic-bridge" )
- add_string( CFG_PREFIX "id", "Id", NULL, ID_TEXT, ID_LONGTEXT,
+ add_string( CFG_PREFIX "id", "Id", ID_TEXT, ID_LONGTEXT,
false )
- add_integer( CFG_PREFIX "width", 0, NULL, WIDTH_TEXT,
+ add_integer( CFG_PREFIX "width", 0, WIDTH_TEXT,
WIDTH_LONGTEXT, true )
- add_integer( CFG_PREFIX "height", 0, NULL, HEIGHT_TEXT,
+ add_integer( CFG_PREFIX "height", 0, HEIGHT_TEXT,
HEIGHT_LONGTEXT, true )
- add_string( CFG_PREFIX "sar", "1:1", NULL, RATIO_TEXT,
+ add_string( CFG_PREFIX "sar", "1:1", RATIO_TEXT,
RATIO_LONGTEXT, false )
- add_string( CFG_PREFIX "chroma", NULL, NULL, CHROMA_TEXT, CHROMA_LONGTEXT,
+ add_string( CFG_PREFIX "chroma", NULL, CHROMA_TEXT, CHROMA_LONGTEXT,
false )
add_module_list( CFG_PREFIX "vfilter", "video filter2",
- NULL, NULL, VFILTER_TEXT, VFILTER_LONGTEXT, false )
+ NULL, VFILTER_TEXT, VFILTER_LONGTEXT, false )
- add_integer_with_range( CFG_PREFIX "alpha", 255, 0, 255, NULL,
+ add_integer_with_range( CFG_PREFIX "alpha", 255, 0, 255,
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 )
+ add_integer( CFG_PREFIX "x", -1, X_TEXT, X_LONGTEXT, false )
+ add_integer( CFG_PREFIX "y", -1, Y_TEXT, Y_LONGTEXT, false )
set_callbacks( Open, Close )
vlc_module_end ()
{
sout_stream_t *p_stream = (sout_stream_t *)p_this;
sout_stream_sys_t *p_sys;
- vlc_object_t *p_libvlc = VLC_OBJECT( p_this->p_libvlc );
vlc_value_t val;
config_ChainParse( p_stream, CFG_PREFIX, ppsz_sout_options,
p_stream->p_sys = p_sys;
p_sys->b_inited = false;
- var_Create( p_libvlc, "mosaic-lock", VLC_VAR_MUTEX );
- var_Get( p_libvlc, "mosaic-lock", &val );
- p_sys->p_lock = val.p_address;
-
p_sys->psz_id = var_CreateGetString( p_stream, CFG_PREFIX "id" );
p_sys->i_height =
static int video_filter_buffer_allocation_init( filter_t *p_filter, void *p_data )
{
- p_filter->pf_vout_buffer_new = video_new_buffer_filter;
- p_filter->pf_vout_buffer_del = video_del_buffer_filter;
+ p_filter->pf_video_buffer_new = video_new_buffer_filter;
+ p_filter->pf_video_buffer_del = video_del_buffer_filter;
p_filter->p_owner = p_data;
return VLC_SUCCESS;
}
return NULL;
/* Create decoder object */
- p_sys->p_decoder = vlc_object_create( p_stream, VLC_OBJECT_DECODER );
+ p_sys->p_decoder = vlc_object_create( p_stream, sizeof( decoder_t ) );
if( !p_sys->p_decoder )
return NULL;
- vlc_object_attach( p_sys->p_decoder, p_stream );
p_sys->p_decoder->p_module = NULL;
p_sys->p_decoder->fmt_in = *p_fmt;
p_sys->p_decoder->b_pace_control = false;
p_sys->p_decoder->p_owner = malloc( sizeof(decoder_owner_sys_t) );
if( !p_sys->p_decoder->p_owner )
{
- vlc_object_detach( p_sys->p_decoder );
vlc_object_release( p_sys->p_decoder );
return NULL;
}
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;
}
p_sys->b_inited = true;
- vlc_mutex_lock( p_sys->p_lock );
+ vlc_global_lock( VLC_MOSAIC_MUTEX );
p_bridge = GetBridge( p_stream );
if ( p_bridge == NULL )
p_es->pp_last = &p_es->p_picture;
p_es->b_empty = false;
- vlc_mutex_unlock( p_sys->p_lock );
+ vlc_global_unlock( VLC_MOSAIC_MUTEX );
if ( p_sys->i_height || p_sys->i_width )
{
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 );
free( p_owner );
if( p_sys->p_vf2 )
filter_chain_Delete( p_sys->p_vf2 );
- vlc_mutex_lock( p_sys->p_lock );
+ vlc_global_lock( VLC_MOSAIC_MUTEX );
p_bridge = GetBridge( p_stream );
p_es = p_sys->p_es;
var_Destroy( p_libvlc, "mosaic-struct" );
}
- vlc_mutex_unlock( p_sys->p_lock );
+ vlc_global_unlock( VLC_MOSAIC_MUTEX );
if ( p_sys->p_image )
{
sout_stream_sys_t *p_sys = p_stream->p_sys;
bridged_es_t *p_es = p_sys->p_es;
- vlc_mutex_lock( p_sys->p_lock );
+ vlc_global_lock( VLC_MOSAIC_MUTEX );
*p_es->pp_last = p_picture;
p_picture->p_next = NULL;
p_es->pp_last = &p_picture->p_next;
- vlc_mutex_unlock( p_sys->p_lock );
+ vlc_global_unlock( VLC_MOSAIC_MUTEX );
}
static int Send( sout_stream_t *p_stream, sout_stream_id_t *id,
else
fmt_out.i_chroma = VLC_CODEC_I420;
+ const unsigned i_fmt_in_aspect =
+ (int64_t)VOUT_ASPECT_FACTOR *
+ fmt_in.i_sar_num * fmt_in.i_width /
+ (fmt_in.i_sar_den * fmt_in.i_height);
if ( !p_sys->i_height )
{
fmt_out.i_width = p_sys->i_width;
fmt_out.i_height = (p_sys->i_width * VOUT_ASPECT_FACTOR
- * p_sys->i_sar_num / p_sys->i_sar_den / fmt_in.i_aspect)
+ * p_sys->i_sar_num / p_sys->i_sar_den / i_fmt_in_aspect)
& ~0x1;
}
else if ( !p_sys->i_width )
{
fmt_out.i_height = p_sys->i_height;
- fmt_out.i_width = (p_sys->i_height * fmt_in.i_aspect
+ fmt_out.i_width = (p_sys->i_height * i_fmt_in_aspect
* p_sys->i_sar_den / p_sys->i_sar_num / VOUT_ASPECT_FACTOR)
& ~0x1;
}
p_new_pic = picture_New( p_pic->format.i_chroma,
p_pic->format.i_width, p_pic->format.i_height,
- p_sys->p_decoder->fmt_out.video.i_aspect * p_pic->format.i_height,
- VOUT_ASPECT_FACTOR * p_pic->format.i_width );
+ p_sys->p_decoder->fmt_out.video.i_sar_num,
+ p_sys->p_decoder->fmt_out.video.i_sar_den );
if( !p_new_pic )
{
picture_Release( p_pic );
if( fmt_out->video.i_width != p_sys->video.i_width ||
fmt_out->video.i_height != p_sys->video.i_height ||
fmt_out->video.i_chroma != p_sys->video.i_chroma ||
- fmt_out->video.i_aspect != p_sys->video.i_aspect )
+ (int64_t)fmt_out->video.i_sar_num * p_sys->video.i_sar_den !=
+ (int64_t)fmt_out->video.i_sar_den * p_sys->video.i_sar_num )
{
- if( !fmt_out->video.i_sar_num ||
- !fmt_out->video.i_sar_den )
- {
- fmt_out->video.i_sar_num =
- fmt_out->video.i_aspect * fmt_out->video.i_height;
-
- fmt_out->video.i_sar_den =
- VOUT_ASPECT_FACTOR * fmt_out->video.i_width;
- }
-
vlc_ureduce( &fmt_out->video.i_sar_num,
&fmt_out->video.i_sar_den,
fmt_out->video.i_sar_num,