X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fstream_out%2Ftranscode.c;h=2e675587428f31a14fbfb4fb2a23d8a2c6c0a492;hb=4f66b0775778c153c2a5445b5e603e2857d7a38f;hp=1c417c80d197cac3ee08f10a7d60ef49ece6b6f1;hpb=542c7f08e14ae69cfcb1781e56e41a9a053cd974;p=vlc diff --git a/modules/stream_out/transcode.c b/modules/stream_out/transcode.c index 1c417c80d1..2e67558742 100644 --- a/modules/stream_out/transcode.c +++ b/modules/stream_out/transcode.c @@ -1146,7 +1146,7 @@ static int transcode_audio_new( sout_stream_t *p_stream, 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 = @@ -1261,8 +1261,15 @@ static int transcode_audio_new( sout_stream_t *p_stream, 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 ); @@ -1566,7 +1573,7 @@ static int transcode_video_new( sout_stream_t *p_stream, sout_stream_id_t *id ) 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; @@ -1949,6 +1956,8 @@ static int transcode_video_process( sout_stream_t *p_stream, 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 ) @@ -1972,7 +1981,7 @@ static int transcode_video_process( sout_stream_t *p_stream, 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 */ } @@ -2008,7 +2017,7 @@ static int transcode_video_process( sout_stream_t *p_stream, 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 ); } @@ -2102,6 +2111,7 @@ 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 ) { @@ -2142,6 +2152,7 @@ static void* EncoderThread( vlc_object_t* p_this ) } block_ChainRelease( p_sys->p_buffers ); + vlc_restorecancel (canc); return NULL; } @@ -2267,6 +2278,7 @@ static void video_del_buffer( vlc_object_t *p_this, picture_t *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 ); @@ -2278,6 +2290,7 @@ static void video_del_buffer_decoder( decoder_t *p_decoder, picture_t *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 ) @@ -2285,6 +2298,7 @@ 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 ) @@ -2511,7 +2525,7 @@ static int transcode_osd_process( sout_stream_t *p_stream, /* 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 {