summaryrefslogtreecommitdiff
path: root/fftools/ffmpeg_mux.c
diff options
context:
space:
mode:
Diffstat (limited to 'fftools/ffmpeg_mux.c')
-rw-r--r--fftools/ffmpeg_mux.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c
index 08a76f0066..24f638d0e5 100644
--- a/fftools/ffmpeg_mux.c
+++ b/fftools/ffmpeg_mux.c
@@ -29,6 +29,7 @@
#include "libavutil/intreadwrite.h"
#include "libavutil/log.h"
#include "libavutil/mem.h"
+#include "libavutil/time.h"
#include "libavutil/timestamp.h"
#include "libavutil/thread.h"
@@ -69,6 +70,10 @@ struct Muxer {
atomic_int_least64_t last_filesize;
int header_written;
+ int live_started;
+ int64_t header_write_wallclock;
+ int64_t live_ts_offset;
+
AVPacket *sq_pkt;
};
@@ -100,6 +105,37 @@ static int write_packet(OutputFile *of, OutputStream *ost, AVPacket *pkt)
if (fs >= of->mux->limit_filesize)
return AVERROR_EOF;
+ if (of->live) {
+ if (!of->mux->live_started) {
+ int64_t ts = av_rescale_q(pkt->dts, ost->mux_timebase, AV_TIME_BASE_Q);
+
+ of->mux->live_ts_offset = FFMAX(of->mux->live_ts_offset, ts);
+
+ // drop all packets that were demuxed before avformat_write_header()
+ if ((int64_t)pkt->opaque < of->mux->header_write_wallclock) {
+ fprintf(stderr, "live drop %s pts %g\n",
+ av_get_media_type_string(st->codecpar->codec_type),
+ pkt->pts * av_q2d(ost->mux_timebase));
+ av_packet_unref(pkt);
+ return 0;
+ }
+
+ of->mux->live_started = 1;
+ fprintf(stderr, "live started, ts offset %g\n", of->mux->live_ts_offset / (double)AV_TIME_BASE);
+ }
+
+ pkt->pts -= av_rescale_q(of->mux->live_ts_offset, AV_TIME_BASE_Q, ost->mux_timebase);
+ pkt->dts -= av_rescale_q(of->mux->live_ts_offset, AV_TIME_BASE_Q, ost->mux_timebase);
+
+ if (pkt->pts < 0) {
+ fprintf(stderr, "live drop %s pts %g\n",
+ av_get_media_type_string(st->codecpar->codec_type),
+ pkt->pts * av_q2d(ost->mux_timebase));
+ av_packet_unref(pkt);
+ return 0;
+ }
+ }
+
if ((st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && ost->vsync_method == VSYNC_DROP) ||
(st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && audio_sync_method < 0))
pkt->pts = pkt->dts = AV_NOPTS_VALUE;
@@ -478,6 +514,7 @@ int of_check_init(OutputFile *of)
}
//assert_avoptions(of->opts);
of->mux->header_written = 1;
+ of->mux->header_write_wallclock = av_gettime_relative();
av_dump_format(fc, of->index, fc->url, 1);
nb_output_dumped++;