[FFmpeg-devel] [PATCH] avformat/segment: fix increment_tc
Gyan
ffmpeg at gyani.pro
Sat Jun 15 14:27:06 EEST 2019
On 14-06-2019 10:45 PM, Gyan wrote:
>
> Fixes an issue brought to my attention at Super User.
v2 fixes inadvertent stream TC creation when non existed.
Gyan
-------------- next part --------------
From 9d4c8efefe05566377b76a39bd11805ac5bc7dd6 Mon Sep 17 00:00:00 2001
From: Gyan Doshi <ffmpeg at gyani.pro>
Date: Fri, 14 Jun 2019 22:36:27 +0530
Subject: [PATCH v2] avformat/segment: fix increment_tc
inner stream avg_frame_rate wasn't populated, so tc formation failed.
Also, extended increment_tc to cover individual stream timecode.
---
libavformat/segment.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/libavformat/segment.c b/libavformat/segment.c
index 6e37707f9f..99f048aa39 100644
--- a/libavformat/segment.c
+++ b/libavformat/segment.c
@@ -180,6 +180,7 @@ static int segment_mux_init(AVFormatContext *s)
}
st->sample_aspect_ratio = s->streams[i]->sample_aspect_ratio;
st->time_base = s->streams[i]->time_base;
+ st->avg_frame_rate = s->streams[i]->avg_frame_rate;
av_dict_copy(&st->metadata, s->streams[i]->metadata, 0);
}
@@ -421,7 +422,7 @@ static int segment_end(AVFormatContext *s, int write_trailer, int is_last)
rate = s->streams[i]->avg_frame_rate;/* Get fps from the video stream */
err = av_timecode_init_from_string(&tc, rate, tcr->value, s);
if (err < 0) {
- av_log(s, AV_LOG_WARNING, "Could not increment timecode, error occurred during timecode creation.");
+ av_log(s, AV_LOG_WARNING, "Could not increment global timecode, error occurred during timecode creation.\n");
break;
}
tc.start += (int)((seg->cur_entry.end_time - seg->cur_entry.start_time) * av_q2d(rate));/* increment timecode */
@@ -431,7 +432,23 @@ static int segment_end(AVFormatContext *s, int write_trailer, int is_last)
}
}
} else {
- av_log(s, AV_LOG_WARNING, "Could not increment timecode, no timecode metadata found");
+ av_log(s, AV_LOG_WARNING, "Could not increment global timecode, no global timecode metadata found.\n");
+ }
+ for (i = 0; i < s->nb_streams; i++) {
+ if (s->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
+ char st_buf[AV_TIMECODE_STR_SIZE];
+ AVTimecode st_tc;
+ AVRational st_rate = s->streams[i]->avg_frame_rate;
+ AVDictionaryEntry *st_tcr = av_dict_get(s->streams[i]->metadata, "timecode", NULL, 0);
+ if (st_tcr) {
+ if ((av_timecode_init_from_string(&st_tc, st_rate, st_tcr->value, s) < 0)) {
+ av_log(s, AV_LOG_WARNING, "Could not increment stream %d timecode, error occurred during timecode creation.\n", i);
+ continue;
+ }
+ st_tc.start += (int)((seg->cur_entry.end_time - seg->cur_entry.start_time) * av_q2d(st_rate)); // increment timecode
+ av_dict_set(&s->streams[i]->metadata, "timecode", av_timecode_make_string(&st_tc, st_buf, 0), 0);
+ }
+ }
}
}
--
2.22.0
More information about the ffmpeg-devel
mailing list