MCPcopy Create free account
hub / github.com/Vanilagy/webcodecs-polyfill / extractAv1CodecInfoFromPacket

Function extractAv1CodecInfoFromPacket

src/codec_data.ts:1259–1475  ·  view source on GitHub ↗
(
	packet: Uint8Array,
)

Source from the content-addressed store, hash-verified

1257 * into the AV1 bitstream.
1258 */
1259export const extractAv1CodecInfoFromPacket = (
1260 packet: Uint8Array,
1261): Av1CodecInfo | null => {
1262 // https://aomediacodec.github.io/av1-spec/av1-spec.pdf
1263
1264 for (const { type, data } of iterateAv1PacketObus(packet)) {
1265 if (type !== 1) {
1266 continue; // 1 == OBU_SEQUENCE_HEADER
1267 }
1268
1269 const bitstream = new Bitstream(data);
1270
1271 // Read sequence header fields
1272 const seqProfile = bitstream.readBits(3);
1273
1274 // eslint-disable-next-line @typescript-eslint/no-unused-vars
1275 const stillPicture = bitstream.readBits(1);
1276
1277 const reducedStillPictureHeader = bitstream.readBits(1);
1278
1279 let seqLevel = 0;
1280 let seqTier = 0;
1281 let bufferDelayLengthMinus1 = 0;
1282
1283 if (reducedStillPictureHeader) {
1284 seqLevel = bitstream.readBits(5);
1285 } else {
1286 // Parse timing_info_present_flag
1287 const timingInfoPresentFlag = bitstream.readBits(1);
1288
1289 if (timingInfoPresentFlag) {
1290 // Skip timing info (num_units_in_display_tick, time_scale, equal_picture_interval)
1291 bitstream.skipBits(32); // num_units_in_display_tick
1292 bitstream.skipBits(32); // time_scale
1293 const equalPictureInterval = bitstream.readBits(1);
1294
1295 if (equalPictureInterval) {
1296 // Skip num_ticks_per_picture_minus_1 (uvlc)
1297 // Since this is variable length, we'd need to implement uvlc reading
1298 // For now, we'll return null as this is rare
1299 return null;
1300 }
1301 }
1302
1303 // Parse decoder_model_info_present_flag
1304 const decoderModelInfoPresentFlag = bitstream.readBits(1);
1305
1306 if (decoderModelInfoPresentFlag) {
1307 // Store buffer_delay_length_minus_1 instead of just skipping
1308 bufferDelayLengthMinus1 = bitstream.readBits(5);
1309 bitstream.skipBits(32); // num_units_in_decoding_tick
1310 bitstream.skipBits(5); // buffer_removal_time_length_minus_1
1311 bitstream.skipBits(5); // frame_presentation_time_length_minus_1
1312 }
1313
1314 // Parse operating_points_cnt_minus_1
1315 const operatingPointsCntMinus1 = bitstream.readBits(5);
1316

Callers 1

outputChunkMethod · 0.85

Calls 2

readBitsMethod · 0.95
skipBitsMethod · 0.95

Tested by

no test coverage detected