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

Reply via email to