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

📄 al576ctl.cpp

📁 Averlogic AL576芯片MPEG4压缩示例源程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "AL242.h"
#include "PlayDMO.h"
#include "PlayDMODlg.h"
#include "ProgressBox.h"

extern int m_contrast;
extern int m_brightness;
extern int m_saturation;
extern int m_hue;
CProgressBox* ProgressBox; 

#define VideoLocation 0x00000
#define AudioLocation 0x20000
#define ParaLocation  0x800000 - 0x1000

ULONG Set_AL242_1C60[] = {
 0x2afeff01,0x2a000001,0x2a010101,0x2a024e01,0x2a030001,0x2a04dd01,0x2a053201,0x2a060a01,0x2a072001,0x2a088001
,0x2a094001,0x2a0a8001,0x2a0b2001,0x2a0c8a01,0x2a0d0701,0x2a0ee001,0x2a0f2c01,0x2a100a01,0x2a119901,0x2a121001
,0x2a13b401,0x2a148001,0x2a152001,0x2a167401,0x2a170b01,0x2a182d01,0x2a19d101,0x2a1a7401,0x2a1b5d01,0x2a1c2b01
,0x2a1d3301,0x2a1e3301,0x2a1f3301,0x2a203e01,0x2a213e01,0x2a220001,0x2a238001,0x2a24e001,0x2a25e001,0x2a262d01
,0x2a275001,0x2a28e001,0x2a29e001,0x2a2ad601,0x2a2b4e01,0x2a2c3201,0x2a2d4501,0x2a2e8201,0x2a2f5001,0x2a302201
,0x2a316101,0x2a327001,0x2a330e01,0x2a346e01,0x2a359001,0x2a367001,0x2a370e01,0x2a384001,0x2a390a01,0x2a3a0e01
,0x2a3b0001,0x2a3c0001,0x2a3d0001,0x2a3e0001,0x2a3f0001,0x2a400501,0x2a41e701,0x2a429601,0x2a430001,0x2a440001
,0x2a450001,0x2a460001,0x2a470001,0x2a480001,0x2a490001,0x2a4a0001,0x2a4b0001,0x2a4c0001,0x2a4d0001,0x2a4e0001
,0x2a4f0001,0x2a500001,0x2a510001,0x2a520001,0x2a530001,0x2a540001,0x2a550001,0x2a560001,0x2a574401,0x2a580401
,0x2a591b01,0x2a5a0001,0x2a5b1201,0x2a5cdb01,0x2a5d1501,0x2a5e9a01,0x2a5fbe01,0x2a60b401,0x2a617c01,0x2a620001
,0x2a630001,0x2a643c01,0x2a650001,0x2a666401,0x2a676401,0x2a685a01,0x2a690101,0x2a6a4001,0x2a6b0101,0x2a6c0401
,0x2a6d0001,0x2a6e0001,0x2a6f0001,0x2a702b01,0x2a713001,0x2a722701,0x2a733301,0x2a742d01,0x2a75d001,0x2a761901
,0x2a774901,0x2a780401,0x2a790001,0x2a7a6501,0x2a7b0001,0x2a7cb701,0x2a7dfe01,0x2a7ee001,0x2a7f0001,0x2a800401
,0x2a81e001,0x2a824201,0x2a836f01,0x2a840701,0x2a852001,0x2a860301,0x2a871001,0x2a88e001,0x2a89e001,0x2a8a0a01
,0x2a8b0101,0x2a8ce001,0x2a8d0a01,0x2a8ec801,0x2a8fb901,0x2a90e001,0x2a91e001,0x2a92e001,0x2a93e001,0x2a94e001
,0x2a95e001,0x2a96e001,0x2a97e001,0x2a98e001,0x2a99e001,0x2a9ae001,0x2a9be001,0x2a9ce001,0x2a9de001,0x2a9ee001
,0x2a9fe001,0x2aa0e001,0x2aa1e001,0x2aa2e001,0x2aa3e001,0x2aa4e001,0x2aa5e001,0x2aa6e001,0x2aa7e001,0x2aa8e001
,0x2aa9e001,0x2aaae001,0x2aabe001,0x2aace001,0x2aade001,0x2aaee001,0x2aafe001,0x2ab04201,0x2ab19001,0x2ab20201
,0x2ab30301,0x2ab40401,0x2ab50701,0x2ab60801,0x2ab70101,0x2ab80001,0x2ab92201,0x2aba1801,0x2abb3501,0x2abc2b01
,0x2abd8e01,0x2abe3801,0x2abf0301,0x2ac0d401,0x2ac11b01,0x2ac24001,0x2ac3c001,0x2ac40701,0x2ac51001,0x2ac6e001
,0x2ac7e001,0x2ac85101,0x2ac93101,0x2aca2601,0x2acbea01,0x2acc1001,0x2acdc801,0x2ace5001,0x2acf2001,0x2ad0ff01
,0x2ad1e001,0x2ad21001,0x2ad3fc01,0x2ad43c01,0x2ad50001,0x2ad6e001,0x2ad7e001,0x2ad8e001,0x2ad9e001,0x2adae001
,0x2adbe001,0x2adce001,0x2adde001,0x2adee001,0x2adfe001,0x2ae0e001,0x2ae1e001,0x2ae2e001,0x2ae3e001,0x2ae4e001
,0x2ae5e001,0x2ae6e001,0x2ae7e001,0x2ae8e001,0x2ae9e001,0x2aeae001,0x2aebe001,0x2aece001,0x2aede001,0x2aeee001
,0x2aefe001,0x2af0e001,0x2af1e001,0x2af2e001,0x2af3e001,0x2af4e001,0x2af5e001,0x2af6e001,0x2af7e001,0x2af8e001
,0x2af9e001,0x2afae001,0x2afbe001,0x2afce001,0x2afde001,0x2affe001
};

