58 #define MONO            0x1000001 
   59 #define STEREO          0x1000002 
   60 #define JOINT_STEREO    0x1000003 
   61 #define MC_COOK         0x2000000   // multichannel Cook, not supported 
   63 #define SUBBAND_SIZE    20 
   64 #define MAX_SUBPACKETS   5 
   89     float               mono_previous_buffer1[1024];
 
   90     float               mono_previous_buffer2[1024];
 
  100 typedef struct cook {
 
  105     void (*scalar_dequant)(
struct cook *q, 
int index, 
int quant_index,
 
  106                            int *subband_coef_index, 
int *subband_coef_sign,
 
  109     void (*decouple)(
struct cook *q,
 
  113                      float *decode_buffer,
 
  114                      float *mlt_buffer1, 
float *mlt_buffer2);
 
  116     void (*imlt_window)(
struct cook *q, 
float *buffer1,
 
  117                         cook_gains *gains_ptr, 
float *previous_buffer);
 
  120                         int gain_index, 
int gain_index_next);
 
  122     void (*saturate_output)(
struct cook *q, 
float *
out);
 
  139     VLC                 envelope_quant_index[13];
 
  144     float               gain_table[23];
 
  150     float               decode_buffer_1[1024];
 
  151     float               decode_buffer_2[1024];
 
  152     float               decode_buffer_0[1060]; 
 
  168     for (i = -63; i < 64; i++) {
 
  179     for (i = 0; i < 23; i++)
 
  190     for (i = 0; i < 13; i++) {
 
  196     for (i = 0; i < 7; i++) {
 
  226     for (j = 0; j < mlt_size; j++)
 
  243     for (i = 0; i < 5; i++)
 
  249 #define DECODE_BYTES_PAD1(bytes) (3 - ((bytes) + 3) % 4) 
  250 #define DECODE_BYTES_PAD2(bytes) ((bytes) % 4 + DECODE_BYTES_PAD1(2 * (bytes))) 
  274     static const uint32_t 
tab[4] = {
 
  281     uint32_t *obuf = (uint32_t *) out;
 
  288     off = (intptr_t) inbuffer & 3;
 
  289     buf = (
const uint32_t *) (inbuffer - off);
 
  292     for (i = 0; i < bytes / 4; i++)
 
  293         obuf[i] = c ^ buf[i];
 
  312     for (i = 0; i < 13; i++)
 
  314     for (i = 0; i < 7; i++)
 
  346             gaininfo[i++] = gain;
 
  359                            int *quant_index_table)
 
  363     quant_index_table[0] = 
get_bits(&q->
gb, 6) - 6; 
 
  379         quant_index_table[i] = quant_index_table[i - 1] + j - 12; 
 
  380         if (quant_index_table[i] > 63 || quant_index_table[i] < -63) {
 
  382                    "Invalid quantizer %d at position %d, outside [-63, 63] range\n",
 
  383                    quant_index_table[i], i);
 
  400                        int *category, 
int *category_index)
 
  402     int exp_idx, bias, tmpbias1, tmpbias2, bits_left, num_bits, 
index, 
v, i, j;
 
  403     int exp_index2[102] = { 0 };
 
  404     int exp_index1[102] = { 0 };
 
  406     int tmp_categorize_array[128 * 2] = { 0 };
 
  419     for (i = 32; i > 0; i = i / 2) {
 
  423             exp_idx = av_clip((i - quant_index_table[index] + bias) / 2, 0, 7);
 
  427         if (num_bits >= bits_left - 32)
 
  434         exp_idx = av_clip((bias - quant_index_table[i]) / 2, 0, 7);
 
  436         exp_index1[i] = exp_idx;
 
  437         exp_index2[i] = exp_idx;
 
  439     tmpbias1 = tmpbias2 = num_bits;
 
  442         if (tmpbias1 + tmpbias2 > 2 * bits_left) {  
 
  446                 if (exp_index1[i] < 7) {
 
  447                     v = (-2 * exp_index1[i]) - quant_index_table[i] + bias;
 
  456             tmp_categorize_array[tmp_categorize_array1_idx++] = 
index;
 
  464                 if (exp_index2[i] > 0) {
 
  465                     v = (-2 * exp_index2[i]) - quant_index_table[i] + bias;
 
  474             tmp_categorize_array[--tmp_categorize_array2_idx] = 
index;
 
  482         category[i] = exp_index2[i];
 
  485         category_index[i] = tmp_categorize_array[tmp_categorize_array2_idx++];
 
  502         int idx = category_index[i];
 
  519                                  int *subband_coef_index, 
int *subband_coef_sign,
 
  526         if (subband_coef_index[i]) {
 
  528             if (subband_coef_sign[i])
 
  548                        int *subband_coef_index, 
int *subband_coef_sign)
 
  551     int vlc, vd, tmp, result;
 
  555     for (i = 0; i < 
vpr_tab[category]; i++) {
 
  561         for (j = vd - 1; j >= 0; j--) {
 
  563             subband_coef_index[vd * i + j] = vlc - tmp * (
kmax_tab[category] + 1);
 
  566         for (j = 0; j < vd; j++) {
 
  567             if (subband_coef_index[i * vd + j]) {
 
  572                     subband_coef_sign[i * vd + j] = 0;
 
  575                 subband_coef_sign[i * vd + j] = 0;
 
  592                            int *quant_index_table, 
float *mlt_buffer)
 
  604         index = category[
band];
 
  605         if (category[band] < 7) {
 
  606             if (
unpack_SQVH(q, p, category[band], subband_coef_index, subband_coef_sign)) {
 
  609                     category[band + j] = 7;
 
  613             memset(subband_coef_index, 0, 
sizeof(subband_coef_index));
 
  614             memset(subband_coef_sign,  0, 
sizeof(subband_coef_sign));
 
  617                           subband_coef_index, subband_coef_sign,
 
  629     int category_index[128] = { 0 };
 
  630     int category[128]       = { 0 };
 
  631     int quant_index_table[102];
 
  637     categorize(q, p, quant_index_table, category, category_index);
 
  658                               int gain_index, 
int gain_index_next)
 
  662     fc1 = 
pow2tab[gain_index + 63];
 
  664     if (gain_index == gain_index_next) {             
 
  668         fc2 = q->
gain_table[11 + (gain_index_next - gain_index)];
 
  685                               cook_gains *gains_ptr, 
float *previous_buffer)
 
  697         inbuffer[i] = inbuffer[i] * fc * q->
mlt_window[i] -
 
  713                       cook_gains *gains_ptr, 
float *previous_buffer)
 
  722     q->
imlt_window(q, buffer1, gains_ptr, previous_buffer);
 
  725     for (i = 0; i < 8; i++)
 
  726         if (gains_ptr->
now[i] || gains_ptr->
now[i + 1])
 
  728                            gains_ptr->
now[i], gains_ptr->
now[i + 1]);
 
  731     memcpy(previous_buffer, buffer0,
 
  748     int length = end - start + 1;
 
  754         for (i = 0; i < 
length; i++)
 
  759         for (i = 0; i < 
length; i++) {
 
  765             decouple_tab[start + i] = 
v;
 
  785                            float *decode_buffer,
 
  786                            float *mlt_buffer1, 
float *mlt_buffer2)
 
  791         mlt_buffer1[SUBBAND_SIZE * subband + j] = f1 * decode_buffer[tmp_idx];
 
  792         mlt_buffer2[SUBBAND_SIZE * subband + j] = f2 * decode_buffer[tmp_idx];
 
  804                         float *mlt_buffer_left, 
float *mlt_buffer_right)
 
  811     const float *cplscale;
 
  816     memset(mlt_buffer_left,  0, 1024 * 
sizeof(*mlt_buffer_left));
 
  817     memset(mlt_buffer_right, 0, 1024 * 
sizeof(*mlt_buffer_right));
 
  825             mlt_buffer_left[i  * 20 + j] = decode_buffer[i * 40 + j];
 
  826             mlt_buffer_right[i * 20 + j] = decode_buffer[i * 40 + 20 + j];
 
  835         idx -= decouple_tab[cpl_tmp];
 
  837         f1 = cplscale[decouple_tab[cpl_tmp] + 1];
 
  839         q->
decouple(q, p, i, f1, f2, decode_buffer,
 
  840                     mlt_buffer_left, mlt_buffer_right);
 
  896                                          cook_gains *gains_ptr, 
float *previous_buffer,
 
  899     imlt_gain(q, decode_buffer, gains_ptr, previous_buffer);
 
  914                             const uint8_t *inbuffer, 
float **outbuffer)
 
  916     int sub_packet_size = p->
size;
 
  938                           outbuffer ? outbuffer[p->
ch_idx] : NULL);
 
  944                                   outbuffer ? outbuffer[p->
ch_idx + 1] : NULL);
 
  948                                   outbuffer ? outbuffer[p->
ch_idx + 1] : NULL);
 
  956                              int *got_frame_ptr, 
AVPacket *avpkt)
 
  960     int buf_size = avpkt->
size;
 
  962     float **samples = NULL;
 
  967     if (buf_size < avctx->block_align)
 
  986                    "frame subpacket size total > avctx->block_align!\n");
 
  997                "subpacket[%i] size %i js %i %i block_align %i\n",
 
 1025 #define PRINT(a, b) av_dlog(q->avctx, " %s = %d\n", a, b); 
 1057     unsigned int channel_mask = 0;
 
 1058     int samples_per_frame = 0;
 
 1063     if (extradata_size <= 0) {
 
 1080     while (edata_ptr < edata_ptr_end) {
 
 1083         if (extradata_size >= 8) {
 
 1085             samples_per_frame           = bytestream_get_be16(&edata_ptr);
 
 1087             extradata_size -= 8;
 
 1089         if (extradata_size >= 8) {
 
 1090             bytestream_get_be32(&edata_ptr);    
 
 1098             extradata_size -= 8;
 
 1151             if (extradata_size >= 4)
 
 1275     dump_cook_context(q);