Changeset 196 for libmpc/branches/r2d/libmpcdec/mpc_demux.c
- Timestamp:
- 12/30/06 17:49:40 (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libmpc/branches/r2d/libmpcdec/mpc_demux.c
r195 r196 131 131 mpc_demux_clear_buff(d); 132 132 if (d->si.stream_version == 7) 133 mpc_demux_fill(d, (min_bytes + ((bit_offset + 7) >> 3) + 3) & ( -1 << 2), MPC_BUFFER_SWAP);133 mpc_demux_fill(d, (min_bytes + ((bit_offset + 7) >> 3) + 3) & (~3), MPC_BUFFER_SWAP); 134 134 else 135 135 mpc_demux_fill(d, min_bytes + ((bit_offset + 7) >> 3), 0); … … 146 146 { 147 147 return ((d->r->tell(d->r) - d->bytes_total + d->bits_reader.buff - d->buffer) << 3) + 8 - d->bits_reader.count; 148 } 149 150 /** 151 * Searches for a ID3v2-tag and reads the length (in bytes) of it. 152 * 153 * @param d demuxer context 154 * @return size of tag, in bytes 155 * @return MPC_STATUS_FILE on errors of any kind 156 */ 157 mpc_int32_t mpc_demux_skip_id3v2(mpc_demux * d) 158 { 159 mpc_uint8_t tmp [4]; 160 mpc_bool_t footerPresent; // ID3v2.4-flag 161 mpc_int32_t size; 162 163 // we must be at the beginning of the stream 164 mpc_demux_fill(d, 3, 0); 165 166 // check id3-tag 167 if ( 0 != memcmp( d->bits_reader.buff, "ID3", 3 ) ) 168 return 0; 169 170 mpc_demux_fill(d, 10, 0); 171 172 mpc_bits_read(&d->bits_reader, 24); // read ID3 173 mpc_bits_read(&d->bits_reader, 16); // read tag version 174 175 tmp[0] = mpc_bits_read(&d->bits_reader, 8); // read flags 176 footerPresent = tmp[0] & 0x10; 177 if ( tmp[0] & 0x0F ) 178 return MPC_STATUS_FILE; // not (yet???) allowed 179 180 tmp[0] = mpc_bits_read(&d->bits_reader, 8); // read size 181 tmp[1] = mpc_bits_read(&d->bits_reader, 8); // read size 182 tmp[2] = mpc_bits_read(&d->bits_reader, 8); // read size 183 tmp[3] = mpc_bits_read(&d->bits_reader, 8); // read size 184 185 if ( (tmp[0] | tmp[1] | tmp[2] | tmp[3]) & 0x80 ) 186 return MPC_STATUS_FILE; // not allowed 187 188 // read headerSize (syncsave: 4 * $0xxxxxxx = 28 significant bits) 189 size = tmp[0] << 21; 190 size |= tmp[1] << 14; 191 size |= tmp[2] << 7; 192 size |= tmp[3]; 193 194 if ( footerPresent ) 195 size += 10; 196 197 mpc_demux_fill(d, size, 0); 198 d->bits_reader.buff += size; 199 200 return size + 10; 148 201 } 149 202 … … 219 272 { 220 273 char magic[4]; 221 int err;222 274 223 275 memset(&d->si, 0, sizeof d->si); 224 276 225 277 // get header position 226 err = d->si.header_position = mpc_skip_id3v2(d->r); 227 if(err < 0) return MPC_STATUS_FILE; 228 229 // seek to first byte of mpc data 230 err = d->r->seek(d->r, d->si.header_position); 231 if(!err) return MPC_STATUS_FILE; 278 d->si.header_position = mpc_demux_skip_id3v2(d); 279 if(d->si.header_position < 0) return MPC_STATUS_FILE; 232 280 233 281 d->si.tag_offset = d->si.total_file_length = d->r->get_size(d->r); … … 418 466 return MPC_STATUS_OK; 419 467 } 468
Note: See TracChangeset
for help on using the changeset viewer.