On 11/29/18 8:07 PM, Andrey Semashev wrote:
> On 11/28/18 8:06 PM, Karthick J wrote:
>> When dashenc has to run for long duration(say 24x7 live stream), one can 
>> enable this option to ignore the io failure of few segment's upload due to 
>> an intermittent network issues.
>> When the network connection recovers dashenc will continue with the upload 
>> of the current segments, leading to the recovery of the stream.
>> ---
>>   doc/muxers.texi       |  3 +++
>>   libavformat/dashenc.c | 17 +++++++++++------
>>   2 files changed, 14 insertions(+), 6 deletions(-)
>>
>> diff --git a/doc/muxers.texi b/doc/muxers.texi
>> index a02ac01b55..f1cc6f5fee 100644
>> --- a/doc/muxers.texi
>> +++ b/doc/muxers.texi
>> @@ -300,6 +300,9 @@ If this flag is set, the dash segment files will be in 
>> in ISOBMFF format.
>>   @item webm
>>   If this flag is set, the dash segment files will be in in WebM format.
>>   +@item -ignore_io_errors @var{ignore_io_errors}
>> +Ignore IO errors during open and write. Useful for long-duration runs with 
>> network output.
>> +
>>   @end table
>>     @anchor{framecrc}
>> diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
>> index 2f403257c0..04218af6a6 100644
>> --- a/libavformat/dashenc.c
>> +++ b/libavformat/dashenc.c
>> @@ -138,6 +138,7 @@ typedef struct DASHContext {
>>       int index_correction;
>>       char *format_options_str;
>>       SegmentType segment_type_option;  /* segment type as specified in 
>> options */
>> +    int ignore_io_errors;
>>   } DASHContext;
>>     static struct codec_string {
>> @@ -846,7 +847,7 @@ static int write_manifest(AVFormatContext *s, int final)
>>       av_dict_free(&opts);
>>       if (ret < 0) {
>>           av_log(s, AV_LOG_ERROR, "Unable to open %s for writing\n", 
>> temp_filename);
>> -        return ret;
>> +        return c->ignore_io_errors ? 0 : ret;
>>       }
>>       out = c->mpd_out;
>>       avio_printf(out, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
>> @@ -937,7 +938,7 @@ static int write_manifest(AVFormatContext *s, int final)
>>           av_dict_free(&opts);
>>           if (ret < 0) {
>>               av_log(s, AV_LOG_ERROR, "Unable to open %s for writing\n", 
>> temp_filename);
>> -            return ret;
>> +            return c->ignore_io_errors ? 0 : ret;
>>           }
>>             ff_hls_write_playlist_version(c->m3u8_out, 7);
>> @@ -1565,8 +1566,9 @@ static int dash_write_packet(AVFormatContext *s, 
>> AVPacket *pkt)
>>           set_http_options(&opts, c);
>>           ret = dashenc_io_open(s, &os->out, os->temp_path, &opts);
>>           av_dict_free(&opts);
>> -        if (ret < 0)
>> -            return ret;
>> +        if (ret < 0) { 
>
> Please, add error logging as well:
>
>             char errbuf[AV_ERROR_MAX_STRING_SIZE];
>             av_strerror(ret, errbuf, sizeof(errbuf));
>             av_log(s, (c->ignore_io_errors ? AV_LOG_WARNING : AV_LOG_ERROR), 
> "Unable to open %s for writing: %s\n", os->temp_path, errbuf);
Thank you very much for your review comments. And thanks for providing the 
sample code as well.
I have sent a separate patch addressing your comments 
http://ffmpeg.org/pipermail/ffmpeg-devel/2018-November/236955.html 
>
>> +            return c->ignore_io_errors ? 0 : ret;
>> +        }
>>       }
>>         //write out the data immediately in streaming mode
>> @@ -1577,9 +1579,11 @@ static int dash_write_packet(AVFormatContext *s, 
>> AVPacket *pkt)
>>               write_styp(os->ctx->pb);
>>           avio_flush(os->ctx->pb);
>>           len = avio_get_dyn_buf (os->ctx->pb, &buf);
>> -        avio_write(os->out, buf + os->written_len, len - os->written_len);
>> +        if (os->out) {
>> +            avio_write(os->out, buf + os->written_len, len - 
>> os->written_len);
>> +            avio_flush(os->out);
>> +        }
>>           os->written_len = len;
>> -        avio_flush(os->out);
>>       }
>>         return ret;
>> @@ -1670,6 +1674,7 @@ static const AVOption options[] = {
>>       { "auto", "select segment file format based on codec", 0, 
>> AV_OPT_TYPE_CONST, {.i64 = SEGMENT_TYPE_AUTO }, 0, UINT_MAX,   E, 
>> "segment_type"},
>>       { "mp4", "make segment file in ISOBMFF format", 0, AV_OPT_TYPE_CONST, 
>> {.i64 = SEGMENT_TYPE_MP4 }, 0, UINT_MAX,   E, "segment_type"},
>>       { "webm", "make segment file in WebM format", 0, AV_OPT_TYPE_CONST, 
>> {.i64 = SEGMENT_TYPE_WEBM }, 0, UINT_MAX,   E, "segment_type"},
>> +    { "ignore_io_errors", "Ignore IO errors during open and write. Useful 
>> for long-duration runs with network output", OFFSET(ignore_io_errors), 
>> AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E },
>>       { NULL },
>>   };
>>   
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to