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

📄 tccmmbdlg.cpp

📁 自己在wince的环境下做的一移动数字电视驱动
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// tcCMMBDlg.cpp : implementation file
//

#include "stdafx.h"
#include "tcCMMB.h"
#include "tcCMMBDlg.h"
#include "H264Dec/H264Dec.h"
#include "VideoRender/tccvrend.h"
#include "EAACDec/EAACDec.h"
#include "Option.h"
#include "IF101_IO.h"
#include "Queue.h"
#pragma comment(lib,"../tcCommon/telechipsskin.lib")

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define LCD_WIDTH 480
#define LCD_HEIGHT 272


#define VIDEO_WINDOW_LEFT   0
#define VIDEO_WINDOW_TOP    0
#define VIDEO_WINDOW_RIGHT  LCD_WIDTH
#define VIDEO_WINDOW_BOTTOM 215

// rectangle area of battery body icon
#define BTN_BATT_LEFT        318 //325
#define BTN_BATT_TOP         250 //9
#define BTN_BATT_FULL_WIDTH  23
#define BTN_BATT_FULL_HEIGHT 12


// timer id
#define TMR_BATTERY  1002

#define  FONT_COLOR                 RGB(72, 143, 165)
#define  OSD_COLOR                  RGB(0x6e, 0x9a, 0xb8)


static CTL_INFO main_ui[]={
	{IDC_BTN_EXIT, 436,223,479,262, TRUE},

	{IDC_BTN_PREV,  7, 223, 51,262, TRUE},
	{IDC_BTN_NEXT, 57, 223, 100,262, TRUE},

	{IDC_BTN_SCAN,347,224,426,263,TRUE},
	{IDC_BTN_PIP,111,223,167,263,TRUE},

	{0},	// end of array
};

#define INFO_LEFT 180;
#define INFO_TOP 223;
#define INFO_RIGHT 317;
#define INFO_BOTTOM 265;

RECT INFO={180,250,317,265};

RECT SIGNALINFO={20, 80, 200, 120};

#define VOL_SET_STEP 6000
#define TMR_SINGAL  1002


#define CHANNELS (2)
#define SAMPLESPERSEC (48000)
#define BITSPERSAMPLE (16)
#define SAVEBUFFERSIZE (CHANNELS*SAMPLESPERSEC*BITSPERSAMPLE/8)


//VOID OnPlayDTV(TP_DTV_STREAM_T *stream);
DWORD DecodeThread(void *para);
HANDLE DecodeThreadHandle=NULL;
HANDLE VideoRenderHandle=NULL;
HANDLE AudioRenderHandle=NULL;
HANDLE RawVideoHandle=NULL;
HANDLE RawAudioHandle=NULL;
HANDLE StartRunHandle=NULL;

void InitH264Dec();
DWORD RawVideoProcess(PVOID pArg);
//BOOL VideoDataProcess(unsigned char *pDataIn,unsigned long nBitStreamSize);
BOOL VideoDataProcess(unsigned char *pDataIn,unsigned long nBitStreamSize, int & iPTS);
BOOL H264Decprocess(unsigned char *pDataIn,unsigned long nBitStreamSize,int playtime,int time);

void InitEAACDec();
DWORD EAACDecProcess(unsigned char *pBufferIn,
					unsigned int input_size,
					int playtime,
					unsigned char *pBufferOut,
					int maxsize);
void InitWaveDev();
void CALLBACK  waveOutProc( HWAVEOUT hwo,      
                   UINT uMsg,         
                   DWORD dwInstance,  
                   DWORD dwParam1,    
                   DWORD dwParam2);
DWORD AudioRenderProcess(PVOID pArg);
DWORD RawAudioProcess(PVOID pArg);


void InitVideoRender();
DWORD VideoRenderProcess(PVOID pArg);
BOOL IsFirstFrame=TRUE;
void ChangeAllScreen();
BOOL AllScreenFlag=FALSE;

DWORD StartRun(PVOID pArg);


CH264DEC *m_pH264Dec;
CVideoRenderer * m_pVideoRender;
CEAACDec  *m_pEAACPDec;

//unsigned char   Datatemp[TP_VIDEO_FRAME_SIZE_MAX]=
//{0x00,0x00,0x01,0x67,0x42,0xE0,0x0D,0x96,0x52,0x02,0x83,0xF2,0x00,0x00,0x01,0x68 
//,0xCE,0x38,0x80};
#define TP_AUDIO_FRAME_SIZE_MAX         1024
#define TP_VIDEO_FRAME_SIZE_MAX         8192 
#define MAX_NAL_COUNT 10

