From 0709db4bbc957174e0f0fcf651e23faef2bcdd6e Mon Sep 17 00:00:00 2001 From: KongQun Yang Date: Fri, 24 Aug 2018 19:04:00 -0700 Subject: [PATCH] Add support for AV1 Implemented per AV1 Codec ISO Media File Format Binding at https://aomediacodec.github.io/av1-isobmff/ And AOM AV1 codec mapping in Matroska/WebM at https://github.com/Matroska-Org/matroska-specification/blob/av1-mappin/codec/av1.md Note that AV1 specific boxes are not supported in this CL, i.e. AV1 Forward Key Frame sample group entry 'av1f', AV1 Multi-Frame sample group entry 'av1m' etc are not supported. These boxes are optional. We will add support later if they are useful to the clients / players. Encryption is not supported yet. Issue #453. Change-Id: I630432d0a9bf82d263ffaf40e57f67fc65eee902 --- packager/app/test/packager_test.py | 27 ++++++ .../av1-mp4-to-webm/bear-av1-video.webm | Bin 0 -> 23986 bytes .../test/testdata/av1-mp4-to-webm/output.m3u8 | 5 + .../test/testdata/av1-mp4-to-webm/output.mpd | 14 +++ .../testdata/av1-mp4-to-webm/stream_0.m3u8 | 10 ++ .../test/testdata/av1-mp4/bear-av1-video.mp4 | Bin 0 -> 24706 bytes .../app/test/testdata/av1-mp4/output.m3u8 | 5 + packager/app/test/testdata/av1-mp4/output.mpd | 14 +++ .../app/test/testdata/av1-mp4/stream_0.m3u8 | 10 ++ .../test/testdata/av1-webm/bear-av1-video.mp4 | Bin 0 -> 25030 bytes .../app/test/testdata/av1-webm/output.m3u8 | 5 + .../app/test/testdata/av1-webm/output.mpd | 14 +++ .../app/test/testdata/av1-webm/stream_0.m3u8 | 10 ++ packager/media/base/fourccs.h | 3 +- packager/media/base/stream_info.h | 4 +- packager/media/base/video_stream_info.cc | 4 +- .../codecs/av1_codec_configuration_record.cc | 90 +++++++++++++++++ .../codecs/av1_codec_configuration_record.h | 54 +++++++++++ ...av1_codec_configuration_record_unittest.cc | 91 ++++++++++++++++++ packager/media/codecs/codecs.gyp | 3 + .../codecs/vp_codec_configuration_record.cc | 2 - packager/media/formats/mp4/box_definitions.cc | 24 ++--- .../media/formats/mp4/mp4_media_parser.cc | 17 +++- packager/media/formats/mp4/mp4_muxer.cc | 4 +- packager/media/formats/webm/segmenter.cc | 17 +++- .../media/formats/webm/webm_cluster_parser.cc | 60 ++++++------ .../media/formats/webm/webm_tracks_parser.cc | 8 +- .../media/formats/webm/webm_video_client.cc | 39 +++++--- .../media/formats/webm/webm_video_client.h | 5 +- packager/media/test/data/bear-av1.mp4 | Bin 0 -> 24355 bytes packager/media/test/data/bear-av1.webm | Bin 0 -> 23986 bytes 31 files changed, 467 insertions(+), 72 deletions(-) create mode 100644 packager/app/test/testdata/av1-mp4-to-webm/bear-av1-video.webm create mode 100644 packager/app/test/testdata/av1-mp4-to-webm/output.m3u8 create mode 100644 packager/app/test/testdata/av1-mp4-to-webm/output.mpd create mode 100644 packager/app/test/testdata/av1-mp4-to-webm/stream_0.m3u8 create mode 100644 packager/app/test/testdata/av1-mp4/bear-av1-video.mp4 create mode 100644 packager/app/test/testdata/av1-mp4/output.m3u8 create mode 100644 packager/app/test/testdata/av1-mp4/output.mpd create mode 100644 packager/app/test/testdata/av1-mp4/stream_0.m3u8 create mode 100644 packager/app/test/testdata/av1-webm/bear-av1-video.mp4 create mode 100644 packager/app/test/testdata/av1-webm/output.m3u8 create mode 100644 packager/app/test/testdata/av1-webm/output.mpd create mode 100644 packager/app/test/testdata/av1-webm/stream_0.m3u8 create mode 100644 packager/media/codecs/av1_codec_configuration_record.cc create mode 100644 packager/media/codecs/av1_codec_configuration_record.h create mode 100644 packager/media/codecs/av1_codec_configuration_record_unittest.cc create mode 100644 packager/media/test/data/bear-av1.mp4 create mode 100644 packager/media/test/data/bear-av1.webm diff --git a/packager/app/test/packager_test.py b/packager/app/test/packager_test.py index 5237167380..194e16a193 100755 --- a/packager/app/test/packager_test.py +++ b/packager/app/test/packager_test.py @@ -849,6 +849,33 @@ class PackagerFunctionalTest(PackagerAppTest): self._GetFlags(output_dash=True)) self._CheckTestResults('vorbis-webm') + def testAv1Mp4(self): + self.assertPackageSuccess( + self._GetStreams(['video'], + output_format='mp4', + test_files=['bear-av1.mp4']), + self._GetFlags(output_dash=True, output_hls=True) + ) + self._CheckTestResults('av1-mp4') + + def testAv1Mp4ToWebM(self): + self.assertPackageSuccess( + self._GetStreams(['video'], + output_format='webm', + test_files=['bear-av1.mp4']), + self._GetFlags(output_dash=True, output_hls=True) + ) + self._CheckTestResults('av1-mp4-to-webm') + + def testAv1WebM(self): + self.assertPackageSuccess( + self._GetStreams(['video'], + output_format='mp4', + test_files=['bear-av1.webm']), + self._GetFlags(output_dash=True, output_hls=True) + ) + self._CheckTestResults('av1-webm') + def testEncryption(self): self.assertPackageSuccess( self._GetStreams(['audio', 'video']), diff --git a/packager/app/test/testdata/av1-mp4-to-webm/bear-av1-video.webm b/packager/app/test/testdata/av1-mp4-to-webm/bear-av1-video.webm new file mode 100644 index 0000000000000000000000000000000000000000..a945902fb0feb2bf7a72db19a8d498c1349af25e GIT binary patch literal 23986 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 literal 0 HcmV?d00001 diff --git a/packager/app/test/testdata/av1-mp4-to-webm/output.m3u8 b/packager/app/test/testdata/av1-mp4-to-webm/output.m3u8 new file mode 100644 index 0000000000..815dd2738a --- /dev/null +++ b/packager/app/test/testdata/av1-mp4-to-webm/output.m3u8 @@ -0,0 +1,5 @@ +#EXTM3U +## Generated with https://github.com/google/shaka-packager version -- + +#EXT-X-STREAM-INF:BANDWIDTH=69160,AVERAGE-BANDWIDTH=69160,CODECS="av01.0.00M.08.0.110",RESOLUTION=320x240 +stream_0.m3u8 diff --git a/packager/app/test/testdata/av1-mp4-to-webm/output.mpd b/packager/app/test/testdata/av1-mp4-to-webm/output.mpd new file mode 100644 index 0000000000..938730bcd2 --- /dev/null +++ b/packager/app/test/testdata/av1-mp4-to-webm/output.mpd @@ -0,0 +1,14 @@ + + + + + + + bear-av1-video.webm + + + + + + + diff --git a/packager/app/test/testdata/av1-mp4-to-webm/stream_0.m3u8 b/packager/app/test/testdata/av1-mp4-to-webm/stream_0.m3u8 new file mode 100644 index 0000000000..75a85d62a7 --- /dev/null +++ b/packager/app/test/testdata/av1-mp4-to-webm/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="314@0" +#EXTINF:2.736, +#EXT-X-BYTERANGE:23653@333 +bear-av1-video.webm +#EXT-X-ENDLIST diff --git a/packager/app/test/testdata/av1-mp4/bear-av1-video.mp4 b/packager/app/test/testdata/av1-mp4/bear-av1-video.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/output.mpd b/packager/app/test/testdata/av1-mp4/output.mpd new file mode 100644 index 0000000000..6dadc45a81 --- /dev/null +++ b/packager/app/test/testdata/av1-mp4/output.mpd @@ -0,0 +1,14 @@ + + + + + + + bear-av1-video.mp4 + + + + + + + diff --git a/packager/app/test/testdata/av1-mp4/stream_0.m3u8 b/packager/app/test/testdata/av1-mp4/stream_0.m3u8 new file mode 100644 index 0000000000..3ab711063a --- /dev/null +++ b/packager/app/test/testdata/av1-mp4/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="798@0" +#EXTINF:2.736, +#EXT-X-BYTERANGE:23864@842 +bear-av1-video.mp4 +#EXT-X-ENDLIST diff --git a/packager/app/test/testdata/av1-webm/bear-av1-video.mp4 b/packager/app/test/testdata/av1-webm/bear-av1-video.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..5021b08e92599ce30c63187213c2522a23552933 GIT binary patch literal 25030 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 + +#EXT-X-STREAM-INF:BANDWIDTH=70752,AVERAGE-BANDWIDTH=70752,CODECS="av01.0.00M.08.0.110",RESOLUTION=320x240 +stream_0.m3u8 diff --git a/packager/app/test/testdata/av1-webm/output.mpd b/packager/app/test/testdata/av1-webm/output.mpd new file mode 100644 index 0000000000..cc84f078f7 --- /dev/null +++ b/packager/app/test/testdata/av1-webm/output.mpd @@ -0,0 +1,14 @@ + + + + + + + bear-av1-video.mp4 + + + + + + + diff --git a/packager/app/test/testdata/av1-webm/stream_0.m3u8 b/packager/app/test/testdata/av1-webm/stream_0.m3u8 new file mode 100644 index 0000000000..5182dd0c0d --- /dev/null +++ b/packager/app/test/testdata/av1-webm/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="798@0" +#EXTINF:2.735, +#EXT-X-BYTERANGE:24188@842 +bear-av1-video.mp4 +#EXT-X-ENDLIST diff --git a/packager/media/base/fourccs.h b/packager/media/base/fourccs.h index 5390b0d417..c1185a1843 100644 --- a/packager/media/base/fourccs.h +++ b/packager/media/base/fourccs.h @@ -22,6 +22,8 @@ enum FourCC : uint32_t { FOURCC_ac_3 = 0x61632d33, // "ac-3" FOURCC_ac3d = 0x61633364, FOURCC_apad = 0x61706164, + FOURCC_av01 = 0x61763031, + FOURCC_av1C = 0x61763143, FOURCC_avc1 = 0x61766331, FOURCC_avc3 = 0x61766333, FOURCC_avcC = 0x61766343, @@ -139,7 +141,6 @@ enum FourCC : uint32_t { FOURCC_vmhd = 0x766d6864, FOURCC_vp08 = 0x76703038, FOURCC_vp09 = 0x76703039, - FOURCC_vp10 = 0x76703130, FOURCC_vpcC = 0x76706343, FOURCC_vsid = 0x76736964, FOURCC_vttC = 0x76747443, diff --git a/packager/media/base/stream_info.h b/packager/media/base/stream_info.h index d6ce354476..ac9b9d5947 100644 --- a/packager/media/base/stream_info.h +++ b/packager/media/base/stream_info.h @@ -29,11 +29,11 @@ enum Codec { kUnknownCodec = 0, kCodecVideo = 100, - kCodecH264 = kCodecVideo, + kCodecAV1 = kCodecVideo, + kCodecH264, kCodecH265, kCodecVP8, kCodecVP9, - kCodecVP10, kCodecVideoMaxPlusOne, kCodecAudio = 200, diff --git a/packager/media/base/video_stream_info.cc b/packager/media/base/video_stream_info.cc index dc6f3eb194..e9caa507b5 100644 --- a/packager/media/base/video_stream_info.cc +++ b/packager/media/base/video_stream_info.cc @@ -18,6 +18,8 @@ namespace media { namespace { std::string VideoCodecToString(Codec codec) { switch (codec) { + case kCodecAV1: + return "AV1"; case kCodecH264: return "H264"; case kCodecH265: @@ -26,8 +28,6 @@ std::string VideoCodecToString(Codec codec) { return "VP8"; case kCodecVP9: return "VP9"; - case kCodecVP10: - return "VP10"; default: NOTIMPLEMENTED() << "Unknown Video Codec: " << codec; return "UnknownCodec"; diff --git a/packager/media/codecs/av1_codec_configuration_record.cc b/packager/media/codecs/av1_codec_configuration_record.cc new file mode 100644 index 0000000000..81f156ee28 --- /dev/null +++ b/packager/media/codecs/av1_codec_configuration_record.cc @@ -0,0 +1,90 @@ +// Copyright 2018 Google LLC. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file or at +// https://developers.google.com/open-source/licenses/bsd + +#include "packager/media/codecs/av1_codec_configuration_record.h" + +#include "packager/base/strings/stringprintf.h" +#include "packager/media/base/bit_reader.h" +#include "packager/media/base/rcheck.h" + +namespace shaka { +namespace media { + +AV1CodecConfigurationRecord::AV1CodecConfigurationRecord() = default; + +AV1CodecConfigurationRecord::~AV1CodecConfigurationRecord() = default; + +// https://aomediacodec.github.io/av1-isobmff/#av1codecconfigurationbox-section +// aligned (8) class AV1CodecConfigurationRecord { +// unsigned int (1) marker = 1; +// unsigned int (7) version = 1; +// unsigned int (3) seq_profile; +// unsigned int (5) seq_level_idx_0; +// unsigned int (1) seq_tier_0; +// unsigned int (1) high_bitdepth; +// unsigned int (1) twelve_bit; +// unsigned int (1) monochrome; +// unsigned int (1) chroma_subsampling_x; +// unsigned int (1) chroma_subsampling_y; +// unsigned int (2) chroma_sample_position; +// unsigned int (3) reserved = 0; +// +// unsigned int (1) initial_presentation_delay_present; +// if (initial_presentation_delay_present) { +// unsigned int (4) initial_presentation_delay_minus_one; +// } else { +// unsigned int (4) reserved = 0; +// } +// +// unsigned int (8)[] configOBUs; +// } +bool AV1CodecConfigurationRecord::Parse(const uint8_t* data, size_t data_size) { + RCHECK(data_size > 0); + + BitReader reader(data, data_size); + + int marker; + RCHECK(reader.ReadBits(1, &marker)); + RCHECK(marker == 1); + + int version; + RCHECK(reader.ReadBits(7, &version)); + RCHECK(version == 1); + + RCHECK(reader.ReadBits(3, &profile_)); + RCHECK(reader.ReadBits(5, &level_)); + RCHECK(reader.ReadBits(1, &tier_)); + + int high_bitdepth; + int twelve_bit; + RCHECK(reader.ReadBits(1, &high_bitdepth)); + RCHECK(reader.ReadBits(1, &twelve_bit)); + bit_depth_ = twelve_bit ? 12 : (high_bitdepth ? 10 : 8); + + RCHECK(reader.ReadBits(1, &mono_chrome_)); + RCHECK(reader.ReadBits(1, &chroma_subsampling_x_)); + RCHECK(reader.ReadBits(1, &chroma_subsampling_y_)); + RCHECK(reader.ReadBits(2, &chroma_sample_position_)); + + // Skip other fields (e.g. initial_presentation_delay) which we do not need. + return true; +} + +// https://aomediacodec.github.io/av1-isobmff/#codecsparam +// ..... +// ... +// . +// The parameters starting from colorPrimaries are omitted as they are not +// present in AV1 Codec Configuration Record and they are optional. +std::string AV1CodecConfigurationRecord::GetCodecString() const { + return base::StringPrintf("av01.%d.%02d%c.%02d.%d.%d%d%d", profile_, level_, + tier_ ? 'H' : 'M', bit_depth_, mono_chrome_, + chroma_subsampling_x_, chroma_subsampling_y_, + chroma_sample_position_); +} + +} // namespace media +} // namespace shaka diff --git a/packager/media/codecs/av1_codec_configuration_record.h b/packager/media/codecs/av1_codec_configuration_record.h new file mode 100644 index 0000000000..463e3ba708 --- /dev/null +++ b/packager/media/codecs/av1_codec_configuration_record.h @@ -0,0 +1,54 @@ +// Copyright 2018 Google LLC. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file or at +// https://developers.google.com/open-source/licenses/bsd + +#ifndef PACKAGER_MEDIA_CODECS_AV1_CODEC_CONFIGURATION_RECORD_H_ +#define PACKAGER_MEDIA_CODECS_AV1_CODEC_CONFIGURATION_RECORD_H_ + +#include +#include +#include + +namespace shaka { +namespace media { + +/// Class for parsing AV1 codec configuration record. +class AV1CodecConfigurationRecord { + public: + AV1CodecConfigurationRecord(); + ~AV1CodecConfigurationRecord(); + + /// Parses input to extract codec configuration record. + /// @return false if there are parsing errors. + bool Parse(const std::vector& data) { + return Parse(data.data(), data.size()); + } + + /// Parses input to extract decoder configuration record. + /// @return false if there are parsing errors. + bool Parse(const uint8_t* data, size_t data_size); + + /// @return The codec string. + std::string GetCodecString() const; + + private: + int profile_ = 0; + int level_ = 0; + int tier_ = 0; + int bit_depth_ = 0; + int mono_chrome_ = 0; + int chroma_subsampling_x_ = 0; + int chroma_subsampling_y_ = 0; + int chroma_sample_position_ = 0; + + // Not using DISALLOW_COPY_AND_ASSIGN here intentionally to allow the compiler + // generated copy constructor and assignment operator. Since the internal data + // is small, the performance impact is minimal. +}; + +} // namespace media +} // namespace shaka + +#endif // PACKAGER_MEDIA_CODECS_AV1_CODEC_CONFIGURATION_RECORD_H_ diff --git a/packager/media/codecs/av1_codec_configuration_record_unittest.cc b/packager/media/codecs/av1_codec_configuration_record_unittest.cc new file mode 100644 index 0000000000..7c877f3f7a --- /dev/null +++ b/packager/media/codecs/av1_codec_configuration_record_unittest.cc @@ -0,0 +1,91 @@ +// Copyright 2018 Google LLC. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file or at +// https://developers.google.com/open-source/licenses/bsd + +#include "packager/media/codecs/av1_codec_configuration_record.h" + +#include + +namespace shaka { +namespace media { + +TEST(AV1CodecConfigurationRecordTest, Success) { + const uint8_t kAV1CodecConfigurationData[] = { + 0x81, // mark bit and version + 0x04, // profile = 0, level = 4 + 0x4E, // tier = 0, bit_depth = 10, mono_chrome = 0 + // chroma_subsampling_x = 1, chroma_subsampling_y = 1, + // chroma_sample_position = 2 + // We do not care about other data. + 0x00, + }; + + AV1CodecConfigurationRecord av1_config; + ASSERT_TRUE(av1_config.Parse( + std::vector(std::begin(kAV1CodecConfigurationData), + std::end(kAV1CodecConfigurationData)))); + + EXPECT_EQ(av1_config.GetCodecString(), "av01.0.04M.10.0.112"); +} + +TEST(AV1CodecConfigurationRecordTest, Success2) { + const uint8_t kAV1CodecConfigurationData[] = { + 0x81, // mark bit and version + 0x35, // profile = 1, level = 15 + 0xF4, // tier = 1, bit_depth = 12, mono_chrome = 1 + // chroma_subsampling_x = 0, chroma_subsampling_y = 1, + // chroma_sample_position = 0 + // We do not care about other data. + 0x00, + }; + + AV1CodecConfigurationRecord av1_config; + ASSERT_TRUE(av1_config.Parse( + std::vector(std::begin(kAV1CodecConfigurationData), + std::end(kAV1CodecConfigurationData)))); + + EXPECT_EQ(av1_config.GetCodecString(), "av01.1.21H.12.1.010"); +} + +TEST(AV1CodecConfigurationRecordTest, InsufficientData) { + const uint8_t kAV1CodecConfigurationData[] = { + 0x81, + 0x04, + }; + + AV1CodecConfigurationRecord av1_config; + ASSERT_FALSE(av1_config.Parse( + std::vector(std::begin(kAV1CodecConfigurationData), + std::end(kAV1CodecConfigurationData)))); +} + +TEST(AV1CodecConfigurationRecordTest, IncorrectMarkerBit) { + const uint8_t kAV1CodecConfigurationData[] = { + 0x01, + 0x04, + 0x4E, + }; + + AV1CodecConfigurationRecord av1_config; + ASSERT_FALSE(av1_config.Parse( + std::vector(std::begin(kAV1CodecConfigurationData), + std::end(kAV1CodecConfigurationData)))); +} + +TEST(AV1CodecConfigurationRecordTest, IncorrectVersion) { + const uint8_t kAV1CodecConfigurationData[] = { + 0x82, + 0x04, + 0x4E, + }; + + AV1CodecConfigurationRecord av1_config; + ASSERT_FALSE(av1_config.Parse( + std::vector(std::begin(kAV1CodecConfigurationData), + std::end(kAV1CodecConfigurationData)))); +} + +} // namespace media +} // namespace shaka diff --git a/packager/media/codecs/codecs.gyp b/packager/media/codecs/codecs.gyp index ae4537ba4a..44d2b329b1 100644 --- a/packager/media/codecs/codecs.gyp +++ b/packager/media/codecs/codecs.gyp @@ -17,6 +17,8 @@ 'aac_audio_specific_config.h', 'ac3_audio_util.cc', 'ac3_audio_util.h', + 'av1_codec_configuration_record.cc', + 'av1_codec_configuration_record.h', 'avc_decoder_configuration_record.cc', 'avc_decoder_configuration_record.h', 'decoder_configuration_record.cc', @@ -66,6 +68,7 @@ 'sources': [ 'aac_audio_specific_config_unittest.cc', 'ac3_audio_util_unittest.cc', + 'av1_codec_configuration_record_unittest.cc', 'avc_decoder_configuration_record_unittest.cc', 'ec3_audio_util_unittest.cc', 'es_descriptor_unittest.cc', diff --git a/packager/media/codecs/vp_codec_configuration_record.cc b/packager/media/codecs/vp_codec_configuration_record.cc index 9a8fc28c2a..ec6c26cd6f 100644 --- a/packager/media/codecs/vp_codec_configuration_record.cc +++ b/packager/media/codecs/vp_codec_configuration_record.cc @@ -30,8 +30,6 @@ std::string VPCodecAsString(Codec codec) { return "vp08"; case kCodecVP9: return "vp09"; - case kCodecVP10: - return "vp10"; default: LOG(WARNING) << "Unknown VP codec: " << codec; return std::string(); diff --git a/packager/media/formats/mp4/box_definitions.cc b/packager/media/formats/mp4/box_definitions.cc index 73e43e018e..2d9603a806 100644 --- a/packager/media/formats/mp4/box_definitions.cc +++ b/packager/media/formats/mp4/box_definitions.cc @@ -34,6 +34,7 @@ const uint16_t kVideoFrameCount = 1; const uint16_t kVideoDepth = 0x0018; const uint32_t kCompressorNameSize = 32u; +const char kAv1CompressorName[] = "\012AOM Coding"; const char kAvcCompressorName[] = "\012AVC Coding"; const char kHevcCompressorName[] = "\013HEVC Coding"; const char kVpcCompressorName[] = "\012VPC Coding"; @@ -1478,24 +1479,24 @@ bool VideoSampleEntry::ReadWriteInternal(BoxBuffer* buffer) { const FourCC actual_format = GetActualFormat(); switch (actual_format) { + case FOURCC_av01: + compressor_name.assign(std::begin(kAv1CompressorName), + std::end(kAv1CompressorName)); + break; case FOURCC_avc1: case FOURCC_avc3: - compressor_name.assign( - kAvcCompressorName, - kAvcCompressorName + arraysize(kAvcCompressorName)); + compressor_name.assign(std::begin(kAvcCompressorName), + std::end(kAvcCompressorName)); break; case FOURCC_hev1: case FOURCC_hvc1: - compressor_name.assign( - kHevcCompressorName, - kHevcCompressorName + arraysize(kHevcCompressorName)); + compressor_name.assign(std::begin(kHevcCompressorName), + std::end(kHevcCompressorName)); break; case FOURCC_vp08: case FOURCC_vp09: - case FOURCC_vp10: - compressor_name.assign( - kVpcCompressorName, - kVpcCompressorName + arraysize(kVpcCompressorName)); + compressor_name.assign(std::begin(kVpcCompressorName), + std::end(kVpcCompressorName)); break; default: LOG(ERROR) << FourCCToString(actual_format) << " is not supported."; @@ -1571,6 +1572,8 @@ size_t VideoSampleEntry::ComputeSizeInternal() { FourCC VideoSampleEntry::GetCodecConfigurationBoxType(FourCC format) const { switch (format) { + case FOURCC_av01: + return FOURCC_av1C; case FOURCC_avc1: case FOURCC_avc3: return FOURCC_avcC; @@ -1579,7 +1582,6 @@ FourCC VideoSampleEntry::GetCodecConfigurationBoxType(FourCC format) const { return FOURCC_hvcC; case FOURCC_vp08: case FOURCC_vp09: - case FOURCC_vp10: return FOURCC_vpcC; default: LOG(ERROR) << FourCCToString(format) << " is not supported."; diff --git a/packager/media/formats/mp4/mp4_media_parser.cc b/packager/media/formats/mp4/mp4_media_parser.cc index 4358853d29..1e41ff0d71 100644 --- a/packager/media/formats/mp4/mp4_media_parser.cc +++ b/packager/media/formats/mp4/mp4_media_parser.cc @@ -22,6 +22,7 @@ #include "packager/media/base/rcheck.h" #include "packager/media/base/video_stream_info.h" #include "packager/media/codecs/ac3_audio_util.h" +#include "packager/media/codecs/av1_codec_configuration_record.h" #include "packager/media/codecs/avc_decoder_configuration_record.h" #include "packager/media/codecs/ec3_audio_util.h" #include "packager/media/codecs/es_descriptor.h" @@ -59,6 +60,8 @@ H26xStreamFormat GetH26xStreamFormat(FourCC fourcc) { Codec FourCCToCodec(FourCC fourcc) { switch (fourcc) { + case FOURCC_av01: + return kCodecAV1; case FOURCC_avc1: case FOURCC_avc3: return kCodecH264; @@ -69,8 +72,6 @@ Codec FourCCToCodec(FourCC fourcc) { return kCodecVP8; case FOURCC_vp09: return kCodecVP9; - case FOURCC_vp10: - return kCodecVP10; case FOURCC_Opus: return kCodecOpus; case FOURCC_dtsc: @@ -518,6 +519,15 @@ bool MP4MediaParser::ParseMoov(BoxReader* reader) { const FourCC actual_format = entry.GetActualFormat(); const Codec video_codec = FourCCToCodec(actual_format); switch (actual_format) { + case FOURCC_av01: { + AV1CodecConfigurationRecord av1_config; + if (!av1_config.Parse(entry.codec_configuration.data)) { + LOG(ERROR) << "Failed to parse av1c."; + return false; + } + codec_string = av1_config.GetCodecString(); + break; + } case FOURCC_avc1: case FOURCC_avc3: { AVCDecoderConfigurationRecord avc_config; @@ -567,8 +577,7 @@ bool MP4MediaParser::ParseMoov(BoxReader* reader) { break; } case FOURCC_vp08: - case FOURCC_vp09: - case FOURCC_vp10: { + case FOURCC_vp09: { VPCodecConfigurationRecord vp_config; if (!vp_config.ParseMP4(entry.codec_configuration.data)) { LOG(ERROR) << "Failed to parse vpcc."; diff --git a/packager/media/formats/mp4/mp4_muxer.cc b/packager/media/formats/mp4/mp4_muxer.cc index 7a7d303ef6..5314250cae 100644 --- a/packager/media/formats/mp4/mp4_muxer.cc +++ b/packager/media/formats/mp4/mp4_muxer.cc @@ -44,6 +44,8 @@ void SetStartAndEndFromOffsetAndSize(size_t offset, FourCC CodecToFourCC(Codec codec, H26xStreamFormat h26x_stream_format) { switch (codec) { + case kCodecAV1: + return FOURCC_av01; case kCodecH264: return h26x_stream_format == H26xStreamFormat::kNalUnitStreamWithParameterSetNalus @@ -58,8 +60,6 @@ FourCC CodecToFourCC(Codec codec, H26xStreamFormat h26x_stream_format) { return FOURCC_vp08; case kCodecVP9: return FOURCC_vp09; - case kCodecVP10: - return FOURCC_vp10; case kCodecAAC: return FOURCC_mp4a; case kCodecAC3: diff --git a/packager/media/formats/webm/segmenter.cc b/packager/media/formats/webm/segmenter.cc index 6435284ba7..e9efa6bc98 100644 --- a/packager/media/formats/webm/segmenter.cc +++ b/packager/media/formats/webm/segmenter.cc @@ -284,10 +284,17 @@ void Segmenter::UpdateProgress(uint64_t progress) { Status Segmenter::InitializeVideoTrack(const VideoStreamInfo& info, VideoTrack* track) { - if (info.codec() == kCodecVP8) { - track->set_codec_id(mkvmuxer::Tracks::kVp8CodecId); + if (info.codec() == kCodecAV1) { + track->set_codec_id("V_AV1"); + if (!track->SetCodecPrivate(info.codec_config().data(), + info.codec_config().size())) { + return Status(error::INTERNAL_ERROR, + "Private codec data required for AV1 streams"); + } + } else if (info.codec() == kCodecVP8) { + track->set_codec_id("V_VP8"); } else if (info.codec() == kCodecVP9) { - track->set_codec_id(mkvmuxer::Tracks::kVp9CodecId); + track->set_codec_id("V_VP9"); // The |StreamInfo::codec_config| field is stored using the MP4 format; we // need to convert it to the WebM format. @@ -319,9 +326,9 @@ Status Segmenter::InitializeVideoTrack(const VideoStreamInfo& info, "Private codec data required for VPx streams"); } } else { - LOG(ERROR) << "Only VP8 and VP9 video codecs are supported in WebM."; + LOG(ERROR) << "Only VP8, VP9 and AV1 video codecs are supported in WebM."; return Status(error::UNIMPLEMENTED, - "Only VP8 and VP9 video codecs are supported in WebM."); + "Only VP8, VP9 and AV1 video codecs are supported in WebM."); } track->set_uid(info.track_id()); diff --git a/packager/media/formats/webm/webm_cluster_parser.cc b/packager/media/formats/webm/webm_cluster_parser.cc index 350342a75f..b3dca771b6 100644 --- a/packager/media/formats/webm/webm_cluster_parser.cc +++ b/packager/media/formats/webm/webm_cluster_parser.cc @@ -433,36 +433,42 @@ bool WebMClusterParser::OnBlock(bool is_simple_block, streams.push_back(audio_stream_info_); if (video_stream_info_) { if (stream_type == kStreamVideo) { - std::unique_ptr vpx_parser; - switch (video_stream_info_->codec()) { - case kCodecVP8: - vpx_parser.reset(new VP8Parser); - break; - case kCodecVP9: - vpx_parser.reset(new VP9Parser); - break; - default: - NOTIMPLEMENTED() << "Unsupported codec " - << video_stream_info_->codec(); + // Setup codec string and codec config for VP8 and VP9. + // Codec config for AV1 is already retrieved from WebM CodecPrivate + // instead of extracted from the bit stream. + if (video_stream_info_->codec() != kCodecAV1) { + std::unique_ptr vpx_parser; + switch (video_stream_info_->codec()) { + case kCodecVP8: + vpx_parser.reset(new VP8Parser); + break; + case kCodecVP9: + vpx_parser.reset(new VP9Parser); + break; + default: + NOTIMPLEMENTED() + << "Unsupported codec " << video_stream_info_->codec(); + return false; + } + std::vector vpx_frames; + if (!vpx_parser->Parse(buffer->data(), buffer->data_size(), + &vpx_frames)) { + LOG(ERROR) << "Failed to parse vpx frame."; return false; - } - std::vector vpx_frames; - if (!vpx_parser->Parse(buffer->data(), buffer->data_size(), - &vpx_frames)) { - LOG(ERROR) << "Failed to parse vpx frame."; - return false; - } - if (vpx_frames.size() != 1u || !vpx_frames[0].is_keyframe) { - LOG(ERROR) << "The first frame should be a key frame."; - return false; + } + if (vpx_frames.size() != 1u || !vpx_frames[0].is_keyframe) { + LOG(ERROR) << "The first frame should be a key frame."; + return false; + } + + vp_config_.MergeFrom(vpx_parser->codec_config()); + video_stream_info_->set_codec_string( + vp_config_.GetCodecString(video_stream_info_->codec())); + std::vector config_serialized; + vp_config_.WriteMP4(&config_serialized); + video_stream_info_->set_codec_config(config_serialized); } - vp_config_.MergeFrom(vpx_parser->codec_config()); - video_stream_info_->set_codec_string( - vp_config_.GetCodecString(video_stream_info_->codec())); - std::vector config_serialized; - vp_config_.WriteMP4(&config_serialized); - video_stream_info_->set_codec_config(config_serialized); streams.push_back(video_stream_info_); init_cb_.Run(streams); initialized_ = true; diff --git a/packager/media/formats/webm/webm_tracks_parser.cc b/packager/media/formats/webm/webm_tracks_parser.cc index 246bcb1513..84b5c26e5b 100644 --- a/packager/media/formats/webm/webm_tracks_parser.cc +++ b/packager/media/formats/webm/webm_tracks_parser.cc @@ -223,10 +223,14 @@ bool WebMTracksParser::OnListEnd(int id) { } video_default_duration_ = default_duration_; + // |vp_config_| is only useful for VP8 and VP9. + if (codec_id_ == "V_VP8" || codec_id_ == "V_VP9") + vp_config_ = video_client_.GetVpCodecConfig(codec_private_); + DCHECK(!video_stream_info_); - vp_config_ = video_client_.GetVpCodecConfig(codec_private_); video_stream_info_ = video_client_.GetVideoStreamInfo( - video_track_num_, codec_id_, !video_encryption_key_id_.empty()); + video_track_num_, codec_id_, codec_private_, + !video_encryption_key_id_.empty()); if (!video_stream_info_) return false; } else { diff --git a/packager/media/formats/webm/webm_video_client.cc b/packager/media/formats/webm/webm_video_client.cc index da52a68ed7..96335c3d9e 100644 --- a/packager/media/formats/webm/webm_video_client.cc +++ b/packager/media/formats/webm/webm_video_client.cc @@ -5,6 +5,7 @@ #include "packager/media/formats/webm/webm_video_client.h" #include "packager/base/logging.h" +#include "packager/media/codecs/av1_codec_configuration_record.h" #include "packager/media/codecs/vp_codec_configuration_record.h" #include "packager/media/formats/webm/webm_constants.h" @@ -57,24 +58,34 @@ void WebMVideoClient::Reset() { std::shared_ptr WebMVideoClient::GetVideoStreamInfo( int64_t track_num, const std::string& codec_id, + const std::vector& codec_private, bool is_encrypted) { + std::string codec_string; Codec video_codec = kUnknownCodec; - if (codec_id == "V_VP8") { + if (codec_id == "V_AV1") { + video_codec = kCodecAV1; + + // CodecPrivate is mandatory per AV in Matroska / WebM specification. + // https://github.com/Matroska-Org/matroska-specification/blob/av1-mappin/codec/av1.md#codecprivate-1 + AV1CodecConfigurationRecord av1_config; + if (!av1_config.Parse(codec_private)) { + LOG(ERROR) << "Failed to parse AV1 codec_private."; + return nullptr; + } + codec_string = av1_config.GetCodecString(); + } else if (codec_id == "V_VP8") { video_codec = kCodecVP8; + // codec_string for VP8 is parsed later. } else if (codec_id == "V_VP9") { video_codec = kCodecVP9; - // The codec private data is in WebM format, but needs to be converted to - // MP4 format. Don't do it yet, it will be handled in - // webm_cluster_parser.cc - } else if (codec_id == "V_VP10") { - video_codec = kCodecVP10; + // codec_string for VP9 is parsed later. } else { LOG(ERROR) << "Unsupported video codec_id " << codec_id; - return std::shared_ptr(); + return nullptr; } if (pixel_width_ <= 0 || pixel_height_ <= 0) - return std::shared_ptr(); + return nullptr; // Set crop and display unit defaults if these elements are not present. if (crop_bottom_ == -1) @@ -102,10 +113,10 @@ std::shared_ptr WebMVideoClient::GetVideoStreamInfo( display_height_ = height_after_crop; } else if (display_unit_ == 3) { if (display_width_ <= 0 || display_height_ <= 0) - return std::shared_ptr(); + return nullptr; } else { LOG(ERROR) << "Unsupported display unit type " << display_unit_; - return std::shared_ptr(); + return nullptr; } // Calculate sample aspect ratio. int64_t sar_x = display_width_ * height_after_crop; @@ -114,10 +125,14 @@ std::shared_ptr WebMVideoClient::GetVideoStreamInfo( sar_x /= gcd; sar_y /= gcd; + // |codec_private| may be overriden later for some codecs, e.g. VP9 since for + // VP9, the format for MP4 and WebM are different; MP4 format is used as the + // intermediate format. return std::make_shared( track_num, kWebMTimeScale, 0, video_codec, H26xStreamFormat::kUnSpecified, - std::string(), nullptr, 0, width_after_crop, height_after_crop, sar_x, - sar_y, 0, 0, std::string(), is_encrypted); + codec_string, codec_private.data(), codec_private.size(), + width_after_crop, height_after_crop, sar_x, sar_y, 0, 0, std::string(), + is_encrypted); } VPCodecConfigurationRecord WebMVideoClient::GetVpCodecConfig( diff --git a/packager/media/formats/webm/webm_video_client.h b/packager/media/formats/webm/webm_video_client.h index 1bf8892dd2..551c98d713 100644 --- a/packager/media/formats/webm/webm_video_client.h +++ b/packager/media/formats/webm/webm_video_client.h @@ -27,14 +27,15 @@ class WebMVideoClient : public WebMParserClient { void Reset(); /// Create a VideoStreamInfo with the data in |track_num|, |codec_id|, - /// |is_encrypted| and the fields parsed from the last video track element - /// this object was used to parse. + /// |codec_private|, |is_encrypted| and the fields parsed from the last video + /// track element this object was used to parse. /// @return A VideoStreamInfo if successful. /// @return An empty pointer if there was unexpected values in the /// provided parameters or video track element fields. std::shared_ptr GetVideoStreamInfo( int64_t track_num, const std::string& codec_id, + const std::vector& codec_private, bool is_encrypted); /// Extracts VPCodecConfigurationRecord parsed from codec private data and diff --git a/packager/media/test/data/bear-av1.mp4 b/packager/media/test/data/bear-av1.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..c45c120260e7cc64d1ec434cb27171688371389b GIT binary patch literal 24355 zcmafZ1y~%DF`+o%p008{?pZ32A;Nky}1^-9$|HeUr4;XW>)Bg&d{NnKS@0w8mruZM${vR{{ zp(zMfg?Q`EzyLs4SQ?q@gBcP_qyIcFN8p==YR_8_U^FxOX7`r^cTVO;#{b2?Q8ln^ zEvav1^v(E92Lj8|+{y&ZymzwvYxLj00)^2(a|A|q#&0@r?QI^((e4|`zxWw@2ZL{5 zKGfd9{=c04rsJyb1Ox};Z~J$f{|pF%Pe~HYzTvI?9~%D*|67my`U;lt^qp8ld;v&+ zcZgsKn(wvs_1;Gi%)T=*H~#k53YxuxgFSfUzZzJ!H~cRFOy7fLw||r0Sg?+v^}mhL zSUMTIfMpT~yT9~p>dp9neoX^MBL{u(xTdA?U;3s;`tRNcN6b#&#^%jI|J@kPzu7y0 zCCXw4>$gP-jr9K>{MWdQzLN<%7ZVF76AO?PykHeLm)~5EW@+-@F$XI`B!lzqZJfa2 zZ5$H71?IuyPzL}2It9dEQ-JplCPohbu;AIh4MNYs&d~~djlh6KCGa7Q;N%52bP50f z0Ts-sgYgB7w@~VU@wSE>81i69fWZm&dNY`2g5e5AG8k{3at7lq&))Qf!2n;A&^}=L zrt=*P@S1=?Fy8duu1#GqWWfNRBlHBAhJq0chCdi@c09n40psnO5(NVX0DyS{)1P3x z*?Y4a1IC*@A28l>Sp*EQ9`rhx)`0P5D+7!-{Uk8n);9&?%^o#aPa8}_z%U2nEg)}E zdZTYP-_GMR81!Jh%YVsl<8SkCHr|d?14A7QaWKfh&;);EEWy$I-;xs)Plg5&4FEP7 zA_4RO&;TE3DR>o;KZ=9p>5Y&iml*~>aY0J&s5QG^h;zHhN6YEY3>6Y9&<-gBH~q&# zlbnAJ@3eCNLTXTDOw%nxCZRn#_Wdw0)k!k9F{Vp_p?dEY&=``-V$vC>{0lFPp{L%T z%~#ZrWPCU6yvs?G20ojS=}9mcnM+1Kno;ikELK>UwUfV*j>SIdDbYzO=PZTTfRV|2 znGfXj2@19*^#wVME?18WLgk*B%#pi2EZYLG*Dyn+d(q`6)_*o9No5U&JdQ8X+FITv zqwU(*SXt_Ae~2T_^{}-6SwAAEegTlzk}^1{>={y?!B{ufYl!CL|J<~Co3U#ps;g9q z>{zfr;BJN&_zROt6R{we$f})-hTZ{r{nemb_E=xM^J(YDdc)%BS7IT2Ykf$n?m76` zT_R#^Rd4dMyu!1b%cW#4Rr=$N3|SUZnD1(EkNqPA zpl-)IRr0ZnS^Z;7mNf5<3S)cZ<8)^~O9@q*IzBo_v5x>p^}RzfWH#Qy4q9VTIm;}6 z)Z{J;s-y>{ZFw7}0lP6#8HDY7Xm1I0PYEE~_;-P?%bA}XL1o23MPGCR#v<5>=)agq z4ExXe_H!<|&3N8zbr~^Cn|KL^x@Kia=a}Y;oA4h7(ZzSYM(lq8{f+ia7;HY?yrIY#mvl^c>Ou$e#`vxqJ2@H-;g} zOxJnB1eeV`$@xvog3yQ#3-}Z($-^-gwp-ta+;)2T*wIpbOICTPkZV8&W%F&`yr zTbd|){iY5Hj)Ee=IEpaLVbh~6YZe{Tda~$GWOkpGnQJ%>=Yhd+VaOCNX4&u&LNS&W zz8et~PL_w!N7?$p123K$1DV}pelRp*pH#g4w-oU2zP?)&de-46;G)8h3U!a`8V{tX zde5m=Dg-QB7H>U*Tu~)lTF)IS@t^Re_jS-HIt%wi W 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

146c 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 literal 0 HcmV?d00001