Пример #1
0
static void encodeMainData(shine_global_config *config)
{
    int gr, ch, sfb;
    shine_side_info_t si = config->side_info;

    for (gr = 0; gr < config->mpeg.granules_per_frame; gr++)
    {
        for (ch = 0; ch < config->wave.channels; ch++)
        {
            gr_info *gi    = &(si.gr[gr].ch[ch].tt);
            unsigned slen1 = slen1_tab[gi->scalefac_compress];
            unsigned slen2 = slen2_tab[gi->scalefac_compress];
            int *ix        = &config->l3_enc[ch][gr][0];

            if (gr == 0 || si.scfsi[ch][0] == 0)
                for (sfb = 0; sfb < 6; sfb++)
                    shine_putbits(&config->bs, config->scalefactor.l[gr][ch][sfb], slen1);
            if (gr == 0 || si.scfsi[ch][1] == 0)
                for (sfb = 6; sfb < 11; sfb++)
                    shine_putbits(&config->bs, config->scalefactor.l[gr][ch][sfb], slen1);
            if (gr == 0 || si.scfsi[ch][2] == 0)
                for (sfb = 11; sfb < 16; sfb++)
                    shine_putbits(&config->bs, config->scalefactor.l[gr][ch][sfb], slen2);
            if (gr == 0 || si.scfsi[ch][3] == 0)
                for (sfb = 16; sfb < 21; sfb++)
                    shine_putbits(&config->bs, config->scalefactor.l[gr][ch][sfb], slen2);

            Huffmancodebits(config, ix, gi);
        }
    }
}
Пример #2
0
/* Note the discussion of huffmancodebits() on pages 28 and 29 of the IS, as
  well as the definitions of the side information on pages 26 and 27. */
