On 11/28/18 10:36 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) { > + 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 }, > }; > Pushed Patchset
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel