#define SOUT_CFG_PREFIX "sout-transcode-"
-vlc_module_begin();
- set_shortname( N_("Transcode"));
- set_description( N_("Transcode stream output") );
- set_capability( "sout stream", 50 );
- add_shortcut( "transcode" );
- set_callbacks( Open, Close );
- set_category( CAT_SOUT );
- set_subcategory( SUBCAT_SOUT_STREAM );
- set_section( N_("Video"), NULL );
+vlc_module_begin ()
+ set_shortname( N_("Transcode"))
+ set_description( N_("Transcode stream output") )
+ set_capability( "sout stream", 50 )
+ add_shortcut( "transcode" )
+ set_callbacks( Open, Close )
+ set_category( CAT_SOUT )
+ set_subcategory( SUBCAT_SOUT_STREAM )
+ set_section( N_("Video"), NULL )
add_string( SOUT_CFG_PREFIX "venc", NULL, NULL, VENC_TEXT,
VENC_LONGTEXT, false );
add_string( SOUT_CFG_PREFIX "vcodec", NULL, NULL, VCODEC_TEXT,
NULL, NULL,
VFILTER_TEXT, VFILTER_LONGTEXT, false );
- set_section( N_("Audio"), NULL );
+ set_section( N_("Audio"), NULL )
add_string( SOUT_CFG_PREFIX "aenc", NULL, NULL, AENC_TEXT,
AENC_LONGTEXT, false );
add_string( SOUT_CFG_PREFIX "acodec", NULL, NULL, ACODEC_TEXT,
NULL, NULL,
AFILTER_TEXT, AFILTER_LONGTEXT, false );
- set_section( N_("Overlays/Subtitles"), NULL );
+ set_section( N_("Overlays/Subtitles"), NULL )
add_string( SOUT_CFG_PREFIX "senc", NULL, NULL, SENC_TEXT,
SENC_LONGTEXT, false );
add_string( SOUT_CFG_PREFIX "scodec", NULL, NULL, SCODEC_TEXT,
NULL, NULL,
SFILTER_TEXT, SFILTER_LONGTEXT, false );
- set_section( N_("On Screen Display"), NULL );
+ set_section( N_("On Screen Display"), NULL )
add_bool( SOUT_CFG_PREFIX "osd", 0, NULL, OSD_TEXT,
OSD_LONGTEXT, false );
- set_section( N_("Miscellaneous"), NULL );
+ set_section( N_("Miscellaneous"), NULL )
add_integer( SOUT_CFG_PREFIX "threads", 0, NULL, THREADS_TEXT,
THREADS_LONGTEXT, true );
add_bool( SOUT_CFG_PREFIX "high-priority", 0, NULL, HP_TEXT, HP_LONGTEXT,
true );
-vlc_module_end();
+vlc_module_end ()
static const char *const ppsz_sout_options[] = {
"venc", "vcodec", "vb",
/* id->p_decoder->p_cfg = p_sys->p_audio_cfg; */
id->p_decoder->p_module =
- module_Need( id->p_decoder, "decoder", "$codec", 0 );
+ module_need( id->p_decoder, "decoder", "$codec", 0 );
if( !id->p_decoder->p_module )
{
msg_Err( p_stream, "cannot find audio decoder" );
id->p_decoder->fmt_out.i_codec );
id->p_encoder->fmt_in.audio.i_format = id->p_decoder->fmt_out.i_codec;
- id->p_encoder->fmt_in.audio.i_rate = fmt_last.audio.i_rate;//id->p_encoder->fmt_out.audio.i_rate;
+ id->p_encoder->fmt_in.audio.i_rate = id->p_encoder->fmt_out.audio.i_rate;
id->p_encoder->fmt_in.audio.i_physical_channels =
id->p_encoder->fmt_out.audio.i_physical_channels;
id->p_encoder->fmt_in.audio.i_original_channels =
id->p_encoder->p_cfg = p_stream->p_sys->p_audio_cfg;
id->p_encoder->p_module =
- module_Need( id->p_encoder, "encoder", p_sys->psz_aenc, true );
+ module_need( id->p_encoder, "encoder", p_sys->psz_aenc, true );
if( !id->p_encoder->p_module )
{
msg_Err( p_stream, "cannot find audio encoder (module:%s fourcc:%4.4s)",
p_sys->psz_aenc ? p_sys->psz_aenc : "any",
(char *)&p_sys->i_acodec );
- module_Unneed( id->p_decoder, id->p_decoder->p_module );
+ module_unneed( id->p_decoder, id->p_decoder->p_module );
id->p_decoder->p_module = NULL;
return VLC_EGENERIC;
}
if( fmt_last.audio.i_channels != id->p_encoder->fmt_in.audio.i_channels )
{
#if 1
- module_Unneed( id->p_encoder, id->p_encoder->p_module );
+ module_unneed( id->p_encoder, id->p_encoder->p_module );
id->p_encoder->p_module = NULL;
/* This might work, but only if the encoder is restarted */
/* reload encoder */
id->p_encoder->p_cfg = p_stream->p_sys->p_audio_cfg;
id->p_encoder->p_module =
- module_Need( id->p_encoder, "encoder", p_sys->psz_aenc, true );
- if( !id->p_encoder->p_module )
+ module_need( id->p_encoder, "encoder", p_sys->psz_aenc, true );
+ if( !id->p_encoder->p_module ||
+ fmt_last.audio.i_channels != id->p_encoder->fmt_in.audio.i_channels ||
+ fmt_last.i_codec != id->p_encoder->fmt_in.i_codec )
{
+ if( id->p_encoder->p_module )
+ {
+ module_unneed( id->p_encoder, id->p_encoder->p_module );
+ id->p_encoder->p_module = NULL;
+ }
msg_Err( p_stream, "cannot find audio encoder (module:%s fourcc:%4.4s)",
p_sys->psz_aenc ? p_sys->psz_aenc : "any",
(char *)&p_sys->i_acodec );
/* Close decoder */
if( id->p_decoder->p_module )
- module_Unneed( id->p_decoder, id->p_decoder->p_module );
+ module_unneed( id->p_decoder, id->p_decoder->p_module );
id->p_decoder->p_module = NULL;
/* Close encoder */
if( id->p_encoder->p_module )
- module_Unneed( id->p_encoder, id->p_encoder->p_module );
+ module_unneed( id->p_encoder, id->p_encoder->p_module );
id->p_encoder->p_module = NULL;
/* Close filters */
/* id->p_decoder->p_cfg = p_sys->p_video_cfg; */
id->p_decoder->p_module =
- module_Need( id->p_decoder, "decoder", "$codec", 0 );
+ module_need( id->p_decoder, "decoder", "$codec", 0 );
if( !id->p_decoder->p_module )
{
id->p_encoder->p_cfg = p_sys->p_video_cfg;
id->p_encoder->p_module =
- module_Need( id->p_encoder, "encoder", p_sys->psz_venc, true );
+ module_need( id->p_encoder, "encoder", p_sys->psz_venc, true );
if( !id->p_encoder->p_module )
{
msg_Err( p_stream, "cannot find video encoder (module:%s fourcc:%4.4s)",
p_sys->psz_venc ? p_sys->psz_venc : "any",
(char *)&p_sys->i_vcodec );
- module_Unneed( id->p_decoder, id->p_decoder->p_module );
+ module_unneed( id->p_decoder, id->p_decoder->p_module );
id->p_decoder->p_module = 0;
free( id->p_decoder->p_owner );
return VLC_EGENERIC;
/* Close the encoder.
* We'll open it only when we have the first frame. */
- module_Unneed( id->p_encoder, id->p_encoder->p_module );
+ module_unneed( id->p_encoder, id->p_encoder->p_module );
if( id->p_encoder->fmt_out.p_extra )
{
free( id->p_encoder->fmt_out.p_extra );
VLC_THREAD_PRIORITY_VIDEO;
p_sys->id_video = id;
vlc_mutex_init( &p_sys->lock_out );
- vlc_cond_init( p_stream, &p_sys->cond );
+ vlc_cond_init( &p_sys->cond );
memset( p_sys->pp_pics, 0, sizeof(p_sys->pp_pics) );
p_sys->i_first_pic = 0;
p_sys->i_last_pic = 0;
false ) )
{
msg_Err( p_stream, "cannot spawn encoder thread" );
- module_Unneed( id->p_decoder, id->p_decoder->p_module );
+ module_unneed( id->p_decoder, id->p_decoder->p_module );
id->p_decoder->p_module = 0;
free( id->p_decoder->p_owner );
return VLC_EGENERIC;
id->p_encoder->fmt_in.video.i_height );
id->p_encoder->p_module =
- module_Need( id->p_encoder, "encoder", p_sys->psz_venc, true );
+ module_need( id->p_encoder, "encoder", p_sys->psz_venc, true );
if( !id->p_encoder->p_module )
{
msg_Err( p_stream, "cannot find video encoder (module:%s fourcc:%4.4s)",
/* Close decoder */
if( id->p_decoder->p_module )
- module_Unneed( id->p_decoder, id->p_decoder->p_module );
+ module_unneed( id->p_decoder, id->p_decoder->p_module );
if( id->p_decoder->p_owner )
{
/* Close encoder */
if( id->p_encoder->p_module )
- module_Unneed( id->p_encoder, id->p_encoder->p_module );
+ module_unneed( id->p_encoder, id->p_encoder->p_module );
/* Close filters */
if( id->p_f_chain )
if( p_sys->p_spu )
{
p_subpic = spu_SortSubpictures( p_sys->p_spu, p_pic->date,
- false /* Fixme: check if stream is paused */ );
+ false /* Fixme: check if stream is paused */, false );
/* TODO: get another pic */
}
/* Overlay subpicture */
if( p_subpic )
{
- int i_scale_width, i_scale_height;
video_format_t fmt;
- i_scale_width = id->p_encoder->fmt_in.video.i_width * 1000 /
- id->p_decoder->fmt_out.video.i_width;
- i_scale_height = id->p_encoder->fmt_in.video.i_height * 1000 /
- id->p_decoder->fmt_out.video.i_height;
-
if( p_pic->i_refcount && !filter_chain_GetLength( id->p_f_chain ) )
{
/* We can't modify the picture, we need to duplicate it */
picture_t *p_tmp = video_new_buffer_decoder( id->p_decoder );
if( p_tmp )
{
- vout_CopyPicture( p_stream, p_tmp, p_pic );
+ picture_Copy( p_tmp, p_pic );
p_pic->pf_release( p_pic );
p_pic = p_tmp;
}
fmt.i_sar_num = fmt.i_aspect * fmt.i_height / fmt.i_width;
fmt.i_sar_den = VOUT_ASPECT_FACTOR;
- spu_RenderSubpictures( p_sys->p_spu, &fmt, p_pic, p_pic, p_subpic,
- i_scale_width, i_scale_height );
+ spu_RenderSubpictures( p_sys->p_spu, p_pic, &fmt,
+ p_subpic, &id->p_decoder->fmt_out.video, false );
}
/* Run user specified filter chain */
p_pic2 = video_new_buffer_decoder( id->p_decoder );
if( p_pic2 != NULL )
{
- vout_CopyPicture( p_stream, p_pic2, p_pic );
+ picture_Copy( p_pic2, p_pic );
p_pic2->date = i_pts;
}
}
i = 0;
}
- p_pic = malloc( sizeof(picture_t) );
+ p_pic = picture_New( p_dec->fmt_out.video.i_chroma,
+ p_dec->fmt_out.video.i_width,
+ p_dec->fmt_out.video.i_height,
+ p_dec->fmt_out.video.i_aspect );
if( !p_pic ) return NULL;
p_dec->fmt_out.video.i_chroma = p_dec->fmt_out.i_codec;
- vout_AllocatePicture( VLC_OBJECT(p_dec), p_pic,
- p_dec->fmt_out.video.i_chroma,
- p_dec->fmt_out.video.i_width,
- p_dec->fmt_out.video.i_height,
- p_dec->fmt_out.video.i_aspect );
-
- if( !p_pic->i_planes )
- {
- free( p_pic );
- return NULL;
- }
-
- p_pic->pf_release = video_release_buffer;
- p_pic->p_sys = malloc( sizeof(picture_sys_t) );
+ p_pic->p_sys = calloc( 1, sizeof(picture_sys_t) );
if( !p_pic->p_sys )
{
- free( p_pic );
+ picture_Release( p_pic );
return NULL;
}
-
- p_pic->p_sys->p_owner = p_this;
- p_pic->i_status = RESERVED_PICTURE;
+ p_pic->pf_release = video_release_buffer;
+ p_pic->i_refcount = 0;
pp_ring[i] = p_pic;
return p_pic;
VLC_UNUSED(p_this);
if( p_pic )
{
+ free( p_pic->p_q );
free( p_pic->p_data_orig );
free( p_pic->p_sys );
free( p_pic );
VLC_UNUSED(p_decoder);
p_pic->i_refcount = 0;
p_pic->i_status = DESTROYED_PICTURE;
+ picture_CleanupQuant( p_pic );
}
static void video_del_buffer_filter( filter_t *p_filter, picture_t *p_pic )
VLC_UNUSED(p_filter);
p_pic->i_refcount = 0;
p_pic->i_status = DESTROYED_PICTURE;
+ picture_CleanupQuant( p_pic );
}
static void video_link_picture_decoder( decoder_t *p_dec, picture_t *p_pic )
/* id->p_decoder->p_cfg = p_sys->p_spu_cfg; */
id->p_decoder->p_module =
- module_Need( id->p_decoder, "decoder", "$codec", 0 );
+ module_need( id->p_decoder, "decoder", "$codec", 0 );
if( !id->p_decoder->p_module )
{
id->p_encoder->p_cfg = p_sys->p_spu_cfg;
id->p_encoder->p_module =
- module_Need( id->p_encoder, "encoder", p_sys->psz_senc, true );
+ module_need( id->p_encoder, "encoder", p_sys->psz_senc, true );
if( !id->p_encoder->p_module )
{
- module_Unneed( id->p_decoder, id->p_decoder->p_module );
+ module_unneed( id->p_decoder, id->p_decoder->p_module );
msg_Err( p_stream, "cannot find spu encoder (%s)", p_sys->psz_senc );
return VLC_EGENERIC;
}
{
/* Close decoder */
if( id->p_decoder->p_module )
- module_Unneed( id->p_decoder, id->p_decoder->p_module );
+ module_unneed( id->p_decoder, id->p_decoder->p_module );
/* Close encoder */
if( id->p_encoder->p_module )
- module_Unneed( id->p_encoder, id->p_encoder->p_module );
+ module_unneed( id->p_encoder, id->p_encoder->p_module );
}
static int transcode_spu_process( sout_stream_t *p_stream,
static subpicture_t *spu_new_buffer( decoder_t *p_dec )
{
- sout_stream_t *p_stream = (sout_stream_t *)p_dec->p_owner;
- return spu_CreateSubpicture( p_stream->p_sys->p_spu );
+ VLC_UNUSED( p_dec );
+ return subpicture_New();
}
static void spu_del_buffer( decoder_t *p_dec, subpicture_t *p_subpic )
{
- sout_stream_t *p_stream = (sout_stream_t *)p_dec->p_owner;
- spu_DestroySubpicture( p_stream->p_sys->p_spu, p_subpic );
+ VLC_UNUSED( p_dec );
+ subpicture_Delete( p_subpic );
}
/*
id->p_encoder->p_cfg = p_sys->p_osd_cfg;
id->p_encoder->p_module =
- module_Need( id->p_encoder, "encoder", p_sys->psz_osdenc, true );
+ module_need( id->p_encoder, "encoder", p_sys->psz_osdenc, true );
if( !id->p_encoder->p_module )
{
error:
msg_Err( p_stream, "starting osd encoding thread failed" );
if( id->p_encoder->p_module )
- module_Unneed( id->p_encoder, id->p_encoder->p_module );
+ module_unneed( id->p_encoder, id->p_encoder->p_module );
p_sys->b_osd = false;
return VLC_EGENERIC;
}
if( id )
{
if( id->p_encoder->p_module )
- module_Unneed( id->p_encoder, id->p_encoder->p_module );
+ module_unneed( id->p_encoder, id->p_encoder->p_module );
}
p_sys->b_osd = false;
}
/* Check if we have a subpicture to send */
if( p_sys->p_spu && in->i_dts > 0)
{
- p_subpic = spu_SortSubpictures( p_sys->p_spu, in->i_dts, false );
+ p_subpic = spu_SortSubpictures( p_sys->p_spu, in->i_dts, false, false );
}
else
{
}
p_block = id->p_encoder->pf_encode_sub( id->p_encoder, p_subpic );
- spu_DestroySubpicture( p_sys->p_spu, p_subpic );
+ subpicture_Delete( p_subpic );
if( p_block )
{
p_block->i_dts = p_block->i_pts = in->i_dts;