summaryrefslogtreecommitdiff
path: root/libavcodec/librav1e.c
diff options
context:
space:
mode:
authorDerek Buitenhuis <derek.buitenhuis@gmail.com>2020-05-17 13:01:12 +0100
committerDerek Buitenhuis <derek.buitenhuis@gmail.com>2021-01-17 14:49:46 +0000
commite55a80da3872bf7ee6523452c41b5f01817dad43 (patch)
tree899b887875e26bd646d03692ac1a29ecf5dcfc09 /libavcodec/librav1e.c
parentf975cf7cc061b814bc029bb2fc86f656494c4d5c (diff)
avcodec/librav1e: Pass through timestamps as opaque user data
avcodec has no facilities to generate timestamps properly from output frame numbers (and it would be wrong for VFR anyway), so pass through the timestamps using rav1e's opaque user data feature, which was added in v0.4.0. This bumps the minimum librav1e version to 0.4.0. Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Diffstat (limited to 'libavcodec/librav1e.c')
-rw-r--r--libavcodec/librav1e.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/libavcodec/librav1e.c b/libavcodec/librav1e.c
index 46071bcdac..2d5acc7d8e 100644
--- a/libavcodec/librav1e.c
+++ b/libavcodec/librav1e.c
@@ -445,10 +445,18 @@ static int librav1e_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
if (frame->buf[0]) {
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
+ int64_t *pts = av_malloc(sizeof(int64_t));
+ if (!pts) {
+ av_log(avctx, AV_LOG_ERROR, "Could not allocate PTS buffer.\n");
+ return AVERROR(ENOMEM);
+ }
+ *pts = frame->pts;
+
rframe = rav1e_frame_new(ctx->ctx);
if (!rframe) {
av_log(avctx, AV_LOG_ERROR, "Could not allocate new rav1e frame.\n");
av_frame_unref(frame);
+ av_freep(&pts);
return AVERROR(ENOMEM);
}
@@ -460,6 +468,7 @@ static int librav1e_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
frame->linesize[i], bytes);
}
av_frame_unref(frame);
+ rav1e_frame_set_opaque(rframe, pts, av_free);
}
}
@@ -535,7 +544,8 @@ retry:
if (rpkt->frame_type == RA_FRAME_TYPE_KEY)
pkt->flags |= AV_PKT_FLAG_KEY;
- pkt->pts = pkt->dts = rpkt->input_frameno * avctx->ticks_per_frame;
+ pkt->pts = pkt->dts = *((int64_t *) rpkt->opaque);
+ av_free(rpkt->opaque);
rav1e_packet_unref(rpkt);
if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {