From 4b19905bc23ed1baa294ff485054da395fc29608 Mon Sep 17 00:00:00 2001 From: KongQun Yang Date: Tue, 9 Oct 2018 10:41:18 -0700 Subject: [PATCH] Support subsample encryption in AV1 Closes #453. Change-Id: I68e46fb83cbf7e62a19fa83698cb66bfc0acd98d --- packager/app/test/packager_test.py | 12 ++ .../bear-av1-video.mp4 | Bin 0 -> 24949 bytes .../decrypted-bear-av1-video-0.mp4 | Bin 0 -> 24706 bytes .../av1-mp4-with-encryption/output.m3u8 | 5 + .../av1-mp4-with-encryption/output.mpd | 18 +++ .../av1-mp4-with-encryption/stream_0.m3u8 | 10 ++ .../bear-av1-video.webm | Bin 0 -> 24112 bytes .../decrypted-bear-av1-video-0.webm | Bin 0 -> 23979 bytes .../av1-webm-with-encryption/output.m3u8 | 5 + .../av1-webm-with-encryption/output.mpd | 17 +++ .../av1-webm-with-encryption/stream_0.m3u8 | 10 ++ packager/media/codecs/av1_parser.cc | 25 ++-- packager/media/codecs/av1_parser.h | 25 +++- packager/media/codecs/av1_parser_unittest.cc | 12 +- packager/media/crypto/subsample_generator.cc | 116 ++++++++++++++---- packager/media/crypto/subsample_generator.h | 8 ++ .../crypto/subsample_generator_unittest.cc | 69 ++++++++++- 17 files changed, 290 insertions(+), 42 deletions(-) create mode 100644 packager/app/test/testdata/av1-mp4-with-encryption/bear-av1-video.mp4 create mode 100644 packager/app/test/testdata/av1-mp4-with-encryption/decrypted-bear-av1-video-0.mp4 create mode 100644 packager/app/test/testdata/av1-mp4-with-encryption/output.m3u8 create mode 100644 packager/app/test/testdata/av1-mp4-with-encryption/output.mpd create mode 100644 packager/app/test/testdata/av1-mp4-with-encryption/stream_0.m3u8 create mode 100644 packager/app/test/testdata/av1-webm-with-encryption/bear-av1-video.webm create mode 100644 packager/app/test/testdata/av1-webm-with-encryption/decrypted-bear-av1-video-0.webm create mode 100644 packager/app/test/testdata/av1-webm-with-encryption/output.m3u8 create mode 100644 packager/app/test/testdata/av1-webm-with-encryption/output.mpd create mode 100644 packager/app/test/testdata/av1-webm-with-encryption/stream_0.m3u8 diff --git a/packager/app/test/packager_test.py b/packager/app/test/packager_test.py index fecd395acf..78280bba1f 100755 --- a/packager/app/test/packager_test.py +++ b/packager/app/test/packager_test.py @@ -1198,6 +1198,18 @@ class PackagerFunctionalTest(PackagerAppTest): self.assertPackageSuccess(streams, flags) self._CheckTestResults('flac-with-encryption', verify_decryption=True) + def testAv1Mp4WithEncryption(self): + self.assertPackageSuccess( + self._GetStreams(['video'], test_files=['bear-av1.mp4']), + self._GetFlags(encryption=True, output_dash=True, output_hls=True)) + self._CheckTestResults('av1-mp4-with-encryption', verify_decryption=True) + + def testAv1WebMWithEncryption(self): + self.assertPackageSuccess( + self._GetStreams(['video'], test_files=['bear-av1.webm']), + self._GetFlags(encryption=True, output_dash=True, output_hls=True)) + self._CheckTestResults('av1-webm-with-encryption', verify_decryption=True) + def testWvmInput(self): self.encryption_key = '9248d245390e0a49d483ba9b43fc69c3' self.assertPackageSuccess( diff --git a/packager/app/test/testdata/av1-mp4-with-encryption/bear-av1-video.mp4 b/packager/app/test/testdata/av1-mp4-with-encryption/bear-av1-video.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ea9660b1108736b5dc156c0614728bc7f9fc91e7 GIT binary patch literal 24949 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�*C?jlnpH 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 literal 0 HcmV?d00001 diff --git a/packager/app/test/testdata/av1-mp4-with-encryption/decrypted-bear-av1-video-0.mp4 b/packager/app/test/testdata/av1-mp4-with-encryption/decrypted-bear-av1-video-0.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..fd64d498e116043a0b151a8ff168d6eae7d5d77b GIT binary patch literal 24706 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 jKgP>1=VcKr_%J<@mNf3DkExMsu0BxQBry-- + +#EXT-X-STREAM-INF:BANDWIDTH=69777,AVERAGE-BANDWIDTH=69777,CODECS="av01.0.00M.08.0.110",RESOLUTION=320x240 +stream_0.m3u8 diff --git a/packager/app/test/testdata/av1-mp4-with-encryption/output.mpd b/packager/app/test/testdata/av1-mp4-with-encryption/output.mpd new file mode 100644 index 0000000000..9b12e8ca71 --- /dev/null +++ b/packager/app/test/testdata/av1-mp4-with-encryption/output.mpd @@ -0,0 +1,18 @@ + + + + + + + + AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA== + + + bear-av1-video.mp4 + + + + + + + diff --git a/packager/app/test/testdata/av1-mp4-with-encryption/stream_0.m3u8 b/packager/app/test/testdata/av1-mp4-with-encryption/stream_0.m3u8 new file mode 100644 index 0000000000..a36c7d0b9e --- /dev/null +++ b/packager/app/test/testdata/av1-mp4-with-encryption/stream_0.m3u8 @@ -0,0 +1,10 @@ +#EXTM3U +#EXT-X-VERSION:6 +## Generated with https://github.com/google/shaka-packager version -- +#EXT-X-TARGETDURATION:3 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-MAP:URI="bear-av1-video.mp4",BYTERANGE="1041@0" +#EXTINF:2.736, +#EXT-X-BYTERANGE:23864@1085 +bear-av1-video.mp4 +#EXT-X-ENDLIST diff --git a/packager/app/test/testdata/av1-webm-with-encryption/bear-av1-video.webm b/packager/app/test/testdata/av1-webm-with-encryption/bear-av1-video.webm new file mode 100644 index 0000000000000000000000000000000000000000..670eb6c143d588ddb565703fdf26de5ac2b3018f GIT binary patch literal 24112 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

