Browse Source
A quick translation of h264-stream
A quick translation of h264-stream
Map over H264Stream from action script and get it passing JSLint. There are still plenty of pieces which are definitely busted. Stub ExpGolomb out for now.pull/80/head

2 changed files with 563 additions and 3 deletions
-
141src/exp-golomb.js
-
425src/h264-stream.js
@ -0,0 +1,141 @@ |
|||||
|
(function() { |
||||
|
|
||||
|
window.videojs.hls.ExpGolomb = function() {}; |
||||
|
|
||||
|
/* |
||||
|
public class ExpGolomb |
||||
|
{ |
||||
|
private var workingData:ByteArray; |
||||
|
private var workingWord:uint; |
||||
|
private var workingbBitsAvailable:uint; |
||||
|
|
||||
|
public function ExpGolomb(pData:ByteArray) |
||||
|
{ |
||||
|
workingData = pData; |
||||
|
workingData.position = 0; |
||||
|
loadWord(); |
||||
|
} |
||||
|
|
||||
|
public function length():uint |
||||
|
{ |
||||
|
return ( 8 * workingData.length ); |
||||
|
} |
||||
|
|
||||
|
public function bitsAvailable():uint |
||||
|
{ |
||||
|
return ( 8 * workingData.bytesAvailable ) + workingbBitsAvailable; |
||||
|
} |
||||
|
|
||||
|
private function loadWord():void |
||||
|
{ |
||||
|
workingWord = 0; workingbBitsAvailable = 0; |
||||
|
switch( workingData.bytesAvailable ) |
||||
|
{ |
||||
|
case 0: workingbBitsAvailable = 0; break; |
||||
|
default: // not 0, but greater than 4
|
||||
|
case 4: workingWord = workingData.readUnsignedByte(); workingbBitsAvailable = 8; |
||||
|
case 3: workingWord = ( workingWord << 8 ) | workingData.readUnsignedByte(); workingbBitsAvailable += 8; |
||||
|
case 2: workingWord = ( workingWord << 8 ) | workingData.readUnsignedByte(); workingbBitsAvailable += 8; |
||||
|
case 1: workingWord = ( workingWord << 8 ) | workingData.readUnsignedByte(); workingbBitsAvailable += 8; |
||||
|
} |
||||
|
|
||||
|
workingWord <<= (32 - workingbBitsAvailable); |
||||
|
} |
||||
|
|
||||
|
public function skipBits(size:int):void |
||||
|
{ |
||||
|
if ( workingbBitsAvailable > size ) |
||||
|
{ |
||||
|
workingWord <<= size; |
||||
|
workingbBitsAvailable -= size; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
size -= workingbBitsAvailable; |
||||
|
var skipBytes:int = size / 8; |
||||
|
|
||||
|
size -= ( skipBytes * 8 ); |
||||
|
workingData.position += skipBytes; |
||||
|
|
||||
|
loadWord(); |
||||
|
|
||||
|
workingWord <<= size; |
||||
|
workingbBitsAvailable -= size; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function readBits(size:int):uint |
||||
|
{ |
||||
|
// if ( 32 < size )
|
||||
|
// throw new Error("Can not read more than 32 bits at a time");
|
||||
|
|
||||
|
var bits:uint = ( workingbBitsAvailable < size ? workingbBitsAvailable : size); |
||||
|
var valu:uint = workingWord >>> (32 - bits); |
||||
|
|
||||
|
workingbBitsAvailable -= bits; |
||||
|
if ( 0 < workingbBitsAvailable ) |
||||
|
workingWord <<= bits; |
||||
|
else |
||||
|
loadWord(); |
||||
|
|
||||
|
bits = size - bits; |
||||
|
if ( 0 < bits ) |
||||
|
return valu << bits | readBits( bits ); |
||||
|
else |
||||
|
return valu; |
||||
|
} |
||||
|
|
||||
|
private function skipLeadingZeros():uint |
||||
|
{ |
||||
|
for( var clz:uint = 0 ; clz < workingbBitsAvailable ; ++clz ) |
||||
|
{ |
||||
|
if( 0 != ( workingWord & ( 0x80000000 >>> clz ) ) ) |
||||
|
{ |
||||
|
workingWord <<= clz; |
||||
|
workingbBitsAvailable -= clz; |
||||
|
return clz; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
loadWord(); // we exhausted workingWord and still have not found a 1
|
||||
|
return clz + skipLeadingZeros(); |
||||
|
} |
||||
|
|
||||
|
public function skipUnsignedExpGolomb():void |
||||
|
{ |
||||
|
skipBits(1 + skipLeadingZeros() ); |
||||
|
} |
||||
|
|
||||
|
public function skipExpGolomb():void |
||||
|
{ |
||||
|
skipBits(1 + skipLeadingZeros() ); |
||||
|
} |
||||
|
|
||||
|
public function readUnsignedExpGolomb():uint |
||||
|
{ |
||||
|
var clz:uint = skipLeadingZeros(); |
||||
|
return readBits(clz+1) - 1; |
||||
|
} |
||||
|
|
||||
|
public function readExpGolomb():int |
||||
|
{ |
||||
|
var valu:int = readUnsignedExpGolomb(); |
||||
|
if ( 0x01 & valu ) // the number is odd if the low order bit is set
|
||||
|
return (1 + valu) >>> 1; // add 1 to make it even, and devide by 2
|
||||
|
else |
||||
|
return -1 * (valu >>> 1); // devide by two then make it negative
|
||||
|
} |
||||
|
|
||||
|
// Some convenience functions
|
||||
|
public function readBoolean():Boolean |
||||
|
{ |
||||
|
return 1 == readBits(1); |
||||
|
} |
||||
|
|
||||
|
public function readUnsignedByte():int |
||||
|
{ |
||||
|
return readBits(8); |
||||
|
} |
||||
|
} |
||||
|
*/ |
||||
|
})(); |
Write
Preview
Loading…
Cancel
Save
Reference in new issue