Mercurial > mplayer.hg
comparison dec_audio.c @ 5190:59df6b778d78
Beta AAC decoding support, seeking totally broken yet, add philipps mpeg4 video in qt to ffmpeg4 although it's still buggy in decoding
author | atmos4 |
---|---|
date | Mon, 18 Mar 2002 23:30:04 +0000 |
parents | 9841a86d66f9 |
children | 2ca5a9bfaa98 |
comparison
equal
deleted
inserted
replaced
5189:c663455448e8 | 5190:59df6b778d78 |
---|---|
79 settings */ | 79 settings */ |
80 vorbis_comment vc; /* struct that stores all the bitstream user comments */ | 80 vorbis_comment vc; /* struct that stores all the bitstream user comments */ |
81 vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ | 81 vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ |
82 vorbis_block vb; /* local working space for packet->PCM decode */ | 82 vorbis_block vb; /* local working space for packet->PCM decode */ |
83 } ov_struct_t; | 83 } ov_struct_t; |
84 #endif | |
85 | |
86 #ifdef HAVE_FAAD | |
87 #include <faad.h> | |
88 static faacDecHandle faac_hdec; | |
89 static faacDecFrameInfo faac_finfo; | |
90 static int faac_bytesconsumed = 0; | |
91 static unsigned char *faac_buffer; | |
92 /* configure maximum supported channels, * | |
93 * this is theoretically max. 64 chans */ | |
94 #define FAAD_MAX_CHANNELS 6 | |
95 #define FAAD_BUFFLEN (FAAD_MIN_STREAMSIZE*FAAD_MAX_CHANNELS) | |
84 #endif | 96 #endif |
85 | 97 |
86 #ifdef USE_LIBAVCODEC | 98 #ifdef USE_LIBAVCODEC |
87 #ifdef USE_LIBAVCODEC_SO | 99 #ifdef USE_LIBAVCODEC_SO |
88 #include <libffmpeg/avcodec.h> | 100 #include <libffmpeg/avcodec.h> |
386 /* OggVorbis audio via libvorbis, compatible with files created by nandub and zorannt codec */ | 398 /* OggVorbis audio via libvorbis, compatible with files created by nandub and zorannt codec */ |
387 // Is there always 1024 samples/frame ? ***** Albeu | 399 // Is there always 1024 samples/frame ? ***** Albeu |
388 sh_audio->audio_out_minsize=1024*4; // 1024 samples/frame | 400 sh_audio->audio_out_minsize=1024*4; // 1024 samples/frame |
389 #endif | 401 #endif |
390 break; | 402 break; |
403 case AFM_AAC: | |
404 // AAC (MPEG2 Audio, MPEG4 Audio) | |
405 #ifndef HAVE_FAAD | |
406 mp_msg(MSGT_DECAUDIO,MSGL_ERR,"Error: Cannot decode AAC data, because MPlayer was compiled without FAAD support\n"/*MSGTR_NoFAAD*/); | |
407 driver=0; | |
408 #else | |
409 mp_msg(MSGT_DECAUDIO,MSGL_V,"Using FAAD to decode AAC content!\n"/*MSGTR_UseFAAD*/); | |
410 // Samples per frame * channels per frame, this might not work with >2 chan AAC, need test samples! ::atmos | |
411 sh_audio->audio_out_minsize=2048*2; | |
412 #endif | |
413 break; | |
391 case AFM_PCM: | 414 case AFM_PCM: |
392 case AFM_DVDPCM: | 415 case AFM_DVDPCM: |
393 case AFM_ALAW: | 416 case AFM_ALAW: |
394 // PCM, aLaw | 417 // PCM, aLaw |
395 sh_audio->audio_out_minsize=2048; | 418 sh_audio->audio_out_minsize=2048; |
808 vorbis_synthesis_init(&ov->vd,&ov->vi); | 831 vorbis_synthesis_init(&ov->vd,&ov->vi); |
809 vorbis_block_init(&ov->vd,&ov->vb); | 832 vorbis_block_init(&ov->vd,&ov->vb); |
810 mp_msg(MSGT_DECAUDIO,MSGL_V,"OggVorbis: Init OK!\n"); | 833 mp_msg(MSGT_DECAUDIO,MSGL_V,"OggVorbis: Init OK!\n"); |
811 } break; | 834 } break; |
812 #endif | 835 #endif |
836 | |
837 #ifdef HAVE_FAAD | |
838 case AFM_AAC: { | |
839 unsigned long faac_samplerate, faac_channels; | |
840 faacDecConfigurationPtr faac_conf; | |
841 faac_hdec = faacDecOpen(); | |
842 | |
843 #if 0 | |
844 /* Set the default object type and samplerate */ | |
845 /* This is useful for RAW AAC files */ | |
846 faac_conf = faacDecGetCurrentConfiguration(faac_hdec); | |
847 if(sh_audio->samplerate) | |
848 faac_conf->defSampleRate = sh_audio->samplerate; | |
849 /* XXX: is outputFormat samplesize of compressed data or samplesize of | |
850 * decoded data, maybe upsampled? Also, FAAD support FLOAT output, | |
851 * how do we handle that (FAAD_FMT_FLOAT)? ::atmos | |
852 */ | |
853 if(sh_audio->samplesize) | |
854 switch(sh_audio->samplesize){ | |
855 case 1: // 8Bit | |
856 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"FAAD: 8Bit samplesize not supported by FAAD, assuming 16Bit!\n"); | |
857 default: | |
858 case 2: // 16Bit | |
859 faac_conf->outputFormat = FAAD_FMT_16BIT; | |
860 break; | |
861 case 3: // 24Bit | |
862 faac_conf->outputFormat = FAAD_FMT_24BIT; | |
863 break; | |
864 case 4: // 32Bit | |
865 faac_conf->outputFormat = FAAD_FMT_32BIT; | |
866 break; | |
867 } | |
868 faac_conf->defObjectType = LTP; // => MAIN, LC, SSR, LTP available. | |
869 | |
870 faacDecSetConfiguration(faac_hdec, faac_conf); | |
871 #endif | |
872 | |
873 if(faac_buffer == NULL) | |
874 faac_buffer = (unsigned char*)malloc(FAAD_BUFFLEN); | |
875 memset(faac_buffer, 0, FAAD_BUFFLEN); | |
876 demux_read_data(sh_audio->ds, faac_buffer, FAAD_BUFFLEN); | |
877 | |
878 /* init the codec */ | |
879 if((faac_bytesconsumed = faacDecInit(faac_hdec, faac_buffer, &faac_samplerate, &faac_channels)) < 0) { | |
880 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"FAAD: Failed to initialize the decoder!\n"); // XXX: deal with cleanup! | |
881 faacDecClose(faac_hdec); | |
882 free(faac_buffer); | |
883 faac_buffer = NULL; | |
884 driver = 0; | |
885 } else { | |
886 mp_msg(MSGT_DECAUDIO,MSGL_V,"FAAD: Decoder init done (%dBytes)!\n", faac_bytesconsumed); // XXX: remove or move to debug! | |
887 mp_msg(MSGT_DECAUDIO,MSGL_V,"FAAD: Negotiated samplerate: %dHz channels: %d\n", faac_samplerate, faac_channels); | |
888 sh_audio->channels = faac_channels; | |
889 sh_audio->samplerate = faac_samplerate; | |
890 sh_audio->i_bps = 128*1000/8; // XXX: HACK!!! There's currently no way to get bitrate from libfaad2! ::atmos | |
891 } | |
892 | |
893 } break; | |
894 #endif | |
895 | |
813 #ifdef USE_LIBMAD | 896 #ifdef USE_LIBMAD |
814 case AFM_MAD: | 897 case AFM_MAD: |
815 { | 898 { |
816 printf("%s %s %s (%s)\n", mad_version, mad_copyright, mad_author, mad_build); | 899 printf("%s %s %s (%s)\n", mad_version, mad_copyright, mad_author, mad_build); |
817 | 900 |
972 actually consumed */ | 1055 actually consumed */ |
973 } | 1056 } |
974 } | 1057 } |
975 } break; | 1058 } break; |
976 #endif | 1059 #endif |
1060 | |
1061 #ifdef HAVE_FAAD | |
1062 case AFM_AAC: { | |
1063 int /*i,*/ k, j = 0; | |
1064 void *faac_sample_buffer; | |
1065 | |
1066 len = 0; | |
1067 while(len < minlen) { | |
1068 /* update buffer */ | |
1069 if (faac_bytesconsumed > 0) { | |
1070 for (k = 0; k < (FAAD_BUFFLEN - faac_bytesconsumed); k++) | |
1071 faac_buffer[k] = faac_buffer[k + faac_bytesconsumed]; | |
1072 demux_read_data(sh_audio->ds, faac_buffer + (FAAD_BUFFLEN) - faac_bytesconsumed, faac_bytesconsumed); | |
1073 faac_bytesconsumed = 0; | |
1074 } | |
1075 /*for (i = 0; i < 16; i++) | |
1076 printf ("%02X ", faac_buffer[i]); | |
1077 printf ("\n");*/ | |
1078 do { | |
1079 faac_sample_buffer = faacDecDecode(faac_hdec, &faac_finfo, faac_buffer+j); | |
1080 /* update buffer index after faacDecDecode */ | |
1081 faac_bytesconsumed += faac_finfo.bytesconsumed; | |
1082 if(faac_finfo.error > 0) { | |
1083 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"FAAD: Trying to resync!\n"); | |
1084 j++; | |
1085 } else | |
1086 break; | |
1087 } while(j < FAAD_BUFFLEN); | |
1088 | |
1089 | |
1090 if(faac_finfo.error > 0) { | |
1091 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"FAAD: Failed to decode frame: %s \n", | |
1092 faacDecGetErrorMessage(faac_finfo.error)); | |
1093 } else if (faac_finfo.samples == 0) | |
1094 mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"FAAD: Decoded zero samples!\n"); | |
1095 else { | |
1096 mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"FAAD: Successfully decoded frame (%dBytes)!\n", faac_finfo.samples*faac_finfo.channels); | |
1097 memcpy(buf+len,faac_sample_buffer, faac_finfo.samples*faac_finfo.channels); | |
1098 len += faac_finfo.samples*faac_finfo.channels; | |
1099 } | |
1100 } | |
1101 | |
1102 } break; | |
1103 #endif | |
977 case AFM_PCM: // AVI PCM | 1104 case AFM_PCM: // AVI PCM |
978 len=demux_read_data(sh_audio->ds,buf,minlen); | 1105 len=demux_read_data(sh_audio->ds,buf,minlen); |
979 break; | 1106 break; |
980 case AFM_DVDPCM: // DVD PCM | 1107 case AFM_DVDPCM: // DVD PCM |
981 { int j; | 1108 { int j; |
1223 // if(verbose){ printf("Resyncing AC3 audio...");fflush(stdout);} | 1350 // if(verbose){ printf("Resyncing AC3 audio...");fflush(stdout);} |
1224 sh_audio->ac3_frame=ac3_decode_frame(); // resync | 1351 sh_audio->ac3_frame=ac3_decode_frame(); // resync |
1225 // if(verbose) printf(" OK!\n"); | 1352 // if(verbose) printf(" OK!\n"); |
1226 break; | 1353 break; |
1227 #endif | 1354 #endif |
1355 #ifdef HAVE_FAAD | |
1356 case AFM_AAC: | |
1357 //if(faac_buffer != NULL) | |
1358 faac_bytesconsumed = 0; | |
1359 memset(faac_buffer, 0, FAAD_BUFFLEN); | |
1360 //demux_read_data(sh_audio->ds, faac_buffer, FAAD_BUFFLEN); | |
1361 break; | |
1362 #endif | |
1228 case AFM_A52: | 1363 case AFM_A52: |
1229 case AFM_ACM: | 1364 case AFM_ACM: |
1230 case AFM_DSHOW: | 1365 case AFM_DSHOW: |
1231 case AFM_HWAC3: | 1366 case AFM_HWAC3: |
1232 sh_audio->a_in_buffer_len=0; // reset ACM/DShow audio buffer | 1367 sh_audio->a_in_buffer_len=0; // reset ACM/DShow audio buffer |