mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Fixed detecting frames in case there are multiple frames per payload unit
This commit is contained in:
parent
e24aa0aa1a
commit
5b4e1fa793
18
remux.c
18
remux.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: remux.c 2.69 2012/11/06 10:59:39 kls Exp $
|
* $Id: remux.c 2.70 2012/11/13 10:00:00 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "remux.h"
|
#include "remux.h"
|
||||||
@ -991,16 +991,25 @@ cMpeg2Parser::cMpeg2Parser(void)
|
|||||||
int cMpeg2Parser::Parse(const uchar *Data, int Length, int Pid)
|
int cMpeg2Parser::Parse(const uchar *Data, int Length, int Pid)
|
||||||
{
|
{
|
||||||
newFrame = independentFrame = false;
|
newFrame = independentFrame = false;
|
||||||
|
bool SeenPayloadStart = false;
|
||||||
cTsPayload tsPayload(const_cast<uchar *>(Data), Length, Pid);
|
cTsPayload tsPayload(const_cast<uchar *>(Data), Length, Pid);
|
||||||
if (TsPayloadStart(Data)) {
|
if (TsPayloadStart(Data)) {
|
||||||
|
SeenPayloadStart = true;
|
||||||
tsPayload.SkipPesHeader();
|
tsPayload.SkipPesHeader();
|
||||||
scanner = EMPTY_SCANNER;
|
scanner = EMPTY_SCANNER;
|
||||||
if (debug && seenIndependentFrame)
|
if (debug && seenIndependentFrame)
|
||||||
dbgframes("/");
|
dbgframes("/");
|
||||||
}
|
}
|
||||||
|
uint32_t OldScanner = scanner; // need to remember it in case of multiple frames per payload
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
if (!SeenPayloadStart && tsPayload.AtTsStart())
|
||||||
|
OldScanner = scanner;
|
||||||
scanner = (scanner << 8) | tsPayload.GetByte();
|
scanner = (scanner << 8) | tsPayload.GetByte();
|
||||||
if (scanner == 0x00000100) { // Picture Start Code
|
if (scanner == 0x00000100) { // Picture Start Code
|
||||||
|
if (!SeenPayloadStart && tsPayload.GetLastIndex() > TS_SIZE) {
|
||||||
|
scanner = OldScanner;
|
||||||
|
return tsPayload.Used() - TS_SIZE;
|
||||||
|
}
|
||||||
newFrame = true;
|
newFrame = true;
|
||||||
tsPayload.GetByte();
|
tsPayload.GetByte();
|
||||||
uchar FrameType = (tsPayload.GetByte() >> 3) & 0x07;
|
uchar FrameType = (tsPayload.GetByte() >> 3) & 0x07;
|
||||||
@ -1314,11 +1323,10 @@ int cFrameDetector::Analyze(const uchar *Data, int Length)
|
|||||||
if (TsHasPayload(Data) && !TsIsScrambled(Data)) {
|
if (TsHasPayload(Data) && !TsIsScrambled(Data)) {
|
||||||
int Pid = TsPid(Data);
|
int Pid = TsPid(Data);
|
||||||
if (Pid == pid) {
|
if (Pid == pid) {
|
||||||
if (TsPayloadStart(Data)) {
|
if (Processed)
|
||||||
if (Processed)
|
return Processed;
|
||||||
return Processed;
|
if (TsPayloadStart(Data))
|
||||||
scanning = true;
|
scanning = true;
|
||||||
}
|
|
||||||
if (scanning) {
|
if (scanning) {
|
||||||
// Detect the beginning of a new frame:
|
// Detect the beginning of a new frame:
|
||||||
if (TsPayloadStart(Data)) {
|
if (TsPayloadStart(Data)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user