From bff86f31cc8c27a573a21b99578f2bdfca26b115 Mon Sep 17 00:00:00 2001 From: James Almer Date: Thu, 8 Dec 2022 10:05:26 -0300 Subject: avcodec/decode: add a function to set frame props from a user provided packet It will be useful for decoders that don't rely on last_pkt_props to set frame props. Signed-off-by: James Almer --- libavcodec/decode.c | 19 +++++++++++++++---- libavcodec/decode.h | 5 +++++ 2 files changed, 20 insertions(+), 4 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/decode.c b/libavcodec/decode.c index b184c3f55b..8f7f0fadbe 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -1261,9 +1261,8 @@ static int add_metadata_from_side_data(const AVPacket *avpkt, AVFrame *frame) return av_packet_unpack_dictionary(side_metadata, size, frame_md); } -int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame) +int ff_decode_frame_props_from_pkt(AVFrame *frame, const AVPacket *pkt) { - const AVPacket *pkt = avctx->internal->last_pkt_props; static const struct { enum AVPacketSideDataType packet; enum AVFrameSideDataType frame; @@ -1281,11 +1280,10 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame) { AV_PKT_DATA_DYNAMIC_HDR10_PLUS, AV_FRAME_DATA_DYNAMIC_HDR_PLUS }, }; - if (!(ffcodec(avctx->codec)->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) { frame->pts = pkt->pts; frame->pkt_pos = pkt->pos; frame->duration = pkt->duration; - frame->pkt_size = (int)(intptr_t)pkt->opaque; + frame->pkt_size = pkt->size; for (int i = 0; i < FF_ARRAY_ELEMS(sd); i++) { size_t size; @@ -1307,6 +1305,19 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame) } else { frame->flags = (frame->flags & ~AV_FRAME_FLAG_DISCARD); } + + return 0; +} + +int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame) +{ + const AVPacket *pkt = avctx->internal->last_pkt_props; + + if (!(ffcodec(avctx->codec)->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) { + int ret = ff_decode_frame_props_from_pkt(frame, pkt); + if (ret < 0) + return ret; + frame->pkt_size = (int)(intptr_t)pkt->opaque; } frame->reordered_opaque = avctx->reordered_opaque; diff --git a/libavcodec/decode.h b/libavcodec/decode.h index 5d95369b5e..906122b4a7 100644 --- a/libavcodec/decode.h +++ b/libavcodec/decode.h @@ -69,6 +69,11 @@ int ff_decode_receive_frame(AVCodecContext *avctx, AVFrame *frame); */ int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt); +/** + * Set various frame properties from the provided packet. + */ +int ff_decode_frame_props_from_pkt(AVFrame *frame, const AVPacket *pkt); + /** * Set various frame properties from the codec context / packet data. */ -- cgit v1.2.3