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

mpeg/mp3

开发平台:

Visual C++

  1. // PrivateSection.cpp: implementation of the CPrivateSection class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "PSParse.h"
  6. #include "PrivateSection.h"
  7. //////////////////////////////////////////////////////////////////////
  8. // Construction/Destruction
  9. //////////////////////////////////////////////////////////////////////
  10. CPrivateSection::CPrivateSection(CTSParse*ts,USHORT pid)
  11. :m_ts(ts),m_pid(pid){}
  12. CPrivateSection::~CPrivateSection()
  13. {}
  14. int CPrivateSection::GetSection(UCHAR*buf,UCHAR sectionno,UCHAR tableid,USHORT extid)
  15. {
  16. UCHAR *pbuf;
  17. DWORD tm=GetTickCount();
  18. do{
  19. pbuf=buf;
  20. while(m_ts->GetPacket(m_pid,true)!=ptFirst);
  21. pbuf+=m_ts->GetData(pbuf);
  22. int m;
  23. if( ((pbuf-buf)>=6 && GET_8(buf,6)!=sectionno)||
  24. (GET_8(buf,0)!=INVALID_TABLEID && GET_8(buf,0)!=tableid)||
  25. (GET_16(buf,3)!=0xFFFF && GET_16(buf,3)!=extid))
  26. continue;
  27. while((m=m_ts->GetPacket(m_pid))==ptPayLoad){
  28. pbuf+=m_ts->GetData(pbuf);
  29. if(GetTickCount()-tm>2000)return -1;
  30. }//if(m!=ptPayLoad)break;
  31. }while( (GET_8(buf,6)!=sectionno)||
  32. (GET_8(buf,0)!=INVALID_TABLEID && GET_8(buf,0)!=tableid)||
  33. (GET_16(buf,3)!=0xFFFF && GET_16(buf,3)!=extid));
  34. return pbuf-buf;
  35. }
  36. int CPrivateSection::GetSections(UCHAR*buf,UCHAR tableid,USHORT extid)
  37. {
  38. UCHAR*pbuf=buf;
  39. UCHAR secno=0,lsecno=0;
  40. do{
  41. secno=lsecno;
  42. int size;
  43. do{
  44. size=GetSection(pbuf,secno,tableid,extid);
  45. }while(size<=0);
  46. lsecno=(UCHAR)pbuf[7];
  47. pbuf+=size;
  48. }while(lsecno>secno);
  49. return pbuf-buf;
  50. }
  51. int CPrivateSection::GetSection(UCHAR *buf,UCHAR sectionno,UCHAR tableid)
  52. {
  53. UCHAR *pbuf;
  54. DWORD tm=GetTickCount();
  55. do{
  56. pbuf=buf;
  57. while(m_ts->GetPacket(m_pid,true)!=ptFirst);
  58. pbuf+=m_ts->GetData(pbuf);
  59. if( ((pbuf-buf)>=6 && GET_8(buf,6)!=sectionno)||
  60. (GET_8(buf,0)!=INVALID_TABLEID && GET_8(buf,0)!=tableid))
  61. continue;
  62. while(m_ts->GetPacket(m_pid)==ptPayLoad){
  63. pbuf+=m_ts->GetData(pbuf);
  64. if(GetTickCount()-tm>2000)return -1;
  65. }
  66. }while( (GET_8(buf,6)!=sectionno)||
  67. (GET_8(buf,0)!=INVALID_TABLEID && GET_8(buf,0)!=tableid));
  68. return pbuf-buf;
  69. }
  70. int CPrivateSection::GetSections(UCHAR *buf, UCHAR tableid)
  71. {
  72. UCHAR*pbuf=buf;
  73. UCHAR secno=0,lsecno=0;
  74. do{
  75. secno=lsecno;
  76. int size;
  77. do{
  78. size=GetSection(pbuf,secno,tableid);
  79. }while(size<=0);
  80. lsecno=(UCHAR)pbuf[7];
  81. pbuf+=size;
  82. }while(lsecno>secno);
  83. return pbuf-buf;
  84. }