Fix PTS when not monotonically increasing
Some decoders fail to guarantee that PTS is strictly monotonically increasing. Fix the (rescaled) PTS when it does not respect this constraint. Fixes #4054 <https://github.com/Genymobile/scrcpy/issues/4054>
This commit is contained in:
parent
9ca554ca41
commit
323ea2f1d9
2 changed files with 11 additions and 0 deletions
|
@ -100,6 +100,15 @@ sc_recorder_write_stream(struct sc_recorder *recorder,
|
|||
struct sc_recorder_stream *st, AVPacket *packet) {
|
||||
AVStream *stream = recorder->ctx->streams[st->index];
|
||||
sc_recorder_rescale_packet(stream, packet);
|
||||
if (st->last_pts != AV_NOPTS_VALUE && packet->pts <= st->last_pts) {
|
||||
LOGW("Fixing PTS non monotonically increasing in stream %d "
|
||||
"(%" PRIi64 " >= %" PRIi64 ")",
|
||||
st->index, st->last_pts, packet->pts);
|
||||
packet->pts = ++st->last_pts;
|
||||
packet->dts = packet->pts;
|
||||
} else {
|
||||
st->last_pts = packet->pts;
|
||||
}
|
||||
return av_interleaved_write_frame(recorder->ctx, packet) >= 0;
|
||||
}
|
||||
|
||||
|
@ -664,6 +673,7 @@ sc_recorder_audio_packet_sink_disable(struct sc_packet_sink *sink) {
|
|||
static void
|
||||
sc_recorder_stream_init(struct sc_recorder_stream *stream) {
|
||||
stream->index = -1;
|
||||
stream->last_pts = AV_NOPTS_VALUE;
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
@ -16,6 +16,7 @@ struct sc_recorder_queue SC_VECDEQUE(AVPacket *);
|
|||
|
||||
struct sc_recorder_stream {
|
||||
int index;
|
||||
int64_t last_pts;
|
||||
};
|
||||
|
||||
struct sc_recorder {
|
||||
|
|
Loading…
Reference in a new issue