diff options
author | James Almer <jamrial@gmail.com> | 2022-12-08 10:05:26 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2022-12-12 18:31:28 -0300 |
commit | bff86f31cc8c27a573a21b99578f2bdfca26b115 (patch) | |
tree | f8e6ee5e7598808010cfffe9844d47acb4ccbf70 /libavcodec | |
parent | 261cd929e06b716b3bcc944c96fdf94371b3a7ed (diff) | |
download | ffmpeg-bff86f31cc8c27a573a21b99578f2bdfca26b115.tar.gz |
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 <jamrial@gmail.com>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/decode.c | 19 | ||||
-rw-r--r-- | libavcodec/decode.h | 5 |
2 files changed, 20 insertions, 4 deletions
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 @@ -70,6 +70,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. */ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame); |