From db92c9a22b46d6fbe5e00f1e3a0ab9117aa59724 Mon Sep 17 00:00:00 2001 From: Thomas Inskip Date: Tue, 26 Jul 2016 17:51:08 -0700 Subject: [PATCH] Implemented WebM VP9 subsample encryption and decryption. Change-Id: I98f02c05ec8bcc976e01ff41478e92b8809c0076 --- packager/app/muxer_flags.cc | 3 +- packager/app/muxer_flags.h | 1 + packager/app/packager_util.cc | 2 +- packager/app/test/packager_test.py | 10 ++ .../bear-640x360-vp9-altref-dec-golden.webm | Bin 0 -> 80380 bytes .../bear-640x360-vp9-altref-enc-golden.webm | Bin 0 -> 81250 bytes packager/media/base/audio_stream_info.cc | 51 +++----- packager/media/base/audio_stream_info.h | 45 ++----- packager/media/base/muxer_options.cc | 3 +- packager/media/base/muxer_options.h | 3 + packager/media/base/stream_info.cc | 13 +- packager/media/base/stream_info.h | 50 +++++--- packager/media/base/text_stream_info.cc | 18 +-- packager/media/base/text_stream_info.h | 12 +- packager/media/base/video_stream_info.cc | 51 +++----- packager/media/base/video_stream_info.h | 38 +----- .../hevc_decoder_configuration_record.cc | 5 +- .../hevc_decoder_configuration_record.h | 2 +- .../codecs/vp_codec_configuration_record.cc | 4 +- .../codecs/vp_codec_configuration_record.h | 2 +- .../media/event/muxer_listener_test_helper.cc | 24 ++-- .../media/event/muxer_listener_test_helper.h | 2 +- packager/media/formats/mp2t/es_parser_adts.cc | 26 ++-- packager/media/formats/mp2t/es_parser_h264.cc | 7 +- packager/media/formats/mp2t/es_parser_h265.cc | 23 +--- .../formats/mp2t/pes_packet_generator.cc | 4 +- .../mp2t/pes_packet_generator_unittest.cc | 58 ++++----- .../formats/mp2t/ts_segmenter_unittest.cc | 56 ++++----- packager/media/formats/mp2t/ts_writer.cc | 4 +- .../media/formats/mp2t/ts_writer_unittest.cc | 90 +++++++------- .../formats/mp4/encrypting_fragmenter.cc | 17 +-- .../media/formats/mp4/encrypting_fragmenter.h | 2 +- .../media/formats/mp4/mp4_media_parser.cc | 41 ++----- packager/media/formats/mp4/mp4_muxer.cc | 15 +-- packager/media/formats/webm/encryptor.cc | 116 +++++++++++++++--- packager/media/formats/webm/encryptor.h | 11 +- packager/media/formats/webm/segmenter.cc | 6 +- .../media/formats/webm/segmenter_test_base.cc | 9 +- packager/media/formats/webm/webm.gyp | 1 + .../media/formats/webm/webm_audio_client.cc | 8 +- .../media/formats/webm/webm_cluster_parser.cc | 10 +- .../webm/webm_cluster_parser_unittest.cc | 91 +++++--------- packager/media/formats/webm/webm_constants.h | 11 +- .../media/formats/webm/webm_crypto_helpers.cc | 95 ++++++++++---- .../media/formats/webm/webm_video_client.cc | 8 +- .../formats/webvtt/webvtt_media_parser.cc | 15 +-- .../media/formats/wvm/wvm_media_parser.cc | 32 ++--- .../test/data/bear-640x360-vp9-altref.webm | Bin 0 -> 80522 bytes 48 files changed, 534 insertions(+), 561 deletions(-) create mode 100644 packager/app/test/testdata/bear-640x360-vp9-altref-dec-golden.webm create mode 100644 packager/app/test/testdata/bear-640x360-vp9-altref-enc-golden.webm create mode 100644 packager/media/test/data/bear-640x360-vp9-altref.webm diff --git a/packager/app/muxer_flags.cc b/packager/app/muxer_flags.cc index ba8db86500..2df3aab66b 100644 --- a/packager/app/muxer_flags.cc +++ b/packager/app/muxer_flags.cc @@ -50,4 +50,5 @@ DEFINE_string(temp_dir, "", "Specify a directory in which to store temporary (intermediate) " " files. Used only if single_segment=true."); - +DEFINE_bool(webm_subsample_encryption, true, + "Enable WebM subsample encryption."); diff --git a/packager/app/muxer_flags.h b/packager/app/muxer_flags.h index b9e682e709..c1e450aa89 100644 --- a/packager/app/muxer_flags.h +++ b/packager/app/muxer_flags.h @@ -20,5 +20,6 @@ DECLARE_double(fragment_duration); DECLARE_bool(fragment_sap_aligned); DECLARE_int32(num_subsegments_per_sidx); DECLARE_string(temp_dir); +DECLARE_bool(webm_subsample_encryption); #endif // APP_MUXER_FLAGS_H_ diff --git a/packager/app/packager_util.cc b/packager/app/packager_util.cc index ba46189b95..46e02be0be 100644 --- a/packager/app/packager_util.cc +++ b/packager/app/packager_util.cc @@ -154,7 +154,7 @@ bool GetMuxerOptions(MuxerOptions* muxer_options) { muxer_options->segment_sap_aligned = FLAGS_segment_sap_aligned; muxer_options->fragment_sap_aligned = FLAGS_fragment_sap_aligned; muxer_options->num_subsegments_per_sidx = FLAGS_num_subsegments_per_sidx; - + muxer_options->webm_subsample_encryption = FLAGS_webm_subsample_encryption; if (FLAGS_mp4_use_decoding_timestamp_in_timeline) { LOG(WARNING) << "Flag --mp4_use_decoding_timestamp_in_timeline is set. " "Note that it is a temporary hack to workaround Chromium " diff --git a/packager/app/test/packager_test.py b/packager/app/test/packager_test.py index 2c73889fa3..6bed8b64c0 100755 --- a/packager/app/test/packager_test.py +++ b/packager/app/test/packager_test.py @@ -195,6 +195,16 @@ class PackagerAppTest(unittest.TestCase): self._VerifyDecryption(self.output[0], 'bear-640x360-a-golden.mp4') self._VerifyDecryption(self.output[1], 'bear-640x360-v-golden.mp4') + def testPackageWithWebmSubsampleEncryption(self): + self.packager.Package( + self._GetStreams(['video'], + output_format='webm', + test_files=['bear-640x360-vp9-altref.webm']), + self._GetFlags(encryption=True)) + self._DiffGold(self.output[0], 'bear-640x360-vp9-altref-enc-golden.webm') + self._VerifyDecryption(self.output[0], + 'bear-640x360-vp9-altref-dec-golden.webm') + def testPackageAvcTsWithEncryption(self): # Currently we only support live packaging for ts. self.packager.Package( diff --git a/packager/app/test/testdata/bear-640x360-vp9-altref-dec-golden.webm b/packager/app/test/testdata/bear-640x360-vp9-altref-dec-golden.webm new file mode 100644 index 0000000000000000000000000000000000000000..29aae257b3589c7cd4a8b6d63f241496ba94bfbf GIT binary patch literal 80380 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
&%l(LUmHUN!)5qx`g5YcL5gS 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 Sh-&Z$Y6*Sx2fhvfX8eD&)(J)c literal 0 HcmV?d00001 diff --git a/packager/media/base/audio_stream_info.cc b/packager/media/base/audio_stream_info.cc index fbf96092c8..ccf5fddaa8 100644 --- a/packager/media/base/audio_stream_info.cc +++ b/packager/media/base/audio_stream_info.cc @@ -17,8 +17,8 @@ namespace shaka { namespace media { namespace { -std::string AudioCodecToString(AudioCodec audio_codec) { - switch (audio_codec) { +std::string AudioCodecToString(Codec codec) { + switch (codec) { case kCodecAAC: return "AAC"; case kCodecAC3: @@ -42,38 +42,22 @@ std::string AudioCodecToString(AudioCodec audio_codec) { case kCodecVorbis: return "Vorbis"; default: - NOTIMPLEMENTED() << "Unknown Audio Codec: " << audio_codec; - return "UnknownAudioCodec"; + NOTIMPLEMENTED() << "Unknown Audio Codec: " << codec; + return "UnknownCodec"; } } } // namespace -AudioStreamInfo::AudioStreamInfo(int track_id, - uint32_t time_scale, - uint64_t duration, - AudioCodec codec, - const std::string& codec_string, - const std::string& language, - uint8_t sample_bits, - uint8_t num_channels, - uint32_t sampling_frequency, - uint64_t seek_preroll_ns, - uint64_t codec_delay_ns, - uint32_t max_bitrate, - uint32_t avg_bitrate, - const uint8_t* codec_config, - size_t codec_config_size, - bool is_encrypted) - : StreamInfo(kStreamAudio, - track_id, - time_scale, - duration, - codec_string, - language, - codec_config, - codec_config_size, +AudioStreamInfo::AudioStreamInfo( + int track_id, uint32_t time_scale, uint64_t duration, Codec codec, + const std::string& codec_string, const uint8_t* codec_config, + size_t codec_config_size, uint8_t sample_bits, uint8_t num_channels, + uint32_t sampling_frequency, uint64_t seek_preroll_ns, + uint64_t codec_delay_ns, uint32_t max_bitrate, uint32_t avg_bitrate, + const std::string& language, bool is_encrypted) + : StreamInfo(kStreamAudio, track_id, time_scale, duration, codec, + codec_string, codec_config, codec_config_size, language, is_encrypted), - codec_(codec), sample_bits_(sample_bits), num_channels_(num_channels), sampling_frequency_(sampling_frequency), @@ -85,10 +69,9 @@ AudioStreamInfo::AudioStreamInfo(int track_id, AudioStreamInfo::~AudioStreamInfo() {} bool AudioStreamInfo::IsValidConfig() const { - return codec_ != kUnknownAudioCodec && num_channels_ != 0 && + return codec() != kUnknownCodec && num_channels_ != 0 && num_channels_ <= limits::kMaxChannels && sample_bits_ > 0 && - sample_bits_ <= limits::kMaxBitsPerSample && - sampling_frequency_ > 0 && + sample_bits_ <= limits::kMaxBitsPerSample && sampling_frequency_ > 0 && sampling_frequency_ <= limits::kMaxSampleRate; } @@ -96,7 +79,7 @@ std::string AudioStreamInfo::ToString() const { std::string str = base::StringPrintf( "%s codec: %s\n sample_bits: %d\n num_channels: %d\n " "sampling_frequency: %d\n language: %s\n", - StreamInfo::ToString().c_str(), AudioCodecToString(codec_).c_str(), + StreamInfo::ToString().c_str(), AudioCodecToString(codec()).c_str(), sample_bits_, num_channels_, sampling_frequency_, language().c_str()); if (seek_preroll_ns_ != 0) { base::StringAppendF(&str, " seek_preroll_ns: %" PRIu64 "\n", @@ -109,7 +92,7 @@ std::string AudioStreamInfo::ToString() const { return str; } -std::string AudioStreamInfo::GetCodecString(AudioCodec codec, +std::string AudioStreamInfo::GetCodecString(Codec codec, uint8_t audio_object_type) { switch (codec) { case kCodecVorbis: diff --git a/packager/media/base/audio_stream_info.h b/packager/media/base/audio_stream_info.h index e6bb0870a0..a68c4e1364 100644 --- a/packager/media/base/audio_stream_info.h +++ b/packager/media/base/audio_stream_info.h @@ -14,42 +14,17 @@ namespace shaka { namespace media { -enum AudioCodec { - kUnknownAudioCodec = 0, - kCodecAAC, - kCodecAC3, - kCodecDTSC, - kCodecDTSE, - kCodecDTSH, - kCodecDTSL, - kCodecDTSM, - kCodecDTSP, - kCodecEAC3, - kCodecOpus, - kCodecVorbis, - - kNumAudioCodec -}; - /// Holds audio stream information. class AudioStreamInfo : public StreamInfo { public: /// Construct an initialized audio stream info object. - AudioStreamInfo(int track_id, - uint32_t time_scale, - uint64_t duration, - AudioCodec codec, - const std::string& codec_string, - const std::string& language, - uint8_t sample_bits, - uint8_t num_channels, - uint32_t sampling_frequency, - uint64_t seek_preroll_ns, - uint64_t codec_delay_ns, - uint32_t max_bitrate, - uint32_t avg_bitrate, - const uint8_t* codec_config, - size_t codec_config_size, + AudioStreamInfo(int track_id, uint32_t time_scale, uint64_t duration, + Codec codec, const std::string& codec_string, + const uint8_t* codec_config, size_t codec_config_size, + uint8_t sample_bits, uint8_t num_channels, + uint32_t sampling_frequency, uint64_t seek_preroll_ns, + uint64_t codec_delay_ns, uint32_t max_bitrate, + uint32_t avg_bitrate, const std::string& language, bool is_encrypted); /// @name StreamInfo implementation overrides. @@ -58,7 +33,6 @@ class AudioStreamInfo : public StreamInfo { std::string ToString() const override; /// @} - AudioCodec codec() const { return codec_; } uint8_t sample_bits() const { return sample_bits_; } uint8_t sample_bytes() const { return sample_bits_ / 8; } uint8_t num_channels() const { return num_channels_; } @@ -71,20 +45,17 @@ class AudioStreamInfo : public StreamInfo { uint32_t max_bitrate() const { return max_bitrate_; } uint32_t avg_bitrate() const { return avg_bitrate_; } - void set_codec(AudioCodec codec) { codec_ = codec; } void set_sampling_frequency(const uint32_t sampling_frequency) { sampling_frequency_ = sampling_frequency; } /// @param audio_object_type is only used by AAC Codec, ignored otherwise. /// @return The codec string. - static std::string GetCodecString(AudioCodec codec, - uint8_t audio_object_type); + static std::string GetCodecString(Codec codec, uint8_t audio_object_type); private: ~AudioStreamInfo() override; - AudioCodec codec_; uint8_t sample_bits_; uint8_t num_channels_; uint32_t sampling_frequency_; diff --git a/packager/media/base/muxer_options.cc b/packager/media/base/muxer_options.cc index c17f955cad..0e3bc82efb 100644 --- a/packager/media/base/muxer_options.cc +++ b/packager/media/base/muxer_options.cc @@ -17,7 +17,8 @@ MuxerOptions::MuxerOptions() fragment_sap_aligned(false), num_subsegments_per_sidx(0), mp4_use_decoding_timestamp_in_timeline(false), - bandwidth(0) {} + bandwidth(0), + webm_subsample_encryption(true) {} MuxerOptions::~MuxerOptions() {} } // namespace media diff --git a/packager/media/base/muxer_options.h b/packager/media/base/muxer_options.h index 04bada69c7..5160df24b7 100644 --- a/packager/media/base/muxer_options.h +++ b/packager/media/base/muxer_options.h @@ -73,6 +73,9 @@ struct MuxerOptions { /// User-specified bit rate for the media stream. If zero, the muxer will /// attempt to estimate. uint32_t bandwidth; + + // Enable/disable subsample encryption for WebM containers. + bool webm_subsample_encryption; }; } // namespace media diff --git a/packager/media/base/stream_info.cc b/packager/media/base/stream_info.cc index f883b99973..b856514a0f 100644 --- a/packager/media/base/stream_info.cc +++ b/packager/media/base/stream_info.cc @@ -14,19 +14,16 @@ namespace shaka { namespace media { -StreamInfo::StreamInfo(StreamType stream_type, - int track_id, - uint32_t time_scale, - uint64_t duration, +StreamInfo::StreamInfo(StreamType stream_type, int track_id, + uint32_t time_scale, uint64_t duration, Codec codec, const std::string& codec_string, - const std::string& language, - const uint8_t* codec_config, - size_t codec_config_size, - bool is_encrypted) + const uint8_t* codec_config, size_t codec_config_size, + const std::string& language, bool is_encrypted) : stream_type_(stream_type), track_id_(track_id), time_scale_(time_scale), duration_(duration), + codec_(codec), codec_string_(codec_string), language_(language), is_encrypted_(is_encrypted) { diff --git a/packager/media/base/stream_info.h b/packager/media/base/stream_info.h index 2ff325ddcb..7384d87bc1 100644 --- a/packager/media/base/stream_info.h +++ b/packager/media/base/stream_info.h @@ -22,18 +22,40 @@ enum StreamType { kStreamText, }; +enum Codec { + kUnknownCodec = 0, + kCodecH264, + kCodecHEV1, + kCodecHVC1, + kCodecVC1, + kCodecMPEG2, + kCodecMPEG4, + kCodecTheora, + kCodecVP8, + kCodecVP9, + kCodecVP10, + kCodecAAC, + kCodecAC3, + kCodecDTSC, + kCodecDTSE, + kCodecDTSH, + kCodecDTSL, + kCodecDTSM, + kCodecDTSP, + kCodecEAC3, + kCodecOpus, + kCodecVorbis, + kCodecText, + kNumCodec +}; + /// Abstract class holds stream information. class StreamInfo : public base::RefCountedThreadSafe { public: - StreamInfo(StreamType stream_type, - int track_id, - uint32_t time_scale, - uint64_t duration, - const std::string& codec_string, - const std::string& language, - const uint8_t* codec_config, - size_t codec_config_size, - bool is_encrypted); + StreamInfo(StreamType stream_type, int track_id, uint32_t time_scale, + uint64_t duration, Codec codec, const std::string& codec_string, + const uint8_t* codec_config, size_t codec_config_size, + const std::string& language, bool is_encrypted); /// @return true if this object has appropriate configuration values, false /// otherwise. @@ -46,21 +68,18 @@ class StreamInfo : public base::RefCountedThreadSafe { uint32_t track_id() const { return track_id_; } uint32_t time_scale() const { return time_scale_; } uint64_t duration() const { return duration_; } + Codec codec() const { return codec_; } const std::string& codec_string() const { return codec_string_; } + const std::vector& codec_config() const { return codec_config_; } const std::string& language() const { return language_; } - bool is_encrypted() const { return is_encrypted_; } - const std::vector& codec_config() const { return codec_config_; } - void set_duration(int duration) { duration_ = duration; } - + void set_codec(Codec codec) { codec_ = codec; } void set_codec_config(const std::vector& data) { codec_config_ = data; } - void set_codec_string(const std::string& codec_string) { codec_string_ = codec_string; } - void set_language(const std::string& language) { language_ = language; } protected: @@ -75,6 +94,7 @@ class StreamInfo : public base::RefCountedThreadSafe { uint32_t time_scale_; // Duration base on time_scale. uint64_t duration_; + Codec codec_; std::string codec_string_; std::string language_; // Whether the stream is potentially encrypted. diff --git a/packager/media/base/text_stream_info.cc b/packager/media/base/text_stream_info.cc index faa38ef7f7..c7fbc94f59 100644 --- a/packager/media/base/text_stream_info.cc +++ b/packager/media/base/text_stream_info.cc @@ -9,23 +9,15 @@ namespace shaka { namespace media { -TextStreamInfo::TextStreamInfo(int track_id, - uint32_t time_scale, +TextStreamInfo::TextStreamInfo(int track_id, uint32_t time_scale, uint64_t duration, const std::string& codec_string, - const std::string& language, - const std::string& codec_config, - uint16_t width, - uint16_t height) - : StreamInfo(kStreamText, - track_id, - time_scale, - duration, + const std::string& codec_config, uint16_t width, + uint16_t height, const std::string& language) + : StreamInfo(kStreamText, track_id, time_scale, duration, kCodecText, codec_string, - language, reinterpret_cast(codec_config.data()), - codec_config.size(), - false), + codec_config.size(), language, false), width_(width), height_(height) {} diff --git a/packager/media/base/text_stream_info.h b/packager/media/base/text_stream_info.h index 461533779d..294dfd3089 100644 --- a/packager/media/base/text_stream_info.h +++ b/packager/media/base/text_stream_info.h @@ -21,20 +21,16 @@ class TextStreamInfo : public StreamInfo { /// @param time_scale is the time scale of this stream. /// @param duration is the duration of this stream. /// @param codec_string is the codec. - /// @param language is the language of this stream. This may be empty. /// @param codec_config is configuration for this text stream. This could be /// the metadata that applies to all the samples of this stream. This /// may be empty. /// @param width of the text. This may be 0. /// @param height of the text. This may be 0. - TextStreamInfo(int track_id, - uint32_t time_scale, - uint64_t duration, + /// @param language is the language of this stream. This may be empty. + TextStreamInfo(int track_id, uint32_t time_scale, uint64_t duration, const std::string& codec_string, - const std::string& language, - const std::string& codec_config, - uint16_t width, - uint16_t height); + const std::string& codec_config, uint16_t width, + uint16_t height, const std::string& language); bool IsValidConfig() const override; diff --git a/packager/media/base/video_stream_info.cc b/packager/media/base/video_stream_info.cc index d1fc13e3b4..1947713ee6 100644 --- a/packager/media/base/video_stream_info.cc +++ b/packager/media/base/video_stream_info.cc @@ -17,8 +17,8 @@ namespace shaka { namespace media { namespace { -std::string VideoCodecToString(VideoCodec video_codec) { - switch (video_codec) { +std::string VideoCodecToString(Codec codec) { + switch (codec) { case kCodecH264: return "H264"; case kCodecHEV1: @@ -40,52 +40,35 @@ std::string VideoCodecToString(VideoCodec video_codec) { case kCodecVP10: return "VP10"; default: - NOTIMPLEMENTED() << "Unknown Video Codec: " << video_codec; - return "UnknownVideoCodec"; + NOTIMPLEMENTED() << "Unknown Video Codec: " << codec; + return "UnknownCodec"; } } } // namespace -VideoStreamInfo::VideoStreamInfo(int track_id, - uint32_t time_scale, - uint64_t duration, - VideoCodec codec, - const std::string& codec_string, - const std::string& language, - uint16_t width, - uint16_t height, - uint32_t pixel_width, - uint32_t pixel_height, - int16_t trick_play_rate, - uint8_t nalu_length_size, - const uint8_t* codec_config, - size_t codec_config_size, - bool is_encrypted) - : StreamInfo(kStreamVideo, - track_id, - time_scale, - duration, - codec_string, - language, - codec_config, - codec_config_size, +VideoStreamInfo::VideoStreamInfo( + int track_id, uint32_t time_scale, uint64_t duration, Codec codec, + const std::string& codec_string, const uint8_t* codec_config, + size_t codec_config_size, uint16_t width, uint16_t height, + uint32_t pixel_width, uint32_t pixel_height, int16_t trick_play_rate, + uint8_t nalu_length_size, const std::string& language, bool is_encrypted) + : StreamInfo(kStreamVideo, track_id, time_scale, duration, codec, + codec_string, codec_config, codec_config_size, language, is_encrypted), - codec_(codec), width_(width), height_(height), pixel_width_(pixel_width), pixel_height_(pixel_height), trick_play_rate_(trick_play_rate), - nalu_length_size_(nalu_length_size) { -} + nalu_length_size_(nalu_length_size) {} VideoStreamInfo::~VideoStreamInfo() {} bool VideoStreamInfo::IsValidConfig() const { - return codec_ != kUnknownVideoCodec && - width_ > 0 && width_ <= limits::kMaxDimension && - height_ > 0 && height_ <= limits::kMaxDimension && + return codec() != kUnknownCodec && width_ > 0 && + width_ <= limits::kMaxDimension && height_ > 0 && + height_ <= limits::kMaxDimension && (nalu_length_size_ <= 2 || nalu_length_size_ == 4); } @@ -93,7 +76,7 @@ std::string VideoStreamInfo::ToString() const { return base::StringPrintf( "%s codec: %s\n width: %d\n height: %d\n pixel_aspect_ratio: %d:%d\n " "trick_play_rate: %d\n nalu_length_size: %d\n", - StreamInfo::ToString().c_str(), VideoCodecToString(codec_).c_str(), + StreamInfo::ToString().c_str(), VideoCodecToString(codec()).c_str(), width_, height_, pixel_width_, pixel_height_, trick_play_rate_, nalu_length_size_); } diff --git a/packager/media/base/video_stream_info.h b/packager/media/base/video_stream_info.h index 1c2978a0f9..163b982e12 100644 --- a/packager/media/base/video_stream_info.h +++ b/packager/media/base/video_stream_info.h @@ -12,41 +12,18 @@ namespace shaka { namespace media { -enum VideoCodec { - kUnknownVideoCodec = 0, - kCodecH264, - kCodecHEV1, - kCodecHVC1, - kCodecVC1, - kCodecMPEG2, - kCodecMPEG4, - kCodecTheora, - kCodecVP8, - kCodecVP9, - kCodecVP10, - kNumVideoCodec -}; - /// Holds video stream information. class VideoStreamInfo : public StreamInfo { public: /// Construct an initialized video stream info object. /// @param pixel_width is the width of the pixel. 0 if unknown. /// @param pixel_height is the height of the pixels. 0 if unknown. - VideoStreamInfo(int track_id, - uint32_t time_scale, - uint64_t duration, - VideoCodec codec, - const std::string& codec_string, - const std::string& language, - uint16_t width, - uint16_t height, - uint32_t pixel_width, - uint32_t pixel_height, - int16_t trick_play_rate, - uint8_t nalu_length_size, - const uint8_t* codec_config, - size_t codec_config_size, + VideoStreamInfo(int track_id, uint32_t time_scale, uint64_t duration, + Codec codec, const std::string& codec_string, + const uint8_t* codec_config, size_t codec_config_size, + uint16_t width, uint16_t height, uint32_t pixel_width, + uint32_t pixel_height, int16_t trick_play_rate, + uint8_t nalu_length_size, const std::string& language, bool is_encrypted); /// @name StreamInfo implementation overrides. @@ -55,7 +32,6 @@ class VideoStreamInfo : public StreamInfo { std::string ToString() const override; /// @} - VideoCodec codec() const { return codec_; } uint16_t width() const { return width_; } uint16_t height() const { return height_; } /// Returns the pixel width. @@ -67,7 +43,6 @@ class VideoStreamInfo : public StreamInfo { uint8_t nalu_length_size() const { return nalu_length_size_; } int16_t trick_play_rate() const { return trick_play_rate_; } - void set_codec(VideoCodec codec) { codec_ = codec; } void set_width(uint32_t width) { width_ = width; } void set_height(uint32_t height) { height_ = height; } void set_pixel_width(uint32_t pixel_width) { pixel_width_ = pixel_width; } @@ -76,7 +51,6 @@ class VideoStreamInfo : public StreamInfo { private: ~VideoStreamInfo() override; - VideoCodec codec_; uint16_t width_; uint16_t height_; diff --git a/packager/media/codecs/hevc_decoder_configuration_record.cc b/packager/media/codecs/hevc_decoder_configuration_record.cc index 5c101d3591..43ba8e0bc2 100644 --- a/packager/media/codecs/hevc_decoder_configuration_record.cc +++ b/packager/media/codecs/hevc_decoder_configuration_record.cc @@ -59,7 +59,7 @@ std::string ReverseBitsAndHexEncode(uint32_t x) { return TrimLeadingZeros(base::HexEncode(bytes, arraysize(bytes))); } -std::string CodecAsString(VideoCodec codec) { +std::string CodecAsString(Codec codec) { switch (codec) { case kCodecHEV1: return "hev1"; @@ -132,8 +132,7 @@ bool HEVCDecoderConfigurationRecord::ParseInternal() { return true; } -std::string HEVCDecoderConfigurationRecord::GetCodecString( - VideoCodec codec) const { +std::string HEVCDecoderConfigurationRecord::GetCodecString(Codec codec) const { // ISO/IEC 14496-15:2014 Annex E. std::vector fields; fields.push_back(CodecAsString(codec)); diff --git a/packager/media/codecs/hevc_decoder_configuration_record.h b/packager/media/codecs/hevc_decoder_configuration_record.h index dcaa1eaef1..6f3c3e64ce 100644 --- a/packager/media/codecs/hevc_decoder_configuration_record.h +++ b/packager/media/codecs/hevc_decoder_configuration_record.h @@ -25,7 +25,7 @@ class HEVCDecoderConfigurationRecord : public DecoderConfigurationRecord { ~HEVCDecoderConfigurationRecord() override; /// @return The codec string. - std::string GetCodecString(VideoCodec codec) const; + std::string GetCodecString(Codec codec) const; private: bool ParseInternal() override; diff --git a/packager/media/codecs/vp_codec_configuration_record.cc b/packager/media/codecs/vp_codec_configuration_record.cc index 71d616f825..6afd43e61f 100644 --- a/packager/media/codecs/vp_codec_configuration_record.cc +++ b/packager/media/codecs/vp_codec_configuration_record.cc @@ -24,7 +24,7 @@ enum VP9CodecFeatures { kFeatureChromaSubsampling = 4, }; -std::string VPCodecAsString(VideoCodec codec) { +std::string VPCodecAsString(Codec codec) { switch (codec) { case kCodecVP8: return "vp08"; @@ -205,7 +205,7 @@ void VPCodecConfigurationRecord::WriteWebM(std::vector* data) const { writer.SwapBuffer(data); } -std::string VPCodecConfigurationRecord::GetCodecString(VideoCodec codec) const { +std::string VPCodecConfigurationRecord::GetCodecString(Codec codec) const { const std::string fields[] = { base::IntToString(profile_), base::IntToString(level_), diff --git a/packager/media/codecs/vp_codec_configuration_record.h b/packager/media/codecs/vp_codec_configuration_record.h index b298bdd9d1..8b07b48d1b 100644 --- a/packager/media/codecs/vp_codec_configuration_record.h +++ b/packager/media/codecs/vp_codec_configuration_record.h @@ -68,7 +68,7 @@ class VPCodecConfigurationRecord { void WriteWebM(std::vector* data) const; /// @return The codec string. - std::string GetCodecString(VideoCodec codec) const; + std::string GetCodecString(Codec codec) const; // Merges the values from the given configuration. If there are values in // both |*this| and |other|, the values in |other| take precedence. diff --git a/packager/media/event/muxer_listener_test_helper.cc b/packager/media/event/muxer_listener_test_helper.cc index 59ab969152..11c7ef23f4 100644 --- a/packager/media/event/muxer_listener_test_helper.cc +++ b/packager/media/event/muxer_listener_test_helper.cc @@ -16,29 +16,19 @@ VideoStreamInfoParameters::~VideoStreamInfoParameters() {} scoped_refptr CreateVideoStreamInfo( const VideoStreamInfoParameters& param) { - return scoped_refptr( - new VideoStreamInfo(param.track_id, - param.time_scale, - param.duration, - param.codec, - param.codec_string, - param.language, - param.width, - param.height, - param.pixel_width, - param.pixel_height, - 0, // trick_play_rate - param.nalu_length_size, - param.codec_config.data(), - param.codec_config.size(), - param.is_encrypted)); + return scoped_refptr(new VideoStreamInfo( + param.track_id, param.time_scale, param.duration, param.codec, + param.codec_string, param.codec_config.data(), param.codec_config.size(), + param.width, param.height, param.pixel_width, param.pixel_height, + 0, // trick_play_rate + param.nalu_length_size, param.language, param.is_encrypted)); } VideoStreamInfoParameters GetDefaultVideoStreamInfoParams() { const int kTrackId = 0; const uint32_t kTimeScale = 10; const uint64_t kVideoStreamDuration = 200; - const VideoCodec kH264Codec = kCodecH264; + const Codec kH264Codec = kCodecH264; const char* kCodecString = "avc1.010101"; const char* kLanuageUndefined = "und"; const uint16_t kWidth = 720; diff --git a/packager/media/event/muxer_listener_test_helper.h b/packager/media/event/muxer_listener_test_helper.h index f17af435c7..f196f803db 100644 --- a/packager/media/event/muxer_listener_test_helper.h +++ b/packager/media/event/muxer_listener_test_helper.h @@ -60,7 +60,7 @@ struct VideoStreamInfoParameters { int track_id; uint32_t time_scale; uint64_t duration; - VideoCodec codec; + Codec codec; std::string codec_string; std::string language; uint16_t width; diff --git a/packager/media/formats/mp2t/es_parser_adts.cc b/packager/media/formats/mp2t/es_parser_adts.cc index 0234d9f650..015bdfbf24 100644 --- a/packager/media/formats/mp2t/es_parser_adts.cc +++ b/packager/media/formats/mp2t/es_parser_adts.cc @@ -221,25 +221,13 @@ bool EsParserAdts::UpdateAudioConfiguration(const uint8_t* adts_frame, ? std::min(2 * samples_per_second, 48000) : samples_per_second; - last_audio_decoder_config_ = scoped_refptr( - new AudioStreamInfo( - pid(), - kMpeg2Timescale, - kInfiniteDuration, - kCodecAAC, - AudioStreamInfo::GetCodecString(kCodecAAC, - adts_header.GetObjectType()), - std::string(), - kAacSampleSizeBits, - adts_header.GetNumChannels(), - extended_samples_per_second, - 0 /* seek preroll */, - 0 /* codec delay */, - 0 /* max bitrate */, - 0 /* avg bitrate */, - audio_specific_config.data(), - audio_specific_config.size(), - false)); + last_audio_decoder_config_ = scoped_refptr(new AudioStreamInfo( + pid(), kMpeg2Timescale, kInfiniteDuration, kCodecAAC, + AudioStreamInfo::GetCodecString(kCodecAAC, adts_header.GetObjectType()), + audio_specific_config.data(), audio_specific_config.size(), + kAacSampleSizeBits, adts_header.GetNumChannels(), + extended_samples_per_second, 0 /* seek preroll */, 0 /* codec delay */, + 0 /* max bitrate */, 0 /* avg bitrate */, std::string(), false)); DVLOG(1) << "Sampling frequency: " << samples_per_second; DVLOG(1) << "Extended sampling frequency: " << extended_samples_per_second; diff --git a/packager/media/formats/mp2t/es_parser_h264.cc b/packager/media/formats/mp2t/es_parser_h264.cc index 2a5d946563..e5d4eeeb82 100644 --- a/packager/media/formats/mp2t/es_parser_h264.cc +++ b/packager/media/formats/mp2t/es_parser_h264.cc @@ -148,9 +148,10 @@ bool EsParserH264::UpdateVideoDecoderConfig(int pps_id) { AVCDecoderConfigurationRecord::GetCodecString(decoder_config_record[1], decoder_config_record[2], decoder_config_record[3]), - std::string(), coded_width, coded_height, pixel_width, pixel_height, 0, - H264ByteToUnitStreamConverter::kUnitStreamNaluLengthSize, - decoder_config_record.data(), decoder_config_record.size(), false)); + decoder_config_record.data(), decoder_config_record.size(), coded_width, + coded_height, pixel_width, pixel_height, 0, + H264ByteToUnitStreamConverter::kUnitStreamNaluLengthSize, std::string(), + false)); DVLOG(1) << "Profile IDC: " << sps->profile_idc; DVLOG(1) << "Level IDC: " << sps->level_idc; DVLOG(1) << "log2_max_frame_num_minus4: " << sps->log2_max_frame_num_minus4; diff --git a/packager/media/formats/mp2t/es_parser_h265.cc b/packager/media/formats/mp2t/es_parser_h265.cc index 3b67c7f575..ead8d96c9c 100644 --- a/packager/media/formats/mp2t/es_parser_h265.cc +++ b/packager/media/formats/mp2t/es_parser_h265.cc @@ -148,23 +148,12 @@ bool EsParserH265::UpdateVideoDecoderConfig(int pps_id) { return false; } - last_video_decoder_config_ = scoped_refptr( - new VideoStreamInfo( - pid(), - kMpeg2Timescale, - kInfiniteDuration, - kCodecHVC1, - decoder_config.GetCodecString(kCodecHVC1), - std::string(), - coded_width, - coded_height, - pixel_width, - pixel_height, - 0, - H26xByteToUnitStreamConverter::kUnitStreamNaluLengthSize, - decoder_config_record.data(), - decoder_config_record.size(), - false)); + last_video_decoder_config_ = scoped_refptr(new VideoStreamInfo( + pid(), kMpeg2Timescale, kInfiniteDuration, kCodecHVC1, + decoder_config.GetCodecString(kCodecHVC1), decoder_config_record.data(), + decoder_config_record.size(), coded_width, coded_height, pixel_width, + pixel_height, 0, H26xByteToUnitStreamConverter::kUnitStreamNaluLengthSize, + std::string(), false)); // Video config notification. new_stream_info_cb_.Run(last_video_decoder_config_); diff --git a/packager/media/formats/mp2t/pes_packet_generator.cc b/packager/media/formats/mp2t/pes_packet_generator.cc index 9cb9361bd3..1a952dc36d 100644 --- a/packager/media/formats/mp2t/pes_packet_generator.cc +++ b/packager/media/formats/mp2t/pes_packet_generator.cc @@ -97,7 +97,7 @@ bool PesPacketGenerator::Initialize(const StreamInfo& stream_info) { if (stream_type_ == kStreamVideo) { const VideoStreamInfo& video_stream_info = static_cast(stream_info); - if (video_stream_info.codec() != VideoCodec::kCodecH264) { + if (video_stream_info.codec() != Codec::kCodecH264) { NOTIMPLEMENTED() << "Video codec " << video_stream_info.codec() << " is not supported."; return false; @@ -110,7 +110,7 @@ bool PesPacketGenerator::Initialize(const StreamInfo& stream_info) { } else if (stream_type_ == kStreamAudio) { const AudioStreamInfo& audio_stream_info = static_cast(stream_info); - if (audio_stream_info.codec() != AudioCodec::kCodecAAC) { + if (audio_stream_info.codec() != Codec::kCodecAAC) { NOTIMPLEMENTED() << "Audio codec " << audio_stream_info.codec() << " is not supported yet."; return false; diff --git a/packager/media/formats/mp2t/pes_packet_generator_unittest.cc b/packager/media/formats/mp2t/pes_packet_generator_unittest.cc index 4ff15c0e81..f4e2fe3846 100644 --- a/packager/media/formats/mp2t/pes_packet_generator_unittest.cc +++ b/packager/media/formats/mp2t/pes_packet_generator_unittest.cc @@ -34,10 +34,10 @@ const uint8_t kAnyData[] = { const bool kIsKeyFrame = true; -// Only {Audio,Video}Codec and extra data matter for this test. Other values are +// Only Codec and extra data matter for this test. Other values are // bogus. -const VideoCodec kH264VideoCodec = VideoCodec::kCodecH264; -const AudioCodec kAacAudioCodec = AudioCodec::kCodecAAC; +const Codec kH264Codec = Codec::kCodecH264; +const Codec kAacCodec = Codec::kCodecAAC; // TODO(rkuroiwa): It might make sense to inject factory functions to create // NalUnitToByteStreamConverter and AACAudioSpecificConfig so that these @@ -102,20 +102,19 @@ class MockAACAudioSpecificConfig : public AACAudioSpecificConfig { MOCK_CONST_METHOD1(ConvertToADTS, bool(std::vector* buffer)); }; -scoped_refptr CreateVideoStreamInfo(VideoCodec codec) { +scoped_refptr CreateVideoStreamInfo(Codec codec) { scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, codec, kCodecString, kLanguage, - kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kVideoExtraData, arraysize(kVideoExtraData), - kIsEncrypted)); + kTrackId, kTimeScale, kDuration, codec, kCodecString, kVideoExtraData, + arraysize(kVideoExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); return stream_info; } -scoped_refptr CreateAudioStreamInfo(AudioCodec codec) { +scoped_refptr CreateAudioStreamInfo(Codec codec) { scoped_refptr stream_info(new AudioStreamInfo( - kTrackId, kTimeScale, kDuration, codec, kCodecString, kLanguage, - kSampleBits, kNumChannels, kSamplingFrequency, kSeekPreroll, kCodecDelay, - kMaxBitrate, kAverageBitrate, kAudioExtraData, arraysize(kAudioExtraData), + kTrackId, kTimeScale, kDuration, codec, kCodecString, kAudioExtraData, + arraysize(kAudioExtraData), kSampleBits, kNumChannels, kSamplingFrequency, + kSeekPreroll, kCodecDelay, kMaxBitrate, kAverageBitrate, kLanguage, kIsEncrypted)); return stream_info; } @@ -140,7 +139,7 @@ class PesPacketGeneratorTest : public ::testing::Test { const uint8_t* expected_output, size_t expected_output_size) { scoped_refptr stream_info( - CreateVideoStreamInfo(kH264VideoCodec)); + CreateVideoStreamInfo(kH264Codec)); EXPECT_TRUE(generator_.Initialize(*stream_info)); EXPECT_EQ(0u, generator_.NumberOfReadyPesPackets()); @@ -189,7 +188,7 @@ class PesPacketGeneratorTest : public ::testing::Test { const uint8_t* expected_output, size_t expected_output_size) { scoped_refptr stream_info( - CreateAudioStreamInfo(kAacAudioCodec)); + CreateAudioStreamInfo(kAacCodec)); EXPECT_TRUE(generator_.Initialize(*stream_info)); EXPECT_EQ(0u, generator_.NumberOfReadyPesPackets()); @@ -224,26 +223,24 @@ class PesPacketGeneratorTest : public ::testing::Test { }; TEST_F(PesPacketGeneratorTest, InitializeVideo) { - scoped_refptr stream_info( - CreateVideoStreamInfo(kH264VideoCodec)); + scoped_refptr stream_info(CreateVideoStreamInfo(kH264Codec)); EXPECT_TRUE(generator_.Initialize(*stream_info)); } TEST_F(PesPacketGeneratorTest, InitializeVideoNonH264) { scoped_refptr stream_info( - CreateVideoStreamInfo(VideoCodec::kCodecVP9)); + CreateVideoStreamInfo(Codec::kCodecVP9)); EXPECT_FALSE(generator_.Initialize(*stream_info)); } TEST_F(PesPacketGeneratorTest, InitializeAudio) { - scoped_refptr stream_info( - CreateAudioStreamInfo(kAacAudioCodec)); + scoped_refptr stream_info(CreateAudioStreamInfo(kAacCodec)); EXPECT_TRUE(generator_.Initialize(*stream_info)); } TEST_F(PesPacketGeneratorTest, InitializeAudioNonAac) { scoped_refptr stream_info( - CreateAudioStreamInfo(AudioCodec::kCodecOpus)); + CreateAudioStreamInfo(Codec::kCodecOpus)); EXPECT_FALSE(generator_.Initialize(*stream_info)); } @@ -251,13 +248,12 @@ TEST_F(PesPacketGeneratorTest, InitializeAudioNonAac) { TEST_F(PesPacketGeneratorTest, InitializeTextInfo) { scoped_refptr stream_info( new TextStreamInfo(kTrackId, kTimeScale, kDuration, kCodecString, - kLanguage, std::string(), kWidth, kHeight)); + std::string(), kWidth, kHeight, kLanguage)); EXPECT_FALSE(generator_.Initialize(*stream_info)); } TEST_F(PesPacketGeneratorTest, AddVideoSample) { - scoped_refptr stream_info( - CreateVideoStreamInfo(kH264VideoCodec)); + scoped_refptr stream_info(CreateVideoStreamInfo(kH264Codec)); EXPECT_TRUE(generator_.Initialize(*stream_info)); EXPECT_EQ(0u, generator_.NumberOfReadyPesPackets()); @@ -293,8 +289,7 @@ TEST_F(PesPacketGeneratorTest, AddVideoSample) { } TEST_F(PesPacketGeneratorTest, AddVideoSampleFailedToConvert) { - scoped_refptr stream_info( - CreateVideoStreamInfo(kH264VideoCodec)); + scoped_refptr stream_info(CreateVideoStreamInfo(kH264Codec)); EXPECT_TRUE(generator_.Initialize(*stream_info)); EXPECT_EQ(0u, generator_.NumberOfReadyPesPackets()); @@ -316,8 +311,7 @@ TEST_F(PesPacketGeneratorTest, AddVideoSampleFailedToConvert) { } TEST_F(PesPacketGeneratorTest, AddAudioSample) { - scoped_refptr stream_info( - CreateAudioStreamInfo(kAacAudioCodec)); + scoped_refptr stream_info(CreateAudioStreamInfo(kAacCodec)); EXPECT_TRUE(generator_.Initialize(*stream_info)); EXPECT_EQ(0u, generator_.NumberOfReadyPesPackets()); @@ -345,8 +339,7 @@ TEST_F(PesPacketGeneratorTest, AddAudioSample) { } TEST_F(PesPacketGeneratorTest, AddAudioSampleFailedToConvert) { - scoped_refptr stream_info( - CreateAudioStreamInfo(kAacAudioCodec)); + scoped_refptr stream_info(CreateAudioStreamInfo(kAacCodec)); EXPECT_TRUE(generator_.Initialize(*stream_info)); EXPECT_EQ(0u, generator_.NumberOfReadyPesPackets()); @@ -368,10 +361,9 @@ TEST_F(PesPacketGeneratorTest, AddAudioSampleFailedToConvert) { TEST_F(PesPacketGeneratorTest, TimeStampScaling) { const uint32_t kTestTimescale = 1000; scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTestTimescale, kDuration, kH264VideoCodec, kCodecString, - kLanguage, kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kVideoExtraData, arraysize(kVideoExtraData), - kIsEncrypted)); + kTrackId, kTestTimescale, kDuration, kH264Codec, kCodecString, + kVideoExtraData, arraysize(kVideoExtraData), kWidth, kHeight, kPixelWidth, + kPixelHeight, kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); EXPECT_TRUE(generator_.Initialize(*stream_info)); EXPECT_EQ(0u, generator_.NumberOfReadyPesPackets()); diff --git a/packager/media/formats/mp2t/ts_segmenter_unittest.cc b/packager/media/formats/mp2t/ts_segmenter_unittest.cc index 9595190d28..11bbb5a346 100644 --- a/packager/media/formats/mp2t/ts_segmenter_unittest.cc +++ b/packager/media/formats/mp2t/ts_segmenter_unittest.cc @@ -29,7 +29,7 @@ namespace { // All data here is bogus. They are used to create VideoStreamInfo but the // actual values don't matter at all. const bool kIsKeyFrame = true; -const VideoCodec kH264VideoCodec = VideoCodec::kCodecH264; +const Codec kH264Codec = Codec::kCodecH264; const uint8_t kExtraData[] = { 0x00, }; @@ -107,9 +107,9 @@ class TsSegmenterTest : public ::testing::Test { TEST_F(TsSegmenterTest, Initialize) { scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, kH264VideoCodec, kCodecString, kLanguage, - kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, kH264Codec, kCodecString, kExtraData, + arraysize(kExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); MuxerOptions options; options.segment_template = "file$Number$.ts"; TsSegmenter segmenter(options, nullptr); @@ -127,9 +127,9 @@ TEST_F(TsSegmenterTest, Initialize) { TEST_F(TsSegmenterTest, AddSample) { scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, kH264VideoCodec, kCodecString, kLanguage, - kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, kH264Codec, kCodecString, kExtraData, + arraysize(kExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); MuxerOptions options; options.segment_duration = 10.0; options.segment_template = "file$Number$.ts"; @@ -182,9 +182,9 @@ TEST_F(TsSegmenterTest, PassedSegmentDuration) { // done correctly in the segmenter. const uint32_t kInputTimescale = 1001; scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kInputTimescale, kDuration, kH264VideoCodec, kCodecString, - kLanguage, kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kInputTimescale, kDuration, kH264Codec, kCodecString, + kExtraData, arraysize(kExtraData), kWidth, kHeight, kPixelWidth, + kPixelHeight, kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); MuxerOptions options; options.segment_duration = 10.0; options.segment_template = "file$Number$.ts"; @@ -281,9 +281,9 @@ TEST_F(TsSegmenterTest, PassedSegmentDuration) { // Finalize right after Initialize(). The writer will not be initialized. TEST_F(TsSegmenterTest, InitializeThenFinalize) { scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, kH264VideoCodec, kCodecString, kLanguage, - kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, kH264Codec, kCodecString, kExtraData, + arraysize(kExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); MuxerOptions options; options.segment_duration = 10.0; options.segment_template = "file$Number$.ts"; @@ -310,9 +310,9 @@ TEST_F(TsSegmenterTest, InitializeThenFinalize) { // writer with a mock. TEST_F(TsSegmenterTest, Finalize) { scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, kH264VideoCodec, kCodecString, kLanguage, - kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, kH264Codec, kCodecString, kExtraData, + arraysize(kExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); MuxerOptions options; options.segment_duration = 10.0; options.segment_template = "file$Number$.ts"; @@ -339,9 +339,9 @@ TEST_F(TsSegmenterTest, Finalize) { // Verify that it won't finish a segment if the sample is not a key frame. TEST_F(TsSegmenterTest, SegmentOnlyBeforeKeyFrame) { scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, kH264VideoCodec, kCodecString, kLanguage, - kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, kH264Codec, kCodecString, kExtraData, + arraysize(kExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); MuxerOptions options; options.segment_duration = 10.0; options.segment_template = "file$Number$.ts"; @@ -445,9 +445,9 @@ TEST_F(TsSegmenterTest, SegmentOnlyBeforeKeyFrame) { TEST_F(TsSegmenterTest, WithEncryptionNoClearLead) { scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, kH264VideoCodec, kCodecString, kLanguage, - kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, kH264Codec, kCodecString, kExtraData, + arraysize(kExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); MuxerOptions options; options.segment_duration = 10.0; options.segment_template = "file$Number$.ts"; @@ -485,9 +485,9 @@ TEST_F(TsSegmenterTest, WithEncryptionNoClearLead) { // not null. TEST_F(TsSegmenterTest, WithEncryptionNoClearLeadNoMuxerListener) { scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, kH264VideoCodec, kCodecString, kLanguage, - kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, kH264Codec, kCodecString, kExtraData, + arraysize(kExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); MuxerOptions options; options.segment_duration = 10.0; options.segment_template = "file$Number$.ts"; @@ -522,9 +522,9 @@ TEST_F(TsSegmenterTest, WithEncryptionNoClearLeadNoMuxerListener) { // Verify that encryption notification is sent to objects after clear lead. TEST_F(TsSegmenterTest, WithEncryptionWithClearLead) { scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, kH264VideoCodec, kCodecString, - kLanguage, kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, kH264Codec, kCodecString, kExtraData, + arraysize(kExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); MuxerOptions options; options.segment_duration = 1.0; diff --git a/packager/media/formats/mp2t/ts_writer.cc b/packager/media/formats/mp2t/ts_writer.cc index 250c7014a1..9e5fb76d31 100644 --- a/packager/media/formats/mp2t/ts_writer.cc +++ b/packager/media/formats/mp2t/ts_writer.cc @@ -174,7 +174,7 @@ bool TsWriter::Initialize(const StreamInfo& stream_info) { if (stream_info.stream_type() == StreamType::kStreamVideo) { const VideoStreamInfo& video_stream_info = static_cast(stream_info); - if (video_stream_info.codec() != VideoCodec::kCodecH264) { + if (video_stream_info.codec() != Codec::kCodecH264) { LOG(ERROR) << "TsWriter cannot handle video codec " << video_stream_info.codec() << " yet."; return false; @@ -184,7 +184,7 @@ bool TsWriter::Initialize(const StreamInfo& stream_info) { DCHECK_EQ(stream_type, StreamType::kStreamAudio); const AudioStreamInfo& audio_stream_info = static_cast(stream_info); - if (audio_stream_info.codec() != AudioCodec::kCodecAAC) { + if (audio_stream_info.codec() != Codec::kCodecAAC) { LOG(ERROR) << "TsWriter cannot handle audio codec " << audio_stream_info.codec() << " yet."; return false; diff --git a/packager/media/formats/mp2t/ts_writer_unittest.cc b/packager/media/formats/mp2t/ts_writer_unittest.cc index 231993fb3a..78c189a81b 100644 --- a/packager/media/formats/mp2t/ts_writer_unittest.cc +++ b/packager/media/formats/mp2t/ts_writer_unittest.cc @@ -28,8 +28,8 @@ namespace { const int kTsPacketSize = 188; // Only {Audio,Video}Codec matter for this test. Other values are bogus. -const VideoCodec kH264VideoCodec = VideoCodec::kCodecH264; -const AudioCodec kAacAudioCodec = AudioCodec::kCodecAAC; +const Codec kH264Codec = Codec::kCodecH264; +const Codec kAacCodec = Codec::kCodecAAC; const int kTrackId = 0; const uint32_t kTimeScale = 90000; const uint64_t kDuration = 180000; @@ -158,35 +158,35 @@ class TsWriterTest : public ::testing::Test { TEST_F(TsWriterTest, InitializeVideoH264) { scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, kH264VideoCodec, kCodecString, kLanguage, - kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, kH264Codec, kCodecString, kExtraData, + arraysize(kExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); EXPECT_TRUE(ts_writer_.Initialize(*stream_info)); } TEST_F(TsWriterTest, InitializeVideoNonH264) { scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, VideoCodec::kCodecVP9, kCodecString, - kLanguage, kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, Codec::kCodecVP9, kCodecString, + kExtraData, arraysize(kExtraData), kWidth, kHeight, kPixelWidth, + kPixelHeight, kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); EXPECT_FALSE(ts_writer_.Initialize(*stream_info)); } TEST_F(TsWriterTest, InitializeAudioAac) { scoped_refptr stream_info(new AudioStreamInfo( - kTrackId, kTimeScale, kDuration, kAacAudioCodec, kCodecString, kLanguage, - kSampleBits, kNumChannels, kSamplingFrequency, kSeekPreroll, kCodecDelay, - kMaxBitrate, kAverageBitrate, kExtraData, arraysize(kExtraData), + kTrackId, kTimeScale, kDuration, kAacCodec, kCodecString, kExtraData, + arraysize(kExtraData), kSampleBits, kNumChannels, kSamplingFrequency, + kSeekPreroll, kCodecDelay, kMaxBitrate, kAverageBitrate, kLanguage, kIsEncrypted)); EXPECT_TRUE(ts_writer_.Initialize(*stream_info)); } TEST_F(TsWriterTest, InitializeAudioNonAac) { scoped_refptr stream_info(new AudioStreamInfo( - kTrackId, kTimeScale, kDuration, AudioCodec::kCodecOpus, kCodecString, - kLanguage, kSampleBits, kNumChannels, kSamplingFrequency, kSeekPreroll, - kCodecDelay, kMaxBitrate, kAverageBitrate, kExtraData, - arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, Codec::kCodecOpus, kCodecString, + kExtraData, arraysize(kExtraData), kSampleBits, kNumChannels, + kSamplingFrequency, kSeekPreroll, kCodecDelay, kMaxBitrate, + kAverageBitrate, kLanguage, kIsEncrypted)); EXPECT_FALSE(ts_writer_.Initialize(*stream_info)); } @@ -199,9 +199,9 @@ TEST_F(TsWriterTest, ClearH264Psi) { EXPECT_CALL(*mock_pmt_writer, ClearSegmentPmt(_)).WillOnce(WriteOnePmt()); scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, kH264VideoCodec, kCodecString, kLanguage, - kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, kH264Codec, kCodecString, kExtraData, + arraysize(kExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); EXPECT_TRUE(ts_writer_.Initialize(*stream_info)); ts_writer_.SetProgramMapTableWriterForTesting(mock_pmt_writer.Pass()); @@ -253,10 +253,10 @@ TEST_F(TsWriterTest, ClearAacPmt) { EXPECT_CALL(*mock_pmt_writer, ClearSegmentPmt(_)).WillOnce(WriteOnePmt()); scoped_refptr stream_info(new AudioStreamInfo( - kTrackId, kTimeScale, kDuration, kAacAudioCodec, kCodecString, kLanguage, + kTrackId, kTimeScale, kDuration, kAacCodec, kCodecString, + kAacBasicProfileExtraData, arraysize(kAacBasicProfileExtraData), kSampleBits, kNumChannels, kSamplingFrequency, kSeekPreroll, kCodecDelay, - kMaxBitrate, kAverageBitrate, kAacBasicProfileExtraData, - arraysize(kAacBasicProfileExtraData), kIsEncrypted)); + kMaxBitrate, kAverageBitrate, kLanguage, kIsEncrypted)); EXPECT_TRUE(ts_writer_.Initialize(*stream_info)); ts_writer_.SetProgramMapTableWriterForTesting(mock_pmt_writer.Pass()); @@ -281,9 +281,9 @@ TEST_F(TsWriterTest, ClearLeadH264Pmt) { .WillOnce(WriteTwoPmts()); scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, kH264VideoCodec, kCodecString, kLanguage, - kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, kH264Codec, kCodecString, kExtraData, + arraysize(kExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); EXPECT_TRUE(ts_writer_.Initialize(*stream_info)); ts_writer_.SetProgramMapTableWriterForTesting(mock_pmt_writer.Pass()); @@ -310,9 +310,9 @@ TEST_F(TsWriterTest, EncryptedSegmentsH264Pmt) { EXPECT_CALL(*mock_pmt_writer, EncryptedSegmentPmt(_)).WillOnce(WriteOnePmt()); scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, kH264VideoCodec, kCodecString, kLanguage, - kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, kH264Codec, kCodecString, kExtraData, + arraysize(kExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); EXPECT_TRUE(ts_writer_.Initialize(*stream_info)); ts_writer_.SetProgramMapTableWriterForTesting(mock_pmt_writer.Pass()); @@ -341,10 +341,10 @@ TEST_F(TsWriterTest, ClearLeadAacPmt) { .WillOnce(WriteTwoPmts()); scoped_refptr stream_info(new AudioStreamInfo( - kTrackId, kTimeScale, kDuration, kAacAudioCodec, kCodecString, kLanguage, + kTrackId, kTimeScale, kDuration, kAacCodec, kCodecString, + kAacBasicProfileExtraData, arraysize(kAacBasicProfileExtraData), kSampleBits, kNumChannels, kSamplingFrequency, kSeekPreroll, kCodecDelay, - kMaxBitrate, kAverageBitrate, kAacBasicProfileExtraData, - arraysize(kAacBasicProfileExtraData), kIsEncrypted)); + kMaxBitrate, kAverageBitrate, kLanguage, kIsEncrypted)); EXPECT_TRUE(ts_writer_.Initialize(*stream_info)); ts_writer_.SetProgramMapTableWriterForTesting(mock_pmt_writer.Pass()); @@ -371,10 +371,10 @@ TEST_F(TsWriterTest, EncryptedSegmentsAacPmt) { EXPECT_CALL(*mock_pmt_writer, EncryptedSegmentPmt(_)).WillOnce(WriteOnePmt()); scoped_refptr stream_info(new AudioStreamInfo( - kTrackId, kTimeScale, kDuration, kAacAudioCodec, kCodecString, kLanguage, + kTrackId, kTimeScale, kDuration, kAacCodec, kCodecString, + kAacBasicProfileExtraData, arraysize(kAacBasicProfileExtraData), kSampleBits, kNumChannels, kSamplingFrequency, kSeekPreroll, kCodecDelay, - kMaxBitrate, kAverageBitrate, kAacBasicProfileExtraData, - arraysize(kAacBasicProfileExtraData), kIsEncrypted)); + kMaxBitrate, kAverageBitrate, kLanguage, kIsEncrypted)); EXPECT_TRUE(ts_writer_.Initialize(*stream_info)); ts_writer_.SetProgramMapTableWriterForTesting(mock_pmt_writer.Pass()); @@ -398,9 +398,9 @@ TEST_F(TsWriterTest, EncryptedSegmentsAacPmt) { TEST_F(TsWriterTest, AddPesPacket) { scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, kH264VideoCodec, kCodecString, kLanguage, - kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, kH264Codec, kCodecString, kExtraData, + arraysize(kExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); EXPECT_TRUE(ts_writer_.Initialize(*stream_info)); EXPECT_TRUE(ts_writer_.NewSegment(test_file_name_)); @@ -463,9 +463,9 @@ TEST_F(TsWriterTest, AddPesPacket) { // Verify that PES packet > 64KiB can be handled. TEST_F(TsWriterTest, BigPesPacket) { scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, kH264VideoCodec, kCodecString, kLanguage, - kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, kH264Codec, kCodecString, kExtraData, + arraysize(kExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); EXPECT_TRUE(ts_writer_.Initialize(*stream_info)); EXPECT_TRUE(ts_writer_.NewSegment(test_file_name_)); @@ -499,9 +499,9 @@ TEST_F(TsWriterTest, BigPesPacket) { // PTS (implicilty) cast to bool is true. TEST_F(TsWriterTest, PesPtsZeroNoDts) { scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, kH264VideoCodec, kCodecString, kLanguage, - kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, kH264Codec, kCodecString, kExtraData, + arraysize(kExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); EXPECT_TRUE(ts_writer_.Initialize(*stream_info)); EXPECT_TRUE(ts_writer_.NewSegment(test_file_name_)); @@ -559,9 +559,9 @@ TEST_F(TsWriterTest, PesPtsZeroNoDts) { // adaptation_field_length should be 0. TEST_F(TsWriterTest, TsPacketPayload183Bytes) { scoped_refptr stream_info(new VideoStreamInfo( - kTrackId, kTimeScale, kDuration, kH264VideoCodec, kCodecString, kLanguage, - kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, kExtraData, arraysize(kExtraData), kIsEncrypted)); + kTrackId, kTimeScale, kDuration, kH264Codec, kCodecString, kExtraData, + arraysize(kExtraData), kWidth, kHeight, kPixelWidth, kPixelHeight, + kTrickPlayRate, kNaluLengthSize, kLanguage, kIsEncrypted)); EXPECT_TRUE(ts_writer_.Initialize(*stream_info)); EXPECT_TRUE(ts_writer_.NewSegment(test_file_name_)); diff --git a/packager/media/formats/mp4/encrypting_fragmenter.cc b/packager/media/formats/mp4/encrypting_fragmenter.cc index 6767f19c8b..f0d58ae74d 100644 --- a/packager/media/formats/mp4/encrypting_fragmenter.cc +++ b/packager/media/formats/mp4/encrypting_fragmenter.cc @@ -41,9 +41,8 @@ void AddSubsamples(uint64_t clear_bytes, subsamples->push_back(SubsampleEntry(clear_bytes, cipher_bytes)); } -VideoCodec GetVideoCodec(const StreamInfo& stream_info) { - if (stream_info.stream_type() != kStreamVideo) - return kUnknownVideoCodec; +Codec GetCodec(const StreamInfo& stream_info) { + if (stream_info.stream_type() != kStreamVideo) return kUnknownCodec; const VideoStreamInfo& video_stream_info = static_cast(stream_info); return video_stream_info.codec(); @@ -60,19 +59,15 @@ uint8_t GetNaluLengthSize(const StreamInfo& stream_info) { } // namespace EncryptingFragmenter::EncryptingFragmenter( - scoped_refptr info, - TrackFragment* traf, - scoped_ptr encryption_key, - int64_t clear_time, - FourCC protection_scheme, - uint8_t crypt_byte_block, - uint8_t skip_byte_block, + scoped_refptr info, TrackFragment* traf, + scoped_ptr encryption_key, int64_t clear_time, + FourCC protection_scheme, uint8_t crypt_byte_block, uint8_t skip_byte_block, MuxerListener* listener) : Fragmenter(info, traf), info_(info), encryption_key_(encryption_key.Pass()), nalu_length_size_(GetNaluLengthSize(*info)), - video_codec_(GetVideoCodec(*info)), + video_codec_(GetCodec(*info)), clear_time_(clear_time), protection_scheme_(protection_scheme), crypt_byte_block_(crypt_byte_block), diff --git a/packager/media/formats/mp4/encrypting_fragmenter.h b/packager/media/formats/mp4/encrypting_fragmenter.h index bd666779f3..0c93a75786 100644 --- a/packager/media/formats/mp4/encrypting_fragmenter.h +++ b/packager/media/formats/mp4/encrypting_fragmenter.h @@ -92,7 +92,7 @@ class EncryptingFragmenter : public Fragmenter { // and type of NAL units remain unencrypted. This function returns the size of // the size field in bytes. Can be 1, 2 or 4 bytes. const uint8_t nalu_length_size_; - const VideoCodec video_codec_; + const Codec video_codec_; int64_t clear_time_; const FourCC protection_scheme_; const uint8_t crypt_byte_block_; diff --git a/packager/media/formats/mp4/mp4_media_parser.cc b/packager/media/formats/mp4/mp4_media_parser.cc index a6c58b3500..b86979e876 100644 --- a/packager/media/formats/mp4/mp4_media_parser.cc +++ b/packager/media/formats/mp4/mp4_media_parser.cc @@ -40,7 +40,7 @@ uint64_t Rescale(uint64_t time_in_old_scale, return (static_cast(time_in_old_scale) / old_scale) * new_scale; } -VideoCodec FourCCToVideoCodec(FourCC fourcc) { +Codec FourCCToCodec(FourCC fourcc) { switch (fourcc) { case FOURCC_avc1: return kCodecH264; @@ -54,13 +54,6 @@ VideoCodec FourCCToVideoCodec(FourCC fourcc) { return kCodecVP9; case FOURCC_vp10: return kCodecVP10; - default: - return kUnknownVideoCodec; - } -} - -AudioCodec FourCCToAudioCodec(FourCC fourcc) { - switch(fourcc) { case FOURCC_Opus: return kCodecOpus; case FOURCC_dtsc: @@ -80,7 +73,7 @@ AudioCodec FourCCToAudioCodec(FourCC fourcc) { case FOURCC_ec_3: return kCodecEAC3; default: - return kUnknownAudioCodec; + return kUnknownCodec; } } @@ -343,7 +336,7 @@ bool MP4MediaParser::ParseMoov(BoxReader* reader) { const AudioSampleEntry& entry = samp_descr.audio_entries[desc_idx]; const FourCC actual_format = entry.GetActualFormat(); - AudioCodec codec = FourCCToAudioCodec(actual_format); + Codec codec = FourCCToCodec(actual_format); uint8_t num_channels = 0; uint32_t sampling_frequency = 0; uint64_t codec_delay_ns = 0; @@ -473,21 +466,11 @@ bool MP4MediaParser::ParseMoov(BoxReader* reader) { entry.sinf.info.track_encryption.default_is_protected == 1; DVLOG(1) << "is_audio_track_encrypted_: " << is_encrypted; streams.push_back(new AudioStreamInfo( - track->header.track_id, - timescale, - duration, - codec, + track->header.track_id, timescale, duration, codec, AudioStreamInfo::GetCodecString(codec, audio_object_type), - track->media.header.language.code, - entry.samplesize, - num_channels, - sampling_frequency, - seek_preroll_ns, - codec_delay_ns, - max_bitrate, - avg_bitrate, - codec_config.data(), - codec_config.size(), + codec_config.data(), codec_config.size(), entry.samplesize, + num_channels, sampling_frequency, seek_preroll_ns, codec_delay_ns, + max_bitrate, avg_bitrate, track->media.header.language.code, is_encrypted)); } @@ -509,7 +492,7 @@ bool MP4MediaParser::ParseMoov(BoxReader* reader) { uint8_t nalu_length_size = 0; const FourCC actual_format = entry.GetActualFormat(); - const VideoCodec video_codec = FourCCToVideoCodec(actual_format); + const Codec video_codec = FourCCToCodec(actual_format); switch (actual_format) { case FOURCC_avc1: { AVCDecoderConfigurationRecord avc_config; @@ -580,11 +563,11 @@ bool MP4MediaParser::ParseMoov(BoxReader* reader) { DVLOG(1) << "is_video_track_encrypted_: " << is_encrypted; streams.push_back(new VideoStreamInfo( track->header.track_id, timescale, duration, video_codec, - codec_string, track->media.header.language.code, coded_width, - coded_height, pixel_width, pixel_height, + codec_string, entry.codec_configuration.data.data(), + entry.codec_configuration.data.size(), coded_width, coded_height, + pixel_width, pixel_height, 0, // trick_play_rate - nalu_length_size, entry.codec_configuration.data.data(), - entry.codec_configuration.data.size(), is_encrypted)); + nalu_length_size, track->media.header.language.code, is_encrypted)); } } diff --git a/packager/media/formats/mp4/mp4_muxer.cc b/packager/media/formats/mp4/mp4_muxer.cc index 3de6640c23..277c10ae44 100644 --- a/packager/media/formats/mp4/mp4_muxer.cc +++ b/packager/media/formats/mp4/mp4_muxer.cc @@ -40,7 +40,7 @@ void SetStartAndEndFromOffsetAndSize(size_t offset, *end = *start + static_cast(size) - 1; } -FourCC VideoCodecToFourCC(VideoCodec codec) { +FourCC CodecToFourCC(Codec codec) { switch (codec) { case kCodecH264: return FOURCC_avc1; @@ -54,13 +54,6 @@ FourCC VideoCodecToFourCC(VideoCodec codec) { return FOURCC_vp09; case kCodecVP10: return FOURCC_vp10; - default: - return FOURCC_NULL; - } -} - -FourCC AudioCodecToFourCC(AudioCodec codec) { - switch (codec) { case kCodecAAC: return FOURCC_mp4a; case kCodecAC3: @@ -100,7 +93,7 @@ Status MP4Muxer::Initialize() { ftyp->compatible_brands.push_back(FOURCC_mp41); if (streams().size() == 1 && streams()[0]->info()->stream_type() == kStreamVideo) { - const FourCC codec_fourcc = VideoCodecToFourCC( + const FourCC codec_fourcc = CodecToFourCC( static_cast(streams()[0]->info().get())->codec()); if (codec_fourcc != FOURCC_NULL) ftyp->compatible_brands.push_back(codec_fourcc); @@ -226,7 +219,7 @@ void MP4Muxer::GenerateVideoTrak(const VideoStreamInfo* video_info, trak->header.height = video_info->height() * 0x10000; VideoSampleEntry video; - video.format = VideoCodecToFourCC(video_info->codec()); + video.format = CodecToFourCC(video_info->codec()); video.width = video_info->width(); video.height = video_info->height(); video.codec_configuration.data = video_info->codec_config(); @@ -249,7 +242,7 @@ void MP4Muxer::GenerateAudioTrak(const AudioStreamInfo* audio_info, trak->header.volume = 0x100; AudioSampleEntry audio; - audio.format = AudioCodecToFourCC(audio_info->codec()); + audio.format = CodecToFourCC(audio_info->codec()); switch(audio_info->codec()){ case kCodecAAC: audio.esds.es_descriptor.set_object_type(kISO_14496_3); // MPEG4 AAC. diff --git a/packager/media/formats/webm/encryptor.cc b/packager/media/formats/webm/encryptor.cc index a23cf563cf..9808cbc19c 100644 --- a/packager/media/formats/webm/encryptor.cc +++ b/packager/media/formats/webm/encryptor.cc @@ -6,15 +6,21 @@ #include "packager/media/formats/webm/encryptor.h" +#include #include "packager/media/base/aes_encryptor.h" +#include "packager/media/base/buffer_writer.h" #include "packager/media/base/fourccs.h" #include "packager/media/base/media_sample.h" +#include "packager/media/codecs/vp9_parser.h" +#include "packager/media/formats/webm/webm_constants.h" namespace shaka { namespace media { namespace webm { namespace { +const size_t kAesBlockSize = 16; + Status CreateContentEncryption(mkvmuxer::Track* track, EncryptionKey* key) { if (!track->AddContentEncoding()) { return Status(error::INTERNAL_ERROR, @@ -54,9 +60,12 @@ Encryptor::~Encryptor() {} Status Encryptor::Initialize(MuxerListener* muxer_listener, KeySource::TrackType track_type, - KeySource* key_source) { + Codec codec, + KeySource* key_source, + bool webm_subsample_encryption) { DCHECK(key_source); - return CreateEncryptor(muxer_listener, track_type, key_source); + return CreateEncryptor(muxer_listener, track_type, codec, key_source, + webm_subsample_encryption); } Status Encryptor::AddTrackInfo(mkvmuxer::Track* track) { @@ -69,26 +78,88 @@ Status Encryptor::EncryptFrame(scoped_refptr sample, DCHECK(encryptor_); const size_t sample_size = sample->data_size(); - if (encrypt_frame) { - // | 1 | iv | enc_data | - const size_t iv_size = encryptor_->iv().size(); - sample->resize_data(sample_size + iv_size + 1); - uint8_t* sample_data = sample->writable_data(); - - // Encrypt the data in-place. - if (!encryptor_->Crypt(sample_data, sample_size, sample_data)) { - return Status(error::MUXER_FAILURE, "Failed to encrypt the frame."); + // We need to parse the frame (which also updates the vpx parser) even if the + // frame is not encrypted as the next (encrypted) frame may be dependent on + // this clear frame. + std::vector vpx_frames; + if (vpx_parser_) { + if (!vpx_parser_->Parse(sample->data(), sample_size, &vpx_frames)) { + return Status(error::MUXER_FAILURE, "Failed to parse VPx frame."); } + } - // First move the sample data to after the IV; then write the IV and signal - // byte. - memmove(sample_data + iv_size + 1, sample_data, sample_size); - sample_data[0] = 0x01; - memcpy(sample_data + 1, encryptor_->iv().data(), iv_size); + if (encrypt_frame) { + const size_t iv_size = encryptor_->iv().size(); + if (iv_size != kWebMIvSize) { + return Status(error::MUXER_FAILURE, + "Incorrect size WebM encryption IV."); + } + if (vpx_frames.size()) { + // Use partitioned subsample encryption: | signal_byte(3) | iv + // | num_partitions | partition_offset * n | enc_data | + if (vpx_frames.size() > kWebMMaxSubsamples) { + return Status(error::MUXER_FAILURE, + "Maximum number of VPx encryption partitions exceeded."); + } + uint8_t num_partitions = + vpx_frames.size() == 1 ? 1 : vpx_frames.size() * 2; + size_t header_size = kWebMSignalByteSize + iv_size + + kWebMNumPartitionsSize + + (kWebMPartitionOffsetSize * num_partitions); + sample->resize_data(header_size + sample_size); + uint8_t* sample_data = sample->writable_data(); + memmove(sample_data + header_size, sample_data, sample_size); + sample_data[0] = kWebMEncryptedSignal | kWebMPartitionedSignal; + memcpy(sample_data + kWebMSignalByteSize, encryptor_->iv().data(), + iv_size); + sample_data[kWebMSignalByteSize + kWebMIvSize] = num_partitions; + uint32 partition_offset = 0; + BufferWriter offsets_buffer(kWebMPartitionOffsetSize * num_partitions); + for (const auto& vpx_frame : vpx_frames) { + uint32_t encrypted_size = + vpx_frame.frame_size - vpx_frame.uncompressed_header_size; + encrypted_size -= encrypted_size % kAesBlockSize; + uint32_t clear_size = vpx_frame.frame_size - encrypted_size; + partition_offset += clear_size; + offsets_buffer.AppendInt(partition_offset); + if (encrypted_size > 0) { + uint8_t* encrypted_ptr = sample_data + header_size + partition_offset; + if (!encryptor_->Crypt(encrypted_ptr, encrypted_size, encrypted_ptr)) { + return Status(error::MUXER_FAILURE, "Failed to encrypt the frame."); + } + partition_offset += encrypted_size; + } + if (num_partitions > 1) { + offsets_buffer.AppendInt(partition_offset); + } + } + DCHECK_EQ(num_partitions * kWebMPartitionOffsetSize, + offsets_buffer.Size()); + memcpy(sample_data + kWebMSignalByteSize + kWebMIvSize + + kWebMNumPartitionsSize, + offsets_buffer.Buffer(), offsets_buffer.Size()); + } else { + // Use whole-frame encryption: | signal_byte(1) | iv | enc_data | + + sample->resize_data(sample_size + iv_size + kWebMSignalByteSize); + uint8_t* sample_data = sample->writable_data(); + + // Encrypt the data in-place. + if (!encryptor_->Crypt(sample_data, sample_size, sample_data)) { + return Status(error::MUXER_FAILURE, "Failed to encrypt the frame."); + } + + // First move the sample data to after the IV; then write the IV and + // signal byte. + memmove(sample_data + iv_size + kWebMSignalByteSize, sample_data, + sample_size); + sample_data[0] = kWebMEncryptedSignal; + memcpy(sample_data + 1, encryptor_->iv().data(), iv_size); + } encryptor_->UpdateIv(); } else { - // | 0 | data | + // Clear sample: | signal_byte(0) | data | sample->resize_data(sample_size + 1); uint8_t* sample_data = sample->writable_data(); memmove(sample_data + 1, sample_data, sample_size); @@ -100,7 +171,9 @@ Status Encryptor::EncryptFrame(scoped_refptr sample, Status Encryptor::CreateEncryptor(MuxerListener* muxer_listener, KeySource::TrackType track_type, - KeySource* key_source) { + Codec codec, + KeySource* key_source, + bool webm_subsample_encryption) { scoped_ptr encryption_key(new EncryptionKey()); Status status = key_source->GetKey(track_type, encryption_key.get()); if (!status.ok()) @@ -109,13 +182,18 @@ Status Encryptor::CreateEncryptor(MuxerListener* muxer_listener, if (!AesCryptor::GenerateRandomIv(FOURCC_cenc, &encryption_key->iv)) return Status(error::INTERNAL_ERROR, "Failed to generate random iv."); } - + DCHECK_EQ(kWebMIvSize, encryption_key->iv.size()); scoped_ptr encryptor(new AesCtrEncryptor()); const bool initialized = encryptor->InitializeWithIv(encryption_key->key, encryption_key->iv); if (!initialized) return Status(error::INTERNAL_ERROR, "Failed to create the encryptor."); + if (webm_subsample_encryption && codec == kCodecVP9) { + // Allocate VP9 parser to do subsample encryption of VP9. + vpx_parser_.reset(new VP9Parser); + } + if (muxer_listener) { const bool kInitialEncryptionInfo = true; muxer_listener->OnEncryptionInfoReady( diff --git a/packager/media/formats/webm/encryptor.h b/packager/media/formats/webm/encryptor.h index 051045f5b1..0cdfe7fb0e 100644 --- a/packager/media/formats/webm/encryptor.h +++ b/packager/media/formats/webm/encryptor.h @@ -11,6 +11,8 @@ #include "packager/base/memory/scoped_ptr.h" #include "packager/media/base/key_source.h" #include "packager/media/base/status.h" +#include "packager/media/base/stream_info.h" +#include "packager/media/codecs/vpx_parser.h" #include "packager/media/event/muxer_listener.h" #include "packager/third_party/libwebm/src/mkvmuxer.hpp" @@ -33,7 +35,9 @@ class Encryptor { /// @return OK on success, an error status otherwise. Status Initialize(MuxerListener* muxer_listener, KeySource::TrackType track_type, - KeySource* key_source); + Codec codec, + KeySource* key_source, + bool webm_subsample_encryption); /// Adds the encryption info to the given track. Initialize must be called /// first. @@ -50,11 +54,14 @@ class Encryptor { // Create the encryptor for the internal encryption key. Status CreateEncryptor(MuxerListener* muxer_listener, KeySource::TrackType track_type, - KeySource* key_source); + Codec codec, + KeySource* key_source, + bool webm_subsample_encryption); private: scoped_ptr key_; scoped_ptr encryptor_; + scoped_ptr vpx_parser_; }; } // namespace webm diff --git a/packager/media/formats/webm/segmenter.cc b/packager/media/formats/webm/segmenter.cc index 4b4ca15530..0d590850b8 100644 --- a/packager/media/formats/webm/segmenter.cc +++ b/packager/media/formats/webm/segmenter.cc @@ -79,7 +79,8 @@ Status Segmenter::Initialize(scoped_ptr writer, Status status; if (encryption_key_source) { - status = InitializeEncryptor(encryption_key_source, max_sd_pixels); + status = InitializeEncryptor(encryption_key_source, + max_sd_pixels); if (!status.ok()) return status; } @@ -362,7 +363,8 @@ Status Segmenter::InitializeEncryptor(KeySource* key_source, GetTrackTypeForEncryption(*info_, max_sd_pixels); if (track_type == KeySource::TrackType::TRACK_TYPE_UNKNOWN) return Status::OK; - return encryptor_->Initialize(muxer_listener_, track_type, key_source); + return encryptor_->Initialize(muxer_listener_, track_type, info_->codec(), + key_source, options_.webm_subsample_encryption); } Status Segmenter::WriteFrame(bool write_duration) { diff --git a/packager/media/formats/webm/segmenter_test_base.cc b/packager/media/formats/webm/segmenter_test_base.cc index 4ef10dbc45..726f0042de 100644 --- a/packager/media/formats/webm/segmenter_test_base.cc +++ b/packager/media/formats/webm/segmenter_test_base.cc @@ -25,7 +25,7 @@ const uint8_t kTestMediaSampleSideData[] = { const int kTrackId = 1; const uint32_t kTimeScale = 1000; const uint64_t kDuration = 8000; -const VideoCodec kVideoCodec = kCodecVP8; +const Codec kCodec = kCodecVP8; const std::string kCodecString = "vp8"; const std::string kLanguage = "en"; const uint16_t kWidth = 100; @@ -92,10 +92,10 @@ MuxerOptions SegmentTestBase::CreateMuxerOptions() const { } VideoStreamInfo* SegmentTestBase::CreateVideoStreamInfo() const { - return new VideoStreamInfo(kTrackId, kTimeScale, kDuration, kVideoCodec, - kCodecString, kLanguage, kWidth, kHeight, + return new VideoStreamInfo(kTrackId, kTimeScale, kDuration, kCodec, + kCodecString, NULL, 0, kWidth, kHeight, kPixelWidth, kPixelHeight, kTrickPlayRate, - kNaluLengthSize, NULL, 0, false); + kNaluLengthSize, kLanguage, false); } std::string SegmentTestBase::OutputFileName() const { @@ -200,4 +200,3 @@ bool SegmentTestBase::ClusterParser::OnString(int id, const std::string& str) { } // namespace media } // namespace shaka - diff --git a/packager/media/formats/webm/webm.gyp b/packager/media/formats/webm/webm.gyp index 3a1d7d3623..7557405d27 100644 --- a/packager/media/formats/webm/webm.gyp +++ b/packager/media/formats/webm/webm.gyp @@ -56,6 +56,7 @@ ], 'dependencies': [ '../../../third_party/boringssl/boringssl.gyp:boringssl', + '../../../third_party/gflags/gflags.gyp:gflags', '../../../third_party/libwebm/libwebm.gyp:mkvmuxer', '../../base/media_base.gyp:media_base', '../../codecs/codecs.gyp:codecs' diff --git a/packager/media/formats/webm/webm_audio_client.cc b/packager/media/formats/webm/webm_audio_client.cc index 7a962268b0..bce44299f8 100644 --- a/packager/media/formats/webm/webm_audio_client.cc +++ b/packager/media/formats/webm/webm_audio_client.cc @@ -36,7 +36,7 @@ scoped_refptr WebMAudioClient::GetAudioStreamInfo( int64_t codec_delay, const std::string& language, bool is_encrypted) { - AudioCodec audio_codec = kUnknownAudioCodec; + Codec audio_codec = kUnknownCodec; if (codec_id == "A_VORBIS") { audio_codec = kCodecVorbis; } else if (codec_id == "A_OPUS") { @@ -70,10 +70,10 @@ scoped_refptr WebMAudioClient::GetAudioStreamInfo( const uint8_t kSampleSizeInBits = 16u; return scoped_refptr(new AudioStreamInfo( track_num, kWebMTimeScale, 0, audio_codec, - AudioStreamInfo::GetCodecString(audio_codec, 0), language, - kSampleSizeInBits, channels_, sampling_frequency, + AudioStreamInfo::GetCodecString(audio_codec, 0), codec_config, + codec_config_size, kSampleSizeInBits, channels_, sampling_frequency, seek_preroll < 0 ? 0 : seek_preroll, codec_delay < 0 ? 0 : codec_delay, 0, - 0, codec_config, codec_config_size, is_encrypted)); + 0, language, is_encrypted)); } bool WebMAudioClient::OnUInt(int id, int64_t val) { diff --git a/packager/media/formats/webm/webm_cluster_parser.cc b/packager/media/formats/webm/webm_cluster_parser.cc index 2c78166a1a..c2268e378f 100644 --- a/packager/media/formats/webm/webm_cluster_parser.cc +++ b/packager/media/formats/webm/webm_cluster_parser.cc @@ -27,10 +27,7 @@ const int64_t kMicrosecondsPerMillisecond = 1000; // block is a keyframe. // |data| contains the bytes in the block. // |size| indicates the number of bytes in |data|. -bool IsKeyframe(bool is_video, - VideoCodec codec, - const uint8_t* data, - int size) { +bool IsKeyframe(bool is_video, Codec codec, const uint8_t* data, int size) { // For now, assume that all blocks are keyframes for datatypes other than // video. This is a valid assumption for Vorbis, WebVTT, & Opus. if (!is_video) @@ -370,7 +367,7 @@ bool WebMClusterParser::OnBlock(bool is_simple_block, ? (flags & 0x80) != 0 : IsKeyframe(stream_type == kStreamVideo, video_stream_info_ ? video_stream_info_->codec() - : kUnknownVideoCodec, + : kUnknownCodec, data, size); // Every encrypted Block has a signal byte and IV prepended to it. Current @@ -390,8 +387,7 @@ bool WebMClusterParser::OnBlock(bool is_simple_block, buffer = MediaSample::CopyFrom(data + data_offset, size - data_offset, additional, additional_size, is_keyframe); - // An empty iv indicates that this sample is not encrypted. - if (decrypt_config && !decrypt_config->iv().empty()) { + if (decrypt_config) { if (!decryptor_source_) { LOG(ERROR) << "Encrypted media sample encountered, but decryption is " "not enabled"; diff --git a/packager/media/formats/webm/webm_cluster_parser_unittest.cc b/packager/media/formats/webm/webm_cluster_parser_unittest.cc index e0b674e4ec..e1a2af2c1d 100644 --- a/packager/media/formats/webm/webm_cluster_parser_unittest.cc +++ b/packager/media/formats/webm/webm_cluster_parser_unittest.cc @@ -84,6 +84,7 @@ const uint8_t kNumChannels = 2u; const uint32_t kSamplingFrequency = 48000u; const uint64_t kSeekPreroll = 0u; const uint64_t kCodecDelay = 0u; +const uint8_t* kExtraData = nullptr; const size_t kExtraDataSize = 0u; const bool kEncrypted = true; const uint16_t kWidth = 320u; @@ -316,37 +317,16 @@ bool VerifyTextBuffers(const BlockInfo* block_info_ptr, class WebMClusterParserTest : public testing::Test { public: WebMClusterParserTest() - : audio_stream_info_(new AudioStreamInfo(kAudioTrackNum, - kTimeScale, - kDuration, - kUnknownAudioCodec, - kCodecString, - kLanguage, - kBitsPerSample, - kNumChannels, - kSamplingFrequency, - kSeekPreroll, - kCodecDelay, - 0, - 0, - NULL, - kExtraDataSize, - !kEncrypted)), - video_stream_info_(new VideoStreamInfo(kVideoTrackNum, - kTimeScale, - kDuration, - kCodecVP8, - kCodecString, - kLanguage, - kWidth, - kHeight, - kPixelWidth, - kPixelHeight, - kTrickPlayRate, - kNaluLengthSize, - NULL, - kExtraDataSize, - !kEncrypted)), + : audio_stream_info_(new AudioStreamInfo( + kAudioTrackNum, kTimeScale, kDuration, kUnknownCodec, kCodecString, + kExtraData, kExtraDataSize, kBitsPerSample, kNumChannels, + kSamplingFrequency, kSeekPreroll, kCodecDelay, 0, 0, kLanguage, + !kEncrypted)), + video_stream_info_(new VideoStreamInfo( + kVideoTrackNum, kTimeScale, kDuration, kCodecVP8, kCodecString, + kExtraData, kExtraDataSize, kWidth, kHeight, kPixelWidth, + kPixelHeight, kTrickPlayRate, kNaluLengthSize, kLanguage, + !kEncrypted)), parser_(CreateDefaultParser()) {} protected: @@ -390,15 +370,12 @@ class WebMClusterParserTest : public testing::Test { // Helper that hard-codes some non-varying constructor parameters. WebMClusterParser* CreateParserHelper( - int64_t audio_default_duration, - int64_t video_default_duration, + int64_t audio_default_duration, int64_t video_default_duration, const WebMTracksParser::TextTracks& text_tracks, const std::set& ignored_tracks, const std::string& audio_encryption_key_id, - const std::string& video_encryption_key_id, - const AudioCodec audio_codec, - const VideoCodec video_codec, - const MediaParser::InitCB& init_cb) { + const std::string& video_encryption_key_id, const Codec audio_codec, + const Codec video_codec, const MediaParser::InitCB& init_cb) { audio_stream_info_->set_codec(audio_codec); video_stream_info_->set_codec(video_codec); return new WebMClusterParser( @@ -414,8 +391,7 @@ class WebMClusterParserTest : public testing::Test { WebMClusterParser* CreateDefaultParser() { return CreateParserHelper(kNoTimestamp, kNoTimestamp, TextTracks(), std::set(), std::string(), std::string(), - kUnknownAudioCodec, kCodecVP8, - MediaParser::InitCB()); + kUnknownCodec, kCodecVP8, MediaParser::InitCB()); } // Create a parser for test with custom audio and video default durations, and @@ -426,23 +402,22 @@ class WebMClusterParserTest : public testing::Test { const WebMTracksParser::TextTracks& text_tracks = TextTracks()) { return CreateParserHelper(audio_default_duration, video_default_duration, text_tracks, std::set(), std::string(), - std::string(), kUnknownAudioCodec, kCodecVP8, + std::string(), kUnknownCodec, kCodecVP8, MediaParser::InitCB()); } // Create a parser for test with custom ignored tracks. WebMClusterParser* CreateParserWithIgnoredTracks( std::set& ignored_tracks) { - return CreateParserHelper( - kNoTimestamp, kNoTimestamp, TextTracks(), ignored_tracks, std::string(), - std::string(), kUnknownAudioCodec, kCodecVP8, MediaParser::InitCB()); + return CreateParserHelper(kNoTimestamp, kNoTimestamp, TextTracks(), + ignored_tracks, std::string(), std::string(), + kUnknownCodec, kCodecVP8, MediaParser::InitCB()); } // Create a parser for test with custom encryption key ids and audio codec. - WebMClusterParser* CreateParserWithKeyIdsAndAudioCodec( + WebMClusterParser* CreateParserWithKeyIdsAndCodec( const std::string& audio_encryption_key_id, - const std::string& video_encryption_key_id, - const AudioCodec audio_codec) { + const std::string& video_encryption_key_id, const Codec audio_codec) { return CreateParserHelper(kNoTimestamp, kNoTimestamp, TextTracks(), std::set(), audio_encryption_key_id, video_encryption_key_id, audio_codec, kCodecVP8, @@ -451,10 +426,10 @@ class WebMClusterParserTest : public testing::Test { // Create a parser for test with custom video codec, also check for init // events. - WebMClusterParser* CreateParserWithVideoCodec(const VideoCodec video_codec) { + WebMClusterParser* CreateParserWithCodec(const Codec video_codec) { return CreateParserHelper( kNoTimestamp, kNoTimestamp, TextTracks(), std::set(), - std::string(), std::string(), kUnknownAudioCodec, video_codec, + std::string(), std::string(), kUnknownCodec, video_codec, base::Bind(&WebMClusterParserTest::InitEvent, base::Unretained(this))); } @@ -807,7 +782,7 @@ TEST_F(WebMClusterParserTest, ParseMultipleTextTracks) { TEST_F(WebMClusterParserTest, ParseVP8) { scoped_ptr cluster(CreateCluster(kVP8Frame, arraysize(kVP8Frame))); - parser_.reset(CreateParserWithVideoCodec(kCodecVP8)); + parser_.reset(CreateParserWithCodec(kCodecVP8)); EXPECT_EQ(cluster->size(), parser_->Parse(cluster->data(), cluster->size())); @@ -820,7 +795,7 @@ TEST_F(WebMClusterParserTest, ParseVP8) { TEST_F(WebMClusterParserTest, ParseVP9) { scoped_ptr cluster(CreateCluster(kVP9Frame, arraysize(kVP9Frame))); - parser_.reset(CreateParserWithVideoCodec(kCodecVP9)); + parser_.reset(CreateParserWithCodec(kCodecVP9)); EXPECT_EQ(cluster->size(), parser_->Parse(cluster->data(), cluster->size())); @@ -844,8 +819,8 @@ TEST_F(WebMClusterParserTest, ParseEncryptedBlock) { scoped_ptr cluster( CreateCluster(kEncryptedFrame, arraysize(kEncryptedFrame))); - parser_.reset(CreateParserWithKeyIdsAndAudioCodec(std::string(), video_key_id, - kUnknownAudioCodec)); + parser_.reset(CreateParserWithKeyIdsAndCodec(std::string(), video_key_id, + kUnknownCodec)); int result = parser_->Parse(cluster->data(), cluster->size()); EXPECT_EQ(cluster->size(), result); @@ -865,8 +840,8 @@ TEST_F(WebMClusterParserTest, ParseEncryptedBlockGetKeyFailed) { scoped_ptr cluster( CreateCluster(kEncryptedFrame, arraysize(kEncryptedFrame))); - parser_.reset(CreateParserWithKeyIdsAndAudioCodec( - std::string(), "video_key_id", kUnknownAudioCodec)); + parser_.reset(CreateParserWithKeyIdsAndCodec(std::string(), "video_key_id", + kUnknownCodec)); int result = parser_->Parse(cluster->data(), cluster->size()); EXPECT_EQ(-1, result); @@ -876,8 +851,8 @@ TEST_F(WebMClusterParserTest, ParseBadEncryptedBlock) { scoped_ptr cluster( CreateCluster(kEncryptedFrame, arraysize(kEncryptedFrame) - 2)); - parser_.reset(CreateParserWithKeyIdsAndAudioCodec( - std::string(), "video_key_id", kUnknownAudioCodec)); + parser_.reset(CreateParserWithKeyIdsAndCodec(std::string(), "video_key_id", + kUnknownCodec)); int result = parser_->Parse(cluster->data(), cluster->size()); EXPECT_EQ(-1, result); } @@ -886,8 +861,8 @@ TEST_F(WebMClusterParserTest, ParseClearFrameInEncryptedTrack) { scoped_ptr cluster(CreateCluster( kClearFrameInEncryptedTrack, arraysize(kClearFrameInEncryptedTrack))); - parser_.reset(CreateParserWithKeyIdsAndAudioCodec( - std::string(), "video_key_id", kUnknownAudioCodec)); + parser_.reset(CreateParserWithKeyIdsAndCodec(std::string(), "video_key_id", + kUnknownCodec)); int result = parser_->Parse(cluster->data(), cluster->size()); EXPECT_EQ(cluster->size(), result); diff --git a/packager/media/formats/webm/webm_constants.h b/packager/media/formats/webm/webm_constants.h index 86a3af1cbd..214aeb00f5 100644 --- a/packager/media/formats/webm/webm_constants.h +++ b/packager/media/formats/webm/webm_constants.h @@ -5,6 +5,7 @@ #ifndef MEDIA_FORMATS_WEBM_WEBM_CONSTANTS_H_ #define MEDIA_FORMATS_WEBM_WEBM_CONSTANTS_H_ +#include #include namespace shaka { @@ -207,9 +208,13 @@ const uint8_t kWebMFlagKeyframe = 0x80; /// Current encrypted WebM request for comments specification is here /// http://wiki.webmproject.org/encryption/webm-encryption-rfc -const uint8_t kWebMFlagEncryptedFrame = 0x1; -const int kWebMIvSize = 8; -const int kWebMSignalByteSize = 1; +const size_t kWebMIvSize = 8; +const size_t kWebMSignalByteSize = 1; +const uint8_t kWebMEncryptedSignal = 0x01; +const uint8_t kWebMPartitionedSignal = 0x02; +const size_t kWebMNumPartitionsSize = 1; +const size_t kWebMPartitionOffsetSize = sizeof(uint32_t); +const uint8_t kWebMMaxSubsamples = 127; /// Current specification for WebVTT embedded in WebM /// http://wiki.webmproject.org/webm-metadata/temporal-metadata/webvtt-in-webm diff --git a/packager/media/formats/webm/webm_crypto_helpers.cc b/packager/media/formats/webm/webm_crypto_helpers.cc index 6c977baaa6..f858bc415f 100644 --- a/packager/media/formats/webm/webm_crypto_helpers.cc +++ b/packager/media/formats/webm/webm_crypto_helpers.cc @@ -6,6 +6,7 @@ #include "packager/base/logging.h" #include "packager/base/sys_byteorder.h" +#include "packager/media/base/buffer_reader.h" #include "packager/media/formats/webm/webm_constants.h" namespace shaka { @@ -16,48 +17,96 @@ namespace { // CTR IV appended with a CTR block counter. |iv| is an 8 byte CTR IV. // |iv_size| is the size of |iv| in btyes. Returns a string of // kDecryptionKeySize bytes. -std::string GenerateWebMCounterBlock(const uint8_t* iv, int iv_size) { - std::string counter_block(reinterpret_cast(iv), iv_size); - counter_block.append(DecryptConfig::kDecryptionKeySize - iv_size, 0); +std::vector GenerateWebMCounterBlock(const uint8_t* iv, int iv_size) { + std::vector counter_block(iv, iv + iv_size); + counter_block.insert(counter_block.end(), + DecryptConfig::kDecryptionKeySize - iv_size, 0); return counter_block; } } // namespace anonymous +// TODO(tinskip): Add unit test for this function. bool WebMCreateDecryptConfig(const uint8_t* data, int data_size, const uint8_t* key_id, int key_id_size, scoped_ptr* decrypt_config, int* data_offset) { - if (data_size < kWebMSignalByteSize) { - DVLOG(1) << "Got a block from an encrypted stream with no data."; + int header_size = kWebMSignalByteSize; + if (data_size < header_size) { + DVLOG(1) << "Empty WebM sample."; return false; } - uint8_t signal_byte = data[0]; - int frame_offset = sizeof(signal_byte); - // Setting the DecryptConfig object of the buffer while leaving the - // initialization vector empty will tell the decryptor that the frame is - // unencrypted. - std::string counter_block; - - if (signal_byte & kWebMFlagEncryptedFrame) { - if (data_size < kWebMSignalByteSize + kWebMIvSize) { - DVLOG(1) << "Got an encrypted block with not enough data " << data_size; + if (signal_byte & kWebMEncryptedSignal) { + // Encrypted sample. + header_size += kWebMIvSize; + if (data_size < header_size) { + DVLOG(1) << "Encrypted WebM sample too small to hold IV: " << data_size; return false; } - counter_block = GenerateWebMCounterBlock(data + frame_offset, kWebMIvSize); - frame_offset += kWebMIvSize; + std::vector subsamples; + if (signal_byte & kWebMPartitionedSignal) { + // Encrypted sample with subsamples / partitioning. + header_size += kWebMNumPartitionsSize; + if (data_size < header_size) { + DVLOG(1) + << "Encrypted WebM sample too small to hold number of partitions: " + << data_size; + return false; + } + uint8_t num_partitions = data[kWebMSignalByteSize + kWebMIvSize]; + BufferReader offsets_buffer(data + header_size, data_size - header_size); + header_size += num_partitions * kWebMPartitionOffsetSize; + uint32_t subsample_offset = 0; + bool encrypted_subsample = false; + uint16_t clear_size = 0; + uint32_t encrypted_size = 0; + for (uint8_t partition_idx = 0; partition_idx < num_partitions; + ++partition_idx) { + uint32_t partition_offset; + if (!offsets_buffer.Read4(&partition_offset)) { + DVLOG(1) + << "Encrypted WebM sample too small to hold partition offsets: " + << data_size; + return false; + } + if (partition_offset < subsample_offset) { + DVLOG(1) << "Partition offsets out of order."; + return false; + } + if (encrypted_subsample) { + encrypted_size = partition_offset - subsample_offset; + subsamples.push_back(SubsampleEntry(clear_size, encrypted_size)); + } else { + clear_size = partition_offset - subsample_offset; + if (partition_idx == (num_partitions - 1)) { + encrypted_size = data_size - header_size - subsample_offset - clear_size; + subsamples.push_back(SubsampleEntry(clear_size, encrypted_size)); + } + } + subsample_offset = partition_offset; + encrypted_subsample = !encrypted_subsample; + } + if (!(num_partitions % 2)) { + // Even number of partitions. Add one last all-clear subsample. + clear_size = data_size - header_size - subsample_offset; + encrypted_size = 0; + subsamples.push_back(SubsampleEntry(clear_size, encrypted_size)); + } + } + decrypt_config->reset(new DecryptConfig( + std::vector(key_id, key_id + key_id_size), + GenerateWebMCounterBlock(data + kWebMSignalByteSize, kWebMIvSize), + subsamples)); + } else { + // Clear sample. + decrypt_config->reset(); } - decrypt_config->reset(new DecryptConfig( - std::vector(key_id, key_id + key_id_size), - std::vector(counter_block.begin(), counter_block.end()), - std::vector())); - *data_offset = frame_offset; - + *data_offset = header_size; return true; } diff --git a/packager/media/formats/webm/webm_video_client.cc b/packager/media/formats/webm/webm_video_client.cc index e77d9c4286..8a22ce5b9e 100644 --- a/packager/media/formats/webm/webm_video_client.cc +++ b/packager/media/formats/webm/webm_video_client.cc @@ -53,7 +53,7 @@ scoped_refptr WebMVideoClient::GetVideoStreamInfo( const std::string& codec_id, const std::vector& codec_private, bool is_encrypted) { - VideoCodec video_codec = kUnknownVideoCodec; + Codec video_codec = kUnknownCodec; if (codec_id == "V_VP8") { video_codec = kCodecVP8; } else if (codec_id == "V_VP9") { @@ -110,9 +110,9 @@ scoped_refptr WebMVideoClient::GetVideoStreamInfo( sar_y /= gcd; return scoped_refptr(new VideoStreamInfo( - track_num, kWebMTimeScale, 0, video_codec, std::string(), std::string(), - width_after_crop, height_after_crop, sar_x, sar_y, 0, 0, - codec_private.data(), codec_private.size(), is_encrypted)); + track_num, kWebMTimeScale, 0, video_codec, std::string(), + codec_private.data(), codec_private.size(), width_after_crop, + height_after_crop, sar_x, sar_y, 0, 0, std::string(), is_encrypted)); } bool WebMVideoClient::OnUInt(int id, int64_t val) { diff --git a/packager/media/formats/webvtt/webvtt_media_parser.cc b/packager/media/formats/webvtt/webvtt_media_parser.cc index e7bb364933..dad0688177 100644 --- a/packager/media/formats/webvtt/webvtt_media_parser.cc +++ b/packager/media/formats/webvtt/webvtt_media_parser.cc @@ -294,15 +294,12 @@ bool WebVttMediaParser::Parse(const uint8_t* buf, int size) { // There is no one metadata to determine what the language is. Parts // of the text may be annotated as some specific language. const char kLanguage[] = ""; - streams.push_back(new TextStreamInfo( - kTrackId, - kTimescale, - kDuration, - "wvtt", - kLanguage, - base::JoinString(header_, "\n"), - 0, // Not necessary. - 0)); // Not necessary. + streams.push_back(new TextStreamInfo(kTrackId, kTimescale, kDuration, + "wvtt", + base::JoinString(header_, "\n"), + 0, // Not necessary. + 0, + kLanguage)); // Not necessary. init_cb_.Run(streams); state_ = kCueIdentifierOrTimingOrComment; diff --git a/packager/media/formats/wvm/wvm_media_parser.cc b/packager/media/formats/wvm/wvm_media_parser.cc index a543e3ff43..4f23ad4765 100644 --- a/packager/media/formats/wvm/wvm_media_parser.cc +++ b/packager/media/formats/wvm/wvm_media_parser.cc @@ -739,31 +739,33 @@ bool WvmMediaParser::ParseIndexEntry() { index_size = read_ptr - index_data_.data(); if (has_video) { - VideoCodec video_codec = kCodecH264; + Codec video_codec = kCodecH264; stream_infos_.push_back(new VideoStreamInfo( stream_id_count_, time_scale, track_duration, video_codec, - std::string(), std::string(), video_width, video_height, pixel_width, - pixel_height, trick_play_rate, nalu_length_size, - video_codec_config.data(), video_codec_config.size(), true)); + std::string(), video_codec_config.data(), video_codec_config.size(), + video_width, video_height, pixel_width, pixel_height, trick_play_rate, + nalu_length_size, std::string(), true)); program_demux_stream_map_[base::UintToString(index_program_id_) + ":" + - base::UintToString(video_pes_stream_id ? - video_pes_stream_id : - kDefaultVideoStreamId)] = + base::UintToString( + video_pes_stream_id + ? video_pes_stream_id + : kDefaultVideoStreamId)] = stream_id_count_++; } if (has_audio) { - const AudioCodec audio_codec = kCodecAAC; + const Codec audio_codec = kCodecAAC; // TODO(beil): Pass in max and average bitrate in wvm container. stream_infos_.push_back(new AudioStreamInfo( stream_id_count_, time_scale, track_duration, audio_codec, - std::string(), std::string(), kAacSampleSizeBits, num_channels, - sampling_frequency, 0 /* seek preroll */, 0 /* codec delay */, - 0 /* max bitrate */, 0 /* avg bitrate */, audio_codec_config.data(), - audio_codec_config.size(), true)); + std::string(), audio_codec_config.data(), audio_codec_config.size(), + kAacSampleSizeBits, num_channels, sampling_frequency, + 0 /* seek preroll */, 0 /* codec delay */, 0 /* max bitrate */, + 0 /* avg bitrate */, std::string(), true)); program_demux_stream_map_[base::UintToString(index_program_id_) + ":" + - base::UintToString(audio_pes_stream_id ? - audio_pes_stream_id : - kDefaultAudioStreamId)] = + base::UintToString( + audio_pes_stream_id + ? audio_pes_stream_id + : kDefaultAudioStreamId)] = stream_id_count_++; } } diff --git a/packager/media/test/data/bear-640x360-vp9-altref.webm b/packager/media/test/data/bear-640x360-vp9-altref.webm new file mode 100644 index 0000000000000000000000000000000000000000..4c2efd7ead648d17154ab8a2de3d330b99f27703 GIT binary patch literal 80522 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

SPQKZka^ZhhZbYb4M`%ZO5u;n7`J) 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 HAMpPJk-pD` literal 0 HcmV?d00001