1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Fixed handling the 'pointer field' in generating and parsing PAT/PMT

This commit is contained in:
Klaus Schmidinger 2008-12-20 10:46:53 +01:00
parent 051f0def47
commit 5cbc33d897
3 changed files with 15 additions and 4 deletions

View File

@ -2201,6 +2201,7 @@ Frank Schmirler <vdr@schmirler.de>
for making entering text via the numeric keys check the characters against the for making entering text via the numeric keys check the characters against the
allowed characters allowed characters
for fixing handling address masks in SVDRP host settings for fixing handling address masks in SVDRP host settings
for fixing handling the 'pointer field' in generating and parsing PAT/PMT
Jörn Reder <joern@zyn.de> Jörn Reder <joern@zyn.de>
for reporting that a recording may unnecessarily block a device with a CAM, while for reporting that a recording may unnecessarily block a device with a CAM, while

View File

@ -5849,6 +5849,8 @@ Video Disk Recorder Revision History
the patch from ftp://ftp.cadsoft.de/vdr/Developer/av7110_v4ldvb_api5_audiobuf_test_1.diff the patch from ftp://ftp.cadsoft.de/vdr/Developer/av7110_v4ldvb_api5_audiobuf_test_1.diff
to the driver (thanks to Oliver Endriss). to the driver (thanks to Oliver Endriss).
2008-12-17: Version 1.7.3 2008-12-20: Version 1.7.3
- Updated the Russian OSD texts (thanks to Oleg Roitburd). - Updated the Russian OSD texts (thanks to Oleg Roitburd).
- Fixed handling the 'pointer field' in generating and parsing PAT/PMT (thanks to
Frank Schmirler).

14
remux.c
View File

@ -11,7 +11,7 @@
* The cRepacker family's code was originally written by Reinhard Nissl <rnissl@gmx.de>, * The cRepacker family's code was originally written by Reinhard Nissl <rnissl@gmx.de>,
* and adapted to the VDR coding style by Klaus.Schmidinger@cadsoft.de. * and adapted to the VDR coding style by Klaus.Schmidinger@cadsoft.de.
* *
* $Id: remux.c 2.2 2008/12/13 14:30:15 kls Exp $ * $Id: remux.c 2.3 2008/12/20 10:38:47 kls Exp $
*/ */
#include "remux.h" #include "remux.h"
@ -2298,6 +2298,7 @@ void cPatPmtGenerator::GeneratePat(void)
p[i++] = 0x40; // flags (3), pid hi (5) p[i++] = 0x40; // flags (3), pid hi (5)
p[i++] = 0x00; // pid lo p[i++] = 0x00; // pid lo
p[i++] = 0x10; // flags (4), continuity counter (4) p[i++] = 0x10; // flags (4), continuity counter (4)
p[i++] = 0x00; // pointer field (payload unit start indicator is set)
int PayloadStart = i; int PayloadStart = i;
p[i++] = 0x00; // table id p[i++] = 0x00; // table id
p[i++] = 0xB0; // section syntax indicator (1), dummy (3), section length hi (4) p[i++] = 0xB0; // section syntax indicator (1), dummy (3), section length hi (4)
@ -2367,13 +2368,18 @@ void cPatPmtGenerator::GeneratePmt(tChannelID ChannelID)
MakeCRC(buf + i, buf, i); MakeCRC(buf + i, buf, i);
// split the PMT section into several TS packets: // split the PMT section into several TS packets:
uchar *q = buf; uchar *q = buf;
bool pusi = true;
while (i > 0) { while (i > 0) {
uchar *p = pmt[numPmtPackets++]; uchar *p = pmt[numPmtPackets++];
int j = 0; int j = 0;
p[j++] = 0x47; // TS indicator p[j++] = 0x47; // TS indicator
p[j++] = 0x40 | (P_PNR >> 8); // flags (3), pid hi (5) p[j++] = (pusi ? 0x40 : 0x00) | (P_PNR >> 8); // flags (3), pid hi (5)
p[j++] = P_PNR & 0xFF; // pid lo p[j++] = P_PNR & 0xFF; // pid lo
p[j++] = 0x10; // flags (4), continuity counter (4) p[j++] = 0x10; // flags (4), continuity counter (4)
if (pusi) {
p[j++] = 0x00; // pointer field (payload unit start indicator is set)
pusi = false;
}
int l = TS_SIZE - j; int l = TS_SIZE - j;
memcpy(p + j, q, l); memcpy(p + j, q, l);
q += l; q += l;
@ -2412,6 +2418,7 @@ cPatPmtParser::cPatPmtParser(void)
void cPatPmtParser::ParsePat(const uchar *Data, int Length) void cPatPmtParser::ParsePat(const uchar *Data, int Length)
{ {
// The PAT is always assumed to fit into a single TS packet // The PAT is always assumed to fit into a single TS packet
Data += Data[0] + 1; // process pointer_field
SI::PAT Pat(Data, false); SI::PAT Pat(Data, false);
if (Pat.CheckCRCAndParse()) { if (Pat.CheckCRCAndParse()) {
dbgpatpmt("PAT: TSid = %d, c/n = %d, v = %d, s = %d, ls = %d\n", Pat.getTransportStreamId(), Pat.getCurrentNextIndicator(), Pat.getVersionNumber(), Pat.getSectionNumber(), Pat.getLastSectionNumber()); dbgpatpmt("PAT: TSid = %d, c/n = %d, v = %d, s = %d, ls = %d\n", Pat.getTransportStreamId(), Pat.getCurrentNextIndicator(), Pat.getVersionNumber(), Pat.getSectionNumber(), Pat.getLastSectionNumber());
@ -2432,7 +2439,8 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
{ {
// The PMT may extend over several TS packets, so we need to assemble them // The PMT may extend over several TS packets, so we need to assemble them
if (pmtSize == 0) { if (pmtSize == 0) {
// this is the first packet Data += Data[0] + 1; // this is the first packet
Length -= Data[0] + 1;
if (SectionLength(Data, Length) > Length) { if (SectionLength(Data, Length) > Length) {
if (Length <= int(sizeof(pmt))) { if (Length <= int(sizeof(pmt))) {
memcpy(pmt, Data, Length); memcpy(pmt, Data, Length);