diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-03-24 14:26:17 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-03-24 14:26:17 +0100 |
commit | c08e523586b6be36bee3f73d609733cd80a57674 (patch) | |
tree | 5d728f8f5c8647e7ffe3197c25875a1b3dee380d /libavcodec | |
parent | 83e89787984d3f96cb793ebfddc6078d6bc50073 (diff) | |
parent | 4a0f6651434c6f213d830140f575b4ec7858519f (diff) | |
download | ffmpeg-c08e523586b6be36bee3f73d609733cd80a57674.tar.gz |
Merge commit '4a0f6651434c6f213d830140f575b4ec7858519f'
* commit '4a0f6651434c6f213d830140f575b4ec7858519f':
libavcodec: when decoding, copy replaygain side data to decoded frames
Conflicts:
libavcodec/internal.h
libavcodec/rawdec.c
libavcodec/utils.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/internal.h | 7 | ||||
-rw-r--r-- | libavcodec/rawdec.c | 7 | ||||
-rw-r--r-- | libavcodec/utils.c | 39 |
3 files changed, 45 insertions, 8 deletions
diff --git a/libavcodec/internal.h b/libavcodec/internal.h index 0da2fa4fb7..f5455448a8 100644 --- a/libavcodec/internal.h +++ b/libavcodec/internal.h @@ -129,6 +129,8 @@ struct AVCodecDefault { const uint8_t *value; }; +extern const uint8_t ff_log2_run[41]; + /** * Return the hardware accelerated codec for codec codec_id and * pixel format pix_fmt. @@ -251,6 +253,9 @@ int ff_set_dimensions(AVCodecContext *s, int width, int height); int ff_side_data_update_matrix_encoding(AVFrame *frame, enum AVMatrixEncoding matrix_encoding); -extern const uint8_t ff_log2_run[41]; +/** + * 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 007674ec38..85a69e91a5 100644 --- a/libavcodec/rawdec.c +++ b/libavcodec/rawdec.c @@ -209,8 +209,11 @@ 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; + av_frame_set_pkt_pos (frame, avctx->internal->pkt->pos); av_frame_set_pkt_duration(frame, avctx->internal->pkt->duration); diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 7ffe6c6524..e7cca9646e 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -827,6 +827,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) { + frame_sd = av_frame_new_side_data(frame, AV_FRAME_DATA_REPLAYGAIN, size); + if (!frame_sd) + return AVERROR(ENOMEM); + + memcpy(frame_sd->data, packet_sd, size); + } + + return 0; +} + static int get_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags) { int override_dimensions = 1; @@ -845,6 +874,9 @@ static int get_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags) override_dimensions = 0; } } + ret = ff_decode_frame_props(avctx, frame); + if (ret < 0) + return ret; if ((ret = ff_init_buffer_info(avctx, frame)) < 0) return ret; @@ -1001,11 +1033,8 @@ static int reget_buffer_internal(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); tmp = av_frame_alloc(); if (!tmp) |