~~d 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 UENPY)3_IWOzYV~&PlM3@9~v^V-T(jq literal 0 HcmV?d00001 diff --git a/packager/app/test/testdata/av1-webm-with-encryption/decrypted-bear-av1-video-0.webm b/packager/app/test/testdata/av1-webm-with-encryption/decrypted-bear-av1-video-0.webm new file mode 100644 index 0000000000000000000000000000000000000000..c4bdeb58c14f8fb817e18934bf18caae2d2615cd GIT binary patch literal 23979 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 literal 0 HcmV?d00001 diff --git a/packager/app/test/testdata/av1-webm-with-encryption/output.m3u8 b/packager/app/test/testdata/av1-webm-with-encryption/output.m3u8 new file mode 100644 index 0000000000..720cf71c45 --- /dev/null +++ b/packager/app/test/testdata/av1-webm-with-encryption/output.m3u8 @@ -0,0 +1,5 @@ +#EXTM3U +## Generated with https://github.com/google/shaka-packager version -- + +#EXT-X-STREAM-INF:BANDWIDTH=69426,AVERAGE-BANDWIDTH=69426,CODECS="av01.0.00M.08.0.110",RESOLUTION=320x240 +stream_0.m3u8 diff --git a/packager/app/test/testdata/av1-webm-with-encryption/output.mpd b/packager/app/test/testdata/av1-webm-with-encryption/output.mpd new file mode 100644 index 0000000000..c42890dfc2 --- /dev/null +++ b/packager/app/test/testdata/av1-webm-with-encryption/output.mpd @@ -0,0 +1,17 @@ + + + + + + + AAAANHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAExMjM0NTY3ODkwMTIzNDU2AAAAAA== + + + bear-av1-video.webm + + + + + + + diff --git a/packager/app/test/testdata/av1-webm-with-encryption/stream_0.m3u8 b/packager/app/test/testdata/av1-webm-with-encryption/stream_0.m3u8 new file mode 100644 index 0000000000..4e96051ceb --- /dev/null +++ b/packager/app/test/testdata/av1-webm-with-encryption/stream_0.m3u8 @@ -0,0 +1,10 @@ +#EXTM3U +#EXT-X-VERSION:6 +## Generated with https://github.com/google/shaka-packager version -- +#EXT-X-TARGETDURATION:3 +#EXT-X-PLAYLIST-TYPE:VOD +#EXT-X-MAP:URI="bear-av1-video.webm",BYTERANGE="358@0" +#EXTINF:2.735, +#EXT-X-BYTERANGE:23735@377 +bear-av1-video.webm +#EXT-X-ENDLIST diff --git a/packager/media/codecs/av1_parser.cc b/packager/media/codecs/av1_parser.cc index c7cb7a2f82..a3be5f2493 100644 --- a/packager/media/codecs/av1_parser.cc +++ b/packager/media/codecs/av1_parser.cc @@ -252,17 +252,22 @@ int FindLatestForward(int shifted_order_hints[], AV1Parser::AV1Parser() = default; AV1Parser::~AV1Parser() = default; -bool AV1Parser::Parse(const uint8_t* data, size_t data_size) { +bool AV1Parser::Parse(const uint8_t* data, + size_t data_size, + std::vector* tiles) { + tiles->clear(); + BitReader reader(data, data_size); while (reader.bits_available() > 0) { - if (!ParseOpenBitstreamUnit(&reader)) + if (!ParseOpenBitstreamUnit(&reader, tiles)) return false; } return true; } // 5.3.1. General OBU syntax. -bool AV1Parser::ParseOpenBitstreamUnit(BitReader* reader) { +bool AV1Parser::ParseOpenBitstreamUnit(BitReader* reader, + std::vector* tiles) { ObuHeader obu_header; RCHECK(ParseObuHeader(reader, &obu_header)); @@ -284,10 +289,10 @@ bool AV1Parser::ParseOpenBitstreamUnit(BitReader* reader) { RCHECK(ParseFrameHeaderObu(obu_header, reader)); break; case OBU_TILE_GROUP: - RCHECK(ParseTileGroupObu(obu_size, reader)); + RCHECK(ParseTileGroupObu(obu_size, reader, tiles)); break; case OBU_FRAME: - RCHECK(ParseFrameObu(obu_header, obu_size, reader)); + RCHECK(ParseFrameObu(obu_header, obu_size, reader, tiles)); break; default: // Skip all OBUs we are not interested. @@ -1638,18 +1643,21 @@ bool AV1Parser::SkipTemporalPointInfo(BitReader* reader) { // 5.10. Frame OBU syntax. bool AV1Parser::ParseFrameObu(const ObuHeader& obu_header, size_t size, - BitReader* reader) { + BitReader* reader, + std::vector* tiles) { const size_t start_bit_pos = reader->bit_position(); RCHECK(ParseFrameHeaderObu(obu_header, reader)); RCHECK(ByteAlignment(reader)); const size_t end_bit_pos = reader->bit_position(); const size_t header_bytes = (end_bit_pos - start_bit_pos) / 8; - RCHECK(ParseTileGroupObu(size - header_bytes, reader)); + RCHECK(ParseTileGroupObu(size - header_bytes, reader, tiles)); return true; } // 5.11.1. General tile group OBU syntax. -bool AV1Parser::ParseTileGroupObu(size_t size, BitReader* reader) { +bool AV1Parser::ParseTileGroupObu(size_t size, + BitReader* reader, + std::vector* tiles) { const TileInfo& tile_info = frame_header_.tile_info; const size_t start_bit_pos = reader->bit_position(); @@ -1680,6 +1688,7 @@ bool AV1Parser::ParseTileGroupObu(size_t size, BitReader* reader) { tile_size = tile_size_minus_1 + 1; size -= tile_size + tile_info.tile_size_bytes; } + tiles->push_back({reader->bit_position() / 8, tile_size}); RCHECK(reader->SkipBits(tile_size * 8)); // Skip the tile. } diff --git a/packager/media/codecs/av1_parser.h b/packager/media/codecs/av1_parser.h index cd6e4812a8..6d69cab5de 100644 --- a/packager/media/codecs/av1_parser.h +++ b/packager/media/codecs/av1_parser.h @@ -10,6 +10,8 @@ #include #include +#include + namespace shaka { namespace media { @@ -19,15 +21,25 @@ class BitReader; /// https://aomediacodec.github.io/av1-spec/. class AV1Parser { public: + struct Tile { + size_t start_offset_in_bytes; + size_t size_in_bytes; + }; + AV1Parser(); - ~AV1Parser(); + virtual ~AV1Parser(); /// Parse an AV1 sample. Note that the sample data SHALL be a sequence of OBUs /// forming a Temporal Unit, with each OBU SHALL follow the /// open_bitstream_unit Low Overhead Bitstream Format syntax. See /// https://aomediacodec.github.io/av1-isobmff/#sampleformat for details. + /// @param[out] on success, tiles will be filled with the tile information if + /// @a data contains Frame OBU or TileGroup OBU; It will be empty + /// otherwise. /// @return true on success, false otherwise. - bool Parse(const uint8_t* data, size_t data_size); + virtual bool Parse(const uint8_t* data, + size_t data_size, + std::vector* tiles); private: AV1Parser(const AV1Parser&) = delete; @@ -183,7 +195,7 @@ class AV1Parser { bool subsampling_y = false; }; - bool ParseOpenBitstreamUnit(BitReader* reader); + bool ParseOpenBitstreamUnit(BitReader* reader, std::vector* tiles); bool ParseObuHeader(BitReader* reader, ObuHeader* obu_header); bool ParseObuExtensionHeader(BitReader* reader, ObuExtensionHeader* obu_extension_header); @@ -248,10 +260,13 @@ class AV1Parser { // Frame OBU. bool ParseFrameObu(const ObuHeader& obu_header, size_t size, - BitReader* reader); + BitReader* reader, + std::vector* tiles); // TileGroup OBU. - bool ParseTileGroupObu(size_t size, BitReader* reader); + bool ParseTileGroupObu(size_t size, + BitReader* reader, + std::vector* tiles); bool SegFeatureActiveIdx(int idx, int feature); // Decoding process related helper functions. diff --git a/packager/media/codecs/av1_parser_unittest.cc b/packager/media/codecs/av1_parser_unittest.cc index cf510db0b4..4e8df86a45 100644 --- a/packager/media/codecs/av1_parser_unittest.cc +++ b/packager/media/codecs/av1_parser_unittest.cc @@ -6,18 +6,28 @@ #include "packager/media/codecs/av1_parser.h" +#include #include #include "packager/media/test/test_data_util.h" +using ::testing::ElementsAre; + namespace shaka { namespace media { +inline bool operator==(const AV1Parser::Tile& lhs, const AV1Parser::Tile& rhs) { + return lhs.start_offset_in_bytes == rhs.start_offset_in_bytes && + lhs.size_in_bytes == rhs.size_in_bytes; +} + TEST(AV1ParserTest, ParseIFrameSuccess) { const std::vector buffer = ReadTestDataFile("av1-I-frame-320x240"); AV1Parser parser; - ASSERT_TRUE(parser.Parse(buffer.data(), buffer.size())); + std::vector tiles; + ASSERT_TRUE(parser.Parse(buffer.data(), buffer.size(), &tiles)); + EXPECT_THAT(tiles, ElementsAre(AV1Parser::Tile{0x1d, 0x4e1})); } } // namespace media diff --git a/packager/media/crypto/subsample_generator.cc b/packager/media/crypto/subsample_generator.cc index 48d4e706da..784c3e40d1 100644 --- a/packager/media/crypto/subsample_generator.cc +++ b/packager/media/crypto/subsample_generator.cc @@ -11,6 +11,7 @@ #include "packager/media/base/decrypt_config.h" #include "packager/media/base/video_stream_info.h" +#include "packager/media/codecs/av1_parser.h" #include "packager/media/codecs/video_slice_header_parser.h" #include "packager/media/codecs/vp8_parser.h" #include "packager/media/codecs/vp9_parser.h" @@ -30,6 +31,39 @@ uint8_t GetNaluLengthSize(const StreamInfo& stream_info) { return video_stream_info.nalu_length_size(); } +bool ShouldAlignProtectedData(Codec codec, + FourCC protection_scheme, + bool vp9_subsample_encryption) { + switch (codec) { + case kCodecAV1: + // Per AV1 in ISO-BMFF spec [1], BytesOfProtectedData SHALL be a multiple + // of 16 bytes. + // [1] https://aomediacodec.github.io/av1-isobmff/#subsample-encryption + return true; + case kCodecVP9: + // "VP Codec ISO Media File Format Binding" document requires that the + // encrypted bytes of each frame within the superframe must be block + // aligned so that the counter state can be computed for each frame + // within the superframe. + // ISO/IEC 23001-7:2016 10.2 'cbc1' 10.3 'cens' + // The BytesOfProtectedData size SHALL be a multiple of 16 bytes to + // avoid partial blocks in Subsamples. + // For consistency, apply block alignment to all frames when VP9 subsample + // encryption is enabled. + return vp9_subsample_encryption; + default: + // ISO/IEC 23001-7:2016 10.2 'cbc1' 10.3 'cens' + // The BytesOfProtectedData size SHALL be a multiple of 16 bytes to avoid + // partial blocks in Subsamples. + // CMAF requires 'cenc' scheme BytesOfProtectedData SHALL be a multiple of + // 16 bytes; while 'cbcs' scheme BytesOfProtectedData SHALL start on the + // first byte of video data following the slice header. + return protection_scheme == FOURCC_cbc1 || + protection_scheme == FOURCC_cens || + protection_scheme == FOURCC_cenc; + } +} + // A convenient util class to organize subsamples, e.g. combine consecutive // subsamples with only clear bytes, split subsamples if the clear bytes exceeds // 2^16 etc. @@ -97,6 +131,9 @@ Status SubsampleGenerator::Initialize(FourCC protection_scheme, nalu_length_size_ = GetNaluLengthSize(stream_info); switch (codec_) { + case kCodecAV1: + av1_parser_.reset(new AV1Parser); + break; case kCodecVP9: if (vp9_subsample_encryption_) vpx_parser_.reset(new VP9Parser); @@ -114,39 +151,33 @@ Status SubsampleGenerator::Initialize(FourCC protection_scheme, return Status(error::ENCRYPTION_FAILURE, "Unknown video codec."); } } + if (av1_parser_) { + // Parse configOBUs in AV1CodecConfigurationRecord if exists. + // https://aomediacodec.github.io/av1-isobmff/#av1codecconfigurationbox-syntax. + const size_t kConfigOBUsOffset = 4; + const bool has_config_obus = + stream_info.codec_config().size() > kConfigOBUsOffset; + std::vector tiles; + if (has_config_obus && + !av1_parser_->Parse( + &stream_info.codec_config()[kConfigOBUsOffset], + stream_info.codec_config().size() - kConfigOBUsOffset, &tiles)) { + return Status( + error::ENCRYPTION_FAILURE, + "Failed to parse configOBUs in AV1CodecConfigurationRecord."); + } + DCHECK(tiles.empty()); + } if (header_parser_) { CHECK_NE(nalu_length_size_, 0u) << "AnnexB stream is not supported yet"; if (!header_parser_->Initialize(stream_info.codec_config())) { return Status(error::ENCRYPTION_FAILURE, - "Fail to read SPS and PPS data."); + "Failed to read SPS and PPS data."); } } - switch (codec_) { - case kCodecVP9: - // "VP Codec ISO Media File Format Binding" document requires that the - // encrypted bytes of each frame within the superframe must be block - // aligned so that the counter state can be computed for each frame - // within the superframe. - // ISO/IEC 23001-7:2016 10.2 'cbc1' 10.3 'cens' - // The BytesOfProtectedData size SHALL be a multiple of 16 bytes to - // avoid partial blocks in Subsamples. - // For consistency, apply block alignment to all frames when VP9 subsample - // encryption is enabled. - align_protected_data_ = vp9_subsample_encryption_; - break; - default: - // ISO/IEC 23001-7:2016 10.2 'cbc1' 10.3 'cens' - // The BytesOfProtectedData size SHALL be a multiple of 16 bytes to avoid - // partial blocks in Subsamples. - // CMAF requires 'cenc' scheme BytesOfProtectedData SHALL be a multiple of - // 16 bytes; while 'cbcs' scheme BytesOfProtectedData SHALL start on the - // first byte of video data following the slice header. - align_protected_data_ = protection_scheme == FOURCC_cbc1 || - protection_scheme == FOURCC_cens || - protection_scheme == FOURCC_cenc; - break; - } + align_protected_data_ = ShouldAlignProtectedData(codec_, protection_scheme, + vp9_subsample_encryption_); if (protection_scheme == kAppleSampleAesProtectionScheme) { const size_t kH264LeadingClearBytesSize = 32u; @@ -184,6 +215,8 @@ Status SubsampleGenerator::GenerateSubsamples( std::vector* subsamples) { subsamples->clear(); switch (codec_) { + case kCodecAV1: + return GenerateSubsamplesFromAV1Frame(frame, frame_size, subsamples); case kCodecH264: FALLTHROUGH_INTENDED; case kCodecH265: @@ -221,6 +254,11 @@ void SubsampleGenerator::InjectVideoSliceHeaderParserForTesting( header_parser_ = std::move(header_parser); } +void SubsampleGenerator::InjectAV1ParserForTesting( + std::unique_ptr av1_parser) { + av1_parser_ = std::move(av1_parser); +} + Status SubsampleGenerator::GenerateSubsamplesFromVPxFrame( const uint8_t* frame, size_t frame_size, @@ -299,5 +337,31 @@ Status SubsampleGenerator::GenerateSubsamplesFromH26xFrame( return Status::OK; } +Status SubsampleGenerator::GenerateSubsamplesFromAV1Frame( + const uint8_t* frame, + size_t frame_size, + std::vector* subsamples) { + DCHECK(av1_parser_); + std::vector av1_tiles; + if (!av1_parser_->Parse(frame, frame_size, &av1_tiles)) + return Status(error::ENCRYPTION_FAILURE, "Failed to parse AV1 frame."); + + SubsampleOrganizer subsample_organizer(align_protected_data_, subsamples); + + size_t last_tile_end_offset = 0; + for (const AV1Parser::Tile& tile : av1_tiles) { + DCHECK_LE(last_tile_end_offset, tile.start_offset_in_bytes); + // Per AV1 in ISO-BMFF spec [1], only decode_tile is encrypted. + // [1] https://aomediacodec.github.io/av1-isobmff/#subsample-encryption + subsample_organizer.AddSubsample( + tile.start_offset_in_bytes - last_tile_end_offset, tile.size_in_bytes); + last_tile_end_offset = tile.start_offset_in_bytes + tile.size_in_bytes; + } + DCHECK_LE(last_tile_end_offset, frame_size); + if (last_tile_end_offset < frame_size) + subsample_organizer.AddSubsample(frame_size - last_tile_end_offset, 0); + return Status::OK; +} + } // namespace media } // namespace shaka diff --git a/packager/media/crypto/subsample_generator.h b/packager/media/crypto/subsample_generator.h index 5a5ae5a589..75cb5b6533 100644 --- a/packager/media/crypto/subsample_generator.h +++ b/packager/media/crypto/subsample_generator.h @@ -17,6 +17,7 @@ namespace shaka { namespace media { +class AV1Parser; class VideoSliceHeaderParser; class VPxParser; struct SubsampleEntry; @@ -63,6 +64,7 @@ class SubsampleGenerator { void InjectVpxParserForTesting(std::unique_ptr vpx_parser); void InjectVideoSliceHeaderParserForTesting( std::unique_ptr header_parser); + void InjectAV1ParserForTesting(std::unique_ptr av1_parser); private: SubsampleGenerator(const SubsampleGenerator&) = delete; @@ -76,6 +78,10 @@ class SubsampleGenerator { const uint8_t* frame, size_t frame_size, std::vector* subsamples); + Status GenerateSubsamplesFromAV1Frame( + const uint8_t* frame, + size_t frame_size, + std::vector* subsamples); const bool vp9_subsample_encryption_ = false; // Whether the protected portion should be AES block (16 bytes) aligned. @@ -95,6 +101,8 @@ class SubsampleGenerator { std::unique_ptr vpx_parser_; // Video slice header parser for NAL strucutred streams. std::unique_ptr header_parser_; + // AV1 parser for AV1 streams. + std::unique_ptr av1_parser_; }; } // namespace media diff --git a/packager/media/crypto/subsample_generator_unittest.cc b/packager/media/crypto/subsample_generator_unittest.cc index a0c44cb4c7..13fb21d5fc 100644 --- a/packager/media/crypto/subsample_generator_unittest.cc +++ b/packager/media/crypto/subsample_generator_unittest.cc @@ -11,6 +11,7 @@ #include "packager/media/base/audio_stream_info.h" #include "packager/media/base/video_stream_info.h" +#include "packager/media/codecs/av1_parser.h" #include "packager/media/codecs/video_slice_header_parser.h" #include "packager/media/codecs/vpx_parser.h" #include "packager/status_test_util.h" @@ -30,8 +31,7 @@ using ::testing::Values; using ::testing::WithParamInterface; const bool kVP9SubsampleEncryption = true; -// Use H264 code config. -const uint8_t kH264CodecConfig[]{ +const uint8_t kH264CodecConfig[] = { // clang-format off // Header 0x01, 0x64, 0x00, 0x1e, 0xff, @@ -49,6 +49,7 @@ const uint8_t kH264CodecConfig[]{ 0x68, 0xeb, 0xe3, 0xcb, 0x22, 0xc0, // clang-format on }; +const uint8_t kAV1CodecConfig[] = {0x00, 0x01, 0x02, 0x03}; const int kTrackId = 1; const uint32_t kTimeScale = 1000; const uint64_t kDuration = 10000; @@ -71,6 +72,10 @@ VideoStreamInfo GetVideoStreamInfo(Codec codec) { codec_config = kH264CodecConfig; codec_config_size = sizeof(kH264CodecConfig); break; + case kCodecAV1: + codec_config = kAV1CodecConfig; + codec_config_size = sizeof(kAV1CodecConfig); + break; default: // We do not care about the codec configs for other codecs in this file. break; @@ -121,6 +126,14 @@ class MockVideoSliceHeaderParser : public VideoSliceHeaderParser { MOCK_METHOD1(GetHeaderSize, int64_t(const Nalu& nalu)); }; +class MockAV1Parser : public AV1Parser { + public: + MOCK_METHOD3(Parse, + bool(const uint8_t* data, + size_t data_size, + std::vector* tiles)); +}; + class SubsampleGeneratorTest : public Test, public WithParamInterface { public: SubsampleGeneratorTest() : protection_scheme_(GetParam()) {} @@ -345,6 +358,58 @@ TEST_P(SubsampleGeneratorTest, H264SubsampleEncryption) { EXPECT_THAT(subsamples, ElementsAreArray(kExpectedAlignedSubsamples)); } +TEST_P(SubsampleGeneratorTest, AV1ParserFailed) { + SubsampleGenerator generator(kVP9SubsampleEncryption); + ASSERT_OK( + generator.Initialize(protection_scheme_, GetVideoStreamInfo(kCodecAV1))); + + constexpr size_t kFrameSize = 50; + constexpr uint8_t kFrame[kFrameSize] = {}; + + std::unique_ptr mock_av1_parser(new MockAV1Parser); + EXPECT_CALL(*mock_av1_parser, Parse(kFrame, kFrameSize, _)) + .WillOnce(Return(false)); + + generator.InjectAV1ParserForTesting(std::move(mock_av1_parser)); + + std::vector subsamples; + ASSERT_NOT_OK(generator.GenerateSubsamples(kFrame, kFrameSize, &subsamples)); +} + +TEST_P(SubsampleGeneratorTest, AV1SubsampleEncryption) { + SubsampleGenerator generator(kVP9SubsampleEncryption); + ASSERT_OK( + generator.Initialize(protection_scheme_, GetVideoStreamInfo(kCodecAV1))); + + constexpr size_t kFrameSize = 50; + constexpr uint8_t kFrame[kFrameSize] = {}; + constexpr size_t kTileOffsets[] = {4, 11}; + constexpr size_t kTileSizes[] = {6, 33}; + // AV1 block align protected data for all protection schemes. + const SubsampleEntry kExpectedSubsamples[] = { + // {4,6},{11-4-6,33},{50-11-33,0} block aligned => {10,0},{2,32},{6,0}. + // Then merge consecutive clear-only subsamples. + {12, 32}, + {6, 0}, + }; + + std::vector tiles(2); + for (int i = 0; i < 2; i++) { + tiles[i].start_offset_in_bytes = kTileOffsets[i]; + tiles[i].size_in_bytes = kTileSizes[i]; + } + + std::unique_ptr mock_av1_parser(new MockAV1Parser); + EXPECT_CALL(*mock_av1_parser, Parse(kFrame, kFrameSize, _)) + .WillOnce(DoAll(SetArgPointee<2>(tiles), Return(true))); + + generator.InjectAV1ParserForTesting(std::move(mock_av1_parser)); + + std::vector subsamples; + ASSERT_OK(generator.GenerateSubsamples(kFrame, kFrameSize, &subsamples)); + EXPECT_THAT(subsamples, ElementsAreArray(kExpectedSubsamples)); +} + TEST_P(SubsampleGeneratorTest, AACIsFullSampleEncrypted) { SubsampleGenerator generator(kVP9SubsampleEncryption); ASSERT_OK(