📄 mp4auenc.c
字号:
/* numSample is for internal purposes only ... HP 970630 */ if (numSample !=frameNumSample) break; if (downsamplFac!=0 && lowpassFilt!=NULL){ firLowPass(sampleBuf[MONO_CHAN],tmpBuff, numSample, lowpassFilt ); subSampl(tmpBuff,sampleBuf[MONO_CHAN],downsamplFac,&numSample); } EncG729Frame(sampleBuf, startupFrame ? (BsBitBuffer*)NULL : bitBuf, startupFrame ? 0 : frameAvailNumBit, frameNumBit,frameMaxNumBit,numSample); break; case MODE_G723: /* I'd suggest just to use frameNumSample! */ /* numSample is for internal purposes only ... HP 970630 */ if (numSample !=frameNumSample) break; if (downsamplFac!=0 && lowpassFilt!=NULL){ firLowPass(sampleBuf[MONO_CHAN],tmpBuff, numSample, lowpassFilt ); subSampl(tmpBuff,sampleBuf[MONO_CHAN],downsamplFac,&numSample); } EncG723Frame(sampleBuf, startupFrame ? (BsBitBuffer*)NULL : bitBuf, startupFrame ? 0 : frameAvailNumBit, frameNumBit,frameMaxNumBit,numSample); break; case MODE_TF: EncTfFrame(sampleBuf, startupFrame ? (BsBitBuffer*)NULL : bitBuf, startupFrame ? 0 : frameAvailNumBit, frameNumBit,frameMaxNumBit,bitRateLong,fSampleLong, frameData, &tfData, &nttData); break; } if (!startupFrame) { usedNumBit = BsBufferNumBit(bitBuf); if (mainDebugLevel >= 5) printf("usedNumBit=%d\n",usedNumBit); /* write bit stream */ if (usedNumBit > frameAvailNumBit) CommonExit(1,"Encode: more bits used than available in frame+buffer"); if (BsPutBuffer(bitStream,bitBuf)) CommonExit(1,"Encode: error writing bit stream data"); frameAvailNumBit -= usedNumBit; if (frameData==NULL){ /* write padding bits */ padNumBit = 0; if (frameAvailNumBit-frameNumBit+frameMinNumBit > bitReservSize) { padNumBit = frameAvailNumBit-frameNumBit+ frameMinNumBit-bitReservSize; if (mainDebugLevel >= 5) printf("padNumBit=%d\n",padNumBit); for (i=0; i<padNumBit; i++) if (BsPutBit(bitStream,0,1)) CommonExit(1,"Encode: error writing bit stream padding bits"); frameAvailNumBit -= padNumBit; totPadNumBit += padNumBit; } } if (minUsedNumBit > usedNumBit) minUsedNumBit = usedNumBit; if (maxUsedNumBit < usedNumBit) maxUsedNumBit = usedNumBit; if (minPadNumBit > padNumBit) minPadNumBit = padNumBit; if (maxPadNumBit < padNumBit) maxPadNumBit = padNumBit; if (minReservNumBit > frameAvailNumBit) minReservNumBit = frameAvailNumBit; if (maxReservNumBit < frameAvailNumBit) maxReservNumBit = frameAvailNumBit; totReservNumBit += frameAvailNumBit; } frame++; } while (encNumSample < 0 || frame*(long)frameNumSample < encNumSample); if (mainDebugLevel == 1) fprintf(stderr," \n"); if (mainDebugLevel >= 2 && mainDebugLevel <= 3) printf(" \n"); totDataNumBit = BsCurrentBit(bitStream)-headerNumBit-totPadNumBit; if (mainDebugLevel >= 3) { printf("totNumFrame=%d\n",frame); printf("encNumSample=%ld (%.3f sec %.3f frames)\n", encNumSample,encNumSample/fSample, encNumSample/(float)frameNumSample); printf("totNumSample=%ld\n",totNumSample); printf("totNumBit=%ld\n",BsCurrentBit(bitStream)); printf("totDataNumBit=%ld (%.3f bit/frame %.3f bit/sec)\n", totDataNumBit,totDataNumBit/(float)frame, totDataNumBit/(float)frame*fSample/frameNumSample); printf("totPadNumBit=%ld\n",totPadNumBit); printf("lastPadNumBit=%d\n",frameAvailNumBit); printf("minUsedNumBit=%d\n",minUsedNumBit); printf("maxUsedNumBit=%d\n",maxUsedNumBit); printf("minPadNumBit=%d\n",minPadNumBit); printf("maxPadNumBit=%d\n",maxPadNumBit); printf("minReservNumBit=%d\n",minReservNumBit); printf("maxReservNumBit=%d\n",maxReservNumBit); printf("avgReservNumBit=%.1f\n",totReservNumBit/(float)frame); } /* free encoder memory */ switch (mode) { case MODE_PAR: EncParFree(); break; case MODE_HVXC: EncHvxcFree(); break; case MODE_LPC: EncLpcFree(); break; case MODE_TF: EncTfFree(); break; } /* close audio file */ AudioClose(audioFile); /* close bit stream file */ if (BsClose(bitStream)) CommonExit(1,"Encode: error closing bit stream file"); /* free buffers */ if (numChannel>1) for (ch=0; ch<numChannel; ch++) free(sampleBuf[ch]); free(sampleBuf); free(tmpBuff); BsFreeBuffer(bitBuf); return 0;}/* ---------- main ---------- */int main (int argc, char *argv[]){ char *progName = "<no program name>"; int result; char oriFileName[STRLEN],bitFileName[STRLEN]; char infoDate[STRLEN]; int i,j,len; int fileIdx; char *info,*infoTail; time_t curTime; /* evaluate command line */ CmdLineInit(0); result = CmdLineEval(argc,argv,paraList,switchList,1,&progName); if (result) { if (result==1) { printf("%s: %s\n",progName,PROGVER); CmdLineHelp(progName,paraList,switchList,stdout); EncParInfo(stdout); EncLpcInfo(stdout); EncTfInfo(stdout); EncG729Info(stdout); EncG723Info(stdout); exit (1); } else CommonExit(1,"command line error (\"-h\" for help)"); } if (mainDebugLevel == 1) fprintf(stderr,"%s: %s\n",progName,PROGVER); if (mainDebugLevel >= 2) { printf("%s: %s\n",progName,PROGVER); printf("CVS Id: %s\n",CVSID); printf("%s\n",EncParInfo(NULL)); printf("%s\n",EncLpcInfo(NULL)); printf("%s\n",EncTfInfo(NULL)); printf("%s\n",EncG723Info(NULL)); printf("%s\n",EncG729Info(NULL)); } CmdLineInit(cmdDebugLevel); /* calc variable default values */ if (!bitReservInitUsed) bitReservInit = bitReservSize; if (!regionDuratUsed) regionDurat = -1; if (!oriPathUsed) oriPath = getenv(MP4_ORI_PATH_ENV); if (!bitPathUsed) bitPath = getenv(MP4_BIT_PATH_ENV); if (!oriExtUsed) oriExt = getenv(MP4_ORI_FMT_ENV); if (oriExt==NULL) oriExt = MP4_ORI_EXT; /* check command line options */ if (bitRate <= 0) CommonExit(1,"bit rate <= 0"); if (bitReservSize < 0) CommonExit(1,"bit reservoir size < 0"); if (bitReservInit < 0) CommonExit(1,"bit reservoir initial bits < 0"); if (bitReservInit > bitReservSize) CommonExit(1,"bit reservoir initial bits > size"); if (regionDuratUsed && regionDurat < 0) CommonExit(1,"duration of region < 0"); if (outFileNameUsed && varArgIdx[0]>=0 && varArgIdx[1]>=0) CommonExit(1,"only one input file allowed when using -o"); if (varArgIdx[0]<0) CommonExit(1,"no input file specified"); if( strstr( encPara, "-aac_sca" ) ) { if (bitReservSize<6000) bitReservSize=6000 ; bitReservInit=0; varBitRate=1; } /* generate info string for bit stream */ len = 1; curTime = time((time_t*)NULL); len += strftime(infoDate,STRLEN,"%Y/%m/%d %H:%M:%S UTC",gmtime(&curTime)); len += strlen(PROGVER); j = 0; for (i=0; i<argc; i++) if (varArgIdx[j] == i) j++; else len += strlen(argv[i])+1; len += 2*STRLEN; len += 5*7+1; if ((info=(char*)malloc(len))==NULL) CommonExit(1,"memory allocation error"); strcpy(info,"\n"); strcat(info,"date: "); strcat(info,infoDate); strcat(info,"\n"); strcat(info,"prog: "); strcat(info,PROGVER); strcat(info,"\n"); strcat(info,"para:"); j = 0; for (i=0; i<argc; i++) { if (varArgIdx[j] == i) j++; else { strcat(info," "); strcat(info,argv[i]); } } strcat(info,"\n"); infoTail = info+strlen(info); /* process all files on command line */ fileIdx = 0; while (varArgIdx[fileIdx] >= 0) { /* compose file names */ if (ComposeFileName(argv[varArgIdx[fileIdx]],0,oriPath,oriExt,oriFileName, STRLEN)) CommonExit(1,"composed file name too long"); if (outFileNameUsed) { if (ComposeFileName(outFileName,0,bitPath,bitExt,bitFileName, STRLEN)) CommonExit(1,"composed file name too long"); } else if (ComposeFileName(argv[varArgIdx[fileIdx]],1,bitPath,bitExt, bitFileName,STRLEN)) CommonExit(1,"composed file name too long"); /* complete info string */ *infoTail = '\0'; strcat(infoTail,"ori: "); strcat(infoTail,oriFileName); strcat(infoTail,"\n"); strcat(infoTail,"bit: "); strcat(infoTail,bitFileName); strcat(infoTail,"\n"); /* encode file */ if (mainDebugLevel == 1) fprintf(stderr,"encoding %s -> %s\n",oriFileName,bitFileName); if (mainDebugLevel >= 2) printf("encoding %s -> %s\n",oriFileName,bitFileName); if (Encode(oriFileName,bitFileName,codecMode,bitRate,varBitRate, bitReservSize,bitReservInit,encPara, noInfo ? "" : info,noHeader,magicString, regionStart,regionDurat,numChannelOut,fSampleOut)) CommonWarning("error encoding audio file %s",oriFileName); fileIdx++; } CmdLineEvalFree(paraList); if (mainDebugLevel == 1) fprintf(stderr,"%s: finished\n",progName); if (mainDebugLevel >= 2) printf("%s: finished\n",progName); return 0;}/* end of mp4enc.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -