2017-05-29 302 views
-1

在程序流中,我得到了第一个PTS值为“4295626096”且值为648000的pes包,下一个包的pts值比第一个包小得多。有些PES包值如下: 瘟packet1:分4295626096 DTS 648000. 瘟packet2:分651600. 瘟packet3:分655200. 瘟packet4:分4295636896和DTS 658800. 瘟packet5:分662400. 瘟packet6 :分666000. 瘟packet7:分4295647696和DTS 669600. 瘟packet8:分673200. 瘟packet9:分676800. 瘟packet10:分429565896和DTS 680400. 和下一包点是684000,687600,702000,694800, 698400 ......现在看起来不错。如何处理程序流中的PTS/DTS/SCR值的溢出情况

当我对此进行搜索时,发现如果SCR/PTS/DTS的33位值为1,这是溢出的情况,但我在标准中找不到相同的值。

任何人都可以解释发生溢出情况时的情况以及如何处理溢出情况(以获得正确的时间戳)以获得正确的PTS值。

回答

0

谁说第33位是溢出是不正确的。你需要做的是转换为单调的时间戳通过累加当前时间戳和以前的时间戳

之间的区别在C++:

int64_t subtract_timestamp(int64_t previous, int64_t current) 
{ 
    int64_t diff = current - previous; 

    if ((0x1FFFFFFFF/2) < -diff) { 
     return (0x1FFFFFFFF - previous) + current; 
    } 

    return diff; 
} 

int64_t previous = 0; 
int64_t my_timestamp = 0; 

void my_function(int64_t dts) { 
    my_timestamp += subtract_timestamp(previous, dts); 
    previous = dts; 
} 
+0

感谢szatmary。我对你的代码有两个疑问。 1.您想通过将可能的pts/dts max_value 0x1FFFFFFFF除以2 [if((0x1FFFFFFFF/2)<-diff)]来检查什么? 2.什么是[int64_t diff = timestamp - current;]代码段的时间戳。 – Vivek

+0

您缺少的边缘情况是非单调输入。如果previous和2是1,那么它不是一个溢出,它是一个非单调的时间戳。在这种情况下,此代码将返回-1,从而允许您处理该错误。我们正在检查的是,当它从X到Y时,它覆盖了超过50%的数字线。如果是这样,这是一个错误,而不是翻转(这是时间戳的标准做法) – szatmary

+0

对不起。 (我在通勤列车上写的这个)固定。 – szatmary