void CPlayDMODlg::AL576_DownLoad_Firmware(HANDLE hAL576, char *VideoFile,char *AudioFile, char *ParaFile,CProgressBox* ProgressBox)
{

	AL576_HCIWrite(hAL576,0xd,0x0);
	Sleep(100);

	AL576_RegWrite(hAL576,0x1cf4,0x9);
	Sleep(100);

	AL576_RegWrite(hAL576,0x1CD0,0x18);
	Sleep(100);

	AL576_RegWrite(hAL576,0x1CE4,0x140041);
	Sleep(100);

	AL576_RegWrite(hAL576,0x1CE4,0x100d15c5);//141 
	Sleep(100);

	DownloadFile(hAL576, VideoFile,VideoLocation);
	Sleep(100);
	ProgressBox->SetPos(30);
	ProgressBox->StepIt();

	DownloadFile(hAL576, AudioFile,AudioLocation);
	Sleep(100);
	ProgressBox->SetPos(50);
	ProgressBox->StepIt();

	DownLoadParameterFile(hAL576, ParaFile,ParaLocation);
}

void CPlayDMODlg::DownloadFile(HANDLE hAL576, char *FileName, int location)
{
	union{
		int buffer;
		struct {
			char Buf0;
			char Buf1;
			char Buf2;
			char Buf3;
			}Byte;
		}HaxiData;

	char buffer[4];

	FILE *fptr;
	UINT file_checksum,asic_checksum;
	UINT size,addr;
 
	addr = location;
		
	fptr=fopen(FileName,"rb");

	if ( fptr == NULL )
	{
		MessageBox("Failed to Open Firmeware File","ERROR",MB_OK);
		fclose(fptr);
		return;
	}
	else
	{
		file_checksum = asic_checksum = 0;
		size = 0;

		while( !feof( fptr ) )
		{
			/* Attempt to read in 10 bytes: */
			fread( buffer, sizeof( char ), 4 , fptr );  //read 4 bytes everytime
			if( ferror( fptr ) ){
				MessageBox("Failed to Read Firmware File","ERROR",MB_OK);
				break;
			}

			/* Total up actual bytes read */
			HaxiData.Byte.Buf0=buffer[3];
			HaxiData.Byte.Buf1=buffer[2];
			HaxiData.Byte.Buf2=buffer[1];
			HaxiData.Byte.Buf3=buffer[0];
			AL576_MemWrite(hAL576,location,HaxiData.buffer);
			file_checksum += (UINT) HaxiData.buffer;
			size++;
			location += 4;			
		}

		while(size--)
		{
			asic_checksum += (UINT) AL576_MemRead(hAL576,addr);
			addr += 4;
		}

		if(file_checksum != asic_checksum)
			MessageBox("Failed to Download Firmware File,Please Close AP and Reset EVB!","ERROR",MB_OK | MB_ICONERROR);

		fclose(fptr);
	}
}

