Advertisement
Guest User

TVTest 0.10.0 TSMF patch (under 26)

a guest
Jan 9th, 2019
2,051
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.56 KB | None | 0 0
  1. diff --git a/LibISDB/Filters/TSPacketParserFilter.cpp b/LibISDB/Filters/TSPacketParserFilter.cpp
  2. index f76916c..8e4eb7c 100644
  3. --- a/LibISDB/Filters/TSPacketParserFilter.cpp
  4. +++ b/LibISDB/Filters/TSPacketParserFilter.cpp
  5. @@ -42,6 +42,8 @@ TSPacketParserFilter::TSPacketParserFilter()
  6. , m_OutputErrorPacket(false)
  7. , m_Generate1SegPAT(true)
  8.  
  9. + , m_SlotNum(0)
  10. +
  11. , m_InputBytes(0)
  12. , m_TotalInputBytes(0)
  13. {
  14. @@ -70,6 +72,8 @@ void TSPacketParserFilter::Reset()
  15. m_PacketSequence.SetDataCount(0);
  16. m_OutOfSyncCount = 0;
  17.  
  18. + m_SlotNum = 0;
  19. +
  20. m_PATGenerator.Reset();
  21. }
  22.  
  23. @@ -256,7 +260,17 @@ void TSPacketParserFilter::SyncPacket(const uint8_t *pData, size_t Size)
  24.  
  25. if (CurSize == TS_PACKET_SIZE) {
  26. // パケットサイズ分データが揃った
  27. - const TSPacket::ParseResult Result = m_Packet.ParsePacket(m_ContinuityCounter.data());
  28. + bool processSlot = true;
  29. + if (m_SlotNum > 0) {
  30. + // スロット数が半分未満のものは処理しない
  31. + if (m_SlotCounter[m_TsNum[m_SlotNum]] < 26) {
  32. + processSlot = false;
  33. + }
  34. + if (++m_SlotNum == 53) {
  35. + m_SlotNum = 0;// フレーム終了
  36. + }
  37. + }
  38. + const TSPacket::ParseResult Result = m_Packet.ParsePacket(processSlot ? m_ContinuityCounter.data() : nullptr);
  39.  
  40. if ((m_OutOfSyncCount > TS_PACKET_SIZE_MAX - TS_PACKET_SIZE)
  41. && ((Result == TSPacket::ParseResult::FormatError)
  42. @@ -270,11 +284,16 @@ void TSPacketParserFilter::SyncPacket(const uint8_t *pData, size_t Size)
  43. break;
  44. }
  45. }
  46. - if (Resync)
  47. + if (Resync) {
  48. + m_SlotNum = 0;// フレームをリセット
  49. continue;
  50. + }
  51. }
  52.  
  53. - ProcessPacket(Result);
  54. + if (processSlot)
  55. + ProcessPacket(Result);
  56. + else
  57. + m_Packet.ClearSize();
  58.  
  59. m_OutOfSyncCount = 0;
  60. }
  61. @@ -297,6 +316,33 @@ void TSPacketParserFilter::ProcessPacket(TSPacket::ParseResult Result)
  62. [[fallthrough]];
  63. case TSPacket::ParseResult::OK:
  64. {
  65. + if (PID == 0x002F_u16) {
  66. + // 多重フレームヘッダのチェック
  67. + uint8_t* FrameHeader = m_Packet.GetData();
  68. + // 多重フレーム同期情報(+4)
  69. + uint16_t framesync = ((uint16_t)(FrameHeader[4] & 0x1F) << 8) | (uint16_t)FrameHeader[5];
  70. + //多重フレーム形式の種別(+6)
  71. + // 0x1 多重フレーム数 53 / 最大多重ストリーム数 15
  72. + uint8_t framemode = FrameHeader[6] & 0x0F_u8;
  73. + if (framemode == 1 && (framesync == 0x1A86_u16 || framesync == 0x0579_u16)) {
  74. + m_SlotNum = 1;
  75. + //相対ストリーム番号/スロット対応情報(+73)
  76. + size_t offset = 73;
  77. + m_SlotCounter.fill(0);
  78. + size_t slot = 1;
  79. + do {
  80. + m_TsNum[slot] = (FrameHeader[offset] & 0xF0_u8) >> 4;
  81. + ++m_SlotCounter[m_TsNum[slot]];
  82. + ++slot;
  83. + m_TsNum[slot] = FrameHeader[offset] & 0x0F_u8;
  84. + ++m_SlotCounter[m_TsNum[slot]];
  85. + ++slot;
  86. + } while (++offset < 99);
  87. +
  88. + break;
  89. + }
  90. + }
  91. +
  92. ++m_PIDPacketCount[PID].Input;
  93.  
  94. if (m_Packet.IsScrambled()) {
  95. diff --git a/LibISDB/Filters/TSPacketParserFilter.hpp b/LibISDB/Filters/TSPacketParserFilter.hpp
  96. index c8de156..db5cb56 100644
  97. --- a/LibISDB/Filters/TSPacketParserFilter.hpp
  98. +++ b/LibISDB/Filters/TSPacketParserFilter.hpp
  99. @@ -115,6 +115,10 @@ namespace LibISDB
  100. DataStreamSequence<TSPacket> m_PacketSequence;
  101. size_t m_OutOfSyncCount;
  102.  
  103. + uint8_t m_SlotNum;
  104. + std::array<uint8_t, 52 + 1> m_TsNum;
  105. + std::array<uint8_t, 16> m_SlotCounter;
  106. +
  107. bool m_OutputSequence;
  108. size_t m_MaxSequencePacketCount;
  109. bool m_OutputNullPacket;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement