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