void CPlayDMODlg::DownLoadParameterFile(HANDLE hAL576,char *FileName,UINT addr)
{
	union{
		int buffer;
		struct {
			char Buf0;
			char Buf1;
			char Buf2;
			char Buf3;
			}Byte;
		}HaxiData;


	FILE *fp;
	UINT file_checksum,asic_checksum;
	UINT size;

	fp = fopen(FileName,"r");

	if(fp == NULL){
		MessageBox("Failed to Open Parameter File","ERROR",MB_OK);
		fclose(fp);
		return;
	}

	file_checksum = asic_checksum = 0;
	size = 0;
	
	fseek(fp,0,SEEK_SET);

	while(!feof( fp ))
	{
		fscanf(fp,"%x",&HaxiData.buffer);
		if(HaxiData.buffer == 0xffffffff)
			break;
		AL576_MemWrite(hAL576,addr,HaxiData.buffer);
		file_checksum += (UINT) HaxiData.buffer;
		addr += 4;
		size++;
	}

	addr = 0x7ff000;

	while(size--)
	{
		asic_checksum += (UINT) AL576_MemRead(hAL576,addr);
		addr += 4;
	}

	if(file_checksum != asic_checksum)
		MessageBox("Failed to Download Parameter File,Please Close AP and Reset EVB!","ERROR",MB_OK | MB_ICONERROR);
	
	fclose(fp);
}

void CPlayDMODlg::Set_AL242(HANDLE hAL576)
{
	AL576_HCIWrite(hAL576, 0xD,0x0);
	Sleep(50);

	AL576_RegWrite(hAL576, 0x1c64,0x10);
	Sleep(50);

	for(int i = 0; i <= 255; i++)
	{
		AL576_RegWrite(hAL576, 0x1c60, Set_AL242_1C60[i]);
		Sleep(50);
	}

}

void CPlayDMODlg::StartEncoder(HANDLE hAL576)
{
	//AL576_HCIWrite(hAL576, 0xD, 0x0);
	//Sleep(100);

	//AL576_RegWrite(hAL576,0x1c70,0x1);
	//Sleep(100);
	//AL576_RegWrite(hAL576,0x1c70,0x0);
	//Sleep(100);
	//AL576_RegWrite(hAL576, 0x1c64,0x10);
	//Sleep(100);

	//AL576_HCIWrite(hAL576, 0xD,0x1);
	//Sleep(100);

	AL576_MemWrite(hAL576, 0x80,0x10000);
	Sleep(50);

	AL576_MemWrite(hAL576, 0x84,0x2);
	Sleep(50);

	AL576_RegWrite(hAL576, 0x1C74,0x1);
	Sleep(50);
}

void CPlayDMODlg::Halt(HANDLE hAL576)
{
	AL576_MemWrite(hAL576,0x80,0x20000);
	Sleep(50);
	AL576_MemWrite(hAL576,0x84,0x0);
	Sleep(50);
	AL576_RegWrite(hAL576,0x1c74,0x1); 
	Sleep(50);
	AL576_RegWrite(hAL576,0x1ccc,0x0); 
	Sleep(50);
	AL576_RegWrite(hAL576,0x1c44,0x0); 
	Sleep(50);
	AL576_RegWrite(hAL576,0x1c70,0x1); 
	Sleep(50);
	AL576_RegWrite(hAL576,0x1c70,0x0); 
	Sleep(50);
	AL576_RegWrite(hAL576,0x2068,0x0); 
	Sleep(50);
	AL576_RegWrite(hAL576,0x2000,0x0); 
	Sleep(50);
	AL576_RegWrite(hAL576,0x1c2c,0x0); 
	Sleep(50);
	AL576_RegWrite(hAL576,0x1c30,0x0); 
	Sleep(50);
	AL576_RegWrite(hAL576,0x1c7c,0x0); 
	Sleep(50);
	AL576_RegWrite(hAL576,0x1c98,0x0); 
	Sleep(50);
	AL576_RegWrite(hAL576,0x1ca4,0x0);
	Sleep(50);
	AL576_RegWrite(hAL576,0x1ca0,0x0);
	Sleep(50);
	AL576_HCIWrite(hAL576,0xd,0x0); 
	Sleep(50);

}

unsigned int ResXY[5][2] =
{
	{720,480},
	{352,288},
	{176,144},
	{640,480},
	{320,240}
};

BOOL MPEG_1_Flag = 0;

