static int encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr) { DCAEncContext *c = avctx->priv_data; const int32_t *samples; int ret, i; if ((ret = ff_alloc_packet2(avctx, avpkt, c->frame_size, 0)) < 0) return ret; samples = (const int32_t *)frame->data[0]; subband_transform(c, samples); if (c->lfe_channel) lfe_downsample(c, samples); calc_masking(c, samples); find_peaks(c); assign_bits(c); calc_scales(c); quantize_all(c); shift_history(c, samples); init_put_bits(&c->pb, avpkt->data, avpkt->size); put_frame_header(c); put_primary_audio_header(c); for (i = 0; i < SUBFRAMES; i++) put_subframe(c, i); for (i = put_bits_count(&c->pb); i < 8*c->frame_size; i++) put_bits(&c->pb, 1, 0); flush_put_bits(&c->pb); avpkt->pts = frame->pts; avpkt->duration = ff_samples_to_time_base(avctx, frame->nb_samples); avpkt->size = put_bits_count(&c->pb) >> 3; *got_packet_ptr = 1; return 0; }
static int init_quantization_noise(DCAEncContext *c, int noise) { int ch, band, ret = 0; uint32_t huff_bit_count_accum[MAX_CHANNELS][DCA_CODE_BOOKS][7]; uint32_t clc_bit_count_accum[MAX_CHANNELS][DCA_CODE_BOOKS]; uint32_t bits_counter = 0; c->consumed_bits = 132 + 333 * c->fullband_channels; if (c->lfe_channel) c->consumed_bits += 72; /* attempt to guess the bit distribution based on the prevoius frame */ for (ch = 0; ch < c->fullband_channels; ch++) { for (band = 0; band < 32; band++) { int snr_cb = c->peak_cb[ch][band] - c->band_masking_cb[band] - noise; if (snr_cb >= 1312) { c->abits[ch][band] = 26; ret |= USED_26ABITS; } else if (snr_cb >= 222) { c->abits[ch][band] = 8 + mul32(snr_cb - 222, 69000000); ret |= USED_NABITS; } else if (snr_cb >= 0) { c->abits[ch][band] = 2 + mul32(snr_cb, 106000000); ret |= USED_NABITS; } else { c->abits[ch][band] = 1; ret |= USED_1ABITS; } } c->consumed_bits += set_best_abits_code(c->abits[ch], 32, &c->bit_allocation_sel[ch]); } /* Recalc scale_factor each time to get bits consumption in case of Huffman coding. It is suboptimal solution */ /* TODO: May be cache scaled values */ for (ch = 0; ch < c->fullband_channels; ch++) { for (band = 0; band < 32; band++) { c->scale_factor[ch][band] = calc_one_scale(c->peak_cb[ch][band], c->abits[ch][band], &c->quant[ch][band]); } } quantize_all(c); memset(huff_bit_count_accum, 0, MAX_CHANNELS * DCA_CODE_BOOKS * 7 * sizeof(uint32_t)); memset(clc_bit_count_accum, 0, MAX_CHANNELS * DCA_CODE_BOOKS * sizeof(uint32_t)); for (ch = 0; ch < c->fullband_channels; ch++) { for (band = 0; band < 32; band++) { if (c->abits[ch][band] && c->abits[ch][band] <= DCA_CODE_BOOKS) { accumulate_huff_bit_consumption(c->abits[ch][band], c->quantized[ch][band], huff_bit_count_accum[ch][c->abits[ch][band] - 1]); clc_bit_count_accum[ch][c->abits[ch][band] - 1] += bit_consumption[c->abits[ch][band]]; } else { bits_counter += bit_consumption[c->abits[ch][band]]; } } } for (ch = 0; ch < c->fullband_channels; ch++) { bits_counter += set_best_code(huff_bit_count_accum[ch], clc_bit_count_accum[ch], c->quant_index_sel[ch]); } c->consumed_bits += bits_counter; return ret; }