Implement last_dts[] because next_dts[] isn't actually useful. This fixes another ffmpeg deprecation problem by keep our own copy of cur_dts

pull/4202/head
Isaac Connor 2022-04-07 13:12:34 -04:00
parent 77482e8294
commit ecee80c4ef
2 changed files with 19 additions and 9 deletions

View File

@ -349,6 +349,8 @@ bool VideoStore::open() {
#else
avcodec_copy_context(video_out_stream->codec, video_out_ctx);
#endif
last_dts[video_out_stream->index] = AV_NOPTS_VALUE;
video_out_stream->time_base = video_in_stream ? video_in_stream->time_base : AV_TIME_BASE_Q;
if (monitor->GetOptVideoWriter() == Monitor::PASSTHROUGH) {
// Only set orientation if doing passthrough, otherwise the frame image will be rotated
@ -470,6 +472,7 @@ bool VideoStore::open() {
// We will assume that subsequent stream allocations will increase the index
max_stream_index = audio_out_stream->index;
last_dts[audio_out_stream->index] = AV_NOPTS_VALUE;
} // end if audio_in_stream
//max_stream_index is 0-based, so add 1
@ -1313,15 +1316,19 @@ int VideoStore::write_packet(AVPacket *pkt, AVStream *stream) {
pkt->stream_index = stream->index;
if (pkt->dts == AV_NOPTS_VALUE) {
Error("undefined dts");
// Debug(1, "undef dts, fixing by setting to stream cur_dts %" PRId64, stream->cur_dts);
// pkt->dts = stream->cur_dts;
} else if (pkt->dts < next_dts[stream->index]) {
Debug(1, "non increasing dts, fixing. our dts %" PRId64 " stream next_dts %" PRId64, pkt->dts, next_dts[stream->index]);
pkt->dts = next_dts[stream->index];
if (last_dts[stream->index] == AV_NOPTS_VALUE) {
last_dts[stream->index] = 0;
}
pkt->dts = last_dts[stream->index];
} else if (pkt->dts < last_dts[stream->index]) {
Warning("non increasing dts, fixing. our dts %" PRId64 " stream %d next_dts %" PRId64,
pkt->dts, stream->index, next_dts[stream->index]);
pkt->dts = last_dts[stream->index];
}
if (pkt->dts > pkt->pts) {
if (pkt->pts == AV_NOPTS_VALUE) {
pkt->pts = pkt->dts;
} else if (pkt->dts > pkt->pts) {
Warning("pkt.dts(%" PRId64 ") must be <= pkt.pts(%" PRId64 ")."
"Decompression must happen before presentation.",
pkt->dts, pkt->pts);
@ -1334,8 +1341,9 @@ int VideoStore::write_packet(AVPacket *pkt, AVStream *stream) {
ZM_DUMP_STREAM_PACKET(stream, (*pkt), "finished pkt");
next_dts[stream->index] = pkt->dts + pkt->duration;
Debug(3, "next_dts for stream %d has become %" PRId64,
stream->index, next_dts[stream->index]);
last_dts[stream->index] = pkt->dts;
Debug(3, "next_dts for stream %d has become %" PRId64 " last_dts %" PRId64,
stream->index, next_dts[stream->index], last_dts[stream->index]);
int ret = av_interleaved_write_frame(oc, pkt);
if (ret != 0) {

View File

@ -7,6 +7,7 @@
#include "zm_swscale.h"
#include <memory>
#include <map>
extern "C" {
#ifdef HAVE_LIBSWRESAMPLE
@ -100,6 +101,7 @@ class VideoStore {
// These are for out, should start at zero. We assume they do not wrap because we just aren't going to save files that big.
int64_t *next_dts;
std::map<int, int64_t> last_dts;
int64_t audio_next_pts;
int max_stream_index;