2017-05-29 306 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