struct DEMUXVIDEOITEM
{
	unsigned char * Data;//[TP_VIDEO_FRAME_SIZE_MAX+2*1024];
	int size;
	BOOL flag;
};
DEMUXVIDEOITEM DemuxVideo[MAX_NAL_COUNT];

#define RAWVIDEOITEMSIZE 20*1024
struct RawVideoPacket
{
	unsigned char rawdata[RAWVIDEOITEMSIZE];
	unsigned int size;
	unsigned int streamstime;
	unsigned short StartPlayTime;	
};
CDataQueue * RawVideoQueue=NULL;

#define RAWAUDIOITEMSIZE 512
struct RawAudioPacket
{
	unsigned char rawdata[RAWAUDIOITEMSIZE];
	unsigned int size;
	unsigned int streamstime;
	unsigned short StartPlayTime;	
};
CDataQueue * RawAudioQueue=NULL;


struct VideoPacket
{
	tStRendererType DataOut;
	int streamstime;
	int StartPlayTime;
	VideoPacket * Next;
};
VideoPacket * VideoFirst;
VideoPacket * VideoLast;

#define AUDIOITEMSIZE 16*1024
struct AudioPacket
{
	char DataOut[AUDIOITEMSIZE];
	int datasize;
	int streamstime;
	int StartPlayTime;
};
CDataQueue * AudioQueue=NULL;

int Decodeing=0;
int AudioRendering=0;
unsigned char AudioOut[SAVEBUFFERSIZE]={0};
char  buf1[SAVEBUFFERSIZE],buf2[SAVEBUFFERSIZE];
WAVEHDR waveHeader1,waveHeader2;
HWAVEOUT hWaveOut;
HANDLE AudioRender=NULL;
CRITICAL_SECTION Video_section;
CRITICAL_SECTION Timer_section;

int m_height=240,m_width=320;

int VideoTimer=0, AudioTimer=0;

int VideoCount=0;
FILE	*accfile;
FILE	*h264file;

PROGRAMINFOITEM ChannelArray[20];//={601,602,603,604,605,606,607,608};
int ChannelSum=0;
int channelpointer=0;
int freqPoint[68] = {
	53,60,68,80,88,
	171,179,187,195,203,211,219,
	474,482,491,498,506,
	514,522,530,538,546,
	554,562,610,618,626,
	634,642,650,658,666,
	674,682,690,698,706,
	714,722,730,738,746,
	754,762,770,778,786,794,
	802,810,818,826,834,
	842,850,858,866,874,
	0,882,890,898,906,914,
	922,930,938,946
};
CString mstr_status;
CString mstr_signal;
int m_freq=-1,m_status=0;
int m_rendertime=0;
int freqfail=0;

HANDLE mhTsif;
int 	dataend;
FILE *fd;
static CCMMBDemuxer mfx;
BYTE g_FrameBuffer[0xffff] = "";
BYTE frameBuffer[0x20000];
int framelen=0;
//UCHAR inBuf[4608+100];

int tpTvSetFreq(unsigned char freq)
{
	DWORD len=0;
	bool result;
	SYS_STATUS status;
	
	if(mhTsif==NULL)
	{
		return -1;
	}
	result=DeviceIoControl(mhTsif,IOCTL_SET_FREQUENCY,&freq,sizeof(freq), NULL,0, &len,NULL);
	if(result==FALSE)
		return -1;

	memset(&status,0,sizeof(status));
	result=DeviceIoControl(mhTsif,IOCTL_GET_SYS_STATUS,&freq,sizeof(freq), &status,sizeof(status), &len,NULL);
	if(result==FALSE)
		return -1;
	printf("Current_Frequency = %d",status.current_frequency);
	if(status.current_frequency==freq)
		return 0;
	else
		return -12;
}

int tpTvGetFWVersion(unsigned char * version,unsigned char versionsize)
{
	DWORD len=0;
	bool result;
	if(mhTsif==NULL)
	{
		return -1;
	}
	memset(version,0,versionsize);
	if(versionsize<2)
		return -1;
	result=DeviceIoControl(mhTsif,IOCTL_GET_FW_VERSION,NULL,0, version,versionsize, &len,NULL);
	if(result==FALSE)
		return -1;
	return 0;
}


int tpTvGetServiceInfo()
{
	DWORD len=0;
	bool result;
	
	if(mhTsif==NULL)
	{
		return -1;
	}
	result=DeviceIoControl(mhTsif,IOCTL_SET_RECEIVE_TS0,NULL,0, NULL,0, &len,NULL);
	if(result==FALSE)
		return -1;
	return 0;
}

