[FFmpeg-devel] [PATCH v5] avformat/hls: Add option to retry failed segments for hls
Gyan Doshi
ffmpeg at gyani.pro
Wed Feb 8 09:55:29 EET 2023
On 2022-10-21 02:49 pm, Steven Liu wrote:
> gnattu <gnattuoc at me.com> 于2022年10月20日周四 20:12写道:
>> Current HLS implementation simply skip a failed segment to catch up
>> the stream, but this is not optimal for some use cases like livestream
>> recording.
>> Add an option to retry a failed segment to ensure the output file is
>> a complete stream.
>>
>> Signed-off-by: gnattu <gnattuoc at me.com>
>> ---
>> v5 changed coding style as requested
>> v4 added documentation for the new seg_max_try option
>>
>> doc/demuxers.texi | 4 ++++
>> libavformat/hls.c | 15 ++++++++++++++-
>> 2 files changed, 18 insertions(+), 1 deletion(-)
>>
>> diff --git a/doc/demuxers.texi b/doc/demuxers.texi
>> index 2b6dd86c2a..3e09a0f14e 100644
>> --- a/doc/demuxers.texi
>> +++ b/doc/demuxers.texi
>> @@ -401,6 +401,10 @@ Use HTTP partial requests for downloading HTTP segments.
>>
>> @item seg_format_options
>> Set options for the demuxer of media segments using a list of key=value pairs separated by @code{:}.
>> +
>> + at item seg_max_retry
>> +Maximum number of times to reload a segment on error, useful when segment skip on network error is not desired.
>> +Default value is 0.
>> @end table
>>
>> @section image2
>> diff --git a/libavformat/hls.c b/libavformat/hls.c
>> index e622425e80..2a5ffb927f 100644
>> --- a/libavformat/hls.c
>> +++ b/libavformat/hls.c
>> @@ -225,6 +225,7 @@ typedef struct HLSContext {
>> int http_persistent;
>> int http_multiple;
>> int http_seekable;
>> + int seg_max_retry;
>> AVIOContext *playlist_pb;
>> HLSCryptoContext crypto_ctx;
>> } HLSContext;
>> @@ -1472,6 +1473,7 @@ static int read_data(void *opaque, uint8_t *buf, int buf_size)
>> int ret;
>> int just_opened = 0;
>> int reload_count = 0;
>> + int segment_retries = 0;
>> struct segment *seg;
>>
>> restart:
>> @@ -1563,9 +1565,18 @@ reload:
>> av_log(v->parent, AV_LOG_WARNING, "Failed to open segment %"PRId64" of playlist %d\n",
>> v->cur_seq_no,
>> v->index);
>> - v->cur_seq_no += 1;
>> + if (segment_retries >= c->seg_max_retry) {
>> + av_log(v->parent, AV_LOG_WARNING, "Segment %"PRId64" of playlist %d failed too many times, skipping\n",
>> + v->cur_seq_no,
>> + v->index);
>> + v->cur_seq_no++;
>> + segment_retries = 0;
>> + } else {
>> + segment_retries++;
>> + }
>> goto reload;
>> }
>> + segment_retries = 0;
>> just_opened = 1;
>> }
>>
>> @@ -2549,6 +2560,8 @@ static const AVOption hls_options[] = {
>> OFFSET(http_seekable), AV_OPT_TYPE_BOOL, { .i64 = -1}, -1, 1, FLAGS},
>> {"seg_format_options", "Set options for segment demuxer",
>> OFFSET(seg_format_opts), AV_OPT_TYPE_DICT, {.str = NULL}, 0, 0, FLAGS},
>> + {"seg_max_retry", "Maximum number of times to reload a segment on error.",
>> + OFFSET(seg_max_retry), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS},
>> {NULL}
>> };
>>
>> --
>> 2.37.0 (Apple Git-136)
>>
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
> LGTM
>
> Thanks
> Steven
This doesn't appear to have been pushed.
Plan to push tomorrow.
Regards,
Gyan
More information about the ffmpeg-devel
mailing list