X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fstream_out%2Ftranscode%2Fvideo.c;h=130f64b90c26295d6e30d2f31afd4d65fced2acc;hb=45ee0e5c08f3ace0cb314f9108839ce856ba3f4e;hp=b983ddc0cafabedf57110c2d9ad31e4bc19ea139;hpb=623941a741a7c5a2e273da59975ec12d0480d441;p=vlc diff --git a/modules/stream_out/transcode/video.c b/modules/stream_out/transcode/video.c index b983ddc0ca..130f64b90c 100644 --- a/modules/stream_out/transcode/video.c +++ b/modules/stream_out/transcode/video.c @@ -42,23 +42,6 @@ struct decoder_owner_sys_t sout_stream_sys_t *p_sys; }; -static inline void video_timer_start( encoder_t * p_encoder ) -{ - stats_TimerStart( p_encoder, "encoding video frame", - STATS_TIMER_VIDEO_FRAME_ENCODING ); -} - -static inline void video_timer_stop( encoder_t * p_encoder ) -{ - stats_TimerStop( p_encoder, STATS_TIMER_VIDEO_FRAME_ENCODING ); -} - -static inline void video_timer_close( encoder_t * p_encoder ) -{ - stats_TimerDump( p_encoder, STATS_TIMER_VIDEO_FRAME_ENCODING ); - stats_TimerClean( p_encoder, STATS_TIMER_VIDEO_FRAME_ENCODING ); -} - static void video_del_buffer_decoder( decoder_t *p_decoder, picture_t *p_pic ) { VLC_UNUSED(p_decoder); @@ -125,24 +108,22 @@ static void transcode_video_filter_allocation_clear( filter_t *p_filter ) VLC_UNUSED(p_filter); } -static void* EncoderThread( vlc_object_t* p_this ) +static void* EncoderThread( void *obj ) { - sout_stream_sys_t *p_sys = (sout_stream_sys_t*)p_this; + sout_stream_sys_t *p_sys = (sout_stream_sys_t*)obj; 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 ) + for( ;; ) { block_t *p_block; vlc_mutex_lock( &p_sys->lock_out ); - while( p_sys->i_last_pic == p_sys->i_first_pic ) - { + while( !p_sys->b_abort && p_sys->i_last_pic == p_sys->i_first_pic ) vlc_cond_wait( &p_sys->cond, &p_sys->lock_out ); - if( !vlc_object_alive (p_sys) || p_sys->b_error ) break; - } - if( !vlc_object_alive (p_sys) || p_sys->b_error ) + + if( p_sys->b_abort ) { vlc_mutex_unlock( &p_sys->lock_out ); break; @@ -152,9 +133,7 @@ static void* EncoderThread( vlc_object_t* p_this ) p_sys->i_first_pic %= PICTURE_RING_SIZE; vlc_mutex_unlock( &p_sys->lock_out ); - video_timer_start( id->p_encoder ); p_block = id->p_encoder->pf_encode_video( id->p_encoder, p_pic ); - video_timer_stop( id->p_encoder ); vlc_mutex_lock( &p_sys->lock_out ); block_ChainAppend( &p_sys->p_buffers, p_block ); @@ -274,8 +253,8 @@ int transcode_video_new( sout_stream_t *p_stream, sout_stream_id_t *id ) p_sys->i_first_pic = 0; p_sys->i_last_pic = 0; p_sys->p_buffers = NULL; - p_sys->b_die = p_sys->b_error = 0; - if( vlc_thread_create( p_sys, "encoder", EncoderThread, i_priority ) ) + p_sys->b_abort = 0; + if( vlc_clone( &p_sys->thread, EncoderThread, p_sys, i_priority ) ) { msg_Err( p_stream, "cannot spawn encoder thread" ); module_unneed( id->p_decoder, id->p_decoder->p_module ); @@ -501,8 +480,8 @@ static void transcode_video_encoder_init( sout_stream_t *p_stream, id->p_decoder->fmt_out.video.i_sar_den, 0 ); - id->p_encoder->fmt_out.video.i_sar_num = id->p_decoder->fmt_out.video.i_sar_num * i_src_width / i_dst_width; - id->p_encoder->fmt_out.video.i_sar_den = id->p_decoder->fmt_out.video.i_sar_den * i_src_height / i_dst_height; + id->p_encoder->fmt_out.video.i_sar_num = id->p_decoder->fmt_out.video.i_sar_num * i_src_width * i_dst_height; + id->p_encoder->fmt_out.video.i_sar_den = id->p_decoder->fmt_out.video.i_sar_den * i_src_height * i_dst_width; } vlc_ureduce( &id->p_encoder->fmt_out.video.i_sar_num, &id->p_encoder->fmt_out.video.i_sar_den, @@ -564,16 +543,15 @@ void transcode_video_close( sout_stream_t *p_stream, if( p_stream->p_sys->i_threads >= 1 ) { vlc_mutex_lock( &p_stream->p_sys->lock_out ); - vlc_object_kill( p_stream->p_sys ); + p_stream->p_sys->b_abort = true; vlc_cond_signal( &p_stream->p_sys->cond ); vlc_mutex_unlock( &p_stream->p_sys->lock_out ); - vlc_thread_join( p_stream->p_sys ); + + vlc_join( p_stream->p_sys->thread, NULL ); vlc_mutex_destroy( &p_stream->p_sys->lock_out ); vlc_cond_destroy( &p_stream->p_sys->cond ); } - video_timer_close( id->p_encoder ); - /* Close decoder */ if( id->p_decoder->p_module ) module_unneed( id->p_decoder, id->p_decoder->p_module ); @@ -607,9 +585,7 @@ int transcode_video_process( sout_stream_t *p_stream, sout_stream_id_t *id, { block_t *p_block; do { - video_timer_start( id->p_encoder ); p_block = id->p_encoder->pf_encode_video(id->p_encoder, NULL ); - video_timer_stop( id->p_encoder ); block_ChainAppend( out, p_block ); } while( p_block ); } @@ -627,8 +603,6 @@ int transcode_video_process( sout_stream_t *p_stream, sout_stream_id_t *id, while( (p_pic = id->p_decoder->pf_decode_video( id->p_decoder, &in )) ) { - sout_UpdateStatistic( p_stream->p_sout, SOUT_STATISTIC_DECODED_VIDEO, 1 ); - if( p_stream->p_sout->i_out_pace_nocontrol && p_sys->b_hurry_up ) { mtime_t current_date = mdate(); @@ -745,10 +719,7 @@ int transcode_video_process( sout_stream_t *p_stream, sout_stream_id_t *id, { block_t *p_block; - video_timer_start( id->p_encoder ); p_block = id->p_encoder->pf_encode_video( id->p_encoder, p_pic ); - video_timer_stop( id->p_encoder ); - block_ChainAppend( out, p_block ); } @@ -781,9 +752,7 @@ int transcode_video_process( sout_stream_t *p_stream, sout_stream_id_t *id, { block_t *p_block; p_pic->date = i_pts; - video_timer_start( id->p_encoder ); p_block = id->p_encoder->pf_encode_video(id->p_encoder, p_pic); - video_timer_stop( id->p_encoder ); block_ChainAppend( out, p_block ); } }