00001 #include "mpeg3private.h"
00002 #include "mpeg3protos.h"
00003
00004 #include <math.h>
00005 #include <stdlib.h>
00006
00007
00008
00009
00010 static pthread_mutex_t *decode_lock = 0;
00011
00012
00013 static void toc_error()
00014 {
00015 fprintf(stderr,
00016 "mpeg3audio: sample accurate seeking without a table of contents \n"
00017 "is no longer supported. Use mpeg3toc <mpeg file> <table of contents>\n"
00018 "to generate a table of contents and load the table of contents instead.\n");
00019 }
00020
00021
00022 static int rewind_audio(mpeg3audio_t *audio)
00023 {
00024 mpeg3_atrack_t *track = audio->track;
00025 if(track->sample_offsets)
00026 mpeg3demux_seek_byte(track->demuxer, track->sample_offsets[0]);
00027 else
00028 mpeg3demux_seek_byte(track->demuxer, 0);
00029 return 0;
00030 }
00031
00032
00033 static int read_header(mpeg3audio_t *audio)
00034 {
00035 int i;
00036 int try = 0;
00037 int got_it = 0;
00038 int result = 0;
00039 mpeg3_atrack_t *track = audio->track;
00040
00041
00042 switch(track->format)
00043 {
00044 case AUDIO_AC3:
00045 audio->packet_position = 8;
00046 result = mpeg3demux_read_data(track->demuxer,
00047 audio->packet_buffer + 1,
00048 7);
00049
00050
00051 do
00052 {
00053 try++;
00054 for(i = 0; i < 7; i++)
00055 audio->packet_buffer[i] = audio->packet_buffer[i + 1];
00056
00057 if(!result)
00058 {
00059 audio->packet_buffer[7] =
00060 mpeg3demux_read_char(track->demuxer);
00061 result = mpeg3demux_eof(track->demuxer);
00062 }
00063
00064
00065 if(!result)
00066 {
00067 got_it = (mpeg3_ac3_header(audio->ac3_decoder,
00068 audio->packet_buffer) != 0);
00069 }
00070 else
00071 break;
00072
00073
00074
00075
00076
00077
00078 }while(!result && !got_it && try < 0x10000);
00079
00080
00081 if(!result)
00082 {
00083 if(audio->ac3_decoder->channels > track->channels)
00084 track->channels = audio->ac3_decoder->channels;
00085 track->sample_rate = audio->ac3_decoder->samplerate;
00086 audio->framesize = audio->ac3_decoder->framesize;
00087 if(track->sample_rate <= 0) track->sample_rate = 48000;
00088
00089 }
00090 if(track->sample_rate <= 0) track->sample_rate = 48000;
00091 break;
00092
00093
00094
00095 case AUDIO_MPEG:
00096 audio->packet_position = 4;
00097
00098 if(audio->layer_decoder->layer == 1)
00099 {
00100 result = 1;
00101 }
00102
00103 result = mpeg3demux_read_data(track->demuxer,
00104 audio->packet_buffer + 1,
00105 3);
00106
00107 do
00108 {
00109 try++;
00110
00111 for(i = 0; i < 3; i++)
00112 audio->packet_buffer[i] = audio->packet_buffer[i + 1];
00113
00114 if(!result)
00115 {
00116 audio->packet_buffer[3] =
00117 mpeg3demux_read_char(track->demuxer);
00118 result = mpeg3demux_eof(track->demuxer);
00119 }
00120
00121 if(!result)
00122 {
00123 got_it = (mpeg3_layer_header(audio->layer_decoder,
00124 audio->packet_buffer) != 0);
00125
00126
00127
00128
00129
00130
00131
00132
00133 }
00134 }while(!result && !got_it && try < 0x10000);
00135
00136 if(!result)
00137 {
00138 if(audio->layer_decoder->channels > track->channels)
00139 track->channels = audio->layer_decoder->channels;
00140 track->sample_rate = audio->layer_decoder->samplerate;
00141 audio->framesize = audio->layer_decoder->framesize;
00142 }
00143
00144 break;
00145
00146 case AUDIO_PCM:
00147 audio->packet_position = PCM_HEADERSIZE;
00148 result = mpeg3demux_read_data(track->demuxer,
00149 audio->packet_buffer + 1,
00150 PCM_HEADERSIZE - 1);
00151
00152 do
00153 {
00154 try++;
00155
00156 for(i = 0; i < PCM_HEADERSIZE - 1; i++)
00157 audio->packet_buffer[i] = audio->packet_buffer[i + 1];
00158
00159 if(!result)
00160 {
00161 audio->packet_buffer[PCM_HEADERSIZE - 1] =
00162 mpeg3demux_read_char(track->demuxer);
00163 result = mpeg3demux_eof(track->demuxer);
00164 }
00165
00166 if(!result)
00167 {
00168 got_it = (mpeg3_pcm_header(audio->pcm_decoder,
00169 audio->packet_buffer) != 0);
00170 }
00171 }while(!result && !got_it && try < 0x10000);
00172
00173 if(!result)
00174 {
00175 if(audio->pcm_decoder->channels > track->channels)
00176 track->channels = audio->pcm_decoder->channels;
00177 track->sample_rate = audio->pcm_decoder->samplerate;
00178 audio->framesize = audio->pcm_decoder->framesize;
00179 }
00180 break;
00181 }
00182 return result;
00183 }
00184
00185
00186 static int delete_struct(mpeg3audio_t *audio)
00187 {
00188 int i;
00189 mpeg3_atrack_t *track = audio->track;
00190
00191 if(audio->output)
00192 {
00193 for(i = 0; i < track->channels; i++)
00194 free(audio->output[i]);
00195 free(audio->output);
00196 }
00197 if(audio->ac3_decoder) mpeg3_delete_ac3(audio->ac3_decoder);
00198 if(audio->layer_decoder) mpeg3_delete_layer(audio->layer_decoder);
00199 if(audio->pcm_decoder) mpeg3_delete_pcm(audio->pcm_decoder);
00200 free(audio);
00201 return 0;
00202 }
00203
00204
00205
00206
00207
00208 static int read_frame(mpeg3audio_t *audio, int render)
00209 {
00210 int result = 0;
00211 mpeg3_atrack_t *track = audio->track;
00212 mpeg3_t *file = audio->file;
00213 float **temp_output = 0;
00214 int samples = 0;
00215 int i;
00216 int old_channels = track->channels;
00217
00218
00219 if(track->format == AUDIO_AC3)
00220 {
00221 pthread_mutex_lock(decode_lock);
00222 }
00223
00224
00225 result = read_header(audio);
00226
00227
00228
00229 if(!result)
00230 {
00231 result = mpeg3demux_read_data(track->demuxer,
00232 audio->packet_buffer + audio->packet_position,
00233 audio->framesize - audio->packet_position);
00234 }
00235
00236
00237 if(old_channels < track->channels)
00238 {
00239 float **new_output = calloc(sizeof(float*), track->channels);
00240 for(i = 0; i < track->channels; i++)
00241 {
00242 new_output[i] = calloc(sizeof(float), audio->output_allocated);
00243 if(i < old_channels)
00244 memcpy(new_output[i],
00245 audio->output[i],
00246 sizeof(float) * audio->output_size);
00247 }
00248 for(i = 0; i < old_channels; i++)
00249 free(audio->output[i]);
00250 free(audio->output);
00251 audio->output = new_output;
00252 }
00253
00254
00255
00256 if(render)
00257 {
00258 temp_output = malloc(sizeof(float*) * track->channels);
00259 for(i = 0; i < track->channels; i++)
00260 {
00261 temp_output[i] = audio->output[i] + audio->output_size;
00262 }
00263 }
00264
00265
00266 if(!result)
00267 {
00268 switch(track->format)
00269 {
00270 case AUDIO_AC3:
00271 samples = mpeg3audio_doac3(audio->ac3_decoder,
00272 audio->packet_buffer,
00273 audio->framesize,
00274 temp_output,
00275 render);
00276
00277 break;
00278
00279 case AUDIO_MPEG:
00280 switch(audio->layer_decoder->layer)
00281 {
00282 case 2:
00283 samples = mpeg3audio_dolayer2(audio->layer_decoder,
00284 audio->packet_buffer,
00285 audio->framesize,
00286 temp_output,
00287 render);
00288
00289 break;
00290
00291 case 3:
00292 samples = mpeg3audio_dolayer3(audio->layer_decoder,
00293 audio->packet_buffer,
00294 audio->framesize,
00295 temp_output,
00296 render);
00297 break;
00298
00299 default:
00300 result = 1;
00301 break;
00302 }
00303 break;
00304
00305 case AUDIO_PCM:
00306 samples = mpeg3audio_dopcm(audio->pcm_decoder,
00307 audio->packet_buffer,
00308 audio->framesize,
00309 temp_output,
00310 render);
00311 break;
00312 }
00313 }
00314
00315
00316 audio->output_size += samples;
00317 if(render)
00318 {
00319 free(temp_output);
00320 }
00321
00322
00323 if(track->format == AUDIO_AC3)
00324 {
00325 pthread_mutex_unlock(decode_lock);
00326 }
00327
00328
00329
00330 if(!file->seekable)
00331 mpeg3demux_shift_data(track->demuxer, track->demuxer->data_position);
00332
00333 return samples;
00334 }
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346 static int get_length(mpeg3audio_t *audio)
00347 {
00348 int result = 0;
00349 mpeg3_t *file = audio->file;
00350 mpeg3_atrack_t *track = audio->track;
00351 int samples = 0;
00352
00353
00354 if(track->sample_offsets)
00355 {
00356 int try = 0;
00357
00358
00359 while(samples == 0)
00360 {
00361 samples = read_frame(audio, 0);
00362 }
00363
00364 result = track->total_samples;
00365 }
00366 else
00367
00368 if(!file->is_audio_stream)
00369 {
00370
00371
00372 while(samples == 0)
00373 {
00374 samples = read_frame(audio, 0);
00375 }
00376
00377
00378
00379 result = 0;
00380 }
00381 else
00382
00383 {
00384 long test_bytes = 0;
00385 long max_bytes = 0x40000;
00386 long test_samples = 0;
00387 int error = 0;
00388 int64_t total_bytes = mpeg3demux_movie_size(track->demuxer);
00389
00390 while(!error && test_bytes < max_bytes)
00391 {
00392 int samples = read_frame(audio, 0);
00393 if(!samples) error = 1;
00394 test_samples += samples;
00395 test_bytes += audio->framesize;
00396 }
00397 result = (long)(((double)total_bytes / test_bytes) * test_samples + 0.5);
00398 }
00399
00400 audio->output_size = 0;
00401 rewind_audio(audio);
00402
00403 return result;
00404 }
00405
00406
00407
00408
00409
00410 int calculate_format(mpeg3_t *file, mpeg3_atrack_t *track)
00411 {
00412 int result = 0;
00413
00414
00415
00416 if(track->format == AUDIO_UNKNOWN)
00417 {
00418 unsigned char header[8];
00419 if(!mpeg3demux_read_data(track->demuxer,
00420 header,
00421 8))
00422 {
00423
00424 if(!mpeg3_ac3_check(header))
00425 track->format = AUDIO_AC3;
00426 else
00427 track->format = AUDIO_MPEG;
00428 }
00429 else
00430 result = 1;
00431 }
00432
00433 return result;
00434 }
00435
00436
00437
00438
00439
00440 mpeg3audio_t* mpeg3audio_new(mpeg3_t *file,
00441 mpeg3_atrack_t *track,
00442 int format)
00443 {
00444 mpeg3audio_t *audio = calloc(1, sizeof(mpeg3audio_t));
00445 int result = 0;
00446 int i;
00447
00448 if(!decode_lock)
00449 {
00450 pthread_mutexattr_t attr;
00451 pthread_mutexattr_init(&attr);
00452 decode_lock = calloc(1, sizeof(pthread_mutex_t));
00453 pthread_mutex_init(decode_lock, &attr);
00454 }
00455
00456 audio->file = file;
00457 audio->track = track;
00458
00459 audio->byte_seek = -1;
00460 audio->sample_seek = -1;
00461 track->format = format;
00462
00463 if(file->seekable)
00464 if(calculate_format(file, track)) result = 1;
00465
00466
00467
00468 if(!result && file->seekable)
00469 {
00470 switch(track->format)
00471 {
00472 case AUDIO_AC3:
00473 audio->ac3_decoder = mpeg3_new_ac3();
00474 break;
00475 case AUDIO_MPEG:
00476 audio->layer_decoder = mpeg3_new_layer();
00477 break;
00478 case AUDIO_PCM:
00479 audio->pcm_decoder = mpeg3_new_pcm();
00480 break;
00481 }
00482
00483
00484
00485 rewind_audio(audio);
00486
00487
00488
00489
00490 result = read_header(audio);
00491
00492 }
00493
00494
00495
00496 if(!result && file->seekable)
00497 {
00498 audio->output = calloc(sizeof(float*), track->channels);
00499 audio->output_allocated = 4;
00500 for(i = 0; i < track->channels; i++)
00501 {
00502 audio->output[i] = calloc(sizeof(float), audio->output_allocated);
00503 }
00504 }
00505
00506
00507
00508 if(!result && file->seekable)
00509 {
00510 rewind_audio(audio);
00511 track->total_samples = get_length(audio);
00512 }
00513 else
00514 if(file->seekable)
00515 {
00516 delete_struct(audio);
00517 audio = 0;
00518 }
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528 return audio;
00529 }
00530
00531
00532
00533
00534
00535
00536
00537 static int seek(mpeg3audio_t *audio)
00538 {
00539 int result = 0;
00540 mpeg3_t *file = audio->file;
00541 mpeg3_atrack_t *track = audio->track;
00542 mpeg3_demuxer_t *demuxer = track->demuxer;
00543 int seeked = 0;
00544
00545
00546 if(!file->seekable) return 0;
00547
00548
00549 if(audio->sample_seek >= 0)
00550 {
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561 if(audio->sample_seek >= audio->output_position &&
00562 audio->sample_seek <= audio->output_position + audio->output_size)
00563 {
00564 ;
00565 }
00566 else
00567
00568 if(track->sample_offsets)
00569 {
00570 int index;
00571 int64_t byte;
00572
00573 index = audio->sample_seek / MPEG3_AUDIO_CHUNKSIZE;
00574 if(index >= track->total_sample_offsets) index = track->total_sample_offsets - 1;
00575 byte = track->sample_offsets[index];
00576
00577 mpeg3demux_seek_byte(demuxer, byte);
00578
00579 audio->output_position = index * MPEG3_AUDIO_CHUNKSIZE;
00580 audio->output_size = 0;
00581 seeked = 1;
00582 }
00583 else
00584 if(!file->is_audio_stream)
00585
00586 {
00587 toc_error();
00588
00589
00590
00591
00592 audio->output_position = audio->sample_seek;
00593 audio->output_size = 0;
00594 seeked = 1;
00595 }
00596 else
00597
00598 {
00599 int64_t byte = (int64_t)((double)audio->sample_seek /
00600 track->total_samples *
00601 mpeg3demux_movie_size(demuxer));
00602
00603
00604 mpeg3demux_seek_byte(demuxer, byte);
00605 audio->output_position = audio->sample_seek;
00606 audio->output_size = 0;
00607 seeked = 1;
00608 }
00609 }
00610 else
00611
00612 if(audio->byte_seek >= 0)
00613 {
00614 mpeg3demux_seek_byte(demuxer, audio->byte_seek);
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628 audio->output_position = 0;
00629 audio->output_size = 0;
00630 seeked = 1;
00631 }
00632
00633 if(seeked)
00634 {
00635 mpeg3demux_reset_pts(demuxer);
00636 switch(track->format)
00637 {
00638 case AUDIO_MPEG:
00639 mpeg3_layer_reset(audio->layer_decoder);
00640 break;
00641 }
00642 }
00643 audio->sample_seek = -1;
00644 audio->byte_seek = -1;
00645
00646 return 0;
00647 }
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664 int mpeg3audio_delete(mpeg3audio_t *audio)
00665 {
00666 delete_struct(audio);
00667 return 0;
00668 }
00669
00670 int mpeg3audio_seek_byte(mpeg3audio_t *audio, int64_t byte)
00671 {
00672 audio->byte_seek = byte;
00673 return 0;
00674 }
00675
00676 int mpeg3audio_seek_sample(mpeg3audio_t *audio, long sample)
00677 {
00678 mpeg3_atrack_t *track = audio->track;
00679
00680
00681 if(sample < 0) sample = 0;
00682 audio->sample_seek = sample;
00683 return 0;
00684 }
00685
00686
00687 int mpeg3audio_read_raw(mpeg3audio_t *audio,
00688 unsigned char *output,
00689 long *size,
00690 long max_size)
00691 {
00692 int result = 0;
00693 int i;
00694 mpeg3_atrack_t *track = audio->track;
00695 *size = 0;
00696
00697
00698 switch(track->format)
00699 {
00700 case AUDIO_AC3:
00701
00702 result = mpeg3demux_read_data(track->demuxer,
00703 output,
00704 0x800);
00705 *size = 0x800;
00706 break;
00707
00708 case AUDIO_MPEG:
00709
00710 if(!result)
00711 {
00712 if(mpeg3demux_read_data(track->demuxer,
00713 output,
00714 0x800))
00715 return 1;
00716
00717 *size += 0x800;
00718 }
00719 break;
00720
00721 case AUDIO_PCM:
00722
00723 if(mpeg3demux_read_data(track->demuxer,
00724 output,
00725 audio->framesize))
00726 return 1;
00727 *size = audio->framesize;
00728 break;
00729 }
00730 return result;
00731
00732
00733
00734
00735 #if 0
00736
00737 result = read_header(audio);
00738 switch(track->format)
00739 {
00740 case AUDIO_AC3:
00741
00742 result = mpeg3demux_read_data(track->demuxer,
00743 output,
00744 audio->framesize);
00745 *size = audio->framesize;
00746
00747 break;
00748
00749 case AUDIO_MPEG:
00750
00751 if(!result)
00752 {
00753 if(mpeg3demux_read_data(track->demuxer,
00754 output,
00755 audio->framesize))
00756 return 1;
00757
00758 *size += audio->framesize;
00759 }
00760 break;
00761
00762 case AUDIO_PCM:
00763 if(mpeg3demux_read_data(track->demuxer,
00764 output,
00765 audio->framesize))
00766 return 1;
00767 *size = audio->framesize;
00768 break;
00769 }
00770 return result;
00771 #endif
00772
00773 }
00774
00775 void mpeg3_shift_audio(mpeg3audio_t *audio, int diff)
00776 {
00777 int i, j, k;
00778 mpeg3_atrack_t *track = audio->track;
00779
00780 for(k = 0; k < track->channels; k++)
00781 {
00782 for(i = 0, j = diff; j < audio->output_size; i++, j++)
00783 {
00784 audio->output[k][i] = audio->output[k][j];
00785 }
00786 }
00787 audio->output_size -= diff;
00788 audio->output_position += diff;
00789 }
00790
00791
00792
00793
00794 int mpeg3audio_decode_audio(mpeg3audio_t *audio,
00795 float *output_f,
00796 short *output_i,
00797 int channel,
00798 int len)
00799 {
00800 mpeg3_t *file = audio->file;
00801 mpeg3_atrack_t *track = audio->track;
00802 int i, j, k;
00803 int try = 0;
00804
00805 int render = 1;
00806 long new_size;
00807
00808
00809
00810 if(!file->seekable &&
00811 track->demuxer->data_size < MPEG3_AUDIO_STREAM_SIZE) return 1;
00812
00813
00814
00815 if(track->format == AUDIO_UNKNOWN)
00816 if(calculate_format(file, track)) return 1;
00817
00818 if(track->format == AUDIO_AC3 && !audio->ac3_decoder)
00819 audio->ac3_decoder = mpeg3_new_ac3();
00820 else
00821 if(track->format == AUDIO_MPEG && !audio->layer_decoder)
00822 audio->layer_decoder = mpeg3_new_layer();
00823 else
00824 if(track->format == AUDIO_PCM && !audio->pcm_decoder)
00825 audio->pcm_decoder = mpeg3_new_pcm();
00826
00827
00828
00829
00830 seek(audio);
00831
00832 new_size = track->current_position +
00833 len +
00834 MAXFRAMESAMPLES -
00835 audio->output_position;
00836
00837
00838 if(new_size > audio->output_allocated)
00839 {
00840
00841 for(i = 0; i < track->channels; i++)
00842 {
00843 float *new_output;
00844 new_output = calloc(sizeof(float), new_size);
00845 memcpy(new_output, audio->output[i], sizeof(float) * audio->output_size);
00846 free(audio->output[i]);
00847 audio->output[i] = new_output;
00848 }
00849 audio->output_allocated = new_size;
00850 }
00851
00852
00853
00854 while(1)
00855 {
00856 if(audio->output_position + audio->output_size >=
00857 track->current_position + len ||
00858 try >= 256 ||
00859 mpeg3demux_eof(track->demuxer)) break;
00860
00861
00862
00863 if(!file->seekable &&
00864 track->demuxer->data_size <
00865 MPEG3_AUDIO_STREAM_SIZE) break;
00866
00867 int samples = read_frame(audio, render);
00868
00869 if(!samples)
00870 try++;
00871 else
00872 try = 0;
00873 }
00874
00875
00876
00877
00878
00879 if(channel >= track->channels) channel = track->channels - 1;
00880
00881 if(output_f)
00882 {
00883 for(i = 0, j = track->current_position - audio->output_position;
00884 i < len && j < audio->output_size;
00885 i++, j++)
00886 {
00887 output_f[i] = audio->output[channel][j];
00888 }
00889 for( ; i < len; i++)
00890 {
00891 output_f[i] = 0;
00892 }
00893 }
00894 else
00895 if(output_i)
00896 {
00897 int sample;
00898 for(i = 0, j = track->current_position - audio->output_position;
00899 i < len && j < audio->output_size;
00900 i++, j++)
00901 {
00902 sample = (int)(audio->output[channel][j] * 32767);
00903 if(sample > 32767) sample = 32767;
00904 else
00905 if(sample < -32768) sample = -32768;
00906
00907 output_i[i] = sample;
00908 }
00909 for( ; i < len; i++)
00910 {
00911 output_i[i] = 0;
00912 }
00913 }
00914
00915
00916
00917
00918 if(audio->output_size > MPEG3_AUDIO_HISTORY)
00919 {
00920 int diff = audio->output_size - MPEG3_AUDIO_HISTORY;
00921 mpeg3_shift_audio(audio, diff);
00922 }
00923
00924
00925
00926 if(audio->output_size > 0)
00927 return 0;
00928 else
00929 return 1;
00930 }
00931
00932
00933
00934
00935
00936