X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Ftta.c;h=b496452bb47ae1bf2f7aa29b3bc1a80628e0e356;hb=0313653928b47c3b0e493c08c66bb1a374695f7c;hp=7825c0c98006bab4eea82ea0c094f4f9b2556f27;hpb=36ef5369ee9b336febc2c270f8718cec4476cb85;p=ffmpeg diff --git a/libavcodec/tta.c b/libavcodec/tta.c index 7825c0c9800..b496452bb47 100644 --- a/libavcodec/tta.c +++ b/libavcodec/tta.c @@ -32,6 +32,7 @@ #include #include "avcodec.h" #include "get_bits.h" +#include "internal.h" #include "libavutil/crc.h" #define FORMAT_SIMPLE 1 @@ -57,13 +58,12 @@ typedef struct TTAChannel { typedef struct TTAContext { AVCodecContext *avctx; - AVFrame frame; GetBitContext gb; const AVCRC *crc_table; int format, channels, bps; unsigned data_length; - int frame_length, last_frame_length, total_frames; + int frame_length, last_frame_length; int32_t *decode_buffer; @@ -197,6 +197,7 @@ static int tta_check_crc(TTAContext *s, const uint8_t *buf, int buf_size) static av_cold int tta_decode_init(AVCodecContext * avctx) { TTAContext *s = avctx->priv_data; + int total_frames; s->avctx = avctx; @@ -221,8 +222,8 @@ static av_cold int tta_decode_init(AVCodecContext * avctx) return -1; } if (s->format == FORMAT_ENCRYPTED) { - av_log_missing_feature(s->avctx, "Encrypted TTA", 0); - return AVERROR(EINVAL); + avpriv_report_missing_feature(s->avctx, "Encrypted TTA"); + return AVERROR_PATCHWELCOME; } avctx->channels = s->channels = get_bits(&s->gb, 16); avctx->bits_per_coded_sample = get_bits(&s->gb, 16); @@ -261,24 +262,24 @@ static av_cold int tta_decode_init(AVCodecContext * avctx) s->frame_length = 256 * avctx->sample_rate / 245; s->last_frame_length = s->data_length % s->frame_length; - s->total_frames = s->data_length / s->frame_length + - (s->last_frame_length ? 1 : 0); + total_frames = s->data_length / s->frame_length + + (s->last_frame_length ? 1 : 0); av_log(s->avctx, AV_LOG_DEBUG, "format: %d chans: %d bps: %d rate: %d block: %d\n", s->format, avctx->channels, avctx->bits_per_coded_sample, avctx->sample_rate, avctx->block_align); av_log(s->avctx, AV_LOG_DEBUG, "data_length: %d frame_length: %d last: %d total: %d\n", - s->data_length, s->frame_length, s->last_frame_length, s->total_frames); + s->data_length, s->frame_length, s->last_frame_length, total_frames); // FIXME: seek table - if (avctx->extradata_size <= 26 || s->total_frames > INT_MAX / 4 || - avctx->extradata_size - 26 < s->total_frames * 4) + if (avctx->extradata_size <= 26 || total_frames > INT_MAX / 4 || + avctx->extradata_size - 26 < total_frames * 4) av_log(avctx, AV_LOG_WARNING, "Seek table missing or too small\n"); else if (avctx->err_recognition & AV_EF_CRCCHECK) { - if (tta_check_crc(s, avctx->extradata + 22, s->total_frames * 4)) + if (tta_check_crc(s, avctx->extradata + 22, total_frames * 4)) return AVERROR_INVALIDDATA; } - skip_bits_long(&s->gb, 32 * s->total_frames); + skip_bits_long(&s->gb, 32 * total_frames); skip_bits_long(&s->gb, 32); // CRC32 of seektable if(s->frame_length >= UINT_MAX / (s->channels * sizeof(int32_t))){ @@ -301,15 +302,13 @@ static av_cold int tta_decode_init(AVCodecContext * avctx) return -1; } - avcodec_get_frame_defaults(&s->frame); - avctx->coded_frame = &s->frame; - return 0; } static int tta_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt) { + AVFrame *frame = data; const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; TTAContext *s = avctx->priv_data; @@ -324,21 +323,16 @@ static int tta_decode_frame(AVCodecContext *avctx, void *data, init_get_bits(&s->gb, buf, buf_size*8); - // FIXME: seeking - s->total_frames--; - if (!s->total_frames && s->last_frame_length) - framelen = s->last_frame_length; - /* get output buffer */ - s->frame.nb_samples = framelen; - if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) { + frame->nb_samples = framelen; + if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return ret; } // decode directly to output buffer for 24-bit sample format if (s->bps == 3) - s->decode_buffer = (int32_t *)s->frame.data[0]; + s->decode_buffer = (int32_t *)frame->data[0]; // init per channel states for (i = 0; i < s->channels; i++) { @@ -347,6 +341,7 @@ static int tta_decode_frame(AVCodecContext *avctx, void *data, rice_init(&s->ch_ctx[i].rice, 10, 10); } + i = 0; for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++) { int32_t *predictor = &s->ch_ctx[cur_chan].predictor; TTAFilter *filter = &s->ch_ctx[cur_chan].filter; @@ -423,9 +418,16 @@ static int tta_decode_frame(AVCodecContext *avctx, void *data, *r = *(r + 1) - *r; } cur_chan = 0; + i++; + // check for last frame + if (i == s->last_frame_length && get_bits_left(&s->gb) / 8 == 4) { + frame->nb_samples = framelen = s->last_frame_length; + break; + } } } + align_get_bits(&s->gb); if (get_bits_left(&s->gb) < 32) { ret = AVERROR_INVALIDDATA; goto error; @@ -434,20 +436,19 @@ static int tta_decode_frame(AVCodecContext *avctx, void *data, // convert to output buffer if (s->bps == 2) { - int16_t *samples = (int16_t *)s->frame.data[0]; + int16_t *samples = (int16_t *)frame->data[0]; for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++) *samples++ = *p; } else { // shift samples for 24-bit sample format - int32_t *samples = (int32_t *)s->frame.data[0]; + int32_t *samples = (int32_t *)frame->data[0]; for (i = 0; i < framelen * s->channels; i++) *samples++ <<= 8; // reset decode buffer s->decode_buffer = NULL; } - *got_frame_ptr = 1; - *(AVFrame *)data = s->frame; + *got_frame_ptr = 1; return buf_size; error: