Changeset 206


Ignore:
Timestamp:
02/09/07 18:57:23 (17 years ago)
Author:
r2d
Message:
  • corrected a bug where very short frames ( < 1 byte, generally silence) were skiped at the end of a block.
Location:
libmpc/branches/r2d
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • libmpc/branches/r2d/libmpcdec/internal.h

    r196 r206  
    7474        mpc_size_t bytes_total;
    7575        mpc_bits_reader bits_reader;
    76         mpc_uint32_t block_bits; /// bits remaining in current audio block
    77         mpc_bool_t end; /// end of stream flag
     76        mpc_int32_t block_bits; /// bits remaining in current audio block
     77        mpc_uint_t block_frames; /// frames remaining in current audio block
    7878
    7979        // seeking
  • libmpc/branches/r2d/libmpcdec/mpc_demux.c

    r205 r206  
    6666        d->bits_reader.count = 8;
    6767        d->block_bits = 0;
    68         d->end = MPC_FALSE;
     68        d->block_frames = 0;
    6969}
    7070
     
    361361                mpc_bits_reader r;
    362362                i->is_key_frame = MPC_FALSE;
    363                 if (d->block_bits < 8 && d->end == MPC_FALSE) {
     363
     364                if (d->block_frames == 0) {
    364365                        mpc_block b = {{0,0},0};
    365366                        d->bits_reader.count &= -8;
     
    372373                        while( memcmp(b.key, "AD", 2) != 0 ) { // scan all blocks until audio
    373374                                if (memcmp(b.key, "SE", 2) == 0) { // end block
    374                                         d->end = MPC_TRUE;
    375                                         break;
     375                                        i->bits = -1;
     376                                        return;
    376377                                }
    377378                                mpc_demux_fill(d, 11 + (mpc_uint32_t) b.size, 0);
     
    380381                        }
    381382                        d->block_bits = (mpc_uint32_t) b.size * 8;
     383                        d->block_frames = 1 << d->si.block_pwr;
    382384                        i->is_key_frame = MPC_TRUE;
    383385                }
     
    387389                mpc_decoder_decode_frame(d->d, &d->bits_reader, i);
    388390                d->block_bits -= ((d->bits_reader.buff - r.buff) << 3) + r.count - d->bits_reader.count;
     391                d->block_frames--;
     392                if (d->block_bits < 0) i->bits = -1;
    389393        } else {
    390394                mpc_bits_reader r;
  • libmpc/branches/r2d/mpc2sv8/mpc2sv8.c

    r205 r206  
    5757                mpc_int32_t * q_d = d->Q[i].L, * q_e = e->Q[i].L, Res = d->Res_L[i];
    5858
    59                 if (Res != 0)
     59                if (Res > 0)
    6060                        for( j = 0; j < 36; j++)
    6161                                q_e[j] = q_d[j] + offset[Res];
     
    6363                q_d = d->Q[i].R, q_e = e->Q[i].R, Res = d->Res_R[i];
    6464
    65                 if (Res != 0)
     65                if (Res > 0)
    6666                        for( j = 0; j < 36; j++)
    6767                                q_e[j] = q_d[j] + offset[Res];
     
    137137
    138138                demux->d->samples_to_skip = MPC_FRAME_LENGTH + MPC_DECODER_SYNTH_DELAY;
    139                 frame.buffer = 0;
    140139                mpc_demux_decode(demux, &frame);
    141140
Note: See TracChangeset for help on using the changeset viewer.