void CPlayDMODlg::Set_AL576(HANDLE hAL576, UINT nVideo_format,AL576_MPEG_SET_Ptr Al576_MPEG_Seting,AVI_Info_Ptr Avi_info)
{
	
	int pal_offset = 0;
	Commamd_Ptr Par_Set = new COMMAND_PAR;

	AL576_HCIWrite(hAL576, 0xD, 0x0);      //RISC enable
	Sleep(100);
	AL576_RegWrite(hAL576,0x1c70,0x1);    //Encoder reset
	Sleep(50);
	AL576_RegWrite(hAL576,0x1c70,0x0);
	Sleep(50);
	AL576_RegWrite(hAL576, 0x1c64,0x10);   //Clock divider controlling I2C clock
	Sleep(50);

	if(Al576_MPEG_Seting->Stream_Type == MPEG1_SYSTEM || Al576_MPEG_Seting->Stream_Type == MPEG1_VCD)
	{
		if(!MPEG_1_Flag)
		{
			DownLoadParameterFile(hAL576, "param1-2.1-vcd.txt",ParaLocation);
			MPEG_1_Flag = 1;
		}
		AL576_HCIWrite(hAL576,0xd,0x1); 
		Sleep(100);
	}
	else
	{
		if(MPEG_1_Flag)
		{
			DownLoadParameterFile(hAL576, "param1-2.1.txt",ParaLocation);
			MPEG_1_Flag = 0;
		}
		AL576_HCIWrite(hAL576,0xd,0x1); 
		Sleep(100);

		if(nVideo_format == _PAL_I || nVideo_format == _PAL_N || nVideo_format == _PAL_CN || nVideo_format == _PAL_60 || nVideo_format == _SECAMx)
		{
			AL576_MemWrite(hAL576,0x7ff120,0x1);
			AL576_MemWrite(hAL576,0x7ff124,0x2);
			
			if(Al576_MPEG_Seting->Res == 0)
				pal_offset = 96;
			else
				pal_offset = 0;

			Par_Set->Command = 0x70000;
			Par_Set->P1 = 0;
			Par_Set->P2 = ResXY[Al576_MPEG_Seting->Res][0] - 1 - 16;
			Avi_info->width = ResXY[Al576_MPEG_Seting->Res][0] - 16;
			Par_Set->P3 = 0;
			Par_Set->P4 = (ResXY[Al576_MPEG_Seting->Res][1] + pal_offset) / 2 - 1; 
			Avi_info->high = ResXY[Al576_MPEG_Seting->Res][1] + pal_offset;
			Par_Set->P_Num = 4;
			Set_AL576_Command(hAL576,Par_Set);
		}
		else
		{
			if(nVideo_format != _AUTO)
			{
				AL576_MemWrite(hAL576,0x7ff120,0x2);
				AL576_MemWrite(hAL576,0x7ff124,0x4);

				Par_Set->Command = 0x70000;
				Par_Set->P1 = 0;
				Par_Set->P2 = ResXY[Al576_MPEG_Seting->Res][0] - 1 - 16;
				Avi_info->width = ResXY[Al576_MPEG_Seting->Res][0] - 16;
				Par_Set->P3 = 0;
				Par_Set->P4 = ResXY[Al576_MPEG_Seting->Res][1] / 2 - 1; 
				Avi_info->high = ResXY[Al576_MPEG_Seting->Res][1];
				Par_Set->P_Num = 4;
				Set_AL576_Command(hAL576,Par_Set);
			}
		}
		
		//Set Video Frame Rate
 		Par_Set->Command = 0xF0000;
		if(nVideo_format == _PAL_I || nVideo_format == _PAL_N || nVideo_format == _PAL_CN || nVideo_format == _PAL_60 || nVideo_format == _SECAMx)
		{
			if(Al576_MPEG_Seting->Frame_Rate > 25)
				Par_Set->P1 = 25;
			else
				Par_Set->P1 = Al576_MPEG_Seting->Frame_Rate;
		}
		else
			Par_Set->P1 = Al576_MPEG_Seting->Frame_Rate;

		Avi_info->frame_rate = Par_Set->P1;
		Par_Set->P_Num = 1;
		Set_AL576_Command(hAL576,Par_Set);

		//Set Video encoding type
		Par_Set->Command = 0x30000;
		Par_Set->P1 = Al576_MPEG_Seting->Encoding_Type;
		Par_Set->P2 = 1;
		Par_Set->P3 = 0;
		Par_Set->P4 = 20; 
		Par_Set->P_Num = 4;
		Set_AL576_Command(hAL576,Par_Set);

		//Set stream type
		Par_Set->Command = 0x40000;
		if(Al576_MPEG_Seting->Stream_Type == AVI)
			Par_Set->P1 = PES;
		else
			Par_Set->P1 = Al576_MPEG_Seting->Stream_Type;
		Par_Set->P_Num = 1;
		Set_AL576_Command(hAL576,Par_Set);
		
		//Set GOP Structure
		UINT N_num,GOP;

		if(Al576_MPEG_Seting->Encoding_Type == MPEG2 || Al576_MPEG_Seting->Encoding_Type == MPEG1)
		{
			if(Al576_MPEG_Seting->GOP == 4)
			{
				N_num = 1;
				GOP = 1;
			}
			else
			{
				N_num = Al576_MPEG_Seting->N_Num + 10;
				GOP = Al576_MPEG_Seting->GOP;
			}

		}
		else
		{
			if(Al576_MPEG_Seting->GOP == 3)
			{
				N_num = 1;
				GOP = 1;
			}
			else
			{
				N_num = Al576_MPEG_Seting->N_Num + 10;
				GOP = Al576_MPEG_Seting->GOP;
			}
		}

		Par_Set->Command = 0x80000;
		Par_Set->P1 = N_num;
		Par_Set->P2 = GOP;
		Par_Set->P_Num = 2;
		Set_AL576_Command(hAL576,Par_Set);

		//Set video bit rate
		double dTemp = 0;

		Par_Set->Command = 0x60000;
		Par_Set->P1 = Al576_MPEG_Seting->Bit_rate_mode;

		if(Al576_MPEG_Seting->Video_bit_rate >= 50)
		{
			dTemp = Al576_MPEG_Seting->Video_bit_rate;
			Par_Set->P2 = (UINT)((dTemp / 100) * 1000000);
		}
		else
			Par_Set->P2 = Al576_MPEG_Seting->Video_bit_rate * 1000000;

		Par_Set->P_Num = 2;
		Set_AL576_Command(hAL576,Par_Set);

		//Set audio bit rate
		Par_Set->Command = 0x90000;
		Par_Set->P1 = Al576_MPEG_Seting->AudioBitRate;
		Avi_info->audio_rate = Al576_MPEG_Seting->AudioBitRate/1000;
		Par_Set->P_Num = 1;
		Set_AL576_Command(hAL576,Par_Set);

		if(Al576_MPEG_Seting->Stream_Type != MPEG1_SYSTEM || Al576_MPEG_Seting->Stream_Type != MPEG1_VCD)
			Set_AL576_Res(hAL576,nVideo_format,Al576_MPEG_Seting);
	}

	delete Par_Set;
	
}

