aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkjeyapal@akamai.com <kjeyapal@akamai.com>2018-11-28 22:36:17 +0530
committerKarthick J <kjeyapal@akamai.com>2018-12-02 19:14:37 +0530
commitc32aad19614ca42fe67efeced893332dae09a1e3 (patch)
treeb8b506e586ae07d4d40ca0ecab580fa6dd63046c
parent6c1e1242012e116e2622ec7a9f56972eaf5c15f8 (diff)
downloadffmpeg-c32aad19614ca42fe67efeced893332dae09a1e3.tar.gz
avformat/dashenc: Added an option to ignore io errors
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.
-rw-r--r--doc/muxers.texi3
-rw-r--r--libavformat/dashenc.c17
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 72c6e5a8e6..e08f1528be 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 {
@@ -853,7 +854,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");
@@ -944,7 +945,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);
@@ -1576,8 +1577,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
@@ -1588,9 +1590,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;
@@ -1693,6 +1697,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 },
};