[FFmpeg-devel] [PATCH] ffplay: more robust thread creation
Ganesh Ajjanagadde
gajjanag at mit.edu
Sun Oct 4 00:50:38 CEST 2015
On Sat, Oct 3, 2015 at 6:05 PM, Marton Balint <cus at passwd.hu> wrote:
>
> On Sat, 3 Oct 2015, Ganesh Ajjanagadde wrote:
>
>> SDL_CreateThread can fail:
>> https://wiki.libsdl.org/SDL_CreateThread.
>> This patch makes thread creation more robust in one instance.
>>
>> Signed-off-by: Ganesh Ajjanagadde <gajjanagadde at gmail.com>
>> ---
>> ffplay.c | 16 ++++++++++++----
>> 1 file changed, 12 insertions(+), 4 deletions(-)
>>
>> diff --git a/ffplay.c b/ffplay.c
>> index b7b2b0b..da0fd3a 100644
>> --- a/ffplay.c
>> +++ b/ffplay.c
>> @@ -2080,10 +2080,15 @@ static int audio_thread(void *arg)
>> return ret;
>> }
>>
>> -static void decoder_start(Decoder *d, int (*fn)(void *), void *arg)
>> +static int decoder_start(Decoder *d, int (*fn)(void *), void *arg)
>> {
>> packet_queue_start(d->queue);
>> d->decoder_tid = SDL_CreateThread(fn, arg);
>> + if (!d->decoder_tid) {
>> + av_log(d, AV_LOG_FATAL, "SDL_CreateThread(): %s\n",
>> SDL_GetError());
>> + return AVERROR(ENOMEM);
>> + }
>> + return 0;
>> }
>>
>> static int video_thread(void *arg)
>> @@ -2681,7 +2686,8 @@ static int stream_component_open(VideoState *is, int
>> stream_index)
>> is->auddec.start_pts = is->audio_st->start_time;
>> is->auddec.start_pts_tb = is->audio_st->time_base;
>> }
>> - decoder_start(&is->auddec, audio_thread, is);
>> + if (decoder_start(&is->auddec, audio_thread, is) < 0)
>> + goto fail;
>> SDL_PauseAudio(0);
>> break;
>> case AVMEDIA_TYPE_VIDEO:
>> @@ -2692,7 +2698,8 @@ static int stream_component_open(VideoState *is, int
>> stream_index)
>> is->viddec_height = avctx->height;
>>
>> decoder_init(&is->viddec, avctx, &is->videoq,
>> is->continue_read_thread);
>> - decoder_start(&is->viddec, video_thread, is);
>> + if (decoder_start(&is->viddec, video_thread, is) < 0)
>> + goto fail;
>> is->queue_attachments_req = 1;
>> break;
>> case AVMEDIA_TYPE_SUBTITLE:
>> @@ -2700,7 +2707,8 @@ static int stream_component_open(VideoState *is, int
>> stream_index)
>> is->subtitle_st = ic->streams[stream_index];
>>
>> decoder_init(&is->subdec, avctx, &is->subtitleq,
>> is->continue_read_thread);
>> - decoder_start(&is->subdec, subtitle_thread, is);
>> + if (decoder_start(&is->subdec, subtitle_thread, is) < 0)
>> + goto fail;
>
>
> You should propagate the error code to the failure path, otherwise
> stream_component_open will simply return with zero in case of error as well.
Thanks, updated patch. I also changed AV_LOG_FATAL to AV_LOG_ERROR,
since (I assume) even if one stream component fails, others might
still be able to be opened, i.e a "lossy playback" is still
theoretically possible.
>
> Regards,
> Marton
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
More information about the ffmpeg-devel
mailing list