Apply patch from MCD 84/208584/1
authorjiyong.min <jiyong.min@samsung.com>
Wed, 26 Jun 2019 07:15:12 +0000 (16:15 +0900)
committerjiyong.min <jiyong.min@samsung.com>
Wed, 26 Jun 2019 07:15:12 +0000 (16:15 +0900)
[problem] Duration is different shown in list and player
[cause] Incorrect parsing of libav
[solution] Fix incorrect parsing

Change-Id: I44a44a8d22aed1bf39e4082bdc1c6ab79c35009d

libavformat/utils.c

index 60c534d..40bbd9f 100644 (file)
@@ -1633,12 +1633,13 @@ static int has_duration(AVFormatContext *ic)
  */
 static void update_stream_timings(AVFormatContext *ic)
 {
-    int64_t start_time, start_time1, end_time, end_time1;
+    int64_t start_time, start_time1, start_time_text, end_time, end_time1;
     int64_t duration, duration1, filesize;
     int i;
     AVStream *st;
 
     start_time = INT64_MAX;
+    start_time_text = INT64_MAX;
     end_time   = INT64_MIN;
     duration   = INT64_MIN;
     for (i = 0; i < ic->nb_streams; i++) {
@@ -1646,7 +1647,11 @@ static void update_stream_timings(AVFormatContext *ic)
         if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
             start_time1 = av_rescale_q(st->start_time, st->time_base,
                                        AV_TIME_BASE_Q);
-            start_time  = FFMIN(start_time, start_time1);
+            if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codec->codec_type == AVMEDIA_TYPE_DATA) {
+                if (start_time1 < start_time_text)
+                    start_time_text = start_time1;
+            } else
+                start_time = FFMIN(start_time, start_time1);
             if (st->duration != AV_NOPTS_VALUE) {
                 end_time1 = start_time1 +
                             av_rescale_q(st->duration, st->time_base,
@@ -1660,14 +1665,20 @@ static void update_stream_timings(AVFormatContext *ic)
             duration  = FFMAX(duration, duration1);
         }
     }
+    if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
+        start_time = start_time_text;
+    else if(start_time > start_time_text)
+        av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
+
     if (start_time != INT64_MAX) {
         ic->start_time = start_time;
         if (end_time != INT64_MIN)
             duration = FFMAX(duration, end_time - start_time);
     }
-    if (duration != INT64_MIN) {
+    if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
         ic->duration = duration;
-        if (ic->pb && (filesize = avio_size(ic->pb)) > 0)
+    }
+    if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
             /* compute the bitrate */
             ic->bit_rate = (double) filesize * 8.0 * AV_TIME_BASE /
                            (double) ic->duration;