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);
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;
return0;
}
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) { case0: break; case1: for (i = pred_order; i < blocksize; i++)
decoded[i] = a += decoded[i]; break; case2: for (i = pred_order; i < blocksize; i++)
decoded[i] = a += b += decoded[i]; break; case3: for (i = pred_order; i < blocksize; i++)
decoded[i] = a += b += c += decoded[i]; break; case4: 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;
}
return0;
}
#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) { \ case0: \ for (int i = pred_order; i < blocksize; i++) \
decoded[i] = residual[i]; \ break; \ case1: \ for (int i = pred_order; i < blocksize; i++) \
decoded[i] = (uint64_t)residual[i] + (uint64_t)decoded[i-1];\ break; \ case2: \ 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; \ case3: \ 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; \ case4: \ 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; \
} \ return0; \
}
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. thisamountcorrespondstothesmallestvalidFLACframepossible.
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.