--- libavcodec/internal.h | 5 +++++ libavcodec/rawdec.c | 6 ++++-- libavcodec/utils.c | 41 ++++++++++++++++++++++++++++++++++------- 3 files changed, 43 insertions(+), 9 deletions(-)
diff --git a/libavcodec/internal.h b/libavcodec/internal.h index 9f7213c..268a758 100644 --- a/libavcodec/internal.h +++ b/libavcodec/internal.h @@ -186,4 +186,9 @@ int ff_set_dimensions(AVCodecContext *s, int width, int height); int ff_side_data_update_matrix_encoding(AVFrame *frame, enum AVMatrixEncoding matrix_encoding); +/** + * Set various frame properties from the codec context / packet data. + */ +int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame); + #endif /* AVCODEC_INTERNAL_H */ diff --git a/libavcodec/rawdec.c b/libavcodec/rawdec.c index a8227c7..3b69e49 100644 --- a/libavcodec/rawdec.c +++ b/libavcodec/rawdec.c @@ -150,8 +150,10 @@ static int raw_decode(AVCodecContext *avctx, void *data, int *got_frame, frame->pict_type = AV_PICTURE_TYPE_I; frame->key_frame = 1; - frame->reordered_opaque = avctx->reordered_opaque; - frame->pkt_pts = avctx->internal->pkt->pts; + + res = ff_decode_frame_props(avctx, frame); + if (res < 0) + return res; if (buf_size < context->frame_size - (avctx->pix_fmt == AV_PIX_FMT_PAL8 ? AVPALETTE_SIZE : 0)) diff --git a/libavcodec/utils.c b/libavcodec/utils.c index b2b11ef..7a41e1a 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -572,6 +572,35 @@ static void compat_release_buffer(void *opaque, uint8_t *data) FF_ENABLE_DEPRECATION_WARNINGS #endif +int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame) +{ + AVPacket *pkt = avctx->internal->pkt; + uint8_t *packet_sd; + int size; + AVFrameSideData *frame_sd; + + + frame->reordered_opaque = avctx->reordered_opaque; + if (!pkt) { + frame->pkt_pts = AV_NOPTS_VALUE; + return 0; + } + + frame->pkt_pts = pkt->pts; + + /* copy the replaygain data to the output frame */ + packet_sd = av_packet_get_side_data(pkt, AV_PKT_DATA_REPLAYGAIN, &size); + if (packet_sd && size >= 16) { + frame_sd = av_frame_new_side_data(frame, AV_FRAME_DATA_REPLAYGAIN, 16); + if (!frame_sd) + return AVERROR(ENOMEM); + + memcpy(frame_sd->data, packet_sd, 16); + } + + return 0; +} + int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags) { int override_dimensions = 1; @@ -623,8 +652,9 @@ int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags) default: return AVERROR(EINVAL); } - frame->pkt_pts = avctx->internal->pkt ? avctx->internal->pkt->pts : AV_NOPTS_VALUE; - frame->reordered_opaque = avctx->reordered_opaque; + ret = ff_decode_frame_props(avctx, frame); + if (ret < 0) + return ret; #if FF_API_GET_BUFFER FF_DISABLE_DEPRECATION_WARNINGS @@ -762,11 +792,8 @@ int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame) if (!frame->data[0]) return ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF); - if (av_frame_is_writable(frame)) { - frame->pkt_pts = avctx->internal->pkt ? avctx->internal->pkt->pts : AV_NOPTS_VALUE; - frame->reordered_opaque = avctx->reordered_opaque; - return 0; - } + if (av_frame_is_writable(frame)) + return ff_decode_frame_props(avctx, frame); av_frame_move_ref(&tmp, frame); -- 1.7.10.4 _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel