libavformat/dashenc : Prevent writing manifest files multiple times
authorjoepadmiraal <joep@exmachina.nl>
Mon, 8 Apr 2019 12:53:52 +0000 (14:53 +0200)
committerKarthick J <kjeyapal@akamai.com>
Wed, 10 Apr 2019 07:02:17 +0000 (12:32 +0530)
libavformat/dashenc.c

index f8d7116..4585a46 100644 (file)
@@ -145,6 +145,8 @@ typedef struct DASHContext {
     int ignore_io_errors;
     int lhls;
     int master_publish_rate;
+    int nr_of_streams_to_flush;
+    int nr_of_streams_flushed;
 } DASHContext;
 
 static struct codec_string {
@@ -1089,6 +1091,7 @@ static int dash_init(AVFormatContext *s)
     char *ptr;
     char basename[1024];
 
+    c->nr_of_streams_to_flush = 0;
     if (c->single_file_name)
         c->single_file = 1;
     if (c->single_file)
@@ -1302,12 +1305,18 @@ static int dash_init(AVFormatContext *s)
         os->max_pts = AV_NOPTS_VALUE;
         os->last_dts = AV_NOPTS_VALUE;
         os->segment_index = 1;
+
+        if (s->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
+            c->nr_of_streams_to_flush++;
     }
 
     if (!c->has_video && c->seg_duration <= 0) {
         av_log(s, AV_LOG_WARNING, "no video stream and no seg duration set\n");
         return AVERROR(EINVAL);
     }
+
+    c->nr_of_streams_flushed = 0;
+
     return 0;
 }
 
@@ -1616,8 +1625,16 @@ static int dash_flush(AVFormatContext *s, int final, int stream)
             }
         }
     }
-    if (ret >= 0)
+    if (ret >= 0) {
+        if (c->has_video) {
+            c->nr_of_streams_flushed++;
+            if (c->nr_of_streams_flushed != c->nr_of_streams_to_flush)
+                return ret;
+
+            c->nr_of_streams_flushed = 0;
+        }
         ret = write_manifest(s, final);
+    }
     return ret;
 }