@yume-chan/scrcpy
Version:
TypeScript implementation of Scrcpy.
626 lines • 25.4 kB
JavaScript
// cspell: ignore uvlc
// cspell: ignore interintra
// cspell: ignore superres
// cspell: ignore cdef
// cspell: ignore bitdepth
// cspell: ignore Smpte
// cspell: ignore Chromat
export var AndroidAv1Profile;
(function (AndroidAv1Profile) {
AndroidAv1Profile[AndroidAv1Profile["Main8"] = 1] = "Main8";
AndroidAv1Profile[AndroidAv1Profile["Main10"] = 2] = "Main10";
AndroidAv1Profile[AndroidAv1Profile["Main10Hdr10"] = 4096] = "Main10Hdr10";
AndroidAv1Profile[AndroidAv1Profile["Main10Hdr10Plus"] = 8192] = "Main10Hdr10Plus";
})(AndroidAv1Profile || (AndroidAv1Profile = {}));
export var AndroidAv1Level;
(function (AndroidAv1Level) {
AndroidAv1Level[AndroidAv1Level["Level2"] = 1] = "Level2";
AndroidAv1Level[AndroidAv1Level["Level21"] = 2] = "Level21";
AndroidAv1Level[AndroidAv1Level["Level22"] = 4] = "Level22";
AndroidAv1Level[AndroidAv1Level["Level23"] = 8] = "Level23";
AndroidAv1Level[AndroidAv1Level["Level3"] = 16] = "Level3";
AndroidAv1Level[AndroidAv1Level["Level31"] = 32] = "Level31";
AndroidAv1Level[AndroidAv1Level["Level32"] = 64] = "Level32";
AndroidAv1Level[AndroidAv1Level["Level33"] = 128] = "Level33";
AndroidAv1Level[AndroidAv1Level["Level4"] = 256] = "Level4";
AndroidAv1Level[AndroidAv1Level["Level41"] = 512] = "Level41";
AndroidAv1Level[AndroidAv1Level["Level42"] = 1024] = "Level42";
AndroidAv1Level[AndroidAv1Level["Level43"] = 2048] = "Level43";
AndroidAv1Level[AndroidAv1Level["Level5"] = 4096] = "Level5";
AndroidAv1Level[AndroidAv1Level["Level51"] = 8192] = "Level51";
AndroidAv1Level[AndroidAv1Level["Level52"] = 16384] = "Level52";
AndroidAv1Level[AndroidAv1Level["Level53"] = 32768] = "Level53";
AndroidAv1Level[AndroidAv1Level["Level6"] = 65536] = "Level6";
AndroidAv1Level[AndroidAv1Level["Level61"] = 131072] = "Level61";
AndroidAv1Level[AndroidAv1Level["Level62"] = 262144] = "Level62";
AndroidAv1Level[AndroidAv1Level["Level63"] = 524288] = "Level63";
AndroidAv1Level[AndroidAv1Level["Level7"] = 1048576] = "Level7";
AndroidAv1Level[AndroidAv1Level["Level71"] = 2097152] = "Level71";
AndroidAv1Level[AndroidAv1Level["Level72"] = 4194304] = "Level72";
AndroidAv1Level[AndroidAv1Level["Level73"] = 8388608] = "Level73";
})(AndroidAv1Level || (AndroidAv1Level = {}));
class BitReader {
#data;
#byte;
#bytePosition = 0;
#bitPosition = 7;
get byteAligned() {
return this.#bitPosition === 7;
}
get ended() {
return this.#bytePosition >= this.#data.length;
}
constructor(data) {
this.#data = data;
this.#byte = data[0];
}
f1() {
const value = this.#byte >> this.#bitPosition;
this.#bitPosition -= 1;
if (this.#bitPosition < 0) {
this.#bytePosition += 1;
this.#bitPosition = 7;
this.#byte = this.#data[this.#bytePosition];
}
return value & 1;
}
f(n) {
let value = 0;
for (; n > 0; n -= 1) {
value <<= 1;
value |= this.f1();
}
return value;
}
skip(n) {
if (n <= this.#bitPosition + 1) {
this.#bytePosition += 1;
this.#bitPosition = 7;
this.#byte = this.#data[this.#bytePosition];
return;
}
n -= this.#bitPosition + 1;
this.#bytePosition += 1;
const bytes = (n / 8) | 0;
if (bytes > 0) {
this.#bytePosition += bytes;
n -= bytes * 8;
}
this.#bitPosition = 7 - n;
this.#byte = this.#data[this.#bytePosition];
}
readBytes(n) {
if (!this.byteAligned) {
throw new Error("Bytes must be byte-aligned");
}
const value = this.#data.subarray(this.#bytePosition, this.#bytePosition + n);
this.#bytePosition += n;
this.#byte = this.#data[this.#bytePosition];
return value;
}
getPosition() {
return [this.#bytePosition, this.#bitPosition];
}
setPosition([bytePosition, bitPosition]) {
this.#bytePosition = bytePosition;
this.#bitPosition = bitPosition;
this.#byte = this.#data[bytePosition];
}
}
export class Av1 extends BitReader {
#Leb128Bytes = 0;
uvlc() {
let leadingZeros = 0;
while (!this.f1()) {
leadingZeros += 1;
}
if (leadingZeros >= 32) {
return 2 ** 32 - 1;
}
const value = this.f(leadingZeros);
return value + ((1 << leadingZeros) >>> 0) - 1;
}
leb128() {
if (!this.byteAligned) {
throw new Error("LEB128 must be byte-aligned");
}
let value = 0n;
this.#Leb128Bytes = 0;
for (let i = 0n; i < 8n; i += 1n) {
const leb128_byte = this.f(8);
value |= BigInt(leb128_byte & 0x7f) << (7n * i);
this.#Leb128Bytes += 1;
if ((leb128_byte & 0x80) == 0) {
break;
}
}
return value;
}
*annexBBitstream() {
while (!this.ended) {
const temporal_unit_size = this.leb128();
yield* this.temporalUnit(temporal_unit_size);
}
}
*temporalUnit(sz) {
while (sz > 0) {
const frame_unit_size = this.leb128();
sz -= BigInt(this.#Leb128Bytes);
yield* this.frameUnit(frame_unit_size);
sz -= frame_unit_size;
}
}
*frameUnit(sz) {
while (sz > 0) {
const obu_length = this.leb128();
sz -= BigInt(this.#Leb128Bytes);
const obu = this.openBitstreamUnit(obu_length);
if (obu) {
yield obu;
}
sz -= obu_length;
}
}
#OperatingPointIdc = 0;
openBitstreamUnit(sz) {
const obu_header = this.obuHeader();
let obu_size;
if (obu_header.obu_has_size_field) {
obu_size = this.leb128();
}
else if (sz !== undefined) {
obu_size = sz - 1n - (obu_header.obu_extension_flag ? 1n : 0n);
}
else {
throw new Error("obu_has_size_field must be true");
}
const startPosition = this.getPosition();
if (obu_header.obu_type !== Av1.ObuType.SequenceHeader &&
obu_header.obu_type !== Av1.ObuType.TemporalDelimiter &&
this.#OperatingPointIdc !== 0 &&
obu_header.obu_extension_header) {
const inTemporalLayer = !!(this.#OperatingPointIdc &
(1 << obu_header.obu_extension_header.temporal_id));
const inSpatialLayer = !!(this.#OperatingPointIdc &
(1 << (obu_header.obu_extension_header.spatial_id + 8)));
if (!inTemporalLayer || !inSpatialLayer) {
this.skip(Number(obu_size));
return;
}
}
let sequence_header_obu;
switch (obu_header.obu_type) {
case Av1.ObuType.SequenceHeader:
sequence_header_obu = this.sequenceHeaderObu();
break;
}
const currentPosition = this.getPosition();
const payloadBits = (currentPosition[0] - startPosition[0]) * 8 +
(startPosition[1] - currentPosition[1]);
if (obu_size > 0 /* &&
obu_header.obu_type !== Av1.ObuType.TileGroup &&
obu_header.obu_type !== Av1.ObuType.TileList &&
obu_header.obu_type !== Av1.ObuType.Frame */) {
this.skip(Number(obu_size) * 8 - payloadBits);
}
return {
obu_header,
obu_size,
sequence_header_obu,
};
}
obuHeader() {
const obu_forbidden_bit = !!this.f1();
if (obu_forbidden_bit) {
throw new Error("Invalid data");
}
const obu_type = this.f(4);
const obu_extension_flag = !!this.f1();
const obu_has_size_field = !!this.f1();
this.f1();
let obu_extension_header;
if (obu_extension_flag) {
obu_extension_header = this.obuExtensionHeader();
}
return {
obu_type,
obu_extension_flag,
obu_has_size_field,
obu_extension_header,
};
}
obuExtensionHeader() {
const temporal_id = this.f(3);
const spatial_id = this.f(2);
this.skip(3);
return { temporal_id, spatial_id };
}
static SelectScreenContentTools = 2;
static SelectIntegerMv = 2;
sequenceHeaderObu() {
const seq_profile = this.f(3);
const still_picture = !!this.f1();
const reduced_still_picture_header = !!this.f1();
let timing_info_present_flag = false;
let timing_info;
let decoder_model_info_present_flag = false;
let decoder_model_info;
let initial_display_delay_present_flag = false;
let operating_points_cnt_minus_1 = 0;
const operating_point_idc = [];
const seq_level_idx = [];
const seq_tier = [];
const decoder_model_present_for_this_op = [];
const initial_display_delay_present_for_this_op = [];
let operating_parameters_info;
let initial_display_delay_minus_1;
if (reduced_still_picture_header) {
operating_point_idc[0] = 0;
seq_level_idx[0] = this.f(5);
seq_tier[0] = 0;
decoder_model_present_for_this_op[0] = false;
initial_display_delay_present_for_this_op[0] = false;
}
else {
timing_info_present_flag = !!this.f1();
if (timing_info_present_flag) {
timing_info = this.timingInfo();
decoder_model_info_present_flag = !!this.f1();
if (decoder_model_info_present_flag) {
decoder_model_info = this.decoderModelInfo();
operating_parameters_info = [];
}
}
initial_display_delay_present_flag = !!this.f1();
if (initial_display_delay_present_flag) {
initial_display_delay_minus_1 = [];
}
operating_points_cnt_minus_1 = this.f(5);
for (let i = 0; i <= operating_points_cnt_minus_1; i += 1) {
operating_point_idc[i] = this.f(12);
seq_level_idx[i] = this.f(5);
if (seq_level_idx[i] > 7) {
seq_tier[i] = this.f1();
}
else {
seq_tier[i] = 0;
}
if (decoder_model_info_present_flag) {
decoder_model_present_for_this_op[i] = !!this.f1();
if (decoder_model_present_for_this_op[i]) {
operating_parameters_info[i] =
this.operatingParametersInfo(decoder_model_info);
}
}
else {
decoder_model_present_for_this_op[i] = false;
}
if (initial_display_delay_present_flag) {
initial_display_delay_present_for_this_op[i] = !!this.f1();
if (initial_display_delay_present_for_this_op[i]) {
initial_display_delay_minus_1[i] = this.f(4);
}
}
}
}
const operatingPoint = this.chooseOperatingPoint();
this.#OperatingPointIdc = operating_point_idc[operatingPoint];
const frame_width_bits_minus_1 = this.f(4);
const frame_height_bits_minus_1 = this.f(4);
const max_frame_width_minus_1 = this.f(frame_width_bits_minus_1 + 1);
const max_frame_height_minus_1 = this.f(frame_height_bits_minus_1 + 1);
let frame_id_numbers_present_flag = false;
let delta_frame_id_length_minus_2;
let additional_frame_id_length_minus_1;
if (!reduced_still_picture_header) {
frame_id_numbers_present_flag = !!this.f1();
if (frame_id_numbers_present_flag) {
delta_frame_id_length_minus_2 = this.f(4);
additional_frame_id_length_minus_1 = this.f(3);
}
}
const use_128x128_superblock = !!this.f1();
const enable_filter_intra = !!this.f1();
const enable_intra_edge_filter = !!this.f1();
let enable_interintra_compound = false;
let enable_masked_compound = false;
let enable_warped_motion = false;
let enable_dual_filter = false;
let enable_order_hint = false;
let enable_jnt_comp = false;
let enable_ref_frame_mvs = false;
let seq_choose_screen_content_tools = false;
let seq_force_screen_content_tools = Av1.SelectScreenContentTools;
let seq_choose_integer_mv = false;
let seq_force_integer_mv = Av1.SelectIntegerMv;
let order_hint_bits_minus_1;
// let OrderHintBits = 0;
if (!reduced_still_picture_header) {
enable_interintra_compound = !!this.f1();
enable_masked_compound = !!this.f1();
enable_warped_motion = !!this.f1();
enable_dual_filter = !!this.f1();
enable_order_hint = !!this.f1();
if (enable_order_hint) {
enable_jnt_comp = !!this.f1();
enable_ref_frame_mvs = !!this.f1();
}
seq_choose_screen_content_tools = !!this.f1();
if (!seq_choose_screen_content_tools) {
seq_force_screen_content_tools = this.f1();
}
if (seq_force_screen_content_tools > 0) {
seq_choose_integer_mv = !!this.f1();
if (!seq_choose_integer_mv) {
seq_force_integer_mv = this.f1();
}
}
if (enable_order_hint) {
order_hint_bits_minus_1 = this.f(3);
// OrderHintBits = order_hint_bits_minus_1 + 1;
}
}
const enable_superres = !!this.f1();
const enable_cdef = !!this.f1();
const enable_restoration = !!this.f1();
const color_config = this.colorConfig(seq_profile);
const film_grain_params_present = !!this.f1();
return {
seq_profile,
still_picture,
reduced_still_picture_header,
timing_info_present_flag,
timing_info,
decoder_model_info_present_flag,
decoder_model_info,
initial_display_delay_present_flag,
initial_display_delay_minus_1,
operating_points_cnt_minus_1,
operating_point_idc,
seq_level_idx,
seq_tier,
decoder_model_present_for_this_op,
operating_parameters_info,
initial_display_delay_present_for_this_op,
frame_width_bits_minus_1,
frame_height_bits_minus_1,
max_frame_width_minus_1,
max_frame_height_minus_1,
frame_id_numbers_present_flag,
delta_frame_id_length_minus_2,
additional_frame_id_length_minus_1,
use_128x128_superblock,
enable_filter_intra,
enable_intra_edge_filter,
enable_interintra_compound,
enable_masked_compound,
enable_warped_motion,
enable_dual_filter,
enable_order_hint,
enable_jnt_comp,
enable_ref_frame_mvs,
seq_choose_screen_content_tools,
seq_force_screen_content_tools,
seq_choose_integer_mv,
seq_force_integer_mv,
order_hint_bits_minus_1,
enable_superres,
enable_cdef,
enable_restoration,
color_config,
film_grain_params_present,
};
}
searchSequenceHeaderObu() {
while (!this.ended) {
const obu = this.openBitstreamUnit();
if (!obu) {
continue;
}
if (obu.sequence_header_obu) {
return obu.sequence_header_obu;
}
}
return undefined;
}
timingInfo() {
const num_units_in_display_tick = this.f(32);
const time_scale = this.f(32);
const equal_picture_interval = !!this.f1();
let num_ticks_per_picture_minus_1;
if (equal_picture_interval) {
num_ticks_per_picture_minus_1 = this.uvlc();
}
return {
num_units_in_display_tick,
time_scale,
equal_picture_interval,
num_ticks_per_picture_minus_1,
};
}
decoderModelInfo() {
const buffer_delay_length_minus_1 = this.f(5);
const num_units_in_decoding_tick = this.f(32);
const buffer_removal_time_length_minus_1 = this.f(5);
const frame_presentation_time_length_minus_1 = this.f(5);
return {
buffer_delay_length_minus_1,
num_units_in_decoding_tick,
buffer_removal_time_length_minus_1,
frame_presentation_time_length_minus_1,
};
}
operatingParametersInfo(decoderModelInfo) {
const n = decoderModelInfo.buffer_delay_length_minus_1 + 1;
const decoder_buffer_delay = this.f(n);
const encoder_buffer_delay = this.f(n);
const low_delay_mode_flag = !!this.f1();
return {
decoder_buffer_delay,
encoder_buffer_delay,
low_delay_mode_flag,
};
}
chooseOperatingPoint() {
return 0;
}
colorConfig(seq_profile) {
const high_bitdepth = !!this.f1();
let twelve_bit = false;
let BitDepth = 8;
if (seq_profile === 2 && high_bitdepth) {
twelve_bit = !!this.f1();
BitDepth = twelve_bit ? 12 : 10;
}
else if (seq_profile <= 2) {
BitDepth = high_bitdepth ? 10 : 8;
}
let mono_chrome = false;
if (seq_profile === 1) {
mono_chrome = !!this.f1();
}
// const NumPlanes = mono_chrome ? 1 : 3;
const color_description_present_flag = !!this.f1();
let color_primaries = Av1.ColorPrimaries.Unspecified;
let transfer_characteristics = Av1.TransferCharacteristics.Unspecified;
let matrix_coefficients = Av1.MatrixCoefficients.Unspecified;
if (color_description_present_flag) {
color_primaries = this.f(8);
transfer_characteristics = this.f(8);
matrix_coefficients = this.f(8);
}
let color_range = false;
let subsampling_x;
let subsampling_y;
let chroma_sample_position = 0;
let separate_uv_delta_q = false;
if (mono_chrome) {
color_range = !!this.f1();
subsampling_x = true;
subsampling_y = true;
}
else {
if (color_primaries === Av1.ColorPrimaries.Bt709 &&
transfer_characteristics === Av1.TransferCharacteristics.Srgb &&
matrix_coefficients === Av1.MatrixCoefficients.Identity) {
color_range = true;
subsampling_x = false;
subsampling_y = false;
}
else {
color_range = !!this.f1();
switch (seq_profile) {
case 0:
subsampling_x = true;
subsampling_y = true;
break;
case 1:
subsampling_x = false;
subsampling_y = false;
break;
default:
if (BitDepth == 12) {
subsampling_x = !!this.f1();
if (subsampling_x) {
subsampling_y = !!this.f1();
}
else {
subsampling_y = false;
}
}
else {
subsampling_x = true;
subsampling_y = false;
}
break;
}
if (subsampling_x && subsampling_y) {
chroma_sample_position = this.f(2);
}
}
separate_uv_delta_q = !!this.f1();
}
return {
high_bitdepth,
twelve_bit,
BitDepth,
mono_chrome,
color_description_present_flag,
color_primaries,
transfer_characteristics,
matrix_coefficients,
color_range,
subsampling_x,
subsampling_y,
chroma_sample_position,
separate_uv_delta_q,
};
}
}
(function (Av1) {
let ObuType;
(function (ObuType) {
ObuType[ObuType["SequenceHeader"] = 1] = "SequenceHeader";
ObuType[ObuType["TemporalDelimiter"] = 2] = "TemporalDelimiter";
ObuType[ObuType["FrameHeader"] = 3] = "FrameHeader";
ObuType[ObuType["TileGroup"] = 4] = "TileGroup";
ObuType[ObuType["Metadata"] = 5] = "Metadata";
ObuType[ObuType["Frame"] = 6] = "Frame";
ObuType[ObuType["RedundantFrameHeader"] = 7] = "RedundantFrameHeader";
ObuType[ObuType["TileList"] = 8] = "TileList";
ObuType[ObuType["Padding"] = 15] = "Padding";
})(ObuType = Av1.ObuType || (Av1.ObuType = {}));
let ColorPrimaries;
(function (ColorPrimaries) {
ColorPrimaries[ColorPrimaries["Bt709"] = 1] = "Bt709";
ColorPrimaries[ColorPrimaries["Unspecified"] = 2] = "Unspecified";
ColorPrimaries[ColorPrimaries["Bt470M"] = 4] = "Bt470M";
ColorPrimaries[ColorPrimaries["Bt470BG"] = 5] = "Bt470BG";
ColorPrimaries[ColorPrimaries["Bt601"] = 6] = "Bt601";
ColorPrimaries[ColorPrimaries["Smpte240"] = 7] = "Smpte240";
ColorPrimaries[ColorPrimaries["GenericFilm"] = 8] = "GenericFilm";
ColorPrimaries[ColorPrimaries["Bt2020"] = 9] = "Bt2020";
ColorPrimaries[ColorPrimaries["Xyz"] = 10] = "Xyz";
ColorPrimaries[ColorPrimaries["Smpte431"] = 11] = "Smpte431";
ColorPrimaries[ColorPrimaries["Smpte432"] = 12] = "Smpte432";
ColorPrimaries[ColorPrimaries["Ebu3213"] = 22] = "Ebu3213";
})(ColorPrimaries = Av1.ColorPrimaries || (Av1.ColorPrimaries = {}));
let TransferCharacteristics;
(function (TransferCharacteristics) {
TransferCharacteristics[TransferCharacteristics["Bt709"] = 1] = "Bt709";
TransferCharacteristics[TransferCharacteristics["Unspecified"] = 2] = "Unspecified";
TransferCharacteristics[TransferCharacteristics["Bt470M"] = 4] = "Bt470M";
TransferCharacteristics[TransferCharacteristics["Bt470BG"] = 5] = "Bt470BG";
TransferCharacteristics[TransferCharacteristics["Bt601"] = 6] = "Bt601";
TransferCharacteristics[TransferCharacteristics["Smpte240"] = 7] = "Smpte240";
TransferCharacteristics[TransferCharacteristics["Linear"] = 8] = "Linear";
TransferCharacteristics[TransferCharacteristics["Log100"] = 9] = "Log100";
TransferCharacteristics[TransferCharacteristics["Log100Sqrt10"] = 10] = "Log100Sqrt10";
TransferCharacteristics[TransferCharacteristics["Iec61966"] = 11] = "Iec61966";
TransferCharacteristics[TransferCharacteristics["Bt1361"] = 12] = "Bt1361";
TransferCharacteristics[TransferCharacteristics["Srgb"] = 13] = "Srgb";
TransferCharacteristics[TransferCharacteristics["Bt2020Ten"] = 14] = "Bt2020Ten";
TransferCharacteristics[TransferCharacteristics["Bt2020Twelve"] = 15] = "Bt2020Twelve";
TransferCharacteristics[TransferCharacteristics["Smpte2084"] = 16] = "Smpte2084";
TransferCharacteristics[TransferCharacteristics["Smpte428"] = 17] = "Smpte428";
TransferCharacteristics[TransferCharacteristics["Hlg"] = 18] = "Hlg";
})(TransferCharacteristics = Av1.TransferCharacteristics || (Av1.TransferCharacteristics = {}));
let MatrixCoefficients;
(function (MatrixCoefficients) {
MatrixCoefficients[MatrixCoefficients["Identity"] = 0] = "Identity";
MatrixCoefficients[MatrixCoefficients["Bt709"] = 1] = "Bt709";
MatrixCoefficients[MatrixCoefficients["Unspecified"] = 2] = "Unspecified";
MatrixCoefficients[MatrixCoefficients["Fcc"] = 4] = "Fcc";
MatrixCoefficients[MatrixCoefficients["Bt470BG"] = 5] = "Bt470BG";
MatrixCoefficients[MatrixCoefficients["Bt601"] = 6] = "Bt601";
MatrixCoefficients[MatrixCoefficients["Smpte240"] = 7] = "Smpte240";
MatrixCoefficients[MatrixCoefficients["YCgCo"] = 8] = "YCgCo";
MatrixCoefficients[MatrixCoefficients["Bt2020Ncl"] = 9] = "Bt2020Ncl";
MatrixCoefficients[MatrixCoefficients["Bt2020Cl"] = 10] = "Bt2020Cl";
MatrixCoefficients[MatrixCoefficients["Smpte2085"] = 11] = "Smpte2085";
MatrixCoefficients[MatrixCoefficients["ChromatNcl"] = 12] = "ChromatNcl";
MatrixCoefficients[MatrixCoefficients["ChromatCl"] = 13] = "ChromatCl";
MatrixCoefficients[MatrixCoefficients["ICtCp"] = 14] = "ICtCp";
})(MatrixCoefficients = Av1.MatrixCoefficients || (Av1.MatrixCoefficients = {}));
})(Av1 || (Av1 = {}));
//# sourceMappingURL=av1.js.map