X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Ftakdec.c;h=0d2dcbbdb29cbeda72a318c5fbe800c8fb23f324;hb=ee8af2dd99dcb7a01a667deedec81d1aa2a00d72;hp=d47db4818c4a6e03efc3ab33709756ca9af0937d;hpb=b3deec325310938ec0a38a8ed1a795c451f2ea73;p=ffmpeg diff --git a/libavcodec/takdec.c b/libavcodec/takdec.c index d47db4818c4..0d2dcbbdb29 100644 --- a/libavcodec/takdec.c +++ b/libavcodec/takdec.c @@ -25,6 +25,7 @@ * @author Paul B Mahol */ +#include "libavutil/internal.h" #include "libavutil/samplefmt.h" #include "tak.h" #include "avcodec.h" @@ -44,7 +45,6 @@ typedef struct MCDParam { typedef struct TAKDecContext { AVCodecContext *avctx; // parent AVCodecContext - AVFrame frame; // AVFrame for decoded output DSPContext dsp; TAKStreamInfo ti; GetBitContext gb; // bitstream reader initialized to start at the current frame @@ -175,8 +175,6 @@ static av_cold int tak_decode_init(AVCodecContext *avctx) ff_dsputil_init(&s->dsp, avctx); s->avctx = avctx; - avcodec_get_frame_defaults(&s->frame); - avctx->coded_frame = &s->frame; set_sample_rate_params(avctx); @@ -674,6 +672,7 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *pkt) { TAKDecContext *s = avctx->priv_data; + AVFrame *frame = data; GetBitContext *gb = &s->gb; int chan, i, ret, hsize; @@ -686,7 +685,7 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, return ret; if (s->ti.flags & TAK_FRAME_FLAG_HAS_METADATA) { - av_log_missing_feature(avctx, "frame metadata", 1); + avpriv_request_sample(avctx, "Frame metadata"); return AVERROR_PATCHWELCOME; } @@ -694,7 +693,8 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, if (avctx->err_recognition & AV_EF_CRCCHECK) { if (ff_tak_check_crc(pkt->data, hsize)) { av_log(avctx, AV_LOG_ERROR, "CRC error\n"); - return AVERROR_INVALIDDATA; + if (avctx->err_recognition & AV_EF_EXPLODE) + return AVERROR_INVALIDDATA; } } @@ -740,8 +740,8 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, s->nb_samples = s->ti.last_frame_samples ? s->ti.last_frame_samples : s->ti.frame_samples; - s->frame.nb_samples = s->nb_samples; - if ((ret = ff_get_buffer(avctx, &s->frame)) < 0) + frame->nb_samples = s->nb_samples; + if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) return ret; if (avctx->bits_per_coded_sample <= 16) { @@ -758,7 +758,7 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, return ret; } else { for (chan = 0; chan < avctx->channels; chan++) - s->decoded[chan] = (int32_t *)s->frame.extended_data[chan]; + s->decoded[chan] = (int32_t *)frame->extended_data[chan]; } if (s->nb_samples < 16) { @@ -868,7 +868,8 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, if (ff_tak_check_crc(pkt->data + hsize, get_bits_count(gb) / 8 - hsize)) { av_log(avctx, AV_LOG_ERROR, "CRC error\n"); - return AVERROR_INVALIDDATA; + if (avctx->err_recognition & AV_EF_EXPLODE) + return AVERROR_INVALIDDATA; } } @@ -876,7 +877,7 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, switch (avctx->sample_fmt) { case AV_SAMPLE_FMT_U8P: for (chan = 0; chan < avctx->channels; chan++) { - uint8_t *samples = (uint8_t *)s->frame.extended_data[chan]; + uint8_t *samples = (uint8_t *)frame->extended_data[chan]; int32_t *decoded = s->decoded[chan]; for (i = 0; i < s->nb_samples; i++) samples[i] = decoded[i] + 0x80; @@ -884,7 +885,7 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, break; case AV_SAMPLE_FMT_S16P: for (chan = 0; chan < avctx->channels; chan++) { - int16_t *samples = (int16_t *)s->frame.extended_data[chan]; + int16_t *samples = (int16_t *)frame->extended_data[chan]; int32_t *decoded = s->decoded[chan]; for (i = 0; i < s->nb_samples; i++) samples[i] = decoded[i]; @@ -892,15 +893,14 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, break; case AV_SAMPLE_FMT_S32P: for (chan = 0; chan < avctx->channels; chan++) { - int32_t *samples = (int32_t *)s->frame.extended_data[chan]; + int32_t *samples = (int32_t *)frame->extended_data[chan]; for (i = 0; i < s->nb_samples; i++) samples[i] <<= 8; } break; } - *got_frame_ptr = 1; - *(AVFrame *)data = s->frame; + *got_frame_ptr = 1; return pkt->size; } @@ -917,6 +917,7 @@ static av_cold int tak_decode_close(AVCodecContext *avctx) AVCodec ff_tak_decoder = { .name = "tak", + .long_name = NULL_IF_CONFIG_SMALL("TAK (Tom's lossless Audio Kompressor)"), .type = AVMEDIA_TYPE_AUDIO, .id = AV_CODEC_ID_TAK, .priv_data_size = sizeof(TAKDecContext), @@ -925,7 +926,6 @@ AVCodec ff_tak_decoder = { .close = tak_decode_close, .decode = tak_decode_frame, .capabilities = CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("TAK (Tom's lossless Audio Kompressor)"), .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_U8P, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S32P,