/* * FLAC (Free Lossless Audio Codec) decoder * Copyright (c) 2003 Alex Beregszaszi * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/** * @file * FLAC (Free Lossless Audio Codec) decoder * @author Alex Beregszaszi * @see http://flac.sourceforge.net/ * * This decoder can be used in 1 of 2 ways: Either raw FLAC data can be fed * through, starting from the initial 'fLaC' signature; or by passing the * 34-byte streaminfo structure through avctx->extradata[_size] followed * by data starting with the 0xFFF8 marker.
*/
AVCodecContext *avctx; ///< parent AVCodecContext
GetBitContext gb; ///< GetBitContext initialized to start at the current frame
int blocksize; ///< number of samples in the current frame int sample_shift; ///< shift required to make output samples 16-bit or 32-bit int ch_mode; ///< channel decorrelation type in the current frame int got_streaminfo; ///< indicates if the STREAMINFO has been read
int32_t *decoded[FLAC_MAX_CHANNELS]; ///< decoded samples
uint8_t *decoded_buffer; unsignedint decoded_buffer_size;
int64_t *decoded_33bps; ///< decoded samples for a 33 bps subframe
uint8_t *decoded_buffer_33bps; unsignedint decoded_buffer_size_33bps; int buggy_lpc; ///< use workaround for old lavc encoded files
FLACDSPContext dsp;
} FLACContext;
staticint allocate_buffers(FLACContext *s);
staticvoid flac_set_bps(FLACContext *s)
{ enum AVSampleFormat req = s->avctx->request_sample_fmt; int need32 = s->stream_info.bps > 16; int want32 = av_get_bytes_per_sample(req) > 2; int planar = av_sample_fmt_is_planar(req);
av_fast_malloc(&s->decoded_buffer_33bps, &s->decoded_buffer_size_33bps, buf_size); if (!s->decoded_buffer_33bps) return AVERROR(ENOMEM);
ret = av_samples_fill_arrays((uint8_t **)&s->decoded_33bps, NULL,
s->decoded_buffer_33bps,
1,
s->stream_info.max_blocksize,
AV_SAMPLE_FMT_S64P, 0);
} return ret < 0 ? ret : 0;
}
/** * Parse the STREAMINFO from an inline header. * @param s the flac decoding context * @param buf input buffer, starting with the "fLaC" marker * @param buf_size buffer size * @return non-zero if metadata is invalid
*/ staticint parse_streaminfo(FLACContext *s, const uint8_t *buf, int buf_size)
{ int metadata_type, metadata_size, ret;
if (buf_size < FLAC_STREAMINFO_SIZE+8) { /* need more data */ return 0;
}
flac_parse_block_header(&buf[4], NULL, &metadata_type, &metadata_size); if (metadata_type != FLAC_METADATA_TYPE_STREAMINFO ||
metadata_size != FLAC_STREAMINFO_SIZE) { return AVERROR_INVALIDDATA;
}
ret = ff_flac_parse_streaminfo(s->avctx, &s->stream_info, &buf[8]); if (ret < 0) return ret;
ret = allocate_buffers(s); if (ret < 0) return ret;
flac_set_bps(s);
ff_flacdsp_init(&s->dsp, s->avctx->sample_fmt,
s->stream_info.channels);
s->got_streaminfo = 1;
return 0;
}
/** * Determine the size of an inline header. * @param buf input buffer, starting with the "fLaC" marker * @param buf_size buffer size * @return number of bytes in the header, or 0 if more data is needed
*/ staticint get_metadata_size(const uint8_t *buf, int buf_size)
{ int metadata_last, metadata_size; const uint8_t *buf_end = buf + buf_size;
buf += 4; do { if (buf_end - buf < 4) return AVERROR_INVALIDDATA;
flac_parse_block_header(buf, &metadata_last, NULL, &metadata_size);
buf += 4; if (buf_end - buf < metadata_size) { /* need more data in order to read the complete header */ return AVERROR_INVALIDDATA;
}
buf += metadata_size;
} while (!metadata_last);
return buf_size - (buf_end - buf);
}
staticint decode_residuals(FLACContext *s, int32_t *decoded, int pred_order)
{
GetBitContext gb = s->gb; int i, tmp, partition, method_type, rice_order; int rice_bits, rice_esc; int samples;
for (partition = 0; partition < (1 << rice_order); partition++) {
tmp = get_bits(&gb, rice_bits); if (tmp == rice_esc) {
tmp = get_bits(&gb, 5); for (; i < samples; i++)
*decoded++ = get_sbits_long(&gb, tmp);
} else { int real_limit = (tmp > 1) ? (INT_MAX >> (tmp - 1)) + 2 : INT_MAX; for (; i < samples; i++) { int v = get_sr_golomb_flac(&gb, tmp, real_limit, 1); if (v == 0x80000000){
av_log(s->avctx, AV_LOG_ERROR, "invalid residual\n"); return AVERROR_INVALIDDATA;
}
*decoded++ = v;
}
}
i= 0;
}
s->gb = gb;
return 0;
}
staticint decode_subframe_fixed(FLACContext *s, int32_t *decoded, int pred_order, int bps)
{ constint blocksize = s->blocksize; unsigned av_uninit(a), av_uninit(b), av_uninit(c), av_uninit(d); int i; int ret;
/* warm up samples */ for (i = 0; i < pred_order; i++) {
decoded[i] = get_sbits_long(&s->gb, bps);
}
if ((ret = decode_residuals(s, decoded, pred_order)) < 0) return ret;
if (pred_order > 0)
a = decoded[pred_order-1]; if (pred_order > 1)
b = a - decoded[pred_order-2]; if (pred_order > 2)
c = b - decoded[pred_order-2] + decoded[pred_order-3]; if (pred_order > 3)
d = c - decoded[pred_order-2] + 2U*decoded[pred_order-3] - decoded[pred_order-4];
switch (pred_order) { case 0: break; case 1: for (i = pred_order; i < blocksize; i++)
decoded[i] = a += decoded[i]; break; case 2: for (i = pred_order; i < blocksize; i++)
decoded[i] = a += b += decoded[i]; break; case 3: for (i = pred_order; i < blocksize; i++)
decoded[i] = a += b += c += decoded[i]; break; case 4: for (i = pred_order; i < blocksize; i++)
decoded[i] = a += b += c += d += decoded[i]; break; default:
av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order); return AVERROR_INVALIDDATA;
}
return 0;
}
#define DECODER_SUBFRAME_FIXED_WIDE(residual) { \ constint blocksize = s->blocksize; \ int ret; \
\ if ((ret = decode_residuals(s, residual, pred_order)) < 0) \ return ret; \
\ switch (pred_order) { \ case 0: \ for (int i = pred_order; i < blocksize; i++) \
decoded[i] = residual[i]; \ break; \ case 1: \ for (int i = pred_order; i < blocksize; i++) \
decoded[i] = (uint64_t)residual[i] + (uint64_t)decoded[i-1];\ break; \ case 2: \ for (int i = pred_order; i < blocksize; i++) \
decoded[i] = (uint64_t)residual[i] + 2*(uint64_t)decoded[i-1] - (uint64_t)decoded[i-2]; \ break; \ case 3: \ for (int i = pred_order; i < blocksize; i++) \
decoded[i] = (uint64_t)residual[i] + 3*(uint64_t)decoded[i-1] - 3*(uint64_t)decoded[i-2] + (uint64_t)decoded[i-3]; \ break; \ case 4: \ for (int i = pred_order; i < blocksize; i++) \
decoded[i] = (uint64_t)residual[i] + 4*(uint64_t)decoded[i-1] - 6*(uint64_t)decoded[i-2] + 4*(uint64_t)decoded[i-3] - (uint64_t)decoded[i-4]; \ break; \ default: \
av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order); \ return AVERROR_INVALIDDATA; \
} \ return 0; \
}
staticint decode_subframe_fixed_wide(FLACContext *s, int32_t *decoded, int pred_order, int bps)
{ /* warm up samples */ for (int i = 0; i < pred_order; i++) {
decoded[i] = get_sbits_long(&s->gb, bps);
}
DECODER_SUBFRAME_FIXED_WIDE(decoded);
}
staticint decode_subframe_fixed_33bps(FLACContext *s, int64_t *decoded,
int32_t *residual, int pred_order)
{ /* warm up samples */ \ for (int i = 0; i < pred_order; i++) { \
decoded[i] = get_sbits64(&s->gb, 33); \
} \
DECODER_SUBFRAME_FIXED_WIDE(residual);
}
staticvoid lpc_analyze_remodulate(SUINT32 *decoded, constint coeffs[32], int order, int qlevel, int len, int bps)
{ int i, j; int ebps = 1 << (bps-1); unsigned sigma = 0;
for (i = order; i < len; i++)
sigma |= decoded[i] + ebps;
if (sigma < 2*ebps) return;
for (i = len - 1; i >= order; i--) {
int64_t p = 0; for (j = 0; j < order; j++)
p += coeffs[j] * (int64_t)(int32_t)decoded[i-order+j];
decoded[i] -= p >> qlevel;
} for (i = order; i < len; i++, decoded++) {
int32_t p = 0; for (j = 0; j < order; j++)
p += coeffs[j] * (uint32_t)decoded[j];
decoded[j] += p >> qlevel;
}
}
staticint decode_subframe_lpc(FLACContext *s, int32_t *decoded, int pred_order, int bps)
{ int i, ret; int coeff_prec, qlevel; int coeffs[32];
/* warm up samples */ for (i = 0; i < pred_order; i++) {
decoded[i] = get_sbits_long(&s->gb, bps);
}
staticint decode_subframe_lpc_33bps(FLACContext *s, int64_t *decoded,
int32_t *residual, int pred_order)
{ int i, ret; int coeff_prec, qlevel; int coeffs[32];
/* warm up samples */ for (i = 0; i < pred_order; i++) {
decoded[i] = get_sbits64(&s->gb, 33);
}
staticinlineint decode_subframe(FLACContext *s, int channel)
{
int32_t *decoded = s->decoded[channel]; int type, wasted = 0; int bps = s->stream_info.bps; int i, ret;
if (channel == 0) { if (s->ch_mode == FLAC_CHMODE_RIGHT_SIDE)
bps++;
} else { if (s->ch_mode == FLAC_CHMODE_LEFT_SIDE || s->ch_mode == FLAC_CHMODE_MID_SIDE)
bps++;
}
if (get_bits1(&s->gb)) {
av_log(s->avctx, AV_LOG_ERROR, "invalid subframe padding\n"); return AVERROR_INVALIDDATA;
}
type = get_bits(&s->gb, 6);
if (get_bits1(&s->gb)) { int left = get_bits_left(&s->gb); if ( left <= 0 ||
(left < bps && !show_bits_long(&s->gb, left)) ||
!show_bits_long(&s->gb, bps-1)) {
av_log(s->avctx, AV_LOG_ERROR, "Invalid number of wasted bits > available bits (%d) - left=%d\n",
bps, left); return AVERROR_INVALIDDATA;
}
wasted = 1 + get_unary(&s->gb, 1, get_bits_left(&s->gb));
bps -= wasted;
}
//FIXME use av_log2 for types if (type == 0) { if (bps < 33) {
int32_t tmp = get_sbits_long(&s->gb, bps); for (i = 0; i < s->blocksize; i++)
decoded[i] = tmp;
} else {
int64_t tmp = get_sbits64(&s->gb, 33); for (i = 0; i < s->blocksize; i++)
s->decoded_33bps[i] = tmp;
}
} elseif (type == 1) { if (bps < 33) { for (i = 0; i < s->blocksize; i++)
decoded[i] = get_sbits_long(&s->gb, bps);
} else { for (i = 0; i < s->blocksize; i++)
s->decoded_33bps[i] = get_sbits64(&s->gb, 33);
}
} elseif ((type >= 8) && (type <= 12)) { int order = type & ~0x8; if (bps < 33) { if (bps + order <= 32) { if ((ret = decode_subframe_fixed(s, decoded, order, bps)) < 0) return ret;
} else { if ((ret = decode_subframe_fixed_wide(s, decoded, order, bps)) < 0) return ret;
}
} else { if ((ret = decode_subframe_fixed_33bps(s, s->decoded_33bps, decoded, order)) < 0) return ret;
}
} elseif (type >= 32) { if (bps < 33) { if ((ret = decode_subframe_lpc(s, decoded, (type & ~0x20)+1, bps)) < 0) return ret;
} else { if ((ret = decode_subframe_lpc_33bps(s, s->decoded_33bps, decoded, (type & ~0x20)+1)) < 0) return ret;
}
} else {
av_log(s->avctx, AV_LOG_ERROR, "invalid coding type\n"); return AVERROR_INVALIDDATA;
}
/* check that there is at least the smallest decodable amount of data. this amount corresponds to the smallest valid FLAC frame possible.
FF F8 69 02 00 00 9A 00 00 34 */ if (buf_size < FLAC_MIN_FRAME_SIZE) return buf_size;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.