Ignore:
Timestamp:
11/24/06 19:18:18 (18 years ago)
Author:
r2d
Message:
  • updated libmpcenc / libmpcdec according to the spec
  • added seek table loading from file in libmpcdec
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libmpc/branches/r2d/libmpcdec/mpc_demux.c

    r149 r150  
    4141mpc_uint32_t mpc_bits_read(mpc_bits_reader * r, const unsigned int nb_bits);
    4242int mpc_bits_get_block(mpc_bits_reader * r, mpc_block * p_block);
     43mpc_int32_t mpc_bits_golomb_dec(mpc_bits_reader * r, const mpc_uint_t k);
     44unsigned int mpc_bits_get_size(mpc_bits_reader * r, mpc_uint64_t * p_size);
    4345
    4446// streaminfo.c
     
    143145{
    144146        return ((d->r->tell(d->r) - d->bytes_total + d->bits_reader.buff - d->buffer) << 3) + 8 - d->bits_reader.count;
     147}
     148
     149mpc_status mpc_demux_seek_init(mpc_demux * d)
     150{
     151        if (d->seek_table != 0)
     152                return MPC_STATUS_OK;
     153
     154        d->seek_pwr = 6;
     155        if (d->si.block_pwr > d->seek_pwr)
     156                d->seek_pwr = d->si.block_pwr;
     157        d->seek_table = malloc((1 + d->si.samples / (MPC_FRAME_LENGTH << d->seek_pwr)) * sizeof(mpc_uint32_t));
     158        if (d->seek_table == 0)
     159                return MPC_STATUS_FILE;
     160        d->seek_table[0] = mpc_demux_pos(d);
     161        d->seek_table_size = 1;
     162
     163        return MPC_STATUS_OK;
     164}
     165
     166static void mpc_demux_ST(mpc_demux * d)
     167{
     168        mpc_uint64_t tmp;
     169        mpc_uint32_t * table;
     170        mpc_bits_reader r = d->bits_reader;
     171        mpc_uint_t i;
     172
     173        if (d->seek_table != 0)
     174                return;
     175
     176        mpc_bits_get_size(&r, &tmp);
     177        d->seek_table_size = tmp;
     178        d->seek_pwr = d->si.block_pwr + mpc_bits_read(&r, 4);
     179        d->seek_table = malloc((1 + d->si.samples / (MPC_FRAME_LENGTH << d->seek_pwr)) * sizeof(mpc_uint32_t));
     180
     181        table = d->seek_table;
     182        mpc_bits_get_size(&r, &tmp);
     183        table[0] = (tmp + d->si.header_position) * 8;
     184
     185        if (d->seek_table_size == 1)
     186                return;
     187
     188        mpc_bits_get_size(&r, &tmp);
     189        table[1] = (tmp + d->si.header_position) * 8;
     190
     191        for (i = 2; i < d->seek_table_size; i++) {
     192                int code = mpc_bits_golomb_dec(&r, 12);
     193                if (code & 1)
     194                        code = -(code & (-1u << 1));
     195                code <<= 2;
     196                table[i] = code + 2 * table[i-1] - table[i-2];
     197        }
     198}
     199
     200static void mpc_demux_SP(mpc_demux * d, int size, int block_size)
     201{
     202        mpc_size_t cur;
     203        mpc_uint64_t ptr;
     204        mpc_block b;
     205
     206        cur = mpc_demux_pos(d);
     207        mpc_bits_get_size(&d->bits_reader, &ptr);
     208        mpc_demux_seek(d, (ptr - size) * 8 + cur, 11);
     209        mpc_bits_get_block(&d->bits_reader, &b);
     210        if (memcmp(b.key, "ST", 2) == 0) {
     211                mpc_demux_fill(d, b.size, 0);
     212                mpc_demux_ST(d);
     213        }
     214        mpc_demux_seek(d, cur, 11 + block_size);
    145215}
    146216
     
    189259                        } else if (memcmp(b.key, "EI", 2) == 0)
    190260                                streaminfo_encoder_info(&d->si, &d->bits_reader);
     261                        else if (memcmp(b.key, "SP", 2) == 0)
     262                                mpc_demux_SP(d, size, b.size);
     263                        else if (memcmp(b.key, "ST", 2) == 0)
     264                                mpc_demux_ST(d);
    191265                        d->bits_reader.buff += b.size;
    192266                        size = mpc_bits_get_block(&d->bits_reader, &b);
     
    206280                p_tmp->r = p_reader;
    207281                mpc_demux_clear_buff(p_tmp);
     282                p_tmp->seek_table = 0;
    208283                if (mpc_demux_header(p_tmp) == MPC_STATUS_OK) {
    209                         p_tmp->seek_pwr = 6;
    210                         if (p_tmp->si.block_pwr > p_tmp->seek_pwr)
    211                                 p_tmp->seek_pwr = p_tmp->si.block_pwr;
    212                         p_tmp->seek_table = malloc((1 + p_tmp->si.samples / (MPC_FRAME_LENGTH << p_tmp->seek_pwr)) * sizeof(mpc_uint32_t));
    213                         p_tmp->seek_table[0] = mpc_demux_pos(p_tmp);
    214                         p_tmp->seek_table_size = 1;
     284                        mpc_demux_seek_init(p_tmp);
    215285                        p_tmp->d = mpc_decoder_init(&p_tmp->si);
    216286                } else {
Note: See TracChangeset for help on using the changeset viewer.