From 1207dd676e1ccba66d4fad4e32db232022daee7e Mon Sep 17 00:00:00 2001 From: mangui Date: Mon, 20 Jul 2015 14:44:51 +0200 Subject: [PATCH] tsdemuxer: fix playback stuck for long stream (VoD/live) PTS/DTS is becoming negative after (2^31/90000) seconds = 6,62hour don't use bitwise operator in JS (which converts everything to signed int32), as PTS/DTS is 33 bit ... --- src/demux/tsdemuxer.js | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/demux/tsdemuxer.js b/src/demux/tsdemuxer.js index 33d869d2587..ad781cd000d 100644 --- a/src/demux/tsdemuxer.js +++ b/src/demux/tsdemuxer.js @@ -186,18 +186,20 @@ pesLen = (frag[4] << 8) + frag[5]; pesFlags = frag[7]; if (pesFlags & 0xC0) { - // PES header described here : http://dvd.sourceforge.net/dvdinfo/pes-hdr.html - pesPts = (frag[9] & 0x0E) << 29 - | (frag[10] & 0xFF) << 22 - | (frag[11] & 0xFE) << 14 - | (frag[12] & 0xFF) << 7 - | (frag[13] & 0xFE) >>> 1; + /* PES header described here : http://dvd.sourceforge.net/dvdinfo/pes-hdr.html + as PTS / DTS is 33 bit we cannot use bitwise operator in JS, + as Bitwise operators treat their operands as a sequence of 32 bits */ + pesPts = (frag[9] & 0x0E)*536870912 // 1 << 29 + + (frag[10] & 0xFF)*4194304 // 1 << 22 + + (frag[11] & 0xFE)*16384 // 1 << 14 + + (frag[12] & 0xFF)*128 // 1 << 7 + + (frag[13] & 0xFE)/2; if (pesFlags & 0x40) { - pesDts = (frag[14] & 0x0E ) << 29 - | (frag[15] & 0xFF ) << 22 - | (frag[16] & 0xFE ) << 14 - | (frag[17] & 0xFF ) << 7 - | (frag[18] & 0xFE ) >>> 1; + pesDts = (frag[14] & 0x0E )*536870912 // 1 << 29 + + (frag[15] & 0xFF )*4194304 // 1 << 22 + + (frag[16] & 0xFE )*16384 // 1 << 14 + + (frag[17] & 0xFF )*128 // 1 << 7 + + (frag[18] & 0xFE )/2; } else { pesDts = pesPts; }