60 lines
1.8 KiB
ActionScript
60 lines
1.8 KiB
ActionScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
package org.mangui.hls.demux {
|
|
import flash.utils.ByteArray;
|
|
public class ExpGolomb {
|
|
private var _data : ByteArray;
|
|
private var _bit : int;
|
|
private var _curByte : uint;
|
|
|
|
public function ExpGolomb(data : ByteArray) {
|
|
_data = data;
|
|
_bit = -1;
|
|
}
|
|
|
|
private function _readBit() : uint {
|
|
var res : uint;
|
|
if (_bit == -1) {
|
|
// read next
|
|
_curByte = _data.readByte();
|
|
_bit = 7;
|
|
}
|
|
res = _curByte & (1 << _bit) ? 1 : 0;
|
|
_bit--;
|
|
return res;
|
|
}
|
|
|
|
public function readBoolean() : Boolean {
|
|
return (_readBit() == 1);
|
|
}
|
|
|
|
public function readBits(nbBits : uint) : int {
|
|
var val : int = 0;
|
|
for (var i : uint = 0; i < nbBits; ++i)
|
|
val = (val << 1) + _readBit();
|
|
return val;
|
|
}
|
|
|
|
public function readUE() : uint {
|
|
var nbZero : uint = 0;
|
|
while (_readBit() == 0)
|
|
++nbZero;
|
|
var x : uint = readBits(nbZero);
|
|
return x + (1 << nbZero) - 1;
|
|
}
|
|
|
|
public function readSE() : uint {
|
|
var value : int = readUE();
|
|
// the number is odd if the low order bit is set
|
|
if (0x01 & value) {
|
|
// add 1 to make it even, and divide by 2
|
|
return (1 + value) >> 1;
|
|
} else {
|
|
// divide by two then make it negative
|
|
return -1 * (value >> 1);
|
|
}
|
|
}
|
|
}
|
|
}
|