static void Huffmancodebits(shine_global_config *config, int *ix, gr_info *gi)
{
    const int *scalefac = &shine_scale_fact_band_index[config->mpeg.samplerate_index][0];
    unsigned scalefac_index;
    int region1Start, region2Start;
    int i, bigvalues, count1End;
    int v, w, x, y;
    const struct huffcodetab *h;
    int bits;

    bits = shine_get_bits_count(&config->bs);

    /* 1: Write the bigvalues */
    bigvalues = gi->big_values << 1;

    scalefac_index = gi->region0_count + 1;
    region1Start   = scalefac[scalefac_index];
    scalefac_index += gi->region1_count + 1;
    region2Start = scalefac[scalefac_index];

    for (i = 0; i < bigvalues; i += 2)
    {
        /* get table pointer */
        int idx             = (i >= region1Start) + (i >= region2Start);
        unsigned tableindex = gi->table_select[idx];
        /* get huffman code */
        if (tableindex)
        {
            x = ix[i];
            y = ix[i + 1];
            shine_HuffmanCode(&config->bs, tableindex, x, y);
        }
    }

    /* 2: Write count1 area */
    h         = &shine_huffman_table[gi->count1table_select + 32];
    count1End = bigvalues + (gi->count1 << 2);
    for (i = bigvalues; i < count1End; i += 4)
    {
        v = ix[i];
        w = ix[i + 1];
        x = ix[i + 2];
        y = ix[i + 3];
        shine_huffman_coder_count1(&config->bs, h, v, w, x, y);
    }

    bits = shine_get_bits_count(&config->bs) - bits;
    bits = gi->part2_3_length - gi->part2_length - bits;
    if (bits)
    {
        int stuffingWords = bits / 32;
        int remainingBits = bits % 32;

        /* Due to the nature of the Huffman code tables, we will pad with ones */
        while (stuffingWords--)
            shine_putbits(&config->bs, ~0, 32);
        if (remainingBits)
            shine_putbits(&config->bs, (1UL << remainingBits) - 1, remainingBits);
    }
}
Пример #3
0
static void WriteMainDataBits(unsigned long int val,
                              unsigned int nbits,
                              shine_global_config *config)
{
  unsigned int extra;

  /* assert( nbits <= 32 ); */
  if (config->formatbits.BitCount == config->mpeg.bits_per_frame)
    {
      config->formatbits.BitCount      = write_side_info(config);
      config->formatbits.BitsRemaining = config->mpeg.bits_per_frame - config->formatbits.BitCount;
    }
  if (nbits == 0) return;
  if (nbits > config->formatbits.BitsRemaining)
    {
      extra  = val >> (nbits - config->formatbits.BitsRemaining);
      nbits -= config->formatbits.BitsRemaining;
      shine_putbits( &config->bs, extra, config->formatbits.BitsRemaining);
      config->formatbits.BitCount = write_side_info(config);
      config->formatbits.BitsRemaining = config->mpeg.bits_per_frame - config->formatbits.BitCount;
      shine_putbits( &config->bs, val, nbits);
    }
Пример #4
0
static void shine_huffman_coder_count1(bitstream_t *bs, const struct huffcodetab *h, int v, int w,
                                       int x, int y)
{
    unsigned int signv, signw, signx, signy;
    unsigned int code = 0;
    int p, cbits      = 0;

    signv = shine_abs_and_sign(&v);
    signw = shine_abs_and_sign(&w);
    signx = shine_abs_and_sign(&x);
    signy = shine_abs_and_sign(&y);

    p = v + (w << 1) + (x << 2) + (y << 3);
    shine_putbits(bs, h->table[p], h->hlen[p]);

    if (v)
    {
        code  = signv;
        cbits = 1;
    }
    if (w)
    {
        code = (code << 1) | signw;
        cbits++;
    }
    if (x)
    {
        code = (code << 1) | signx;
        cbits++;
    }
    if (y)
    {
        code = (code << 1) | signy;
        cbits++;
    }
    shine_putbits(bs, code, cbits);
}
Пример #5
0
static int WitePartSideInfo(BF_BitstreamPart *part, shine_global_config *config)
{
  BF_BitstreamElement *ep;
  int i, bits;

  /* assert( part ); */

  bits = 0;
  ep = part->element;
  for ( i = 0; i < part->nrEntries; i++, ep++ )
    {
      shine_putbits( &config->bs, ep->value, ep->length);
      bits += ep->length;
    }
  return bits;
}
Пример #6
0
static void encodeSideInfo(shine_global_config *config)
{
    int gr, ch, scfsi_band, region;
    shine_side_info_t si = config->side_info;

    shine_putbits(&config->bs, 0x7ff, 11);
    shine_putbits(&config->bs, config->mpeg.version, 2);
    shine_putbits(&config->bs, config->mpeg.layer, 2);
    shine_putbits(&config->bs, !config->mpeg.crc, 1);
    shine_putbits(&config->bs, config->mpeg.bitrate_index, 4);
    shine_putbits(&config->bs, config->mpeg.samplerate_index % 3, 2);
    shine_putbits(&config->bs, config->mpeg.padding, 1);
    shine_putbits(&config->bs, config->mpeg.ext, 1);
    shine_putbits(&config->bs, config->mpeg.mode, 2);
    shine_putbits(&config->bs, config->mpeg.mode_ext, 2);
    shine_putbits(&config->bs, config->mpeg.copyright, 1);
    shine_putbits(&config->bs, config->mpeg.original, 1);
    shine_putbits(&config->bs, config->mpeg.emph, 2);

    if (config->mpeg.version == MPEG_I)
    {
        shine_putbits(&config->bs, 0, 9);
        if (config->wave.channels == 2)
            shine_putbits(&config->bs, si.private_bits, 3);
        else
            shine_putbits(&config->bs, si.private_bits, 5);
    }
    else
    {
        shine_putbits(&config->bs, 0, 8);
        if (config->wave.channels == 2)
            shine_putbits(&config->bs, si.private_bits, 2);
        else
            shine_putbits(&config->bs, si.private_bits, 1);
    }

    if (config->mpeg.version == MPEG_I)
        for (ch = 0; ch < config->wave.channels; ch++)
        {
            for (scfsi_band = 0; scfsi_band < 4; scfsi_band++)
                shine_putbits(&config->bs, si.scfsi[ch][scfsi_band], 1);
        }

    for (gr = 0; gr < config->mpeg.granules_per_frame; gr++)
        for (ch = 0; ch < config->wave.channels; ch++)
        {
            gr_info *gi = &(si.gr[gr].ch[ch].tt);

            shine_putbits(&config->bs, gi->part2_3_length, 12);
            shine_putbits(&config->bs, gi->big_values, 9);
            shine_putbits(&config->bs, gi->global_gain, 8);
            if (config->mpeg.version == MPEG_I)
                shine_putbits(&config->bs, gi->scalefac_compress, 4);
            else
                shine_putbits(&config->bs, gi->scalefac_compress, 9);
            shine_putbits(&config->bs, 0, 1);

            for (region = 0; region < 3; region++)
                shine_putbits(&config->bs, gi->table_select[region], 5);

            shine_putbits(&config->bs, gi->region0_count, 4);
            shine_putbits(&config->bs, gi->region1_count, 3);

            if (config->mpeg.version == MPEG_I)
                shine_putbits(&config->bs, gi->preflag, 1);
            shine_putbits(&config->bs, gi->scalefac_scale, 1);
            shine_putbits(&config->bs, gi->count1table_select, 1);
        }
}
Пример #7
0
/* Implements the pseudocode of page 98 of the IS */
static void shine_HuffmanCode(bitstream_t *bs, int table_select, int x, int y)
{
    int cbits = 0, xbits = 0;
    unsigned int code = 0, ext = 0;
    unsigned signx, signy, ylen, idx;
    const struct huffcodetab *h;

    signx = shine_abs_and_sign(&x);
    signy = shine_abs_and_sign(&y);

    h    = &(shine_huffman_table[table_select]);
    ylen = h->ylen;

    if (table_select > 15)
    { /* ESC-table is used */
        unsigned linbitsx = 0, linbitsy = 0, linbits = h->linbits;

        if (x > 14)
        {
            linbitsx = x - 15;
            x        = 15;
        }
        if (y > 14)
        {
            linbitsy = y - 15;
            y        = 15;
        }

        idx   = (x * ylen) + y;
        code  = h->table[idx];
        cbits = h->hlen[idx];
        if (x > 14)
        {
            ext |= linbitsx;
            xbits += linbits;
        }
        if (x != 0)
        {
            ext <<= 1;
            ext |= signx;
            xbits += 1;
        }
        if (y > 14)
        {
            ext <<= linbits;
            ext |= linbitsy;
            xbits += linbits;
        }
        if (y != 0)
        {
            ext <<= 1;
            ext |= signy;
            xbits += 1;
        }

        shine_putbits(bs, code, cbits);
        shine_putbits(bs, ext, xbits);
    }
    else
    { /* No ESC-words */
        idx   = (x * ylen) + y;
        code  = h->table[idx];
        cbits = h->hlen[idx];
        if (x != 0)
        {
            code <<= 1;
            code |= signx;
            cbits += 1;
        }
        if (y != 0)
        {
            code <<= 1;
            code |= signy;
            cbits += 1;
        }

        shine_putbits(bs, code, cbits);
    }
}