Simplified calculating the PTS offset in cPtsFixer::Fix() and fixed the overflow handling of PCR values

This commit is contained in:
Klaus Schmidinger 2012-12-02 14:33:06 +01:00
parent a23a13873f
commit 441bf30032
3 changed files with 8 additions and 10 deletions

View File

@ -2978,6 +2978,8 @@ S
packets that have a payload packets that have a payload
for pointing out that when adjusting the DTS values in the cutter, it hase to compensate for pointing out that when adjusting the DTS values in the cutter, it hase to compensate
for dropped B-frames for dropped B-frames
for simplifying calculating the PTS offset in cPtsFixer::Fix() and fixing the overflow
handling of PCR values
Peter Münster <pmlists@free.fr> Peter Münster <pmlists@free.fr>
for fixing 'make install' to not overwrite existing configuration files for fixing 'make install' to not overwrite existing configuration files

View File

@ -7356,3 +7356,5 @@ Video Disk Recorder Revision History
- Fixed adjusting the DTS values in the cutter, to compensate for dropped B-frames - Fixed adjusting the DTS values in the cutter, to compensate for dropped B-frames
(pointed out by Sören Moch). (pointed out by Sören Moch).
- Fixed a typo in skins.h (thanks to Lars Hanisch). - Fixed a typo in skins.h (thanks to Lars Hanisch).
- Simplified calculating the PTS offset in cPtsFixer::Fix() and fixed the overflow
handling of PCR values (thanks to Sören Moch).

View File

@ -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: cutter.c 2.20 2012/11/29 15:30:01 kls Exp $ * $Id: cutter.c 2.21 2012/12/02 14:30:55 kls Exp $
*/ */
#include "cutter.h" #include "cutter.h"
@ -192,14 +192,8 @@ void cPtsFixer::Fix(uchar *Data, int Length, bool CutIn)
// Determine the PTS offset at the beginning of each sequence (except the first one): // Determine the PTS offset at the beginning of each sequence (except the first one):
if (CutIn && lastPts >= 0) { if (CutIn && lastPts >= 0) {
int64_t Pts = TsGetPts(Data, Length); int64_t Pts = TsGetPts(Data, Length);
if (Pts >= 0) { if (Pts >= 0)
// offset is calculated so that Pts + offset results in lastPts + delta: offset = (lastPts + delta - Pts) & MAX33BIT; // offset is calculated so that Pts + offset results in lastPts + delta
offset = Pts - PtsAdd(lastPts, delta);
if (offset <= 0)
offset = -offset;
else
offset = MAX33BIT + 1 - offset;
}
fixCounters = true; fixCounters = true;
} }
// Keep track of the highest video PTS: // Keep track of the highest video PTS:
@ -262,7 +256,7 @@ void cPtsFixer::Fix(uchar *Data, int Length, bool CutIn)
int64_t Pcr = TsGetPcr(p); int64_t Pcr = TsGetPcr(p);
if (Pcr >= 0) { if (Pcr >= 0) {
int64_t NewPcr = Pcr + offset * PCRFACTOR; int64_t NewPcr = Pcr + offset * PCRFACTOR;
if (NewPcr >= MAX27MHZ) if (NewPcr > MAX27MHZ)
NewPcr -= MAX27MHZ + 1; NewPcr -= MAX27MHZ + 1;
TsSetPcr(p, NewPcr); TsSetPcr(p, NewPcr);
} }