PSParseDlg.cpp
上传用户:thjx518
上传日期:2022-03-16
资源大小:179k
文件大小:10k
源码类别:

mpeg/mp3

开发平台:

Visual C++

  1. // PSParseDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "PSParse.h"
  5. #include "PSParseDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. #include <afxwin.h>
  12. #define TSFILE "TestTS_11100"
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CAboutDlg dialog used for App About
  15. DWORD WINAPI CardThread(void*param){
  16. UCHAR buf[18800],rest[188];
  17. UCHAR *p=buf;
  18. CRecvCard card;
  19. HWND  hWnd=NULL;
  20.     
  21. MessageBox(hWnd,TSFILE,NULL,MB_OK);
  22. card.Open(TSFILE);
  23.    
  24. int restlen=0;
  25. CQueue *qq=(CQueue*)param;
  26. while(true){
  27. int size=restlen;
  28. p=buf+restlen;
  29. memcpy(buf,rest,restlen);
  30. size+=card.Read(p,18800-(p-buf));
  31. for(int i=0;i<188;i++){
  32. bool is47=true;
  33. for(int j=i;j<size;j+=188)
  34. if(buf[j]!=0x47){
  35. is47=false;
  36. break;
  37. }
  38. if(is47==false)continue;
  39. restlen=(size-i)%188;
  40. memcpy(rest,buf+(size-restlen),restlen);
  41. for(int k=0;k<size;k+=188)
  42. if(p[k]==0x47)qq->Push(buf+k);
  43. break;
  44. }//end of for i
  45. }//end of while
  46. }
  47. class CAboutDlg : public CDialog
  48. {
  49. public:
  50. CAboutDlg();
  51. // Dialog Data
  52. //{{AFX_DATA(CAboutDlg)
  53. enum { IDD = IDD_ABOUTBOX };
  54. //}}AFX_DATA
  55. // ClassWizard generated virtual function overrides
  56. //{{AFX_VIRTUAL(CAboutDlg)
  57. protected:
  58. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  59. //}}AFX_VIRTUAL
  60. // Implementation
  61. protected:
  62. //{{AFX_MSG(CAboutDlg)
  63. //}}AFX_MSG
  64. DECLARE_MESSAGE_MAP()
  65. };
  66. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  67. {
  68. //{{AFX_DATA_INIT(CAboutDlg)
  69. //}}AFX_DATA_INIT
  70. }
  71. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  72. {
  73. CDialog::DoDataExchange(pDX);
  74. //{{AFX_DATA_MAP(CAboutDlg)
  75. //}}AFX_DATA_MAP
  76. }
  77. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  78. //{{AFX_MSG_MAP(CAboutDlg)
  79. // No message handlers
  80. //}}AFX_MSG_MAP
  81. END_MESSAGE_MAP()
  82. /////////////////////////////////////////////////////////////////////////////
  83. // CPSParseDlg dialog
  84. CPSParseDlg::CPSParseDlg(CWnd* pParent /*=NULL*/)
  85. : CDialog(CPSParseDlg::IDD, pParent)
  86. {
  87. //{{AFX_DATA_INIT(CPSParseDlg)
  88. m_hex = _T("");
  89. //}}AFX_DATA_INIT
  90. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  91. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  92. }
  93. void CPSParseDlg::DoDataExchange(CDataExchange* pDX)
  94. {
  95. CDialog::DoDataExchange(pDX);
  96. //{{AFX_DATA_MAP(CPSParseDlg)
  97. DDX_Control(pDX, IDC_PROGRAMS, m_progs);
  98. DDX_Text(pDX, IDC_HEX, m_hex);
  99. DDV_MaxChars(pDX, m_hex, 102400);
  100. //}}AFX_DATA_MAP
  101. DDX_Control(pDX, IDC_EDIT1, m_edit4);
  102. }
  103. BEGIN_MESSAGE_MAP(CPSParseDlg, CDialog)
  104. //{{AFX_MSG_MAP(CPSParseDlg)
  105. ON_WM_SYSCOMMAND()
  106. ON_WM_PAINT()
  107. ON_WM_QUERYDRAGICON()
  108. ON_BN_CLICKED(IDC_GETDATA, OnGetdata)
  109. ON_WM_SIZE()
  110. //}}AFX_MSG_MAP
  111. ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
  112. END_MESSAGE_MAP()
  113. /////////////////////////////////////////////////////////////////////////////
  114. // CPSParseDlg message handlers
  115. BOOL CPSParseDlg::OnInitDialog()
  116. {
  117. CDialog::OnInitDialog();
  118. // Add "About..." menu item to system menu.
  119. // IDM_ABOUTBOX must be in the system command range.
  120. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  121. ASSERT(IDM_ABOUTBOX < 0xF000);
  122. CMenu* pSysMenu = GetSystemMenu(FALSE);
  123. if (pSysMenu != NULL)
  124. {
  125. CString strAboutMenu;
  126. strAboutMenu.LoadString(IDS_ABOUTBOX);
  127. if (!strAboutMenu.IsEmpty())
  128. {
  129. pSysMenu->AppendMenu(MF_SEPARATOR);
  130. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  131. }
  132. }
  133. // Set the icon for this dialog.  The framework does this automatically
  134. //  when the application's main window is not a dialog
  135. SetIcon(m_hIcon, TRUE); // Set big icon
  136. SetIcon(m_hIcon, FALSE); // Set small icon
  137. // TODO: Add extra initialization here
  138. DWORD threadid;
  139. CreateThread(NULL,0,CardThread,&Queue,0,&threadid);
  140. return TRUE;  // return TRUE  unless you set the focus to a control
  141. }
  142. void CPSParseDlg::OnSysCommand(UINT nID, LPARAM lParam)
  143. {
  144. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  145. {
  146. CAboutDlg dlgAbout;
  147. dlgAbout.DoModal();
  148. }
  149. else
  150. {
  151. CDialog::OnSysCommand(nID, lParam);
  152. }
  153. }
  154. // If you add a minimize button to your dialog, you will need the code below
  155. //  to draw the icon.  For MFC applications using the document/view model,
  156. //  this is automatically done for you by the framework.
  157. void CPSParseDlg::OnPaint() 
  158. {
  159. if (IsIconic())
  160. {
  161. CPaintDC dc(this); // device context for painting
  162. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  163. // Center icon in client rectangle
  164. int cxIcon = GetSystemMetrics(SM_CXICON);
  165. int cyIcon = GetSystemMetrics(SM_CYICON);
  166. CRect rect;
  167. GetClientRect(&rect);
  168. int x = (rect.Width() - cxIcon + 1) / 2;
  169. int y = (rect.Height() - cyIcon + 1) / 2;
  170. // Draw the icon
  171. dc.DrawIcon(x, y, m_hIcon);
  172. }
  173. else
  174. {
  175. CDialog::OnPaint();
  176. }
  177. }
  178. // The system calls this to obtain the cursor to display while the user drags
  179. //  the minimized window.
  180. HCURSOR CPSParseDlg::OnQueryDragIcon()
  181. {
  182. return (HCURSOR) m_hIcon;
  183. }
  184. void CPSParseDlg::OnGetdata() 
  185. {
  186. // TODO: Add your control notification handler code here
  187. UpdateData(TRUE);
  188. m_hex="";
  189. MessageBox("aaaaa",NULL,MB_OK);
  190. GetPATPMT();
  191. //GetNIT();
  192. //GetSDT();
  193. //GetEIT();
  194. UpdateData(FALSE);
  195. }
  196. void CPSParseDlg::GetPATPMT()
  197. {
  198. // char buf[409600];
  199. int i;
  200. CString s;
  201. PATType pat;
  202. USHORT pids[4]={0,0,0,0};
  203. Queue.SetFilter(pids,1);
  204. CTSParse ts(&Queue);
  205. ParsePat(&ts,&pat);
  206. s.Format("PAT table contained %d Programs SectionLen=%drn",
  207. pat.numProgs,pat.sectionLength);
  208. m_hex+=s;
  209. s.Format("Version=%Xrn",pat.versionNo);
  210. m_hex+=s;
  211. s.Format("Transport Stream ID=%Xrnrn",pat.streamId);
  212. m_hex+=s;
  213. for(int n=0;n<pat.numProgs;n++)
  214. {
  215. s.Format("Program %04X  PMT PID=%04Xrn",
  216. pat.programs[n].programNumber,
  217. pat.programs[n].programMapPID);
  218. TRACE(s);
  219. m_hex+=s;
  220. }
  221. m_hex+="rn============================================rnrn";
  222. PMTType pmt;
  223. for(int j=0;j<pat.numProgs;j++){
  224. s.Format("Program %04X PMT_PID=%04X ",
  225. pat.programs[j].programNumber,
  226. pat.programs[j].programMapPID);
  227. m_progs.AddString(s);
  228. m_hex+=s;
  229. pids[0]=pat.programs[j].programMapPID;
  230. Queue.SetFilter(pids,1);
  231. ParsePmt(&ts,&pmt,pat.programs[j].programMapPID);
  232. s.Format(" Descriptor Number=%XrntVersion=%Xrn",
  233. pmt.numDescriptors,pmt.versionNo);
  234. m_hex+=s;
  235. for(i=0;i<pmt.numStreams;i++)
  236. {
  237. s.Format("tStream Type=%2X Stream PID=%4Xrn",
  238. pmt.stream[i].typeOfStream,pmt.stream[i].pid);
  239. m_hex+=s;
  240. s.Format("ttDescriptor Number=%Xrn",
  241. pmt.stream[i].numDescriptors);
  242. m_hex+=s;
  243. }
  244. }
  245. UpdateData(FALSE);
  246. }
  247. void CPSParseDlg::OnSize(UINT nType, int cx, int cy) 
  248. {
  249. CDialog::OnSize(nType, cx, cy);
  250. CWnd*w=this->GetDlgItem(IDC_HEX);
  251. RECT r;
  252. GetWindowRect(&r);
  253. ScreenToClient(&r);
  254. if(w)
  255. w->SetWindowPos(&wndTop,r.left+10,r.top+100,r.right-10,r.bottom-90,SWP_SHOWWINDOW );
  256. }
  257. void CPSParseDlg::GetNIT()
  258. {
  259. NITType nit;
  260. CTSParse ts(&Queue);
  261. USHORT pids[2]={0x10};
  262. Queue.SetFilter(pids,1);
  263. ParseNit(&ts,&nit,true);
  264. CString s;
  265. m_hex+="rn=============================================rn";
  266. s.Format("rnNIT networkID=%X Descriptor Number=%XrntVersion=%xrn",
  267. nit.networkId,nit.numDescriptors,nit.versionNo);
  268. m_hex+=s;
  269. for(int i=0;i<nit.numStreams;i++)
  270. {
  271. s.Format("tStreamID=%X  NetworkID=%Xrn",
  272. nit.stream[i].streamId,nit.stream[i].networkId);
  273. m_hex+=s;
  274. s.Format("ttDescriptor Number=%Xrn",nit.stream[i].numDescriptors);
  275. m_hex+=s;
  276. }
  277. UpdateData(FALSE);
  278. }
  279. void CPSParseDlg::GetSDT()
  280. {
  281. for(int a=0;a<2;a++){
  282. SDTType sdt;
  283. USHORT pids[2]={0x11,0};
  284. CTSParse ts(&Queue);
  285. Queue.SetFilter(pids,1);
  286. ParseSdt(&ts,&sdt,a==1);
  287. CString s;
  288. m_hex+="rn=============================================rn";
  289. s.Format("Service Description Table of Transport Stream %X ,Service Count=%XrntVersion=%XtTableID=%Xrn",
  290. sdt.streamId,sdt.numServices,sdt.versionNo,sdt.tableId);
  291. m_hex+=s;
  292. for(int i=0;i<sdt.numServices;i++){
  293. char buf[64];
  294. memset(buf,0,64);
  295. int pp=sdt.service[i].descriptor[0].data[1];
  296. int dl=sdt.service[i].descriptor[0].data[pp+2];
  297. memcpy(buf,sdt.service[i].descriptor[0].data+pp+2,dl+1);
  298. buf[dl]=0;
  299. s.Format("tService ID=%X  ServiceName="%s"  Descriptor Number=%Xrn",
  300. sdt.service[i].serviceId,
  301. buf,sdt.service[i].numDescriptors);
  302. m_hex+=s;
  303. }
  304. }
  305. }
  306. void CPSParseDlg::GetEIT()
  307. {
  308. EITType eit;
  309. CTSParse ts(&Queue);
  310. USHORT pids[2]={0x12,0};
  311. Queue.SetFilter(pids,1);
  312. ParseEit(&ts,&eit,0x4f,0x12d);
  313. CString s;
  314. m_hex+="rn=============================================rn";
  315. s.Format("Service %x Event Count=%XrntVersion=%Xrn",
  316. eit.serviceId ,eit.numEvents,eit.versionNo);
  317. m_hex+=s;
  318. for(int i=0;i<eit.numEvents;i++)
  319. {
  320. __int64 i64=(__int64)eit.event[i].startTimeHi<<8|eit.event[i].startTimeLo;
  321. UINT du=eit.event[i].duration;
  322. char tmstr[64];
  323. s.Format("tEvent %X EventID=%X Descriptor Number=%Xrn",
  324. i+1,eit.event[i].eventId,eit.event[i].numDescriptors);
  325. m_hex+=s;
  326. GetDateTimeFromMJD(i64,tmstr);
  327. s.Format("ttStart Time=%s Duration=%02x:%02x:%02xrn",
  328. tmstr,du>>16,du>>8&&0xff,du&0xff);
  329. m_hex+=s;
  330. for(int j=0;j<eit.event[i].numDescriptors;j++){
  331. char eventname[64];
  332. memset(eventname,0,64);
  333. if(eit.event[i].descriptor[j].tag==0x4d){
  334. DescriptorType*dsc=eit.event[i].descriptor+j;
  335. memcpy(eventname,dsc->data+4,dsc->data[3]+1);
  336. m_hex+="ttEvent Name=";
  337. m_hex+=eventname;
  338. m_hex+="rn";
  339. }
  340. s.Format("ttDescription %X Tag=%X Length=%Xrn",j,
  341. eit.event[i].descriptor[j].tag,
  342. eit.event[i].descriptor[j].length);
  343. m_hex+=s;
  344. }
  345. }
  346. }
  347. void CPSParseDlg::OnBnClickedButton1()
  348. {
  349. // TODO: 在此添加控件通知处理程序代码
  350. char ssss[255];
  351. char filters[] =
  352. "DVB TS Files (*.ts)|*.ts|All Files (*.*)|*.*|";
  353. CFileDialog fileDlg(TRUE, NULL, "*.ts",
  354. NULL, filters, NULL); 
  355. int result = fileDlg.DoModal();
  356. if (result == IDOK)
  357. {
  358. m_openFileName = fileDlg.GetFileName();
  359. m_openFilePath = fileDlg.GetPathName();
  360. //sprintf(buff,"%s",str);
  361.     m_edit4.SetWindowText(m_openFilePath);
  362. if(strlen(m_openFilePath)==0){
  363.           MessageBox(m_openFilePath);
  364. }else{
  365. sprintf(ssss,"you chosed:%s",m_openFilePath);
  366. //MessageBox(ssss);
  367. }
  368. Invalidate();
  369. }
  370. }