#if 0
int tpTvSelectService(int pointer)
{
	DWORD len=0;
	bool result;

	if(mhTsif==NULL)
	{
		return -1;
	}

	DEMOD_CONFIG setting[2];
	memset(setting,0,sizeof(DEMOD_CONFIG)*2);
	setting[0].ts_start=ChannelArray[pointer].startTs;
	setting[0].ts_count=ChannelArray[pointer].nts;
	setting[0].ldpc_mode=LDPC_1_DIV_2;
	setting[0].modulate_type=DEMAP_QPSK;
	setting[0].outer_mode=OUTER_MODE_1;
	setting[0].rs_mode=RS_240_224;


	result=DeviceIoControl(mhTsif,IOCTL_SET_DEMOD_CONFIG,setting,sizeof(DEMOD_CONFIG)*2, NULL,0, &len,NULL);
	if(result==FALSE)
		return -1;
	return 0;
}	
#else
int tpTvSelectService(int pointer)
{
	DWORD len=0;
	bool result;

	if(mhTsif==NULL)
	{
		return -1;
	}

	CHANNEL_CONFIG setting[2];
	memset(setting,0,sizeof(CHANNEL_CONFIG)*2);
	setting[0].ts_start=ChannelArray[pointer].startTs;
	setting[0].ts_count=ChannelArray[pointer].nts;
	setting[0].demod=ChannelArray[pointer].demod;

	result=DeviceIoControl(mhTsif,IOCTL_SET_CHANNEL_CONFIG,setting,sizeof(CHANNEL_CONFIG)*2, NULL,0, &len,NULL);
	if(result==FALSE)
		return -1;
	return 0;
}
#endif

void CCMMBDemuxer::OnVideoNalData(DWORD dwRelativeTime,BYTE* data, WORD len, NAL_FRAGMENT_POS_IND StartEnd)
{
//	printf("CCMMBDemuxer::OnNalVideoUnit, len=%d\n", len);
	//PushESPacket('V', data, len, dwRelativeTime);
	int result=0;
#if 0
	h264file = fopen("/nand/test.h264", "ab+");
	fwrite(data, 1, len, h264file);
	fclose(h264file);
#else
//	h264file = fopen("/nand/test.h264", "ab+");
//	fwrite(data, 1, len, h264file);
//	fclose(h264file);
//	FRAME_MID		= 0,//指示这段数据是video frame的中间一部分
//	FRAME_TAIL		= 1,//指示这段数据是video frame的最后一部分
//	FRAME_BEGIN		= 2,//指示这段数据是video frame的开头一部分
//	WHOLE_FRAME		= 3,//指示这段数据是一整个video frame
	switch(StartEnd)
	{
	case WHOLE_FRAME:
//		memset(frameBuffer,0,0x20000);
		memcpy(frameBuffer,data,len);
		framelen=len;
		break;
	case FRAME_BEGIN:
//		memset(frameBuffer,0,0x20000);
		memcpy(frameBuffer,data,len);
		framelen=len;
		return;
	case FRAME_MID:
		memcpy(frameBuffer+framelen,data,len);
		framelen+=len;
		return;
	case FRAME_TAIL:
		memcpy(frameBuffer+framelen,data,len);
		framelen+=len;
		break;		
	}

	RawVideoPacket rawitem;
//	memset(&rawitem,0,sizeof(RawVideoPacket));
	if(framelen>RAWVIDEOITEMSIZE)
		printf("%x!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n",len);
	unsigned int videocopysize=framelen>=(RAWVIDEOITEMSIZE) ? (RAWVIDEOITEMSIZE):framelen;				
	memcpy(rawitem.rawdata,frameBuffer,videocopysize);
	rawitem.size=videocopysize;
	rawitem.streamstime=0;
	rawitem.StartPlayTime=(unsigned short)dwRelativeTime;
	result=RawVideoQueue->Put((unsigned char *)&rawitem,sizeof(RawVideoPacket));
	if(!result)
		printf("Raw Video Queue FULL!\n");
#endif
}

void CCMMBDemuxer::OnAudioAacFrame(DWORD dwRelativeTime, BYTE* data, WORD len)
{
//	printf("CCMMBDemuxer::OnAacAudioUnit, len=%d\n", len);
	//PushESPacket('A', data, len, dwRelativeTime);
	int result=0;
#if 0
//	accfile = fopen("/nand/test.aac", "ab+");
//	fwrite(data, 1,len, accfile);
//	fclose(accfile);
#else
//	accfile = fopen("/nand/audio.aac", "ab+");
//	fwrite(data, 1,len, accfile);
//	fclose(accfile);
/*
	int skip = 1;
	if(len>256)
		skip = 2;
	len -= skip;
	data+=skip;
//*/

	RawAudioPacket audiorawitem;
//	memset(&audiorawitem,0,sizeof(RawAudioPacket));
	if(len>RAWAUDIOITEMSIZE)
		printf("%x~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",len);
	unsigned int audiocopysize=(len)>=RAWAUDIOITEMSIZE ? RAWAUDIOITEMSIZE:len;				
	memcpy(audiorawitem.rawdata,data,audiocopysize);
	audiorawitem.size=audiocopysize;
	audiorawitem.streamstime=0;
	audiorawitem.StartPlayTime=(unsigned short)dwRelativeTime;
	result=RawAudioQueue->Put((unsigned char *)&audiorawitem,sizeof(RawAudioPacket));
	if(!result)
		printf("Raw Audio Queue FULL!\n");
#endif
}

void CCMMBDemuxer::OnContinusServiceInfo(CService& rService)
{
	//here, read continual service table from CsctConf 
	bool flag=TRUE;
	printf("\nCmct: ");

//	if(left==0)
//		ChannelSum=0;

	if((rService.serviceid>=0x200)&&(rService.serviceid<=0x3FFF))	
	{
		for(int i=0;i<ChannelSum;i++)
		{
			if(ChannelArray[i].ServerID==rService.serviceid)
			{
				flag=FALSE;
				break;
			}
		}
		if(flag)
		{
			ChannelArray[ChannelSum].freqPoint=rService.freq;
			ChannelArray[ChannelSum].ServerID=rService.serviceid;
			ChannelArray[ChannelSum].startTs=rService.startTs;
			ChannelArray[ChannelSum].nts=rService.nts;
			ChannelArray[ChannelSum].demod=rService.demod;
			ChannelSum++;
		}	
	}

	printf("%d,%d,%d,%d,%d #\n",rService.freq,rService.serviceid,
		rService.startTs,rService.nts,rService.demod);
					
}

void CCMMBDemuxer::OnShortServiceInfo(CService& rService, int left)
{
	//here, read continual service table from CsctConf 
//	printf("\nCsct: ");

//	ChannelArray[ChannelSum].freqPoint=rService.freq;
//	ChannelArray[ChannelSum].ServerID=rService.serviceid;
//	ChannelArray[ChannelSum].startTs=rService.startTs;
//	ChannelArray[ChannelSum].nts=rService.nts;
//	ChannelSum++;	
//	printf("%d,%d,%d,%d #",rService.freq,rService.serviceid,rService.startTs,rService.nts);
					
//	printf("\n");
}

void CCMMBDemuxer::OnESGData(LPBYTE pIn, DWORD len)
{
	printf("There is ESG DATA!");
}

/////////////////////////////////////////////////////////////////////////////
// CTcCMMBDlg dialog

CTcCMMBDlg::CTcCMMBDlg(CWnd* pParent /*=NULL*/)
	: CSkinDialog(CTcCMMBDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTcCMMBDlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTcCMMBDlg::DoDataExchange(CDataExchange* pDX)
{
	CSkinDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTcCMMBDlg)
	DDX_Control(pDX, IDC_CHECKFULLSCREEN, m_allscreen);
	DDX_Control(pDX, IDC_COMB_FREQ, m_combofreq);
	DDX_Control(pDX, IDC_BTN_SCAN, m_btn_scan);
	DDX_Control(pDX, IDC_BTN_PREV, m_btn_prev);
	DDX_Control(pDX, IDC_BTN_PIP, m_btn_pip);
	DDX_Control(pDX, IDC_BTN_NEXT, m_btn_next);
	DDX_Control(pDX, IDC_BTN_EXIT, m_btn_exit);
	DDX_Control(pDX, IDC_BATT, m_batt);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTcCMMBDlg, CSkinDialog)
	//{{AFX_MSG_MAP(CTcCMMBDlg)
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_BTN_EXIT, OnBtnExit)
	ON_BN_CLICKED(IDC_BTN_NEXT, OnBtnNext)
	ON_BN_CLICKED(IDC_BTN_PIP, OnBtnPip)
	ON_BN_CLICKED(IDC_BTN_PREV, OnBtnPrev)

⌨️ 快捷键说明

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