Ticket #10496: 0004-refactor-PESPacket-and-PSIPTable-some-more-to-silenc.patch
File 0004-refactor-PESPacket-and-PSIPTable-some-more-to-silenc.patch, 12.1 KB (added by , 12 years ago) |
---|
-
mythtv/libs/libmythtv/avformatdecoder.cpp
From ed1f09ac75a454b2677909a7136d94242a917bad Mon Sep 17 00:00:00 2001 From: Karl Dietz <dekarl@users.sourceforge.net> Date: Wed, 21 Mar 2012 23:36:16 +0100 Subject: [PATCH 4/5] refactor PESPacket and PSIPTable some more to silence CRC errors --- mythtv/libs/libmythtv/avformatdecoder.cpp | 16 +---- mythtv/libs/libmythtv/dvbstreamhandler.cpp | 3 +- mythtv/libs/libmythtv/firewiredevice.cpp | 4 +- mythtv/libs/libmythtv/mpeg/mpegtables.h | 88 +++++++++++++++++++++++++-- mythtv/libs/libmythtv/mpeg/pespacket.h | 74 ++---------------------- 5 files changed, 93 insertions(+), 92 deletions(-) diff --git a/mythtv/libs/libmythtv/avformatdecoder.cpp b/mythtv/libs/libmythtv/avformatdecoder.cpp index 40d4a12..62d4578 100644
a b void AvFormatDecoder::ScanATSCCaptionStreams(int av_index) 1468 1468 return; 1469 1469 } 1470 1470 1471 const PESPacket pes = PESPacket::ViewData(ic->cur_pmt_sect); 1472 const PSIPTable psip(pes); 1473 const ProgramMapTable pmt(psip); 1471 const ProgramMapTable pmt = ProgramMapTable::ViewData(ic->cur_pmt_sect); 1474 1472 1475 1473 uint i; 1476 1474 for (i = 0; i < pmt.StreamCount(); i++) … … void AvFormatDecoder::ScanTeletextCaptions(int av_index) 1595 1593 if (!ic->cur_pmt_sect || tracks[kTrackTypeTeletextCaptions].size()) 1596 1594 return; 1597 1595 1598 const PESPacket pes = PESPacket::ViewData(ic->cur_pmt_sect); 1599 const PSIPTable psip(pes); 1600 const ProgramMapTable pmt(psip); 1596 const ProgramMapTable pmt = PSIPTable::ViewData(ic->cur_pmt_sect); 1601 1597 1602 1598 for (uint i = 0; i < pmt.StreamCount(); i++) 1603 1599 { … … void AvFormatDecoder::ScanDSMCCStreams(void) 1669 1665 if (!itv && ! (itv = m_parent->GetInteractiveTV())) 1670 1666 return; 1671 1667 1672 const PESPacket pes = PESPacket::ViewData(ic->cur_pmt_sect); 1673 const PSIPTable psip(pes); 1674 const ProgramMapTable pmt(psip); 1668 ProgramMapTable pmt = ProgramMapTable::ViewData(ic->cur_pmt_sect); 1675 1669 1676 1670 for (uint i = 0; i < pmt.StreamCount(); i++) 1677 1671 { … … bool AvFormatDecoder::HasVideo(const AVFormatContext *ic) 4539 4533 { 4540 4534 if (ic && ic->cur_pmt_sect) 4541 4535 { 4542 const PESPacket pes = PESPacket::ViewData(ic->cur_pmt_sect); 4543 const PSIPTable psip(pes); 4544 const ProgramMapTable pmt(psip); 4536 const ProgramMapTable pmt = ProgramMapTable::ViewData(ic->cur_pmt_sect); 4545 4537 4546 4538 for (uint i = 0; i < pmt.StreamCount(); i++) 4547 4539 { -
mythtv/libs/libmythtv/dvbstreamhandler.cpp
diff --git a/mythtv/libs/libmythtv/dvbstreamhandler.cpp b/mythtv/libs/libmythtv/dvbstreamhandler.cpp index 75519f9..1e24b67 100644
a b void DVBStreamHandler::RunSR(void) 324 324 325 325 readSomething = true; 326 326 327 const PESPacket pes = PESPacket::ViewData(buffer); 328 const PSIPTable psip(pes); 327 const PSIPTable psip = PSIPTable::ViewData(buffer); 329 328 330 329 if (psip.SectionSyntaxIndicator()) 331 330 { -
mythtv/libs/libmythtv/firewiredevice.cpp
diff --git a/mythtv/libs/libmythtv/firewiredevice.cpp b/mythtv/libs/libmythtv/firewiredevice.cpp index a3f8507..38ae9b3 100644
a b 16 16 #include "darwinfirewiredevice.h" 17 17 #endif 18 18 #include "mythlogging.h" 19 #include " pespacket.h"19 #include "mpegtables.h" 20 20 21 21 #define LOC QString("FireDev(%1): ").arg(guid_to_string(m_guid)) 22 22 … … void FirewireDevice::ProcessPATPacket(const TSPacket &tspacket) 336 336 if (!tspacket.TransportError() && !tspacket.Scrambled() && 337 337 tspacket.HasPayload() && tspacket.PayloadStart() && !tspacket.PID()) 338 338 { 339 P ESPacket pes = PESPacket::View(tspacket);339 PSIPTable pes = PSIPTable::View(tspacket); 340 340 uint crc = pes.CalcCRC(); 341 341 m_buffer_cleared |= (crc != m_last_crc); 342 342 m_last_crc = crc; -
mythtv/libs/libmythtv/mpeg/mpegtables.h
diff --git a/mythtv/libs/libmythtv/mpeg/mpegtables.h b/mythtv/libs/libmythtv/mpeg/mpegtables.h index 4223dff..053dd1e 100644
a b class MTV_PUBLIC TableID 350 350 }; 351 351 352 352 /** \class PSIPTable 353 * \brief A PSIP table is a special type ofPES packet containing an354 * MPEG, ATSC ,or DVB table.353 * \brief A PSIP table is a variant of a PES packet containing an 354 * MPEG, ATSC or DVB table. 355 355 */ 356 356 class MTV_PUBLIC PSIPTable : public PESPacket 357 357 { 358 /// Only handles single TS packet PES packets, for PMT/PAT tables basically 359 void InitPESPacket(TSPacket& tspacket) 360 { 361 if (tspacket.PayloadStart()) 362 _psiOffset = tspacket.AFCOffset() + tspacket.StartOfFieldPointer(); 363 else 364 { 365 LOG(VB_GENERAL, LOG_ERR, "Started PESPacket, but !payloadStart()"); 366 _psiOffset = tspacket.AFCOffset(); 367 } 368 _pesdata = tspacket.data() + _psiOffset + 1; 369 370 _badPacket = true; 371 // first check if Length() will return something useful and 372 // than check if the packet ends in the first TSPacket 373 if ((_pesdata - tspacket.data()) <= (188-3) && 374 (_pesdata + Length() - tspacket.data()) <= (188-3)) 375 { 376 _badPacket = !VerifyCRC(); 377 } 378 } 379 380 protected: 381 // does not create it's own data 382 PSIPTable(const TSPacket& tspacket, bool) 383 : PESPacket() 384 { 385 _pesdata = NULL; 386 _fullbuffer = NULL; 387 _ccLast = tspacket.ContinuityCounter(); 388 _allocSize = 0; 389 InitPESPacket(const_cast<TSPacket&>(tspacket)); 390 _fullbuffer = const_cast<unsigned char*>(tspacket.data()); 391 _pesdataSize = TSPacket::kSize - (_pesdata - _fullbuffer); 392 } 393 394 public: 395 396 // may be modified 397 PSIPTable(const TSPacket &tspacket, 398 const unsigned char *pesdata, uint pes_size) 399 : PESPacket() 400 { // clone 401 _ccLast = tspacket.ContinuityCounter(); 402 _pesdataSize = pes_size; 403 InitPESPacket(const_cast<TSPacket&>(tspacket)); // sets _psiOffset 404 int len = pes_size+4; 405 /* make alloc size multiple of 188 */ 406 _allocSize = ((len+_psiOffset+187)/188)*188; 407 _fullbuffer = pes_alloc(_allocSize); 408 _pesdata = _fullbuffer + _psiOffset + 1; 409 memcpy(_fullbuffer, tspacket.data(), 188); 410 memcpy(_pesdata, pesdata, pes_size-1); 411 } 412 413 358 414 private: 359 415 // creates non-clone version, for View 360 416 PSIPTable(const PESPacket& pkt, bool) 361 : PESPacket(reinterpret_cast<const TSPacket*>(pkt.tsheader()), false) 362 { ; } 417 { 418 PSIPTable(reinterpret_cast<const PESPacket&>(*pkt.data()), false); 419 } 363 420 public: 364 421 PSIPTable(const PSIPTable& table) : PESPacket(table) 365 422 { … … class MTV_PUBLIC PSIPTable : public PESPacket 371 428 // section_syntax_ind 1 1.0 8 should always be 1 372 429 // private_indicator 1 1.1 9 should always be 1 373 430 } 374 PSIPTable(const TSPacket& table) : PESPacket(table) 431 // may be modified 432 PSIPTable(const TSPacket& table) 433 : PESPacket() 375 434 { 376 435 // section_syntax_ind 1 1.0 8 should always be 1 377 436 // private_indicator 1 1.1 9 should always be 1 437 438 _ccLast = table.ContinuityCounter(); 439 _pesdataSize = 188; 440 441 // clone 442 InitPESPacket(const_cast<TSPacket&>(table)); // sets _psiOffset 443 444 int len = (4*1024) - 256; /* ~4KB */ 445 _allocSize = len + _psiOffset; 446 _fullbuffer = pes_alloc(_allocSize); 447 _pesdata = _fullbuffer + _psiOffset + 1; 448 memcpy(_fullbuffer, table.data(), TSPacket::kSize); 378 449 } 379 450 380 451 381 452 static const PSIPTable View(const TSPacket& tspacket) 382 { return PSIPTable( PESPacket::View(tspacket), false); }453 { return PSIPTable(tspacket, false); } 383 454 384 455 static PSIPTable View(TSPacket& tspacket) 385 { return PSIPTable(PESPacket::View(tspacket), false); } 456 { return PSIPTable(tspacket, false); } 457 458 static const PSIPTable ViewData(const unsigned char* pesdata) 459 { return PSIPTable(reinterpret_cast<const TSPacket&>(*pesdata), false); } 386 460 387 461 // Section Bits Start Byte sbit 388 462 // ----------------------------------------- -
mythtv/libs/libmythtv/mpeg/pespacket.h
diff --git a/mythtv/libs/libmythtv/mpeg/pespacket.h b/mythtv/libs/libmythtv/mpeg/pespacket.h index bcd4fde..b70f1e8 100644
a b void pes_free(unsigned char *ptr); 19 19 20 20 /** \class PESPacket 21 21 * \brief Allows us to transform TS packets to PES packets, which 22 * are used to hold PSIP tables as well as multimedia streams.22 * are used to hold multimedia streams and very similar to PSIP tables. 23 23 * \sa PSIPTable, TSPacket 24 24 */ 25 25 class PESPacket 26 26 { 27 /// Only handles single TS packet PES packets, for PMT/PAT tables basically28 void InitPESPacket(TSPacket& tspacket)29 {30 if (tspacket.PayloadStart())31 _psiOffset = tspacket.AFCOffset() + tspacket.StartOfFieldPointer();32 else33 {34 LOG(VB_GENERAL, LOG_ERR, "Started PESPacket, but !payloadStart()");35 _psiOffset = tspacket.AFCOffset();36 }37 _pesdata = tspacket.data() + _psiOffset + 1;38 39 _badPacket = true;40 // first check if Length() will return something useful and41 // than check if the packet ends in the first TSPacket42 if ((_pesdata - tspacket.data()) <= (188-3) &&43 (_pesdata + Length() - tspacket.data()) <= (188-3))44 {45 _badPacket = !VerifyCRC();46 }47 }48 49 27 protected: 50 // does not create it's own data 51 PESPacket(const TSPacket* tspacket, bool) 52 : _pesdata(NULL), _fullbuffer(NULL), 53 _ccLast(tspacket->ContinuityCounter()), _allocSize(0) 54 { 55 InitPESPacket(const_cast<TSPacket&>(*tspacket)); 56 _fullbuffer = const_cast<unsigned char*>(tspacket->data()); 57 _pesdataSize = TSPacket::kSize - (_pesdata - _fullbuffer); 58 } 28 /** noop constructor, only for use by derived classes */ 29 PESPacket() 30 { ; } 31 59 32 // does not create it's own data 60 33 PESPacket(const unsigned char *pesdata, bool) 61 34 : _pesdata(const_cast<unsigned char*>(pesdata)), … … class PESPacket 88 61 _pesdata = _fullbuffer + (pkt._pesdata - pkt._fullbuffer); 89 62 } 90 63 91 // may be modified92 PESPacket(const TSPacket& tspacket)93 : _ccLast(tspacket.ContinuityCounter()), _pesdataSize(188)94 { // clone95 InitPESPacket(const_cast<TSPacket&>(tspacket)); // sets _psiOffset96 97 int len = (4*1024) - 256; /* ~4KB */98 _allocSize = len + _psiOffset;99 _fullbuffer = pes_alloc(_allocSize);100 _pesdata = _fullbuffer + _psiOffset + 1;101 memcpy(_fullbuffer, tspacket.data(), TSPacket::kSize);102 }103 104 64 // At this point we should have the entire VCT table in buffer 105 65 // at (buffer - 8), and without the tspacket 4 byte header 106 66 107 67 //if (TableID::TVCT == table_id) 108 68 //VirtualChannelTable vct; 109 69 110 // may be modified111 PESPacket(const TSPacket &tspacket,112 const unsigned char *pesdata, uint pes_size)113 : _ccLast(tspacket.ContinuityCounter()), _pesdataSize(pes_size)114 { // clone115 InitPESPacket(const_cast<TSPacket&>(tspacket)); // sets _psiOffset116 int len = pes_size+4;117 /* make alloc size multiple of 188 */118 _allocSize = ((len+_psiOffset+187)/188)*188;119 _fullbuffer = pes_alloc(_allocSize);120 _pesdata = _fullbuffer + _psiOffset + 1;121 memcpy(_fullbuffer, tspacket.data(), 188);122 memcpy(_pesdata, pesdata, pes_size-1);123 }124 125 70 virtual ~PESPacket() 126 71 { 127 72 if (IsClone()) … … class PESPacket 131 76 _pesdata = NULL; 132 77 } 133 78 134 static const PESPacket View(const TSPacket& tspacket)135 { return PESPacket(&tspacket, false); }136 137 static PESPacket View(TSPacket& tspacket)138 { return PESPacket(&tspacket, false); }139 140 static const PESPacket ViewData(const unsigned char* pesdata)141 { return PESPacket(pesdata, false); }142 143 79 bool IsClone() const { return bool(_allocSize); } 144 80 145 81 // return true if complete or broken