[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