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