Changeset 379 for dsfilters/demux_mpc/src/mpc_file.cpp
- Timestamp:
- 01/05/08 11:40:24 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
dsfilters/demux_mpc/src/mpc_file.cpp
r378 r379 7 7 //----------------------------------------------------------------------------- 8 8 #include "stdafx.h" 9 9 #include <math.h> 10 10 11 11 … … 25 25 extradata_size = 0; 26 26 extradata = (uint8*)malloc(extradata_max_size); 27 bits_to_skip = 0; 28 29 gain_album_db = 0; 30 gain_album_peak_db = 0; 31 gain_title_db = 0; 32 gain_title_peak_db = 0; 27 33 } 28 34 … … 93 99 reader->GetPosition(&first_ap_pos, &avail); 94 100 95 reader->Seek(seek_table_position );101 reader->Seek(seek_table_position/8); 96 102 ret = packet.Load(reader); 97 103 ret = ReadSeekTable(&packet); … … 126 132 127 133 uint8 hdr[8*4]; 134 135 __int64 c, a; 136 reader->GetPosition(&c, &a); 128 137 ret = reader->Read(extradata + 4, 6*4); 129 138 if (ret < 0) return -1; // not enough data 130 memcpy(hdr, extradata+4, 5*4);131 139 extradata_size += 6*4; 140 reader->Seek(c); 141 ret = reader->ReadSwapped(hdr, 6*4); 132 142 Bitstream b(hdr); 133 143 134 b.NeedBits32 _MPC();135 audio_block_frames = (b.UGetBits(16)<<16) | b.UGetBits(16);136 137 b.NeedBits32 _MPC();144 b.NeedBits32(); 145 int audio_frames = (b.UGetBits(16)<<16) | b.UGetBits(16); 146 147 b.NeedBits32(); 138 148 b.UGetBits(1); // intensity stereo, should be 0 139 149 b.UGetBits(1); // mid-side … … 153 163 b.UGetBits(16); // max-level 154 164 155 b.NeedBits32_MPC(); 156 gain_title_db = b.SGetBits(16) / 100.0; // title gain 157 gain_title_peak_db = b.UGetBits(16); // title peak 158 159 b.NeedBits32_MPC(); 160 gain_album_db = b.SGetBits(16) / 100.0; // album gain 161 gain_album_peak_db = b.UGetBits(16); // album peak 162 163 164 165 b.NeedBits32_MPC(); 165 b.NeedBits32(); 166 gain_title_db = b.SGetBits(16) / 100.0; // title gain 167 int title_peak = b.UGetBits(16); 168 if (title_peak != 0) { 169 gain_title_peak_db = 20 * log10f((float)title_peak); // title peak 170 } else { 171 gain_title_peak_db = 0; 172 } 173 174 b.NeedBits32(); 175 gain_album_db = b.SGetBits(16) / 100.0; // album gain 176 int album_peak = b.UGetBits(16); 177 if (album_peak != 0) { 178 gain_album_peak_db = 20 * log10f((float)album_peak); // album peak 179 } else { 180 gain_album_peak_db = 0; 181 } 182 183 #define OLD_GAIN_REF 64.82 184 if (gain_title_db != 0) { 185 gain_title_db = OLD_GAIN_REF - gain_title_db; 186 } 187 if (gain_album_db != 0) { 188 gain_album_db = OLD_GAIN_REF - gain_album_db; 189 } 190 191 b.NeedBits32(); 166 192 true_gapless = b.UGetBits(1); // true gapless 167 193 int last_frame = b.UGetBits(11); // last-frame samples 168 total_samples = (audio_block_frames * 1152); 194 audio_block_frames = 1; 195 total_samples = (audio_frames * 1152); 169 196 if (true_gapless) { 170 197 total_samples -= (1152 - last_frame); … … 178 205 b.UGetBits(3); 179 206 180 b.NeedBits32 _MPC();207 b.NeedBits32(); 181 208 int ver = b.UGetBits(8); 182 209 … … 192 219 193 220 // alloc memory for seek table 194 seek_table = (uint 32*)malloc(tmp * sizeof(uint32));221 seek_table = (uint64*)malloc(tmp * sizeof(uint64)); 195 222 if (!seek_table) return -1; 196 223 197 224 int64 pos, av; 198 225 reader->GetPosition(&pos, &av); 199 seek_table[0] = pos*8 ; // current position in bits226 seek_table[0] = pos*8 - b.BitsLeft(); // current position in bits 200 227 seek_table_size = 1; 201 228 202 // TODO: loop through file to get complete seeking table 203 229 // loop through file to get complete seeking table 230 CMPCPacket packet; 231 int64 seek_frames = 0; 232 Seek(0); 233 do { 234 if (seek_frames*1152 >= total_samples) break; 235 236 // new entry in seeking table 237 if (seek_frames == (seek_table_size << seek_pwr)) { 238 __int64 c, a; 239 reader->GetPosition(&c, &a); 240 seek_table[seek_table_size] = (c*8) + bits_to_skip; 241 seek_table_size++; 242 } 243 244 ret = packet.Load_SV7(reader, bits_to_skip, true); 245 if (ret<0) break; 246 seek_frames += 1; 247 } while (true); 248 249 // seek to begin 250 Seek(0); 251 252 header_position = 0; 253 bits_to_skip = 0; 204 254 return 0; 205 255 } … … 261 311 Bitstream b(packet->payload); 262 312 263 seek_table_position = b.GetMpcSize() ;313 seek_table_position = b.GetMpcSize() * 8; 264 314 seek_table_position += packet->file_position; 265 315 … … 280 330 281 331 // alloc memory for seek table 282 seek_table = (uint 32*)malloc(tmp * sizeof(uint32));283 284 uint 32*table = seek_table;332 seek_table = (uint64*)malloc(tmp * sizeof(uint64)); 333 334 uint64 *table = seek_table; 285 335 286 336 tmp = b.GetMpcSize(); 287 table[0] = (uint32)(tmp + header_position) * 8;337 table[0] = (uint32)(tmp*8 + header_position); 288 338 if (seek_table_size == 1) return 0; 289 339 290 340 tmp = b.GetMpcSize(); 291 table[1] = (uint 32)(tmp + header_position) * 8;341 table[1] = (uint64)(tmp*8 + header_position); 292 342 for (int i=2; i<seek_table_size; i++) { 293 343 int code = b.Get_Golomb(12); … … 316 366 317 367 switch (stream_version) { 318 case 7:319 {320 //-----------------------------------------------------------------321 // Stream Version 7322 //-----------------------------------------------------------------323 324 // since we don't do any actual decoding here, we can only look325 // for the fields of our interest326 327 // TODO: later. now we want SV8328 329 }330 break;331 368 case 8: 332 369 { … … 361 398 362 399 // store absolute position of stream header 363 header_position = packet->file_position - 4;400 header_position = packet->file_position - 4*8; 364 401 } 365 402 break; … … 379 416 int ret; 380 417 418 // end of file ? 419 if (current_sample >= total_samples) return -2; 420 381 421 do { 382 ret = packet->Load(reader); 422 switch (stream_version) { 423 case 7: ret = packet->Load_SV7(reader, bits_to_skip); break; 424 case 8: ret = packet->Load(reader); break; 425 default: ret = -2; break; 426 } 383 427 if (ret < 0) { 384 428 return ret; 385 429 } 386 430 387 switch (packet->key) { 388 case MPC_KEY('A','P'): 389 { 390 // keep track of samples... 391 if (cur_sample) *cur_sample = current_sample; 392 current_sample += (1152*audio_block_frames); 393 394 return 0; // we got one 431 // keep track of samples... 432 if (cur_sample) *cur_sample = current_sample; 433 if (stream_version == 8) { 434 switch (packet->key) { 435 case MPC_KEY('A','P'): 436 { 437 current_sample += (1152*audio_block_frames); 438 return 0; // we got one 439 } 440 case MPC_KEY('S','E'): 441 { 442 return -2; 443 } 444 break; 395 445 } 396 case MPC_KEY('S','E'): 397 { 398 return -2; 399 } 400 break; 446 } else { 447 current_sample += (1152*audio_block_frames); 448 return 0; 401 449 } 402 450 … … 438 486 439 487 // seek to position 440 uint32 pos = seek_table[i] >> 3; 441 CString f; 442 f.Format(_T("CMPCFile::Seek : %d"), pos); 488 uint64 pos = seek_table[i] >> 3; 489 bits_to_skip = seek_table[i] & 0x07; 443 490 reader->Seek(pos); 444 491 … … 483 530 } 484 531 532 int CMPCPacket::Load_SV7(CMPCReader *reader, int &bits_to_skip, bool only_parse) 533 { 534 uint8 temp[14*1024]; 535 uint8 outtemp[14*1024]; 536 __int64 cur, av; 537 int t; 538 int total_bits; 539 540 Release(); 541 542 reader->GetPosition(&cur, &av); 543 int ret = reader->ReadSwapped(temp, min(sizeof(temp), (av-cur))); 544 if (ret < 0) return 0; 545 546 Bitstream b(temp); 547 Bitstream o(outtemp); 548 b.NeedBits32(); 549 550 // We load bits from input file and store it into our buffer. 551 // There they will always start at byte alignment so they can 552 // be transferred to decoder in a pleasant way. 553 554 // skip bits from previous frame 555 if (bits_to_skip > 0) { b.DumpBits(bits_to_skip); } 556 file_position = (cur*8) + bits_to_skip; 557 558 // 20-bit frame length 559 b.NeedBits24(); 560 int frame_len_bits = b.UGetBits(20); 561 o.PutBits(frame_len_bits, 20); 562 563 if (only_parse == false) { 564 // load data 565 int left_bits = frame_len_bits; 566 while (left_bits > 16) { 567 b.NeedBits(); 568 t = b.UGetBits(16); 569 o.PutBits(t, 16); 570 left_bits -= 16; 571 } 572 b.NeedBits(); 573 t = b.UGetBits(left_bits); 574 o.PutBits(t, left_bits); 575 576 // zero-align 32-bit word 577 total_bits = (20 + frame_len_bits + 31) &~ 31; 578 int zero_bits = total_bits - frame_len_bits; 579 o.PutBits(0, zero_bits); 580 o.WriteBits(); 581 } 582 583 // bits to skip in the next frame 584 __int64 finalpos = file_position + 20 + frame_len_bits; 585 bits_to_skip = (finalpos & 7); 586 reader->Seek(finalpos >> 3); 587 588 // copy data 589 if (only_parse == false) { 590 packet_size = total_bits >> 3; 591 payload_size = packet_size; 592 packet = (uint8*)malloc(packet_size); 593 payload = packet; // pointer to packet payload 594 595 // copy data 596 uint8 *src = outtemp; 597 uint8 *dst = packet; 598 int left = packet_size; 599 while (left > 3) { 600 dst[0] = src[3]; 601 dst[1] = src[2]; 602 dst[2] = src[1]; 603 dst[3] = src[0]; 604 src += 4; 605 dst += 4; 606 left-= 4; 607 } 608 } 609 610 return 0; 611 } 612 485 613 int CMPCPacket::Load(CMPCReader *reader) 486 614 { … … 493 621 494 622 // end of stream 495 if (file_position >= avail) { 496 return -2; 497 } 623 if (file_position >= avail) return -2; 624 file_position *= 8; 498 625 499 626 ret = reader->GetKey(key_val); 500 if (ret < 0) { 501 return ret; 502 } 627 if (ret < 0) return ret; 628 503 629 ret = reader->GetSizeElm(size_val, size_len); 504 if (ret < 0) { 505 return ret; 506 } 630 if (ret < 0) return ret; 507 631 508 632 // if the key is not valid, quit 509 if (!reader->KeyValid(key_val)) { 510 return -1; 511 } 633 if (!reader->KeyValid(key_val)) return -1; 512 634 key = key_val; 513 635 … … 519 641 520 642 // roll back the bytes 521 reader->Seek(file_position );643 reader->Seek(file_position/8); 522 644 ret = reader->Read(packet, packet_size); 523 if (ret < 0) { 524 return ret; 525 } 526 527 return 0; 528 } 529 530 645 if (ret < 0) return ret; 646 return 0; 647 } 648 649
Note: See TracChangeset
for help on using the changeset viewer.