From 8d5c5e82de1e8d6de9965ffd9c805fc08054dfa8 Mon Sep 17 00:00:00 2001 From: Paul Gregoire Date: Sun, 21 Jul 2024 15:09:16 -0700 Subject: [PATCH] Refactored AV1 packetize --- .../main/java/org/red5/io/obu/OBUParser.java | 59 --------- .../java/org/red5/io/rtp/AV1Packetizer.java | 124 ++++++------------ .../java/org/red5/io/obu/OBUParserTest.java | 45 +++++-- 3 files changed, 73 insertions(+), 155 deletions(-) diff --git a/io/src/main/java/org/red5/io/obu/OBUParser.java b/io/src/main/java/org/red5/io/obu/OBUParser.java index 2ed4fbceb..17d4d5395 100644 --- a/io/src/main/java/org/red5/io/obu/OBUParser.java +++ b/io/src/main/java/org/red5/io/obu/OBUParser.java @@ -2044,63 +2044,4 @@ public static boolean obuHasSize(byte obuHeader) { return (obuHeader & OBU_SIZE_PRESENT_BIT) != 0; } - public static int readUVarint(ByteBuffer buffer) { - int value = 0; - int shift = 0; - while (buffer.hasRemaining()) { - byte b = buffer.get(); - value |= (b & 0x7F) << shift; - if ((b & LEB128.MSB_BITMASK) == 0) { - return value; - } - shift += 7; - if (shift >= 64) { - return -1; // overflow - } - } - return -1; // incomplete - } - - public static int[] readUVarint(byte[] buffer) { - // index 0 is the value, index 1 is the number of bytes read - int[] result = new int[] { 0, -1 }; - int shift = 0; - for (int i = 0; i < buffer.length; i++) { - byte b = buffer[i]; - // value entry - result[0] |= (b & 0x7F) << shift; - if ((b & LEB128.MSB_BITMASK) == 0) { - result[1] = i + 1; - break; - } - shift += 7; - if (shift >= 64) { - result[1] = -1; // overflow - break; - } - } - return result; // if index 1 == -1 we're incomplete or overflowed - } - - public static int[] readUVarint(byte[] buffer, int offset) { - // index 0 is the value, index 1 is the number of bytes read - int[] result = new int[] { 0, -1 }; - int shift = 0; - for (int i = offset; i < buffer.length; i++) { - byte b = buffer[i]; - // value entry - result[0] |= (b & 0x7F) << shift; - if ((b & LEB128.MSB_BITMASK) == 0) { - result[1] = i + 1; - break; - } - shift += 7; - if (shift >= 64) { - result[1] = -1; // overflow - break; - } - } - return result; // if index 1 == -1 we're incomplete or overflowed - } - } \ No newline at end of file diff --git a/io/src/main/java/org/red5/io/rtp/AV1Packetizer.java b/io/src/main/java/org/red5/io/rtp/AV1Packetizer.java index a71246ff5..3bd5ae3fe 100644 --- a/io/src/main/java/org/red5/io/rtp/AV1Packetizer.java +++ b/io/src/main/java/org/red5/io/rtp/AV1Packetizer.java @@ -191,60 +191,6 @@ public int depacketize(byte[] payload) throws Exception { return OBUElements.size(); } - /** - * Packetizes a list of AV1 OBU elements. - * - * @param obuElements list of OBUInfo - * @param mtu maximum transmission unit - * @return list of packets - */ - public List packetize(List obuInfos, int mtu) { - List payloads = new LinkedList<>(); - for (OBUInfo obuInfo : obuInfos) { - // obuInfo.data does not include the OBU header - byte[] payload = obuInfo.data.array(); - byte frameType = (byte) ((obuInfo.obuType.getValue() & OBU_FRAME_TYPE_MASK) >> OBU_FRAME_TYPE_BITSHIFT); - if (frameType == OBU_FRAME_TYPE_SEQUENCE_HEADER) { - sequenceHeader = payload; - } else { - int payloadDataIndex = 0; - int payloadDataRemaining = payload.length; - byte obuCount = 0; - // no meta no need to add to metadata size - int metadataSize = 0; - if (sequenceHeader != null && sequenceHeader.length > 0) { - // metadata size is small so 1 byte to hold its leb128 encoded length - metadataSize += sequenceHeader.length + 1; - obuCount++; - } - do { - int outOffset = 1; // AV1_PAYLOADER_HEADER_SIZE - byte[] out = new byte[Math.min(mtu, payloadDataRemaining + metadataSize)]; - out[0] = (byte) (obuCount << W_BITSHIFT); - if (obuCount == 2) { - out[0] ^= N_MASK; - out[1] = (byte) LEB128.encode(sequenceHeader.length); - System.arraycopy(sequenceHeader, 0, out, 2, sequenceHeader.length); - outOffset += sequenceHeader.length + 1; // 1 byte for LEB128 - sequenceHeader = null; - } - int outBufferRemaining = out.length - outOffset; - System.arraycopy(payload, payloadDataIndex, out, outOffset, outBufferRemaining); - payloadDataRemaining -= outBufferRemaining; - payloadDataIndex += outBufferRemaining; - if (!payloads.isEmpty()) { - out[0] ^= Z_MASK; - } - if (payloadDataRemaining != 0) { - out[0] ^= Y_MASK; - } - payloads.add(out); - } while (payloadDataRemaining > 0); - } - } - return payloads; - } - /** * Packetizes an AV1 payload. * @@ -295,39 +241,49 @@ public List packetize(byte[] payload, int mtu) { return payloads; } - // Payload fragments a AV1 packet across one or more byte arrays - // See AV1Packet for description of AV1 Payload Header - public static LinkedList marshal(int mtu, byte[] payload) { + /** + * Packetizes a list of AV1 OBU, consisting of a sequence header and one or more OBU elements. + * + * @param obuElements list of OBUInfo + * @param mtu maximum transmission unit + * @return list of packets + */ + public List packetize(List obuInfos, int mtu) { LinkedList payloads = new LinkedList<>(); int aggregationHeaderLength = 1; int maxFragmentSize = mtu - aggregationHeaderLength - 2; - int payloadDataRemaining = payload.length; - int payloadDataIndex = 0; - // Make sure the fragment/payload size is correct - if (Math.min(maxFragmentSize, payloadDataRemaining) > 0) { - while (payloadDataRemaining > 0) { - int currentFragmentSize = Math.min(maxFragmentSize, payloadDataRemaining); - int leb128Size = 1; - if (currentFragmentSize >= 127) { - leb128Size = 2; - } - byte[] out = new byte[aggregationHeaderLength + leb128Size + currentFragmentSize]; - int leb128Value = LEB128.encode(currentFragmentSize); - if (leb128Size == 1) { - out[1] = (byte) leb128Value; - } else { - out[1] = (byte) (leb128Value >> 8); - out[2] = (byte) leb128Value; - } - System.arraycopy(payload, payloadDataIndex, out, aggregationHeaderLength + leb128Size, currentFragmentSize); - payloads.add(out); - payloadDataRemaining -= currentFragmentSize; - payloadDataIndex += currentFragmentSize; - if (payloads.size() > 1) { - out[0] ^= Z_MASK; - } - if (payloadDataRemaining != 0) { - out[0] ^= Y_MASK; + for (OBUInfo obuInfo : obuInfos) { + // obuInfo.data does not include the OBU header + byte frameType = (byte) ((obuInfo.obuType.getValue() & OBU_FRAME_TYPE_MASK) >> OBU_FRAME_TYPE_BITSHIFT); + byte[] payload = obuInfo.data.array(); + int payloadDataRemaining = payload.length, payloadDataIndex = 0; + logger.debug("Frame type: {}", frameType); + // Make sure the fragment/payload size is correct + if (Math.min(maxFragmentSize, payloadDataRemaining) > 0) { + while (payloadDataRemaining > 0) { + int currentFragmentSize = Math.min(maxFragmentSize, payloadDataRemaining); + int leb128Value = LEB128.encode(currentFragmentSize); + byte[] out; + if (currentFragmentSize >= 127) { // leb takes at least 2 bytes + int outLen = aggregationHeaderLength + 2 + currentFragmentSize; + out = new byte[outLen]; + out[1] = (byte) (leb128Value >> 8); + out[2] = (byte) leb128Value; + System.arraycopy(payload, payloadDataIndex, out, aggregationHeaderLength + 2, currentFragmentSize); + } else { // leb expected to be 1 byte + out = new byte[aggregationHeaderLength + 1 + currentFragmentSize]; + out[1] = (byte) leb128Value; + System.arraycopy(payload, payloadDataIndex, out, aggregationHeaderLength + 1, currentFragmentSize); + } + payloads.add(out); + payloadDataRemaining -= currentFragmentSize; + payloadDataIndex += currentFragmentSize; + if (payloads.size() > 1) { + out[0] ^= Z_MASK; + } + if (payloadDataRemaining != 0) { + out[0] ^= Y_MASK; + } } } } diff --git a/io/src/test/java/org/red5/io/obu/OBUParserTest.java b/io/src/test/java/org/red5/io/obu/OBUParserTest.java index c11f93452..b6eb6c4f4 100644 --- a/io/src/test/java/org/red5/io/obu/OBUParserTest.java +++ b/io/src/test/java/org/red5/io/obu/OBUParserTest.java @@ -23,11 +23,14 @@ public void TestAll() throws Exception { byte[] bufferx = IOUtils.hexStringToByteArray( "680c080000002cd6d30cd50200803010c3c007fffff8b730c000008817f90ccfc67b9c0dda558282672ff007265df6c6e312ddf9717743e6baf2ce36086392acbbbd264c05529109f537b518be5c95b12c132781c2528caf27caf293d62e4632ed7187901d0b84467fd157c10dc75b41bb8a7de92cae36981339b90c664705a2df55c409abe4fb115236278886f34abbef40a7852afe9228e4cecedc4bd0aa3cd5167674e2fa34914fdc2beaae713674e12af3d353e8ecd663f66a759568cc99be17d83b875b94dcec3209184b3758b567fbdf666c169eba72c621ac026d6b17f968222e10d7dffb24697caf1164807a9d09c41ff1d73c5ac22c8ef5ffeec27ca1e4cb1c6dd8150e403685e704bb64ca6ad9218e95a083951048fa005490e98186a04a6ebe9bf0730a17bb578117afd6701fe86d32591439d81dec59e4984d44f34f7b47d9923bd95c98d5f1c98b9db165b3e187a46acc429666db5ff9e1a172b605021fa3143efe997feb42cf760919d2d299751c67da4df487e5558bed0182f6d61c5c05969679c1618774cd298327ae47873634abc47376581b4aec0e4c2fb176087faffa6d8cdee4ae5887e7a027050df5a7fb2a7533d93b6560a41327a5e51b83787ad7ec0ced8be64e8ffe6b5dbba8ee38816f0923088f07210939f0f80317242a224484e15cf34f20dcc1e7ebbc0bfb7b2066a427e201b35fb747a1884b8c47da369860d746920b7e5b4e34501267508de7c9e496efae2bc7fa362905f592bd62b7bb9066e0ad143ee7b424f304cf221486a4b8fb8356ceaab4875a9ef20bafad40e1b55c6ba7ee9fbb1a684dc3bf224dbe5852c9cc0d8804f1f8d4fbd6adcf1384d62f900c5fb4e2d829268d7c6bab91913c25399c86083954590da4a8319fa3bcc2cbf93049c3680efc2b9fce5902fad44e11490d930cae57d774dd131a157910cc99329b576d53751f6dbbe4bca9d4db06e709b06fcab3b1edc50b8d8e70b0bf8bad2f2992dd5a193dcacaed052625eeeea9dda0e378e056992fa13f075e91fbc4b3acee07a46acb42aedf09e7d0bbc6d438587db445983821c8c13c81127e3703a8ccf3f9d99d8fc1a1ccc11be3a893912c0ae81f28134407685a8f274118c931c4c171e2f0c4f41eac29492fd0c09813a6bc5e3428a730138db4ca91266cda35b5f1bf3f353b87376340597349065904e084163ae8c428d1f5119c34f45ac0f867471c9063bc06392e8aa5a0f16b41b116bdb9507872918e8c990f7d997e773685871f2e471355f807ba7b1caabf20d0fac4e1d0b3e4f4f9578d56194adc4c83c8f130c0b5df672558d80941372e0b472b864b7338f0a06b8330803e46b509c86d3e97aa704e8c7529ec8a374a81fd92f129f0e89d8cb4392d6706cd5f250230bb6b4193551e0cc96eb5d59f80f47d9d8a0d8d3b1514c9df039c78394ea0dc3a1b8cdfaaed25da60dd306409cc9453a1adfd9ee76515b8b1da9a288051889392e303df70ba1b593bb48ab60b0aa848dfcc744c718008ecc88a73f50e3dec16f632fdf36bbaa965d187e256cdde2ca41b2581b2edeae91107f517d0ca5d07b9b2a9a9ee42339321305ed258fddd730db2935877784069ba3c951c61c6c6971cef4d910a42911d1493f57841328a0a43d43e6bb0d80e04"); + // depacketized obu counter + int obuCount = 0; + AV1Packetizer av1Packetizer = new AV1Packetizer(); try { // fragmented buffer //System.out.println("Fragmented buffer(s) total length: " + (buffer.length + buffer2.length)); - int obuCount = av1Packetizer.depacketize(buffer); + obuCount = av1Packetizer.depacketize(buffer); System.out.println("Packetized buffer 1 - " + av1Packetizer + " OBUs: " + obuCount); obuCount = av1Packetizer.depacketize(buffer2); System.out.println("Packetized buffer 2 - " + av1Packetizer + " OBUs: " + obuCount); @@ -46,7 +49,7 @@ public void TestAll() throws Exception { // packetize the obu info list not the bytes arrays without the OBU header List payloads = av1Packetizer.packetize(obuInfos, 1176); System.out.println("Payloads: " + payloads.size()); - assertTrue(payloads.size() == 2); + assertTrue(payloads.size() == 3); // run non-fragmented buffer //System.out.println("\nNon-fragmented buffer total length: " + bufferx.length); @@ -69,16 +72,34 @@ public void TestAll() throws Exception { // fragmented buffers from Chrome 126 - mtu 1176 // first packet in frame: false, last packet in frame: true, start sequence: true count: 2 - byte[] chrome = IOUtils.hexStringToByteArray( - "680b0800000024c4ffdf0068023010687440c71c7116c6500000000604d80367f6c757deb25b95ece4ce58c22fd1527dd1d85f10a9880ef543f4144eb319f107306befe993447f6a19491fc40a0609f98c947c5af4dec016d216c14054a1bb81ff9555fbd1d4f373d085636bf5c30bf4ea1236afe915b7cc90bc224d1ae96c8089fa677d926e9f5270deda8b41c545ff51117eb12d9bd4a31a1dc42e6862bca79972ec014a410f26d1dd3bf08415f58b445d38e683cdeb49e6d4c677d3e3e3bd21c7d26309ba514d9cb5e3b40da43c04a1f97eafe5d52952805c5c8b54df0b3e08442851ad743218904b03413e1fdae2fa1e6b907906246311412fb4429a52428ad1a621997b8f7db3715237e417b9b069edec211fe64dca0fa247afb29944139c26050f87f5ba35147c8583dc603060773d8bc3ceaa6b9bf81f432704c4fb60a1365e62645311c8d52f5bb76a9b0ae8962c77ecdc13a378dc44b87a643b8c42ad49fe0494844db3db524d17f207729883bc387351895effbbaf689161693cf173c887d421a3454c5a857e12467618139e39b6999bf99f9103456f20b85b2e67947be501519a4469551e3d2fbe19aff32d0060167ef7ad433e1d802d092ffce569065d9fa80bf0a904038fb2fcff9c50dca3dcd4a6a3d8ae1245a8a045d9ef807b3859e0fe9a67854f68e28e02d16a3de9535f302f5f54ca06afca651ac589e0ed8dc68438f3319c8c03bdacaf6ba16b08631b74d90c9268fc724a5ff49ef0fc7a7828597e1c2ad3b5226652d792a0a18a93296356b7890c399da544b1ef43cfebd998245bc3e71ae8f117f937a4ab5fd8c3666146aa285b543de5c4e6cea142d3b4cab2f315dce647817b56edd76313940ce77727acbd0ce89c22aa56cdc24d3e2379e9fd21b35fdd0f7df1b84a14d03bf513aa6dcc7cb9df2d19d6472bd08c2ea63d76e5a6363bc3e80697381d8d758963a493de55d7311aed6e5fe9d63f13bb6bac1666b8db0c30faee5c2fbb33a78e0d6e30622c1ba104d8316085b63f7c2c87db0bac98a3e702abc1e93ece6b2e30990e3e029f5d3c775d4a685746cac2b67722f4fa3da145c12fc888daebdfd16fcf64d6814ee2cfc76956cf71787307c2dfa14b820da8769ce0900230db54cab4613cd134559aea71d5cab8900b9f0c58db602ce7ec8f5b343d60df3b5538c21ae6d8b65e42c8317e8f173ec9f8e149579b5d6ce4825a8df7e02134c336b404f542b188844efee00e83ca852c2f092c4aeaf8e7ac3e2016ffc76d2658e5e0cb136f426d094f25d7ec540755eed7f85c96b530e9a1cb572ce7c5f3fb51452b5cce4954f38cf0989d28560d6ab685acfd0a0764ef2fd833b2f8477f15819191efca08ca551921020c482b54ad4daad11515eab30fc24d86441379489e8df063d44f5aca478f512255c9ebba7e7b3cdc8af56cee02f031f84369b1dbc52c4c234b9f3feb0228d7fc22eeb576fbab10df5262aad1782402bbc4d26356d18dd1015a28d35156f544258a5f283831c110bcf41e58aeeac98b730102bdb8bb43c0a649594881818ba7be71fa75648e0b16af607db9f9c69962dedee9b178fcfb595f05fec60d2d8e6dde481076d7f9d6efc603aed002230b66f5d6671fd33233d451bb26fdf44276bfa693"); - - // first packet in frame: true, last packet in frame: true, start sequence: false count: 1 - byte[] chrome2 = IOUtils.hexStringToByteArray( - "d0338b6416d0d5ff8cd0f603ab4c0437499ce7dcf4953442cb8ecbfef39d98e9dd4f038a9775535689baed236543bfd0ea390fda2ed67eb3f00eb4c1934eeaced3db614ad0889b6b217f2f3689e52dff41f06e6f45433a96066ae70f2ee12e4cd286808655779867dc0ee8a59dbf393bd0a0350f0273187c1fcaaa2c8ec1b81812e76c7c532b7df34b5f8120d845a55e5727b42a98331164436b8be26468e3fd2fea11cfbecd8b22173eae0b0791be5fc2db1fe5917e389abf7e10686c5861baaa34d11a82f6a270e9d5ec9cf5128d428640c7280983ce76be83de19a48dfa6a41fef303bbd188086e518fea799296f674a947ae92764fce5c65cedfed5e3ebdbfd58e4d68fb778afecdf6612fbce3c65f26f96b973d676e88f4299deb1414181bf254cceb3c6ca0baf48704be28786d0b84cb5c6a4408a01da8bbd018816ab8070e8b2fabc27fc9de50e1dcf300eb2171e4401b9de54028f7e015d93595728f385ea6dca8b6bbcfe79aaf3347a761eff54b6fdff9e608d54e7b6500341ef8964fa5a008590e7aee7dc39a7e5b8ca5a3ffdb2f216ae83b3e56f9309c3bf8d5f01973b020ea26e91b8b03bee5b47501dc6994f2d0c9cb41fd3f54844a43ff9434a2ece55f43a162dd29f5955fe711d865ede95f20dd58532e92bcb30193fbea3e90abdf6e3ba9c3a54144c4bfe36454f4406ff1d7ce95a37e89de7a565961d2ac199396cdb9af76ac1c44a6726be64b5c2eb9606c4f9186c52636d19f14416a5647fb5cb65b292992063abcd1f147dd205ad78f477824ca3aefc26a399b8ba351c41c26646d03b41c421dc67fbcd4356a7b8b1916210d0b0e0d8109aa377feb5ebaff2b8181147b59f2c8d29882bd1da5fbc28533137c9bdfae882a25090bd88e1f2a7183fc89f6dde2e053d40816d65ed421997a5d132a866af31496b2e64956f6b56fac0928abd0377552447e2ca26898188e0facfb15bf6233d6fe628c08dedc56a847844519fc60cc0a0062e54f2c976a4e6dd6f687c12dde56be11bdd60bcebc7f8c4baf6361aec8f86f2d31a36459ab6adf2173c0c5f3a91db9262e61f2b34460af5593e45cffc03afb5ab830ba6938d7625e702f84075259e59742f0edcab5fab0de5435188c0927fbf188ca76cd137260c5575862b225db94cae46555adcb60e8d9af96ee6caea9bb267472b7db43bac4938cf47d45a5b1c87be8d24795e5c924c8fe587ceda53b1a60b08cc1aa69295c82b1b17f4cd7c859c223ce3b2af9f58895070882ee223d3a36078d5e275a98c19404e8fb67eed1b628da0dbe625771346baa288ca4c975e485f9919ea900da2c2547eaa67828901c2ee810024a60257d9faf65366a92a360c498524f0b36c0a46dcec6a6d1aea910e633379d1f550d65861dac2d67c71d791d6f21b0f0fed30b964433b5ff7514ec7f9e4676bdde7346818bada3f48f4900646367139d04e4098f690d6e5f8c47cf7af44fe6848a6b16b9b8909330f0d56650bd705c35ca05ba8f5637269e2b6ede71043013bbe543b14a522e8bf1ccec060939f8f1ef31927fd525dc92db9fcf66252ba8e5d59b23b860a9862f01ecd16f76e11c451373229894f548a5edf5fce3c51aa548c62517a0edb26118265059ba0515f8c0dd06c062e82c510f"); - - // first packet in frame: true, last packet in frame: false, start sequence: false count: 1 - byte[] chrome3 = IOUtils.hexStringToByteArray( - "9058075957493623f9f2678ae960ec641c940d02a4621839ebdae2f9f2b7f36462a365f3c0fd5e4f5f405f997905c16a0b9cbbf9792d55500e90fec3c377442d526c6299f668471bd34dddc74dd70506b829fdecc888a462cc931032849ea8ffd76d4bd21f74be6a3e370b24ba7502ac84bc3b2a7e90d1e0153f1a6a8a2378c85509ec5d4ed60f40a9d1a1b1e45b879d40f10fd811b269d3cd83008026fef516f7f20d367225fdc074f6e8b55d9efc456efd9f331e3d4e86ac4d08698421205590b6c1edf04f6ccc29d89b2ece52b101be4dc1005fabc6241af3c6e6635a983c41764691b591765e414bb95330dabf3f3eb8d1f3c20b56d00f1deb0d647e590697884d291642a0fcceff0c8501bec625bac4f116bc4dc2a7e54b8f0f8f065b6a2b4aa1ffae20d338b6cf4d4a556109627d3edf2b30e13b5c0925c3f86d13a01c74cb5b78c4532647927578c85561d34322547cb875978468c0968224a942edee8de3ec63159fb6d0ded4da44005e6463d38a5692ada3879d361e568ef95fa5a3ee5b6e81cd3c6bcb90dd9e93ac809b328738de8c08a0d4810354daefd92d40abf0585123fc4b3048862d8491bfa0248e4bfd62a0f37734eec5ad755684c93838205aaf8e5a37e3a6a30675db9b13f7ef1693be7c6912d5ee4f386cf1597ba74e3e16523d2c0b3fe6fe66709aa8e090efa9573912aabf23e5d8e6ca8bedf39670a5185e31b2cbb4c426841f97dc39be1322fcc5ad0581cbcccfeb2f0504bf276b1490f822337dc1c64d30d53487c2b7a6c05c11e8146fc83191fe7de089ae1cb50d2f6d892436ee75ddd49121c315424f0e806ed7319b25902f2e5a5cea40d74d49c3d254216623df2a2ec0a41fe1dc937e27b0cc1fa02f3487a36f8dbbac02b4c18b0e84959a852da8ed244eac6424fe9d2ab4a30ff305fc"); + String[] chromeBuffers = { + "680b0800000024c4ffdf0068023010687440c71c7116c6500000001404d80367f925f629166482e06aa5bc37db8e843286aa42d21e7c037f2736c21f65af8ec37e7d221f645bcafff3f48d999afe002eb4a358569a086dce40908c3d62811013abed21b6001759cfb57dffcd259a6667b845627669ade1c2ace39193b037b95e01c15d957d360e44994b0b542f73db0d0606ad3af8aef8992aa2a2561b44df78b7f98ce0d15ebbf5e6119e08dee277725e99ef8d8491e5bc4afdda66fb9eb603b87d9a63d0b5aaa7a9b9b994e729cc0f2193c025674b8005832aecd073899fe474192c40b9102c47af06c24dd4978aa2ddaad997ec0cf6ac2dc9a6716ffe53547e745fc353affb998f5eced57a6d5a2599913836c7ac14d00ce23ba98f855b683f6fe87a3758532732791bfbc250a59f57117a485baf50bbe9ecbc3e02f7192872aeeb4090c50cd150733404b7941817759e2edf9f9e0a1e558da9cff679e29d902acd864933d184ee9ed8a484ca0597735cdd964895ceda9291513b240daefcb0ed8c57ca9f7ffa0835d1c72019bf81e622d34f45bec26c8ffd0c6206544fbc0c84b55f0568d86df010204004c58f7ecbf60c5cc388f1be55cc5a7ac6732a86cb9d2d8c36880592fbe4ef74ee69f745be463e89356e1a6a3d66a6cadbcdc1400a342891146a1d5fdc50b315c197be3f3c773641289d9978a81b0ef7d693026e5ecb1f0a91527ee59fcf9c83eeedf93b25fa030828be1193f9d570e921b0055f443eff4e6bf3115b18da04c8398cafc604218f0bf7ea809c1cc06f5f043d06fa9776322e3bc4daa8b329283e21c74f6d45114e9ca68c014253bf6f1ec735b86a88d93b9772c0b0a7fd6a92ff1aff511e4c42bf10f2eccb454f63fedd87f100f0346e0c9dcafcc6a9f170c01ee298ccb8a036765d12c963e249b7bbf3bec5a623d7b155196f353b0d85a0ee62f5373ed29cf226e1f0e0cf9f7c1e68378f73f3a4d5a53562889533aaf26ec5ba0d3de885e86a849d5ab2a1644a14d19f49c1e3879e8d83a0d3f161d91c25d40d79ec93ee2129f26032da9eefbec76ede866009192a0ddd9f3034899d92103f6e079bc83f7ec6abbaf80c689e1211b5c6f4e395b1eefb42d2932c050fbccfcf49d5cf7069fedd93f22e61c6f2773d2ece482fba3dfbd745e87117dd6630ec26546b579a5f6de995451b101d109575f4e6bf472abf4ec13b73c5ff2abedca0f6f76696d96985cd3513dac22199e75612350995dbd0e4975ffedc4dac5c1c143e20fdafd94278975b4465076ad3fe76289c37aa44d6447ddbeb88dbb00424a57a7155b4efe9afa09293471a399e92a92e77e5e23e189275a15e9015067c7c2048d9bd0ace6b602889824b6f9ccd61d8c6fa0adc59fdcb6ee8601638ca8a944ff79cfa5f1c2c1a636a05e8b81d868ae0bd2bf01535d253dfe77854aab956188bb023c53139cfc6692b36020e4cfe85ae4e22c6cb803a661ac27b22272ccd091ac30c3651fd803a801e02bbc4d26367daf79c66b0684994fbe89c9713d2c6c1763c9c213f366145c750c1c235adab716f78a7244501afaa8a39e1f3c047addd412584c6f284ddd44d03adf788b6b09abcf80c5e642e25498512dbbf41fd531795274a34cde0a53457cde267657ab1", + // SEQUENCE_HEADER and FRAME first packet in frame: false, last packet in frame: true, start sequence: true count: 2 + "d024c8c5420ad3f02093a4a25e6c72a0028330ce286507c8299c27197cba1014ea2b1864e8cedb7f1fd0e0d8144f5cf6f082dc831a71bcd185c646147de3d29afeca1f998e77dcad051b4e68281e7d9af1f51a2bf20e331f2531a64dc238fce41e5577305303b50ed69ca33a9b129591763434009ec13c7e760e4b4507ff5ce0b08f488a06cbb0fc11ba6abb3612bf452587683460236d6412561354cfc9bdeb7cc658f3128dffc75bba207647b5a574a9b945d1a2dcffb59d6f3088575f4d7e06bbba2bee81ca5fbf3c3aad0ca14d4d4eb74f7da97c4edf898c4e8614c8a8a336459ad879ca854c5b7554e7936c7f23f7aa896c195ed2d0fe2e1eca0afc35f4025d9622f74630e11b275967788d18e1b2a2029617652f665f1a9303ca3fab3655c4ec01ef0757012eac3fb366afc132811c922b8173e6720ad74b7ed26db91bba13b49661effd3da7c1e78767eaa2051a0c86bbb5d138d6d6e6f2284155b9ac01f55b9fca5d2989b78e2f13606fed1f15734215029450640cd2669bb265fc642afb745114736564ce8c5d7c26b4bfba973117217661477f648721283b4a3e605ea192134525db3cb01eab25208182806f03bb0c359a454343e8623ff4a08c51d255729a3a6059d7673fff01d98725c305e2b372f00aa3525d229bba29d1b63eb495728b9b02212367264a7797277bac98b4d68847dea4c66094292a0b6c138f96508e4b30ff15e3629a877602635eb99a5948fc139f95d9b0b258e7bd86656c2139b2bf25d7c2501f646ed77b5d7bc3c989f1a5174a573afe3e8638e4d4eaa98a7ca09c5cec413fcf863d387a5bf6b5b43801da00a646c2fe39c63dcff6b8c9c6990c01eab5469d225b9a81cd017c8a436e85d2839aa2cc606e207012c84653badb2770a4650a56cee082e35e027850a29a45959adfcff33d375f0b94ecdfb96928945d050c8463efe4a246ff6db1b7e44044dc62a4ee21f83a82b401092632baea21cecdb70e2cc9e26358e09148bdd7e7e499491e17bdb128d99b2f64fbdde9f525ca064676071ef246a42fe4e574bf5c9ed475067763b4db502223c4001cf18a624a716786829a79ae36f1cf21d775855e0994761138a27fc05ef5c5f8822a062fdee8ba83a218f68d92fa2dac1dd390149ee9aea9f9ba4ececda68c668f5e4bcb2a0a6c3bb5ee3650335ffbce9dd2343ebc1c8a08819a9f65e8459a8bae2c97cf82515a22295e5ff4f028b61f6f828091be0368ad2513b3eb547c4bfc288b856b9965fe7091193b6ba7d5271cee1b1a548d56f0471f5d40157a494e6a6ca42579138e84caa9b6a6ef02ffdcfd4bdd211c4385f00ca8726ed2e1f0e96bb4751385624def19fe08d0025564a0fd4a41f54e01f0798dd99561ecdf0ee3829bca8890c30289217569ad0bcd27314d767cd23ab223daa4d89c04673c8d0fb5f2253a530e0bbec2d80f46a1bb3f3836f6f92f82d76f87e20e41b9753505c071b85947c15002bf7610189c0e13366f9d0fad27cabf82cf0ecc1ce61d74e97f4348c650141971c480c2df02ffd0d6f631af44938fc24c3f216a8f69977f3fa244fb1a5ef2f75239a2eabf2940acf7e8bab7cd9d5d0fe018a0cdaf92f2389caa4e96e7346d55f7e00084d048ad6c512797fe8133c9e201fe56cb", + // TILE_GROUP first packet in frame: true, last packet in frame: true, start sequence: false count: 1 + "90b957d91ca780c3e080635f33fa31cb8d10251b7d7cc06199413609d1c3bece27836b127c255f9cba0d8aa1979c4becf4ea907144b709787dcb7e6083d849f46849d6b53b27eb5b84524253c1e7c3319ae07e9b5973a111f2648306e4d6939d2b48c1cc62c50345d05ea96aaa93d215daf1e3a355334099ebc062a50f3540b5fff9d7ebe4de8db1af283096fcf14c75a405cb960527fabda97f519264adf48f4fc14dc6bf8de8c0c0d9e884b168455ba477093352c2d757f0762299cb71ae3e22eaae7534b199c5c3f6779c102ac467f171043ec3eacb68da6bc12e7601afac01215443b11e9fa1a3bd4dbe6cea680a36801db7c3d791a1eb626f704806b8531d6639deeee815c29ba842fbe3e90c1369e4ec0d977d792896d2aa4e8a17ad1df99ee43edf43f83f19cecf8ce06b320df036894a46ed37f21fc082347d9802f5e5dad2935ca6f028d350a038dddc138ad248c196edd3ee069265a121456947a32dec7cc8332d6f98be53cc69b9357479846ea4dfa5e44dd7178dac828493c50a0da32e544f95aae83964c26638733403030d1d88c430bc01d76dfdf722a070e3f83d269e18cf80ba9b4772ccf8aac19dcdfc4039f766f28f4268c0f3ec6b6cc641ef4f6cb107af1626014620f6b0bfe7d1a185968e9df05a560507af0c0ac4865a8593044cf5966368ed97a83524614495785225f0898047bc95e6ac4d6cad8dda0b12e201ac14ec1c1e736c423aa08e9f37ea0aa9629cec2ae0c9a7ebf474c26cf2218c184f64745caf72f9878a6b5e3abaf58a996fd3551c0dbac00dc523803dca3ba677f660ee002f71c72c3305b07f0651238675a87e6e07853badedd445c33e60bfb3f98aed0976058d0451e153ba71b2f0c68a01c8c38f73ad4a1adbab613e7e444a4b799cfe330174ec1c4e728a9977e82c7b937003915daff819d689d8f81ee85a82320d2f313d1095dd41bb0a881a11764b117a257c6090a56fd628a8dd298d51e13f290c8d74b2ff7995e8a2385003773dd299dcbc6340fe098aac0f02e548156a9618f2984c2a1522", + // REDUNDANT_FRAME_HEADER first packet in frame: true, last packet in frame: false, start sequence: false count: 1 + "103030c040fdf826875c3403c101da800000000000534d348b512000200000d702df1f4cf031c6d0aea008e9057f6b37c33d72f24ef919e4cbe1f309433027185b3b5bf63c499597d889627414171c6c80d171c128306c12ae61561dea43a617f66179a2e6b50cbc28df154153989dbe81e4f2ee27fbac7ee0c7bd9b4cce2c2a4ca8f88635b2a64050b946d95ae53d8ff1856b495e6b810eb0a460fe1520a014f9580cbbcd5ffd35d284091a2f4b867d7fbdb193ac7e00ef6207ac29c46f9220e8c0860d1108cb46b82f6b99841784502f12ce31136f3de4ae6775fa1dabf08278c87fd9dac6e2d22b715c39381b0624eb1267b672504064a70c9f03b33d900957addc29971037eebe36facac7069fcbd4373b33134a0918c25e6ea8afbcb2d4fcab8556300fef09000f7c4de526546503bf8cb268eaba28ae07edcc1ecc369a6c3ddcf12af9a1e7a0f4b2cd46844d3ebfff4a0464f80afd10ca0ad6c8bd83b1f4ec82d9b060a37b079779a409ef47070b3e8a177d282a5c85c35bdd3640d2150f55624ebedfea0c7461270b108d69c5f5ac1f615462b8fc1bca48083c8a7f2ba0ba610a84133dfff08fe79bd1462cce46cd1bc0dc4939997c3e7783e3ae0d375839f09bcbe3e17683d7a51396c3595757e7f1782004afbf5780ea5678ad6ca4a9382a3d2c23f91256c383e339a0bf662ca0980348bbf29e488050eba8f733d4be8ac781f5c90aa8e0467a5a8a244779cbc866a9c5ee76747581ab6ab245e16699b7e633c4a335553be3a873b58541554faf482d80a03b81bba0aa8bbe6a25d590e4cf6eb534e390b0db20fd9ad0a084a1e2735893049f41d7be7216ea905a6a1ebeaa45cf9978e7562d87d66242764de279d052bb6ca2b088d2fd4a6df3718a3bd370932a604a65222b53509cc59e7c5fba8df9cfb655da60a852896b2d60b25b29c018b94f553b17a9b23b8753068be24f07897d2d51b9685bde1699702808d5912172b2bcb204f72941411643d9583e3f3de3c5337ca7034025ce429d8eaf64b1c05ed0d250d3d823add195718d304396219f1cbf2f06c09f009834ea23d3fe45e5048e26ff607e9128502e030d6b46f29d782fb0e33d39f525239a55e5e9686248ae439e518c953e5b5ba39a7072bde9e4e36792b3026087393f532f51de3c61dc7b39dbe92783074bc39ebdde79c634cb260acad52d9245acc67cb1a3168969f8dda5bd6767e6e78e68fee89c80d6e1be1ba0354553b020de60efbeed0df5ddcc04057615a798e03d2322c26f671ffe26e3135bcd193707802f009834d9448b68345d42f122805e7f3c7cfaefd56ca8ffc8060a7fd0dfe83bc575cc63903a67ca0a61c9d4682466a640c89834ddac50a47f690d63820c053093fd960b3afc1beb54cbea60b28b886ddd24ed0f00", + // FRAME first packet in frame: false, last packet in frame: false, start sequence: false count: 1 + "10303000857df826875c3403c101da800000000000534d348b512000300000a6028b764eba14057cb561f3e28c73eb2435fdd2d5213cf77e6a60cdbf1f812119963b93d9873e899228c833ba2599e7d24a2c6bfb9918be161da4581e5dd627ad80ec960d65f83545a3722a60980dd4ebfff2437268566bb3e3315f33b6e500ede0cfb04c30113ee1fa9309c243214de1471636429228bae2724c8e7794976efbdb4619f69339dd19f9b23a74897676c1b6e27f90654e3ee720e5d616536f131049a08f6e37c55543a72567e7575470f669fffb6d09460b6d4fda1a29b6382a787fef73d07255a0ac5f1746d0e8745c55685c2daa4c1738fce6864694ad4adf413fd854bb4bd55f24520ad97981aa2109666ac7dbb9ba312baf1c5f9d2d72b9b3d3358000a410ad4cc210efa55d47b61fb0ba95d76cf0cd06205009072ed57eee34ee5b3af1bde377b549bead6d4882884c99e6e461f63b046c17895acef9fc9217c345e170bb1cc0d6abbe1b351b299a92f27c96cf4b39c9f4b133487d0a3488647d657e463eec49f58247f4744825c2a65cc58cae8bb9e4e10f830cad225140b8f40ba0792f1fdf3dfc09e845f1227858273c0792c4f9778ce209273e6372ee707a29a6f50b5cc7d5f3cf4b23504fd4caf1549206f09974e7545f107b93d98a54bf49138de03df038527302350b71d8e4b2f05b7104ceda0414ddc7ea1f7d0b0b1cc6300bbbb51b42374e234f3c96ab295ccca98c36e10bc2c5495bea20b535cc481eaea78da23870f258aac6da7704893bf55e287b45fea422888466b86820055711e791c1f558942e5d8d8151b0d44defb40dd8b08a099f84e473b7afc429a279de7c1bb50539411b17171606473d55d194cc10352748ff116472ab106ac8be46c44bf306e25e51fb0526c43a61c663c2ef360b129c0966a12fb8205c8bf594dc7971e0213eb7082a0c35a086111315946f552e3f234017e5ac492c72008f54bddf11dd946020f6008b765e33164f269f2ea014fe3206ef6464b2d38196229012db4705c82d00aa5e7999a980f7b4322e0ae47367c7c25a307180fb3d5d0d8e6e822352ffc695b60f906bf04147c0eb9489a7c49fc14bcad6ee075e7d1f27a4fccc9f668721cdb4591ad2f6a0e402ede96bccf63db2a72d2d0dd123fc78a3b58a2ddff75be20582f85e7f269c21baa26011f3902aad8eebf2868160c6ba41232f056af89580f57471e6f12e89a834b6f41a602b55c8756b19477695adacd82d996458a68f14d61686f294ba5288a0d670693cc893297edd1055c913a89f255162f1e7b14564aade4b02d7a7776bbcea131fafcab7bc06db7ab8c3bc8ef8b89215008b6877cfaff55180df58019846654c0e67af72889336aafbf9a3d2f9d7a0d533698d9c820c", + // FRAME first packet in frame: false, last packet in frame: false, start sequence: false count: 1 + "680b0800000024c4ffdf0068023010687800ffffff16e6180000003103d80367a7aee141dc620f5fad7909f2d21f966d9dcb6f98c715762c95ba655908ac72601356155612e38bc930cff28bc0e6b2eb426399c6bd9aaf60d19fe13836fd454536c1067764ebb93984c46912ce92d4b22a81e1d070af1e920c987855c725fa5847611373aad84815e50a85458e6ed66b5c6970140d4188f59970f6f789507370381824f06abb412bcf0752dc5e844adf2b397d008d964010aedec72d9e1b09a210cf48eb6bd51c750acc62fd408d4bf59702e019c73c993f6ee35a488e3bdcfa648b44436950c6730990da29b566682c8a3ee559aa93f2bc7351692b404add8408435520d6adf1a7797911e6a1b1c3984597b8d963c94ff892ccca2eb9f8c69b3b2ef32db0277bc13c0d4aa490b1df9962f7380258e58b9d580185df1537033d46b113c5a43f2065a1a68e0bacf213accae56227870c8752bbe0e6c4abe2d74d6ca78d66969b96751eb9e04134691f79ab96634d90f4a4e602729c2bd9edee038110d128f9b5bf452cd138ae2a33a5f2a4e864fad771c1f0c2164817b4e76c2aa5c961e87deb3794859ab251ad711d7fdd63c5f199d64a3222f579819b1b98b4670412282b58904420d981aeb74a1ad348ed34310a7e92c0cc91edd73590a43131bf3c2dc73d0eba1e426353e519b160246c293a0eff920bf1605577cb2c5e8d3f8d2ea9defc4ab21a417c57c3277d86516ea10fd1a30c542bf523e323706e2e7f4806df3448bdb71b4999f41a4519604db03ecf9b3b1d9bcfcf62dd89058cfef2779b01674562867024d5d3c693fcf337c1e736d33f5fcd0b0ec38d81c8a1ae361fe499920e1da0dec79f8fe55e5f340f7b88d9a1416baab204811b08b97608803e70d2a95f65e23c1a2cd1b406ec9dde95819ada2bc4ad5197bf93fd516243374d79acc3ccb10af035f477f95cb8586b06f90d1e0d05f529780dc8d41189971569048c1779b375c4c4be5c3aaf5f6ab2aecb51841800a3c4a811d846f36898bfbccf31fc796ad819011e9ed973bf29f045dbaf179a8902d0642a6dfe45337e6b1f931cb78c16c7ab152632cd021644185b2bfd08edcadb76515bd8e60f005dac05d5fe146afc441201b14541d7828cc13576be9cd7b2a616be0218be3cb454a9181f19a5c42c1b3425a107e5e2caa701b4b4a716dfa0359404985a7772eee1f7a7d52d859526f5f27a0e38c210a32db4e74b28532fa696a2826ccf0fe3fa400bd3759c25a8f5a56ee318094058d8eebfc4b21096488a12d58c75e56514b2b7082b7d61c0edaf69d6474d6e9938b2851aa01939244e640452e958f3ab094c3b1d271d6331a5dc3a6e52a702b380c53faff47246ad97a7f9cafed078e9126bcf2da7934cdf707808eed424ccf122d86a2d7aa6f16d8c5b4964f4b71ad0439eafd1e6c0f1ddd351127a0fc9811314bce4e00e171358d381e212075ff1330f5690de8fadf2f5962b3b95722b489164ef0f2ad21df522198e68b0216188e899aa4b807efc1b3abd0fade1316eb78a1ab2528d81108b2cce4edcdf7297f2c9f46cf62cede90b23382ea0b86ca7ef98cb226c333b02549518e3ad9f5746e7990be4eb0b0bcd8bf2886a9a957cbc6763605e1f875044cb262ff6bf", + // SEQUENCE_HEADER and FRAME first packet in frame: false, last packet in frame: true, start sequence: true count: 2 + "d02f997baa0ede63abe5c4151ec36660ca70eadeb2003a204c6b4213d2b72c184f0c8473cb04b2afcc61b4e3b1d1082fe85d70ac9e7d888cea6ce098c57bdd481b7ca3e85a967e16317c6fda0d5ae3fcd79d5d05e6987602b5b8a80f7b00e95c303c0c5314682a1af3b9ddde2ae73dbb054c5ea954300c8eec7cbaa7d42df3bf15c710aa39a179ca167434ef7aa1adeb90e835ef57e4f7d6184b512f0125ef4f7462f1abb7e598615fb25b4db73f029ae4b8e2a0bfdf9d6a1406ad07741cb8002d77b40b708204c91fc9507fc0d3a7cdfd884e8023cd9a93fde7e3324e385370830607eb1f498b9bbcda07db4263170eca21e79161162c7da6ed42fbfe69e31194d6632c5c6e2c3bb41787bac65bd9ffe80631ad3fc00227974e3718242e093e5ef205c902cb535fcd29a8fb4286b9a58db789e52d6483f54558bb5c8c392977de638ab30735131e1c6fb16f04584be92827a700c097f70f83a16738e1f8a9dec0bd9e9bb07058028d13f5a376d2ca49ce1d878dc7bf45054469c001f8f13a45e4e37d32393cce8e8588c77532095ef7001a54bcfc4a2a88634152a801465a2c79832d23cfc4296955cd00c359591236d75bc1f48eda534ec6f4f1d43af645a34a7321872a80fb9e9380cddeb9354e830ccd49198af0af570f5ac001b92ac4af6341876cdc742df2ca979c4636651220d62cc3b010e8491cdcdfabdc4f05ef640dfef8fad0c1662a2a45b4285198f66e9e7ae55be4f1fd942a11724789759a174903692b35bba0b4205c624e944a3f4fa1a31b55f9e1a34e6ddb5cfe1aad393c313dcbbf488c477945e3ba9f96eae0caaf64f552dd6ecf8d3422a164f34545af491b96b07b200d04e993c45ca30f92e0e24abfdab904e3ad9cc844c87dd8bab16e1769da46bbfbcd5480e2034bae5fb150ea32b51ffa79e767b479f74c5e305ae3d48582a486a05f9bdb1d020746f5faf51bc4e1c429e5728e159ff889a040217db2589560b139d353104fcd937240b5fff131bc52e522f85d5afc15f2336a94d6d648dd20c9ce955077ffafeb91dfb3f558062807075f101b1aece3bb5aa7bf1185aa6a74c5053667965b7134b75690982e44abc2157976eb64806eb233c0cdf5eda4b47e8b13ba961762f1161a43e4198a76b64c8a891d4c9945b3ae594b9c3506a8fbd631a1223c2af41a4bad610944e875069b63c664464473dc092b07d7e45fa2c52bbc1ff17325b8c7cbc5ca3279a31e3a06e5aaf323369e4261e493bd9e68e4082d01b07ffc6a645a71ede13d658fc694082d0e16f298c87be4acec440cb8e3eef7052cc0c56031c87d247528b2432ac414620b956b671595987e9f67c6c96abf3ae70c016840cb4054625b05e57a83bf6b58ac831f4a4eaeefc5c870aa9fb22f18562738f47c1ee15834d7f4dc47ff4cd9f50023fc27f17da609be737efe40d11bed76fe723c9bb06c325ea789c63c5a74447690e4026a64436f662195b5cb71c40fb30daa0c43c0603d1c1e750a09838f44542c188eaa809d65089b642f34f0a27b0019f1370879126bfea70474cb8a5890e42c92161c66200767cb235a61edf114dc9cc0e828d9127287cc8c75ae5c35cae034f0419004b272f9ca6970b1ff71be242ce10dbd5c709484d0ee3617d266df9f7c", + // METADATA first packet in frame: true, last packet in frame: true, start sequence: false count: 1 + "90fc8ad11bb7e37a66c7f732b5f7", + // PADDING first packet in frame: true, last packet in frame: false, start sequence: false count: 1 + "503030c040fdf826876c3403c101da8000000000005965960b5134002000006b03d9cf1850b4b8cd5b82800582c55914bae658e6f7cb3afacad54de8f637fd58f6ff99a47bd0c6fa065e3da33808ae457fb4be3ff5c3d9d046300028818e8024f9fc0cb25631f461ee77ab6844ce8ec5bd8a638462690283d844a74253ab366efb0aa2f91d0c5011586359f4c8c5546b13ce441119090f7b49809b100b2834406fb2a653d48ec6e311f271366773a6907333e5233ec7df568a2927ba81f0bd9f732a07ff11ce3bfddb686b055e432d9ee79e7606f18f4d42bb9ffd5ba54ccf080151f107f9137689f1d8cb08496c674699909af4876fa2a606ecadf1d0b088c4eba96a35ea8809063757178e46489a1daaac5708f1f322c718f91c396e8b237db432e80936104022c9e0a4b2ced195ac4c5c4e0d5abb9371b38bb38af7151aac9ae17ef1792d0d1f98cccb6e5a07c336ba2e963e54e61e36c6d7adf531295762c65f45f7e76f054fb40b2d047a6c3542236c67ea6d0030e3a8b81982d5a0e1f49430f3de04536d5580f535ea324685d090a201eab8d4f3eac5f904f4d2c6340aeb8c4b000ca4c56b0004a6d7219609b6d0ec7b4e9e16b0dd3c8db4f30da58169f3a4428eba1485f5741466645558a4578c20b30d08faddb3d28cc46dbb8f09c5e1bffe384455089fada4f1d6b2e0ec5757ca362d5f157e82ad4aa2c2fdd0b492b6d11b7f6bd98b7f88a0f478ac071e79915b5ae2f53f24250a2bc992bcccc6269bbde88d1f82da59099b2ade8a142f779a2e505ee51e72ec6b328a9f8d03cb1492b369e9c46d149e8845b0ac0d5a9e9682e97e9013c9f5f3e3bf215fc6a18319f3d218f034627a1e5e1b5607282aecc1974152b833368dc3747c4949ea2ec15cbd26584f9311f64e86196673f23ce877aa2c8ed5293b692bc20675b5feced62ed8c7b20b31864f4faf9a8e285e4b2777f720cadcba405be06e465947ecd38f91f894787159cc71481f5cf989ac3c70d1280c054924920dae034d2edc971f6645188c65957b63f4178aea7c0f621644993fc6a4a1c20e2e6d7acc48743a96d352974abe5022db8dd31a01f132e0214f0a399babb40f3ab69d8a779e64c8dada75f47ce3d2148a4ac417a42b71a39e004b36e132a709976b624672f2d1ef6a56aa06ce2edbecec4d8c890b34f6fce6715a7c57ab7a14473b09401c0bfe9c87e8f48678a70ed3d59fb733fbb6d258c6dac8f3251050a375461983de842e38c02509ec8cab9fbdd0be17d56e6e3a80c9009834e6425812015870169d8651935204ad4b0303cdaad8d5ea4e2242f2f3b0d2d89f62c5105aea441a4004155c19c2f5066f92749aeb33a65db924b713c50dd01f73b4765737fa3beb11b35f05a64f0a487702bc5aabc4e6d1eec057841640c6bfcd9b4914fd6a3fbe5f91129b6913d5c3a00b0440eb23563db4698511e665bc7804ee7885322b311f440c5716ad933409c51d1214965a4475aabe1377dbbb2e64f21f9cac38d43d14770147157400ca951ec344c94e8f0affdd20c249688838137f84ae53ef43acd9c47d00d4a037cc6cb0e36721d871ff44b5daa43dd82f5915b3fe822dc86d2e4dac71bb7b364a28cb0cb99ead5ae901dffa22eb9f1a4a45f6539302faf2eac646", + // FRAME first packet in frame: false, last packet in frame: true, start sequence: false count: 1 + "905420caf7c711a380bf7084ea8827a15231052e9147ca65a6bcf7ce4c3c39474359a5a0d048a1528414683da1d2b906beae4495f6c4d4a02035ae96658b9592f228704d59a0fc8f8a0670cf35b201173b10f8a79847df1bc9e62d5be19fa165e6b3ff4ad39210e6d436c50a62fd46c24829bdce451c2a960cea9e6787dfc0f55f4ae697f84afb25c9c9e7eaaf312d49c0501d653361e4d62689faa317105fe31ce323851db8a8cbda7436123a" }; + // INVALID first packet in frame: true, last packet in frame: false, start sequence: false count: 1 + int counter = 1; + for (String buf : chromeBuffers) { + byte[] data = IOUtils.hexStringToByteArray(buf); + obuCount = av1Packetizer.depacketize(data); + System.out.println("Packetized buffer " + counter + " - " + av1Packetizer + " OBUs: " + obuCount); + counter++; + } /* // packetizing