int mp_get_aac_header(unsigned char *hdr, int bufsize, AAC_INFO *AacInfo) { int nRet = -1; BitData bf; int ii; memset((void *)AacInfo, 0, sizeof(AAC_INFO)); for (ii=0; ii<bufsize - 12; ii++) { // AAC Header if(!strncmp((char *)(hdr + ii), "ADIF", 4)) { // ADIF InitGetBits(&bf, &hdr[ii], bufsize - ii); nRet = get_adif_header(&bf, &(AacInfo->adifHeader)); if ( nRet == 0 ) return -1; AacInfo->nAACFormat = AAC_ADIF; AacInfo->nChannels = AacInfo->adifHeader.prog_config.nChannels; AacInfo->nSamplingFreq = SampleRate[AacInfo->adifHeader.prog_config.sampling_rate_idx]; AacInfo->nBitRate = (AacInfo->adifHeader.bitrate + 512) / 1024; nRet = 1; } else if( hdr[ii] == 0xFF && ( (unsigned char)(hdr[ii+1] & 0xF6) == (unsigned char)0xF0 ) ) { // ADTS // need 4 bytes InitGetBits(&bf, &hdr[ii], bufsize - ii); nRet = get_adts_header(&bf, &(AacInfo->adtsHeader)); if ( nRet == 0 ) return -1; AacInfo->nAACFormat = AAC_ADTS; AacInfo->nChannels = AacInfo->adtsHeader.channel_config; AacInfo->nSamplingFreq = SampleRate[AacInfo->adtsHeader.sampling_freq_idx]; nRet = 1; } if (nRet == 1) { nRet = ii; break; } } return nRet; }
//uac call-back static void audio_cb(unsigned char *buffer, unsigned int size, int format, uint64_t ts, void *user_data, audio_params_t *param) { audio_format_t fmt = (audio_format_t) format; unsigned char adtsHeader[7]; switch(fmt) { case AUD_FORMAT_AAC_RAW: //TBD if(fd_aud == NULL){ fd_aud = fopen("out.audio.aac", "w"); //calculate required sampling interval //(1024/sam_freq)*90 //90 is resampler freq sam_interval = (uint64_t)(((float)(1024*1000/SAMP_FREQ))*90); uint64_t percent = (uint64_t)(sam_interval*permissible_range)/100; upper_sam_interval = (uint64_t)(sam_interval + percent); lower_sam_interval = (uint64_t)(sam_interval - percent); printf("sam_interval %lld upper_limit %lld low_limit %lld\n", sam_interval,upper_sam_interval,lower_sam_interval); } if((((ts-prev_ts) > upper_sam_interval) || ((ts-prev_ts) < lower_sam_interval)) && (prev_ts)) printf("out of range: %lld, last ts %lld preset ts %lld\n",(ts-prev_ts),prev_ts, ts); prev_ts = ts; if(param->samplefreq != SAMP_FREQ) printf("Wrong sampling freq, expected %fhz received pkt with %dhz\n",SAMP_FREQ,param->samplefreq); get_adts_header(param, adtsHeader); fwrite(adtsHeader, ADTS_HEADER_LEN, 1, fd_aud); break; case AUD_FORMAT_PCM_RAW: if(fd_aud == NULL) fd_aud = fopen("out.audio.pcm", "w"); break; default: printf("Audio format not supported\n"); return; } fwrite(buffer, size, 1, fd_aud); }