Skip to content

Commit

Permalink
[demuxers/MpegTS] Verify that video track advertised by PMT is presen…
Browse files Browse the repository at this point in the history
…t, fix handling of multiple PMTs sharing the same PID, skip decoding PSI if section syntax indicator is not set
  • Loading branch information
eumagga0x2a committed Jul 24, 2021
1 parent 001404b commit 6e3f289
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 9 deletions.
43 changes: 37 additions & 6 deletions avidemux_plugins/ADM_demuxers/MpegTS/ADM_tsPatPmt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,8 @@ bool TS_scanForPrograms(const char *file,uint32_t *nbTracks, ADM_TS_TRACK **outT
uint32_t len;
TS_PSIpacketInfo psi;
listOfTsTracks list;
std::vector <uint32_t> listOfPmt;
struct pmt { uint32_t pid; uint64_t lastOffset; };
std::vector <pmt> listOfPmt;
ADM_TS_TRACK *tracks=NULL;
*outTracks=NULL;
*nbTracks=0;
Expand Down Expand Up @@ -112,7 +113,12 @@ bool TS_scanForPrograms(const char *file,uint32_t *nbTracks, ADM_TS_TRACK **outT
len-=4;
printf("[TsDemuxer] Pat : Prg:%d Pid: 0x%04x\n",prg,pid);
if(prg) // if prg==0, it is network Pid, dont need it
listOfPmt.push_back(pid);
{
pmt p;
p.pid = pid;
p.lastOffset = offset;
listOfPmt.push_back(p);
}
}
start=list.size();
int size=listOfPmt.size();
Expand All @@ -122,12 +128,24 @@ bool TS_scanForPrograms(const char *file,uint32_t *nbTracks, ADM_TS_TRACK **outT
for(int i=0;i<size;i++) // First PMT is PCR lock ?
{
printf("<<< PMT : %d/%d>>>\n",i,size);
uint32_t pid=listOfPmt[i];
t->setPos(offset); // Seek back to the position where we started to look for PAT
uint32_t pid = listOfPmt[i].pid;
t->setPos(listOfPmt[i].lastOffset);
if(false==TS_scanPmt(t,pid,&list))
continue;
if(list.empty())
continue;
offset = t->getPos();
// Update stored offsets if different PMTs share the same pid.
for(int z=0;z<size;z++)
{
if(pid == listOfPmt[z].pid)
{
pmt p;
p.pid = pid;
p.lastOffset = offset;
listOfPmt[z] = p;
}
}
// Search the video track...
for(int j=start;j<list.size();j++)
{
Expand All @@ -150,7 +168,20 @@ bool TS_scanForPrograms(const char *file,uint32_t *nbTracks, ADM_TS_TRACK **outT
break;
}
}
if(videoIndex!=-1) break;
if(videoIndex!=-1)
{
t->setPos(offset);
TSpacketInfo pkt;
printf("[TS_scanForPrograms] Checking track %d as video track candidate\n",videoIndex);
if(false == t->getNextPacket_NoHeader(list[videoIndex].trackPid,&pkt,false))
{
printf("[TS_scanForPrograms] No packets matching video track pid 0x%x found, skipping PMT\n",list[videoIndex].trackPid);
videoIndex = -1;
continue;
}
printf("[TS_scanForPrograms] Using track %d as video track\n",videoIndex);
break;
}
}
}
if(videoIndex==-1)
Expand Down Expand Up @@ -253,7 +284,7 @@ bool TS_scanPmt(tsPacket *t,uint32_t pid,listOfTsTracks *list)
len=psi.payloadSize;
// We should be protected by CRC here
int packLen=len;
printf("[TsDemuxer] PCR 0x%x, len=%d\n",(r[0]<<8)+r[1],packLen);
printf("[TsDemuxer] PCR 0x%x, len=%d\n",((r[0]<<8)+r[1])&0x1fff,packLen);
r+=2;
int programInfoLength=(r[0]<<8)+r[1];
programInfoLength&=0x3ff;
Expand Down
16 changes: 13 additions & 3 deletions avidemux_plugins/ADM_demuxers/MpegTS/dmxTSPacket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -312,17 +312,27 @@ bool tsPacket::getNextPSI(uint32_t pid,TS_PSIpacketInfo *psi)

DUMMY(tableId,8);
int section_syntax_indicator=bits.get(1);
#ifdef VERBOSE_PSI

if(!section_syntax_indicator)
{
#ifdef VERBOSE_PSI
ADM_warning("Syntax section indicator not set\n");
#endif
goto nextPack2;
}

if(bits.get(1)) // Private bit
{
ADM_warning("Section syntax is set to private\n");
goto nextPack2;
}
bits.get(2); // 2 Reserved bits
sectionLength=bits.get(12); // Section Length
int reserved = bits.get(2); // 2 Reserved bits
if(reserved!=3)
printf("[getNextPSI] Invalid data: reserved bits = %d, should be 3\n",reserved);
int unused = bits.get(2); // 2 unused bits
if(unused)
printf("[getNextPSI] Invalid data: unused bits = %d, should be 0\n",unused);
sectionLength = bits.get(10); // Section Length
#if 1
if(sectionLength+3>pkt.payloadSize)
{
Expand Down

0 comments on commit 6e3f289

Please sign in to comment.