aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2014-02-19 18:52:26 +0100
committerAnton Khirnov <anton@khirnov.net>2014-03-24 06:07:51 +0100
commit4a0f6651434c6f213d830140f575b4ec7858519f (patch)
tree60d1d4a771b97c24413204a4db92b4db1b0d944b
parent5a7e35dd2351c30bab45177b9482cb8833a0ca78 (diff)
downloadffmpeg-4a0f6651434c6f213d830140f575b4ec7858519f.tar.gz
libavcodec: when decoding, copy replaygain side data to decoded frames
-rw-r--r--libavcodec/internal.h5
-rw-r--r--libavcodec/rawdec.c6
-rw-r--r--libavcodec/utils.c41
3 files changed, 43 insertions, 9 deletions
diff --git a/libavcodec/internal.h b/libavcodec/internal.h
index 9f7213c17d..268a7584b2 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 a8227c7ae8..3b69e49e84 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 c88b34649f..e04f455ed2 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) {
+ 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;
+}
+
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);
tmp = av_frame_alloc();
if (!tmp)