⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cfaac.cpp

📁 mpeg4 video codec mpeg4 video codec
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// *********************************************************************************************//									Main functions// *********************************************************************************************void Cfaac::DisplayError(char *ProcName, char *str){char buf[100]="";	if(str && *str)	{		if(ProcName && *ProcName)			sprintf(buf,"%s: ", ProcName);		strcat(buf,str);		MessageBox(0, buf, APP_NAME " plugin", MB_OK|MB_ICONSTOP);	}MYOUTPUT *mo;	GLOBALLOCK(mo,hOutput,MYOUTPUT,return);	mo->bytes_into_buffer=-1;	GlobalUnlock(hOutput);	GlobalUnlock(hOutput);}// *********************************************************************************************HANDLE Cfaac::Init(LPSTR lpstrFilename,long lSamprate,WORD wBitsPerSample,WORD wChannels,long FileSize){MYOUTPUT	*mo;CMyEncCfg	cfg(false);DWORD		samplesInput,			maxBytesOutput;//	if(wBitsPerSample!=8 && wBitsPerSample!=16) // 32 bit audio from cooledit is in unsupported format//		return 0;	if(wChannels>48)	// FAAC supports max 48 tracks!		return NULL;	GLOBALLOCK(mo,hOutput,MYOUTPUT,return NULL);	// open the encoder library	if(!(mo->hEncoder=faacEncOpen(lSamprate, wChannels, &samplesInput, &maxBytesOutput)))		return ERROR_Init("Can't open library");	if(!(mo->bitbuf=(unsigned char *)malloc(maxBytesOutput*sizeof(unsigned char))))		return ERROR_Init("Memory allocation error: output buffer");	if(!(mo->bufIn=(BYTE *)malloc(samplesInput*sizeof(int32_t))))		return ERROR_Init("Memory allocation error: input buffer");	if(!(mo->buf32bit=(int32_t *)malloc(samplesInput*sizeof(int32_t))))		return ERROR_Init("Memory allocation error: 32 bit buffer");	if(cfg.SaveMP4)// || cfg.Tag.On)		if(!strcmpi(lpstrFilename+lstrlen(lpstrFilename)-4,".aac"))		{			strcpy(lpstrFilename+lstrlen(lpstrFilename)-4,".mp4");		FILE *f=fopen(lpstrFilename,"rb");			if(f)			{			char buf[MAX_PATH+20];				sprintf(buf,"Overwrite \"%s\" ?",lpstrFilename);				fclose(f);				if(MessageBox(NULL,buf,"File already exists!",MB_YESNO|MB_ICONQUESTION)==IDNO)					return ERROR_Init(0);//"User abort");			}		}		else			if(strcmpi(lpstrFilename+lstrlen(lpstrFilename)-4,".mp4"))				strcat(lpstrFilename,".mp4");	mo->WriteMP4=	!strcmpi(lpstrFilename+lstrlen(lpstrFilename)-4,".mp4") ||					!strcmpi(lpstrFilename+lstrlen(lpstrFilename)-4,".m4a");faacEncConfigurationPtr CurFormat=faacEncGetCurrentConfiguration(mo->hEncoder);	CurFormat->inputFormat=FAAC_INPUT_32BIT;/*	switch(wBitsPerSample)	{	case 16:		CurFormat->inputFormat=FAAC_INPUT_16BIT;		break;	case 24:		CurFormat->inputFormat=FAAC_INPUT_24BIT;		break;	case 32:		CurFormat->inputFormat=FAAC_INPUT_32BIT;		break;	default:		CurFormat->inputFormat=FAAC_INPUT_NULL;		break;	}*/	if(!cfg.AutoCfg)	{	faacEncConfigurationPtr myFormat=&cfg.EncCfg;		if(cfg.UseQuality)		{			CurFormat->quantqual=myFormat->quantqual;			CurFormat->bitRate=0;//myFormat->bitRate;		}		else		{			CurFormat->bitRate=myFormat->bitRate*1000;			CurFormat->quantqual=100;		}		switch(CurFormat->bandWidth)		{		case 0: // Auto			break;		case 0xffffffff: // Full			CurFormat->bandWidth=lSamprate/2;			break;		default:			CurFormat->bandWidth=myFormat->bandWidth;			break;		}		CurFormat->mpegVersion=myFormat->mpegVersion;		CurFormat->outputFormat=myFormat->outputFormat;		CurFormat->mpegVersion=myFormat->mpegVersion;		CurFormat->aacObjectType=myFormat->aacObjectType;		CurFormat->allowMidside=myFormat->allowMidside;		CurFormat->useTns=myFormat->useTns;	}	else	{		CurFormat->mpegVersion=DEF_MPEGVER;		CurFormat->aacObjectType=DEF_PROFILE;		CurFormat->allowMidside=DEF_MIDSIDE;		CurFormat->useTns=DEF_TNS;		CurFormat->useLfe=DEF_LFE;		CurFormat->quantqual=DEF_QUALITY;		CurFormat->bitRate=DEF_BITRATE;		CurFormat->bandWidth=DEF_BANDWIDTH;		CurFormat->outputFormat=DEF_HEADER;	}	if(mo->WriteMP4)		CurFormat->outputFormat=RAW;	CurFormat->useLfe=wChannels>=6 ? 1 : 0;	if(!faacEncSetConfiguration(mo->hEncoder, CurFormat))		return ERROR_Init("Unsupported parameters!");//	mo->src_size=lSize;//	mi->dst_name=strdup(lpstrFilename);	mo->Samprate=lSamprate;	mo->BitsPerSample=wBitsPerSample;	mo->Channels=wChannels;	mo->samplesInput=samplesInput;	mo->samplesInputSize=samplesInput*(mo->BitsPerSample>>3);	mo->maxBytesOutput=maxBytesOutput;    if(mo->WriteMP4) // Create MP4 file --------------------------------------------------------------------------	{    BYTE *ASC=0;    DWORD ASCLength=0;        if((mo->MP4File=MP4Create(lpstrFilename, 0, 0, 0))==MP4_INVALID_FILE_HANDLE)			return ERROR_Init("Can't create file");        MP4SetTimeScale(mo->MP4File, 90000);        mo->MP4track=MP4AddAudioTrack(mo->MP4File, lSamprate, MP4_INVALID_DURATION, MP4_MPEG4_AUDIO_TYPE);        MP4SetAudioProfileLevel(mo->MP4File, 0x0F);        faacEncGetDecoderSpecificInfo(mo->hEncoder, &ASC, &ASCLength);        MP4SetTrackESConfiguration(mo->MP4File, mo->MP4track, (unsigned __int8 *)ASC, ASCLength);		mo->frameSize=samplesInput/wChannels;		mo->ofs=mo->frameSize;		if(cfg.TagOn)			cfg.Tag.WriteMP4Tag(mo->MP4File);	}	else // Create AAC file -----------------------------------------------------------------------------	{		// open the aac output file 		if(!(mo->aacFile=fopen(lpstrFilename, "wb")))			return ERROR_Init("Can't create file");		// use bufferized stream		setvbuf(mo->aacFile,NULL,_IOFBF,32767);		mo->Filename=strdup(lpstrFilename);	}	showInfo(mo);	GlobalUnlock(hOutput);    return hOutput;}// *********************************************************************************************int Cfaac::processData(HANDLE hOutput, BYTE *bufIn, DWORD len){	if(!hOutput)		return -1;int bytesWritten=0;int bytesEncoded;MYOUTPUT far *mo;	GLOBALLOCK(mo,hOutput,MYOUTPUT,return 0);int32_t *buf=mo->buf32bit;	if((int)len<mo->samplesInputSize)	{		mo->samplesInput=(len<<3)/mo->BitsPerSample;		mo->samplesInputSize=mo->samplesInput*(mo->BitsPerSample>>3);	}//	if(mo->BitsPerSample==8 || mo->BitsPerSample==32)		To32bit(buf,bufIn,mo->samplesInput,mo->BitsPerSample>>3,false);	// call the actual encoding routine	if((bytesEncoded=faacEncEncode(mo->hEncoder, (int32_t *)buf, mo->samplesInput, mo->bitbuf, mo->maxBytesOutput))<0)		return ERROR_processData("faacEncEncode()");	// write bitstream to aac file 	if(mo->aacFile)	{		if(bytesEncoded>0)		{			if((bytesWritten=fwrite(mo->bitbuf, 1, bytesEncoded, mo->aacFile))!=bytesEncoded)				return ERROR_processData("Write failed!");			mo->WrittenSamples=1; // needed into destructor		}	}	else	// write bitstream to mp4 file	{	MP4Duration dur,				SamplesLeft;		if(len>0)		{			mo->srcSize+=len;			dur=mo->frameSize;		}		else		{			mo->TotalSamples=(mo->srcSize<<3)/(mo->BitsPerSample*mo->Channels);			SamplesLeft=(mo->TotalSamples-mo->WrittenSamples)+mo->frameSize;			dur=SamplesLeft>mo->frameSize ? mo->frameSize : SamplesLeft;		}		if(bytesEncoded>0)		{			if(!(bytesWritten=MP4WriteSample(mo->MP4File, mo->MP4track, (unsigned __int8 *)mo->bitbuf, (DWORD)bytesEncoded, dur, mo->ofs, true) ? bytesEncoded : -1))				return ERROR_processData("MP4WriteSample()");			mo->ofs=0;			mo->WrittenSamples+=dur;		}	}	showProgress(mo);	GlobalUnlock(hOutput);	return bytesWritten;}// -----------------------------------------------------------------------------------------------int Cfaac::processDataBufferized(HANDLE hOutput, BYTE *bufIn, long lBytes){	if(!hOutput)		return -1;	int	bytesWritten=0, tot=0;	MYOUTPUT far *mo;	GLOBALLOCK(mo,hOutput,MYOUTPUT,return 0);	if(mo->bytes_into_buffer>=0)		do		{			if(mo->bytes_into_buffer+lBytes<mo->samplesInputSize)			{				memmove(mo->bufIn+mo->bytes_into_buffer, bufIn, lBytes);				mo->bytes_into_buffer+=lBytes;				lBytes=0;			}			else			{				int	shift=mo->samplesInputSize-mo->bytes_into_buffer;				memmove(mo->bufIn+mo->bytes_into_buffer, bufIn, shift);				mo->bytes_into_buffer+=shift;				bufIn+=shift;				lBytes-=shift;				tot+=bytesWritten=processData(hOutput,mo->bufIn,mo->bytes_into_buffer);				if(bytesWritten<0)					return ERROR_processData(0);				mo->bytes_into_buffer=0;			}		}while(lBytes);		GlobalUnlock(hOutput);		return tot;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -