📄 tccmmbdlg.cpp
字号:
// 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 + -