Re: [FFmpeg-devel] [PATCH v2 2/2] avformat/dashenc: Added an option to ignore io errors

2018-12-02 Thread Jeyapal, Karthick

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, "\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


Re: [FFmpeg-devel] [PATCH v2 2/2] avformat/dashenc: Added an option to ignore io errors

2018-11-29 Thread Jeyapal, Karthick

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, "\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


Re: [FFmpeg-devel] [PATCH v2 2/2] avformat/dashenc: Added an option to ignore io errors

2018-11-29 Thread Andrey Semashev

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, "\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);



+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] [PATCH v2 2/2] avformat/dashenc: Added an option to ignore io errors

2018-11-28 Thread Karthick J
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, "\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 },
 };
 
-- 
2.17.1 (Apple Git-112)

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