Files
moeplayer/source/org/mangui/hls/demux/PES.as
T
2020-09-17 18:40:01 +08:00

82 lines
3.2 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;
/** Representation of a Packetized Elementary Stream. **/
public class PES {
/** The PES data (including headers). **/
public var data : ByteArray;
/** PES prefix **/
public var prefix : uint;
/** Start of the payload. **/
public var payload : uint;
/** Timestamp from the PTS header. **/
public var pts : Number;
/** Timestamp from the DTS header. **/
public var dts : Number;
/** PES packet len **/
public var len : int;
/** PES packet len **/
public var payload_len : int;
/** Save the first chunk of PES data. **/
public function PES(dat : ByteArray) {
data = dat;
parse();
};
/** When all data is appended, parse the PES headers. **/
private function parse() : void {
data.position = 0;
// Start code prefix and packet ID.
prefix = data.readUnsignedInt();
// read len
len = data.readUnsignedShort();
// Ignore marker bits.
data.position += 1;
// Check for PTS
var flags : uint = (data.readUnsignedByte() & 192) >> 6;
// Check PES header length
var length : uint = data.readUnsignedByte();
if (flags == 2 || flags == 3) {
// Grab the timestamp from PTS data (spread out over 5 bytes):
// XXXX---X -------- -------X -------- -------X
var _pts : Number = Number((data.readUnsignedByte() & 0x0e)) * Number(1 << 29) + Number((data.readUnsignedShort() >> 1) << 15) + Number((data.readUnsignedShort() >> 1));
// check if greater than 2^32 -1
if (_pts > 4294967295) {
// decrement 2^33
_pts -= 8589934592;
}
length -= 5;
var _dts : Number = _pts;
if (flags == 3) {
// Grab the DTS (like PTS)
_dts = Number((data.readUnsignedByte() & 0x0e)) * Number(1 << 29) + Number((data.readUnsignedShort() >> 1) << 15) + Number((data.readUnsignedShort() >> 1));
// check if greater than 2^32 -1
if (_dts > 4294967295) {
// decrement 2^33
_dts -= 8589934592;
}
length -= 5;
}
pts = Math.round(_pts / 90);
dts = Math.round(_dts / 90);
// CONFIG::LOGGING {
// Log.info("pts/dts: " + pts + "/"+ dts);
// }
}
// Skip other header data and parse payload.
data.position += length;
payload = data.position;
if (len) {
payload_len = len - data.position + 6;
} else {
payload_len = 0;
}
};
}
}