( packet: Uint8Array, )
| 1257 | * into the AV1 bitstream. |
| 1258 | */ |
| 1259 | export 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 |
no test coverage detected