unsigned int ResReg[5][4] =
{
	{0x100,0x100,0x2bf,0xef},
	{0x7f,0x9c,0x164,0x92},
	{0x40,0x4e,0xb2,0x49 },
	{0xe5,0x103,0x284,0xf2},
	{0x74,0x83,0x144,0x7a}
};

unsigned int PalResReg[5][4] = 
{
	{0xfb,0x100,0x2c0,0x120},
	{0x7f,0x82,0x164,0x92},
	{0x40,0x41,0xb2,0x49 },
	{0xe5,0xd8,0x284,0xf2},
	{0x74,0x6d,0x144,0x7a}
};

void CPlayDMODlg::Set_AL576_Res(HANDLE hAL576,UINT nVideo_format,AL576_MPEG_SET_Ptr Al576_MPEG_Seting)
{
	if(nVideo_format == _PAL_I || nVideo_format == _PAL_N || nVideo_format == _PAL_CN || nVideo_format == _PAL_60 || nVideo_format == _SECAMx)
	{
			AL576_RegWrite(hAL576, 0x20a4, PalResReg[Al576_MPEG_Seting->Res][0]);
			Sleep(50);
			AL576_RegWrite(hAL576, 0x20ac, PalResReg[Al576_MPEG_Seting->Res][1]);
			Sleep(50);
			AL576_RegWrite(hAL576, 0x20b4, PalResReg[Al576_MPEG_Seting->Res][2]);
			Sleep(50);
			AL576_RegWrite(hAL576, 0x20bc, PalResReg[Al576_MPEG_Seting->Res][3] + 8);
			Sleep(50);
			AL576_RegWrite(hAL576, 0x2000, 0x0d01);
			Sleep(50);

	}
	else

⌨️ 快捷键说明

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