mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
libavcodec: when decoding, copy replaygain side data to decoded frames
This commit is contained in:
parent
5a7e35dd23
commit
4a0f665143
@ -186,4 +186,9 @@ int ff_set_dimensions(AVCodecContext *s, int width, int height);
|
|||||||
int ff_side_data_update_matrix_encoding(AVFrame *frame,
|
int ff_side_data_update_matrix_encoding(AVFrame *frame,
|
||||||
enum AVMatrixEncoding matrix_encoding);
|
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 */
|
#endif /* AVCODEC_INTERNAL_H */
|
||||||
|
@ -150,8 +150,10 @@ static int raw_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
|||||||
|
|
||||||
frame->pict_type = AV_PICTURE_TYPE_I;
|
frame->pict_type = AV_PICTURE_TYPE_I;
|
||||||
frame->key_frame = 1;
|
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 ?
|
if (buf_size < context->frame_size - (avctx->pix_fmt == AV_PIX_FMT_PAL8 ?
|
||||||
AVPALETTE_SIZE : 0))
|
AVPALETTE_SIZE : 0))
|
||||||
|
@ -572,6 +572,35 @@ static void compat_release_buffer(void *opaque, uint8_t *data)
|
|||||||
FF_ENABLE_DEPRECATION_WARNINGS
|
FF_ENABLE_DEPRECATION_WARNINGS
|
||||||
#endif
|
#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 ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
|
||||||
{
|
{
|
||||||
int override_dimensions = 1;
|
int override_dimensions = 1;
|
||||||
@ -623,8 +652,9 @@ int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
|
|||||||
default: return AVERROR(EINVAL);
|
default: return AVERROR(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
frame->pkt_pts = avctx->internal->pkt ? avctx->internal->pkt->pts : AV_NOPTS_VALUE;
|
ret = ff_decode_frame_props(avctx, frame);
|
||||||
frame->reordered_opaque = avctx->reordered_opaque;
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
#if FF_API_GET_BUFFER
|
#if FF_API_GET_BUFFER
|
||||||
FF_DISABLE_DEPRECATION_WARNINGS
|
FF_DISABLE_DEPRECATION_WARNINGS
|
||||||
@ -762,11 +792,8 @@ int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame)
|
|||||||
if (!frame->data[0])
|
if (!frame->data[0])
|
||||||
return ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF);
|
return ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF);
|
||||||
|
|
||||||
if (av_frame_is_writable(frame)) {
|
if (av_frame_is_writable(frame))
|
||||||
frame->pkt_pts = avctx->internal->pkt ? avctx->internal->pkt->pts : AV_NOPTS_VALUE;
|
return ff_decode_frame_props(avctx, frame);
|
||||||
frame->reordered_opaque = avctx->reordered_opaque;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp = av_frame_alloc();
|
tmp = av_frame_alloc();
|
||||||
if (!tmp)
|
if (!tmp)
|
||||||
|
Loading…
Reference in New Issue
Block a user