static int transcode_osd_process( sout_stream_t *, sout_stream_id_t *,
block_t *, block_t ** );
-static int EncoderThread( struct sout_stream_sys_t * p_sys );
+static void* EncoderThread( vlc_object_t * p_this );
static const int pi_channels_maps[6] =
{
(fmt_last.audio.i_rate != id->p_encoder->fmt_in.audio.i_rate) ||
(fmt_last.i_codec != id->p_encoder->fmt_in.i_codec) )
{
- filter_chain_AppendFilter( id->p_f_chain, NULL, NULL, &fmt_last, &id->p_encoder->fmt_in );
+ msg_Dbg( p_stream, "Looking for filter "
+ "(%4.4s->%4.4s, channels %d->%d, rate %d->%d)",
+ (char *)&fmt_last.i_codec,
+ (char *)&id->p_encoder->fmt_in.i_codec,
+ fmt_last.audio.i_channels,
+ id->p_encoder->fmt_in.audio.i_channels,
+ fmt_last.audio.i_rate,
+ id->p_encoder->fmt_in.audio.i_rate );
+ filter_chain_AppendFilter( id->p_f_chain, NULL, NULL,
+ &fmt_last, &id->p_encoder->fmt_in );
fmt_last = *filter_chain_GetFmtOut( id->p_f_chain );
}
+ else break;
}
/* Final checks to see if conversions were successful */
if( fmt_last.i_codec != id->p_encoder->fmt_in.i_codec )
{
- msg_Err( p_stream, "no audio filter found (%4.4s->%4.4s)",
+ msg_Err( p_stream, "no audio filter found "
+ "(%4.4s->%4.4s, channels %d->%d, rate %d->%d)",
(char *)&fmt_last.i_codec,
- (char *)&id->p_encoder->fmt_in.i_codec );
+ (char *)&id->p_encoder->fmt_in.i_codec,
+ fmt_last.audio.i_channels,
+ id->p_encoder->fmt_in.audio.i_channels,
+ fmt_last.audio.i_rate,
+ id->p_encoder->fmt_in.audio.i_rate );
transcode_audio_close( id );
return VLC_EGENERIC;
}
transcode_audio_filter_allocation_init, NULL, NULL );
filter_chain_Reset( id->p_uf_chain, &fmt_last, &id->p_encoder->fmt_in );
filter_chain_AppendFromString( id->p_uf_chain, p_sys->psz_af2 );
+ fmt_last = *filter_chain_GetFmtOut( id->p_uf_chain );
}
if( fmt_last.audio.i_channels != id->p_encoder->fmt_in.audio.i_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 );
- if( !id->p_encoder->p_module )
+ 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 );
id->p_decoder->pf_picture_link = video_link_picture_decoder;
id->p_decoder->pf_picture_unlink = video_unlink_picture_decoder;
id->p_decoder->p_owner = malloc( sizeof(decoder_owner_sys_t) );
+ if( !id->p_decoder->p_owner )
+ return VLC_EGENERIC;
+
for( i = 0; i < PICTURE_RING_SIZE; i++ )
id->p_decoder->p_owner->pp_pics[i] = 0;
id->p_decoder->p_owner->p_sys = p_sys;
if( !id->p_decoder->p_module )
{
msg_Err( p_stream, "cannot find video decoder" );
+ free( id->p_decoder->p_owner );
return VLC_EGENERIC;
}
(char *)&p_sys->i_vcodec );
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;
}
msg_Err( p_stream, "cannot spawn encoder thread" );
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_width;
id->p_encoder->fmt_out.video.i_height =
id->p_encoder->fmt_in.video.i_height;
+ id->p_encoder->fmt_out.video.i_aspect =
+ id->p_encoder->fmt_in.video.i_aspect;
}
if( transcode_video_encoder_open( p_stream, id ) != VLC_SUCCESS )
{
- filter_chain_Delete( id->p_f_chain );
- if( id->p_uf_chain )
- filter_chain_Delete( id->p_uf_chain );
p_pic->pf_release( p_pic );
transcode_video_close( p_stream, id );
id->b_transcode = false;
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,
+ spu_RenderSubpictures( p_sys->p_spu, &fmt, p_pic, p_subpic,
i_scale_width, i_scale_height );
}
return VLC_SUCCESS;
}
-static int EncoderThread( sout_stream_sys_t *p_sys )
+static void* EncoderThread( vlc_object_t* p_this )
{
+ sout_stream_sys_t *p_sys = (sout_stream_sys_t*)p_this;
sout_stream_id_t *id = p_sys->id_video;
picture_t *p_pic;
+ int canc = vlc_savecancel ();
while( vlc_object_alive (p_sys) && !p_sys->b_error )
{
}
block_ChainRelease( p_sys->p_buffers );
- return 0;
+ vlc_restorecancel (canc);
+ return NULL;
}
struct picture_sys_t
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 )