diff options
Diffstat (limited to 'chromium/media/base')
210 files changed, 2732 insertions, 1847 deletions
diff --git a/chromium/media/base/BUILD.gn b/chromium/media/base/BUILD.gn index d9a305666ee..49851ba6197 100644 --- a/chromium/media/base/BUILD.gn +++ b/chromium/media/base/BUILD.gn @@ -295,6 +295,8 @@ source_set("base") { "supported_types.h", "supported_video_decoder_config.cc", "supported_video_decoder_config.h", + "svc_scalability_mode.cc", + "svc_scalability_mode.h", "text_cue.cc", "text_cue.h", "text_ranges.cc", @@ -360,6 +362,7 @@ source_set("base") { ":video_facing", "//media:media_buildflags", "//media:shared_memory_support", + "//media/gpu:buildflags", "//ui/gfx:color_space", "//ui/gl", ] @@ -539,6 +542,7 @@ static_library("test_support") { deps = [ "//base", "//base/test:test_support", + "//build:chromeos_buildflags", "//testing/gmock", "//ui/gfx:test_support", "//url", diff --git a/chromium/media/base/android/android_cdm_factory.h b/chromium/media/base/android/android_cdm_factory.h index 3ff0ae5e2c8..862ab3662b5 100644 --- a/chromium/media/base/android/android_cdm_factory.h +++ b/chromium/media/base/android/android_cdm_factory.h @@ -25,6 +25,10 @@ class MEDIA_EXPORT AndroidCdmFactory final : public CdmFactory { public: AndroidCdmFactory(CreateFetcherCB create_fetcher_cb, CreateStorageCB create_storage_cb); + + AndroidCdmFactory(const AndroidCdmFactory&) = delete; + AndroidCdmFactory& operator=(const AndroidCdmFactory&) = delete; + ~AndroidCdmFactory() override; // CdmFactory implementation. @@ -53,8 +57,6 @@ class MEDIA_EXPORT AndroidCdmFactory final : public CdmFactory { base::flat_map<uint32_t, PendingCreation> pending_creations_; base::WeakPtrFactory<AndroidCdmFactory> weak_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(AndroidCdmFactory); }; } // namespace media diff --git a/chromium/media/base/android/android_overlay.h b/chromium/media/base/android/android_overlay.h index 3f8998e651c..03d4215548f 100644 --- a/chromium/media/base/android/android_overlay.h +++ b/chromium/media/base/android/android_overlay.h @@ -40,6 +40,9 @@ namespace media { // AndroidOverlay isn't technically supposed to do that. class MEDIA_EXPORT AndroidOverlay { public: + AndroidOverlay(const AndroidOverlay&) = delete; + AndroidOverlay& operator=(const AndroidOverlay&) = delete; + virtual ~AndroidOverlay(); // Schedules a relayout of this overlay. If called before the client is @@ -73,8 +76,6 @@ class MEDIA_EXPORT AndroidOverlay { std::list<AndroidOverlayConfig::DeletedCB> deletion_cbs_; base::WeakPtrFactory<AndroidOverlay> weak_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(AndroidOverlay); }; } // namespace media diff --git a/chromium/media/base/android/jni_hdr_metadata.h b/chromium/media/base/android/jni_hdr_metadata.h index eb2bf5ffa92..8b94fdd6bc8 100644 --- a/chromium/media/base/android/jni_hdr_metadata.h +++ b/chromium/media/base/android/jni_hdr_metadata.h @@ -17,6 +17,10 @@ class JniHdrMetadata { public: JniHdrMetadata(const VideoColorSpace& color_space, const gfx::HDRMetadata& hdr_metadata); + + JniHdrMetadata(const JniHdrMetadata&) = delete; + JniHdrMetadata& operator=(const JniHdrMetadata&) = delete; + ~JniHdrMetadata(); base::android::ScopedJavaLocalRef<jobject> obj() { return jobject_; } @@ -62,8 +66,6 @@ class JniHdrMetadata { const VideoColorSpace& color_space_; const gfx::HDRMetadata& hdr_metadata_; base::android::ScopedJavaLocalRef<jobject> jobject_; - - DISALLOW_COPY_AND_ASSIGN(JniHdrMetadata); }; } // namespace media diff --git a/chromium/media/base/android/media_codec_bridge.h b/chromium/media/base/android/media_codec_bridge.h index c4306a194cb..3d99eebe486 100644 --- a/chromium/media/base/android/media_codec_bridge.h +++ b/chromium/media/base/android/media_codec_bridge.h @@ -47,6 +47,10 @@ enum MediaCodecStatus { class MEDIA_EXPORT MediaCodecBridge { public: MediaCodecBridge() = default; + + MediaCodecBridge(const MediaCodecBridge&) = delete; + MediaCodecBridge& operator=(const MediaCodecBridge&) = delete; + virtual ~MediaCodecBridge() = default; // Calls MediaCodec#stop(). However, due to buggy implementations (b/8125974) @@ -164,8 +168,6 @@ class MEDIA_EXPORT MediaCodecBridge { // Returns the max input size we configured the codec with. virtual size_t GetMaxInputSize() = 0; - - DISALLOW_COPY_AND_ASSIGN(MediaCodecBridge); }; } // namespace media diff --git a/chromium/media/base/android/media_codec_bridge_impl.cc b/chromium/media/base/android/media_codec_bridge_impl.cc index 54d9ede545e..6e65daad8cb 100644 --- a/chromium/media/base/android/media_codec_bridge_impl.cc +++ b/chromium/media/base/android/media_codec_bridge_impl.cc @@ -73,11 +73,11 @@ bool GetCodecSpecificDataForAudio(const AudioDecoderConfig& config, const size_t extra_data_size = config.extra_data().size(); *output_frame_has_adts_header = false; - if (extra_data_size == 0 && config.codec() != kCodecOpus) + if (extra_data_size == 0 && config.codec() != AudioCodec::kOpus) return true; switch (config.codec()) { - case kCodecVorbis: { + case AudioCodec::kVorbis: { if (extra_data[0] != 2) { LOG(ERROR) << "Invalid number of vorbis headers before the codec " << "header: " << extra_data[0]; @@ -118,7 +118,7 @@ bool GetCodecSpecificDataForAudio(const AudioDecoderConfig& config, extra_data + extra_data_size); break; } - case kCodecFLAC: { + case AudioCodec::kFLAC: { // According to MediaCodec spec, CSB buffer #0 for FLAC should be: // "fLaC", the FLAC stream marker in ASCII, followed by the STREAMINFO // block (the mandatory metadata block), optionally followed by any number @@ -131,13 +131,13 @@ bool GetCodecSpecificDataForAudio(const AudioDecoderConfig& config, extra_data + extra_data_size); break; } - case kCodecAAC: { + case AudioCodec::kAAC: { output_csd0->assign(extra_data, extra_data + extra_data_size); *output_frame_has_adts_header = config.profile() != AudioCodecProfile::kXHE_AAC; break; } - case kCodecOpus: { + case AudioCodec::kOpus: { if (!extra_data || extra_data_size == 0 || codec_delay_ns < 0 || seek_preroll_ns < 0) { LOG(ERROR) << "Invalid Opus Header"; @@ -493,7 +493,7 @@ MediaCodecStatus MediaCodecBridgeImpl::DequeueOutputBuffer( *size = base::checked_cast<size_t>( Java_DequeueOutputResult_numBytes(env, result)); if (presentation_time) { - *presentation_time = base::TimeDelta::FromMicroseconds( + *presentation_time = base::Microseconds( Java_DequeueOutputResult_presentationTimeMicroseconds(env, result)); } int flags = Java_DequeueOutputResult_flags(env, result); diff --git a/chromium/media/base/android/media_codec_bridge_impl.h b/chromium/media/base/android/media_codec_bridge_impl.h index 5b306bae53d..41ebb412677 100644 --- a/chromium/media/base/android/media_codec_bridge_impl.h +++ b/chromium/media/base/android/media_codec_bridge_impl.h @@ -30,9 +30,13 @@ class VideoColorSpace; class MEDIA_EXPORT VideoCodecConfig { public: VideoCodecConfig(); + + VideoCodecConfig(const VideoCodecConfig&) = delete; + VideoCodecConfig& operator=(const VideoCodecConfig&) = delete; + ~VideoCodecConfig(); - VideoCodec codec = kUnknownVideoCodec; + VideoCodec codec = VideoCodec::kUnknown; CodecType codec_type = CodecType::kAny; @@ -62,9 +66,6 @@ class MEDIA_EXPORT VideoCodecConfig { // // May only be used on API level 23 and higher. base::RepeatingClosure on_buffers_available_cb; - - private: - DISALLOW_COPY_AND_ASSIGN(VideoCodecConfig); }; // A bridge to a Java MediaCodec. @@ -78,7 +79,7 @@ class MEDIA_EXPORT MediaCodecBridgeImpl : public MediaCodecBridge { // Creates and starts a new MediaCodec configured for encoding. Returns // nullptr on failure. static std::unique_ptr<MediaCodecBridge> CreateVideoEncoder( - VideoCodec codec, // e.g. media::kCodecVP8 + VideoCodec codec, // e.g. media::VideoCodec::kVP8 const gfx::Size& size, // input frame size int bit_rate, // bits/second int frame_rate, // frames/second @@ -102,6 +103,9 @@ class MEDIA_EXPORT MediaCodecBridgeImpl : public MediaCodecBridge { // creating a MediaCodec. Does nothing unless on API level 23+. static void SetupCallbackHandlerForTesting(); + MediaCodecBridgeImpl(const MediaCodecBridgeImpl&) = delete; + MediaCodecBridgeImpl& operator=(const MediaCodecBridgeImpl&) = delete; + ~MediaCodecBridgeImpl() override; // MediaCodecBridge implementation. @@ -181,8 +185,6 @@ class MEDIA_EXPORT MediaCodecBridgeImpl : public MediaCodecBridge { // The Java MediaCodecBridge instance. base::android::ScopedJavaGlobalRef<jobject> j_bridge_; - - DISALLOW_COPY_AND_ASSIGN(MediaCodecBridgeImpl); }; } // namespace media diff --git a/chromium/media/base/android/media_codec_bridge_impl_unittest.cc b/chromium/media/base/android/media_codec_bridge_impl_unittest.cc index 60328e5c82b..47ad1c212ca 100644 --- a/chromium/media/base/android/media_codec_bridge_impl_unittest.cc +++ b/chromium/media/base/android/media_codec_bridge_impl_unittest.cc @@ -131,7 +131,7 @@ static const int kPresentationTimeBase = 100; static const int kMaxInputPts = kPresentationTimeBase + 2; static inline const base::TimeDelta InfiniteTimeOut() { - return base::TimeDelta::FromMicroseconds(-1); + return base::Microseconds(-1); } void DecodeMediaFrame(MediaCodecBridge* media_codec, @@ -164,7 +164,7 @@ void DecodeMediaFrame(MediaCodecBridge* media_codec, } // Output time stamp should not be smaller than old timestamp. ASSERT_TRUE(new_timestamp >= timestamp); - input_pts += base::TimeDelta::FromMicroseconds(33000); + input_pts += base::Microseconds(33000); timestamp = new_timestamp; } } @@ -290,7 +290,7 @@ TEST(MediaCodecBridgeTest, CreateH264Decoder) { SKIP_TEST_IF_MEDIA_CODEC_IS_NOT_AVAILABLE(); VideoCodecConfig config; - config.codec = kCodecH264; + config.codec = VideoCodec::kH264; config.codec_type = CodecType::kAny; config.initial_expected_coded_size = gfx::Size(640, 480); @@ -301,7 +301,7 @@ TEST(MediaCodecBridgeTest, DoNormal) { SKIP_TEST_IF_MEDIA_CODEC_IS_NOT_AVAILABLE(); std::unique_ptr<media::MediaCodecBridge> media_codec = - MediaCodecBridgeImpl::CreateAudioDecoder(NewAudioConfig(kCodecMP3), + MediaCodecBridgeImpl::CreateAudioDecoder(NewAudioConfig(AudioCodec::kMP3), nullptr); ASSERT_THAT(media_codec, NotNull()); @@ -313,11 +313,11 @@ TEST(MediaCodecBridgeTest, DoNormal) { int64_t input_pts = kPresentationTimeBase; media_codec->QueueInputBuffer(input_buf_index, test_mp3, sizeof(test_mp3), - base::TimeDelta::FromMicroseconds(++input_pts)); + base::Microseconds(++input_pts)); status = media_codec->DequeueInputBuffer(InfiniteTimeOut(), &input_buf_index); media_codec->QueueInputBuffer(input_buf_index, test_mp3, sizeof(test_mp3), - base::TimeDelta::FromMicroseconds(++input_pts)); + base::Microseconds(++input_pts)); status = media_codec->DequeueInputBuffer(InfiniteTimeOut(), &input_buf_index); media_codec->QueueEOS(input_buf_index); @@ -336,7 +336,6 @@ TEST(MediaCodecBridgeTest, DoNormal) { switch (status) { case MEDIA_CODEC_TRY_AGAIN_LATER: FAIL(); - return; case MEDIA_CODEC_OUTPUT_FORMAT_CHANGED: continue; @@ -360,9 +359,10 @@ TEST(MediaCodecBridgeTest, InvalidVorbisHeader) { // The first byte of the header is not 0x02. std::vector<uint8_t> invalid_first_byte = {{0x00, 0xff, 0xff, 0xff, 0xff}}; - ASSERT_THAT(MediaCodecBridgeImpl::CreateAudioDecoder( - NewAudioConfig(kCodecVorbis, invalid_first_byte), nullptr), - IsNull()); + ASSERT_THAT( + MediaCodecBridgeImpl::CreateAudioDecoder( + NewAudioConfig(AudioCodec::kVorbis, invalid_first_byte), nullptr), + IsNull()); // Size of the header is too large. size_t large_size = 8 * 1024 * 1024 + 2; @@ -370,7 +370,7 @@ TEST(MediaCodecBridgeTest, InvalidVorbisHeader) { large_header.front() = 0x02; large_header.back() = 0xfe; ASSERT_THAT(MediaCodecBridgeImpl::CreateAudioDecoder( - NewAudioConfig(kCodecVorbis, large_header), nullptr), + NewAudioConfig(AudioCodec::kVorbis, large_header), nullptr), IsNull()); } @@ -380,16 +380,16 @@ TEST(MediaCodecBridgeTest, InvalidOpusHeader) { std::vector<uint8_t> dummy_extra_data = {{0, 0}}; // Codec Delay is < 0. - ASSERT_THAT( - MediaCodecBridgeImpl::CreateAudioDecoder( - NewAudioConfig(kCodecOpus, dummy_extra_data, base::TimeDelta(), -1), - nullptr), - IsNull()); + ASSERT_THAT(MediaCodecBridgeImpl::CreateAudioDecoder( + NewAudioConfig(AudioCodec::kOpus, dummy_extra_data, + base::TimeDelta(), -1), + nullptr), + IsNull()); // Seek Preroll is < 0. ASSERT_THAT(MediaCodecBridgeImpl::CreateAudioDecoder( - NewAudioConfig(kCodecOpus, dummy_extra_data, - base::TimeDelta::FromMicroseconds(-1)), + NewAudioConfig(AudioCodec::kOpus, dummy_extra_data, + base::Microseconds(-1)), nullptr), IsNull()); } @@ -401,7 +401,7 @@ TEST(MediaCodecBridgeTest, PresentationTimestampsDoNotDecrease) { } VideoCodecConfig config; - config.codec = kCodecVP8; + config.codec = VideoCodec::kVP8; config.codec_type = CodecType::kAny; config.initial_expected_coded_size = gfx::Size(320, 240); @@ -418,23 +418,21 @@ TEST(MediaCodecBridgeTest, PresentationTimestampsDoNotDecrease) { buffer->data() + buffer->data_size()); media_codec->Flush(); DecodeMediaFrame(media_codec.get(), &chunk[0], chunk.size(), - base::TimeDelta::FromMicroseconds(10000000), - base::TimeDelta::FromMicroseconds(9900000)); + base::Microseconds(10000000), base::Microseconds(9900000)); // Simulate a seek to 5 seconds. media_codec->Flush(); DecodeMediaFrame(media_codec.get(), &chunk[0], chunk.size(), - base::TimeDelta::FromMicroseconds(5000000), - base::TimeDelta::FromMicroseconds(4900000)); + base::Microseconds(5000000), base::Microseconds(4900000)); } TEST(MediaCodecBridgeTest, CreateUnsupportedCodec) { EXPECT_THAT(MediaCodecBridgeImpl::CreateAudioDecoder( - NewAudioConfig(kUnknownAudioCodec), nullptr), + NewAudioConfig(AudioCodec::kUnknown), nullptr), IsNull()); VideoCodecConfig config; - config.codec = kUnknownVideoCodec; + config.codec = VideoCodec::kUnknown; config.codec_type = CodecType::kAny; config.initial_expected_coded_size = gfx::Size(320, 240); EXPECT_THAT(MediaCodecBridgeImpl::CreateVideoDecoder(config), IsNull()); @@ -465,7 +463,7 @@ TEST(MediaCodecBridgeTest, H264VideoEncodeAndValidate) { std::unique_ptr<MediaCodecBridge> media_codec( MediaCodecBridgeImpl::CreateVideoEncoder( - kCodecH264, gfx::Size(width, height), bit_rate, frame_rate, + VideoCodec::kH264, gfx::Size(width, height), bit_rate, frame_rate, i_frame_interval, color_format)); ASSERT_THAT(media_codec, NotNull()); @@ -493,8 +491,8 @@ TEST(MediaCodecBridgeTest, H264VideoEncodeAndValidate) { // Src_file contains 1 frames. Encode it 3 times. for (int frame = 0; frame < num_frames && frame < 3; frame++) { - input_timestamp += base::TimeDelta::FromMicroseconds( - base::Time::kMicrosecondsPerSecond / frame_rate); + input_timestamp += + base::Microseconds(base::Time::kMicrosecondsPerSecond / frame_rate); EncodeMediaFrame(media_codec.get(), frame_data.get(), frame_size, width, height, input_timestamp); } @@ -503,8 +501,8 @@ TEST(MediaCodecBridgeTest, H264VideoEncodeAndValidate) { // also contain SPS/PPS NALUs. media_codec->RequestKeyFrameSoon(); for (int frame = 0; frame < num_frames && frame < 3; frame++) { - input_timestamp += base::TimeDelta::FromMicroseconds( - base::Time::kMicrosecondsPerSecond / frame_rate); + input_timestamp += + base::Microseconds(base::Time::kMicrosecondsPerSecond / frame_rate); EncodeMediaFrame(media_codec.get(), frame_data.get(), frame_size, width, height, input_timestamp); } diff --git a/chromium/media/base/android/media_codec_loop.cc b/chromium/media/base/android/media_codec_loop.cc index 57227366eff..7e09e387173 100644 --- a/chromium/media/base/android/media_codec_loop.cc +++ b/chromium/media/base/android/media_codec_loop.cc @@ -15,10 +15,9 @@ namespace media { namespace { -constexpr base::TimeDelta kDecodePollDelay = - base::TimeDelta::FromMilliseconds(10); -constexpr base::TimeDelta kNoWaitTimeout = base::TimeDelta::FromMicroseconds(0); -constexpr base::TimeDelta kIdleTimerTimeout = base::TimeDelta::FromSeconds(1); +constexpr base::TimeDelta kDecodePollDelay = base::Milliseconds(10); +constexpr base::TimeDelta kNoWaitTimeout = base::Microseconds(0); +constexpr base::TimeDelta kIdleTimerTimeout = base::Seconds(1); } // namespace diff --git a/chromium/media/base/android/media_codec_loop_unittest.cc b/chromium/media/base/android/media_codec_loop_unittest.cc index f3ac9638026..c7df7a22f6d 100644 --- a/chromium/media/base/android/media_codec_loop_unittest.cc +++ b/chromium/media/base/android/media_codec_loop_unittest.cc @@ -50,6 +50,9 @@ class MediaCodecLoopTest : public testing::Test { : task_runner_handle_(mock_task_runner_), client_(std::make_unique<MockMediaCodecLoopClient>()) {} + MediaCodecLoopTest(const MediaCodecLoopTest&) = delete; + MediaCodecLoopTest& operator=(const MediaCodecLoopTest&) = delete; + ~MediaCodecLoopTest() override {} protected: @@ -85,7 +88,7 @@ class MediaCodecLoopTest : public testing::Test { // TODO(liberato): assume that MCL doesn't retry for 30 seconds. Note // that this doesn't actually wall-clock wait. - mock_task_runner_->FastForwardBy(base::TimeDelta::FromSeconds(30)); + mock_task_runner_->FastForwardBy(base::Seconds(30)); } void ConstructCodecLoop(int sdk_int = base::android::SDK_VERSION_LOLLIPOP) { @@ -139,7 +142,7 @@ class MediaCodecLoopTest : public testing::Test { MediaCodecLoop::InputData data; data.memory = reinterpret_cast<const uint8_t*>("big buck bunny"); data.length = 14; - data.presentation_time = base::TimeDelta::FromSeconds(1); + data.presentation_time = base::Seconds(1); return data; } @@ -147,7 +150,7 @@ class MediaCodecLoopTest : public testing::Test { int index = 1; size_t offset = 0; size_t size = 1024; - base::TimeDelta pts = base::TimeDelta::FromSeconds(1); + base::TimeDelta pts = base::Seconds(1); bool eos = false; bool key_frame = true; }; @@ -191,8 +194,6 @@ class MediaCodecLoopTest : public testing::Test { std::unique_ptr<MediaCodecLoop> codec_loop_; std::unique_ptr<MockMediaCodecLoopClient> client_; - - DISALLOW_COPY_AND_ASSIGN(MediaCodecLoopTest); }; TEST_F(MediaCodecLoopTest, TestConstructionWithNullCodec) { @@ -403,7 +404,7 @@ TEST_F(MediaCodecLoopTest, TestSeveralPendingIOBuffers) { OutputBuffer buffer; buffer.index = i; buffer.size += i; - buffer.pts = base::TimeDelta::FromSeconds(i + 1); + buffer.pts = base::Seconds(i + 1); ExpectDequeueOutputBuffer(buffer); ExpectOnDecodedFrame(buffer); } diff --git a/chromium/media/base/android/media_codec_util.cc b/chromium/media/base/android/media_codec_util.cc index 84e4c1be115..d9bbb10bd7b 100644 --- a/chromium/media/base/android/media_codec_util.cc +++ b/chromium/media/base/android/media_codec_util.cc @@ -127,19 +127,19 @@ std::string MediaCodecUtil::CodecToAndroidMimeType(AudioCodec codec) { return kBitstreamAudioMimeType; switch (codec) { - case kCodecMP3: + case AudioCodec::kMP3: return kMp3MimeType; - case kCodecVorbis: + case AudioCodec::kVorbis: return kVorbisMimeType; - case kCodecFLAC: + case AudioCodec::kFLAC: return kFLACMimeType; - case kCodecOpus: + case AudioCodec::kOpus: return kOpusMimeType; - case kCodecAAC: + case AudioCodec::kAAC: return kAacMimeType; - case kCodecAC3: + case AudioCodec::kAC3: return kAc3MimeType; - case kCodecEAC3: + case AudioCodec::kEAC3: return kEac3MimeType; default: return std::string(); @@ -149,17 +149,17 @@ std::string MediaCodecUtil::CodecToAndroidMimeType(AudioCodec codec) { // static std::string MediaCodecUtil::CodecToAndroidMimeType(VideoCodec codec) { switch (codec) { - case kCodecH264: + case VideoCodec::kH264: return kAvcMimeType; - case kCodecHEVC: + case VideoCodec::kHEVC: return kHevcMimeType; - case kCodecVP8: + case VideoCodec::kVP8: return kVp8MimeType; - case kCodecVP9: + case VideoCodec::kVP9: return kVp9MimeType; - case kCodecDolbyVision: + case VideoCodec::kDolbyVision: return kDolbyVisionMimeType; - case kCodecAV1: + case VideoCodec::kAV1: return kAv1MimeType; default: return std::string(); @@ -309,7 +309,7 @@ bool MediaCodecUtil::IsSetOutputSurfaceSupported() { // static bool MediaCodecUtil::IsPassthroughAudioFormat(AudioCodec codec) { - return codec == kCodecAC3 || codec == kCodecEAC3; + return codec == AudioCodec::kAC3 || codec == AudioCodec::kEAC3; } // static @@ -376,7 +376,7 @@ bool MediaCodecUtil::IsKnownUnaccelerated(VideoCodec codec, // MediaTek hardware vp8 is known slower than the software implementation. if (base::StartsWith(codec_name, "OMX.MTK.", base::CompareCase::SENSITIVE)) { - if (codec == kCodecVP8) { + if (codec == VideoCodec::kVP8) { // We may still reject VP8 hardware decoding later on certain chipsets, // see isDecoderSupportedForDevice(). We don't have the the chipset ID // here to check now though. diff --git a/chromium/media/base/android/media_codec_util_unittest.cc b/chromium/media/base/android/media_codec_util_unittest.cc index d496e884f39..fb8760b7f19 100644 --- a/chromium/media/base/android/media_codec_util_unittest.cc +++ b/chromium/media/base/android/media_codec_util_unittest.cc @@ -20,10 +20,13 @@ using base::android::SDK_VERSION_NOUGAT_MR1; class MediaCodecUtilTest : public testing::Test { public: MediaCodecUtilTest() {} + + MediaCodecUtilTest(const MediaCodecUtilTest&) = delete; + MediaCodecUtilTest& operator=(const MediaCodecUtilTest&) = delete; + ~MediaCodecUtilTest() override {} public: - DISALLOW_COPY_AND_ASSIGN(MediaCodecUtilTest); }; TEST_F(MediaCodecUtilTest, TestCodecAvailableIfNewerVersion) { diff --git a/chromium/media/base/android/media_crypto_context.h b/chromium/media/base/android/media_crypto_context.h index bfeb84dfde5..c15ddfe3ae9 100644 --- a/chromium/media/base/android/media_crypto_context.h +++ b/chromium/media/base/android/media_crypto_context.h @@ -23,6 +23,10 @@ namespace media { class MEDIA_EXPORT MediaCryptoContext { public: MediaCryptoContext() = default; + + MediaCryptoContext(const MediaCryptoContext&) = delete; + MediaCryptoContext& operator=(const MediaCryptoContext&) = delete; + virtual ~MediaCryptoContext() = default; // Notification called when MediaCrypto object is ready. @@ -38,9 +42,6 @@ class MEDIA_EXPORT MediaCryptoContext { bool requires_secure_video_codec)>; virtual void SetMediaCryptoReadyCB( MediaCryptoReadyCB media_crypto_ready_cb) = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(MediaCryptoContext); }; } // namespace media diff --git a/chromium/media/base/android/media_crypto_context_impl.h b/chromium/media/base/android/media_crypto_context_impl.h index 24ec089555e..5951fea7759 100644 --- a/chromium/media/base/android/media_crypto_context_impl.h +++ b/chromium/media/base/android/media_crypto_context_impl.h @@ -25,6 +25,9 @@ class MEDIA_EXPORT MediaCryptoContextImpl final : public MediaCryptoContext { // The |media_drm_bridge| owns |this| and is guaranteed to outlive |this|. explicit MediaCryptoContextImpl(MediaDrmBridge* media_drm_bridge); + MediaCryptoContextImpl(const MediaCryptoContextImpl&) = delete; + MediaCryptoContextImpl& operator=(const MediaCryptoContextImpl&) = delete; + ~MediaCryptoContextImpl() override; // MediaCryptoContext implementation. @@ -32,8 +35,6 @@ class MEDIA_EXPORT MediaCryptoContextImpl final : public MediaCryptoContext { private: MediaDrmBridge* const media_drm_bridge_; - - DISALLOW_COPY_AND_ASSIGN(MediaCryptoContextImpl); }; } // namespace media diff --git a/chromium/media/base/android/media_drm_bridge_client.h b/chromium/media/base/android/media_drm_bridge_client.h index fc083a40e50..643d0d8075f 100644 --- a/chromium/media/base/android/media_drm_bridge_client.h +++ b/chromium/media/base/android/media_drm_bridge_client.h @@ -39,6 +39,10 @@ class MEDIA_EXPORT MediaDrmBridgeClient { typedef std::unordered_map<std::string, UUID> KeySystemUuidMap; MediaDrmBridgeClient(); + + MediaDrmBridgeClient(const MediaDrmBridgeClient&) = delete; + MediaDrmBridgeClient& operator=(const MediaDrmBridgeClient&) = delete; + virtual ~MediaDrmBridgeClient(); // Adds extra mappings from key-system name to Android UUID into |map|. @@ -51,8 +55,6 @@ class MEDIA_EXPORT MediaDrmBridgeClient { private: friend class KeySystemManager; - - DISALLOW_COPY_AND_ASSIGN(MediaDrmBridgeClient); }; } // namespace media diff --git a/chromium/media/base/android/media_drm_bridge_delegate.h b/chromium/media/base/android/media_drm_bridge_delegate.h index d1c66b96972..f3e1064ac42 100644 --- a/chromium/media/base/android/media_drm_bridge_delegate.h +++ b/chromium/media/base/android/media_drm_bridge_delegate.h @@ -22,6 +22,10 @@ namespace media { class MEDIA_EXPORT MediaDrmBridgeDelegate { public: MediaDrmBridgeDelegate(); + + MediaDrmBridgeDelegate(const MediaDrmBridgeDelegate&) = delete; + MediaDrmBridgeDelegate& operator=(const MediaDrmBridgeDelegate&) = delete; + virtual ~MediaDrmBridgeDelegate(); // Returns the UUID of the DRM scheme that this delegate applies to. @@ -38,9 +42,6 @@ class MEDIA_EXPORT MediaDrmBridgeDelegate { const std::vector<uint8_t>& init_data, std::vector<uint8_t>* init_data_out, std::vector<std::string>* optional_parameters_out); - - private: - DISALLOW_COPY_AND_ASSIGN(MediaDrmBridgeDelegate); }; } // namespace media diff --git a/chromium/media/base/android/media_drm_bridge_factory.h b/chromium/media/base/android/media_drm_bridge_factory.h index 264aeb1e18b..f15876c75b3 100644 --- a/chromium/media/base/android/media_drm_bridge_factory.h +++ b/chromium/media/base/android/media_drm_bridge_factory.h @@ -28,6 +28,10 @@ class MEDIA_EXPORT MediaDrmBridgeFactory final : public CdmFactory { public: MediaDrmBridgeFactory(CreateFetcherCB create_fetcher_cb, CreateStorageCB create_storage_cb); + + MediaDrmBridgeFactory(const MediaDrmBridgeFactory&) = delete; + MediaDrmBridgeFactory& operator=(const MediaDrmBridgeFactory&) = delete; + ~MediaDrmBridgeFactory() override; // CdmFactory implementation. @@ -72,8 +76,6 @@ class MEDIA_EXPORT MediaDrmBridgeFactory final : public CdmFactory { scoped_refptr<MediaDrmBridge> media_drm_bridge_; base::WeakPtrFactory<MediaDrmBridgeFactory> weak_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(MediaDrmBridgeFactory); }; } // namespace media diff --git a/chromium/media/base/android/media_drm_storage_bridge.h b/chromium/media/base/android/media_drm_storage_bridge.h index ee4edf9fc43..8787f9f6d97 100644 --- a/chromium/media/base/android/media_drm_storage_bridge.h +++ b/chromium/media/base/android/media_drm_storage_bridge.h @@ -30,6 +30,10 @@ class MediaDrmStorageBridge { using InitCB = base::OnceCallback<void(bool)>; MediaDrmStorageBridge(); + + MediaDrmStorageBridge(const MediaDrmStorageBridge&) = delete; + MediaDrmStorageBridge& operator=(const MediaDrmStorageBridge&) = delete; + ~MediaDrmStorageBridge(); // Once storage is initialized, |init_cb| will be called and it will have a @@ -90,8 +94,6 @@ class MediaDrmStorageBridge { scoped_refptr<base::SingleThreadTaskRunner> task_runner_; base::WeakPtrFactory<MediaDrmStorageBridge> weak_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(MediaDrmStorageBridge); }; } // namespace media diff --git a/chromium/media/base/android/media_player_bridge.cc b/chromium/media/base/android/media_player_bridge.cc index 1f06c8f7e82..3e08054e50e 100644 --- a/chromium/media/base/android/media_player_bridge.cc +++ b/chromium/media/base/android/media_player_bridge.cc @@ -384,7 +384,7 @@ base::TimeDelta MediaPlayerBridge::GetCurrentTime() { if (!prepared_) return pending_seek_; JNIEnv* env = base::android::AttachCurrentThread(); - return base::TimeDelta::FromMilliseconds( + return base::Milliseconds( Java_MediaPlayerBridge_getCurrentPosition(env, j_media_player_bridge_)); } @@ -395,7 +395,7 @@ base::TimeDelta MediaPlayerBridge::GetDuration() { const int duration_ms = Java_MediaPlayerBridge_getDuration(env, j_media_player_bridge_); return duration_ms < 0 ? media::kInfiniteDuration - : base::TimeDelta::FromMilliseconds(duration_ms); + : base::Milliseconds(duration_ms); } void MediaPlayerBridge::Release() { @@ -477,7 +477,7 @@ void MediaPlayerBridge::OnMediaPrepared() { // events. if (should_seek_on_prepare_) { SeekInternal(pending_seek_); - pending_seek_ = base::TimeDelta::FromMilliseconds(0); + pending_seek_ = base::Milliseconds(0); should_seek_on_prepare_ = false; } diff --git a/chromium/media/base/android/media_player_bridge.h b/chromium/media/base/android/media_player_bridge.h index 4b1bfe2d156..701299c0a0b 100644 --- a/chromium/media/base/android/media_player_bridge.h +++ b/chromium/media/base/android/media_player_bridge.h @@ -85,6 +85,10 @@ class MEDIA_EXPORT MediaPlayerBridge { Client* client, bool allow_credentials, bool is_hls); + + MediaPlayerBridge(const MediaPlayerBridge&) = delete; + MediaPlayerBridge& operator=(const MediaPlayerBridge&) = delete; + virtual ~MediaPlayerBridge(); // Initialize this object and extract the metadata from the media. @@ -281,8 +285,6 @@ class MEDIA_EXPORT MediaPlayerBridge { // Weak pointer passed to `listener_` for callbacks. // NOTE: Weak pointers must be invalidated before all other member variables. base::WeakPtrFactory<MediaPlayerBridge> weak_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(MediaPlayerBridge); }; } // namespace media diff --git a/chromium/media/base/android/media_player_bridge_unittest.cc b/chromium/media/base/android/media_player_bridge_unittest.cc index 36cf5c8297f..2fc4439db26 100644 --- a/chromium/media/base/android/media_player_bridge_unittest.cc +++ b/chromium/media/base/android/media_player_bridge_unittest.cc @@ -63,7 +63,7 @@ class MediaPlayerBridgeTest : public testing::Test { }; TEST_F(MediaPlayerBridgeTest, Client_OnMediaMetadataChanged) { - const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(20); + const base::TimeDelta kDuration = base::Seconds(20); EXPECT_CALL(client_, OnMediaDurationChanged(kDuration)); diff --git a/chromium/media/base/android/media_player_listener.h b/chromium/media/base/android/media_player_listener.h index 8c7c5ed42a2..820473b856c 100644 --- a/chromium/media/base/android/media_player_listener.h +++ b/chromium/media/base/android/media_player_listener.h @@ -30,6 +30,10 @@ class MediaPlayerListener { MediaPlayerListener( const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, base::WeakPtr<MediaPlayerBridge> media_player); + + MediaPlayerListener(const MediaPlayerListener&) = delete; + MediaPlayerListener& operator=(const MediaPlayerListener&) = delete; + virtual ~MediaPlayerListener(); // Called by the Java MediaPlayerListener and mirrored to corresponding @@ -65,8 +69,6 @@ class MediaPlayerListener { base::WeakPtr<MediaPlayerBridge> media_player_; base::android::ScopedJavaGlobalRef<jobject> j_media_player_listener_; - - DISALLOW_COPY_AND_ASSIGN(MediaPlayerListener); }; } // namespace media diff --git a/chromium/media/base/android/media_server_crash_listener.h b/chromium/media/base/android/media_server_crash_listener.h index 7a19e20205e..16c9977ec68 100644 --- a/chromium/media/base/android/media_server_crash_listener.h +++ b/chromium/media/base/android/media_server_crash_listener.h @@ -29,6 +29,10 @@ class MediaServerCrashListener { MediaServerCrashListener( OnMediaServerCrashCB on_server_crash_cb, scoped_refptr<base::SingleThreadTaskRunner> callback_task_runner); + + MediaServerCrashListener(const MediaServerCrashListener&) = delete; + MediaServerCrashListener& operator=(const MediaServerCrashListener&) = delete; + ~MediaServerCrashListener(); // Ensure the underlying watchdog MediaPlayer is created. @@ -50,7 +54,6 @@ class MediaServerCrashListener { scoped_refptr<base::SingleThreadTaskRunner> callback_task_runner_; base::android::ScopedJavaGlobalRef<jobject> j_crash_listener_; - DISALLOW_COPY_AND_ASSIGN(MediaServerCrashListener); }; } // namespace media diff --git a/chromium/media/base/android/media_service_throttler.cc b/chromium/media/base/android/media_service_throttler.cc index d950218eebd..603e5543365 100644 --- a/chromium/media/base/android/media_service_throttler.cc +++ b/chromium/media/base/android/media_service_throttler.cc @@ -19,32 +19,31 @@ namespace { // Period of inactivity after which we stop listening for MediaServer crashes. // NOTE: Server crashes don't count as activity. Only calls to // GetDelayForClientCreation() do. -constexpr auto kReleaseInactivityDelay = base::TimeDelta::FromMinutes(1); +constexpr auto kReleaseInactivityDelay = base::Minutes(1); // Elapsed time between crashes needed to completely reset the media server // crash count. -constexpr auto kTimeUntilCrashReset = base::TimeDelta::FromMinutes(1); +constexpr auto kTimeUntilCrashReset = base::Minutes(1); // Elapsed time between schedule calls needed to completely reset the // scheduling clock. -constexpr auto kTimeUntilScheduleReset = base::TimeDelta::FromMinutes(1); +constexpr auto kTimeUntilScheduleReset = base::Minutes(1); // Rate at which client creations will be exponentially throttled based on the // number of media server crashes. // NOTE: Since our exponential delay formula is 2^(server crashes), 0 server // crashes still result in this delay being added once. -constexpr auto kBaseExponentialDelay = base::TimeDelta::FromMilliseconds(120); +constexpr auto kBaseExponentialDelay = base::Milliseconds(120); // Base rate at which we schedule client creations. // The minimal delay is |kLinearThrottlingDelay| + |kBaseExponentialDelay|. constexpr auto kLinearThrottlingDelay = - base::TimeDelta::FromSecondsD(0.2) - kBaseExponentialDelay; + base::Seconds(0.2) - kBaseExponentialDelay; // Max exponential throttling rate from media server crashes. // The max delay will still be |kLinearThrottlingDelay| + // |kMaxExponentialDelay|. -constexpr auto kMaxExponentialDelay = - base::TimeDelta::FromSeconds(3) - kLinearThrottlingDelay; +constexpr auto kMaxExponentialDelay = base::Seconds(3) - kLinearThrottlingDelay; // Max number of clients to schedule immediately (e.g when loading a new page). const uint32_t kMaxBurstClients = 10; @@ -172,8 +171,8 @@ void MediaServiceThrottler::UpdateServerCrashes() { current_crashes_ = 0.0; } else { // Decay at the rate of 1 crash/minute otherwise. - const double decay = (now - last_current_crash_update_time_) / - base::TimeDelta::FromMinutes(1); + const double decay = + (now - last_current_crash_update_time_) / base::Minutes(1); current_crashes_ = std::max(0.0, current_crashes_ - decay); } diff --git a/chromium/media/base/android/media_service_throttler_unittest.cc b/chromium/media/base/android/media_service_throttler_unittest.cc index af3b45a367e..554142b2358 100644 --- a/chromium/media/base/android/media_service_throttler_unittest.cc +++ b/chromium/media/base/android/media_service_throttler_unittest.cc @@ -140,11 +140,10 @@ TEST_F(MediaServiceThrottlerTest, // reset. TEST_F(MediaServiceThrottlerTest, NoCrash_LongInactivity_ShouldReset) { // Schedule two minutes' worth of clients. - SimulateClientCreations( - base::ClampFloor(base::TimeDelta::FromMinutes(2) / base_delay_)); + SimulateClientCreations(base::ClampFloor(base::Minutes(2) / base_delay_)); // Advance the time so the scheduler perceived a full minute of inactivity. - clock_.Advance(base::TimeDelta::FromSeconds(61)); + clock_.Advance(base::Seconds(61)); // Make sure new clients are burst scheduled. EXPECT_EQ(base::TimeDelta(), throttler_->GetDelayForClientCreation()); @@ -172,7 +171,7 @@ TEST_F(MediaServiceThrottlerTest, SimulateClientCreations(kMaxBurstClients); SimulateCrashes(1); - clock_.Advance(base::TimeDelta::FromMilliseconds(1)); + clock_.Advance(base::Milliseconds(1)); // Because we use the floor function when calculating crashes, a small time // advance should nullify a single crash. @@ -185,7 +184,7 @@ TEST_F(MediaServiceThrottlerTest, WithCrash_ManyCrashes_DelayShouldIncrease) { SimulateClientCreations(kMaxBurstClients); SimulateCrashes(2); - clock_.Advance(base::TimeDelta::FromMilliseconds(1)); + clock_.Advance(base::Milliseconds(1)); // The delay after crashes should be greater than the base delay. EXPECT_LT(base_delay_, GetCurrentDelayBetweenClients()); @@ -238,7 +237,7 @@ TEST_F(MediaServiceThrottlerTest, WithCrash_NoCrashesForAMinute_ShouldReset) { // The effective server crash count should be reset because it has been over // a minute since the last crash. - clock_.Advance(base::TimeDelta::FromSeconds(61)); + clock_.Advance(base::Seconds(61)); SimulateClientCreations(kMaxBurstClients); @@ -250,9 +249,9 @@ TEST_F(MediaServiceThrottlerTest, WithCrash_ConstantCrashes_ShouldNotReset) { SimulateCrashes(9); // The effective server crash count should not be reset. - clock_.Advance(base::TimeDelta::FromSeconds(59)); + clock_.Advance(base::Seconds(59)); SimulateCrashes(1); - clock_.Advance(base::TimeDelta::FromSeconds(2)); + clock_.Advance(base::Seconds(2)); SimulateClientCreations(kMaxBurstClients); @@ -265,11 +264,10 @@ TEST_F(MediaServiceThrottlerTest, CrashListener_NoRequests_ShouldShutDown) { // Schedule many minutes worth of clients. This is to prove that the // MediaServerCrashListener's clean up happens after lack of requests, as // opposed to lack of actually scheduled clients. - SimulateClientCreations( - base::ClampFloor(base::TimeDelta::FromMinutes(3) / base_delay_)); + SimulateClientCreations(base::ClampFloor(base::Minutes(3) / base_delay_)); // The MediaServerCrashListener should be alive, with 1s second to spare. - clock_.Advance(base::TimeDelta::FromSeconds(59)); + clock_.Advance(base::Seconds(59)); test_task_runner_->RunTasks(); EXPECT_TRUE(throttler_->IsCrashListenerAliveForTesting()); @@ -278,12 +276,12 @@ TEST_F(MediaServiceThrottlerTest, CrashListener_NoRequests_ShouldShutDown) { throttler_->GetDelayForClientCreation(); // The MediaServerCrashListener should be alive, with 58s second to spare. - clock_.Advance(base::TimeDelta::FromSeconds(2)); + clock_.Advance(base::Seconds(2)); test_task_runner_->RunTasks(); EXPECT_TRUE(throttler_->IsCrashListenerAliveForTesting()); // The MediaServerCrashListener should be dead. - clock_.Advance(base::TimeDelta::FromSeconds(59)); + clock_.Advance(base::Seconds(59)); test_task_runner_->RunTasks(); EXPECT_FALSE(throttler_->IsCrashListenerAliveForTesting()); } @@ -295,11 +293,10 @@ TEST_F(MediaServiceThrottlerTest, // Schedule many minutes worth of clients. This is to prove that the // MediaServerCrashListener's clean up happens after lack of requests, as // opposed to lack of actually scheduled clients. - SimulateClientCreations( - base::ClampFloor(base::TimeDelta::FromMinutes(3) / base_delay_)); + SimulateClientCreations(base::ClampFloor(base::Minutes(3) / base_delay_)); // The MediaServerCrashListener should be alive, with 1s second to spare. - clock_.Advance(base::TimeDelta::FromSeconds(59)); + clock_.Advance(base::Seconds(59)); test_task_runner_->RunTasks(); EXPECT_TRUE(throttler_->IsCrashListenerAliveForTesting()); @@ -307,7 +304,7 @@ TEST_F(MediaServiceThrottlerTest, SimulateCrashes(1); // The MediaServerCrashListener should be dead. - clock_.Advance(base::TimeDelta::FromSeconds(2)); + clock_.Advance(base::Seconds(2)); test_task_runner_->RunTasks(); EXPECT_FALSE(throttler_->IsCrashListenerAliveForTesting()); } diff --git a/chromium/media/base/android/mock_android_overlay.h b/chromium/media/base/android/mock_android_overlay.h index 34c1f7af57b..52d1cdf934e 100644 --- a/chromium/media/base/android/mock_android_overlay.h +++ b/chromium/media/base/android/mock_android_overlay.h @@ -19,6 +19,10 @@ class MockAndroidOverlay : public testing::NiceMock<AndroidOverlay>, public DestructionObservable { public: MockAndroidOverlay(); + + MockAndroidOverlay(const MockAndroidOverlay&) = delete; + MockAndroidOverlay& operator=(const MockAndroidOverlay&) = delete; + ~MockAndroidOverlay() override; MOCK_METHOD1(ScheduleLayout, void(const gfx::Rect&)); @@ -63,8 +67,6 @@ class MockAndroidOverlay : public testing::NiceMock<AndroidOverlay>, std::unique_ptr<AndroidOverlayConfig> config_; base::WeakPtrFactory<MockAndroidOverlay> weak_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(MockAndroidOverlay); }; } // namespace media diff --git a/chromium/media/base/android/mock_media_codec_bridge.h b/chromium/media/base/android/mock_media_codec_bridge.h index db20d7f58a3..44b7a6c41be 100644 --- a/chromium/media/base/android/mock_media_codec_bridge.h +++ b/chromium/media/base/android/mock_media_codec_bridge.h @@ -18,6 +18,10 @@ class MockMediaCodecBridge : public MediaCodecBridge, public DestructionObservable { public: MockMediaCodecBridge(); + + MockMediaCodecBridge(const MockMediaCodecBridge&) = delete; + MockMediaCodecBridge& operator=(const MockMediaCodecBridge&) = delete; + ~MockMediaCodecBridge() override; // Helpers for conveniently setting expectations. @@ -87,8 +91,6 @@ class MockMediaCodecBridge : public MediaCodecBridge, bool is_drained_ = true; CodecType codec_type_ = CodecType::kAny; - - DISALLOW_COPY_AND_ASSIGN(MockMediaCodecBridge); }; } // namespace media diff --git a/chromium/media/base/android/mock_media_crypto_context.h b/chromium/media/base/android/mock_media_crypto_context.h index 1cd64809cfd..ed6e81b4b25 100644 --- a/chromium/media/base/android/mock_media_crypto_context.h +++ b/chromium/media/base/android/mock_media_crypto_context.h @@ -18,6 +18,10 @@ class MEDIA_EXPORT MockMediaCryptoContext public testing::NiceMock<MediaCryptoContext> { public: explicit MockMediaCryptoContext(bool has_media_crypto_context); + + MockMediaCryptoContext(const MockMediaCryptoContext&) = delete; + MockMediaCryptoContext& operator=(const MockMediaCryptoContext&) = delete; + ~MockMediaCryptoContext() override; // CdmContext implementation. @@ -38,7 +42,6 @@ class MEDIA_EXPORT MockMediaCryptoContext private: bool has_media_crypto_context_; - DISALLOW_COPY_AND_ASSIGN(MockMediaCryptoContext); }; } // namespace media diff --git a/chromium/media/base/android/test_destruction_observable.h b/chromium/media/base/android/test_destruction_observable.h index d11b7ab9dda..c4b77bbe3b4 100644 --- a/chromium/media/base/android/test_destruction_observable.h +++ b/chromium/media/base/android/test_destruction_observable.h @@ -19,11 +19,14 @@ class DestructionObserver; class DestructionObservable { public: DestructionObservable(); + + DestructionObservable(const DestructionObservable&) = delete; + DestructionObservable& operator=(const DestructionObservable&) = delete; + virtual ~DestructionObservable(); std::unique_ptr<DestructionObserver> CreateDestructionObserver(); base::ScopedClosureRunner destruction_cb; - DISALLOW_COPY_AND_ASSIGN(DestructionObservable); }; // DestructionObserver lets you set expectations about the destruction of an @@ -31,6 +34,10 @@ class DestructionObservable { class DestructionObserver { public: DestructionObserver(DestructionObservable* observable); + + DestructionObserver(const DestructionObserver&) = delete; + DestructionObserver& operator=(const DestructionObserver&) = delete; + virtual ~DestructionObserver(); void VerifyAndClearExpectations(); @@ -58,7 +65,6 @@ class DestructionObserver { absl::optional<bool> expect_destruction_; base::WeakPtrFactory<DestructionObserver> weak_factory_{this}; - DISALLOW_COPY_AND_ASSIGN(DestructionObserver); }; } // namespace media diff --git a/chromium/media/base/audio_block_fifo.h b/chromium/media/base/audio_block_fifo.h index a88208aca4a..fb234d4b32a 100644 --- a/chromium/media/base/audio_block_fifo.h +++ b/chromium/media/base/audio_block_fifo.h @@ -21,6 +21,10 @@ class MEDIA_EXPORT AudioBlockFifo { // Creates a new AudioBlockFifo and allocates |blocks| memory, each block // of memory can store |channels| of length |frames| data. AudioBlockFifo(int channels, int frames, int blocks); + + AudioBlockFifo(const AudioBlockFifo&) = delete; + AudioBlockFifo& operator=(const AudioBlockFifo&) = delete; + virtual ~AudioBlockFifo(); // Pushes interleaved audio data from |source| to the FIFO. @@ -78,8 +82,6 @@ class MEDIA_EXPORT AudioBlockFifo { // Current write position in the current written block. int write_pos_; - - DISALLOW_COPY_AND_ASSIGN(AudioBlockFifo); }; } // namespace media diff --git a/chromium/media/base/audio_block_fifo_unittest.cc b/chromium/media/base/audio_block_fifo_unittest.cc index cf0bb669d0a..383d8593155 100644 --- a/chromium/media/base/audio_block_fifo_unittest.cc +++ b/chromium/media/base/audio_block_fifo_unittest.cc @@ -15,6 +15,10 @@ namespace media { class AudioBlockFifoTest : public testing::Test { public: AudioBlockFifoTest() = default; + + AudioBlockFifoTest(const AudioBlockFifoTest&) = delete; + AudioBlockFifoTest& operator=(const AudioBlockFifoTest&) = delete; + ~AudioBlockFifoTest() override = default; void PushAndVerify(AudioBlockFifo* fifo, @@ -54,9 +58,6 @@ class AudioBlockFifoTest : public testing::Test { EXPECT_GT(bus->channel(i)[bus->frames() - 1], 0.0f); } } - - private: - DISALLOW_COPY_AND_ASSIGN(AudioBlockFifoTest); }; // Verify that construction works as intended. @@ -114,7 +115,7 @@ TEST_F(AudioBlockFifoTest, PushAndConsume) { // Consume all blocks of data. for (int i = 1; i <= blocks; ++i) { - const AudioBus* bus = fifo.Consume(); + bus = fifo.Consume(); EXPECT_TRUE(channels == bus->channels()); EXPECT_TRUE(frames == bus->frames()); EXPECT_TRUE(fifo.GetUnfilledFrames() == frames * i); @@ -132,7 +133,7 @@ TEST_F(AudioBlockFifoTest, PushAndConsume) { // Consume all the existing filled blocks of data. while (fifo.available_blocks()) { - const AudioBus* bus = fifo.Consume(); + bus = fifo.Consume(); EXPECT_TRUE(channels == bus->channels()); EXPECT_TRUE(frames == bus->frames()); } diff --git a/chromium/media/base/audio_buffer.cc b/chromium/media/base/audio_buffer.cc index b153acd3964..cd50f60c2bf 100644 --- a/chromium/media/base/audio_buffer.cc +++ b/chromium/media/base/audio_buffer.cc @@ -6,7 +6,6 @@ #include <cmath> -#include "base/callback_helpers.h" #include "base/logging.h" #include "base/notreached.h" #include "media/base/audio_bus.h" @@ -40,8 +39,8 @@ void CopyConvertFromInterleaved( static base::TimeDelta CalculateDuration(int frames, double sample_rate) { DCHECK_GT(sample_rate, 0); - return base::TimeDelta::FromMicroseconds( - frames * base::Time::kMicrosecondsPerSecond / sample_rate); + return base::Microseconds(frames * base::Time::kMicrosecondsPerSecond / + sample_rate); } AudioBufferMemoryPool::AudioBufferMemoryPool() = default; @@ -301,8 +300,7 @@ std::unique_ptr<AudioBus> AudioBuffer::WrapOrCopyToAudioBus( // Keep |buffer| alive as long as |audio_bus|. audio_bus->SetWrappedDataDeleter( - base::BindOnce(base::DoNothing::Once<scoped_refptr<AudioBuffer>>(), - std::move(buffer))); + base::BindOnce([](scoped_refptr<AudioBuffer>) {}, std::move(buffer))); return audio_bus; } diff --git a/chromium/media/base/audio_buffer_converter_unittest.cc b/chromium/media/base/audio_buffer_converter_unittest.cc index 64d8e450f79..a72a1703ff3 100644 --- a/chromium/media/base/audio_buffer_converter_unittest.cc +++ b/chromium/media/base/audio_buffer_converter_unittest.cc @@ -28,7 +28,7 @@ static scoped_refptr<AudioBuffer> MakeTestBuffer(int sample_rate, int frames) { return MakeAudioBuffer<uint8_t>(kSampleFormatU8, channel_layout, channel_count, sample_rate, 0, 1, frames, - base::TimeDelta::FromSeconds(0)); + base::Seconds(0)); } class AudioBufferConverterTest : public ::testing::Test { diff --git a/chromium/media/base/audio_buffer_queue.h b/chromium/media/base/audio_buffer_queue.h index cb709e80e53..c16993946ce 100644 --- a/chromium/media/base/audio_buffer_queue.h +++ b/chromium/media/base/audio_buffer_queue.h @@ -23,6 +23,10 @@ class AudioBus; class MEDIA_EXPORT AudioBufferQueue { public: AudioBufferQueue(); + + AudioBufferQueue(const AudioBufferQueue&) = delete; + AudioBufferQueue& operator=(const AudioBufferQueue&) = delete; + ~AudioBufferQueue(); // Clears the buffer queue. @@ -77,8 +81,6 @@ class MEDIA_EXPORT AudioBufferQueue { // Number of frames available to be read in the buffer. int frames_; - - DISALLOW_COPY_AND_ASSIGN(AudioBufferQueue); }; } // namespace media diff --git a/chromium/media/base/audio_buffer_unittest.cc b/chromium/media/base/audio_buffer_unittest.cc index bb4128bb01a..7a11dcf12c5 100644 --- a/chromium/media/base/audio_buffer_unittest.cc +++ b/chromium/media/base/audio_buffer_unittest.cc @@ -58,7 +58,7 @@ static void TrimRangeTest(SampleFormat sample_format) { const int channels = ChannelLayoutToChannelCount(channel_layout); const int frames = kSampleRate / 10; const base::TimeDelta timestamp = base::TimeDelta(); - const base::TimeDelta duration = base::TimeDelta::FromMilliseconds(100); + const base::TimeDelta duration = base::Milliseconds(100); scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<float>(sample_format, channel_layout, channels, @@ -80,7 +80,7 @@ static void TrimRangeTest(SampleFormat sample_format) { // Trim 10ms of frames from the middle of the buffer. int trim_start = frames / 2; const int trim_length = kSampleRate / 100; - const base::TimeDelta trim_duration = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta trim_duration = base::Milliseconds(10); buffer->TrimRange(trim_start, trim_start + trim_length); EXPECT_EQ(frames - trim_length, buffer->frame_count()); EXPECT_EQ(timestamp, buffer->timestamp()); @@ -187,7 +187,7 @@ TEST(AudioBufferTest, CopyFromAudioBus) { auto audio_bus = media::AudioBus::Create(kChannelCount, kFrameCount); temp_buffer->ReadFrames(kFrameCount, 0, 0, audio_bus.get()); - const base::TimeDelta kTimestamp = base::TimeDelta::FromMilliseconds(123); + const base::TimeDelta kTimestamp = base::Milliseconds(123); auto audio_buffer_from_bus = media::AudioBuffer::CopyFrom(kSampleRate, kTimestamp, audio_bus.get()); @@ -219,7 +219,7 @@ TEST(AudioBufferTest, CopyBitstreamFrom) { const uint8_t kTestData[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}; - const base::TimeDelta kTimestamp = base::TimeDelta::FromMicroseconds(1337); + const base::TimeDelta kTimestamp = base::Microseconds(1337); const uint8_t* const data[] = {kTestData}; scoped_refptr<AudioBuffer> buffer = AudioBuffer::CopyBitstreamFrom( @@ -263,7 +263,7 @@ TEST(AudioBufferTest, FrameSize) { const uint8_t kTestData[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}; - const base::TimeDelta kTimestamp = base::TimeDelta::FromMicroseconds(1337); + const base::TimeDelta kTimestamp = base::Microseconds(1337); const uint8_t* const data[] = {kTestData}; scoped_refptr<AudioBuffer> buffer = @@ -548,7 +548,7 @@ TEST(AudioBufferTest, EmptyBuffer) { channel_layout, channels, kSampleRate, frames, start_time); EXPECT_EQ(frames, buffer->frame_count()); EXPECT_EQ(start_time, buffer->timestamp()); - EXPECT_EQ(base::TimeDelta::FromMilliseconds(10), buffer->duration()); + EXPECT_EQ(base::Milliseconds(10), buffer->duration()); EXPECT_FALSE(buffer->end_of_stream()); // Read all frames from the buffer. All data should be 0. @@ -567,7 +567,7 @@ TEST(AudioBufferTest, TrimEmptyBuffer) { const int channels = ChannelLayoutToChannelCount(channel_layout); const int frames = kSampleRate / 10; const base::TimeDelta start_time; - const base::TimeDelta duration = base::TimeDelta::FromMilliseconds(100); + const base::TimeDelta duration = base::Milliseconds(100); scoped_refptr<AudioBuffer> buffer = AudioBuffer::CreateEmptyBuffer( channel_layout, channels, kSampleRate, frames, start_time); EXPECT_EQ(frames, buffer->frame_count()); @@ -583,7 +583,7 @@ TEST(AudioBufferTest, TrimEmptyBuffer) { // Trim 10ms of frames from the middle of the buffer. int trim_start = frames / 2; const int trim_length = kSampleRate / 100; - const base::TimeDelta trim_duration = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta trim_duration = base::Milliseconds(10); buffer->TrimRange(trim_start, trim_start + trim_length); EXPECT_EQ(frames - trim_length, buffer->frame_count()); EXPECT_EQ(start_time, buffer->timestamp()); @@ -598,7 +598,7 @@ TEST(AudioBufferTest, Trim) { const int channels = ChannelLayoutToChannelCount(channel_layout); const int frames = kSampleRate / 10; const base::TimeDelta start_time; - const base::TimeDelta duration = base::TimeDelta::FromMilliseconds(100); + const base::TimeDelta duration = base::Milliseconds(100); scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<float>(kSampleFormatPlanarF32, channel_layout, @@ -613,7 +613,7 @@ TEST(AudioBufferTest, Trim) { EXPECT_EQ(duration, buffer->duration()); const int ten_ms_of_frames = kSampleRate / 100; - const base::TimeDelta ten_ms = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta ten_ms = base::Milliseconds(10); std::unique_ptr<AudioBus> bus = AudioBus::Create(channels, frames); buffer->ReadFrames(buffer->frame_count(), 0, 0, bus.get()); diff --git a/chromium/media/base/audio_bus.h b/chromium/media/base/audio_bus.h index 75792baa9b8..ce48cd79dda 100644 --- a/chromium/media/base/audio_bus.h +++ b/chromium/media/base/audio_bus.h @@ -182,6 +182,9 @@ class MEDIA_SHMEM_EXPORT AudioBus { // the channels are valid. void SwapChannels(int a, int b); + AudioBus(const AudioBus&) = delete; + AudioBus& operator=(const AudioBus&) = delete; + virtual ~AudioBus(); protected: @@ -235,8 +238,6 @@ class MEDIA_SHMEM_EXPORT AudioBus { // Run on destruction. Frees memory to the data set via SetChannelData(). // Only used with CreateWrapper(). base::OnceClosure wrapped_data_deleter_cb_; - - DISALLOW_COPY_AND_ASSIGN(AudioBus); }; // Delegates to FromInterleavedPartial() diff --git a/chromium/media/base/audio_bus_unittest.cc b/chromium/media/base/audio_bus_unittest.cc index f6b0815f41a..7b2f328582b 100644 --- a/chromium/media/base/audio_bus_unittest.cc +++ b/chromium/media/base/audio_bus_unittest.cc @@ -32,6 +32,10 @@ static const int kSampleRate = 48000; class AudioBusTest : public testing::Test { public: AudioBusTest() = default; + + AudioBusTest(const AudioBusTest&) = delete; + AudioBusTest& operator=(const AudioBusTest&) = delete; + ~AudioBusTest() override { for (size_t i = 0; i < data_.size(); ++i) base::AlignedFree(data_[i]); @@ -125,8 +129,6 @@ class AudioBusTest : public testing::Test { protected: std::vector<float*> data_; - - DISALLOW_COPY_AND_ASSIGN(AudioBusTest); }; // Verify basic Create(...) method works as advertised. diff --git a/chromium/media/base/audio_codecs.cc b/chromium/media/base/audio_codecs.cc index 06a9e73c295..901098149db 100644 --- a/chromium/media/base/audio_codecs.cc +++ b/chromium/media/base/audio_codecs.cc @@ -4,6 +4,8 @@ #include "media/base/audio_codecs.h" +#include <ostream> + #include "base/strings/string_util.h" namespace media { @@ -11,39 +13,39 @@ namespace media { // These names come from src/third_party/ffmpeg/libavcodec/codec_desc.c std::string GetCodecName(AudioCodec codec) { switch (codec) { - case kUnknownAudioCodec: + case AudioCodec::kUnknown: return "unknown"; - case kCodecAAC: + case AudioCodec::kAAC: return "aac"; - case kCodecMP3: + case AudioCodec::kMP3: return "mp3"; - case kCodecPCM: - case kCodecPCM_S16BE: - case kCodecPCM_S24BE: + case AudioCodec::kPCM: + case AudioCodec::kPCM_S16BE: + case AudioCodec::kPCM_S24BE: return "pcm"; - case kCodecVorbis: + case AudioCodec::kVorbis: return "vorbis"; - case kCodecFLAC: + case AudioCodec::kFLAC: return "flac"; - case kCodecAMR_NB: + case AudioCodec::kAMR_NB: return "amr_nb"; - case kCodecAMR_WB: + case AudioCodec::kAMR_WB: return "amr_wb"; - case kCodecPCM_MULAW: + case AudioCodec::kPCM_MULAW: return "pcm_mulaw"; - case kCodecGSM_MS: + case AudioCodec::kGSM_MS: return "gsm_ms"; - case kCodecOpus: + case AudioCodec::kOpus: return "opus"; - case kCodecPCM_ALAW: + case AudioCodec::kPCM_ALAW: return "pcm_alaw"; - case kCodecEAC3: + case AudioCodec::kEAC3: return "eac3"; - case kCodecALAC: + case AudioCodec::kALAC: return "alac"; - case kCodecAC3: + case AudioCodec::kAC3: return "ac3"; - case kCodecMpegHAudio: + case AudioCodec::kMpegHAudio: return "mpeg-h-audio"; } } @@ -59,28 +61,32 @@ std::string GetProfileName(AudioCodecProfile profile) { AudioCodec StringToAudioCodec(const std::string& codec_id) { if (codec_id == "aac") - return kCodecAAC; + return AudioCodec::kAAC; if (codec_id == "ac-3" || codec_id == "mp4a.A5" || codec_id == "mp4a.a5") - return kCodecAC3; + return AudioCodec::kAC3; if (codec_id == "ec-3" || codec_id == "mp4a.A6" || codec_id == "mp4a.a6") - return kCodecEAC3; + return AudioCodec::kEAC3; if (codec_id == "mp3" || codec_id == "mp4a.69" || codec_id == "mp4a.6B") - return kCodecMP3; + return AudioCodec::kMP3; if (codec_id == "alac") - return kCodecALAC; + return AudioCodec::kALAC; if (codec_id == "flac") - return kCodecFLAC; + return AudioCodec::kFLAC; if (base::StartsWith(codec_id, "mhm1.", base::CompareCase::SENSITIVE) || base::StartsWith(codec_id, "mha1.", base::CompareCase::SENSITIVE)) { - return kCodecMpegHAudio; + return AudioCodec::kMpegHAudio; } if (codec_id == "opus") - return kCodecOpus; + return AudioCodec::kOpus; if (codec_id == "vorbis") - return kCodecVorbis; + return AudioCodec::kVorbis; if (base::StartsWith(codec_id, "mp4a.40.", base::CompareCase::SENSITIVE)) - return kCodecAAC; - return kUnknownAudioCodec; + return AudioCodec::kAAC; + return AudioCodec::kUnknown; +} + +std::ostream& operator<<(std::ostream& os, const AudioCodec& codec) { + return os << GetCodecName(codec); } } // namespace media diff --git a/chromium/media/base/audio_codecs.h b/chromium/media/base/audio_codecs.h index 5eb5ddcb1a4..f679513a20b 100644 --- a/chromium/media/base/audio_codecs.h +++ b/chromium/media/base/audio_codecs.h @@ -10,36 +10,36 @@ namespace media { -enum AudioCodec { +enum class AudioCodec { // These values are histogrammed over time; do not change their ordinal // values. When deleting a codec replace it with a dummy value; when adding a - // codec, do so at the bottom before kAudioCodecMax, and update the value of - // kAudioCodecMax to equal the new codec. - kUnknownAudioCodec = 0, - kCodecAAC = 1, - kCodecMP3 = 2, - kCodecPCM = 3, - kCodecVorbis = 4, - kCodecFLAC = 5, - kCodecAMR_NB = 6, - kCodecAMR_WB = 7, - kCodecPCM_MULAW = 8, - kCodecGSM_MS = 9, - kCodecPCM_S16BE = 10, - kCodecPCM_S24BE = 11, - kCodecOpus = 12, - kCodecEAC3 = 13, - kCodecPCM_ALAW = 14, - kCodecALAC = 15, - kCodecAC3 = 16, - kCodecMpegHAudio = 17, + // codec, do so at the bottom before kMaxValue, and update the value of + // kMaxValue to equal the new codec. + kUnknown = 0, + kAAC = 1, + kMP3 = 2, + kPCM = 3, + kVorbis = 4, + kFLAC = 5, + kAMR_NB = 6, + kAMR_WB = 7, + kPCM_MULAW = 8, + kGSM_MS = 9, + kPCM_S16BE = 10, + kPCM_S24BE = 11, + kOpus = 12, + kEAC3 = 13, + kPCM_ALAW = 14, + kALAC = 15, + kAC3 = 16, + kMpegHAudio = 17, // DO NOT ADD RANDOM AUDIO CODECS! // // The only acceptable time to add a new codec is if there is production code // that uses said codec in the same CL. // Must always be equal to the largest entry ever logged. - kAudioCodecMax = kCodecMpegHAudio, + kMaxValue = kMpegHAudio, }; enum class AudioCodecProfile { @@ -55,6 +55,8 @@ enum class AudioCodecProfile { std::string MEDIA_EXPORT GetCodecName(AudioCodec codec); std::string MEDIA_EXPORT GetProfileName(AudioCodecProfile profile); +MEDIA_EXPORT std::ostream& operator<<(std::ostream& os, + const AudioCodec& codec); MEDIA_EXPORT AudioCodec StringToAudioCodec(const std::string& codec_id); } // namespace media diff --git a/chromium/media/base/audio_decoder.h b/chromium/media/base/audio_decoder.h index 961d570e561..78853acf33e 100644 --- a/chromium/media/base/audio_decoder.h +++ b/chromium/media/base/audio_decoder.h @@ -42,6 +42,9 @@ class MEDIA_EXPORT AudioDecoder : public Decoder { AudioDecoder(); + AudioDecoder(const AudioDecoder&) = delete; + AudioDecoder& operator=(const AudioDecoder&) = delete; + // Fires any pending callbacks, stops and destroys the decoder. // Note: Since this is a destructor, |this| will be destroyed after this call. // Make sure the callbacks fired from this call doesn't post any task that @@ -87,9 +90,6 @@ class MEDIA_EXPORT AudioDecoder : public Decoder { // Returns the type of the decoder for statistics recording purposes. virtual AudioDecoderType GetDecoderType() const = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(AudioDecoder); }; } // namespace media diff --git a/chromium/media/base/audio_decoder_config.cc b/chromium/media/base/audio_decoder_config.cc index 1fcbb4119aa..5bbd6f7a73c 100644 --- a/chromium/media/base/audio_decoder_config.cc +++ b/chromium/media/base/audio_decoder_config.cc @@ -54,7 +54,7 @@ void AudioDecoderConfig::Initialize(AudioCodec codec, AudioDecoderConfig::~AudioDecoderConfig() = default; bool AudioDecoderConfig::IsValidConfig() const { - return codec_ != kUnknownAudioCodec && + return codec_ != AudioCodec::kUnknown && channel_layout_ != CHANNEL_LAYOUT_UNSUPPORTED && bytes_per_channel_ > 0 && bytes_per_channel_ <= limits::kMaxBytesPerSample && @@ -78,7 +78,8 @@ bool AudioDecoderConfig::Matches(const AudioDecoderConfig& config) const { (should_discard_decoder_delay() == config.should_discard_decoder_delay()) && (target_output_channel_layout() == - config.target_output_channel_layout())); + config.target_output_channel_layout()) && + (aac_extra_data() == config.aac_extra_data())); } std::string AudioDecoderConfig::AsHumanReadableString() const { @@ -98,7 +99,9 @@ std::string AudioDecoderConfig::AsHumanReadableString() const { << ", discard decoder delay: " << (should_discard_decoder_delay() ? "true" : "false") << ", target_output_channel_layout: " - << ChannelLayoutToString(target_output_channel_layout()); + << ChannelLayoutToString(target_output_channel_layout()) + << ", has aac extra data: " + << (aac_extra_data().empty() ? "false" : "true"); return s.str(); } diff --git a/chromium/media/base/audio_decoder_config.h b/chromium/media/base/audio_decoder_config.h index 1ec4ed073b9..7be1ed8a40e 100644 --- a/chromium/media/base/audio_decoder_config.h +++ b/chromium/media/base/audio_decoder_config.h @@ -116,6 +116,11 @@ class MEDIA_EXPORT AudioDecoderConfig { return target_output_channel_layout_; } + void set_aac_extra_data(std::vector<uint8_t> aac_extra_data) { + aac_extra_data_ = std::move(aac_extra_data); + } + const std::vector<uint8_t>& aac_extra_data() const { return aac_extra_data_; } + private: // WARNING: When modifying or adding any parameters, update the following: // - AudioDecoderConfig::AsHumanReadableString() @@ -126,7 +131,7 @@ class MEDIA_EXPORT AudioDecoderConfig { // Mandatory parameters passed in constructor: - AudioCodec codec_ = kUnknownAudioCodec; + AudioCodec codec_ = AudioCodec::kUnknown; SampleFormat sample_format_ = kUnknownSampleFormat; ChannelLayout channel_layout_ = CHANNEL_LAYOUT_UNSUPPORTED; int samples_per_second_ = 0; @@ -148,6 +153,12 @@ class MEDIA_EXPORT AudioDecoderConfig { // Layout of the output hardware. Optionally set. See setter comments. ChannelLayout target_output_channel_layout_ = CHANNEL_LAYOUT_NONE; + // This is a hack for backward compatibility. For AAC, to preserve existing + // behavior, we set `aac_extra_data_` on all platforms but only set + // `extra_data` on Android. + // TODO(crbug.com/1250841): Remove this after we land a long term fix. + std::vector<uint8_t> aac_extra_data_; + // Indicates if a decoder should implicitly discard decoder delay without it // being explicitly marked in discard padding. bool should_discard_decoder_delay_ = true; diff --git a/chromium/media/base/audio_discard_helper_unittest.cc b/chromium/media/base/audio_discard_helper_unittest.cc index 9300fea296c..b934b0579f7 100644 --- a/chromium/media/base/audio_discard_helper_unittest.cc +++ b/chromium/media/base/audio_discard_helper_unittest.cc @@ -47,24 +47,21 @@ TEST(AudioDiscardHelperTest, TimeDeltaToFrames) { AudioDiscardHelper discard_helper(kSampleRate, 0, false); EXPECT_EQ(0u, discard_helper.TimeDeltaToFrames(base::TimeDelta())); - EXPECT_EQ( - kSampleRate / 100, - discard_helper.TimeDeltaToFrames(base::TimeDelta::FromMilliseconds(10))); + EXPECT_EQ(kSampleRate / 100, + discard_helper.TimeDeltaToFrames(base::Milliseconds(10))); // Ensure partial frames are rounded down correctly. The equation below // calculates a frame count with a fractional part < 0.5. const int small_remainder = base::Time::kMicrosecondsPerSecond * (kSampleRate - 0.9) / kSampleRate; - EXPECT_EQ(kSampleRate - 1, - discard_helper.TimeDeltaToFrames( - base::TimeDelta::FromMicroseconds(small_remainder))); + EXPECT_EQ(kSampleRate - 1, discard_helper.TimeDeltaToFrames( + base::Microseconds(small_remainder))); // Ditto, but rounded up using a fractional part > 0.5. const int large_remainder = base::Time::kMicrosecondsPerSecond * (kSampleRate - 0.4) / kSampleRate; - EXPECT_EQ(kSampleRate, - discard_helper.TimeDeltaToFrames( - base::TimeDelta::FromMicroseconds(large_remainder))); + EXPECT_EQ(kSampleRate, discard_helper.TimeDeltaToFrames( + base::Microseconds(large_remainder))); } TEST(AudioDiscardHelperTest, BasicProcessBuffers) { @@ -75,9 +72,8 @@ TEST(AudioDiscardHelperTest, BasicProcessBuffers) { // Use an estimated duration which doesn't match the number of decoded frames // to ensure the helper is correctly setting durations based on output frames. - const base::TimeDelta kEstimatedDuration = - base::TimeDelta::FromMilliseconds(9); - const base::TimeDelta kActualDuration = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta kEstimatedDuration = base::Milliseconds(9); + const base::TimeDelta kActualDuration = base::Milliseconds(10); const int kTestFrames = discard_helper.TimeDeltaToFrames(kActualDuration); scoped_refptr<DecoderBuffer> encoded_buffer = @@ -104,8 +100,8 @@ TEST(AudioDiscardHelperTest, NegativeTimestampClampsToZero) { AudioDiscardHelper discard_helper(kSampleRate, 0, false); ASSERT_FALSE(discard_helper.initialized()); - const base::TimeDelta kTimestamp = -base::TimeDelta::FromSeconds(1); - const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta kTimestamp = -base::Seconds(1); + const base::TimeDelta kDuration = base::Milliseconds(10); const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); scoped_refptr<DecoderBuffer> encoded_buffer = @@ -126,7 +122,7 @@ TEST(AudioDiscardHelperTest, ProcessBuffersWithInitialDiscard) { ASSERT_FALSE(discard_helper.initialized()); const base::TimeDelta kTimestamp = base::TimeDelta(); - const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta kDuration = base::Milliseconds(10); const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); // Tell the helper we want to discard half of the initial frames. @@ -153,7 +149,7 @@ TEST(AudioDiscardHelperTest, ProcessBuffersWithLargeInitialDiscard) { ASSERT_FALSE(discard_helper.initialized()); const base::TimeDelta kTimestamp = base::TimeDelta(); - const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta kDuration = base::Milliseconds(10); const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); // Tell the helper we want to discard 1.5 buffers worth of frames. @@ -188,7 +184,7 @@ TEST(AudioDiscardHelperTest, AllowNonMonotonicTimestamps) { ASSERT_FALSE(discard_helper.initialized()); const base::TimeDelta kTimestamp = base::TimeDelta(); - const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta kDuration = base::Milliseconds(10); const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); scoped_refptr<DecoderBuffer> encoded_buffer = @@ -216,7 +212,7 @@ TEST(AudioDiscardHelperTest, DiscardEndPadding) { ASSERT_FALSE(discard_helper.initialized()); const base::TimeDelta kTimestamp = base::TimeDelta(); - const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta kDuration = base::Milliseconds(10); const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); scoped_refptr<DecoderBuffer> encoded_buffer = @@ -240,7 +236,7 @@ TEST(AudioDiscardHelperTest, BadDiscardEndPadding) { ASSERT_FALSE(discard_helper.initialized()); const base::TimeDelta kTimestamp = base::TimeDelta(); - const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta kDuration = base::Milliseconds(10); const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); scoped_refptr<DecoderBuffer> encoded_buffer = @@ -262,7 +258,7 @@ TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardEndPadding) { ASSERT_FALSE(discard_helper.initialized()); const base::TimeDelta kTimestamp = base::TimeDelta(); - const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta kDuration = base::Milliseconds(10); const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); scoped_refptr<DecoderBuffer> encoded_buffer = @@ -292,7 +288,7 @@ TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardPadding) { ASSERT_FALSE(discard_helper.initialized()); const base::TimeDelta kTimestamp = base::TimeDelta(); - const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta kDuration = base::Milliseconds(10); const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); scoped_refptr<DecoderBuffer> encoded_buffer = @@ -323,7 +319,7 @@ TEST(AudioDiscardHelperTest, InitialDiscardAndDiscardPaddingAndDecoderDelay) { discard_helper.Reset(kDecoderDelay); const base::TimeDelta kTimestamp = base::TimeDelta(); - const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta kDuration = base::Milliseconds(10); const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); scoped_refptr<DecoderBuffer> encoded_buffer = @@ -434,7 +430,7 @@ TEST(AudioDiscardHelperTest, DelayedDiscardInitialDiscardAndDiscardPadding) { ASSERT_FALSE(discard_helper.initialized()); const base::TimeDelta kTimestamp = base::TimeDelta(); - const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta kDuration = base::Milliseconds(10); const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); scoped_refptr<DecoderBuffer> encoded_buffer = @@ -470,7 +466,7 @@ TEST(AudioDiscardHelperTest, CompleteDiscard) { ASSERT_FALSE(discard_helper.initialized()); const base::TimeDelta kTimestamp = base::TimeDelta(); - const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta kDuration = base::Milliseconds(10); const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); discard_helper.Reset(0); @@ -502,7 +498,7 @@ TEST(AudioDiscardHelperTest, CompleteDiscardWithDelayedDiscard) { ASSERT_FALSE(discard_helper.initialized()); const base::TimeDelta kTimestamp = base::TimeDelta(); - const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta kDuration = base::Milliseconds(10); const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); discard_helper.Reset(0); @@ -541,7 +537,7 @@ TEST(AudioDiscardHelperTest, CompleteDiscardWithInitialDiscardDecoderDelay) { discard_helper.Reset(kDecoderDelay); const base::TimeDelta kTimestamp = base::TimeDelta(); - const base::TimeDelta kDuration = base::TimeDelta::FromMilliseconds(10); + const base::TimeDelta kDuration = base::Milliseconds(10); const int kTestFrames = discard_helper.TimeDeltaToFrames(kDuration); scoped_refptr<DecoderBuffer> encoded_buffer = diff --git a/chromium/media/base/audio_fifo.h b/chromium/media/base/audio_fifo.h index 65349f50dd7..ac1af1f5bf2 100644 --- a/chromium/media/base/audio_fifo.h +++ b/chromium/media/base/audio_fifo.h @@ -22,6 +22,10 @@ class MEDIA_EXPORT AudioFifo { public: // Creates a new AudioFifo and allocates |channels| of length |frames|. AudioFifo(int channels, int frames); + + AudioFifo(const AudioFifo&) = delete; + AudioFifo& operator=(const AudioFifo&) = delete; + virtual ~AudioFifo(); // Pushes all audio channel data from |source| to the FIFO. @@ -60,8 +64,6 @@ class MEDIA_EXPORT AudioFifo { // Current write position. int write_pos_; - - DISALLOW_COPY_AND_ASSIGN(AudioFifo); }; } // namespace media diff --git a/chromium/media/base/audio_fifo_unittest.cc b/chromium/media/base/audio_fifo_unittest.cc index 2f69e3628f2..752c87373ce 100644 --- a/chromium/media/base/audio_fifo_unittest.cc +++ b/chromium/media/base/audio_fifo_unittest.cc @@ -15,6 +15,10 @@ namespace media { class AudioFifoTest : public testing::Test { public: AudioFifoTest() = default; + + AudioFifoTest(const AudioFifoTest&) = delete; + AudioFifoTest& operator=(const AudioFifoTest&) = delete; + ~AudioFifoTest() override = default; void VerifyValue(const float data[], int size, float value) { @@ -23,7 +27,6 @@ class AudioFifoTest : public testing::Test { } protected: - DISALLOW_COPY_AND_ASSIGN(AudioFifoTest); }; // Verify that construction works as intended. @@ -121,7 +124,7 @@ TEST_F(AudioFifoTest, FramesInFifo) { const int frames_in_fifo = bus2->frames(); fifo.Push(bus2.get()); EXPECT_EQ(fifo.frames(), frames_in_fifo); - for (int n = 0; n < kMaxFrameCount; ++n) { + for (n = 0; n < kMaxFrameCount; ++n) { fifo.Push(bus2.get()); fifo.Consume(bus2.get(), 0, frames_in_fifo); EXPECT_EQ(fifo.frames(), frames_in_fifo); diff --git a/chromium/media/base/audio_hash.h b/chromium/media/base/audio_hash.h index 5ac1aa267b7..cc261abb228 100644 --- a/chromium/media/base/audio_hash.h +++ b/chromium/media/base/audio_hash.h @@ -35,6 +35,10 @@ class AudioBus; class MEDIA_EXPORT AudioHash { public: AudioHash(); + + AudioHash(const AudioHash&) = delete; + AudioHash& operator=(const AudioHash&) = delete; + ~AudioHash(); // Update current hash with the contents of the provided AudioBus. @@ -57,8 +61,6 @@ class MEDIA_EXPORT AudioHash { // The total number of samples processed per channel. Uses a uint32_t instead // of size_t so overflows on 64-bit and 32-bit machines are equivalent. uint32_t sample_count_; - - DISALLOW_COPY_AND_ASSIGN(AudioHash); }; } // namespace media diff --git a/chromium/media/base/audio_hash_unittest.cc b/chromium/media/base/audio_hash_unittest.cc index 03383cfb3f8..a14a3eb6dc8 100644 --- a/chromium/media/base/audio_hash_unittest.cc +++ b/chromium/media/base/audio_hash_unittest.cc @@ -41,14 +41,15 @@ class AudioHashTest : public testing::Test { } } + AudioHashTest(const AudioHashTest&) = delete; + AudioHashTest& operator=(const AudioHashTest&) = delete; + ~AudioHashTest() override = default; protected: std::unique_ptr<AudioBus> bus_one_; std::unique_ptr<AudioBus> bus_two_; FakeAudioRenderCallback fake_callback_; - - DISALLOW_COPY_AND_ASSIGN(AudioHashTest); }; // Ensure the same data hashes the same. diff --git a/chromium/media/base/audio_latency_unittest.cc b/chromium/media/base/audio_latency_unittest.cc index aa9ac668785..d7722927fa0 100644 --- a/chromium/media/base/audio_latency_unittest.cc +++ b/chromium/media/base/audio_latency_unittest.cc @@ -46,63 +46,57 @@ class AudioLatencyTest : public testing::TestWithParam<AudioLatencyTestData> { max_buffer_size : (limits::kMaxWebAudioBufferSize / multiplier) * multiplier; - EXPECT_EQ(platform_min_buffer_size, - media::AudioLatency::GetExactBufferSize( - base::TimeDelta::FromSecondsD(0.0), hardware_sample_rate, - hardware_buffer_size, min_buffer_size, max_buffer_size, - limits::kMaxWebAudioBufferSize)); EXPECT_EQ( platform_min_buffer_size, media::AudioLatency::GetExactBufferSize( - base::TimeDelta::FromSecondsD( - min_buffer_size / static_cast<double>(hardware_sample_rate)), - hardware_sample_rate, hardware_buffer_size, min_buffer_size, - max_buffer_size, limits::kMaxWebAudioBufferSize)); - EXPECT_EQ( - multiplier * 2, - media::AudioLatency::GetExactBufferSize( - base::TimeDelta::FromSecondsD( - (multiplier * 2) / static_cast<double>(hardware_sample_rate)), - hardware_sample_rate, hardware_buffer_size, min_buffer_size, - max_buffer_size, limits::kMaxWebAudioBufferSize)); + base::Seconds(0.0), hardware_sample_rate, hardware_buffer_size, + min_buffer_size, max_buffer_size, limits::kMaxWebAudioBufferSize)); + EXPECT_EQ(platform_min_buffer_size, + media::AudioLatency::GetExactBufferSize( + base::Seconds(min_buffer_size / + static_cast<double>(hardware_sample_rate)), + hardware_sample_rate, hardware_buffer_size, min_buffer_size, + max_buffer_size, limits::kMaxWebAudioBufferSize)); + EXPECT_EQ(multiplier * 2, + media::AudioLatency::GetExactBufferSize( + base::Seconds((multiplier * 2) / + static_cast<double>(hardware_sample_rate)), + hardware_sample_rate, hardware_buffer_size, min_buffer_size, + max_buffer_size, limits::kMaxWebAudioBufferSize)); + EXPECT_EQ(multiplier * 2, + media::AudioLatency::GetExactBufferSize( + base::Seconds((multiplier * 1.1) / + static_cast<double>(hardware_sample_rate)), + hardware_sample_rate, hardware_buffer_size, min_buffer_size, + max_buffer_size, limits::kMaxWebAudioBufferSize)); EXPECT_EQ( - multiplier * 2, + platform_max_buffer_size, media::AudioLatency::GetExactBufferSize( - base::TimeDelta::FromSecondsD( - (multiplier * 1.1) / static_cast<double>(hardware_sample_rate)), - hardware_sample_rate, hardware_buffer_size, min_buffer_size, - max_buffer_size, limits::kMaxWebAudioBufferSize)); - EXPECT_EQ(platform_max_buffer_size, - media::AudioLatency::GetExactBufferSize( - base::TimeDelta::FromSecondsD(10.0), hardware_sample_rate, - hardware_buffer_size, min_buffer_size, max_buffer_size, - limits::kMaxWebAudioBufferSize)); + base::Seconds(10.0), hardware_sample_rate, hardware_buffer_size, + min_buffer_size, max_buffer_size, limits::kMaxWebAudioBufferSize)); if (max_buffer_size) { - EXPECT_EQ( - max_buffer_size, - media::AudioLatency::GetExactBufferSize( - base::TimeDelta::FromSecondsD( - max_buffer_size / static_cast<double>(hardware_sample_rate)), - hardware_sample_rate, hardware_buffer_size, min_buffer_size, - max_buffer_size, limits::kMaxWebAudioBufferSize)); + EXPECT_EQ(max_buffer_size, + media::AudioLatency::GetExactBufferSize( + base::Seconds(max_buffer_size / + static_cast<double>(hardware_sample_rate)), + hardware_sample_rate, hardware_buffer_size, min_buffer_size, + max_buffer_size, limits::kMaxWebAudioBufferSize)); } #if defined(OS_WIN) if (min_buffer_size && min_buffer_size < hardware_buffer_size) { EXPECT_EQ(hardware_buffer_size, media::AudioLatency::GetExactBufferSize( - base::TimeDelta::FromSecondsD( - (min_buffer_size * 1.1) / - static_cast<double>(hardware_sample_rate)), + base::Seconds((min_buffer_size * 1.1) / + static_cast<double>(hardware_sample_rate)), hardware_sample_rate, hardware_buffer_size, min_buffer_size, max_buffer_size, limits::kMaxWebAudioBufferSize)); } #elif defined(OS_MAC) EXPECT_EQ(limits::kMaxWebAudioBufferSize, media::AudioLatency::GetExactBufferSize( - base::TimeDelta::FromSecondsD( - (limits::kMaxAudioBufferSize * 1.1) / - static_cast<double>(hardware_sample_rate)), + base::Seconds((limits::kMaxAudioBufferSize * 1.1) / + static_cast<double>(hardware_sample_rate)), hardware_sample_rate, hardware_buffer_size, min_buffer_size, max_buffer_size, limits::kMaxWebAudioBufferSize)); #endif @@ -110,9 +104,8 @@ class AudioLatencyTest : public testing::TestWithParam<AudioLatencyTestData> { int previous_buffer_size = 0; for (int i = 0; i < 1000; i++) { int buffer_size = media::AudioLatency::GetExactBufferSize( - base::TimeDelta::FromSecondsD(i / 1000.0), hardware_sample_rate, - hardware_buffer_size, min_buffer_size, max_buffer_size, - limits::kMaxWebAudioBufferSize); + base::Seconds(i / 1000.0), hardware_sample_rate, hardware_buffer_size, + min_buffer_size, max_buffer_size, limits::kMaxWebAudioBufferSize); EXPECT_GE(buffer_size, previous_buffer_size); #if defined(OS_WIN) EXPECT_TRUE(buffer_size == min_buffer_size || diff --git a/chromium/media/base/audio_parameters.cc b/chromium/media/base/audio_parameters.cc index b3b07180107..73660aeecf1 100644 --- a/chromium/media/base/audio_parameters.cc +++ b/chromium/media/base/audio_parameters.cc @@ -162,7 +162,7 @@ double AudioParameters::GetMicrosecondsPerFrame() const { } base::TimeDelta AudioParameters::GetBufferDuration() const { - return base::TimeDelta::FromMicroseconds(static_cast<int64_t>( + return base::Microseconds(static_cast<int64_t>( frames_per_buffer_ * base::Time::kMicrosecondsPerSecond / static_cast<float>(sample_rate_))); } diff --git a/chromium/media/base/audio_power_monitor.h b/chromium/media/base/audio_power_monitor.h index d95b2836064..012879f1ecf 100644 --- a/chromium/media/base/audio_power_monitor.h +++ b/chromium/media/base/audio_power_monitor.h @@ -42,6 +42,9 @@ class MEDIA_EXPORT AudioPowerMonitor { // ~63.2% of maximum given a step input signal. AudioPowerMonitor(int sample_rate, base::TimeDelta time_constant); + AudioPowerMonitor(const AudioPowerMonitor&) = delete; + AudioPowerMonitor& operator=(const AudioPowerMonitor&) = delete; + ~AudioPowerMonitor(); // Reset power monitor to initial state (zero power level). This should not @@ -79,8 +82,6 @@ class MEDIA_EXPORT AudioPowerMonitor { base::Lock reading_lock_; float power_reading_; bool clipped_reading_; - - DISALLOW_COPY_AND_ASSIGN(AudioPowerMonitor); }; } // namespace media diff --git a/chromium/media/base/audio_power_monitor_unittest.cc b/chromium/media/base/audio_power_monitor_unittest.cc index 7ce16e04301..6b01f582fe0 100644 --- a/chromium/media/base/audio_power_monitor_unittest.cc +++ b/chromium/media/base/audio_power_monitor_unittest.cc @@ -146,9 +146,7 @@ class MeasurementObserver { class AudioPowerMonitorTest : public ::testing::TestWithParam<TestScenario> { public: AudioPowerMonitorTest() - : power_monitor_(kSampleRate, - base::TimeDelta::FromMilliseconds(kTimeConstantMillis)) { - } + : power_monitor_(kSampleRate, base::Milliseconds(kTimeConstantMillis)) {} void FeedAndCheckExpectedPowerIsMeasured(const AudioBus& bus, float power, diff --git a/chromium/media/base/audio_pull_fifo.h b/chromium/media/base/audio_pull_fifo.h index 9d9ac6f5a9d..1a58d530bb8 100644 --- a/chromium/media/base/audio_pull_fifo.h +++ b/chromium/media/base/audio_pull_fifo.h @@ -33,6 +33,10 @@ class MEDIA_EXPORT AudioPullFifo { // FIFO can contain |channel| number of channels, where each channel is of // length |frames| audio frames. AudioPullFifo(int channels, int frames, ReadCB read_cb); + + AudioPullFifo(const AudioPullFifo&) = delete; + AudioPullFifo& operator=(const AudioPullFifo&) = delete; + virtual ~AudioPullFifo(); // Consumes |frames_to_consume| audio frames from the FIFO and copies @@ -58,8 +62,6 @@ class MEDIA_EXPORT AudioPullFifo { // Temporary audio bus to hold the data from the producer. std::unique_ptr<AudioBus> fifo_; int fifo_index_; - - DISALLOW_COPY_AND_ASSIGN(AudioPullFifo); }; } // namespace media diff --git a/chromium/media/base/audio_pull_fifo_unittest.cc b/chromium/media/base/audio_pull_fifo_unittest.cc index 358485a1831..073b433b77c 100644 --- a/chromium/media/base/audio_pull_fifo_unittest.cc +++ b/chromium/media/base/audio_pull_fifo_unittest.cc @@ -39,6 +39,10 @@ class AudioPullFifoTest last_frame_delay_(-1) { EXPECT_EQ(kMaxFramesInFifo, pull_fifo_.SizeInFrames()); } + + AudioPullFifoTest(const AudioPullFifoTest&) = delete; + AudioPullFifoTest& operator=(const AudioPullFifoTest&) = delete; + virtual ~AudioPullFifoTest() = default; void VerifyValue(const float data[], int size, float start_value) { @@ -86,8 +90,6 @@ class AudioPullFifoTest std::unique_ptr<AudioBus> audio_bus_; int fill_value_; int last_frame_delay_; - - DISALLOW_COPY_AND_ASSIGN(AudioPullFifoTest); }; TEST_P(AudioPullFifoTest, Consume) { diff --git a/chromium/media/base/audio_push_fifo.h b/chromium/media/base/audio_push_fifo.h index fb9c615c397..d0aa4a3c27b 100644 --- a/chromium/media/base/audio_push_fifo.h +++ b/chromium/media/base/audio_push_fifo.h @@ -36,6 +36,9 @@ class MEDIA_EXPORT AudioPushFifo final { // |callback|. explicit AudioPushFifo(const OutputCallback& callback); + AudioPushFifo(const AudioPushFifo&) = delete; + AudioPushFifo& operator=(const AudioPushFifo&) = delete; + ~AudioPushFifo(); // Returns the number of frames in each AudioBus delivered to the @@ -69,8 +72,6 @@ class MEDIA_EXPORT AudioPushFifo final { // Queue of frames pending for delivery. std::unique_ptr<AudioBus> audio_queue_; int queued_frames_; - - DISALLOW_COPY_AND_ASSIGN(AudioPushFifo); }; } // namespace media diff --git a/chromium/media/base/audio_push_fifo_unittest.cc b/chromium/media/base/audio_push_fifo_unittest.cc index a5fc8a37885..ecbc8443254 100644 --- a/chromium/media/base/audio_push_fifo_unittest.cc +++ b/chromium/media/base/audio_push_fifo_unittest.cc @@ -20,6 +20,10 @@ namespace { class AudioPushFifoTest : public testing::TestWithParam<int> { public: AudioPushFifoTest() = default; + + AudioPushFifoTest(const AudioPushFifoTest&) = delete; + AudioPushFifoTest& operator=(const AudioPushFifoTest&) = delete; + ~AudioPushFifoTest() override = default; int output_chunk_size() const { return GetParam(); } @@ -161,8 +165,6 @@ class AudioPushFifoTest : public testing::TestWithParam<int> { } uint32_t rand_seed_ = 0x7e110; - - DISALLOW_COPY_AND_ASSIGN(AudioPushFifoTest); }; // Tests an atypical edge case: Push()ing one frame at a time. diff --git a/chromium/media/base/audio_renderer.h b/chromium/media/base/audio_renderer.h index 907d0fc7f82..6eb4fa59981 100644 --- a/chromium/media/base/audio_renderer.h +++ b/chromium/media/base/audio_renderer.h @@ -24,6 +24,9 @@ class MEDIA_EXPORT AudioRenderer { public: AudioRenderer(); + AudioRenderer(const AudioRenderer&) = delete; + AudioRenderer& operator=(const AudioRenderer&) = delete; + // Stop all operations and fire all pending callbacks. virtual ~AudioRenderer(); @@ -71,9 +74,6 @@ class MEDIA_EXPORT AudioRenderer { // Sets a flag indicating whether the audio stream was initiated by autoplay. virtual void SetAutoplayInitiated(bool autoplay_initiated) = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(AudioRenderer); }; } // namespace media diff --git a/chromium/media/base/audio_renderer_mixer.cc b/chromium/media/base/audio_renderer_mixer.cc index 604a9ecba91..1c4cc33111f 100644 --- a/chromium/media/base/audio_renderer_mixer.cc +++ b/chromium/media/base/audio_renderer_mixer.cc @@ -15,7 +15,7 @@ namespace media { -constexpr base::TimeDelta kPauseDelay = base::TimeDelta::FromSeconds(10); +constexpr base::TimeDelta kPauseDelay = base::Seconds(10); AudioRendererMixer::AudioRendererMixer(const AudioParameters& output_params, scoped_refptr<AudioRendererSink> sink) diff --git a/chromium/media/base/audio_renderer_mixer.h b/chromium/media/base/audio_renderer_mixer.h index cc45740f147..6b7d5852942 100644 --- a/chromium/media/base/audio_renderer_mixer.h +++ b/chromium/media/base/audio_renderer_mixer.h @@ -31,6 +31,10 @@ class MEDIA_EXPORT AudioRendererMixer public: AudioRendererMixer(const AudioParameters& output_params, scoped_refptr<AudioRendererSink> sink); + + AudioRendererMixer(const AudioRendererMixer&) = delete; + AudioRendererMixer& operator=(const AudioRendererMixer&) = delete; + ~AudioRendererMixer() override; // Add or remove a mixer input from mixing; called by AudioRendererMixerInput. @@ -94,8 +98,6 @@ class MEDIA_EXPORT AudioRendererMixer base::TimeDelta pause_delay_ GUARDED_BY(lock_); base::TimeTicks last_play_time_ GUARDED_BY(lock_); bool playing_ GUARDED_BY(lock_); - - DISALLOW_COPY_AND_ASSIGN(AudioRendererMixer); }; } // namespace media diff --git a/chromium/media/base/audio_renderer_mixer_pool.h b/chromium/media/base/audio_renderer_mixer_pool.h index 8562d5880f0..9071f1ff8e3 100644 --- a/chromium/media/base/audio_renderer_mixer_pool.h +++ b/chromium/media/base/audio_renderer_mixer_pool.h @@ -24,6 +24,10 @@ class AudioRendererSink; class MEDIA_EXPORT AudioRendererMixerPool { public: AudioRendererMixerPool() = default; + + AudioRendererMixerPool(const AudioRendererMixerPool&) = delete; + AudioRendererMixerPool& operator=(const AudioRendererMixerPool&) = delete; + virtual ~AudioRendererMixerPool() = default; // Obtains a pointer to mixer instance based on AudioParameters. The pointer @@ -50,9 +54,6 @@ class MEDIA_EXPORT AudioRendererMixerPool { virtual scoped_refptr<AudioRendererSink> GetSink( const base::UnguessableToken& owner_token, const std::string& device_id) = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(AudioRendererMixerPool); }; } // namespace media diff --git a/chromium/media/base/audio_renderer_mixer_unittest.cc b/chromium/media/base/audio_renderer_mixer_unittest.cc index bec6fd5e6cd..3e6c86b6386 100644 --- a/chromium/media/base/audio_renderer_mixer_unittest.cc +++ b/chromium/media/base/audio_renderer_mixer_unittest.cc @@ -479,7 +479,7 @@ TEST_P(AudioRendererMixerBehavioralTest, OnRenderErrorPausedInput) { // Ensure the physical stream is paused after a certain amount of time with no // inputs playing. The test will hang if the behavior is incorrect. TEST_P(AudioRendererMixerBehavioralTest, MixerPausesStream) { - const base::TimeDelta kPauseTime = base::TimeDelta::FromMilliseconds(500); + const base::TimeDelta kPauseTime = base::Milliseconds(500); // This value can't be too low or valgrind, tsan will timeout on the bots. const base::TimeDelta kTestTimeout = 10 * kPauseTime; mixer_->SetPauseDelayForTesting(kPauseTime); @@ -492,7 +492,7 @@ TEST_P(AudioRendererMixerBehavioralTest, MixerPausesStream) { InitializeInputs(1); // Ensure never playing the input results in a sink pause. - const base::TimeDelta kSleepTime = base::TimeDelta::FromMilliseconds(100); + const base::TimeDelta kSleepTime = base::Milliseconds(100); base::TimeTicks start_time = base::TimeTicks::Now(); while (!pause_event.IsSignaled()) { mixer_callback_->Render(base::TimeDelta(), base::TimeTicks::Now(), 0, diff --git a/chromium/media/base/audio_shifter.cc b/chromium/media/base/audio_shifter.cc index 90c416168da..462fdf702fd 100644 --- a/chromium/media/base/audio_shifter.cc +++ b/chromium/media/base/audio_shifter.cc @@ -108,8 +108,7 @@ void AudioShifter::Push(std::unique_ptr<AudioBus> input, (playout_time - base::TimeTicks()).InMillisecondsF()); if (!queue_.empty()) { playout_time = input_clock_smoother_->Smooth( - playout_time, - base::TimeDelta::FromSecondsD(queue_.back().audio->frames() / rate_)); + playout_time, base::Seconds(queue_.back().audio->frames() / rate_)); } queue_.push_back(AudioQueueEntry(playout_time, std::move(input))); while (!queue_.empty() && @@ -128,11 +127,9 @@ void AudioShifter::Pull(AudioBus* output, // Add the kernel size since we incur some internal delay in resampling. All // resamplers incur some delay, and for the SincResampler (used by // MultiChannelResampler), this is (currently) kKernelSize / 2 frames. - playout_time += - base::TimeDelta::FromSecondsD(SincResampler::kKernelSize / 2 / rate_); + playout_time += base::Seconds(SincResampler::kKernelSize / 2 / rate_); playout_time = output_clock_smoother_->Smooth( - playout_time, - base::TimeDelta::FromSecondsD(previous_requested_samples_ / rate_)); + playout_time, base::Seconds(previous_requested_samples_ / rate_)); previous_requested_samples_ = output->frames(); base::TimeTicks stream_time; @@ -145,21 +142,19 @@ void AudioShifter::Pull(AudioBus* output, stream_time = queue_.front().target_playout_time; buffer_end_time = queue_.back().target_playout_time; } - stream_time += base::TimeDelta::FromSecondsD( - (position_ - resampler_.BufferedFrames()) / rate_); + stream_time += + base::Seconds((position_ - resampler_.BufferedFrames()) / rate_); - if (!running_ && base::TimeDelta::FromSecondsD(output->frames() * 2 / rate_) + - clock_accuracy_ > - buffer_end_time - stream_time) { + if (!running_ && + base::Seconds(output->frames() * 2 / rate_) + clock_accuracy_ > + buffer_end_time - stream_time) { // We're not running right now, and we don't really have enough data // to satisfy output reliably. Wait. Zero(output); return; } - if (playout_time < - stream_time - - base::TimeDelta::FromSecondsD(output->frames() / rate_ / 2) - - (running_ ? clock_accuracy_ : base::TimeDelta())) { + if (playout_time < stream_time - base::Seconds(output->frames() / rate_ / 2) - + (running_ ? clock_accuracy_ : base::TimeDelta())) { // |playout_time| is too far before the earliest known audio sample. Zero(output); return; @@ -172,7 +167,7 @@ void AudioShifter::Pull(AudioBus* output, // bias to avoid buffer underruns in the future. if (bias_.is_zero()) { bias_ = playout_time - stream_time + clock_accuracy_ + - base::TimeDelta::FromSecondsD(output->frames() / rate_); + base::Seconds(output->frames() / rate_); } stream_time += bias_; } else { @@ -207,7 +202,7 @@ void AudioShifter::Pull(AudioBus* output, double slow_ratio = steady_ratio + time_difference / adjustment_time_; slow_ratio = base::clamp(slow_ratio, 0.9, 1.1); const base::TimeDelta adjustment_time = - base::TimeDelta::FromSecondsD(output->frames() / rate_); + base::Seconds(output->frames() / rate_); // This is ratio we we'd need get perfect sync at the end of the // current output audiobus. double fast_ratio = steady_ratio + time_difference / adjustment_time; @@ -260,7 +255,7 @@ void AudioShifter::ResamplerCallback(int frame_delay, AudioBus* destination) { if (position_ >= static_cast<size_t>(queue_.front().audio->frames())) { end_of_last_consumed_audiobus_ = queue_.front().target_playout_time + - base::TimeDelta::FromSecondsD(queue_.front().audio->frames() / rate_); + base::Seconds(queue_.front().audio->frames() / rate_); position_ -= queue_.front().audio->frames(); queue_.pop_front(); } diff --git a/chromium/media/base/audio_shifter_unittest.cc b/chromium/media/base/audio_shifter_unittest.cc index 42a0e058380..0d651f9736e 100644 --- a/chromium/media/base/audio_shifter_unittest.cc +++ b/chromium/media/base/audio_shifter_unittest.cc @@ -22,18 +22,17 @@ class AudioShifterTest : public ::testing::TestWithParam<::testing::tuple<int, int, int, bool> > { public: AudioShifterTest() - : shifter_(base::TimeDelta::FromMilliseconds(2000), - base::TimeDelta::FromMilliseconds(3), - base::TimeDelta::FromMilliseconds(100), + : shifter_(base::Milliseconds(2000), + base::Milliseconds(3), + base::Milliseconds(100), kSampleRate, 2), - end2end_latency_(base::TimeDelta::FromMilliseconds(30)), - playback_latency_(base::TimeDelta::FromMilliseconds(10)), + end2end_latency_(base::Milliseconds(30)), + playback_latency_(base::Milliseconds(10)), tag_input_(false), expect_smooth_output_(true), input_sample_n_(0), - output_sample_(0) { - } + output_sample_(0) {} void SetupInput(int size, base::TimeDelta rate) { input_size_ = size; @@ -62,12 +61,10 @@ class AudioShifterTest : void SetUp() override { SetupInput( kInputPacketSize + ::testing::get<0>(GetParam()) - 1, - base::TimeDelta::FromMicroseconds( - 1000 + ::testing::get<1>(GetParam()) * 5 - 5)); + base::Microseconds(1000 + ::testing::get<1>(GetParam()) * 5 - 5)); SetupOutput( kOutputPacketSize, - base::TimeDelta::FromMicroseconds( - 500 + ::testing::get<2>(GetParam()) * 3 - 3)); + base::Microseconds(500 + ::testing::get<2>(GetParam()) * 3 - 3)); if (::testing::get<3>(GetParam())) { end2end_latency_ = -end2end_latency_; } @@ -89,9 +86,8 @@ class AudioShifterTest : if (test_output_->channel(0)[j] != 0.0) { silence = false; if (test_output_->channel(0)[j] > 3000000.0) { - marker_outputs_.push_back( - now_ + playback_latency_ + - base::TimeDelta::FromSeconds(j) / kSampleRate); + marker_outputs_.push_back(now_ + playback_latency_ + + base::Seconds(j) / kSampleRate); } else { // We don't expect smooth output once we insert a tag, // or in the very beginning. @@ -128,8 +124,8 @@ class AudioShifterTest : if (end2end_latency_ > base::TimeDelta()) { CHECK(!marker_outputs_.empty()); base::TimeDelta actual_offset = marker_outputs_[0] - expected_mark_time; - EXPECT_LT(actual_offset, base::TimeDelta::FromMicroseconds(100)); - EXPECT_GT(actual_offset, base::TimeDelta::FromMicroseconds(-100)); + EXPECT_LT(actual_offset, base::Microseconds(100)); + EXPECT_GT(actual_offset, base::Microseconds(-100)); } else { EXPECT_GT(marker_outputs_.size(), 0UL); } @@ -174,8 +170,7 @@ TEST_P(AudioShifterTest, TestSyncWithPull) { expect_smooth_output_ = false; Run(100); for (int i = 0; i < 100; i++) { - shifter_.Pull(test_output_.get(), - now_ + base::TimeDelta::FromMilliseconds(i)); + shifter_.Pull(test_output_.get(), now_ + base::Milliseconds(i)); } RunAndCheckSync(1000); EXPECT_LE(skip_outputs_.size(), 1UL); @@ -185,12 +180,10 @@ TEST_P(AudioShifterTest, UnderOverFlow) { expect_smooth_output_ = false; SetupInput( kInputPacketSize + ::testing::get<0>(GetParam()) * 10 - 10, - base::TimeDelta::FromMicroseconds( - 1000 + ::testing::get<1>(GetParam()) * 100 - 100)); + base::Microseconds(1000 + ::testing::get<1>(GetParam()) * 100 - 100)); SetupOutput( kOutputPacketSize, - base::TimeDelta::FromMicroseconds( - 500 + ::testing::get<2>(GetParam()) * 50 - 50)); + base::Microseconds(500 + ::testing::get<2>(GetParam()) * 50 - 50)); // Sane output is not expected, but let's make sure we don't crash. Run(1000); } diff --git a/chromium/media/base/audio_timestamp_helper.cc b/chromium/media/base/audio_timestamp_helper.cc index ee87ed2ab45..01ec6be22ef 100644 --- a/chromium/media/base/audio_timestamp_helper.cc +++ b/chromium/media/base/audio_timestamp_helper.cc @@ -13,8 +13,8 @@ namespace media { base::TimeDelta AudioTimestampHelper::FramesToTime(int64_t frames, int samples_per_second) { DCHECK_GT(samples_per_second, 0); - return base::TimeDelta::FromMicroseconds( - frames * base::Time::kMicrosecondsPerSecond / samples_per_second); + return base::Microseconds(frames * base::Time::kMicrosecondsPerSecond / + samples_per_second); } // static @@ -82,7 +82,7 @@ base::TimeDelta AudioTimestampHelper::ComputeTimestamp( DCHECK_GE(frame_count, 0); DCHECK(base_timestamp_ != kNoTimestamp); double frames_us = microseconds_per_frame_ * frame_count; - return base_timestamp_ + base::TimeDelta::FromMicroseconds(frames_us); + return base_timestamp_ + base::Microseconds(frames_us); } } // namespace media diff --git a/chromium/media/base/audio_timestamp_helper_unittest.cc b/chromium/media/base/audio_timestamp_helper_unittest.cc index 272e9f728d1..1a70066e1fe 100644 --- a/chromium/media/base/audio_timestamp_helper_unittest.cc +++ b/chromium/media/base/audio_timestamp_helper_unittest.cc @@ -35,7 +35,7 @@ class AudioTimestampHelperTest : public ::testing::Test { int64_t FramesToTarget(int target_in_microseconds) { return helper_.GetFramesToTarget( - base::TimeDelta::FromMicroseconds(target_in_microseconds)); + base::Microseconds(target_in_microseconds)); } void TestGetFramesToTargetRange(int frame_count, int start, int end) { @@ -54,49 +54,49 @@ class AudioTimestampHelperTest : public ::testing::Test { TEST_F(AudioTimestampHelperTest, FramesToTime) { // Negative value. - EXPECT_EQ(base::TimeDelta::FromSeconds(-1), + EXPECT_EQ(base::Seconds(-1), AudioTimestampHelper::FramesToTime(-48000, k48kHz)); // Zero. - EXPECT_EQ(base::TimeDelta::FromMicroseconds(0), + EXPECT_EQ(base::Microseconds(0), AudioTimestampHelper::FramesToTime(0, k48kHz)); // One frame. - EXPECT_EQ(base::TimeDelta::FromMicroseconds(20), + EXPECT_EQ(base::Microseconds(20), AudioTimestampHelper::FramesToTime(1, k48kHz)); // Exact value with maximum precision of TimeDelta. - EXPECT_EQ(base::TimeDelta::FromMicroseconds(15625), + EXPECT_EQ(base::Microseconds(15625), AudioTimestampHelper::FramesToTime(750, k48kHz)); // One second. - EXPECT_EQ(base::TimeDelta::FromSeconds(1), + EXPECT_EQ(base::Seconds(1), AudioTimestampHelper::FramesToTime(48000, k48kHz)); // Argument and return value exceeding 32 bits. - EXPECT_EQ(base::TimeDelta::FromSeconds(1000000), + EXPECT_EQ(base::Seconds(1000000), AudioTimestampHelper::FramesToTime(48000000000, k48kHz)); } TEST_F(AudioTimestampHelperTest, TimeToFrames) { // Negative value. - EXPECT_EQ(-48000, AudioTimestampHelper::TimeToFrames( - base::TimeDelta::FromSeconds(-1), k48kHz)); + EXPECT_EQ(-48000, + AudioTimestampHelper::TimeToFrames(base::Seconds(-1), k48kHz)); // Zero. - EXPECT_EQ(0, AudioTimestampHelper::TimeToFrames( - base::TimeDelta::FromMicroseconds(0), k48kHz)); + EXPECT_EQ(0, + AudioTimestampHelper::TimeToFrames(base::Microseconds(0), k48kHz)); // Duration of each frame is 20.833 microseconds. The result is rounded to // integral. - EXPECT_EQ(0, AudioTimestampHelper::TimeToFrames( - base::TimeDelta::FromMicroseconds(10), k48kHz)); - EXPECT_EQ(1, AudioTimestampHelper::TimeToFrames( - base::TimeDelta::FromMicroseconds(20), k48kHz)); - EXPECT_EQ(1, AudioTimestampHelper::TimeToFrames( - base::TimeDelta::FromMicroseconds(21), k48kHz)); + EXPECT_EQ(0, + AudioTimestampHelper::TimeToFrames(base::Microseconds(10), k48kHz)); + EXPECT_EQ(1, + AudioTimestampHelper::TimeToFrames(base::Microseconds(20), k48kHz)); + EXPECT_EQ(1, + AudioTimestampHelper::TimeToFrames(base::Microseconds(21), k48kHz)); // Exact value with maximum precision of TimeDelta. - EXPECT_EQ(750, AudioTimestampHelper::TimeToFrames( - base::TimeDelta::FromMicroseconds(15625), k48kHz)); + EXPECT_EQ(750, AudioTimestampHelper::TimeToFrames(base::Microseconds(15625), + k48kHz)); // One second. - EXPECT_EQ(48000, AudioTimestampHelper::TimeToFrames( - base::TimeDelta::FromSeconds(1), k48kHz)); + EXPECT_EQ(48000, + AudioTimestampHelper::TimeToFrames(base::Seconds(1), k48kHz)); // Argument and return value exceeding 32 bits. - EXPECT_EQ(48000000000, AudioTimestampHelper::TimeToFrames( - base::TimeDelta::FromSeconds(1000000), k48kHz)); + EXPECT_EQ(48000000000, + AudioTimestampHelper::TimeToFrames(base::Seconds(1000000), k48kHz)); } TEST_F(AudioTimestampHelperTest, Basic) { @@ -128,7 +128,7 @@ TEST_F(AudioTimestampHelperTest, Basic) { TEST_F(AudioTimestampHelperTest, GetDuration) { - helper_.SetBaseTimestamp(base::TimeDelta::FromMicroseconds(100)); + helper_.SetBaseTimestamp(base::Microseconds(100)); int frame_count = 5; int64_t expected_durations[] = {113, 113, 114, 113, 113, 114}; diff --git a/chromium/media/base/bit_reader.h b/chromium/media/base/bit_reader.h index dd980ff1d99..a5e37ab8bfe 100644 --- a/chromium/media/base/bit_reader.h +++ b/chromium/media/base/bit_reader.h @@ -20,6 +20,10 @@ class MEDIA_EXPORT BitReader : private BitReaderCore::ByteStreamProvider { // Initialize the reader to start reading at |data|, |size| being size // of |data| in bytes. BitReader(const uint8_t* data, int size); + + BitReader(const BitReader&) = delete; + BitReader& operator=(const BitReader&) = delete; + ~BitReader() override; template<typename T> bool ReadBits(int num_bits, T* out) { @@ -61,8 +65,6 @@ class MEDIA_EXPORT BitReader : private BitReaderCore::ByteStreamProvider { int bytes_left_; BitReaderCore bit_reader_core_; - - DISALLOW_COPY_AND_ASSIGN(BitReader); }; } // namespace media diff --git a/chromium/media/base/bit_reader_core.h b/chromium/media/base/bit_reader_core.h index 7a9f7497ec0..9e39958585c 100644 --- a/chromium/media/base/bit_reader_core.h +++ b/chromium/media/base/bit_reader_core.h @@ -30,6 +30,10 @@ class MEDIA_EXPORT BitReaderCore { // Lifetime of |byte_stream_provider| must be longer than BitReaderCore. explicit BitReaderCore(ByteStreamProvider* byte_stream_provider); + + BitReaderCore(const BitReaderCore&) = delete; + BitReaderCore& operator=(const BitReaderCore&) = delete; + ~BitReaderCore(); // Read one bit from the stream and return it as a boolean in |*out|. @@ -117,8 +121,6 @@ class MEDIA_EXPORT BitReaderCore { // Note: bits are consumed from MSB to LSB. int nbits_next_; uint64_t reg_next_; - - DISALLOW_COPY_AND_ASSIGN(BitReaderCore); }; } // namespace media diff --git a/chromium/media/base/bitstream_buffer.h b/chromium/media/base/bitstream_buffer.h index d6c2cea5161..19efcd04018 100644 --- a/chromium/media/base/bitstream_buffer.h +++ b/chromium/media/base/bitstream_buffer.h @@ -54,6 +54,9 @@ class MEDIA_EXPORT BitstreamBuffer { BitstreamBuffer(BitstreamBuffer&&); BitstreamBuffer& operator=(BitstreamBuffer&&); + BitstreamBuffer(const BitstreamBuffer&) = delete; + BitstreamBuffer& operator=(const BitstreamBuffer&) = delete; + ~BitstreamBuffer(); // Produce an equivalent DecoderBuffer. This consumes region(), even if @@ -130,8 +133,6 @@ class MEDIA_EXPORT BitstreamBuffer { std::vector<SubsampleEntry> subsamples_; // clear/cypher sizes friend struct IPC::ParamTraits<media::BitstreamBuffer>; - - DISALLOW_COPY_AND_ASSIGN(BitstreamBuffer); }; } // namespace media diff --git a/chromium/media/base/byte_queue.h b/chromium/media/base/byte_queue.h index 23270ac7f3d..528f870a258 100644 --- a/chromium/media/base/byte_queue.h +++ b/chromium/media/base/byte_queue.h @@ -24,6 +24,10 @@ namespace media { class MEDIA_EXPORT ByteQueue { public: ByteQueue(); + + ByteQueue(const ByteQueue&) = delete; + ByteQueue& operator=(const ByteQueue&) = delete; + ~ByteQueue(); // Reset the queue to the empty state. @@ -56,8 +60,6 @@ class MEDIA_EXPORT ByteQueue { int used_ = 0; std::unique_ptr<uint8_t[]> buffer_; - - DISALLOW_COPY_AND_ASSIGN(ByteQueue); }; } // namespace media diff --git a/chromium/media/base/callback_registry.h b/chromium/media/base/callback_registry.h index 737eed8dc13..2089bc11a41 100644 --- a/chromium/media/base/callback_registry.h +++ b/chromium/media/base/callback_registry.h @@ -24,10 +24,11 @@ namespace media { class CallbackRegistration { public: CallbackRegistration() = default; - virtual ~CallbackRegistration() = default; - private: - DISALLOW_COPY_AND_ASSIGN(CallbackRegistration); + CallbackRegistration(const CallbackRegistration&) = delete; + CallbackRegistration& operator=(const CallbackRegistration&) = delete; + + virtual ~CallbackRegistration() = default; }; template <typename Sig> @@ -45,6 +46,10 @@ class CallbackRegistry<void(Args...)> { using CallbackType = base::RepeatingCallback<void(Args...)>; CallbackRegistry() = default; + + CallbackRegistry(const CallbackRegistry&) = delete; + CallbackRegistry& operator=(const CallbackRegistry&) = delete; + ~CallbackRegistry() = default; std::unique_ptr<CallbackRegistration> Register(CallbackType cb) @@ -76,13 +81,14 @@ class CallbackRegistry<void(Args...)> { uint32_t registration_id) : registry_(registry), registration_id_(registration_id) {} + RegistrationImpl(const RegistrationImpl&) = delete; + RegistrationImpl& operator=(const RegistrationImpl&) = delete; + ~RegistrationImpl() override { registry_->Unregister(registration_id_); } private: CallbackRegistry<void(Args...)>* registry_ = nullptr; uint32_t registration_id_ = 0; - - DISALLOW_COPY_AND_ASSIGN(RegistrationImpl); }; void Unregister(uint32_t registration_id) { @@ -95,8 +101,6 @@ class CallbackRegistry<void(Args...)> { base::Lock lock_; uint32_t next_registration_id_ GUARDED_BY(lock_) = 0; std::map<uint32_t, CallbackType> callbacks_ GUARDED_BY(lock_); - - DISALLOW_COPY_AND_ASSIGN(CallbackRegistry); }; using ClosureRegistry = CallbackRegistry<void()>; diff --git a/chromium/media/base/cdm_callback_promise.h b/chromium/media/base/cdm_callback_promise.h index 48d51c97218..6a2fd08c61d 100644 --- a/chromium/media/base/cdm_callback_promise.h +++ b/chromium/media/base/cdm_callback_promise.h @@ -26,6 +26,10 @@ class MEDIA_EXPORT CdmCallbackPromise : public CdmPromiseTemplate<T...> { public: CdmCallbackPromise(base::OnceCallback<void(const T&...)> resolve_cb, PromiseRejectedCB reject_cb); + + CdmCallbackPromise(const CdmCallbackPromise&) = delete; + CdmCallbackPromise& operator=(const CdmCallbackPromise&) = delete; + virtual ~CdmCallbackPromise(); // CdmPromiseTemplate<T> implementation. @@ -41,8 +45,6 @@ class MEDIA_EXPORT CdmCallbackPromise : public CdmPromiseTemplate<T...> { base::OnceCallback<void(const T&...)> resolve_cb_; PromiseRejectedCB reject_cb_; - - DISALLOW_COPY_AND_ASSIGN(CdmCallbackPromise); }; } // namespace media diff --git a/chromium/media/base/cdm_context.cc b/chromium/media/base/cdm_context.cc index fc2901585bb..36cd529132c 100644 --- a/chromium/media/base/cdm_context.cc +++ b/chromium/media/base/cdm_context.cc @@ -3,7 +3,6 @@ // found in the LICENSE file. #include "media/base/cdm_context.h" -#include "build/chromeos_buildflags.h" #include "media/base/callback_registry.h" @@ -53,7 +52,7 @@ FuchsiaCdmContext* CdmContext::GetFuchsiaCdmContext() { } #endif -#if BUILDFLAG(IS_CHROMEOS_ASH) +#if defined(OS_CHROMEOS) chromeos::ChromeOsCdmContext* CdmContext::GetChromeOsCdmContext() { return nullptr; } diff --git a/chromium/media/base/cdm_context.h b/chromium/media/base/cdm_context.h index 366e41d1b2c..53f93b53025 100644 --- a/chromium/media/base/cdm_context.h +++ b/chromium/media/base/cdm_context.h @@ -10,12 +10,11 @@ #include "base/memory/scoped_refptr.h" #include "base/unguessable_token.h" #include "build/build_config.h" -#include "build/chromeos_buildflags.h" #include "media/base/media_export.h" #include "media/media_buildflags.h" #include "third_party/abseil-cpp/absl/types/optional.h" -#if BUILDFLAG(IS_CHROMEOS_ASH) +#if defined(OS_CHROMEOS) namespace chromeos { class ChromeOsCdmContext; } @@ -62,6 +61,9 @@ class MEDIA_EXPORT CdmContext { // Callback to notify the occurrence of an Event. using EventCB = base::RepeatingCallback<void(Event)>; + CdmContext(const CdmContext&) = delete; + CdmContext& operator=(const CdmContext&) = delete; + virtual ~CdmContext(); // Registers a callback which will be called when an event happens in the CDM. @@ -124,7 +126,7 @@ class MEDIA_EXPORT CdmContext { virtual FuchsiaCdmContext* GetFuchsiaCdmContext(); #endif -#if BUILDFLAG(IS_CHROMEOS_ASH) +#if defined(OS_CHROMEOS) // Returns a ChromeOsCdmContext interface when the context is backed by the // ChromeOS CdmFactoryDaemon. Otherwise return nullptr. virtual chromeos::ChromeOsCdmContext* GetChromeOsCdmContext(); @@ -132,9 +134,6 @@ class MEDIA_EXPORT CdmContext { protected: CdmContext(); - - private: - DISALLOW_COPY_AND_ASSIGN(CdmContext); }; // A reference holder to make sure the CdmContext is always valid as long as diff --git a/chromium/media/base/cdm_factory.h b/chromium/media/base/cdm_factory.h index 96fcf3a8678..1885f240664 100644 --- a/chromium/media/base/cdm_factory.h +++ b/chromium/media/base/cdm_factory.h @@ -28,6 +28,10 @@ struct CdmConfig; class MEDIA_EXPORT CdmFactory { public: CdmFactory(); + + CdmFactory(const CdmFactory&) = delete; + CdmFactory& operator=(const CdmFactory&) = delete; + virtual ~CdmFactory(); // Creates a CDM for |key_system| and returns it through |cdm_created_cb| @@ -40,9 +44,6 @@ class MEDIA_EXPORT CdmFactory { const SessionKeysChangeCB& session_keys_change_cb, const SessionExpirationUpdateCB& session_expiration_update_cb, CdmCreatedCB cdm_created_cb) = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(CdmFactory); }; } // namespace media diff --git a/chromium/media/base/cdm_promise.h b/chromium/media/base/cdm_promise.h index 4fc35221a85..5920d624b45 100644 --- a/chromium/media/base/cdm_promise.h +++ b/chromium/media/base/cdm_promise.h @@ -62,6 +62,10 @@ class MEDIA_EXPORT CdmPromise { }; CdmPromise() = default; + + CdmPromise(const CdmPromise&) = delete; + CdmPromise& operator=(const CdmPromise&) = delete; + virtual ~CdmPromise() = default; // Used to indicate that the operation failed. |exception_code| must be @@ -75,9 +79,6 @@ class MEDIA_EXPORT CdmPromise { // Used to determine the template type of CdmPromiseTemplate<T> so that // saved CdmPromise objects can be cast to the correct templated version. virtual ResolveParameterType GetResolveParameterType() const = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(CdmPromise); }; template <typename... T> @@ -110,15 +111,14 @@ class CdmPromiseTemplate : public CdmPromise { public: CdmPromiseTemplate() : is_settled_(false) {} + CdmPromiseTemplate(const CdmPromiseTemplate&) = delete; + CdmPromiseTemplate& operator=(const CdmPromiseTemplate&) = delete; + virtual ~CdmPromiseTemplate() { DCHECK(is_settled_); } virtual void resolve(const T&... result) = 0; // CdmPromise implementation. - virtual void reject(Exception exception_code, - uint32_t system_code, - const std::string& error_message) = 0; - ResolveParameterType GetResolveParameterType() const final; protected: @@ -146,8 +146,6 @@ class CdmPromiseTemplate : public CdmPromise { private: // Keep track of whether the promise has been resolved or rejected yet. bool is_settled_; - - DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate); }; // Explicitly defining all variants of GetResolveParameterType(). diff --git a/chromium/media/base/cdm_promise_adapter.h b/chromium/media/base/cdm_promise_adapter.h index f678df4b340..b301797bb0c 100644 --- a/chromium/media/base/cdm_promise_adapter.h +++ b/chromium/media/base/cdm_promise_adapter.h @@ -23,6 +23,10 @@ namespace media { class MEDIA_EXPORT CdmPromiseAdapter { public: CdmPromiseAdapter(); + + CdmPromiseAdapter(const CdmPromiseAdapter&) = delete; + CdmPromiseAdapter& operator=(const CdmPromiseAdapter&) = delete; + ~CdmPromiseAdapter(); enum : uint32_t { kInvalidPromiseId = 0 }; @@ -62,7 +66,6 @@ class MEDIA_EXPORT CdmPromiseAdapter { PromiseMap promises_; base::ThreadChecker thread_checker_; - DISALLOW_COPY_AND_ASSIGN(CdmPromiseAdapter); }; } // namespace media diff --git a/chromium/media/base/cdm_session_tracker.h b/chromium/media/base/cdm_session_tracker.h index 504b0e3c4d1..e7bdadad53d 100644 --- a/chromium/media/base/cdm_session_tracker.h +++ b/chromium/media/base/cdm_session_tracker.h @@ -19,6 +19,10 @@ namespace media { class MEDIA_EXPORT CdmSessionTracker { public: CdmSessionTracker(); + + CdmSessionTracker(const CdmSessionTracker&) = delete; + CdmSessionTracker& operator=(const CdmSessionTracker&) = delete; + ~CdmSessionTracker(); // Adds `session_id` to the list of sessions being tracked. @@ -37,8 +41,6 @@ class MEDIA_EXPORT CdmSessionTracker { private: std::unordered_set<std::string> session_ids_; - - DISALLOW_COPY_AND_ASSIGN(CdmSessionTracker); }; } // namespace media diff --git a/chromium/media/base/channel_mixer.h b/chromium/media/base/channel_mixer.h index a7ed6536bb0..20ac9454a44 100644 --- a/chromium/media/base/channel_mixer.h +++ b/chromium/media/base/channel_mixer.h @@ -30,6 +30,10 @@ class MEDIA_EXPORT ChannelMixer { ChannelMixer(ChannelLayout input_layout, ChannelLayout output_layout); ChannelMixer(const AudioParameters& input, const AudioParameters& output); + + ChannelMixer(const ChannelMixer&) = delete; + ChannelMixer& operator=(const ChannelMixer&) = delete; + ~ChannelMixer(); // Transforms all channels from |input| into |output| channels. @@ -53,8 +57,6 @@ class MEDIA_EXPORT ChannelMixer { // Optimization case for when we can simply remap the input channels to output // channels and don't need to do a multiply-accumulate loop over |matrix_|. bool remapping_; - - DISALLOW_COPY_AND_ASSIGN(ChannelMixer); }; } // namespace media diff --git a/chromium/media/base/channel_mixing_matrix.h b/chromium/media/base/channel_mixing_matrix.h index 64fcdb90228..cca95a73a2a 100644 --- a/chromium/media/base/channel_mixing_matrix.h +++ b/chromium/media/base/channel_mixing_matrix.h @@ -20,6 +20,9 @@ class MEDIA_EXPORT ChannelMixingMatrix { ChannelLayout output_layout, int output_channels); + ChannelMixingMatrix(const ChannelMixingMatrix&) = delete; + ChannelMixingMatrix& operator=(const ChannelMixingMatrix&) = delete; + ~ChannelMixingMatrix(); // Create the transformation matrix of input channels to output channels. @@ -55,8 +58,6 @@ class MEDIA_EXPORT ChannelMixingMatrix { // remove the channel from |unaccounted_inputs_|. void Mix(Channels input_ch, Channels output_ch, float scale); void MixWithoutAccounting(Channels input_ch, Channels output_ch, float scale); - - DISALLOW_COPY_AND_ASSIGN(ChannelMixingMatrix); }; } // namespace media diff --git a/chromium/media/base/data_buffer_unittest.cc b/chromium/media/base/data_buffer_unittest.cc index 5b9e5ac42bf..e4f53040b00 100644 --- a/chromium/media/base/data_buffer_unittest.cc +++ b/chromium/media/base/data_buffer_unittest.cc @@ -69,8 +69,8 @@ TEST(DataBufferTest, CreateEOSBuffer) { TEST(DataBufferTest, Timestamp) { const base::TimeDelta kZero; - const base::TimeDelta kTimestampA = base::TimeDelta::FromMicroseconds(1337); - const base::TimeDelta kTimestampB = base::TimeDelta::FromMicroseconds(1234); + const base::TimeDelta kTimestampA = base::Microseconds(1337); + const base::TimeDelta kTimestampB = base::Microseconds(1234); scoped_refptr<DataBuffer> buffer = new DataBuffer(0); EXPECT_TRUE(buffer->timestamp() == kZero); @@ -84,8 +84,8 @@ TEST(DataBufferTest, Timestamp) { TEST(DataBufferTest, Duration) { const base::TimeDelta kZero; - const base::TimeDelta kDurationA = base::TimeDelta::FromMicroseconds(1337); - const base::TimeDelta kDurationB = base::TimeDelta::FromMicroseconds(1234); + const base::TimeDelta kDurationA = base::Microseconds(1337); + const base::TimeDelta kDurationB = base::Microseconds(1234); scoped_refptr<DataBuffer> buffer = new DataBuffer(0); EXPECT_TRUE(buffer->duration() == kZero); diff --git a/chromium/media/base/data_source.h b/chromium/media/base/data_source.h index 6ccfebf1eab..9a63c1302a9 100644 --- a/chromium/media/base/data_source.h +++ b/chromium/media/base/data_source.h @@ -21,6 +21,10 @@ class MEDIA_EXPORT DataSource { enum { kReadError = -1, kAborted = -2 }; DataSource(); + + DataSource(const DataSource&) = delete; + DataSource& operator=(const DataSource&) = delete; + virtual ~DataSource(); // Reads |size| bytes from |position| into |data|. And when the read is done @@ -57,9 +61,6 @@ class MEDIA_EXPORT DataSource { // By default this just returns GetSize(). virtual int64_t GetMemoryUsage(); - - private: - DISALLOW_COPY_AND_ASSIGN(DataSource); }; } // namespace media diff --git a/chromium/media/base/decode_status.h b/chromium/media/base/decode_status.h index d17d8573f71..0f05be295f4 100644 --- a/chromium/media/base/decode_status.h +++ b/chromium/media/base/decode_status.h @@ -9,12 +9,11 @@ #include "media/base/decoder_buffer.h" #include "media/base/media_export.h" +#include "media/base/status.h" #include "media/base/status_codes.h" namespace media { -class Status; - // TODO(crbug.com/1129662): This is temporary, to allow DecodeStatus::OK to // work, while we replace DecodeStatus with actual status codes. using DecodeStatus = StatusCode; @@ -37,6 +36,10 @@ class MEDIA_EXPORT ScopedDecodeTrace { ScopedDecodeTrace(const char* trace_name, bool is_key_frame, base::TimeDelta timestamp); + + ScopedDecodeTrace(const ScopedDecodeTrace&) = delete; + ScopedDecodeTrace& operator=(const ScopedDecodeTrace&) = delete; + ~ScopedDecodeTrace(); // Completes the Decode() trace with the given status. @@ -45,8 +48,6 @@ class MEDIA_EXPORT ScopedDecodeTrace { private: const char* trace_name_; bool closed_ = false; - - DISALLOW_COPY_AND_ASSIGN(ScopedDecodeTrace); }; } // namespace media diff --git a/chromium/media/base/decoder_buffer_queue.h b/chromium/media/base/decoder_buffer_queue.h index 2263234d50c..780d71f6342 100644 --- a/chromium/media/base/decoder_buffer_queue.h +++ b/chromium/media/base/decoder_buffer_queue.h @@ -27,6 +27,10 @@ class DecoderBuffer; class MEDIA_EXPORT DecoderBufferQueue { public: DecoderBufferQueue(); + + DecoderBufferQueue(const DecoderBufferQueue&) = delete; + DecoderBufferQueue& operator=(const DecoderBufferQueue&) = delete; + ~DecoderBufferQueue(); // Push |buffer| to the end of the queue. If |buffer| is queued out of order @@ -69,8 +73,6 @@ class MEDIA_EXPORT DecoderBufferQueue { // Total size in bytes of buffers in the queue. size_t data_size_; - - DISALLOW_COPY_AND_ASSIGN(DecoderBufferQueue); }; } // namespace media diff --git a/chromium/media/base/decoder_buffer_queue_unittest.cc b/chromium/media/base/decoder_buffer_queue_unittest.cc index be2a4b2b3a3..ce233a15dc7 100644 --- a/chromium/media/base/decoder_buffer_queue_unittest.cc +++ b/chromium/media/base/decoder_buffer_queue_unittest.cc @@ -12,7 +12,7 @@ namespace media { static base::TimeDelta ToTimeDelta(int seconds) { if (seconds < 0) return kNoTimestamp; - return base::TimeDelta::FromSeconds(seconds); + return base::Seconds(seconds); } // Helper to create buffers with specified timestamp in seconds. diff --git a/chromium/media/base/decoder_factory.h b/chromium/media/base/decoder_factory.h index fee2f69ff28..7013aae4fae 100644 --- a/chromium/media/base/decoder_factory.h +++ b/chromium/media/base/decoder_factory.h @@ -33,6 +33,10 @@ class VideoDecoder; class MEDIA_EXPORT DecoderFactory { public: DecoderFactory(); + + DecoderFactory(const DecoderFactory&) = delete; + DecoderFactory& operator=(const DecoderFactory&) = delete; + virtual ~DecoderFactory(); // Creates audio decoders and append them to the end of |audio_decoders|. @@ -58,9 +62,6 @@ class MEDIA_EXPORT DecoderFactory { RequestOverlayInfoCB request_overlay_info_cb, const gfx::ColorSpace& target_color_space, std::vector<std::unique_ptr<VideoDecoder>>* video_decoders); - - private: - DISALLOW_COPY_AND_ASSIGN(DecoderFactory); }; } // namespace media diff --git a/chromium/media/base/decryptor.h b/chromium/media/base/decryptor.h index d88aac96da2..bbda9cdf4db 100644 --- a/chromium/media/base/decryptor.h +++ b/chromium/media/base/decryptor.h @@ -42,6 +42,10 @@ class MEDIA_EXPORT Decryptor { enum StreamType { kAudio, kVideo, kStreamTypeMax = kVideo }; Decryptor(); + + Decryptor(const Decryptor&) = delete; + Decryptor& operator=(const Decryptor&) = delete; + virtual ~Decryptor(); // Indicates completion of a decryption operation. @@ -148,9 +152,6 @@ class MEDIA_EXPORT Decryptor { // Returns whether or not the decryptor implementation supports decrypt-only. virtual bool CanAlwaysDecrypt(); - - private: - DISALLOW_COPY_AND_ASSIGN(Decryptor); }; } // namespace media diff --git a/chromium/media/base/demuxer.h b/chromium/media/base/demuxer.h index e048fca2d9c..27d36ba4add 100644 --- a/chromium/media/base/demuxer.h +++ b/chromium/media/base/demuxer.h @@ -80,6 +80,10 @@ class MEDIA_EXPORT Demuxer : public MediaResource { }; Demuxer(); + + Demuxer(const Demuxer&) = delete; + Demuxer& operator=(const Demuxer&) = delete; + ~Demuxer() override; // Returns the name of the demuxer for logging purpose. @@ -165,9 +169,6 @@ class MEDIA_EXPORT Demuxer : public MediaResource { const std::vector<MediaTrack::Id>& track_ids, base::TimeDelta curr_time, TrackChangeCB change_completed_cb) = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(Demuxer); }; } // namespace media diff --git a/chromium/media/base/demuxer_memory_limit_cast.cc b/chromium/media/base/demuxer_memory_limit_cast.cc index a4c2775c686..3020f48727e 100644 --- a/chromium/media/base/demuxer_memory_limit_cast.cc +++ b/chromium/media/base/demuxer_memory_limit_cast.cc @@ -17,10 +17,10 @@ size_t GetDemuxerStreamAudioMemoryLimit( DCHECK(audio_config->IsValidConfig()); switch (audio_config->codec()) { - case kCodecEAC3: - case kCodecAC3: + case AudioCodec::kEAC3: + case AudioCodec::kAC3: return internal::kDemuxerStreamAudioMemoryLimitMedium; - case kCodecAAC: + case AudioCodec::kAAC: if (ChannelLayoutToChannelCount(audio_config->channel_layout()) >= 5) { return internal::kDemuxerStreamAudioMemoryLimitMedium; } @@ -42,9 +42,9 @@ size_t GetDemuxerStreamVideoMemoryLimit( } DCHECK(video_config->IsValidConfig()); switch (video_config->codec()) { - case kCodecVP9: - case kCodecHEVC: - case kCodecDolbyVision: + case VideoCodec::kVP9: + case VideoCodec::kHEVC: + case VideoCodec::kDolbyVision: return internal::kDemuxerStreamVideoMemoryLimitMedium; default: return internal::kDemuxerStreamVideoMemoryLimitLow; diff --git a/chromium/media/base/demuxer_memory_limit_cast_unittest.cc b/chromium/media/base/demuxer_memory_limit_cast_unittest.cc index 4dbe6d4308b..2f150da71dc 100644 --- a/chromium/media/base/demuxer_memory_limit_cast_unittest.cc +++ b/chromium/media/base/demuxer_memory_limit_cast_unittest.cc @@ -21,28 +21,28 @@ TEST(DemuxerMemoryLimitCastTest, GetDemuxerStreamAudioMemoryLimit) { internal::kDemuxerStreamAudioMemoryLimitLow); AudioDecoderConfig audio_config_opus( - AudioCodec::kCodecOpus, SampleFormat::kSampleFormatS16, + AudioCodec::kOpus, SampleFormat::kSampleFormatS16, ChannelLayout::CHANNEL_LAYOUT_STEREO, 5000 /* samples_per_second */, EmptyExtraData(), EncryptionScheme::kUnencrypted); EXPECT_EQ(GetDemuxerStreamAudioMemoryLimit(&audio_config_opus), internal::kDemuxerStreamAudioMemoryLimitLow); AudioDecoderConfig audio_config_ac3( - AudioCodec::kCodecAC3, SampleFormat::kSampleFormatS16, + AudioCodec::kAC3, SampleFormat::kSampleFormatS16, ChannelLayout::CHANNEL_LAYOUT_STEREO, 5000 /* samples_per_second */, EmptyExtraData(), EncryptionScheme::kUnencrypted); EXPECT_EQ(GetDemuxerStreamAudioMemoryLimit(&audio_config_ac3), internal::kDemuxerStreamAudioMemoryLimitMedium); AudioDecoderConfig audio_config_aac_1( - AudioCodec::kCodecAAC, SampleFormat::kSampleFormatS16, + AudioCodec::kAAC, SampleFormat::kSampleFormatS16, ChannelLayout::CHANNEL_LAYOUT_5_0, 5000 /* samples_per_second */, EmptyExtraData(), EncryptionScheme::kUnencrypted); EXPECT_EQ(GetDemuxerStreamAudioMemoryLimit(&audio_config_aac_1), internal::kDemuxerStreamAudioMemoryLimitMedium); AudioDecoderConfig audio_config_aac_2( - AudioCodec::kCodecAAC, SampleFormat::kSampleFormatS16, + AudioCodec::kAAC, SampleFormat::kSampleFormatS16, ChannelLayout::CHANNEL_LAYOUT_STEREO, 5000 /* samples_per_second */, EmptyExtraData(), EncryptionScheme::kUnencrypted); EXPECT_EQ(GetDemuxerStreamAudioMemoryLimit(&audio_config_aac_2), @@ -61,7 +61,7 @@ TEST(DemuxerMemoryLimitCastTest, GetDemuxerStreamVideoMemoryLimit) { internal::kDemuxerStreamVideoMemoryLimitLow); VideoDecoderConfig video_config( - kCodecVP8, VIDEO_CODEC_PROFILE_UNKNOWN, + VideoCodec::kVP8, VIDEO_CODEC_PROFILE_UNKNOWN, VideoDecoderConfig::AlphaMode::kIsOpaque, VideoColorSpace(), kNoTransformation, kCodedSize, kVisibleRect, kNaturalSize, EmptyExtraData(), EncryptionScheme::kUnencrypted); @@ -75,7 +75,7 @@ TEST(DemuxerMemoryLimitCastTest, GetDemuxerStreamVideoMemoryLimit) { Demuxer::DemuxerTypes::kMediaUrlDemuxer, &video_config), internal::kDemuxerStreamVideoMemoryLimitLow); - video_config.Initialize(kCodecVP9, VIDEO_CODEC_PROFILE_UNKNOWN, + video_config.Initialize(VideoCodec::kVP9, VIDEO_CODEC_PROFILE_UNKNOWN, VideoDecoderConfig::AlphaMode::kIsOpaque, VideoColorSpace(), kNoTransformation, kCodedSize, kVisibleRect, kNaturalSize, EmptyExtraData(), diff --git a/chromium/media/base/encryption_scheme.cc b/chromium/media/base/encryption_scheme.cc index 0fd36097378..12728f71c89 100644 --- a/chromium/media/base/encryption_scheme.cc +++ b/chromium/media/base/encryption_scheme.cc @@ -9,17 +9,21 @@ namespace media { -std::ostream& operator<<(std::ostream& os, EncryptionScheme scheme) { - switch (scheme) { +std::string GetEncryptionSchemeName(EncryptionScheme encryption_scheme) { + switch (encryption_scheme) { case EncryptionScheme::kUnencrypted: - return os << "Unencrypted"; + return "Unencrypted"; case EncryptionScheme::kCenc: - return os << "CENC"; + return "CENC"; case EncryptionScheme::kCbcs: - return os << "CBCS"; + return "CBCS"; default: - return os << "Unknown"; + return "Unknown"; } } +std::ostream& operator<<(std::ostream& os, EncryptionScheme encryption_scheme) { + return os << GetEncryptionSchemeName(encryption_scheme); +} + } // namespace media diff --git a/chromium/media/base/encryption_scheme.h b/chromium/media/base/encryption_scheme.h index 00bd931ea17..24a7141f9e0 100644 --- a/chromium/media/base/encryption_scheme.h +++ b/chromium/media/base/encryption_scheme.h @@ -6,6 +6,7 @@ #define MEDIA_BASE_ENCRYPTION_SCHEME_H_ #include <iosfwd> +#include <string> #include "media/base/media_export.h" @@ -21,6 +22,10 @@ enum class EncryptionScheme { }; // For logging use only. +MEDIA_EXPORT std::string GetEncryptionSchemeName( + EncryptionScheme encryption_scheme); + +// For logging use only. MEDIA_EXPORT std::ostream& operator<<(std::ostream& os, EncryptionScheme encryption_scheme); diff --git a/chromium/media/base/fake_audio_render_callback.h b/chromium/media/base/fake_audio_render_callback.h index c62be387809..bc7383c132b 100644 --- a/chromium/media/base/fake_audio_render_callback.h +++ b/chromium/media/base/fake_audio_render_callback.h @@ -25,6 +25,10 @@ class FakeAudioRenderCallback // where x = [|number_of_frames| * m, |number_of_frames| * (m + 1)] and m = // the number of Render() calls fulfilled thus far. FakeAudioRenderCallback(double step, int sample_rate); + + FakeAudioRenderCallback(const FakeAudioRenderCallback&) = delete; + FakeAudioRenderCallback& operator=(const FakeAudioRenderCallback&) = delete; + ~FakeAudioRenderCallback() override; // Renders a sine wave into the provided audio data buffer. If |half_fill_| @@ -63,8 +67,6 @@ class FakeAudioRenderCallback int last_channel_count_; double volume_; int sample_rate_; - - DISALLOW_COPY_AND_ASSIGN(FakeAudioRenderCallback); }; } // namespace media diff --git a/chromium/media/base/fake_audio_worker.h b/chromium/media/base/fake_audio_worker.h index 13ba742c89f..1729c669827 100644 --- a/chromium/media/base/fake_audio_worker.h +++ b/chromium/media/base/fake_audio_worker.h @@ -36,6 +36,10 @@ class MEDIA_EXPORT FakeAudioWorker { FakeAudioWorker( const scoped_refptr<base::SingleThreadTaskRunner>& worker_task_runner, const AudioParameters& params); + + FakeAudioWorker(const FakeAudioWorker&) = delete; + FakeAudioWorker& operator=(const FakeAudioWorker&) = delete; + ~FakeAudioWorker(); // Start executing |worker_cb| at a regular intervals. Stop() must be called @@ -57,8 +61,6 @@ class MEDIA_EXPORT FakeAudioWorker { // after the call to Stop() (on the main thread) returns. class Worker; const scoped_refptr<Worker> worker_; - - DISALLOW_COPY_AND_ASSIGN(FakeAudioWorker); }; } // namespace media diff --git a/chromium/media/base/fake_audio_worker_unittest.cc b/chromium/media/base/fake_audio_worker_unittest.cc index e9977e58334..e2e6e2d90dd 100644 --- a/chromium/media/base/fake_audio_worker_unittest.cc +++ b/chromium/media/base/fake_audio_worker_unittest.cc @@ -35,11 +35,14 @@ class FakeAudioWorkerTest : public testing::Test { FakeAudioWorkerTest() : params_(AudioParameters::AUDIO_FAKE, CHANNEL_LAYOUT_STEREO, 44100, 128), fake_worker_(task_environment_.GetMainThreadTaskRunner(), params_) { - time_between_callbacks_ = base::TimeDelta::FromMicroseconds( + time_between_callbacks_ = base::Microseconds( params_.frames_per_buffer() * base::Time::kMicrosecondsPerSecond / static_cast<float>(params_.sample_rate())); } + FakeAudioWorkerTest(const FakeAudioWorkerTest&) = delete; + FakeAudioWorkerTest& operator=(const FakeAudioWorkerTest&) = delete; + ~FakeAudioWorkerTest() override = default; void CalledByFakeWorker(base::TimeTicks ideal_time, base::TimeTicks now) { @@ -93,9 +96,6 @@ class FakeAudioWorkerTest : public testing::Test { FakeAudioWorker fake_worker_; base::TimeDelta time_between_callbacks_; std::vector<base::TimeTicks> callbacks_; - - private: - DISALLOW_COPY_AND_ASSIGN(FakeAudioWorkerTest); }; TEST_F(FakeAudioWorkerTest, FakeBasicCallback) { @@ -181,13 +181,17 @@ class FakeAudioWorkerMockTaskTest : public testing::Test { fake_worker_(task_runner_, params_) { DCHECK(!global_clock_); global_clock_ = task_runner_->GetMockTickClock(); - time_between_callbacks_ = base::TimeDelta::FromMicroseconds( + time_between_callbacks_ = base::Microseconds( params_.frames_per_buffer() * base::Time::kMicrosecondsPerSecond / static_cast<float>(params_.sample_rate())); clock_overrides_ = std::make_unique<base::subtle::ScopedTimeClockOverrides>( nullptr, TimeTicksOverride, nullptr); } + FakeAudioWorkerMockTaskTest(const FakeAudioWorkerMockTaskTest&) = delete; + FakeAudioWorkerMockTaskTest& operator=(const FakeAudioWorkerMockTaskTest&) = + delete; + ~FakeAudioWorkerMockTaskTest() override { global_clock_ = nullptr; } void CalledByFakeWorker(base::TimeTicks ideal_time, base::TimeTicks now) { @@ -225,9 +229,6 @@ class FakeAudioWorkerMockTaskTest : public testing::Test { DCHECK(global_clock_); return global_clock_->NowTicks(); } - - private: - DISALLOW_COPY_AND_ASSIGN(FakeAudioWorkerMockTaskTest); }; const base::TickClock* FakeAudioWorkerMockTaskTest::global_clock_ = nullptr; diff --git a/chromium/media/base/fake_demuxer_stream.cc b/chromium/media/base/fake_demuxer_stream.cc index 76865ead473..3577c27cc89 100644 --- a/chromium/media/base/fake_demuxer_stream.cc +++ b/chromium/media/base/fake_demuxer_stream.cc @@ -75,8 +75,8 @@ void FakeDemuxerStream::Initialize() { num_configs_left_ = num_configs_; num_buffers_left_in_current_config_ = num_buffers_in_one_config_; num_buffers_returned_ = 0; - current_timestamp_ = base::TimeDelta::FromMilliseconds(kStartTimestampMs); - duration_ = base::TimeDelta::FromMilliseconds(kDurationMs); + current_timestamp_ = base::Milliseconds(kStartTimestampMs); + duration_ = base::Milliseconds(kDurationMs); next_size_ = start_coded_size_; next_read_num_ = 0; } @@ -172,7 +172,7 @@ void FakeDemuxerStream::SeekToEndOfStream() { void FakeDemuxerStream::UpdateVideoDecoderConfig() { const gfx::Rect kVisibleRect(next_size_.width(), next_size_.height()); video_decoder_config_.Initialize( - kCodecVP8, VIDEO_CODEC_PROFILE_UNKNOWN, + VideoCodec::kVP8, VIDEO_CODEC_PROFILE_UNKNOWN, VideoDecoderConfig::AlphaMode::kIsOpaque, VideoColorSpace(), kNoTransformation, next_size_, kVisibleRect, next_size_, EmptyExtraData(), is_encrypted_ ? EncryptionScheme::kCenc : EncryptionScheme::kUnencrypted); diff --git a/chromium/media/base/fake_demuxer_stream.h b/chromium/media/base/fake_demuxer_stream.h index 0a0a241d22d..959ab3b3589 100644 --- a/chromium/media/base/fake_demuxer_stream.h +++ b/chromium/media/base/fake_demuxer_stream.h @@ -39,6 +39,10 @@ class FakeDemuxerStream : public DemuxerStream { bool is_encrypted, gfx::Size start_coded_size, gfx::Vector2dF coded_size_delta); + + FakeDemuxerStream(const FakeDemuxerStream&) = delete; + FakeDemuxerStream& operator=(const FakeDemuxerStream&) = delete; + ~FakeDemuxerStream() override; // DemuxerStream implementation. @@ -116,8 +120,6 @@ class FakeDemuxerStream : public DemuxerStream { // Zero-based number indicating which read operation should be held. -1 means // no read shall be held. int read_to_hold_; - - DISALLOW_COPY_AND_ASSIGN(FakeDemuxerStream); }; class FakeMediaResource : public MediaResource { @@ -126,6 +128,10 @@ class FakeMediaResource : public MediaResource { FakeMediaResource(int num_video_configs, int num_video_buffers_in_one_config, bool is_video_encrypted); + + FakeMediaResource(const FakeMediaResource&) = delete; + FakeMediaResource& operator=(const FakeMediaResource&) = delete; + ~FakeMediaResource() override; // MediaResource implementation. @@ -133,8 +139,6 @@ class FakeMediaResource : public MediaResource { private: FakeDemuxerStream fake_video_stream_; - - DISALLOW_COPY_AND_ASSIGN(FakeMediaResource); }; } // namespace media diff --git a/chromium/media/base/fake_demuxer_stream_unittest.cc b/chromium/media/base/fake_demuxer_stream_unittest.cc index 5108d788f30..17b2194da2f 100644 --- a/chromium/media/base/fake_demuxer_stream_unittest.cc +++ b/chromium/media/base/fake_demuxer_stream_unittest.cc @@ -30,6 +30,10 @@ class FakeDemuxerStreamTest : public testing::Test { : status_(DemuxerStream::kAborted), read_pending_(false), num_buffers_received_(0) {} + + FakeDemuxerStreamTest(const FakeDemuxerStreamTest&) = delete; + FakeDemuxerStreamTest& operator=(const FakeDemuxerStreamTest&) = delete; + ~FakeDemuxerStreamTest() override = default; void BufferReady(DemuxerStream::Status status, @@ -188,9 +192,6 @@ class FakeDemuxerStreamTest : public testing::Test { scoped_refptr<DecoderBuffer> buffer_; bool read_pending_; int num_buffers_received_; - - private: - DISALLOW_COPY_AND_ASSIGN(FakeDemuxerStreamTest); }; TEST_F(FakeDemuxerStreamTest, Read_OneConfig) { diff --git a/chromium/media/base/fake_single_thread_task_runner.cc b/chromium/media/base/fake_single_thread_task_runner.cc index f2dcd5f09d5..c050d5ba6d5 100644 --- a/chromium/media/base/fake_single_thread_task_runner.cc +++ b/chromium/media/base/fake_single_thread_task_runner.cc @@ -36,8 +36,8 @@ bool FakeSingleThreadTaskRunner::PostDelayedTask( // scheduling delayed tasks to be run via base::MessageLoop in a // multi-threaded application. if (!tasks_.empty()) { - const auto after_it = tasks_.lower_bound( - TaskKey(run_time + base::TimeDelta::FromMicroseconds(1), 0)); + const auto after_it = + tasks_.lower_bound(TaskKey(run_time + base::Microseconds(1), 0)); if (after_it != tasks_.begin()) { auto it = after_it; --it; diff --git a/chromium/media/base/fake_text_track_stream.h b/chromium/media/base/fake_text_track_stream.h index 83b087e2b92..35839a0a0df 100644 --- a/chromium/media/base/fake_text_track_stream.h +++ b/chromium/media/base/fake_text_track_stream.h @@ -22,6 +22,10 @@ namespace media { class FakeTextTrackStream : public DemuxerStream { public: FakeTextTrackStream(); + + FakeTextTrackStream(const FakeTextTrackStream&) = delete; + FakeTextTrackStream& operator=(const FakeTextTrackStream&) = delete; + ~FakeTextTrackStream() override; // DemuxerStream implementation. @@ -48,8 +52,6 @@ class FakeTextTrackStream : public DemuxerStream { scoped_refptr<base::SingleThreadTaskRunner> task_runner_; ReadCB read_cb_; bool stopping_; - - DISALLOW_COPY_AND_ASSIGN(FakeTextTrackStream); }; } // namespace media diff --git a/chromium/media/base/feedback_signal_accumulator_unittest.cc b/chromium/media/base/feedback_signal_accumulator_unittest.cc index 2a28fe7d308..d6c11a91673 100644 --- a/chromium/media/base/feedback_signal_accumulator_unittest.cc +++ b/chromium/media/base/feedback_signal_accumulator_unittest.cc @@ -11,9 +11,9 @@ namespace media { class FeedbackSignalAccumulatorTest : public ::testing::Test { public: FeedbackSignalAccumulatorTest() - : half_life_(base::TimeDelta::FromSeconds(1)), + : half_life_(base::Seconds(1)), acc_(half_life_), - t_(base::TimeTicks() + base::TimeDelta::FromSeconds(120)) { + t_(base::TimeTicks() + base::Seconds(120)) { acc_.Reset(0.0, t_); } @@ -45,14 +45,12 @@ TEST_F(FeedbackSignalAccumulatorTest, DoesNotUpdateIfBeforeResetTime) { ASSERT_EQ(0.0, acc_.current()); ASSERT_EQ(t_, acc_.update_time()); - const base::TimeTicks one_usec_before = - t_ - base::TimeDelta::FromMicroseconds(1); + const base::TimeTicks one_usec_before = t_ - base::Microseconds(1); ASSERT_FALSE(acc_.Update(1.0, one_usec_before)); ASSERT_EQ(0.0, acc_.current()); ASSERT_EQ(t_, acc_.update_time()); - const base::TimeTicks one_usec_after = - t_ + base::TimeDelta::FromMicroseconds(1); + const base::TimeTicks one_usec_after = t_ + base::Microseconds(1); ASSERT_TRUE(acc_.Update(1.0, one_usec_after)); ASSERT_LT(0.0, acc_.current()); ASSERT_EQ(one_usec_after, acc_.update_time()); diff --git a/chromium/media/base/frame_rate_estimator_unittest.cc b/chromium/media/base/frame_rate_estimator_unittest.cc index 4701c3bd03a..2ba25e6ab5d 100644 --- a/chromium/media/base/frame_rate_estimator_unittest.cc +++ b/chromium/media/base/frame_rate_estimator_unittest.cc @@ -26,9 +26,7 @@ class FrameRateEstimatorTest : public testing::TestWithParam<FpsPair> { int low_fps() const { return std::get<0>(GetParam()); } int high_fps() const { return std::get<1>(GetParam()); } - base::TimeDelta duration(int fps) { - return base::TimeDelta::FromSecondsD(1.0 / fps); - } + base::TimeDelta duration(int fps) { return base::Seconds(1.0 / fps); } FrameRateEstimator estimator_; }; diff --git a/chromium/media/base/ipc/media_param_traits_macros.h b/chromium/media/base/ipc/media_param_traits_macros.h index 0d06c006ec0..0343a90c3bc 100644 --- a/chromium/media/base/ipc/media_param_traits_macros.h +++ b/chromium/media/base/ipc/media_param_traits_macros.h @@ -53,7 +53,7 @@ IPC_ENUM_TRAITS_MAX_VALUE(blink::WebFullscreenVideoStatus, blink::WebFullscreenVideoStatus::kMaxValue) -IPC_ENUM_TRAITS_MAX_VALUE(media::AudioCodec, media::AudioCodec::kAudioCodecMax) +IPC_ENUM_TRAITS_MAX_VALUE(media::AudioCodec, media::AudioCodec::kMaxValue) IPC_ENUM_TRAITS_MAX_VALUE(media::AudioCodecProfile, media::AudioCodecProfile::kMaxValue) @@ -117,7 +117,7 @@ IPC_ENUM_TRAITS_MAX_VALUE(media::PipelineStatus, IPC_ENUM_TRAITS_MAX_VALUE(media::SampleFormat, media::kSampleFormatMax) -IPC_ENUM_TRAITS_MAX_VALUE(media::VideoCodec, media::kVideoCodecMax) +IPC_ENUM_TRAITS_MAX_VALUE(media::VideoCodec, media::VideoCodec::kMaxValue) IPC_ENUM_TRAITS_MAX_VALUE(media::WaitingReason, media::WaitingReason::kMaxValue) diff --git a/chromium/media/base/key_systems.cc b/chromium/media/base/key_systems.cc index 9bfc335fb03..9205d7a8923 100644 --- a/chromium/media/base/key_systems.cc +++ b/chromium/media/base/key_systems.cc @@ -63,19 +63,19 @@ static const MimeTypeToCodecs kMimeTypeToCodecsMap[] = { EmeCodec ToAudioEmeCodec(AudioCodec codec) { switch (codec) { - case kCodecAAC: + case AudioCodec::kAAC: return EME_CODEC_AAC; - case kCodecVorbis: + case AudioCodec::kVorbis: return EME_CODEC_VORBIS; - case kCodecFLAC: + case AudioCodec::kFLAC: return EME_CODEC_FLAC; - case kCodecOpus: + case AudioCodec::kOpus: return EME_CODEC_OPUS; - case kCodecEAC3: + case AudioCodec::kEAC3: return EME_CODEC_EAC3; - case kCodecAC3: + case AudioCodec::kAC3: return EME_CODEC_AC3; - case kCodecMpegHAudio: + case AudioCodec::kMpegHAudio: return EME_CODEC_MPEG_H_AUDIO; default: DVLOG(1) << "Unsupported AudioCodec " << codec; @@ -85,11 +85,11 @@ EmeCodec ToAudioEmeCodec(AudioCodec codec) { EmeCodec ToVideoEmeCodec(VideoCodec codec, VideoCodecProfile profile) { switch (codec) { - case kCodecH264: + case VideoCodec::kH264: return EME_CODEC_AVC1; - case kCodecVP8: + case VideoCodec::kVP8: return EME_CODEC_VP8; - case kCodecVP9: + case VideoCodec::kVP9: // ParseVideoCodecString() returns VIDEO_CODEC_PROFILE_UNKNOWN for "vp9" // and "vp9.0". Since these codecs are essentially the same as profile 0, // return EME_CODEC_VP9_PROFILE0. @@ -102,14 +102,14 @@ EmeCodec ToVideoEmeCodec(VideoCodec codec, VideoCodecProfile profile) { // Profile 1 and 3 not supported by EME. See https://crbug.com/898298. return EME_CODEC_NONE; } - case kCodecHEVC: + case VideoCodec::kHEVC: // Only handle Main and Main10 profiles for HEVC. if (profile == HEVCPROFILE_MAIN) return EME_CODEC_HEVC_PROFILE_MAIN; if (profile == HEVCPROFILE_MAIN10) return EME_CODEC_HEVC_PROFILE_MAIN10; return EME_CODEC_NONE; - case kCodecDolbyVision: + case VideoCodec::kDolbyVision: // Only profiles 0, 4, 5, 7, 8, 9 are valid. Profile 0 and 9 are encoded // based on AVC while profile 4, 5, 7 and 8 are based on HEVC. if (profile == DOLBYVISION_PROFILE0 || profile == DOLBYVISION_PROFILE9) { @@ -122,7 +122,7 @@ EmeCodec ToVideoEmeCodec(VideoCodec codec, VideoCodecProfile profile) { } else { return EME_CODEC_NONE; } - case kCodecAV1: + case VideoCodec::kAV1: return EME_CODEC_AV1; default: DVLOG(1) << "Unsupported VideoCodec " << codec; @@ -381,7 +381,7 @@ EmeCodec KeySystemsImpl::GetEmeCodecForString( return iter->second; if (media_type == EmeMediaType::AUDIO) { - AudioCodec audio_codec = kUnknownAudioCodec; + AudioCodec audio_codec = AudioCodec::kUnknown; ParseAudioCodecString(container_mime_type, codec_string, &is_ambiguous, &audio_codec); DVLOG(3) << "Audio codec = " << audio_codec; @@ -396,7 +396,7 @@ EmeCodec KeySystemsImpl::GetEmeCodecForString( // exceptions where we need to know the profile. For example, for VP9, there // are older CDMs only supporting profile 0, hence EmeCodec differentiate // between VP9 profile 0 and higher profiles. - VideoCodec video_codec = kUnknownVideoCodec; + VideoCodec video_codec = VideoCodec::kUnknown; VideoCodecProfile profile = VIDEO_CODEC_PROFILE_UNKNOWN; uint8_t level = 0; VideoColorSpace color_space; diff --git a/chromium/media/base/key_systems_unittest.cc b/chromium/media/base/key_systems_unittest.cc index 4a21bb67c4b..1d696f28a76 100644 --- a/chromium/media/base/key_systems_unittest.cc +++ b/chromium/media/base/key_systems_unittest.cc @@ -14,6 +14,7 @@ #include "base/check.h" #include "base/notreached.h" +#include "build/build_config.h" #include "media/base/audio_parameters.h" #include "media/base/decrypt_config.h" #include "media/base/eme_constants.h" diff --git a/chromium/media/base/loopback_audio_converter.h b/chromium/media/base/loopback_audio_converter.h index 21815f0ac0d..c691f90ded6 100644 --- a/chromium/media/base/loopback_audio_converter.h +++ b/chromium/media/base/loopback_audio_converter.h @@ -22,6 +22,9 @@ class LoopbackAudioConverter : public AudioConverter::InputCallback { const AudioParameters& output_params, bool disable_fifo); + LoopbackAudioConverter(const LoopbackAudioConverter&) = delete; + LoopbackAudioConverter& operator=(const LoopbackAudioConverter&) = delete; + ~LoopbackAudioConverter() override; void AddInput(AudioConverter::InputCallback* input) { @@ -38,8 +41,6 @@ class LoopbackAudioConverter : public AudioConverter::InputCallback { double ProvideInput(AudioBus* audio_bus, uint32_t frames_delayed) override; AudioConverter audio_converter_; - - DISALLOW_COPY_AND_ASSIGN(LoopbackAudioConverter); }; } // namespace media diff --git a/chromium/media/base/mac/video_frame_mac_unittests.cc b/chromium/media/base/mac/video_frame_mac_unittests.cc index f0b6de5857f..1122f447615 100644 --- a/chromium/media/base/mac/video_frame_mac_unittests.cc +++ b/chromium/media/base/mac/video_frame_mac_unittests.cc @@ -21,7 +21,7 @@ namespace { const int kWidth = 64; const int kHeight = 48; const int kVisibleRectOffset = 8; -const base::TimeDelta kTimestamp = base::TimeDelta::FromMicroseconds(1337); +const base::TimeDelta kTimestamp = base::Microseconds(1337); struct FormatPair { VideoPixelFormat chrome; diff --git a/chromium/media/base/media_content_type.cc b/chromium/media/base/media_content_type.cc index 3fc666b1f47..2d3ca0b83bf 100644 --- a/chromium/media/base/media_content_type.cc +++ b/chromium/media/base/media_content_type.cc @@ -14,7 +14,7 @@ MediaContentType DurationToMediaContentType(base::TimeDelta duration) { // A zero duration indicates that the duration is unknown. "Persistent" type // should be used in this case. return (duration.is_zero() || - duration > base::TimeDelta::FromSeconds(kMinimumContentDurationSecs)) + duration > base::Seconds(kMinimumContentDurationSecs)) ? MediaContentType::Persistent : MediaContentType::Transient; } diff --git a/chromium/media/base/media_drm_storage.h b/chromium/media/base/media_drm_storage.h index d691f232b60..ea71d19d265 100644 --- a/chromium/media/base/media_drm_storage.h +++ b/chromium/media/base/media_drm_storage.h @@ -47,6 +47,10 @@ class MEDIA_EXPORT MediaDrmStorage }; MediaDrmStorage(); + + MediaDrmStorage(const MediaDrmStorage&) = delete; + MediaDrmStorage& operator=(const MediaDrmStorage&) = delete; + virtual ~MediaDrmStorage(); // Callback to return whether the operation succeeded. @@ -94,9 +98,6 @@ class MEDIA_EXPORT MediaDrmStorage // to the storage backend. virtual void RemovePersistentSession(const std::string& session_id, ResultCB result_cb) = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(MediaDrmStorage); }; using CreateStorageCB = diff --git a/chromium/media/base/media_log.h b/chromium/media/base/media_log.h index 46b52ae5587..4cf55ebd2d1 100644 --- a/chromium/media/base/media_log.h +++ b/chromium/media/base/media_log.h @@ -13,6 +13,7 @@ #include <string> #include <utility> +#include "base/gtest_prod_util.h" #include "base/logging.h" #include "base/macros.h" #include "base/memory/ref_counted.h" @@ -53,6 +54,9 @@ class MEDIA_EXPORT MediaLog { static constexpr size_t kLogLimit = 512; #endif + MediaLog(const MediaLog&) = delete; + MediaLog& operator=(const MediaLog&) = delete; + // Constructor is protected, see below. virtual ~MediaLog(); @@ -192,8 +196,6 @@ class MEDIA_EXPORT MediaLog { // The underlying media log. scoped_refptr<ParentLogRecord> parent_log_record_; - - DISALLOW_COPY_AND_ASSIGN(MediaLog); }; // Helper class to make it easier to use MediaLog like DVLOG(). diff --git a/chromium/media/base/media_permission.h b/chromium/media/base/media_permission.h index 4226086ba47..0d0b65c4706 100644 --- a/chromium/media/base/media_permission.h +++ b/chromium/media/base/media_permission.h @@ -23,6 +23,10 @@ class MEDIA_EXPORT MediaPermission { }; MediaPermission(); + + MediaPermission(const MediaPermission&) = delete; + MediaPermission& operator=(const MediaPermission&) = delete; + virtual ~MediaPermission(); // Checks whether |type| is permitted without triggering user interaction @@ -40,9 +44,6 @@ class MEDIA_EXPORT MediaPermission { // the use of Clear Key key systems, which is always allowed as required by // the spec. virtual bool IsEncryptedMediaEnabled() = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(MediaPermission); }; } // namespace media diff --git a/chromium/media/base/media_resource.h b/chromium/media/base/media_resource.h index 567df727f9a..300b1e6aee2 100644 --- a/chromium/media/base/media_resource.h +++ b/chromium/media/base/media_resource.h @@ -30,6 +30,10 @@ class MEDIA_EXPORT MediaResource { }; MediaResource(); + + MediaResource(const MediaResource&) = delete; + MediaResource& operator=(const MediaResource&) = delete; + virtual ~MediaResource(); virtual MediaResource::Type GetType() const; @@ -62,9 +66,6 @@ class MEDIA_EXPORT MediaResource { // This method could be refactored if WMPI was aware of the concrete type of // Demuxer* it is dealing with. virtual void ForwardDurationChangeToDemuxerHost(base::TimeDelta duration); - - private: - DISALLOW_COPY_AND_ASSIGN(MediaResource); }; } // namespace media diff --git a/chromium/media/base/media_serializers.h b/chromium/media/base/media_serializers.h index e6c26ab66cf..b44da27a5e0 100644 --- a/chromium/media/base/media_serializers.h +++ b/chromium/media/base/media_serializers.h @@ -61,6 +61,16 @@ struct MediaSerializer<std::vector<VecType>> { } }; +// Serialize unique pointers +template <typename T> +struct MediaSerializer<std::unique_ptr<T>> { + static base::Value Serialize(const std::unique_ptr<T>& ptr) { + if (!ptr) + return base::Value("nullptr"); + return MediaSerializer<T>::Serialize(*ptr); + } +}; + // serialize optional types template <typename OptType> struct MediaSerializer<absl::optional<OptType>> { @@ -89,7 +99,18 @@ struct MediaSerializer<double> { template <> struct MediaSerializer<int64_t> { static inline base::Value Serialize(int64_t value) { - return MediaSerializer<double>::Serialize(static_cast<double>(value)); + std::stringstream stream; + stream << "0x" << std::hex << value; + return MediaSerializer<std::string>::Serialize(stream.str()); + } +}; + +template <> +struct MediaSerializer<uint32_t> { + static inline base::Value Serialize(uint32_t value) { + std::stringstream stream; + stream << "0x" << std::hex << value; + return MediaSerializer<std::string>::Serialize(stream.str()); } }; @@ -419,18 +440,30 @@ struct MediaSerializer<StatusCode> { }; // Class (complex) -template <> -struct MediaSerializer<Status> { - static base::Value Serialize(const Status& status) { +template <typename T> +struct MediaSerializer<TypedStatus<T>> { + static base::Value Serialize(const TypedStatus<T>& status) { + // TODO: replace this with some kind of static "description" + // of the default type, instead of "Ok". if (status.is_ok()) return base::Value("Ok"); + return MediaSerialize(status.data_); + } +}; +// Class (complex) +template <> +struct MediaSerializer<StatusData> { + static base::Value Serialize(const StatusData& status) { base::Value result(base::Value::Type::DICTIONARY); - FIELD_SERIALIZE("status_code", status.code()); - FIELD_SERIALIZE("status_message", status.message()); - FIELD_SERIALIZE("stack", status.data_->frames); - FIELD_SERIALIZE("data", status.data_->data); - FIELD_SERIALIZE("causes", status.data_->causes); + // TODO: replace code with a stringified version, since + // this representation will only go to medialog anyway. + FIELD_SERIALIZE("code", status.code); + FIELD_SERIALIZE("group", status.group); + FIELD_SERIALIZE("message", status.message); + FIELD_SERIALIZE("stack", status.frames); + FIELD_SERIALIZE("data", status.data); + FIELD_SERIALIZE("causes", status.causes); return result; } }; diff --git a/chromium/media/base/media_serializers_unittest.cc b/chromium/media/base/media_serializers_unittest.cc index 466155569b8..53407ded0f0 100644 --- a/chromium/media/base/media_serializers_unittest.cc +++ b/chromium/media/base/media_serializers_unittest.cc @@ -30,7 +30,7 @@ TEST(MediaSerializersTest, BaseTypes) { const char* g = "bar"; ASSERT_EQ(ToString(MediaSerialize(a)), "1"); - ASSERT_EQ(ToString(MediaSerialize(b)), "2.0"); + ASSERT_EQ(ToString(MediaSerialize(b)), "0x2"); ASSERT_EQ(ToString(MediaSerialize(c)), "false"); ASSERT_EQ(ToString(MediaSerialize(d)), "100.0"); ASSERT_EQ(ToString(MediaSerialize(e)), "4523.0"); diff --git a/chromium/media/base/media_switches.cc b/chromium/media/base/media_switches.cc index 9b32170f896..5f43904c668 100644 --- a/chromium/media/base/media_switches.cc +++ b/chromium/media/base/media_switches.cc @@ -218,6 +218,8 @@ MEDIA_EXPORT extern const char kLacrosEnablePlatformHevc[] = "lacros-enable-platform-hevc"; MEDIA_EXPORT extern const char kLacrosUseChromeosProtectedMedia[] = "lacros-use-chromeos-protected-media"; +MEDIA_EXPORT extern const char kLacrosUseChromeosProtectedAv1[] = + "lacros-use-chromeos-protected-av1"; #endif // defined(OS_CHROMEOS) namespace autoplay { @@ -257,6 +259,10 @@ const base::Feature kOverlayFullscreenVideo{"overlay-fullscreen-video", const base::Feature kEnableMediaInternals{"enable-media-internals", base::FEATURE_ENABLED_BY_DEFAULT}; +// Enables user control over muting tab audio from the tab strip. +const base::Feature kEnableTabMuting{"enable-tab-muting", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Enable Picture-in-Picture. const base::Feature kPictureInPicture { "PictureInPicture", @@ -283,6 +289,12 @@ const base::Feature kResumeBackgroundVideo { #endif }; +// Experimental: Try to avoid destroying the media player when transferring a +// media element to a new document. This is a work in progress, and may cause +// security and/or stability issues. +const base::Feature kReuseMediaPlayer{"ReuseMediaPlayer", + base::FEATURE_DISABLED_BY_DEFAULT}; + // When enabled, MediaCapabilities will check with GPU Video Accelerator // Factories to determine isPowerEfficient = true/false. const base::Feature kMediaCapabilitiesQueryGpuFactories{ @@ -387,23 +399,8 @@ const base::Feature kD3D11VideoDecoderVP9Profile2{ const base::Feature kD3D11VideoDecoderAV1{"D3D11VideoDecoderEnableAV1", base::FEATURE_ENABLED_BY_DEFAULT}; -// Tell D3D11VideoDecoder not to switch the D3D11 device to multi-threaded mode. -// This is to help us track down IGD crashes. -const base::Feature kD3D11VideoDecoderSkipMultithreaded{ - "D3D11VideoDecoderSkipMultithreaded", base::FEATURE_DISABLED_BY_DEFAULT}; - -// If enabled, D3D11VideoDecoder will always copy instead of bind textures. -const base::Feature kD3D11VideoDecoderAlwaysCopy{ - "D3D11VideoDecoderAlwaysCopy", base::FEATURE_DISABLED_BY_DEFAULT}; - -// If enabled, D3D11VideoDecoder may (but is not required to) choose to mark -// VideoFrames as overlayable. -const base::Feature kD3D11VideoDecoderAllowOverlay{ - "D3D11VideoDecoderAllowOverlay", base::FEATURE_ENABLED_BY_DEFAULT}; - -// If enabled, D3D11VideoDecoder will enable HDR support even if the OS doesn't. -const base::Feature kD3D11VideoDecoderForceEnableHDR{ - "D3D11VideoDecoderForceEnableHDR", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kD3D11VideoDecoderUseSharedHandle{ + "D3D11VideoDecoderUseSharedHandle", base::FEATURE_DISABLED_BY_DEFAULT}; // Falls back to other decoders after audio/video decode error happens. The // implementation may choose different strategies on when to fallback. See @@ -454,11 +451,6 @@ constexpr base::FeatureParam<kCrosGlobalMediaControlsPinOptions> kCrosGlobalMediaControlsPinOptions::kHeuristic, &kCrosGlobalMediaControlsParamOptions); -// Allow global media controls notifications to be dragged out into overlay -// notifications. It is no-op if kGlobalMediaControls is not enabled. -const base::Feature kGlobalMediaControlsOverlayControls{ - "GlobalMediaControlsOverlayControls", base::FEATURE_DISABLED_BY_DEFAULT}; - // Show picture-in-picture button in Global Media Controls. const base::Feature kGlobalMediaControlsPictureInPicture { "GlobalMediaControlsPictureInPicture", @@ -543,6 +535,9 @@ const base::Feature kVaapiVP9Encoder{"VaapiVP9Encoder", base::FEATURE_ENABLED_BY_DEFAULT}; #if defined(ARCH_CPU_X86_FAMILY) && BUILDFLAG(IS_CHROMEOS_ASH) +// Enable H264 temporal layer encoding with HW encoder on ChromeOS. +const base::Feature kVaapiH264TemporalLayerHWEncoding{ + "VaapiH264TemporalLayerEncoding", base::FEATURE_ENABLED_BY_DEFAULT}; // Enable VP9 k-SVC decoding with HW decoder for webrtc use case on ChromeOS. const base::Feature kVaapiVp9kSVCHWDecoding{"VaapiVp9kSVCHWDecoding", base::FEATURE_ENABLED_BY_DEFAULT}; @@ -924,8 +919,9 @@ bool IsVideoCaptureAcceleratedJpegDecodingEnabled() { } #if BUILDFLAG(IS_CHROMEOS_ASH) return true; -#endif +#else return false; +#endif } bool IsLiveCaptionFeatureEnabled() { diff --git a/chromium/media/base/media_switches.h b/chromium/media/base/media_switches.h index 4e79508bc27..e09620e4625 100644 --- a/chromium/media/base/media_switches.h +++ b/chromium/media/base/media_switches.h @@ -95,6 +95,7 @@ MEDIA_EXPORT extern const char kEnableClearHevcForTesting[]; MEDIA_EXPORT extern const char kLacrosEnablePlatformEncryptedHevc[]; MEDIA_EXPORT extern const char kLacrosEnablePlatformHevc[]; MEDIA_EXPORT extern const char kLacrosUseChromeosProtectedMedia[]; +MEDIA_EXPORT extern const char kLacrosUseChromeosProtectedAv1[]; #endif // defined(OS_CHROMEOS) namespace autoplay { @@ -129,11 +130,9 @@ MEDIA_EXPORT extern const base::Feature kD3D11VideoDecoder; MEDIA_EXPORT extern const base::Feature kD3D11VideoDecoderIgnoreWorkarounds; MEDIA_EXPORT extern const base::Feature kD3D11VideoDecoderVP9Profile2; MEDIA_EXPORT extern const base::Feature kD3D11VideoDecoderAV1; -MEDIA_EXPORT extern const base::Feature kD3D11VideoDecoderSkipMultithreaded; -MEDIA_EXPORT extern const base::Feature kD3D11VideoDecoderAlwaysCopy; -MEDIA_EXPORT extern const base::Feature kD3D11VideoDecoderAllowOverlay; -MEDIA_EXPORT extern const base::Feature kD3D11VideoDecoderForceEnableHDR; +MEDIA_EXPORT extern const base::Feature kD3D11VideoDecoderUseSharedHandle; MEDIA_EXPORT extern const base::Feature kEnableMediaInternals; +MEDIA_EXPORT extern const base::Feature kEnableTabMuting; MEDIA_EXPORT extern const base::Feature kExposeSwDecodersToWebRTC; MEDIA_EXPORT extern const base::Feature kExternalClearKeyForTesting; MEDIA_EXPORT extern const base::Feature kFFmpegDecodeOpaqueVP8; @@ -144,7 +143,6 @@ MEDIA_EXPORT extern const base::Feature kGlobalMediaControls; MEDIA_EXPORT extern const base::Feature kGlobalMediaControlsAutoDismiss; MEDIA_EXPORT extern const base::Feature kGlobalMediaControlsForCast; MEDIA_EXPORT extern const base::Feature kGlobalMediaControlsForChromeOS; -MEDIA_EXPORT extern const base::Feature kGlobalMediaControlsOverlayControls; MEDIA_EXPORT extern const base::Feature kGlobalMediaControlsPictureInPicture; MEDIA_EXPORT extern const base::Feature kGlobalMediaControlsSeamlessTransfer; MEDIA_EXPORT extern const base::Feature kGlobalMediaControlsModernUI; @@ -182,6 +180,7 @@ MEDIA_EXPORT extern const base::Feature kPreloadMetadataSuspend; MEDIA_EXPORT extern const base::Feature kRecordMediaEngagementScores; MEDIA_EXPORT extern const base::Feature kRecordWebAudioEngagement; MEDIA_EXPORT extern const base::Feature kResumeBackgroundVideo; +MEDIA_EXPORT extern const base::Feature kReuseMediaPlayer; MEDIA_EXPORT extern const base::Feature kRevokeMediaSourceObjectURLOnAttach; MEDIA_EXPORT extern const base::Feature kSpeakerChangeDetection; MEDIA_EXPORT extern const base::Feature kSpecCompliantCanPlayThrough; @@ -205,6 +204,7 @@ MEDIA_EXPORT extern const base::Feature kVaapiVideoMinResolutionForPerformance; MEDIA_EXPORT extern const base::Feature kVaapiVP8Encoder; MEDIA_EXPORT extern const base::Feature kVaapiVP9Encoder; #if defined(ARCH_CPU_X86_FAMILY) && BUILDFLAG(IS_CHROMEOS_ASH) +MEDIA_EXPORT extern const base::Feature kVaapiH264TemporalLayerHWEncoding; MEDIA_EXPORT extern const base::Feature kVaapiVp9kSVCHWDecoding; MEDIA_EXPORT extern const base::Feature kVaapiVp9kSVCHWEncoding; #endif // defined(ARCH_CPU_X86_FAMILY) && BUILDFLAG(IS_CHROMEOS_ASH) diff --git a/chromium/media/base/media_tracks.h b/chromium/media/base/media_tracks.h index 36fbd2bef71..0df1b05bfd7 100644 --- a/chromium/media/base/media_tracks.h +++ b/chromium/media/base/media_tracks.h @@ -23,6 +23,10 @@ class MEDIA_EXPORT MediaTracks { using MediaTracksCollection = std::vector<std::unique_ptr<MediaTrack>>; MediaTracks(); + + MediaTracks(const MediaTracks&) = delete; + MediaTracks& operator=(const MediaTracks&) = delete; + ~MediaTracks(); // Adds a new audio track. The |bytestreamTrackId| must uniquely identify the @@ -51,8 +55,6 @@ class MEDIA_EXPORT MediaTracks { MediaTracksCollection tracks_; std::map<StreamParser::TrackId, AudioDecoderConfig> audio_configs_; std::map<StreamParser::TrackId, VideoDecoderConfig> video_configs_; - - DISALLOW_COPY_AND_ASSIGN(MediaTracks); }; } // namespace media diff --git a/chromium/media/base/media_types.cc b/chromium/media/base/media_types.cc index ceaddc7f7b6..a33fb235c3f 100644 --- a/chromium/media/base/media_types.cc +++ b/chromium/media/base/media_types.cc @@ -28,26 +28,26 @@ VideoType VideoType::FromDecoderConfig(const VideoDecoderConfig& config) { switch (config.codec()) { // These have no notion of level. - case kUnknownVideoCodec: - case kCodecTheora: - case kCodecVP8: + case VideoCodec::kUnknown: + case VideoCodec::kTheora: + case VideoCodec::kVP8: // These use non-numeric levels, aren't part of our mime code, and // are ancient with very limited support. - case kCodecVC1: - case kCodecMPEG2: - case kCodecMPEG4: + case VideoCodec::kVC1: + case VideoCodec::kMPEG2: + case VideoCodec::kMPEG4: break; - case kCodecH264: - case kCodecVP9: - case kCodecHEVC: + case VideoCodec::kH264: + case VideoCodec::kVP9: + case VideoCodec::kHEVC: // 10 is the level_idc for level 1.0. level = 10; break; - case kCodecDolbyVision: + case VideoCodec::kDolbyVision: // Dolby doesn't do decimals, so 1 is just 1. level = 1; break; - case kCodecAV1: + case VideoCodec::kAV1: // Strangely, AV1 starts at 2.0. level = 20; break; diff --git a/chromium/media/base/media_url_demuxer.h b/chromium/media/base/media_url_demuxer.h index 756ae44ac35..a2ae1b2e4c2 100644 --- a/chromium/media/base/media_url_demuxer.h +++ b/chromium/media/base/media_url_demuxer.h @@ -43,6 +43,10 @@ class MEDIA_EXPORT MediaUrlDemuxer : public Demuxer { const url::Origin& top_frame_origin, bool allow_credentials, bool is_hls); + + MediaUrlDemuxer(const MediaUrlDemuxer&) = delete; + MediaUrlDemuxer& operator=(const MediaUrlDemuxer&) = delete; + ~MediaUrlDemuxer() override; // MediaResource interface. @@ -76,8 +80,6 @@ class MEDIA_EXPORT MediaUrlDemuxer : public Demuxer { DemuxerHost* host_; scoped_refptr<base::SingleThreadTaskRunner> task_runner_; - - DISALLOW_COPY_AND_ASSIGN(MediaUrlDemuxer); }; } // namespace media diff --git a/chromium/media/base/media_util.h b/chromium/media/base/media_util.h index fac5af522da..0dac6c60587 100644 --- a/chromium/media/base/media_util.h +++ b/chromium/media/base/media_util.h @@ -26,13 +26,14 @@ MEDIA_EXPORT void ReportPepperVideoDecoderOutputPictureCountSW(int height); class MEDIA_EXPORT NullMediaLog : public media::MediaLog { public: NullMediaLog() = default; + + NullMediaLog(const NullMediaLog&) = delete; + NullMediaLog& operator=(const NullMediaLog&) = delete; + ~NullMediaLog() override = default; void AddLogRecordLocked( std::unique_ptr<media::MediaLogRecord> event) override {} - - private: - DISALLOW_COPY_AND_ASSIGN(NullMediaLog); }; } // namespace media diff --git a/chromium/media/base/memory_dump_provider_proxy.h b/chromium/media/base/memory_dump_provider_proxy.h index 0bdda75b7c5..d815e15e51f 100644 --- a/chromium/media/base/memory_dump_provider_proxy.h +++ b/chromium/media/base/memory_dump_provider_proxy.h @@ -29,6 +29,9 @@ class MEDIA_EXPORT MemoryDumpProviderProxy final scoped_refptr<base::SingleThreadTaskRunner> task_runner, MemoryDumpCB dump_cb); + MemoryDumpProviderProxy(const MemoryDumpProviderProxy&) = delete; + MemoryDumpProviderProxy& operator=(const MemoryDumpProviderProxy&) = delete; + ~MemoryDumpProviderProxy() override; bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args, @@ -36,8 +39,6 @@ class MEDIA_EXPORT MemoryDumpProviderProxy final private: MemoryDumpCB dump_cb_; - - DISALLOW_COPY_AND_ASSIGN(MemoryDumpProviderProxy); }; } // namespace media diff --git a/chromium/media/base/mime_util_internal.cc b/chromium/media/base/mime_util_internal.cc index ccfe8e9a653..2a0ee050032 100644 --- a/chromium/media/base/mime_util_internal.cc +++ b/chromium/media/base/mime_util_internal.cc @@ -168,51 +168,51 @@ MimeUtil::~MimeUtil() = default; AudioCodec MimeUtilToAudioCodec(MimeUtil::Codec codec) { switch (codec) { case MimeUtil::PCM: - return kCodecPCM; + return AudioCodec::kPCM; case MimeUtil::MP3: - return kCodecMP3; + return AudioCodec::kMP3; case MimeUtil::AC3: - return kCodecAC3; + return AudioCodec::kAC3; case MimeUtil::EAC3: - return kCodecEAC3; + return AudioCodec::kEAC3; case MimeUtil::MPEG2_AAC: case MimeUtil::MPEG4_AAC: case MimeUtil::MPEG4_XHE_AAC: - return kCodecAAC; + return AudioCodec::kAAC; case MimeUtil::MPEG_H_AUDIO: - return kCodecMpegHAudio; + return AudioCodec::kMpegHAudio; case MimeUtil::VORBIS: - return kCodecVorbis; + return AudioCodec::kVorbis; case MimeUtil::OPUS: - return kCodecOpus; + return AudioCodec::kOpus; case MimeUtil::FLAC: - return kCodecFLAC; + return AudioCodec::kFLAC; default: break; } - return kUnknownAudioCodec; + return AudioCodec::kUnknown; } VideoCodec MimeUtilToVideoCodec(MimeUtil::Codec codec) { switch (codec) { case MimeUtil::AV1: - return kCodecAV1; + return VideoCodec::kAV1; case MimeUtil::H264: - return kCodecH264; + return VideoCodec::kH264; case MimeUtil::HEVC: - return kCodecHEVC; + return VideoCodec::kHEVC; case MimeUtil::VP8: - return kCodecVP8; + return VideoCodec::kVP8; case MimeUtil::VP9: - return kCodecVP9; + return VideoCodec::kVP9; case MimeUtil::THEORA: - return kCodecTheora; + return VideoCodec::kTheora; case MimeUtil::DOLBY_VISION: - return kCodecDolbyVision; + return VideoCodec::kDolbyVision; default: break; } - return kUnknownVideoCodec; + return VideoCodec::kUnknown; } SupportsType MimeUtil::AreSupportedCodecs( @@ -470,7 +470,7 @@ bool MimeUtil::ParseVideoCodecString(const std::string& mime_type, *out_level = parsed_results[0].video_level; *out_color_space = parsed_results[0].video_color_space; - if (*out_codec == kUnknownVideoCodec) { + if (*out_codec == VideoCodec::kUnknown) { DVLOG(3) << __func__ << " Codec string " << codec_id << " is not a VIDEO codec."; return false; @@ -504,7 +504,7 @@ bool MimeUtil::ParseAudioCodecString(const std::string& mime_type, *out_is_ambiguous = parsed_results[0].is_ambiguous; *out_codec = MimeUtilToAudioCodec(parsed_results[0].codec); - if (*out_codec == kUnknownAudioCodec) { + if (*out_codec == AudioCodec::kUnknown) { DVLOG(3) << __func__ << " Codec string " << codec_id << " is not an AUDIO codec."; return false; @@ -774,7 +774,7 @@ bool MimeUtil::ParseCodecHelper(const std::string& mime_type_lower_case, out_result->codec = itr->second; // Even "simple" video codecs should have an associated profile. - if (MimeUtilToVideoCodec(out_result->codec) != kUnknownVideoCodec) { + if (MimeUtilToVideoCodec(out_result->codec) != VideoCodec::kUnknown) { switch (out_result->codec) { case Codec::VP8: out_result->video_profile = VP8PROFILE_ANY; @@ -875,12 +875,12 @@ SupportsType MimeUtil::IsCodecSupported(const std::string& mime_type_lower_case, DCHECK_NE(codec, INVALID_CODEC); VideoCodec video_codec = MimeUtilToVideoCodec(codec); - if (video_codec != kUnknownVideoCodec && + if (video_codec != VideoCodec::kUnknown && // Theora and VP8 do not have profiles/levels. - video_codec != kCodecTheora && video_codec != kCodecVP8 && + video_codec != VideoCodec::kTheora && video_codec != VideoCodec::kVP8 && // TODO(dalecurtis): AV1 has levels, but they aren't supported yet; // http://crbug.com/784993 - video_codec != kCodecAV1) { + video_codec != VideoCodec::kAV1) { DCHECK_NE(video_profile, VIDEO_CODEC_PROFILE_UNKNOWN); DCHECK_GT(video_level, 0); } @@ -911,7 +911,7 @@ SupportsType MimeUtil::IsCodecSupported(const std::string& mime_type_lower_case, } AudioCodec audio_codec = MimeUtilToAudioCodec(codec); - if (audio_codec != kUnknownAudioCodec) { + if (audio_codec != AudioCodec::kUnknown) { AudioCodecProfile audio_profile = AudioCodecProfile::kUnknown; if (codec == MPEG4_XHE_AAC) audio_profile = AudioCodecProfile::kXHE_AAC; @@ -920,7 +920,7 @@ SupportsType MimeUtil::IsCodecSupported(const std::string& mime_type_lower_case, return IsNotSupported; } - if (video_codec != kUnknownVideoCodec) { + if (video_codec != VideoCodec::kUnknown) { if (!IsSupportedVideoType( {video_codec, video_profile, video_level, color_space})) { return IsNotSupported; diff --git a/chromium/media/base/mime_util_internal.h b/chromium/media/base/mime_util_internal.h index 614d357c5b0..f0cf1a848ff 100644 --- a/chromium/media/base/mime_util_internal.h +++ b/chromium/media/base/mime_util_internal.h @@ -11,6 +11,7 @@ #include "base/containers/flat_map.h" #include "base/containers/flat_set.h" #include "base/macros.h" +#include "build/build_config.h" #include "media/base/media_export.h" #include "media/base/mime_util.h" #include "media/base/video_codecs.h" @@ -25,6 +26,10 @@ namespace internal { class MEDIA_EXPORT MimeUtil { public: MimeUtil(); + + MimeUtil(const MimeUtil&) = delete; + MimeUtil& operator=(const MimeUtil&) = delete; + ~MimeUtil(); enum Codec { @@ -196,8 +201,6 @@ class MEDIA_EXPORT MimeUtil { // A map of mime_types and hash map of the supported codecs for the mime_type. MediaFormatMappings media_format_map_; - - DISALLOW_COPY_AND_ASSIGN(MimeUtil); }; } // namespace internal diff --git a/chromium/media/base/mime_util_unittest.cc b/chromium/media/base/mime_util_unittest.cc index 5826cdf29ab..4dcafd03f61 100644 --- a/chromium/media/base/mime_util_unittest.cc +++ b/chromium/media/base/mime_util_unittest.cc @@ -247,7 +247,7 @@ TEST(MimeUtilTest, ParseVideoCodecString) { &out_colorspace)); if (kUsePropCodecs) { EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecH264, out_codec); + EXPECT_EQ(VideoCodec::kH264, out_codec); EXPECT_EQ(H264PROFILE_BASELINE, out_profile); EXPECT_EQ(30, out_level); EXPECT_EQ(VideoColorSpace::REC709(), out_colorspace); @@ -258,7 +258,7 @@ TEST(MimeUtilTest, ParseVideoCodecString) { &out_is_ambiguous, &out_codec, &out_profile, &out_level, &out_colorspace)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecVP9, out_codec); + EXPECT_EQ(VideoCodec::kVP9, out_codec); EXPECT_EQ(VP9PROFILE_PROFILE0, out_profile); EXPECT_EQ(10, out_level); EXPECT_EQ(VideoColorSpace::REC709(), out_colorspace); @@ -268,7 +268,7 @@ TEST(MimeUtilTest, ParseVideoCodecString) { &out_is_ambiguous, &out_codec, &out_profile, &out_level, &out_colorspace)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecVP9, out_codec); + EXPECT_EQ(VideoCodec::kVP9, out_codec); EXPECT_EQ(VP9PROFILE_PROFILE2, out_profile); EXPECT_EQ(10, out_level); EXPECT_EQ(VideoColorSpace::REC601(), out_colorspace); @@ -280,7 +280,7 @@ TEST(MimeUtilTest, ParseVideoCodecString) { &out_profile, &out_level, &out_colorspace)); if (kUsePropCodecs) { EXPECT_TRUE(out_is_ambiguous); - EXPECT_EQ(kCodecH264, out_codec); + EXPECT_EQ(VideoCodec::kH264, out_codec); EXPECT_EQ(VIDEO_CODEC_PROFILE_UNKNOWN, out_profile); EXPECT_EQ(0, out_level); EXPECT_EQ(VideoColorSpace::REC709(), out_colorspace); @@ -316,7 +316,7 @@ TEST(MimeUtilTest, ParseVideoCodecString_NoMimeType) { &out_codec, &out_profile, &out_level, &out_colorspace)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecH264, out_codec); + EXPECT_EQ(VideoCodec::kH264, out_codec); EXPECT_EQ(H264PROFILE_BASELINE, out_profile); EXPECT_EQ(30, out_level); EXPECT_EQ(VideoColorSpace::REC709(), out_colorspace); @@ -326,7 +326,7 @@ TEST(MimeUtilTest, ParseVideoCodecString_NoMimeType) { &out_codec, &out_profile, &out_level, &out_colorspace)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecVP9, out_codec); + EXPECT_EQ(VideoCodec::kVP9, out_codec); EXPECT_EQ(VP9PROFILE_PROFILE0, out_profile); EXPECT_EQ(10, out_level); EXPECT_EQ(VideoColorSpace::REC709(), out_colorspace); @@ -335,7 +335,7 @@ TEST(MimeUtilTest, ParseVideoCodecString_NoMimeType) { &out_is_ambiguous, &out_codec, &out_profile, &out_level, &out_colorspace)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecVP9, out_codec); + EXPECT_EQ(VideoCodec::kVP9, out_codec); EXPECT_EQ(VP9PROFILE_PROFILE2, out_profile); EXPECT_EQ(10, out_level); EXPECT_EQ(VideoColorSpace::REC601(), out_colorspace); @@ -344,7 +344,7 @@ TEST(MimeUtilTest, ParseVideoCodecString_NoMimeType) { EXPECT_TRUE(ParseVideoCodecString("", "avc3", &out_is_ambiguous, &out_codec, &out_profile, &out_level, &out_colorspace)); EXPECT_TRUE(out_is_ambiguous); - EXPECT_EQ(kCodecH264, out_codec); + EXPECT_EQ(VideoCodec::kH264, out_codec); EXPECT_EQ(VIDEO_CODEC_PROFILE_UNKNOWN, out_profile); EXPECT_EQ(0, out_level); EXPECT_EQ(VideoColorSpace::REC709(), out_colorspace); @@ -368,7 +368,7 @@ TEST(MimeUtilTest, ParseAudioCodecString) { EXPECT_TRUE(ParseAudioCodecString("audio/webm", "opus", &out_is_ambiguous, &out_codec)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecOpus, out_codec); + EXPECT_EQ(AudioCodec::kOpus, out_codec); // Valid AAC string when proprietary codecs are supported. EXPECT_EQ(kUsePropCodecs, @@ -376,14 +376,14 @@ TEST(MimeUtilTest, ParseAudioCodecString) { &out_codec)); if (kUsePropCodecs) { EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecAAC, out_codec); + EXPECT_EQ(AudioCodec::kAAC, out_codec); } // Valid FLAC string with MP4. Neither decoding nor demuxing is proprietary. EXPECT_TRUE(ParseAudioCodecString("audio/mp4", "flac", &out_is_ambiguous, &out_codec)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecFLAC, out_codec); + EXPECT_EQ(AudioCodec::kFLAC, out_codec); // Ambiguous AAC string. // TODO(chcunningha): This can probably be allowed. I think we treat all @@ -393,20 +393,20 @@ TEST(MimeUtilTest, ParseAudioCodecString) { &out_codec)); if (kUsePropCodecs) { EXPECT_TRUE(out_is_ambiguous); - EXPECT_EQ(kCodecAAC, out_codec); + EXPECT_EQ(AudioCodec::kAAC, out_codec); } // Valid empty codec string. Codec unambiguously implied by mime type. EXPECT_TRUE( ParseAudioCodecString("audio/flac", "", &out_is_ambiguous, &out_codec)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecFLAC, out_codec); + EXPECT_EQ(AudioCodec::kFLAC, out_codec); // Valid audio codec should still be allowed with video mime type. EXPECT_TRUE(ParseAudioCodecString("video/webm", "opus", &out_is_ambiguous, &out_codec)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecOpus, out_codec); + EXPECT_EQ(AudioCodec::kOpus, out_codec); // Video codec is not valid for audio API. EXPECT_FALSE(ParseAudioCodecString("audio/webm", "vp09.00.10.08", @@ -427,18 +427,18 @@ TEST(MimeUtilTest, ParseAudioCodecString_NoMimeType) { // Valid Opus string. EXPECT_TRUE(ParseAudioCodecString("", "opus", &out_is_ambiguous, &out_codec)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecOpus, out_codec); + EXPECT_EQ(AudioCodec::kOpus, out_codec); // Valid AAC string when proprietary codecs are supported. EXPECT_TRUE( ParseAudioCodecString("", "mp4a.40.2", &out_is_ambiguous, &out_codec)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecAAC, out_codec); + EXPECT_EQ(AudioCodec::kAAC, out_codec); // Valid FLAC string. Neither decoding nor demuxing is proprietary. EXPECT_TRUE(ParseAudioCodecString("", "flac", &out_is_ambiguous, &out_codec)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecFLAC, out_codec); + EXPECT_EQ(AudioCodec::kFLAC, out_codec); // Ambiguous AAC string. // TODO(chcunningha): This can probably be allowed. I think we treat all @@ -447,7 +447,7 @@ TEST(MimeUtilTest, ParseAudioCodecString_NoMimeType) { ParseAudioCodecString("", "mp4a.40", &out_is_ambiguous, &out_codec)); if (kUsePropCodecs) { EXPECT_TRUE(out_is_ambiguous); - EXPECT_EQ(kCodecAAC, out_codec); + EXPECT_EQ(AudioCodec::kAAC, out_codec); } // Video codec is not valid for audio API. @@ -468,26 +468,26 @@ TEST(MimeUtilTest, ParseAudioCodecString_Mp3) { EXPECT_TRUE(ParseAudioCodecString("audio/mpeg", "mp3", &out_is_ambiguous, &out_codec)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecMP3, out_codec); + EXPECT_EQ(AudioCodec::kMP3, out_codec); EXPECT_TRUE( ParseAudioCodecString("audio/mpeg", "", &out_is_ambiguous, &out_codec)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecMP3, out_codec); + EXPECT_EQ(AudioCodec::kMP3, out_codec); EXPECT_TRUE(ParseAudioCodecString("", "mp3", &out_is_ambiguous, &out_codec)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecMP3, out_codec); + EXPECT_EQ(AudioCodec::kMP3, out_codec); EXPECT_TRUE( ParseAudioCodecString("", "mp4a.69", &out_is_ambiguous, &out_codec)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecMP3, out_codec); + EXPECT_EQ(AudioCodec::kMP3, out_codec); EXPECT_TRUE( ParseAudioCodecString("", "mp4a.6B", &out_is_ambiguous, &out_codec)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecMP3, out_codec); + EXPECT_EQ(AudioCodec::kMP3, out_codec); } // These codecs really only have one profile. Ensure that |out_profile| is @@ -504,7 +504,7 @@ TEST(MimeUtilTest, ParseVideoCodecString_SimpleCodecsHaveProfiles) { &out_codec, &out_profile, &out_level, &out_colorspace)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecVP8, out_codec); + EXPECT_EQ(VideoCodec::kVP8, out_codec); EXPECT_EQ(VP8PROFILE_ANY, out_profile); EXPECT_EQ(0, out_level); EXPECT_EQ(VideoColorSpace::REC709(), out_colorspace); @@ -520,7 +520,7 @@ TEST(MimeUtilTest, ParseVideoCodecString_SimpleCodecsHaveProfiles) { &out_codec, &out_profile, &out_level, &out_colorspace)); EXPECT_FALSE(out_is_ambiguous); - EXPECT_EQ(kCodecTheora, out_codec); + EXPECT_EQ(VideoCodec::kTheora, out_codec); EXPECT_EQ(THEORAPROFILE_ANY, out_profile); EXPECT_EQ(0, out_level); EXPECT_EQ(VideoColorSpace::REC709(), out_colorspace); diff --git a/chromium/media/base/mock_demuxer_host.h b/chromium/media/base/mock_demuxer_host.h index 8cd4894c1fe..818d1f50759 100644 --- a/chromium/media/base/mock_demuxer_host.h +++ b/chromium/media/base/mock_demuxer_host.h @@ -15,15 +15,16 @@ namespace media { class MockDemuxerHost : public DemuxerHost { public: MockDemuxerHost(); + + MockDemuxerHost(const MockDemuxerHost&) = delete; + MockDemuxerHost& operator=(const MockDemuxerHost&) = delete; + ~MockDemuxerHost() override; MOCK_METHOD1(OnBufferedTimeRangesChanged, void(const Ranges<base::TimeDelta>&)); MOCK_METHOD1(SetDuration, void(base::TimeDelta duration)); MOCK_METHOD1(OnDemuxerError, void(PipelineStatus error)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockDemuxerHost); }; } // namespace media diff --git a/chromium/media/base/mock_filters.h b/chromium/media/base/mock_filters.h index 08e089afc8f..f5db5e83556 100644 --- a/chromium/media/base/mock_filters.h +++ b/chromium/media/base/mock_filters.h @@ -14,6 +14,7 @@ #include "base/callback.h" #include "base/macros.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "media/base/audio_decoder.h" #include "media/base/audio_decoder_config.h" #include "media/base/audio_encoder.h" @@ -79,6 +80,10 @@ class MockPipelineClient : public Pipeline::Client { class MockPipeline : public Pipeline { public: MockPipeline(); + + MockPipeline(const MockPipeline&) = delete; + MockPipeline& operator=(const MockPipeline&) = delete; + ~MockPipeline() override; void Start(StartType start_type, @@ -132,9 +137,6 @@ class MockPipeline : public Pipeline { } MOCK_METHOD2(OnSetCdm, void(CdmContext* cdm_context, CdmAttachedCB& cdm_attached_cb)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockPipeline); }; class MockMediaResource : public MediaResource { @@ -152,6 +154,10 @@ class MockMediaResource : public MediaResource { class MockDemuxer : public Demuxer { public: MockDemuxer(); + + MockDemuxer(const MockDemuxer&) = delete; + MockDemuxer& operator=(const MockDemuxer&) = delete; + ~MockDemuxer() override; // Demuxer implementation. @@ -184,14 +190,15 @@ class MockDemuxer : public Demuxer { void(const std::vector<MediaTrack::Id>&, base::TimeDelta, TrackChangeCB)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockDemuxer); }; class MockDemuxerStream : public DemuxerStream { public: explicit MockDemuxerStream(DemuxerStream::Type type); + + MockDemuxerStream(const MockDemuxerStream&) = delete; + MockDemuxerStream& operator=(const MockDemuxerStream&) = delete; + ~MockDemuxerStream() override; // DemuxerStream implementation. @@ -213,8 +220,6 @@ class MockDemuxerStream : public DemuxerStream { Liveness liveness_; AudioDecoderConfig audio_decoder_config_; VideoDecoderConfig video_decoder_config_; - - DISALLOW_COPY_AND_ASSIGN(MockDemuxerStream); }; class MockVideoDecoder : public VideoDecoder { @@ -227,6 +232,10 @@ class MockVideoDecoder : public VideoDecoder { MockVideoDecoder(bool is_platform_decoder, bool supports_decryption, int decoder_id); + + MockVideoDecoder(const MockVideoDecoder&) = delete; + MockVideoDecoder& operator=(const MockVideoDecoder&) = delete; + ~MockVideoDecoder() override; // Decoder implementation @@ -271,12 +280,15 @@ class MockVideoDecoder : public VideoDecoder { const bool is_platform_decoder_; const bool supports_decryption_; const int decoder_id_ = 0; - DISALLOW_COPY_AND_ASSIGN(MockVideoDecoder); }; class MockAudioEncoder : public AudioEncoder { public: MockAudioEncoder(); + + MockAudioEncoder(const MockAudioEncoder&) = delete; + MockAudioEncoder& operator=(const MockAudioEncoder&) = delete; + ~MockAudioEncoder() override; // AudioEncoder implementation. @@ -298,14 +310,15 @@ class MockAudioEncoder : public AudioEncoder { // A function for mocking destructor calls MOCK_METHOD(void, OnDestruct, ()); - - private: - DISALLOW_COPY_AND_ASSIGN(MockAudioEncoder); }; class MockVideoEncoder : public VideoEncoder { public: MockVideoEncoder(); + + MockVideoEncoder(const MockVideoEncoder&) = delete; + MockVideoEncoder& operator=(const MockVideoEncoder&) = delete; + ~MockVideoEncoder() override; // VideoEncoder implementation. @@ -335,9 +348,6 @@ class MockVideoEncoder : public VideoEncoder { // A function for mocking destructor calls MOCK_METHOD(void, Dtor, ()); - - private: - DISALLOW_COPY_AND_ASSIGN(MockVideoEncoder); }; class MockAudioDecoder : public AudioDecoder { @@ -347,6 +357,10 @@ class MockAudioDecoder : public AudioDecoder { explicit MockAudioDecoder(bool is_platform_decoder, bool supports_decryption, int decoder_id); + + MockAudioDecoder(const MockAudioDecoder&) = delete; + MockAudioDecoder& operator=(const MockAudioDecoder&) = delete; + ~MockAudioDecoder() override; // Decoder implementation @@ -382,7 +396,6 @@ class MockAudioDecoder : public AudioDecoder { const bool is_platform_decoder_; const bool supports_decryption_; const int decoder_id_ = 0; - DISALLOW_COPY_AND_ASSIGN(MockAudioDecoder); }; class MockRendererClient : public RendererClient { @@ -410,6 +423,10 @@ class MockRendererClient : public RendererClient { class MockVideoRenderer : public VideoRenderer { public: MockVideoRenderer(); + + MockVideoRenderer(const MockVideoRenderer&) = delete; + MockVideoRenderer& operator=(const MockVideoRenderer&) = delete; + ~MockVideoRenderer() override; // VideoRenderer implementation. @@ -432,14 +449,15 @@ class MockVideoRenderer : public VideoRenderer { MOCK_METHOD0(OnTimeStopped, void()); MOCK_METHOD1(SetLatencyHint, void(absl::optional<base::TimeDelta> latency_hint)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockVideoRenderer); }; class MockAudioRenderer : public AudioRenderer { public: MockAudioRenderer(); + + MockAudioRenderer(const MockAudioRenderer&) = delete; + MockAudioRenderer& operator=(const MockAudioRenderer&) = delete; + ~MockAudioRenderer() override; // AudioRenderer implementation. @@ -462,14 +480,15 @@ class MockAudioRenderer : public AudioRenderer { void(absl::optional<base::TimeDelta> latency_hint)); MOCK_METHOD1(SetPreservesPitch, void(bool)); MOCK_METHOD1(SetAutoplayInitiated, void(bool)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockAudioRenderer); }; class MockRenderer : public Renderer { public: MockRenderer(); + + MockRenderer(const MockRenderer&) = delete; + MockRenderer& operator=(const MockRenderer&) = delete; + ~MockRenderer() override; // Renderer implementation. @@ -502,14 +521,15 @@ class MockRenderer : public Renderer { void(std::vector<DemuxerStream*>, base::OnceClosure)); MOCK_METHOD2(OnSelectedAudioTracksChanged, void(std::vector<DemuxerStream*>, base::OnceClosure)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockRenderer); }; class MockRendererFactory : public RendererFactory { public: MockRendererFactory(); + + MockRendererFactory(const MockRendererFactory&) = delete; + MockRendererFactory& operator=(const MockRendererFactory&) = delete; + ~MockRendererFactory() override; // Renderer implementation. @@ -521,14 +541,15 @@ class MockRendererFactory : public RendererFactory { VideoRendererSink*, RequestOverlayInfoCB, const gfx::ColorSpace&)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockRendererFactory); }; class MockTimeSource : public TimeSource { public: MockTimeSource(); + + MockTimeSource(const MockTimeSource&) = delete; + MockTimeSource& operator=(const MockTimeSource&) = delete; + ~MockTimeSource() override; // TimeSource implementation. @@ -540,14 +561,15 @@ class MockTimeSource : public TimeSource { MOCK_METHOD2(GetWallClockTimes, bool(const std::vector<base::TimeDelta>&, std::vector<base::TimeTicks>*)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockTimeSource); }; class MockTextTrack : public TextTrack { public: MockTextTrack(); + + MockTextTrack(const MockTextTrack&) = delete; + MockTextTrack& operator=(const MockTextTrack&) = delete; + ~MockTextTrack() override; MOCK_METHOD5(addWebVTTCue, @@ -556,9 +578,6 @@ class MockTextTrack : public TextTrack { const std::string& id, const std::string& content, const std::string& settings)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockTextTrack); }; // Mock CDM callbacks. @@ -600,6 +619,10 @@ class MockCdmClient { class MockDecryptor : public Decryptor { public: MockDecryptor(); + + MockDecryptor(const MockDecryptor&) = delete; + MockDecryptor& operator=(const MockDecryptor&) = delete; + ~MockDecryptor() override; MOCK_METHOD3(Decrypt, @@ -620,14 +643,15 @@ class MockDecryptor : public Decryptor { MOCK_METHOD1(ResetDecoder, void(StreamType stream_type)); MOCK_METHOD1(DeinitializeDecoder, void(StreamType stream_type)); MOCK_METHOD0(CanAlwaysDecrypt, bool()); - - private: - DISALLOW_COPY_AND_ASSIGN(MockDecryptor); }; class MockCdmContext : public CdmContext { public: MockCdmContext(); + + MockCdmContext(const MockCdmContext&) = delete; + MockCdmContext& operator=(const MockCdmContext&) = delete; + ~MockCdmContext() override; MOCK_METHOD1(RegisterEventCB, @@ -648,8 +672,6 @@ class MockCdmContext : public CdmContext { private: absl::optional<base::UnguessableToken> cdm_id_; - - DISALLOW_COPY_AND_ASSIGN(MockCdmContext); }; class MockCdmPromise : public SimpleCdmPromise { @@ -657,14 +679,15 @@ class MockCdmPromise : public SimpleCdmPromise { // |expect_success| is true if resolve() should be called, false if reject() // is expected. explicit MockCdmPromise(bool expect_success); + + MockCdmPromise(const MockCdmPromise&) = delete; + MockCdmPromise& operator=(const MockCdmPromise&) = delete; + ~MockCdmPromise() override; MOCK_METHOD0(resolve, void()); MOCK_METHOD3(reject, void(CdmPromise::Exception, uint32_t, const std::string&)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockCdmPromise); }; class MockCdmSessionPromise : public NewSessionCdmPromise { @@ -673,14 +696,15 @@ class MockCdmSessionPromise : public NewSessionCdmPromise { // is expected. |new_session_id| is updated with the new session's ID on // resolve(). MockCdmSessionPromise(bool expect_success, std::string* new_session_id); + + MockCdmSessionPromise(const MockCdmSessionPromise&) = delete; + MockCdmSessionPromise& operator=(const MockCdmSessionPromise&) = delete; + ~MockCdmSessionPromise() override; MOCK_METHOD1(resolve, void(const std::string&)); MOCK_METHOD3(reject, void(CdmPromise::Exception, uint32_t, const std::string&)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockCdmSessionPromise); }; class MockCdmKeyStatusPromise : public KeyStatusCdmPromise { @@ -689,14 +713,15 @@ class MockCdmKeyStatusPromise : public KeyStatusCdmPromise { // is expected. |key_status| is updated with the key status on resolve(). MockCdmKeyStatusPromise(bool expect_success, CdmKeyInformation::KeyStatus* key_status); + + MockCdmKeyStatusPromise(const MockCdmKeyStatusPromise&) = delete; + MockCdmKeyStatusPromise& operator=(const MockCdmKeyStatusPromise&) = delete; + ~MockCdmKeyStatusPromise() override; MOCK_METHOD1(resolve, void(const CdmKeyInformation::KeyStatus&)); MOCK_METHOD3(reject, void(CdmPromise::Exception, uint32_t, const std::string&)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockCdmKeyStatusPromise); }; class MockCdm : public ContentDecryptionModule { @@ -770,6 +795,10 @@ class MockCdm : public ContentDecryptionModule { class MockCdmFactory : public CdmFactory { public: explicit MockCdmFactory(scoped_refptr<MockCdm> cdm); + + MockCdmFactory(const MockCdmFactory&) = delete; + MockCdmFactory& operator=(const MockCdmFactory&) = delete; + ~MockCdmFactory() override; // CdmFactory implementation. @@ -793,13 +822,15 @@ class MockCdmFactory : public CdmFactory { // Callback to be used before Create() successfully calls |cdm_created_cb|. base::RepeatingClosure before_creation_cb_; - - DISALLOW_COPY_AND_ASSIGN(MockCdmFactory); }; class MockStreamParser : public StreamParser { public: MockStreamParser(); + + MockStreamParser(const MockStreamParser&) = delete; + MockStreamParser& operator=(const MockStreamParser&) = delete; + ~MockStreamParser() override; // StreamParser interface @@ -816,14 +847,15 @@ class MockStreamParser : public StreamParser { MOCK_METHOD0(Flush, void()); MOCK_CONST_METHOD0(GetGenerateTimestampsFlag, bool()); MOCK_METHOD2(Parse, bool(const uint8_t*, int)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockStreamParser); }; class MockMediaClient : public media::MediaClient { public: MockMediaClient(); + + MockMediaClient(const MockMediaClient&) = delete; + MockMediaClient& operator=(const MockMediaClient&) = delete; + ~MockMediaClient() override; // MediaClient implementation. @@ -837,9 +869,6 @@ class MockMediaClient : public media::MediaClient { MOCK_METHOD1(GetAudioRendererAlgorithmParameters, absl::optional<::media::AudioRendererAlgorithmParameters>( media::AudioParameters audio_parameters)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockMediaClient); }; } // namespace media diff --git a/chromium/media/base/mock_media_log.h b/chromium/media/base/mock_media_log.h index b568f7e1080..87d416975f3 100644 --- a/chromium/media/base/mock_media_log.h +++ b/chromium/media/base/mock_media_log.h @@ -81,6 +81,10 @@ MATCHER_P(MatchesPropertyAnyValue, message, "") { class MockMediaLog : public MediaLog { public: MockMediaLog(); + + MockMediaLog(const MockMediaLog&) = delete; + MockMediaLog& operator=(const MockMediaLog&) = delete; + ~MockMediaLog() override; MOCK_METHOD1(DoAddLogRecordLogString, void(const std::string& event)); @@ -105,8 +109,6 @@ class MockMediaLog : public MediaLog { private: std::unique_ptr<MediaLogRecord> most_recent_event_; - - DISALLOW_COPY_AND_ASSIGN(MockMediaLog); }; } // namespace media diff --git a/chromium/media/base/moving_average.cc b/chromium/media/base/moving_average.cc index 124e0b51046..0779ab6ee3a 100644 --- a/chromium/media/base/moving_average.cc +++ b/chromium/media/base/moving_average.cc @@ -45,7 +45,7 @@ base::TimeDelta MovingAverage::Deviation() const { } deviation_secs /= size; - return base::TimeDelta::FromSecondsD(std::sqrt(deviation_secs)); + return base::Seconds(std::sqrt(deviation_secs)); } void MovingAverage::Reset() { diff --git a/chromium/media/base/moving_average.h b/chromium/media/base/moving_average.h index d1a966e632f..a931edf6173 100644 --- a/chromium/media/base/moving_average.h +++ b/chromium/media/base/moving_average.h @@ -23,6 +23,10 @@ class MEDIA_EXPORT MovingAverage { public: // Creates a MovingAverage instance with space for |depth| samples. explicit MovingAverage(size_t depth); + + MovingAverage(const MovingAverage&) = delete; + MovingAverage& operator=(const MovingAverage&) = delete; + ~MovingAverage(); // Adds a new sample to the average; replaces the oldest sample if |depth_| @@ -59,8 +63,6 @@ class MEDIA_EXPORT MovingAverage { // Maximum value ever seen. base::TimeDelta max_ = kNoTimestamp; - - DISALLOW_COPY_AND_ASSIGN(MovingAverage); }; } // namespace media diff --git a/chromium/media/base/moving_average_unittest.cc b/chromium/media/base/moving_average_unittest.cc index a195985297d..f3d06d89db1 100644 --- a/chromium/media/base/moving_average_unittest.cc +++ b/chromium/media/base/moving_average_unittest.cc @@ -11,25 +11,23 @@ namespace media { TEST(MovingAverageTest, AverageAndDeviation) { const int kSamples = 5; MovingAverage moving_average(kSamples); - moving_average.AddSample(base::TimeDelta::FromSeconds(1)); - EXPECT_EQ(base::TimeDelta::FromSeconds(1), moving_average.Average()); + moving_average.AddSample(base::Seconds(1)); + EXPECT_EQ(base::Seconds(1), moving_average.Average()); EXPECT_EQ(base::TimeDelta(), moving_average.Deviation()); for (int i = 0; i < kSamples - 1; ++i) - moving_average.AddSample(base::TimeDelta::FromSeconds(1)); - EXPECT_EQ(base::TimeDelta::FromSeconds(1), moving_average.Average()); + moving_average.AddSample(base::Seconds(1)); + EXPECT_EQ(base::Seconds(1), moving_average.Average()); EXPECT_EQ(base::TimeDelta(), moving_average.Deviation()); base::TimeDelta expect_deviation[] = { - base::TimeDelta::FromMicroseconds(200000), - base::TimeDelta::FromMicroseconds(244948), - base::TimeDelta::FromMicroseconds(244948), - base::TimeDelta::FromMicroseconds(200000), - base::TimeDelta::FromMilliseconds(0), + base::Microseconds(200000), base::Microseconds(244948), + base::Microseconds(244948), base::Microseconds(200000), + base::Milliseconds(0), }; for (int i = 0; i < kSamples; ++i) { - moving_average.AddSample(base::TimeDelta::FromMilliseconds(500)); - EXPECT_EQ(base::TimeDelta::FromMilliseconds(1000 - (i + 1) * 100), + moving_average.AddSample(base::Milliseconds(500)); + EXPECT_EQ(base::Milliseconds(1000 - (i + 1) * 100), moving_average.Average()); EXPECT_EQ(expect_deviation[i], moving_average.Deviation()); } @@ -37,8 +35,8 @@ TEST(MovingAverageTest, AverageAndDeviation) { TEST(MovingAverageTest, Reset) { MovingAverage moving_average(2); - moving_average.AddSample(base::TimeDelta::FromSeconds(1)); - EXPECT_EQ(base::TimeDelta::FromSeconds(1), moving_average.Average()); + moving_average.AddSample(base::Seconds(1)); + EXPECT_EQ(base::Seconds(1), moving_average.Average()); moving_average.Reset(); moving_average.AddSample(base::TimeDelta()); EXPECT_EQ(base::TimeDelta(), moving_average.Average()); @@ -47,9 +45,9 @@ TEST(MovingAverageTest, Reset) { TEST(MovingAverageTest, MinAndMax) { MovingAverage moving_average(5); - base::TimeDelta min = base::TimeDelta::FromSeconds(1); - base::TimeDelta med = base::TimeDelta::FromSeconds(50); - base::TimeDelta max = base::TimeDelta::FromSeconds(100); + base::TimeDelta min = base::Seconds(1); + base::TimeDelta med = base::Seconds(50); + base::TimeDelta max = base::Seconds(100); moving_average.AddSample(min); moving_average.AddSample(med); moving_average.AddSample(med); diff --git a/chromium/media/base/multi_channel_resampler.h b/chromium/media/base/multi_channel_resampler.h index b455adb4163..fbef7e724f4 100644 --- a/chromium/media/base/multi_channel_resampler.h +++ b/chromium/media/base/multi_channel_resampler.h @@ -36,6 +36,10 @@ class MEDIA_EXPORT MultiChannelResampler { double io_sample_rate_ratio, size_t request_frames, const ReadCB read_cb); + + MultiChannelResampler(const MultiChannelResampler&) = delete; + MultiChannelResampler& operator=(const MultiChannelResampler&) = delete; + virtual ~MultiChannelResampler(); // Resamples |frames| of data from |read_cb_| into AudioBus. @@ -84,8 +88,6 @@ class MEDIA_EXPORT MultiChannelResampler { // The number of output frames that have successfully been processed during // the current Resample() call. int output_frames_ready_; - - DISALLOW_COPY_AND_ASSIGN(MultiChannelResampler); }; } // namespace media diff --git a/chromium/media/base/multi_channel_resampler_unittest.cc b/chromium/media/base/multi_channel_resampler_unittest.cc index 1741286ad4f..a9de77492af 100644 --- a/chromium/media/base/multi_channel_resampler_unittest.cc +++ b/chromium/media/base/multi_channel_resampler_unittest.cc @@ -41,6 +41,11 @@ class MultiChannelResamplerTest MultiChannelResamplerTest() : last_frame_delay_(-1) { } + + MultiChannelResamplerTest(const MultiChannelResamplerTest&) = delete; + MultiChannelResamplerTest& operator=(const MultiChannelResamplerTest&) = + delete; + virtual ~MultiChannelResamplerTest() = default; void InitializeAudioData(int channels, int frames) { @@ -121,8 +126,6 @@ class MultiChannelResamplerTest bool fill_junk_values_; std::unique_ptr<AudioBus> audio_bus_; int last_frame_delay_; - - DISALLOW_COPY_AND_ASSIGN(MultiChannelResamplerTest); }; TEST_P(MultiChannelResamplerTest, HighLatency) { diff --git a/chromium/media/base/null_video_sink.h b/chromium/media/base/null_video_sink.h index 988799c4881..3eb4e32358e 100644 --- a/chromium/media/base/null_video_sink.h +++ b/chromium/media/base/null_video_sink.h @@ -30,6 +30,10 @@ class MEDIA_EXPORT NullVideoSink : public VideoRendererSink { base::TimeDelta interval, const NewFrameCB& new_frame_cb, const scoped_refptr<base::SingleThreadTaskRunner>& task_runner); + + NullVideoSink(const NullVideoSink&) = delete; + NullVideoSink& operator=(const NullVideoSink&) = delete; + ~NullVideoSink() override; // VideoRendererSink implementation. @@ -86,8 +90,6 @@ class MEDIA_EXPORT NullVideoSink : public VideoRendererSink { // Value passed to RenderCallback::Render(). bool background_render_; - - DISALLOW_COPY_AND_ASSIGN(NullVideoSink); }; } // namespace media diff --git a/chromium/media/base/null_video_sink_unittest.cc b/chromium/media/base/null_video_sink_unittest.cc index 4fb456bc062..9b529249ff7 100644 --- a/chromium/media/base/null_video_sink_unittest.cc +++ b/chromium/media/base/null_video_sink_unittest.cc @@ -30,8 +30,12 @@ class NullVideoSinkTest : public testing::Test, public: NullVideoSinkTest() { // Never use null TimeTicks since they have special connotations. - tick_clock_.Advance(base::TimeDelta::FromMicroseconds(12345)); + tick_clock_.Advance(base::Microseconds(12345)); } + + NullVideoSinkTest(const NullVideoSinkTest&) = delete; + NullVideoSinkTest& operator=(const NullVideoSinkTest&) = delete; + ~NullVideoSinkTest() override = default; std::unique_ptr<NullVideoSink> ConstructSink(bool clockless, @@ -67,12 +71,10 @@ class NullVideoSinkTest : public testing::Test, protected: base::test::SingleThreadTaskEnvironment task_environment_; base::SimpleTestTickClock tick_clock_; - - DISALLOW_COPY_AND_ASSIGN(NullVideoSinkTest); }; TEST_F(NullVideoSinkTest, BasicFunctionality) { - const base::TimeDelta kInterval = base::TimeDelta::FromMilliseconds(25); + const base::TimeDelta kInterval = base::Milliseconds(25); std::unique_ptr<NullVideoSink> sink = ConstructSink(false, kInterval); scoped_refptr<VideoFrame> test_frame = CreateFrame(base::TimeDelta()); @@ -125,7 +127,7 @@ TEST_F(NullVideoSinkTest, BasicFunctionality) { TEST_F(NullVideoSinkTest, ClocklessFunctionality) { // Construct the sink with a huge interval, it should still complete quickly. - const base::TimeDelta interval = base::TimeDelta::FromSeconds(10); + const base::TimeDelta interval = base::Seconds(10); std::unique_ptr<NullVideoSink> sink = ConstructSink(true, interval); scoped_refptr<VideoFrame> test_frame = CreateFrame(base::TimeDelta()); diff --git a/chromium/media/base/offloading_video_encoder.cc b/chromium/media/base/offloading_video_encoder.cc index 473edb9e727..2b8e0ccaa77 100644 --- a/chromium/media/base/offloading_video_encoder.cc +++ b/chromium/media/base/offloading_video_encoder.cc @@ -30,7 +30,8 @@ OffloadingVideoEncoder::OffloadingVideoEncoder( std::unique_ptr<VideoEncoder> wrapped_encoder) : OffloadingVideoEncoder(std::move(wrapped_encoder), base::ThreadPool::CreateSequencedTaskRunner( - {base::TaskPriority::USER_BLOCKING}), + {base::TaskPriority::USER_BLOCKING, + base::WithBaseSyncPrimitives()}), base::SequencedTaskRunnerHandle::Get()) {} void OffloadingVideoEncoder::Initialize(VideoCodecProfile profile, diff --git a/chromium/media/base/pipeline_impl.cc b/chromium/media/base/pipeline_impl.cc index f2ccd2e40f6..3b10cc2117e 100644 --- a/chromium/media/base/pipeline_impl.cc +++ b/chromium/media/base/pipeline_impl.cc @@ -59,6 +59,10 @@ class PipelineImpl::RendererWrapper final : public DemuxerHost, RendererWrapper(scoped_refptr<base::SingleThreadTaskRunner> media_task_runner, scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, MediaLog* media_log); + + RendererWrapper(const RendererWrapper&) = delete; + RendererWrapper& operator=(const RendererWrapper&) = delete; + ~RendererWrapper() final; void Start(StartType start_type, @@ -233,7 +237,6 @@ class PipelineImpl::RendererWrapper final : public DemuxerHost, PipelineStatusCB error_cb_; base::WeakPtrFactory<RendererWrapper> weak_factory_{this}; - DISALLOW_COPY_AND_ASSIGN(RendererWrapper); }; PipelineImpl::RendererWrapper::RendererWrapper( @@ -892,12 +895,10 @@ void PipelineImpl::RendererWrapper::OnPipelineError(PipelineStatus error) { if (status_ != PIPELINE_OK) return; - // Don't report pipeline error events to the media log here. The embedder - // will log this when Client::OnError is called. If the pipeline is already - // stopped or stopping we also don't want to log any event. In case we are - // suspending or suspended, the error may be recoverable, so don't propagate - // it now, instead let the subsequent seek during resume propagate it if - // it's unrecoverable. + // If the pipeline is already stopping or stopped we don't need to report an + // error. Similarly if the pipeline is suspending or suspended, the error may + // be recoverable, so don't propagate it now, instead let the subsequent seek + // during resume propagate it if it's unrecoverable. if (state_ == kStopping || state_ == kStopped || state_ == kSuspending || state_ == kSuspended) { return; @@ -980,6 +981,7 @@ void PipelineImpl::RendererWrapper::CompleteSeek(base::TimeDelta seek_time, } void PipelineImpl::RendererWrapper::CompleteSuspend(PipelineStatus status) { + DVLOG(1) << __func__ << ": status=" << status; DCHECK(media_task_runner_->BelongsToCurrentThread()); DCHECK_EQ(kSuspending, state_); @@ -1667,8 +1669,9 @@ void PipelineImpl::OnSeekDone(bool is_suspended) { seek_time_ = kNoTimestamp; is_suspended_ = is_suspended; - DCHECK(seek_cb_); - std::move(seek_cb_).Run(PIPELINE_OK); + // `seek_cb_` could have been reset in OnError(). + if (seek_cb_) + std::move(seek_cb_).Run(PIPELINE_OK); } void PipelineImpl::OnSuspendDone() { @@ -1677,8 +1680,10 @@ void PipelineImpl::OnSuspendDone() { DCHECK(IsRunning()); is_suspended_ = true; - DCHECK(suspend_cb_); - std::move(suspend_cb_).Run(PIPELINE_OK); + + // `suspend_cb_` could have been reset in OnError(). + if (suspend_cb_) + std::move(suspend_cb_).Run(PIPELINE_OK); } } // namespace media diff --git a/chromium/media/base/pipeline_impl.h b/chromium/media/base/pipeline_impl.h index 2dcd76334f1..a933e2f12c6 100644 --- a/chromium/media/base/pipeline_impl.h +++ b/chromium/media/base/pipeline_impl.h @@ -86,6 +86,10 @@ class MEDIA_EXPORT PipelineImpl : public Pipeline { scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, CreateRendererCB create_renderer_cb, MediaLog* media_log); + + PipelineImpl(const PipelineImpl&) = delete; + PipelineImpl& operator=(const PipelineImpl&) = delete; + ~PipelineImpl() override; // Pipeline implementation. @@ -215,8 +219,6 @@ class MEDIA_EXPORT PipelineImpl : public Pipeline { base::ThreadChecker thread_checker_; base::WeakPtrFactory<PipelineImpl> weak_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(PipelineImpl); }; } // namespace media diff --git a/chromium/media/base/pipeline_impl_unittest.cc b/chromium/media/base/pipeline_impl_unittest.cc index d5f071b9b65..c5fc84fd668 100644 --- a/chromium/media/base/pipeline_impl_unittest.cc +++ b/chromium/media/base/pipeline_impl_unittest.cc @@ -90,6 +90,10 @@ class PipelineImplTest : public ::testing::Test { class CallbackHelper : public MockPipelineClient { public: CallbackHelper() = default; + + CallbackHelper(const CallbackHelper&) = delete; + CallbackHelper& operator=(const CallbackHelper&) = delete; + virtual ~CallbackHelper() = default; MOCK_METHOD1(OnStart, void(PipelineStatus)); @@ -97,9 +101,6 @@ class PipelineImplTest : public ::testing::Test { MOCK_METHOD1(OnSuspend, void(PipelineStatus)); MOCK_METHOD1(OnResume, void(PipelineStatus)); MOCK_METHOD1(OnCdmAttached, void(bool)); - - private: - DISALLOW_COPY_AND_ASSIGN(CallbackHelper); }; PipelineImplTest() @@ -131,6 +132,9 @@ class PipelineImplTest : public ::testing::Test { EXPECT_CALL(*renderer_, SetPreservesPitch(true)).Times(AnyNumber()); } + PipelineImplTest(const PipelineImplTest&) = delete; + PipelineImplTest& operator=(const PipelineImplTest&) = delete; + ~PipelineImplTest() override { if (pipeline_->IsRunning()) { ExpectDemuxerStop(); @@ -157,7 +161,7 @@ class PipelineImplTest : public ::testing::Test { void SetDemuxerExpectations() { // Initialize with a default non-zero duration. - SetDemuxerExpectations(base::TimeDelta::FromSeconds(10)); + SetDemuxerExpectations(base::Seconds(10)); } std::unique_ptr<StrictMock<MockDemuxerStream>> CreateStream( @@ -366,9 +370,6 @@ class PipelineImplTest : public ::testing::Test { VideoDecoderConfig video_decoder_config_; PipelineMetadata metadata_; base::TimeDelta start_time_; - - private: - DISALLOW_COPY_AND_ASSIGN(PipelineImplTest); }; // Test that playback controls methods can be set even before the pipeline is @@ -437,7 +438,7 @@ TEST_F(PipelineImplTest, StartThenStopImmediately) { TEST_F(PipelineImplTest, StartSuspendedAndResumeAudioOnly) { CreateAudioStream(); - SetDemuxerExpectations(base::TimeDelta::FromSeconds(3000)); + SetDemuxerExpectations(base::Seconds(3000)); StartPipelineAndExpect(PIPELINE_OK, Pipeline::StartType::kSuspendAfterMetadataForAudioOnly, @@ -445,14 +446,14 @@ TEST_F(PipelineImplTest, StartSuspendedAndResumeAudioOnly) { ASSERT_TRUE(pipeline_->IsSuspended()); ResetRenderer(); - base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); + base::TimeDelta expected = base::Seconds(2000); ExpectResume(expected); DoResume(expected); } TEST_F(PipelineImplTest, StartSuspendedAndResumeAudioVideo) { CreateAudioAndVideoStream(); - SetDemuxerExpectations(base::TimeDelta::FromSeconds(3000)); + SetDemuxerExpectations(base::Seconds(3000)); StartPipelineAndExpect(PIPELINE_OK, Pipeline::StartType::kSuspendAfterMetadata, @@ -460,14 +461,14 @@ TEST_F(PipelineImplTest, StartSuspendedAndResumeAudioVideo) { ASSERT_TRUE(pipeline_->IsSuspended()); ResetRenderer(); - base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); + base::TimeDelta expected = base::Seconds(2000); ExpectResume(expected); DoResume(expected); } TEST_F(PipelineImplTest, StartSuspendedFailsOnVideoWithAudioOnlyExpectation) { CreateAudioAndVideoStream(); - SetDemuxerExpectations(base::TimeDelta::FromSeconds(3000)); + SetDemuxerExpectations(base::Seconds(3000)); // StartType kSuspendAfterMetadataForAudioOnly only applies to AudioOnly. // Since this playback has video, renderer will be initialized and the @@ -558,20 +559,20 @@ TEST_F(PipelineImplTest, EncryptedStream_SetCdmAfterStart) { TEST_F(PipelineImplTest, Seek) { CreateAudioAndVideoStream(); - SetDemuxerExpectations(base::TimeDelta::FromSeconds(3000)); + SetDemuxerExpectations(base::Seconds(3000)); // Initialize then seek! StartPipelineAndExpect(PIPELINE_OK); // Every filter should receive a call to Seek(). - base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); + base::TimeDelta expected = base::Seconds(2000); ExpectSeek(expected, false); DoSeek(expected); } TEST_F(PipelineImplTest, SeekAfterError) { CreateAudioStream(); - SetDemuxerExpectations(base::TimeDelta::FromSeconds(3000)); + SetDemuxerExpectations(base::Seconds(3000)); // Initialize then seek! StartPipelineAndExpect(PIPELINE_OK); @@ -584,14 +585,14 @@ TEST_F(PipelineImplTest, SeekAfterError) { EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_INVALID_STATE)); pipeline_->Seek( - base::TimeDelta::FromMilliseconds(100), + base::Milliseconds(100), base::BindOnce(&CallbackHelper::OnSeek, base::Unretained(&callbacks_))); base::RunLoop().RunUntilIdle(); } TEST_F(PipelineImplTest, SuspendResume) { CreateAudioAndVideoStream(); - SetDemuxerExpectations(base::TimeDelta::FromSeconds(3000)); + SetDemuxerExpectations(base::Seconds(3000)); StartPipelineAndExpect(PIPELINE_OK); @@ -617,7 +618,7 @@ TEST_F(PipelineImplTest, SuspendResume) { EXPECT_EQ(0, pipeline_->GetStatistics().audio_memory_usage); EXPECT_EQ(0, pipeline_->GetStatistics().video_memory_usage); - base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); + base::TimeDelta expected = base::Seconds(2000); ExpectResume(expected); EXPECT_CALL(*renderer_, SetPreservesPitch(false)).Times(1); @@ -679,7 +680,7 @@ TEST_F(PipelineImplTest, SetPreservesPitch) { TEST_F(PipelineImplTest, Properties) { CreateVideoStream(); - const auto kDuration = base::TimeDelta::FromSeconds(100); + const auto kDuration = base::Seconds(100); SetDemuxerExpectations(kDuration); StartPipelineAndExpect(PIPELINE_OK); @@ -690,7 +691,7 @@ TEST_F(PipelineImplTest, Properties) { TEST_F(PipelineImplTest, GetBufferedTimeRanges) { CreateVideoStream(); - const auto kDuration = base::TimeDelta::FromSeconds(100); + const auto kDuration = base::Seconds(100); SetDemuxerExpectations(kDuration); StartPipelineAndExpect(PIPELINE_OK); @@ -714,7 +715,7 @@ TEST_F(PipelineImplTest, BufferedTimeRangesCanChangeAfterStop) { base::RunLoop().RunUntilIdle(); pipeline_->Stop(); - RunBufferedTimeRangesTest(base::TimeDelta::FromSeconds(5)); + RunBufferedTimeRangesTest(base::Seconds(5)); } TEST_F(PipelineImplTest, OnStatisticsUpdate) { @@ -769,7 +770,7 @@ TEST_F(PipelineImplTest, EndedCallback) { base::RunLoop().RunUntilIdle(); } -TEST_F(PipelineImplTest, ErrorDuringSeek) { +TEST_F(PipelineImplTest, DemuxerErrorDuringSeek) { CreateAudioStream(); SetDemuxerExpectations(); StartPipelineAndExpect(PIPELINE_OK); @@ -779,7 +780,7 @@ TEST_F(PipelineImplTest, ErrorDuringSeek) { pipeline_->SetPlaybackRate(playback_rate); base::RunLoop().RunUntilIdle(); - base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); + base::TimeDelta seek_time = base::Seconds(5); EXPECT_CALL(*renderer_, OnFlush(_)).WillOnce(RunOnceClosure<0>()); @@ -795,6 +796,48 @@ TEST_F(PipelineImplTest, ErrorDuringSeek) { base::RunLoop().RunUntilIdle(); } +TEST_F(PipelineImplTest, PipelineErrorDuringSeek) { + CreateAudioStream(); + SetDemuxerExpectations(); + StartPipelineAndExpect(PIPELINE_OK); + + base::TimeDelta seek_time = base::Seconds(5); + + // Set expectations for seek. + EXPECT_CALL(*renderer_, OnFlush(_)).WillOnce(RunOnceClosure<0>()); + EXPECT_CALL(*renderer_, SetPlaybackRate(_)); + EXPECT_CALL(*renderer_, StartPlayingFrom(seek_time)); + EXPECT_CALL(*demuxer_, AbortPendingReads()); + EXPECT_CALL(*demuxer_, OnSeek(seek_time, _)) + .WillOnce(RunOnceCallback<1>(PIPELINE_OK)); + EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_DECODE)); + + // Triggers pipeline error during pending seek. + pipeline_->Seek(seek_time, base::BindOnce(&CallbackHelper::OnSeek, + base::Unretained(&callbacks_))); + renderer_client_->OnError(PIPELINE_ERROR_DECODE); + base::RunLoop().RunUntilIdle(); +} + +TEST_F(PipelineImplTest, PipelineErrorDuringSuspend) { + CreateAudioAndVideoStream(); + SetDemuxerExpectations(base::Seconds(3000)); + StartPipelineAndExpect(PIPELINE_OK); + + // Set expectations for suspend. + EXPECT_CALL(*demuxer_, AbortPendingReads()); + EXPECT_CALL(*renderer_, SetPlaybackRate(0)); + EXPECT_CALL(callbacks_, OnSuspend(PIPELINE_ERROR_DECODE)); + + // Triggers pipeline error during pending suspend. The order matters for + // reproducing crbug.com/1250636. Otherwise OnError() is ignored if already in + // kSuspending state. + renderer_client_->OnError(PIPELINE_ERROR_DECODE); + pipeline_->Suspend(base::BindOnce(&CallbackHelper::OnSuspend, + base::Unretained(&callbacks_))); + base::RunLoop().RunUntilIdle(); +} + TEST_F(PipelineImplTest, DestroyAfterStop) { CreateAudioStream(); SetDemuxerExpectations(); @@ -819,13 +862,13 @@ TEST_F(PipelineImplTest, Underflow) { base::RunLoop().RunUntilIdle(); // Seek while underflowed. - base::TimeDelta expected = base::TimeDelta::FromSeconds(5); + base::TimeDelta expected = base::Seconds(5); ExpectSeek(expected, true); DoSeek(expected); } TEST_F(PipelineImplTest, PositiveStartTime) { - start_time_ = base::TimeDelta::FromSeconds(1); + start_time_ = base::Seconds(1); EXPECT_CALL(*demuxer_, GetStartTime()).WillRepeatedly(Return(start_time_)); CreateAudioStream(); SetDemuxerExpectations(); @@ -841,14 +884,14 @@ TEST_F(PipelineImplTest, GetMediaTime) { StartPipelineAndExpect(PIPELINE_OK); // Pipeline should report the same media time returned by the renderer. - base::TimeDelta kMediaTime = base::TimeDelta::FromSeconds(2); + base::TimeDelta kMediaTime = base::Seconds(2); EXPECT_CALL(*renderer_, GetMediaTime()).WillRepeatedly(Return(kMediaTime)); EXPECT_EQ(kMediaTime, pipeline_->GetMediaTime()); // Media time should not go backwards even if the renderer returns an // errorneous value. PipelineImpl should clamp it to last reported value. EXPECT_CALL(*renderer_, GetMediaTime()) - .WillRepeatedly(Return(base::TimeDelta::FromSeconds(1))); + .WillRepeatedly(Return(base::Seconds(1))); EXPECT_EQ(kMediaTime, pipeline_->GetMediaTime()); } @@ -862,13 +905,13 @@ TEST_F(PipelineImplTest, GetMediaTimeAfterSeek) { StartPipelineAndExpect(PIPELINE_OK); // Pipeline should report the same media time returned by the renderer. - base::TimeDelta kMediaTime = base::TimeDelta::FromSeconds(2); + base::TimeDelta kMediaTime = base::Seconds(2); EXPECT_CALL(*renderer_, GetMediaTime()).WillRepeatedly(Return(kMediaTime)); EXPECT_EQ(kMediaTime, pipeline_->GetMediaTime()); // Seek backward 1 second. Do not run RunLoop to ensure renderer is not yet // notified of the seek (via media thread). - base::TimeDelta kSeekTime = kMediaTime - base::TimeDelta::FromSeconds(1); + base::TimeDelta kSeekTime = kMediaTime - base::Seconds(1); ExpectSeek(kSeekTime, false); pipeline_->Seek(kSeekTime, base::BindOnce(&CallbackHelper::OnSeek, base::Unretained(&callbacks_))); @@ -939,6 +982,10 @@ class PipelineTeardownTest : public PipelineImplTest { }; PipelineTeardownTest() = default; + + PipelineTeardownTest(const PipelineTeardownTest&) = delete; + PipelineTeardownTest& operator=(const PipelineTeardownTest&) = delete; + ~PipelineTeardownTest() override = default; void RunTest(TeardownState state, StopOrError stop_or_error) { @@ -999,7 +1046,7 @@ class PipelineTeardownTest : public PipelineImplTest { CreateAudioStream(); CreateVideoStream(); - SetDemuxerExpectations(base::TimeDelta::FromSeconds(3000)); + SetDemuxerExpectations(base::Seconds(3000)); EXPECT_CALL(*renderer_, SetVolume(1.0f)); if (state == kInitRenderer) { @@ -1044,7 +1091,7 @@ class PipelineTeardownTest : public PipelineImplTest { EXPECT_CALL(*demuxer_, Stop()); pipeline_->Seek( - base::TimeDelta::FromSeconds(10), + base::Seconds(10), base::BindOnce(&CallbackHelper::OnSeek, base::Unretained(&callbacks_))); base::RunLoop().RunUntilIdle(); } @@ -1155,8 +1202,6 @@ class PipelineTeardownTest : public PipelineImplTest { base::RunLoop().RunUntilIdle(); } - - DISALLOW_COPY_AND_ASSIGN(PipelineTeardownTest); }; #define INSTANTIATE_TEARDOWN_TEST(stop_or_error, state) \ diff --git a/chromium/media/base/reentrancy_checker.h b/chromium/media/base/reentrancy_checker.h index 574a70b2e53..dbe08ac54c6 100644 --- a/chromium/media/base/reentrancy_checker.h +++ b/chromium/media/base/reentrancy_checker.h @@ -50,13 +50,15 @@ namespace media { class SCOPED_LOCKABLE MEDIA_EXPORT NonReentrantScope { public: explicit NonReentrantScope(base::Lock& lock) EXCLUSIVE_LOCK_FUNCTION(lock); + + NonReentrantScope(const NonReentrantScope&) = delete; + NonReentrantScope& operator=(const NonReentrantScope&) = delete; + ~NonReentrantScope() UNLOCK_FUNCTION(); private: base::Lock& lock_; bool is_lock_holder_ = false; - - DISALLOW_COPY_AND_ASSIGN(NonReentrantScope); }; } // namespace media diff --git a/chromium/media/base/renderer.h b/chromium/media/base/renderer.h index 09d775f0c99..809657cd991 100644 --- a/chromium/media/base/renderer.h +++ b/chromium/media/base/renderer.h @@ -25,6 +25,9 @@ class MEDIA_EXPORT Renderer { public: Renderer(); + Renderer(const Renderer&) = delete; + Renderer& operator=(const Renderer&) = delete; + // Stops rendering and fires any pending callbacks. virtual ~Renderer(); @@ -88,9 +91,6 @@ class MEDIA_EXPORT Renderer { virtual void OnEnabledAudioTracksChanged( const std::vector<DemuxerStream*>& enabled_tracks, base::OnceClosure change_completed_cb); - - private: - DISALLOW_COPY_AND_ASSIGN(Renderer); }; } // namespace media diff --git a/chromium/media/base/renderer_factory.h b/chromium/media/base/renderer_factory.h index 1001d7e0ff0..20d4a955eab 100644 --- a/chromium/media/base/renderer_factory.h +++ b/chromium/media/base/renderer_factory.h @@ -29,6 +29,10 @@ class VideoRendererSink; class MEDIA_EXPORT RendererFactory { public: RendererFactory(); + + RendererFactory(const RendererFactory&) = delete; + RendererFactory& operator=(const RendererFactory&) = delete; + virtual ~RendererFactory(); // Creates and returns a Renderer. All methods of the created Renderer except @@ -48,9 +52,6 @@ class MEDIA_EXPORT RendererFactory { // created by this factory. // NOTE: Returns Type::STREAM by default. virtual MediaResource::Type GetRequiredMediaResourceType(); - - private: - DISALLOW_COPY_AND_ASSIGN(RendererFactory); }; } // namespace media diff --git a/chromium/media/base/renderer_factory_selector.h b/chromium/media/base/renderer_factory_selector.h index abe0c9335aa..bfef2293c2e 100644 --- a/chromium/media/base/renderer_factory_selector.h +++ b/chromium/media/base/renderer_factory_selector.h @@ -61,6 +61,10 @@ class MEDIA_EXPORT RendererFactorySelector { using ConditionalFactoryCB = base::RepeatingCallback<bool()>; RendererFactorySelector(); + + RendererFactorySelector(const RendererFactorySelector&) = delete; + RendererFactorySelector& operator=(const RendererFactorySelector&) = delete; + ~RendererFactorySelector(); // See file level comments above. @@ -107,8 +111,6 @@ class MEDIA_EXPORT RendererFactorySelector { RequestRemotePlayStateChangeCB remote_play_state_change_cb_request_; std::map<RendererType, std::unique_ptr<RendererFactory>> factories_; - - DISALLOW_COPY_AND_ASSIGN(RendererFactorySelector); }; } // namespace media diff --git a/chromium/media/base/scoped_async_trace.h b/chromium/media/base/scoped_async_trace.h index e448689410f..a8502a7d56d 100644 --- a/chromium/media/base/scoped_async_trace.h +++ b/chromium/media/base/scoped_async_trace.h @@ -25,6 +25,9 @@ class MEDIA_EXPORT ScopedAsyncTrace { // other words, use literal strings only. See trace_event_common.h . static std::unique_ptr<ScopedAsyncTrace> CreateIfEnabled(const char* name); + ScopedAsyncTrace(const ScopedAsyncTrace&) = delete; + ScopedAsyncTrace& operator=(const ScopedAsyncTrace&) = delete; + ~ScopedAsyncTrace(); // TODO(liberato): Add StepInto / StepPast. @@ -33,8 +36,6 @@ class MEDIA_EXPORT ScopedAsyncTrace { explicit ScopedAsyncTrace(const char* name); const char* name_ = nullptr; - - DISALLOW_COPY_AND_ASSIGN(ScopedAsyncTrace); }; } // namespace media diff --git a/chromium/media/base/scopedfd_helper.h b/chromium/media/base/scopedfd_helper.h index 5cc8086c499..7767244f47b 100644 --- a/chromium/media/base/scopedfd_helper.h +++ b/chromium/media/base/scopedfd_helper.h @@ -6,6 +6,7 @@ #define MEDIA_BASE_SCOPEDFD_HELPER_H_ #include "base/files/scoped_file.h" +#include "build/build_config.h" #include "media/base/media_export.h" namespace media { diff --git a/chromium/media/base/seekable_buffer.cc b/chromium/media/base/seekable_buffer.cc index 9e8faf6f1e6..a3766bcc003 100644 --- a/chromium/media/base/seekable_buffer.cc +++ b/chromium/media/base/seekable_buffer.cc @@ -269,8 +269,7 @@ void SeekableBuffer::UpdateCurrentTime(BufferQueue::iterator buffer, int64_t time_offset = ((*buffer)->duration().InMicroseconds() * offset) / (*buffer)->data_size(); - current_time_ = (*buffer)->timestamp() + - base::TimeDelta::FromMicroseconds(time_offset); + current_time_ = (*buffer)->timestamp() + base::Microseconds(time_offset); } } diff --git a/chromium/media/base/seekable_buffer.h b/chromium/media/base/seekable_buffer.h index 74a491bea3d..b31e62483ca 100644 --- a/chromium/media/base/seekable_buffer.h +++ b/chromium/media/base/seekable_buffer.h @@ -52,6 +52,9 @@ class MEDIA_EXPORT SeekableBuffer { // The values are in bytes. SeekableBuffer(int backward_capacity, int forward_capacity); + SeekableBuffer(const SeekableBuffer&) = delete; + SeekableBuffer& operator=(const SeekableBuffer&) = delete; + ~SeekableBuffer(); // Clears the buffer queue. @@ -180,8 +183,6 @@ class MEDIA_EXPORT SeekableBuffer { // Keeps track of the most recent time we've seen in case the |buffers_| is // empty when our owner asks what time it is. base::TimeDelta current_time_; - - DISALLOW_COPY_AND_ASSIGN(SeekableBuffer); }; } // namespace media diff --git a/chromium/media/base/seekable_buffer_unittest.cc b/chromium/media/base/seekable_buffer_unittest.cc index 37468740cc9..d1df6a3ca9b 100644 --- a/chromium/media/base/seekable_buffer_unittest.cc +++ b/chromium/media/base/seekable_buffer_unittest.cc @@ -338,10 +338,8 @@ TEST_F(SeekableBufferTest, GetTime) { scoped_refptr<DataBuffer> buffer = DataBuffer::CopyFrom(data_, kWriteSize); for (size_t i = 0; i < base::size(tests); ++i) { - buffer->set_timestamp(base::TimeDelta::FromMicroseconds( - tests[i].first_time_useconds)); - buffer->set_duration(base::TimeDelta::FromMicroseconds( - tests[i].duration_useconds)); + buffer->set_timestamp(base::Microseconds(tests[i].first_time_useconds)); + buffer->set_duration(base::Microseconds(tests[i].duration_useconds)); buffer_.Append(buffer.get()); EXPECT_TRUE(buffer_.Seek(tests[i].consume_bytes)); diff --git a/chromium/media/base/serial_runner_unittest.cc b/chromium/media/base/serial_runner_unittest.cc index 4d7b4435b6a..ae2cb83a885 100644 --- a/chromium/media/base/serial_runner_unittest.cc +++ b/chromium/media/base/serial_runner_unittest.cc @@ -21,6 +21,10 @@ class SerialRunnerTest : public ::testing::Test { public: SerialRunnerTest() : inside_start_(false), done_called_(false), done_status_(PIPELINE_OK) {} + + SerialRunnerTest(const SerialRunnerTest&) = delete; + SerialRunnerTest& operator=(const SerialRunnerTest&) = delete; + ~SerialRunnerTest() override = default; void RunSerialRunner() { @@ -140,8 +144,6 @@ class SerialRunnerTest : public ::testing::Test { // Tracks whether the final done callback was called + resulting status. bool done_called_; PipelineStatus done_status_; - - DISALLOW_COPY_AND_ASSIGN(SerialRunnerTest); }; TEST_F(SerialRunnerTest, Empty) { diff --git a/chromium/media/base/silent_sink_suspender.cc b/chromium/media/base/silent_sink_suspender.cc index 42de9b7cd83..fbbf0269ca4 100644 --- a/chromium/media/base/silent_sink_suspender.cc +++ b/chromium/media/base/silent_sink_suspender.cc @@ -118,6 +118,10 @@ void SilentSinkSuspender::OnRenderError() { void SilentSinkSuspender::OnPaused() { DCHECK(task_runner_->BelongsToCurrentThread()); + // This is a no-op if the sink isn't running, but must be executed without the + // |transition_lock_| being held to avoid possible deadlock. + fake_sink_.Stop(); + base::AutoLock al(transition_lock_); // Nothing to do if we haven't touched the sink. @@ -128,12 +132,7 @@ void SilentSinkSuspender::OnPaused() { // If we've moved over to the fake sink, we just need to stop it and cancel // any pending transitions. - if (is_using_fake_sink_) { - is_using_fake_sink_ = false; - fake_sink_.Stop(); - } - - // Cancel any pending transitions. + is_using_fake_sink_ = false; is_transition_pending_ = false; first_silence_time_ = base::TimeTicks(); sink_transition_callback_.Reset(base::BindRepeating( diff --git a/chromium/media/base/silent_sink_suspender.h b/chromium/media/base/silent_sink_suspender.h index 40fc611c402..3662f27fe56 100644 --- a/chromium/media/base/silent_sink_suspender.h +++ b/chromium/media/base/silent_sink_suspender.h @@ -43,6 +43,10 @@ class MEDIA_EXPORT SilentSinkSuspender const AudioParameters& params, scoped_refptr<AudioRendererSink> sink, scoped_refptr<base::SingleThreadTaskRunner> worker); + + SilentSinkSuspender(const SilentSinkSuspender&) = delete; + SilentSinkSuspender& operator=(const SilentSinkSuspender&) = delete; + ~SilentSinkSuspender() override; // AudioRendererSink::RenderCallback implementation. @@ -125,8 +129,6 @@ class MEDIA_EXPORT SilentSinkSuspender // Time when transition to |fake_sink_| starts. base::TimeTicks fake_sink_transition_time_; - - DISALLOW_COPY_AND_ASSIGN(SilentSinkSuspender); }; } // namespace media diff --git a/chromium/media/base/silent_sink_suspender_unittest.cc b/chromium/media/base/silent_sink_suspender_unittest.cc index 5ac51cc74a2..e9a69e3b318 100644 --- a/chromium/media/base/silent_sink_suspender_unittest.cc +++ b/chromium/media/base/silent_sink_suspender_unittest.cc @@ -19,19 +19,20 @@ namespace media { class SilentSinkSuspenderTest : public testing::Test { public: SilentSinkSuspenderTest() - : params_(AudioParameters::AUDIO_FAKE, - CHANNEL_LAYOUT_MONO, - 44100, - 128), + : params_(AudioParameters::AUDIO_FAKE, CHANNEL_LAYOUT_MONO, 44100, 128), mock_sink_(new testing::StrictMock<MockAudioRendererSink>()), fake_callback_(0.1, params_.sample_rate()), temp_bus_(AudioBus::Create(params_)), // Set a negative timeout so any silence will suspend immediately. suspender_(&fake_callback_, - base::TimeDelta::FromSeconds(-1), + base::Seconds(-1), params_, mock_sink_, test_loop_.task_runner()) {} + + SilentSinkSuspenderTest(const SilentSinkSuspenderTest&) = delete; + SilentSinkSuspenderTest& operator=(const SilentSinkSuspenderTest&) = delete; + ~SilentSinkSuspenderTest() override = default; protected: @@ -41,14 +42,11 @@ class SilentSinkSuspenderTest : public testing::Test { FakeAudioRenderCallback fake_callback_; std::unique_ptr<AudioBus> temp_bus_; SilentSinkSuspender suspender_; - - private: - DISALLOW_COPY_AND_ASSIGN(SilentSinkSuspenderTest); }; TEST_F(SilentSinkSuspenderTest, BasicPassthough) { temp_bus_->Zero(); - auto delay = base::TimeDelta::FromMilliseconds(20); + auto delay = base::Milliseconds(20); EXPECT_EQ(temp_bus_->frames(), suspender_.Render(delay, base::TimeTicks(), 0, temp_bus_.get())); diff --git a/chromium/media/base/simple_watch_timer.cc b/chromium/media/base/simple_watch_timer.cc index 83668dfd7a2..16869b35283 100644 --- a/chromium/media/base/simple_watch_timer.cc +++ b/chromium/media/base/simple_watch_timer.cc @@ -11,8 +11,7 @@ namespace media { namespace { -constexpr base::TimeDelta kQueryInterval = - base::TimeDelta::FromMilliseconds(750); +constexpr base::TimeDelta kQueryInterval = base::Milliseconds(750); } // namespace diff --git a/chromium/media/base/simple_watch_timer.h b/chromium/media/base/simple_watch_timer.h index 777fc9b5ed2..e837c1a7904 100644 --- a/chromium/media/base/simple_watch_timer.h +++ b/chromium/media/base/simple_watch_timer.h @@ -33,6 +33,10 @@ class MEDIA_EXPORT SimpleWatchTimer { using GetCurrentTimeCB = base::RepeatingCallback<base::TimeDelta()>; SimpleWatchTimer(TickCB tick_cb, GetCurrentTimeCB get_current_time_cb); + + SimpleWatchTimer(const SimpleWatchTimer&) = delete; + SimpleWatchTimer& operator=(const SimpleWatchTimer&) = delete; + ~SimpleWatchTimer(); void Start(); @@ -47,8 +51,6 @@ class MEDIA_EXPORT SimpleWatchTimer { int unreported_ms_ = 0; base::TimeDelta last_current_time_; base::RepeatingTimer timer_; - - DISALLOW_COPY_AND_ASSIGN(SimpleWatchTimer); }; } // namespace media diff --git a/chromium/media/base/sinc_resampler.h b/chromium/media/base/sinc_resampler.h index b0e76d4118e..8cbae16a742 100644 --- a/chromium/media/base/sinc_resampler.h +++ b/chromium/media/base/sinc_resampler.h @@ -50,6 +50,10 @@ class MEDIA_EXPORT SincResampler { SincResampler(double io_sample_rate_ratio, int request_frames, const ReadCB read_cb); + + SincResampler(const SincResampler&) = delete; + SincResampler& operator=(const SincResampler&) = delete; + ~SincResampler(); // Resample |frames| of data from |read_cb_| into |destination|. @@ -170,8 +174,6 @@ class MEDIA_EXPORT SincResampler { float* const r2_; float* r3_; float* r4_; - - DISALLOW_COPY_AND_ASSIGN(SincResampler); }; } // namespace media diff --git a/chromium/media/base/sinc_resampler_unittest.cc b/chromium/media/base/sinc_resampler_unittest.cc index 79d393869ed..f8226a7c140 100644 --- a/chromium/media/base/sinc_resampler_unittest.cc +++ b/chromium/media/base/sinc_resampler_unittest.cc @@ -201,6 +201,10 @@ class SinusoidalLinearChirpSource { k_ = (max_frequency_ - kMinFrequency) / duration; } + SinusoidalLinearChirpSource(const SinusoidalLinearChirpSource&) = delete; + SinusoidalLinearChirpSource& operator=(const SinusoidalLinearChirpSource&) = + delete; + virtual ~SinusoidalLinearChirpSource() = default; void ProvideInput(int frames, float* destination) { @@ -234,8 +238,6 @@ class SinusoidalLinearChirpSource { double max_frequency_; double k_; int current_index_; - - DISALLOW_COPY_AND_ASSIGN(SinusoidalLinearChirpSource); }; typedef std::tuple<int, int, double, double> SincResamplerTestData; diff --git a/chromium/media/base/status.cc b/chromium/media/base/status.cc index 8bfa2f999b2..75bbde250b5 100644 --- a/chromium/media/base/status.cc +++ b/chromium/media/base/status.cc @@ -10,70 +10,52 @@ namespace media { -Status::Status() = default; +namespace internal { -Status::Status(StatusCode code, - base::StringPiece message, - const base::Location& location) { - // Note that |message| is dropped in this case. - if (code == StatusCode::kOk) { - DCHECK(message.empty()); - return; - } - data_ = std::make_unique<StatusInternal>(code, std::string(message)); - AddFrame(location); -} +StatusData::StatusData() = default; -// Copy Constructor -Status::Status(const Status& copy) { +StatusData::StatusData(const StatusData& copy) { *this = copy; } -Status& Status::operator=(const Status& copy) { - if (copy.is_ok()) { - data_.reset(); - return *this; - } - - data_ = std::make_unique<StatusInternal>(copy.code(), copy.message()); - for (const base::Value& frame : copy.data_->frames) - data_->frames.push_back(frame.Clone()); - for (const Status& err : copy.data_->causes) - data_->causes.push_back(err); - data_->data = copy.data_->data.Clone(); - return *this; -} - -// Allow move. -Status::Status(Status&&) = default; -Status& Status::operator=(Status&&) = default; - -Status::~Status() = default; - -Status::StatusInternal::StatusInternal(StatusCode code, std::string message) - : code(code), +StatusData::StatusData(StatusGroupType group, + StatusCodeType code, + std::string message) + : group(group), + code(code), message(std::move(message)), data(base::Value(base::Value::Type::DICTIONARY)) {} -Status::StatusInternal::~StatusInternal() = default; - -Status&& Status::AddHere(const base::Location& location) && { - DCHECK(data_); - AddFrame(location); - return std::move(*this); +std::unique_ptr<StatusData> StatusData::copy() const { + auto result = std::make_unique<StatusData>(group, code, message); + for (const auto& frame : frames) + result->frames.push_back(frame.Clone()); + for (const auto& cause : causes) + result->causes.push_back(cause); + result->data = data.Clone(); + return result; } -Status&& Status::AddCause(Status&& cause) && { - DCHECK(data_ && cause.data_); - data_->causes.push_back(std::move(cause)); - return std::move(*this); +StatusData::~StatusData() = default; + +StatusData& StatusData::operator=(const StatusData& copy) { + group = copy.group; + code = copy.code; + message = copy.message; + for (const auto& frame : copy.frames) + frames.push_back(frame.Clone()); + for (const auto& cause : copy.causes) + causes.push_back(cause); + data = copy.data.Clone(); + return *this; } -void Status::AddFrame(const base::Location& location) { - DCHECK(data_); - data_->frames.push_back(MediaSerialize(location)); +void StatusData::AddLocation(const base::Location& location) { + frames.push_back(MediaSerialize(location)); } +} // namespace internal + Status OkStatus() { return Status(StatusCode::kOk); } diff --git a/chromium/media/base/status.h b/chromium/media/base/status.h index d8e74805bb9..ced9c6e51e3 100644 --- a/chromium/media/base/status.h +++ b/chromium/media/base/status.h @@ -7,6 +7,7 @@ #include <memory> #include <string> +#include <type_traits> #include <utility> #include <vector> @@ -25,243 +26,291 @@ struct StructTraits; namespace media { -namespace mojom { -class StatusDataView; -} +// See media/base/status.md for details and instructions for +// using TypedStatus<T>. + +// This is the type that enum classes used for specializing |TypedStatus| must +// extend from. +using StatusCodeType = uint16_t; + +// This is the type that TypedStatusTraits::Group should be. +using StatusGroupType = base::StringPiece; + +namespace internal { + +struct MEDIA_EXPORT StatusData { + StatusData(); + StatusData(const StatusData&); + StatusData(StatusGroupType group, StatusCodeType code, std::string message); + ~StatusData(); + StatusData& operator=(const StatusData&); + + std::unique_ptr<StatusData> copy() const; + void AddLocation(const base::Location&); + + // Enum group ID. + std::string group; + + // Entry within enum, cast to base type. + StatusCodeType code; + + // The current error message (Can be used for + // https://developer.mozilla.org/en-US/docs/Web/API/Status) + std::string message; + + // Stack frames + std::vector<base::Value> frames; + + // Causes + std::vector<StatusData> causes; + + // Data attached to the error + base::Value data; +}; + +} // namespace internal + +// See media/base/status.md for details and instructions for using TypedStatus. +template <typename T> +class MEDIA_EXPORT TypedStatus { + static_assert(std::is_enum<typename T::Codes>::value, + "TypedStatus must only be specialized with enum types."); -// Status is meant to be a relatively small (sizeof(void*) bytes) object -// that can be returned as a status value from functions or passed to callbacks -// that want a report of status. Status allows attaching of arbitrary named -// data, other Status' as causes, and stack frames, which can all be logged -// and reported throughout the media stack. The status code and message are -// immutable and can be used to give a stable numeric ID for any error -// generated by media code. -// There is also an OK state which can't hold any data and is only for -// successful returns. -class MEDIA_EXPORT Status { public: - // This will create a kOk status, but please don't use it. Use either - // Status(StatusCode::kOk) or OkStatus(). This is here because the mojo - // bindings assume that it is. - // TODO(crbug.com/1106492): Remove this. - Status(); + using Traits = T; + using Codes = typename T::Codes; + + // default constructor to please the Mojo Gods. + TypedStatus() = default; - // Constructor to create a new Status from a numeric code & message. + // Constructor to create a new TypedStatus from a numeric code & message. // These are immutable; if you'd like to change them, then you likely should - // create a new Status. Either {StatusCode::kOk} or OkStatus() may be used to - // create a success status. + // create a new TypedStatus. // NOTE: This should never be given a location parameter when called - It is // defaulted in order to grab the caller location. - Status(StatusCode code, - base::StringPiece message = "", - const base::Location& location = base::Location::Current()); - - // Copy Constructor & assignment. (Mojo uses both of these) - Status(const Status&); - Status& operator=(const Status&); + TypedStatus(Codes code, + base::StringPiece message = "", + const base::Location& location = base::Location::Current()) { + // Note that |message| would be dropped when code is the default value, + // so DCHECK that it is not set. + if (code == Traits::DefaultEnumValue()) { + DCHECK(!!message.empty()); + return; + } + data_ = std::make_unique<internal::StatusData>( + Traits::Group(), static_cast<StatusCodeType>(code), + std::string(message)); + data_->AddLocation(location); + } - // Allows move. - Status(Status&&); - Status& operator=(Status&&); + TypedStatus(const TypedStatus<T>& copy) { *this = copy; } - // Needs an out of line destructor... - ~Status(); + TypedStatus<T>& operator=(const TypedStatus<T>& copy) { + if (!copy.data_) { + data_.reset(); + return *this; + } + data_ = copy.data_->copy(); + return *this; + } + // DEPRECATED: check code() == ok value. bool is_ok() const { return !data_; } - // Getters for internal fields + Codes code() const { + if (!data_) + return *Traits::DefaultEnumValue(); + return static_cast<Codes>(data_->code); + } + + const std::string group() const { + return data_ ? data_->group : Traits::Group(); + } + const std::string& message() const { DCHECK(data_); return data_->message; } - StatusCode code() const { return data_ ? data_->code : StatusCode::kOk; } - - // Adds the current location to Status as it’s passed upwards. + // Adds the current location to StatusBase as it’s passed upwards. // This does not need to be called at every location that touches it, but // should be called for those locations where the path is ambiguous or // critical. This can be especially helpful across IPC boundaries. This will // fail on an OK status. // NOTE: This should never be given a parameter when called - It is defaulted // in order to grab the caller location. - Status&& AddHere( - const base::Location& location = base::Location::Current()) &&; - - // Add |cause| as the error that triggered this one. For example, - // DecoderStream might return kDecoderSelectionFailed with one or more causes - // that are the specific errors from the decoders that it tried. - Status&& AddCause(Status&& cause) &&; - void AddCause(Status&& cause) &; + TypedStatus<T>&& AddHere( + const base::Location& location = base::Location::Current()) && { + DCHECK(data_); + // We can't call MediaSerialize directly, because we can't include the + // default serializers header, since it includes this header. + data_->AddLocation(location); + return std::move(*this); + } // Allows us to append any datatype which can be converted to // an int/bool/string/base::Value. Any existing data associated with |key| // will be overwritten by |value|. This will fail on an OK status. - template <typename T> - Status&& WithData(const char* key, const T& value) && { + template <typename D> + TypedStatus<T>&& WithData(const char* key, const D& value) && { DCHECK(data_); data_->data.SetKey(key, MediaSerialize(value)); return std::move(*this); } - template <typename T> - void WithData(const char* key, const T& value) & { + template <typename D> + void WithData(const char* key, const D& value) & { DCHECK(data_); data_->data.SetKey(key, MediaSerialize(value)); } - private: - // Private helper to add the current stack frame to the error trace. - void AddFrame(const base::Location& location); + // Add |cause| as the error that triggered this one. + template <typename AnyTraitsType> + TypedStatus<T>&& AddCause(TypedStatus<AnyTraitsType>&& cause) && { + DCHECK(data_ && cause.data_); + data_->causes.push_back(*cause.data_); + return std::move(*this); + } - // Keep the internal data in a unique ptr to minimize size of OK errors. - struct MEDIA_EXPORT StatusInternal { - StatusInternal(StatusCode code, std::string message); - ~StatusInternal(); + // Add |cause| as the error that triggered this one. + template <typename AnyTraitsType> + void AddCause(TypedStatus<AnyTraitsType>&& cause) & { + DCHECK(data_ && cause.data_); + data_->causes.push_back(*cause.data_); + } - // The current error code - StatusCode code = StatusCode::kOk; + inline bool operator==(T code) const { return code == this->code(); } - // The current error message (Can be used for - // https://developer.mozilla.org/en-US/docs/Web/API/Status) - std::string message; + inline bool operator!=(T code) const { return code != this->code(); } - // Stack frames - std::vector<base::Value> frames; + inline bool operator==(const TypedStatus<T>& other) const { + return other.code() == code(); + } - // Causes - std::vector<Status> causes; + inline bool operator!=(const TypedStatus<T>& other) const { + return other.code() != code(); + } - // Data attached to the error - base::Value data; + template <typename OtherType> + class Or { + public: + ~Or() = default; + + // Implicit constructors allow returning |OtherType| or |TypedStatus| + // directly. + Or(TypedStatus<T>&& error) : error_(std::move(error)) { + // |T| must either not have a default code, or not be default + DCHECK(!Traits::DefaultEnumValue() || + *Traits::DefaultEnumValue() != code()); + } + Or(const TypedStatus<T>& error) : error_(error) { + DCHECK(!Traits::DefaultEnumValue() || + *Traits::DefaultEnumValue() != code()); + } + + Or(OtherType&& value) : value_(std::move(value)) {} + Or(const OtherType& value) : value_(value) {} + Or(typename T::Codes code, + const base::Location& location = base::Location::Current()) + : error_(TypedStatus<T>(code, "", location)) { + DCHECK(!Traits::DefaultEnumValue() || + *Traits::DefaultEnumValue() != code); + } + + // Move- and copy- construction and assignment are okay. + Or(const Or&) = default; + Or(Or&&) = default; + Or& operator=(Or&) = default; + Or& operator=(Or&&) = default; + + bool has_value() const { return value_.has_value(); } + bool has_error() const { return error_.has_value(); } + + inline bool operator==(typename T::Codes code) const { + return code == this->code(); + } + + inline bool operator!=(typename T::Codes code) const { + return code != this->code(); + } + + // Return the error, if we have one. + // Callers should ensure that this |has_error()|. + TypedStatus<T> error() && { + CHECK(error_); + auto error = std::move(*error_); + error_.reset(); + return error; + } + + // Return the value, if we have one. + // Callers should ensure that this |has_value()|. + OtherType value() && { + CHECK(value_); + auto value = std::move(std::get<0>(*value_)); + value_.reset(); + return value; + } + + typename T::Codes code() const { + DCHECK(error_ || value_); + // It is invalid to call |code()| on an |Or| with a value that + // is specialized in a TypedStatus with no DefaultEnumValue. + DCHECK(error_ || Traits::DefaultEnumValue()); + return error_ ? error_->code() : *Traits::DefaultEnumValue(); + } + + private: + absl::optional<TypedStatus<T>> error_; + + // We wrap |OtherType| in a container so that windows COM wrappers work. + // They override operator& and similar, and won't compile in a + // absl::optional. + absl::optional<std::tuple<OtherType>> value_; }; - // Allow self-serialization - friend struct internal::MediaSerializer<Status>; - - // Allow mojo-serialization - friend struct mojo::StructTraits<media::mojom::StatusDataView, Status>; + private: + std::unique_ptr<internal::StatusData> data_; - // A null internals is an implicit OK. - std::unique_ptr<StatusInternal> data_; -}; + template <typename StatusEnum, typename DataView> + friend struct mojo::StructTraits; -// Convenience function to return |kOk|. -// OK won't have a message, trace, or data associated with them, and DCHECK -// if they are added. -MEDIA_EXPORT Status OkStatus(); + // Allow media-serialization + friend struct internal::MediaSerializer<TypedStatus<T>>; -// TODO(liberato): Add more helper functions for common error returns. - -// Helper class to allow returning a `T` or a Status. -// -// It is not okay to send a StatusOr with a status code of `kOk`. `kOk` is -// reserved for cases where there is a `T` rather than a Status. -// -// Typical usage: -// -// StatusOr<std::unique_ptr<MyObject>> FactoryFn() { -// if (success) -// return std::make_unique<MyObject>(); -// return Status(StatusCodes::kSomethingBadHappened); -// } -// -// auto result = FactoryFn(); -// if (result.has_error()) return std::move(result).error(); -// my_object_ = std::move(result).value(); -// -// Can also be combined into a single switch using `code()`: -// -// switch (result.code()) { -// case StatusCode::kOk: -// // `kOk` is special; it means the StatusOr has a `T`. -// // Do something with result.value() -// break; -// // Maybe switch on specific non-kOk codes for special processing. -// default: // Send unknown errors upwards. -// return std::move(result).error(); -// } -// -// Also useful if one would like to get an enum class return value, unless an -// error occurs: -// -// enum class ResultType { kNeedMoreInput, kOutputIsReady, kFormatChanged }; -// -// StatusOr<ResultType> Foo() { ... } -// -// auto result = Foo(); -// if (result.has_error()) return std::move(result).error(); -// switch (std::move(result).value()) { -// case ResultType::kNeedMoreInput: -// ... -// } -template <typename T> -class StatusOr { - public: - // All of these may be implicit, so that one may just return Status or - // the value in question. - /* not explicit */ StatusOr(Status&& error) : error_(std::move(error)) { - DCHECK_NE(code(), StatusCode::kOk); - } - /* not explicit */ StatusOr(const Status& error) : error_(error) { - DCHECK_NE(code(), StatusCode::kOk); - } - StatusOr(StatusCode code, - const base::Location& location = base::Location::Current()) - : error_(Status(code, "", location)) { - DCHECK_NE(code, StatusCode::kOk); + void SetInternalData(std::unique_ptr<internal::StatusData> data) { + data_ = std::move(data); } +}; - StatusOr(T&& value) : value_(std::move(value)) {} - StatusOr(const T& value) : value_(value) {} - - ~StatusOr() = default; - - // Move- and copy- construction and assignment are okay. - StatusOr(const StatusOr&) = default; - StatusOr(StatusOr&&) = default; - StatusOr& operator=(StatusOr&) = default; - StatusOr& operator=(StatusOr&&) = default; - - // Do we have a value? - bool has_value() const { return value_.has_value(); } - - // Do we have an error? - bool has_error() const { return error_.has_value(); } - - // Return the error, if we have one. Up to the caller to make sure that we - // have one via |has_error()|. - // NOTE: once this is called, the StatusOr is defunct and should not be used. - Status error() && { - CHECK(error_); - auto error = std::move(*error_); - error_.reset(); - return error; - } +template <typename T> +inline bool operator==(typename T::Codes code, const TypedStatus<T>& status) { + return status == code; +} - // Return the value. It's up to the caller to verify that we have a value - // before calling this. Also, this only works once, after which we will have - // an error. Use like this: std::move(status_or).value(); - // NOTE: once this is called, the StatusOr is defunct and should not be used. - T value() && { - CHECK(value_); - auto value = std::move(std::get<0>(*value_)); - value_.reset(); - return value; - } +template <typename T> +inline bool operator!=(typename T::Codes code, const TypedStatus<T>& status) { + return status != code; +} - // Returns the error code we have, if any, or `kOk`. - StatusCode code() const { - CHECK(error_ || value_); - return error_ ? error_->code() : StatusCode::kOk; +// Define TypedStatus<StatusCode> as Status in the media namespace for +// backwards compatibility. Also define StatusOr as Status::Or for the +// same reason. +struct GeneralStatusTraits { + using Codes = StatusCode; + static constexpr StatusGroupType Group() { return "GeneralStatusCode"; } + static constexpr absl::optional<StatusCode> DefaultEnumValue() { + return StatusCode::kOk; } - - private: - // Optional error. - absl::optional<Status> error_; - // We wrap |T| in a container so that windows COM wrappers work. They - // override operator& and similar, and won't compile in a absl::optional. - absl::optional<std::tuple<T>> value_; }; +using Status = TypedStatus<GeneralStatusTraits>; +template <typename T> +using StatusOr = Status::Or<T>; + +// Convenience function to return |kOk|. +// OK won't have a message, trace, or data associated with them, and DCHECK +// if they are added. +MEDIA_EXPORT Status OkStatus(); } // namespace media diff --git a/chromium/media/base/status.md b/chromium/media/base/status.md new file mode 100644 index 00000000000..86babf35b0a --- /dev/null +++ b/chromium/media/base/status.md @@ -0,0 +1,178 @@ +# TypedStatus<T> + +The purpose of TypedStatus is to provide a thin wrapper around return-value +enums that support causality tracking, data attachment, and general assistance +with debugging, without adding slowdowns due to returning large structs, +pointers, or more complicated types. + +TypedStatus<T> should be specialized with a traits struct that defines: + + Codes - enum (usually enum class) that would be the return type, if we weren't + using TypedStatus. + static constexpr StatusGroupType Group() { return "NameOfStatus"; } + static constexpr absl::optional<Codes> DefaultEnumValue() { + return Codes::kCodeThatShouldBeSuperOptimizedEGSuccess; + // Can return nullopt to optimize none of them. No idea why you'd do that. + } + +Typically one would: + + struct MyStatusTraits { ... }; + using MyStatus = TypedStatus<MyStatusTraits>; + +## Using an existing `TypedStatus<T>` + +The current canonical TypedStatus is called `Status` for historical reasons, +though that will soon change. + +All TypedStatus specializations have the following common API: + +```c++ +// The underlying code value. +T::Codes code() const; + +// The underlying message. +std::string& message() const; + +// Adds the current file & line number to the trace. +TypedStatus<T>&& AddHere() &&; + +// Adds some named data to the status, such as a platform +// specific error value, ie: HRESULT. This data is for human consumption only +// in a developer setting, and can't be extracted from the TypedStatus +// normally. The code value should be sufficiently informative between sender +// and reciever of the TypedStatus. +template<typename D> +TypedStatus<T>&& WithData(const char *key, const D& value) &&; +template<typename D> +void WithData(const char *key, const D& value) &; + +// Adds a "causal" status to this one. +// The type `R` will not be retained, and similarly with the data methods, +// `cause` will only be used for human consumption, and cannot be extracted +// under normal circumstances. +template<typename R> +TypedStatus<T>&& AddCause(TypedStatus<R>&& cause) &&; +template<typename R> +void AddCause(TypedStatus<R>&& cause) &; +``` + + +## Quick usage guide + +If you have an existing enum, and would like to wrap it: +```c++ +enum class MyExampleEnum : StatusCodeType { + kDefaultValue = 1, + kThisIsAnExample = 2, + kDontArgueInTheCommentSection = 3, +}; +``` + +Define an |TypedStatusTraits|, picking a name for the group of codes: +(copying the desciptive comments is not suggested) + +```c++ +struct MyExampleStatusTraits { + // If you do not have an existing enum, you can `enum class Codes { ... };` + // here, instead of `using`. + using Codes = MyExampleEnum; + static constexpr StatusGroupType Group() { return "MyExampleStatus"; } + static constexpr absl::optional<Codes> { return Codes::kDefaultValue; } +} +``` + +Bind your typename: +```c++ +using MyExampleStatus = media::TypedStatus<MyExampleStatusTraits>; +``` + +Use your new type: +```c++ +MyExampleStatus Foo() { + return MyExampleStatus::Codes::kThisIsAnExample; +} + +int main() { + auto result = Foo(); + switch(result.code()) { + case MyExampleStatus::Codes::...: + break; + ... + } +} +``` + +For the common case where you'd like to return some constructed thing OR +an error type, we've also created `TypedStatus<T>::Or<D>`. + +The `TypedStatus<T>::Or<D>` type can be constructed implicitly with either +a `TypedStatus<T>`, a `T`, or a `D`. + +This type has methods: +```c++ +bool has_value() const; +bool has_error() const; + +// Return the error, if we have one. +// Callers should ensure that this `has_error()`. +TypedStatus<T> error() &&; + +// Return the value, if we have one. +// Callers should ensure that this `has_value()`. +OtherType value() &&; + +// It is invalid to call `code()` on an `Or<D>` type when +// has_value() is true and TypedStatusTraits<T>::DefaultEnumValue is nullopt. +T::Codes code(); +``` + +Example usage: +```c++ +MyExampleStatus::Or<std::unique_ptr<VideoDecoder>> CreateAndInitializeDecoder() { + std::unique_ptr<VideoDecoder> decoder = decoder_factory_->GiveMeYourBestDecoder(); + auto init_status = decoder->Initialize(init_args_); + // If the decoder initialized successfully, then just return it. + if (init_status == InitStatusCodes::kOk) + return std::move(decoder); + // Otherwise, return a MediaExampleStatus caused by the init status. + return MyExampleStatus(MyExampleEnum::kDontArgueInTheCommentSection).AddCause( + std::move(init_status)); +} + +int main() { + auto result = CreateAndInitializeDecoder(); + if (result.has_value()) + decoder_loop_->SetDecoder(std::move(result).value()); + else + logger_->SendError(std::move(result).error()); +} + +``` + + +## Additional setup for mojo + +If you want to send a specialization of TypedStatus over mojo, +add the following to media_types.mojom: + +``` +struct MyExampleEnum { + StatusBase? internal; +}; +``` + +And add the following to media/mojo/mojom/BUILD.gn near the `StatusData` type +binding. + +``` +{ + mojom = "media.mojom.MyExampleEnum", + cpp = "::media::MyExampleEnum" +}, +``` + + + +## Design decisions +See go/typedstatus for design decisions. diff --git a/chromium/media/base/status_codes.h b/chromium/media/base/status_codes.h index b14beb9abdb..c2d60df383e 100644 --- a/chromium/media/base/status_codes.h +++ b/chromium/media/base/status_codes.h @@ -13,181 +13,184 @@ namespace media { -using StatusCodeType = int32_t; +using StatusCodeType = uint16_t; // TODO(tmathmeyer, liberato, xhwang) These numbers are not yet finalized: // DO NOT use them for reporting statistics, and DO NOT report them to any // user-facing feature, including media log. // Codes are grouped with a bitmask: -// 0xFFFFFFFF -// └─┬┘├┘└┴ enumeration within the group -// │ └─ group code -// └─ reserved for now +// 0xFFFF +// ├┘└┴ enumeration within the group +// └─ group code // 256 groups is more than anyone will ever need on a computer. enum class StatusCode : StatusCodeType { kOk = 0, // General errors: 0x00 - kAborted = 0x00000001, - kInvalidArgument = 0x00000002, - kKeyFrameRequired = 0x00000003, + kAborted = 0x0001, + kInvalidArgument = 0x0002, + kKeyFrameRequired = 0x0003, // Decoder Errors: 0x01 - kDecoderInitializeNeverCompleted = 0x00000101, - kDecoderFailedDecode = 0x00000102, - kDecoderUnsupportedProfile = 0x00000103, - kDecoderUnsupportedCodec = 0x00000104, - kDecoderUnsupportedConfig = 0x00000105, - kEncryptedContentUnsupported = 0x00000106, - kClearContentUnsupported = 0x00000107, - kDecoderMissingCdmForEncryptedContent = 0x00000108, - kDecoderInitializationFailed = 0x00000109, // Prefer this one. + kDecoderInitializeNeverCompleted = 0x0101, + kDecoderFailedDecode = 0x0102, + kDecoderUnsupportedProfile = 0x0103, + kDecoderUnsupportedCodec = 0x0104, + kDecoderUnsupportedConfig = 0x0105, + kEncryptedContentUnsupported = 0x0106, + kClearContentUnsupported = 0x0107, + kDecoderMissingCdmForEncryptedContent = 0x0108, + kDecoderInitializationFailed = 0x0109, // Prefer this one. kDecoderFailedInitialization = kDecoderInitializationFailed, // Do not use. - kDecoderCantChangeCodec = 0x0000010A, - kDecoderCreationFailed = 0x0000010B, // Prefer this one. + kDecoderCantChangeCodec = 0x010A, + kDecoderCreationFailed = 0x010B, // Prefer this one. kDecoderFailedCreation = kDecoderCreationFailed, // Do not use. - kInitializationUnspecifiedFailure = 0x0000010C, - kDecoderVideoFrameConstructionFailed = 0x0000010D, - kMakeContextCurrentFailed = 0x0000010E, + kInitializationUnspecifiedFailure = 0x010C, + kDecoderVideoFrameConstructionFailed = 0x010D, + kMakeContextCurrentFailed = 0x010E, // This is a temporary error for use only by existing code during the // DecodeStatus => Status conversion. - kDecodeErrorDoNotUse = 0x0000010F, + kDecodeErrorDoNotUse = 0x010F, // Windows Errors: 0x02 - kWindowsWrappedHresult = 0x00000201, - kWindowsApiNotAvailible = 0x00000202, - kWindowsD3D11Error = 0x00000203, + kWindowsWrappedHresult = 0x0201, + kWindowsApiNotAvailible = 0x0202, + kWindowsD3D11Error = 0x0203, // D3D11VideoDecoder Errors: 0x03 - kPostTextureFailed = 0x00000301, - kPostAcquireStreamFailed = 0x00000302, - kCreateEglStreamFailed = 0x00000303, - kCreateEglStreamConsumerFailed = 0x00000304, - kCreateEglStreamProducerFailed = 0x00000305, - kCreateTextureSelectorFailed = 0x00000306, - kQueryID3D11MultithreadFailed = 0x00000307, - kGetDecoderConfigCountFailed = 0x00000308, - kGetDecoderConfigFailed = 0x00000309, - kProcessTextureFailed = 0x0000030A, - kUnsupportedTextureFormatForBind = 0x0000030B, - kCreateDecoderOutputViewFailed = 0x0000030C, - kAllocateTextureForCopyingWrapperFailed = 0x0000030D, - kCreateDecoderOutputTextureFailed = 0x0000030E, - kCreateVideoProcessorInputViewFailed = 0x0000030F, - kVideoProcessorBltFailed = 0x00000310, - kCreateVideoProcessorOutputViewFailed = 0x00000311, - kCreateVideoProcessorEnumeratorFailed = 0x00000312, - kCreateVideoProcessorFailed = 0x00000313, - kQueryVideoContextFailed = 0x00000314, - kAcceleratorFlushFailed = 0x00000315, - kTryAgainNotSupported = 0x00000316, - kCryptoConfigFailed = 0x00000317, - kDecoderBeginFrameFailed = 0x00000318, - kReleaseDecoderBufferFailed = 0x00000319, - kGetPicParamBufferFailed = 0x00000320, - kReleasePicParamBufferFailed = 0x00000321, - kGetBitstreamBufferFailed = 0x00000322, - kReleaseBitstreamBufferFailed = 0x00000323, - kGetSliceControlBufferFailed = 0x00000324, - kReleaseSliceControlBufferFailed = 0x00000325, - kDecoderEndFrameFailed = 0x00000326, - kSubmitDecoderBuffersFailed = 0x00000327, - kGetQuantBufferFailed = 0x00000328, - kReleaseQuantBufferFailed = 0x00000329, - kBitstreamBufferSliceTooBig = 0x00000330, - kCreateSharedImageFailed = 0x00000331, + kPostTextureFailed = 0x0301, + kPostAcquireStreamFailed = 0x0302, + kCreateEglStreamFailed = 0x0303, + kCreateEglStreamConsumerFailed = 0x0304, + kCreateEglStreamProducerFailed = 0x0305, + kCreateTextureSelectorFailed = 0x0306, + kQueryID3D11MultithreadFailed = 0x0307, + kGetDecoderConfigCountFailed = 0x0308, + kGetDecoderConfigFailed = 0x0309, + kProcessTextureFailed = 0x030A, + kUnsupportedTextureFormatForBind = 0x030B, + kCreateDecoderOutputViewFailed = 0x030C, + kAllocateTextureForCopyingWrapperFailed = 0x030D, + kCreateDecoderOutputTextureFailed = 0x030E, + kCreateVideoProcessorInputViewFailed = 0x030F, + kVideoProcessorBltFailed = 0x0310, + kCreateVideoProcessorOutputViewFailed = 0x0311, + kCreateVideoProcessorEnumeratorFailed = 0x0312, + kCreateVideoProcessorFailed = 0x0313, + kQueryVideoContextFailed = 0x0314, + kAcceleratorFlushFailed = 0x0315, + kTryAgainNotSupported = 0x0316, + kCryptoConfigFailed = 0x0317, + kDecoderBeginFrameFailed = 0x0318, + kReleaseDecoderBufferFailed = 0x0319, + kGetPicParamBufferFailed = 0x0320, + kReleasePicParamBufferFailed = 0x0321, + kGetBitstreamBufferFailed = 0x0322, + kReleaseBitstreamBufferFailed = 0x0323, + kGetSliceControlBufferFailed = 0x0324, + kReleaseSliceControlBufferFailed = 0x0325, + kDecoderEndFrameFailed = 0x0326, + kSubmitDecoderBuffersFailed = 0x0327, + kGetQuantBufferFailed = 0x0328, + kReleaseQuantBufferFailed = 0x0329, + kBitstreamBufferSliceTooBig = 0x0330, + kCreateSharedImageFailed = 0x0331, + kGetKeyedMutexFailed = 0x0332, + kAcquireKeyedMutexFailed = 0x0333, + kReleaseKeyedMutexFailed = 0x0334, + kCreateSharedHandleFailed = 0x0335, // MojoDecoder Errors: 0x04 - kMojoDecoderNoWrappedDecoder = 0x00000401, - kMojoDecoderStoppedBeforeInitDone = 0x00000402, - kMojoDecoderUnsupported = 0x00000403, - kMojoDecoderNoConnection = 0x00000404, - kMojoDecoderDeletedWithoutInitialization = 0x00000405, + kMojoDecoderNoWrappedDecoder = 0x0401, + kMojoDecoderStoppedBeforeInitDone = 0x0402, + kMojoDecoderUnsupported = 0x0403, + kMojoDecoderNoConnection = 0x0404, + kMojoDecoderDeletedWithoutInitialization = 0x0405, // Chromeos Errors: 0x05 - kChromeOSVideoDecoderNoDecoders = 0x00000501, - kV4l2NoDevice = 0x00000502, - kV4l2FailedToStopStreamQueue = 0x00000503, - kV4l2NoDecoder = 0x00000504, - kV4l2FailedFileCapabilitiesCheck = 0x00000505, - kV4l2FailedResourceAllocation = 0x00000506, - kV4l2BadFormat = 0x00000507, - kV4L2FailedToStartStreamQueue = 0x00000508, - kVaapiReinitializedDuringDecode = 0x00000509, - kVaapiFailedAcceleratorCreation = 0x00000510, + kChromeOSVideoDecoderNoDecoders = 0x0501, + kV4l2NoDevice = 0x0502, + kV4l2FailedToStopStreamQueue = 0x0503, + kV4l2NoDecoder = 0x0504, + kV4l2FailedFileCapabilitiesCheck = 0x0505, + kV4l2FailedResourceAllocation = 0x0506, + kV4l2BadFormat = 0x0507, + kV4L2FailedToStartStreamQueue = 0x0508, + kVaapiReinitializedDuringDecode = 0x0509, + kVaapiFailedAcceleratorCreation = 0x0510, // Encoder Error: 0x06 - kEncoderInitializeNeverCompleted = 0x00000601, - kEncoderInitializeTwice = 0x00000602, - kEncoderFailedEncode = 0x00000603, - kEncoderUnsupportedProfile = 0x00000604, - kEncoderUnsupportedCodec = 0x00000605, - kEncoderUnsupportedConfig = 0x00000606, - kEncoderInitializationError = 0x00000607, - kEncoderFailedFlush = 0x00000608, + kEncoderInitializeNeverCompleted = 0x0601, + kEncoderInitializeTwice = 0x0602, + kEncoderFailedEncode = 0x0603, + kEncoderUnsupportedProfile = 0x0604, + kEncoderUnsupportedCodec = 0x0605, + kEncoderUnsupportedConfig = 0x0606, + kEncoderInitializationError = 0x0607, + kEncoderFailedFlush = 0x0608, // VaapiVideoDecoder: 0x07 - kVaapiBadContext = 0x00000701, - kVaapiNoBuffer = 0x00000702, - kVaapiNoBufferHandle = 0x00000703, - kVaapiNoPixmap = 0x00000704, - kVaapiNoImage = 0x00000705, - kVaapiNoSurface = 0x00000706, - kVaapiFailedToInitializeImage = 0x00000707, - kVaapiFailedToBindTexture = 0x00000708, - kVaapiFailedToBindImage = 0x00000709, - kVaapiUnsupportedFormat = 0x0000070A, - kVaapiFailedToExportImage = 0x0000070B, - kVaapiBadImageSize = 0x0000070C, - kVaapiNoTexture = 0x0000070D, + kVaapiBadContext = 0x0701, + kVaapiNoBuffer = 0x0702, + kVaapiNoBufferHandle = 0x0703, + kVaapiNoPixmap = 0x0704, + kVaapiNoImage = 0x0705, + kVaapiNoSurface = 0x0706, + kVaapiFailedToInitializeImage = 0x0707, + kVaapiFailedToBindTexture = 0x0708, + kVaapiFailedToBindImage = 0x0709, + kVaapiUnsupportedFormat = 0x070A, + kVaapiFailedToExportImage = 0x070B, + kVaapiBadImageSize = 0x070C, + kVaapiNoTexture = 0x070D, // Format Errors: 0x08 - kH264ParsingError = 0x00000801, - kH264BufferTooSmall = 0x00000802, + kH264ParsingError = 0x0801, + kH264BufferTooSmall = 0x0802, // Pipeline Errors: 0x09 - // Deprecated: kPipelineErrorUrlNotFound = 0x00000901, - kPipelineErrorNetwork = 0x00000902, - kPipelineErrorDecode = 0x00000903, - // Deprecated: kPipelineErrorDecrypt = 0x00000904, - kPipelineErrorAbort = 0x00000905, - kPipelineErrorInitializationFailed = 0x00000906, - // Unused: 0x00000907 - kPipelineErrorCouldNotRender = 0x00000908, - kPipelineErrorRead = 0x00000909, - // Deprecated: kPipelineErrorOperationPending = 0x0000090a, - kPipelineErrorInvalidState = 0x0000090b, + // Deprecated: kPipelineErrorUrlNotFound = 0x0901, + kPipelineErrorNetwork = 0x0902, + kPipelineErrorDecode = 0x0903, + // Deprecated: kPipelineErrorDecrypt = 0x0904, + kPipelineErrorAbort = 0x0905, + kPipelineErrorInitializationFailed = 0x0906, + // Unused: 0x0907 + kPipelineErrorCouldNotRender = 0x0908, + kPipelineErrorRead = 0x0909, + // Deprecated: kPipelineErrorOperationPending = 0x090a, + kPipelineErrorInvalidState = 0x090b, // Demuxer related errors. - kPipelineErrorDemuxerErrorCouldNotOpen = 0x0000090c, - kPipelineErrorDemuxerErrorCouldNotParse = 0x0000090d, - kPipelineErrorDemuxerErrorNoSupportedStreams = 0x0000090e, + kPipelineErrorDemuxerErrorCouldNotOpen = 0x090c, + kPipelineErrorDemuxerErrorCouldNotParse = 0x090d, + kPipelineErrorDemuxerErrorNoSupportedStreams = 0x090e, // Decoder related errors. - kPipelineErrorDecoderErrorNotSupported = 0x0000090f, + kPipelineErrorDecoderErrorNotSupported = 0x090f, // ChunkDemuxer related errors. - kPipelineErrorChuckDemuxerErrorAppendFailed = 0x00000910, - kPipelineErrorChunkDemuxerErrorEosStatusDecodeError = 0x00000911, - kPipelineErrorChunkDemuxerErrorEosStatusNetworkError = 0x00000912, + kPipelineErrorChuckDemuxerErrorAppendFailed = 0x0910, + kPipelineErrorChunkDemuxerErrorEosStatusDecodeError = 0x0911, + kPipelineErrorChunkDemuxerErrorEosStatusNetworkError = 0x0912, // Audio rendering errors. - kPipelineErrorAudioRendererError = 0x00000913, - // Deprecated: kPipelineErrorAudioRendererErrorSpliceFailed = 0x00000914, - kPipelineErrorExternalRendererFailed = 0x00000915, + kPipelineErrorAudioRendererError = 0x0913, + // Deprecated: kPipelineErrorAudioRendererErrorSpliceFailed = 0x0914, + kPipelineErrorExternalRendererFailed = 0x0915, // Android only. Used as a signal to fallback MediaPlayerRenderer, and thus // not exactly an 'error' per say. - kPipelineErrorDemuxerErrorDetectedHLS = 0x00000916, + kPipelineErrorDemuxerErrorDetectedHLS = 0x0916, // Used when hardware context is reset (e.g. OS sleep/resume), where we should // recreate the Renderer instead of fail the playback. See // https://crbug.com/1208618 - kPipelineErrorHardwareContextReset = 0x00000917, + kPipelineErrorHardwareContextReset = 0x0917, // Frame operation errors: 0x0A - kUnsupportedFrameFormatError = 0x00000A01, + kUnsupportedFrameFormatError = 0x0A01, // DecoderStream errors: 0x0B - kDecoderStreamInErrorState = 0x00000B00, - kDecoderStreamReinitFailed = 0x00000B01, + kDecoderStreamInErrorState = 0x0B00, + kDecoderStreamReinitFailed = 0x0B01, // This is a temporary error for use while the demuxer doesn't return a // proper status. - kDecoderStreamDemuxerError = 0x00000B02, + kDecoderStreamDemuxerError = 0x0B02, // DecodeStatus temporary codes. These names were chosen to match the // DecodeStatus enum, so that un-converted code can DecodeStatus::OK/etc. @@ -203,7 +206,7 @@ enum class StatusCode : StatusCodeType { DECODE_ERROR = kDecodeErrorDoNotUse, // Special codes - kGenericErrorPleaseRemove = 0x79999999, + kGenericErrorPleaseRemove = 0x7999, kCodeOnlyForTesting = std::numeric_limits<StatusCodeType>::max(), kMaxValue = kCodeOnlyForTesting, }; diff --git a/chromium/media/base/status_unittest.cc b/chromium/media/base/status_unittest.cc index 2da38b2ca90..3df6fec9cbd 100644 --- a/chromium/media/base/status_unittest.cc +++ b/chromium/media/base/status_unittest.cc @@ -82,10 +82,8 @@ TEST_F(StatusTest, StaticOKMethodGivesCorrectSerialization) { TEST_F(StatusTest, SingleLayerError) { Status failed = FailEasily(); base::Value actual = MediaSerialize(failed); - ASSERT_EQ(actual.DictSize(), 5ul); - ASSERT_EQ(actual.FindIntPath("status_code"), - static_cast<int32_t>(StatusCode::kCodeOnlyForTesting)); - ASSERT_EQ(*actual.FindStringPath("status_message"), "Message"); + ASSERT_EQ(actual.DictSize(), 6ul); + ASSERT_EQ(*actual.FindStringPath("message"), "Message"); ASSERT_EQ(actual.FindListPath("stack")->GetList().size(), 1ul); ASSERT_EQ(actual.FindListPath("causes")->GetList().size(), 0ul); ASSERT_EQ(actual.FindDictPath("data")->DictSize(), 0ul); @@ -102,10 +100,8 @@ TEST_F(StatusTest, SingleLayerError) { TEST_F(StatusTest, MultipleErrorLayer) { Status failed = FailRecursively(3); base::Value actual = MediaSerialize(failed); - ASSERT_EQ(actual.DictSize(), 5ul); - ASSERT_EQ(actual.FindIntPath("status_code").value_or(-1), - static_cast<int32_t>(StatusCode::kCodeOnlyForTesting)); - ASSERT_EQ(*actual.FindStringPath("status_message"), "Message"); + ASSERT_EQ(actual.DictSize(), 6ul); + ASSERT_EQ(*actual.FindStringPath("message"), "Message"); ASSERT_EQ(actual.FindListPath("stack")->GetList().size(), 4ul); ASSERT_EQ(actual.FindListPath("causes")->GetList().size(), 0ul); ASSERT_EQ(actual.FindDictPath("data")->DictSize(), 0ul); @@ -117,10 +113,8 @@ TEST_F(StatusTest, MultipleErrorLayer) { TEST_F(StatusTest, CanHaveData) { Status failed = FailWithData("example", "data"); base::Value actual = MediaSerialize(failed); - ASSERT_EQ(actual.DictSize(), 5ul); - ASSERT_EQ(actual.FindIntPath("status_code").value_or(-1), - static_cast<int32_t>(StatusCode::kCodeOnlyForTesting)); - ASSERT_EQ(*actual.FindStringPath("status_message"), "Message"); + ASSERT_EQ(actual.DictSize(), 6ul); + ASSERT_EQ(*actual.FindStringPath("message"), "Message"); ASSERT_EQ(actual.FindListPath("stack")->GetList().size(), 1ul); ASSERT_EQ(actual.FindListPath("causes")->GetList().size(), 0ul); ASSERT_EQ(actual.FindDictPath("data")->DictSize(), 1ul); @@ -134,10 +128,8 @@ TEST_F(StatusTest, CanHaveData) { TEST_F(StatusTest, CanUseCustomSerializer) { Status failed = FailWithData("example", UselessThingToBeSerialized("F")); base::Value actual = MediaSerialize(failed); - ASSERT_EQ(actual.DictSize(), 5ul); - ASSERT_EQ(actual.FindIntPath("status_code"), - static_cast<int32_t>(StatusCode::kCodeOnlyForTesting)); - ASSERT_EQ(*actual.FindStringPath("status_message"), "Message"); + ASSERT_EQ(actual.DictSize(), 6ul); + ASSERT_EQ(*actual.FindStringPath("message"), "Message"); ASSERT_EQ(actual.FindListPath("stack")->GetList().size(), 1ul); ASSERT_EQ(actual.FindListPath("causes")->GetList().size(), 0ul); ASSERT_EQ(actual.FindDictPath("data")->DictSize(), 1ul); @@ -151,42 +143,57 @@ TEST_F(StatusTest, CanUseCustomSerializer) { TEST_F(StatusTest, CausedByHasVector) { Status causal = FailWithCause(); base::Value actual = MediaSerialize(causal); - ASSERT_EQ(actual.DictSize(), 5ul); - ASSERT_EQ(actual.FindIntPath("status_code").value_or(-1), - static_cast<int32_t>(StatusCode::kCodeOnlyForTesting)); - ASSERT_EQ(*actual.FindStringPath("status_message"), "Message"); + ASSERT_EQ(actual.DictSize(), 6ul); + ASSERT_EQ(*actual.FindStringPath("message"), "Message"); ASSERT_EQ(actual.FindListPath("stack")->GetList().size(), 1ul); ASSERT_EQ(actual.FindListPath("causes")->GetList().size(), 1ul); ASSERT_EQ(actual.FindDictPath("data")->DictSize(), 0ul); base::Value& nested = actual.FindListPath("causes")->GetList()[0]; - ASSERT_EQ(nested.DictSize(), 5ul); - ASSERT_EQ(nested.FindIntPath("status_code").value_or(-1), - static_cast<int32_t>(StatusCode::kCodeOnlyForTesting)); - ASSERT_EQ(*nested.FindStringPath("status_message"), "Message"); + ASSERT_EQ(nested.DictSize(), 6ul); + ASSERT_EQ(*nested.FindStringPath("message"), "Message"); ASSERT_EQ(nested.FindListPath("stack")->GetList().size(), 1ul); ASSERT_EQ(nested.FindListPath("causes")->GetList().size(), 0ul); ASSERT_EQ(nested.FindDictPath("data")->DictSize(), 0ul); } +TEST_F(StatusTest, CausedByCanAssignCopy) { + Status causal = FailWithCause(); + Status copy_causal = causal; + base::Value causal_serialized = MediaSerialize(causal); + base::Value copy_causal_serialized = MediaSerialize(copy_causal); + + base::Value& original = + causal_serialized.FindListPath("causes")->GetList()[0]; + ASSERT_EQ(original.DictSize(), 6ul); + ASSERT_EQ(*original.FindStringPath("message"), "Message"); + ASSERT_EQ(original.FindListPath("stack")->GetList().size(), 1ul); + ASSERT_EQ(original.FindListPath("causes")->GetList().size(), 0ul); + ASSERT_EQ(original.FindDictPath("data")->DictSize(), 0ul); + + base::Value& copied = + copy_causal_serialized.FindListPath("causes")->GetList()[0]; + ASSERT_EQ(copied.DictSize(), 6ul); + ASSERT_EQ(*copied.FindStringPath("message"), "Message"); + ASSERT_EQ(copied.FindListPath("stack")->GetList().size(), 1ul); + ASSERT_EQ(copied.FindListPath("causes")->GetList().size(), 0ul); + ASSERT_EQ(copied.FindDictPath("data")->DictSize(), 0ul); +} + TEST_F(StatusTest, CanCopyEasily) { Status failed = FailEasily(); Status withData = DoSomethingGiveItBack(failed); base::Value actual = MediaSerialize(failed); - ASSERT_EQ(actual.DictSize(), 5ul); - ASSERT_EQ(actual.FindIntPath("status_code"), - static_cast<int32_t>(StatusCode::kCodeOnlyForTesting)); - ASSERT_EQ(*actual.FindStringPath("status_message"), "Message"); + ASSERT_EQ(actual.DictSize(), 6ul); + ASSERT_EQ(*actual.FindStringPath("message"), "Message"); ASSERT_EQ(actual.FindListPath("stack")->GetList().size(), 1ul); ASSERT_EQ(actual.FindListPath("causes")->GetList().size(), 0ul); ASSERT_EQ(actual.FindDictPath("data")->DictSize(), 0ul); actual = MediaSerialize(withData); - ASSERT_EQ(actual.DictSize(), 5ul); - ASSERT_EQ(actual.FindIntPath("status_code"), - static_cast<int32_t>(StatusCode::kCodeOnlyForTesting)); - ASSERT_EQ(*actual.FindStringPath("status_message"), "Message"); + ASSERT_EQ(actual.DictSize(), 6ul); + ASSERT_EQ(*actual.FindStringPath("message"), "Message"); ASSERT_EQ(actual.FindListPath("stack")->GetList().size(), 1ul); ASSERT_EQ(actual.FindListPath("causes")->GetList().size(), 0ul); ASSERT_EQ(actual.FindDictPath("data")->DictSize(), 1ul); @@ -243,9 +250,51 @@ TEST_F(StatusTest, StatusOrCodeIsOkWithValue) { EXPECT_EQ(status_or.code(), StatusCode::kOk); } -TEST_F(StatusTest, StatusOrCodeIsNotOkWithoutValue) { - StatusOr<int> status_or(StatusCode::kCodeOnlyForTesting); - EXPECT_EQ(status_or.code(), StatusCode::kCodeOnlyForTesting); +enum class NoDefaultType : StatusCodeType { kFoo = 0, kBar = 1, kBaz = 2 }; + +struct NoDefaultTypeTraits { + using Codes = NoDefaultType; + static constexpr StatusGroupType Group() { + return "GroupWithNoDefaultTypeForTests"; + } + static constexpr absl::optional<NoDefaultType> DefaultEnumValue() { + return absl::nullopt; + } +}; + +TEST_F(StatusTest, TypedStatusWithNoDefault) { + using NDStatus = TypedStatus<NoDefaultTypeTraits>; + + NDStatus foo = NoDefaultType::kFoo; + EXPECT_EQ(foo.code(), NoDefaultType::kFoo); + + NDStatus bar = NoDefaultType::kBar; + EXPECT_EQ(bar.code(), NoDefaultType::kBar); + + NDStatus::Or<std::string> err = NoDefaultType::kBaz; + NDStatus::Or<std::string> ok = std::string("kBaz"); + + EXPECT_TRUE(err.has_error()); + EXPECT_EQ(err.code(), NoDefaultType::kBaz); + EXPECT_FALSE(ok.has_error()); + + base::Value actual = MediaSerialize(bar); + EXPECT_EQ(*actual.FindIntPath("code"), 1); +} + +TEST_F(StatusTest, StatusOrEqOp) { + // Test the case of a non-default (non-ok) status + StatusOr<std::string> failed = FailEasily(); + ASSERT_TRUE(failed == StatusCode::kCodeOnlyForTesting); + ASSERT_FALSE(failed == StatusCode::kOk); + ASSERT_TRUE(failed != StatusCode::kOk); + ASSERT_FALSE(failed != StatusCode::kCodeOnlyForTesting); + + StatusOr<std::string> success = std::string("Kirkland > Seattle"); + ASSERT_TRUE(success != StatusCode::kCodeOnlyForTesting); + ASSERT_FALSE(success != StatusCode::kOk); + ASSERT_TRUE(success == StatusCode::kOk); + ASSERT_FALSE(success == StatusCode::kCodeOnlyForTesting); } } // namespace media diff --git a/chromium/media/base/stream_parser.h b/chromium/media/base/stream_parser.h index a7de9bc69c2..a07421ae71e 100644 --- a/chromium/media/base/stream_parser.h +++ b/chromium/media/base/stream_parser.h @@ -109,6 +109,10 @@ class MEDIA_EXPORT StreamParser { EncryptedMediaInitDataCB; StreamParser(); + + StreamParser(const StreamParser&) = delete; + StreamParser& operator=(const StreamParser&) = delete; + virtual ~StreamParser(); // Initializes the parser with necessary callbacks. Must be called before any @@ -145,9 +149,6 @@ class MEDIA_EXPORT StreamParser { // implement ProcessChunks(). virtual bool Parse(const uint8_t* buf, int size) = 0; virtual bool ProcessChunks(std::unique_ptr<BufferQueue> buffer_queue); - - private: - DISALLOW_COPY_AND_ASSIGN(StreamParser); }; // Appends to |merged_buffers| the provided buffers in decode-timestamp order. diff --git a/chromium/media/base/stream_parser_buffer.h b/chromium/media/base/stream_parser_buffer.h index 55b2fbeb139..0999d8e32b0 100644 --- a/chromium/media/base/stream_parser_buffer.h +++ b/chromium/media/base/stream_parser_buffer.h @@ -66,15 +66,15 @@ class DecodeTimestamp { int64_t IntDiv(base::TimeDelta rhs) const { return ts_.IntDiv(rhs); } static DecodeTimestamp FromSecondsD(double seconds) { - return DecodeTimestamp(base::TimeDelta::FromSecondsD(seconds)); + return DecodeTimestamp(base::Seconds(seconds)); } static DecodeTimestamp FromMilliseconds(int64_t milliseconds) { - return DecodeTimestamp(base::TimeDelta::FromMilliseconds(milliseconds)); + return DecodeTimestamp(base::Milliseconds(milliseconds)); } static DecodeTimestamp FromMicroseconds(int64_t microseconds) { - return DecodeTimestamp(base::TimeDelta::FromMicroseconds(microseconds)); + return DecodeTimestamp(base::Microseconds(microseconds)); } // This method is used to explicitly call out when presentation timestamps diff --git a/chromium/media/base/supported_types.cc b/chromium/media/base/supported_types.cc index 07564623070..9c4e2eac5ea 100644 --- a/chromium/media/base/supported_types.cc +++ b/chromium/media/base/supported_types.cc @@ -206,26 +206,26 @@ bool IsVp9ProfileSupported(VideoCodecProfile profile) { bool IsAudioCodecProprietary(AudioCodec codec) { switch (codec) { - case kCodecAAC: - case kCodecAC3: - case kCodecEAC3: - case kCodecAMR_NB: - case kCodecAMR_WB: - case kCodecGSM_MS: - case kCodecALAC: - case kCodecMpegHAudio: + case AudioCodec::kAAC: + case AudioCodec::kAC3: + case AudioCodec::kEAC3: + case AudioCodec::kAMR_NB: + case AudioCodec::kAMR_WB: + case AudioCodec::kGSM_MS: + case AudioCodec::kALAC: + case AudioCodec::kMpegHAudio: return true; - case kCodecFLAC: - case kCodecMP3: - case kCodecOpus: - case kCodecVorbis: - case kCodecPCM: - case kCodecPCM_MULAW: - case kCodecPCM_S16BE: - case kCodecPCM_S24BE: - case kCodecPCM_ALAW: - case kUnknownAudioCodec: + case AudioCodec::kFLAC: + case AudioCodec::kMP3: + case AudioCodec::kOpus: + case AudioCodec::kVorbis: + case AudioCodec::kPCM: + case AudioCodec::kPCM_MULAW: + case AudioCodec::kPCM_S16BE: + case AudioCodec::kPCM_S24BE: + case AudioCodec::kPCM_ALAW: + case AudioCodec::kUnknown: return false; } @@ -243,7 +243,7 @@ bool IsDefaultSupportedAudioType(const AudioType& type) { #endif switch (type.codec) { - case kCodecAAC: + case AudioCodec::kAAC: if (type.profile != AudioCodecProfile::kXHE_AAC) return true; #if defined(OS_ANDROID) @@ -253,31 +253,31 @@ bool IsDefaultSupportedAudioType(const AudioType& type) { return false; #endif - case kCodecFLAC: - case kCodecMP3: - case kCodecOpus: - case kCodecPCM: - case kCodecPCM_MULAW: - case kCodecPCM_S16BE: - case kCodecPCM_S24BE: - case kCodecPCM_ALAW: - case kCodecVorbis: + case AudioCodec::kFLAC: + case AudioCodec::kMP3: + case AudioCodec::kOpus: + case AudioCodec::kPCM: + case AudioCodec::kPCM_MULAW: + case AudioCodec::kPCM_S16BE: + case AudioCodec::kPCM_S24BE: + case AudioCodec::kPCM_ALAW: + case AudioCodec::kVorbis: return true; - case kCodecAMR_NB: - case kCodecAMR_WB: - case kCodecGSM_MS: + case AudioCodec::kAMR_NB: + case AudioCodec::kAMR_WB: + case AudioCodec::kGSM_MS: #if BUILDFLAG(IS_CHROMEOS_ASH) return true; #else return false; #endif - case kCodecEAC3: - case kCodecALAC: - case kCodecAC3: - case kCodecMpegHAudio: - case kUnknownAudioCodec: + case AudioCodec::kEAC3: + case AudioCodec::kALAC: + case AudioCodec::kAC3: + case AudioCodec::kMpegHAudio: + case AudioCodec::kUnknown: return false; } @@ -287,18 +287,18 @@ bool IsDefaultSupportedAudioType(const AudioType& type) { bool IsVideoCodecProprietary(VideoCodec codec) { switch (codec) { - case kCodecVC1: - case kCodecH264: - case kCodecMPEG2: - case kCodecMPEG4: - case kCodecHEVC: - case kCodecDolbyVision: + case VideoCodec::kVC1: + case VideoCodec::kH264: + case VideoCodec::kMPEG2: + case VideoCodec::kMPEG4: + case VideoCodec::kHEVC: + case VideoCodec::kDolbyVision: return true; - case kUnknownVideoCodec: - case kCodecTheora: - case kCodecVP8: - case kCodecVP9: - case kCodecAV1: + case VideoCodec::kUnknown: + case VideoCodec::kTheora: + case VideoCodec::kVP8: + case VideoCodec::kVP9: + case VideoCodec::kAV1: return false; } @@ -318,7 +318,7 @@ bool IsDefaultSupportedVideoType(const VideoType& type) { #endif switch (type.codec) { - case kCodecAV1: + case VideoCodec::kAV1: // If the AV1 decoder is enabled, or if we're on Q or later, yes. #if BUILDFLAG(ENABLE_AV1_DECODER) return IsColorSpaceSupported(type.color_space); @@ -333,29 +333,29 @@ bool IsDefaultSupportedVideoType(const VideoType& type) { return false; #endif - case kCodecVP9: + case VideoCodec::kVP9: // Color management required for HDR to not look terrible. return IsColorSpaceSupported(type.color_space) && IsVp9ProfileSupported(type.profile); - case kCodecH264: - case kCodecVP8: - case kCodecTheora: + case VideoCodec::kH264: + case VideoCodec::kVP8: + case VideoCodec::kTheora: return true; - case kCodecHEVC: + case VideoCodec::kHEVC: #if BUILDFLAG(ENABLE_PLATFORM_ENCRYPTED_HEVC) return IsColorSpaceSupported(type.color_space) && IsHevcProfileSupported(type.profile); #else return false; #endif // BUILDFLAG(ENABLE_PLATFORM_ENCRYPTED_HEVC) - case kUnknownVideoCodec: - case kCodecVC1: - case kCodecMPEG2: - case kCodecDolbyVision: + case VideoCodec::kUnknown: + case VideoCodec::kVC1: + case VideoCodec::kMPEG2: + case VideoCodec::kDolbyVision: return false; - case kCodecMPEG4: + case VideoCodec::kMPEG4: #if BUILDFLAG(IS_CHROMEOS_ASH) return true; #else diff --git a/chromium/media/base/supported_types_unittest.cc b/chromium/media/base/supported_types_unittest.cc index eddc5b3ccc1..93f3c2a4fbd 100644 --- a/chromium/media/base/supported_types_unittest.cc +++ b/chromium/media/base/supported_types_unittest.cc @@ -35,30 +35,35 @@ TEST(SupportedTypesTest, IsSupportedVideoTypeBasics) { // Expect support for baseline configuration of known codecs. EXPECT_TRUE(IsSupportedVideoType( - {kCodecVP8, VP8PROFILE_ANY, kUnspecifiedLevel, kColorSpace})); + {VideoCodec::kVP8, VP8PROFILE_ANY, kUnspecifiedLevel, kColorSpace})); EXPECT_TRUE(IsSupportedVideoType( - {kCodecVP9, VP9PROFILE_PROFILE0, kUnspecifiedLevel, kColorSpace})); - EXPECT_TRUE(IsSupportedVideoType({kCodecTheora, VIDEO_CODEC_PROFILE_UNKNOWN, - kUnspecifiedLevel, kColorSpace})); + {VideoCodec::kVP9, VP9PROFILE_PROFILE0, kUnspecifiedLevel, kColorSpace})); + EXPECT_TRUE( + IsSupportedVideoType({VideoCodec::kTheora, VIDEO_CODEC_PROFILE_UNKNOWN, + kUnspecifiedLevel, kColorSpace})); // Expect non-support for the following. EXPECT_FALSE( - IsSupportedVideoType({kUnknownVideoCodec, VIDEO_CODEC_PROFILE_UNKNOWN, + IsSupportedVideoType({VideoCodec::kUnknown, VIDEO_CODEC_PROFILE_UNKNOWN, + kUnspecifiedLevel, kColorSpace})); + EXPECT_FALSE( + IsSupportedVideoType({VideoCodec::kVC1, VIDEO_CODEC_PROFILE_UNKNOWN, + kUnspecifiedLevel, kColorSpace})); + EXPECT_FALSE( + IsSupportedVideoType({VideoCodec::kMPEG2, VIDEO_CODEC_PROFILE_UNKNOWN, + kUnspecifiedLevel, kColorSpace})); + EXPECT_FALSE( + IsSupportedVideoType({VideoCodec::kHEVC, VIDEO_CODEC_PROFILE_UNKNOWN, kUnspecifiedLevel, kColorSpace})); - EXPECT_FALSE(IsSupportedVideoType({kCodecVC1, VIDEO_CODEC_PROFILE_UNKNOWN, - kUnspecifiedLevel, kColorSpace})); - EXPECT_FALSE(IsSupportedVideoType({kCodecMPEG2, VIDEO_CODEC_PROFILE_UNKNOWN, - kUnspecifiedLevel, kColorSpace})); - EXPECT_FALSE(IsSupportedVideoType({kCodecHEVC, VIDEO_CODEC_PROFILE_UNKNOWN, - kUnspecifiedLevel, kColorSpace})); // Expect conditional support for the following. + EXPECT_EQ(kPropCodecsEnabled, + IsSupportedVideoType( + {VideoCodec::kH264, H264PROFILE_BASELINE, 1, kColorSpace})); EXPECT_EQ( - kPropCodecsEnabled, - IsSupportedVideoType({kCodecH264, H264PROFILE_BASELINE, 1, kColorSpace})); - EXPECT_EQ(kMpeg4Supported, - IsSupportedVideoType({kCodecMPEG4, VIDEO_CODEC_PROFILE_UNKNOWN, - kUnspecifiedLevel, kColorSpace})); + kMpeg4Supported, + IsSupportedVideoType({VideoCodec::kMPEG4, VIDEO_CODEC_PROFILE_UNKNOWN, + kUnspecifiedLevel, kColorSpace})); } TEST(SupportedTypesTest, IsSupportedVideoType_VP9TransferFunctions) { @@ -91,8 +96,9 @@ TEST(SupportedTypesTest, IsSupportedVideoType_VP9TransferFunctions) { kSupportedTransfers.end(); if (found) num_found++; - EXPECT_EQ(found, IsSupportedVideoType( - {kCodecVP9, VP9PROFILE_PROFILE0, 1, color_space})); + EXPECT_EQ(found, + IsSupportedVideoType( + {VideoCodec::kVP9, VP9PROFILE_PROFILE0, 1, color_space})); } EXPECT_EQ(kSupportedTransfers.size(), num_found); } @@ -121,8 +127,9 @@ TEST(SupportedTypesTest, IsSupportedVideoType_VP9Primaries) { kSupportedPrimaries.end(); if (found) num_found++; - EXPECT_EQ(found, IsSupportedVideoType( - {kCodecVP9, VP9PROFILE_PROFILE0, 1, color_space})); + EXPECT_EQ(found, + IsSupportedVideoType( + {VideoCodec::kVP9, VP9PROFILE_PROFILE0, 1, color_space})); } EXPECT_EQ(kSupportedPrimaries.size(), num_found); } @@ -151,8 +158,9 @@ TEST(SupportedTypesTest, IsSupportedVideoType_VP9Matrix) { kSupportedMatrix.find(color_space.matrix) != kSupportedMatrix.end(); if (found) num_found++; - EXPECT_EQ(found, IsSupportedVideoType( - {kCodecVP9, VP9PROFILE_PROFILE0, 1, color_space})); + EXPECT_EQ(found, + IsSupportedVideoType( + {VideoCodec::kVP9, VP9PROFILE_PROFILE0, 1, color_space})); } EXPECT_EQ(kSupportedMatrix.size(), num_found); } @@ -165,9 +173,9 @@ TEST(SupportedTypesTest, IsSupportedVideoType_VP9Profiles) { const int kUnspecifiedLevel = 0; EXPECT_TRUE(IsSupportedVideoType( - {kCodecVP9, VP9PROFILE_PROFILE0, kUnspecifiedLevel, kColorSpace})); + {VideoCodec::kVP9, VP9PROFILE_PROFILE0, kUnspecifiedLevel, kColorSpace})); EXPECT_TRUE(IsSupportedVideoType( - {kCodecVP9, VP9PROFILE_PROFILE1, kUnspecifiedLevel, kColorSpace})); + {VideoCodec::kVP9, VP9PROFILE_PROFILE1, kUnspecifiedLevel, kColorSpace})); // VP9 Profile2 are supported on x86, ChromeOS on ARM and Mac/Win on ARM64. // See third_party/libvpx/BUILD.gn. @@ -175,7 +183,7 @@ TEST(SupportedTypesTest, IsSupportedVideoType_VP9Profiles) { (defined(ARCH_CPU_ARM_FAMILY) && BUILDFLAG(IS_CHROMEOS_ASH)) || \ (defined(ARCH_CPU_ARM64) && (defined(OS_MAC) || defined(OS_WIN))) EXPECT_TRUE(IsSupportedVideoType( - {kCodecVP9, VP9PROFILE_PROFILE2, kUnspecifiedLevel, kColorSpace})); + {VideoCodec::kVP9, VP9PROFILE_PROFILE2, kUnspecifiedLevel, kColorSpace})); #endif } @@ -184,43 +192,53 @@ TEST(SupportedTypesTest, IsSupportedAudioTypeWithSpatialRenderingBasics) { // Dolby Atmos = E-AC3 (Dolby Digital Plus) + spatialRendering. Currently not // supported. EXPECT_FALSE(IsSupportedAudioType( - {kCodecEAC3, AudioCodecProfile::kUnknown, is_spatial_rendering})); + {AudioCodec::kEAC3, AudioCodecProfile::kUnknown, is_spatial_rendering})); // Expect non-support for codecs with which there is no spatial audio format. EXPECT_FALSE(IsSupportedAudioType( - {kCodecAAC, AudioCodecProfile::kUnknown, is_spatial_rendering})); - EXPECT_FALSE(IsSupportedAudioType( - {kCodecMP3, AudioCodecProfile::kUnknown, is_spatial_rendering})); - EXPECT_FALSE(IsSupportedAudioType( - {kCodecPCM, AudioCodecProfile::kUnknown, is_spatial_rendering})); - EXPECT_FALSE(IsSupportedAudioType( - {kCodecVorbis, AudioCodecProfile::kUnknown, is_spatial_rendering})); - EXPECT_FALSE(IsSupportedAudioType( - {kCodecFLAC, AudioCodecProfile::kUnknown, is_spatial_rendering})); - EXPECT_FALSE(IsSupportedAudioType( - {kCodecAMR_NB, AudioCodecProfile::kUnknown, is_spatial_rendering})); - EXPECT_FALSE(IsSupportedAudioType( - {kCodecAMR_WB, AudioCodecProfile::kUnknown, is_spatial_rendering})); - EXPECT_FALSE(IsSupportedAudioType( - {kCodecPCM_MULAW, AudioCodecProfile::kUnknown, is_spatial_rendering})); + {AudioCodec::kAAC, AudioCodecProfile::kUnknown, is_spatial_rendering})); EXPECT_FALSE(IsSupportedAudioType( - {kCodecGSM_MS, AudioCodecProfile::kUnknown, is_spatial_rendering})); + {AudioCodec::kMP3, AudioCodecProfile::kUnknown, is_spatial_rendering})); EXPECT_FALSE(IsSupportedAudioType( - {kCodecPCM_S16BE, AudioCodecProfile::kUnknown, is_spatial_rendering})); - EXPECT_FALSE(IsSupportedAudioType( - {kCodecPCM_S24BE, AudioCodecProfile::kUnknown, is_spatial_rendering})); - EXPECT_FALSE(IsSupportedAudioType( - {kCodecOpus, AudioCodecProfile::kUnknown, is_spatial_rendering})); - EXPECT_FALSE(IsSupportedAudioType( - {kCodecPCM_ALAW, AudioCodecProfile::kUnknown, is_spatial_rendering})); + {AudioCodec::kPCM, AudioCodecProfile::kUnknown, is_spatial_rendering})); + EXPECT_FALSE( + IsSupportedAudioType({AudioCodec::kVorbis, AudioCodecProfile::kUnknown, + is_spatial_rendering})); EXPECT_FALSE(IsSupportedAudioType( - {kCodecALAC, AudioCodecProfile::kUnknown, is_spatial_rendering})); + {AudioCodec::kFLAC, AudioCodecProfile::kUnknown, is_spatial_rendering})); + EXPECT_FALSE( + IsSupportedAudioType({AudioCodec::kAMR_NB, AudioCodecProfile::kUnknown, + is_spatial_rendering})); + EXPECT_FALSE( + IsSupportedAudioType({AudioCodec::kAMR_WB, AudioCodecProfile::kUnknown, + is_spatial_rendering})); + EXPECT_FALSE( + IsSupportedAudioType({AudioCodec::kPCM_MULAW, AudioCodecProfile::kUnknown, + is_spatial_rendering})); + EXPECT_FALSE( + IsSupportedAudioType({AudioCodec::kGSM_MS, AudioCodecProfile::kUnknown, + is_spatial_rendering})); + EXPECT_FALSE( + IsSupportedAudioType({AudioCodec::kPCM_S16BE, AudioCodecProfile::kUnknown, + is_spatial_rendering})); + EXPECT_FALSE( + IsSupportedAudioType({AudioCodec::kPCM_S24BE, AudioCodecProfile::kUnknown, + is_spatial_rendering})); EXPECT_FALSE(IsSupportedAudioType( - {kCodecAC3, AudioCodecProfile::kUnknown, is_spatial_rendering})); + {AudioCodec::kOpus, AudioCodecProfile::kUnknown, is_spatial_rendering})); + EXPECT_FALSE( + IsSupportedAudioType({AudioCodec::kPCM_ALAW, AudioCodecProfile::kUnknown, + is_spatial_rendering})); EXPECT_FALSE(IsSupportedAudioType( - {kCodecMpegHAudio, AudioCodecProfile::kUnknown, is_spatial_rendering})); + {AudioCodec::kALAC, AudioCodecProfile::kUnknown, is_spatial_rendering})); EXPECT_FALSE(IsSupportedAudioType( - {kUnknownAudioCodec, AudioCodecProfile::kUnknown, is_spatial_rendering})); + {AudioCodec::kAC3, AudioCodecProfile::kUnknown, is_spatial_rendering})); + EXPECT_FALSE(IsSupportedAudioType({AudioCodec::kMpegHAudio, + AudioCodecProfile::kUnknown, + is_spatial_rendering})); + EXPECT_FALSE( + IsSupportedAudioType({AudioCodec::kUnknown, AudioCodecProfile::kUnknown, + is_spatial_rendering})); } TEST(SupportedTypesTest, XHE_AACSupportedOnAndroidOnly) { @@ -231,11 +249,12 @@ TEST(SupportedTypesTest, XHE_AACSupportedOnAndroidOnly) { base::android::BuildInfo::GetInstance()->sdk_int() >= base::android::SDK_VERSION_P; - EXPECT_EQ(is_supported, IsSupportedAudioType( - {kCodecAAC, AudioCodecProfile::kXHE_AAC, false})); + EXPECT_EQ(is_supported, + IsSupportedAudioType( + {AudioCodec::kAAC, AudioCodecProfile::kXHE_AAC, false})); #else - EXPECT_FALSE( - IsSupportedAudioType({kCodecAAC, AudioCodecProfile::kXHE_AAC, false})); + EXPECT_FALSE(IsSupportedAudioType( + {AudioCodec::kAAC, AudioCodecProfile::kXHE_AAC, false})); #endif } @@ -248,42 +267,45 @@ TEST(SupportedTypesTest, IsSupportedVideoTypeWithHdrMetadataBasics) { // Expect support for baseline configuration of known codecs. EXPECT_TRUE(IsSupportedVideoType( - {kCodecVP8, VP8PROFILE_ANY, kUnspecifiedLevel, color_space})); + {VideoCodec::kVP8, VP8PROFILE_ANY, kUnspecifiedLevel, color_space})); EXPECT_TRUE(IsSupportedVideoType( - {kCodecVP9, VP9PROFILE_PROFILE0, kUnspecifiedLevel, color_space})); - EXPECT_TRUE(IsSupportedVideoType({kCodecTheora, VIDEO_CODEC_PROFILE_UNKNOWN, - kUnspecifiedLevel, color_space})); + {VideoCodec::kVP9, VP9PROFILE_PROFILE0, kUnspecifiedLevel, color_space})); + EXPECT_TRUE( + IsSupportedVideoType({VideoCodec::kTheora, VIDEO_CODEC_PROFILE_UNKNOWN, + kUnspecifiedLevel, color_space})); // All combinations of combinations of color gamuts and transfer functions // should be supported. color_space.primaries = VideoColorSpace::PrimaryID::SMPTEST431_2; color_space.transfer = VideoColorSpace::TransferID::SMPTEST2084; EXPECT_TRUE(IsSupportedVideoType( - {kCodecVP8, VP8PROFILE_ANY, kUnspecifiedLevel, color_space})); + {VideoCodec::kVP8, VP8PROFILE_ANY, kUnspecifiedLevel, color_space})); EXPECT_TRUE(IsSupportedVideoType( - {kCodecVP9, VP9PROFILE_PROFILE0, kUnspecifiedLevel, color_space})); - EXPECT_TRUE(IsSupportedVideoType({kCodecTheora, VIDEO_CODEC_PROFILE_UNKNOWN, - kUnspecifiedLevel, color_space})); + {VideoCodec::kVP9, VP9PROFILE_PROFILE0, kUnspecifiedLevel, color_space})); + EXPECT_TRUE( + IsSupportedVideoType({VideoCodec::kTheora, VIDEO_CODEC_PROFILE_UNKNOWN, + kUnspecifiedLevel, color_space})); color_space.primaries = VideoColorSpace::PrimaryID::BT2020; color_space.transfer = VideoColorSpace::TransferID::ARIB_STD_B67; EXPECT_TRUE(IsSupportedVideoType( - {kCodecVP8, VP8PROFILE_ANY, kUnspecifiedLevel, color_space})); + {VideoCodec::kVP8, VP8PROFILE_ANY, kUnspecifiedLevel, color_space})); EXPECT_TRUE(IsSupportedVideoType( - {kCodecVP9, VP9PROFILE_PROFILE0, kUnspecifiedLevel, color_space})); - EXPECT_TRUE(IsSupportedVideoType({kCodecTheora, VIDEO_CODEC_PROFILE_UNKNOWN, - kUnspecifiedLevel, color_space})); + {VideoCodec::kVP9, VP9PROFILE_PROFILE0, kUnspecifiedLevel, color_space})); + EXPECT_TRUE( + IsSupportedVideoType({VideoCodec::kTheora, VIDEO_CODEC_PROFILE_UNKNOWN, + kUnspecifiedLevel, color_space})); // No HDR metadata types are supported. EXPECT_FALSE( - IsSupportedVideoType({kCodecVP8, VP8PROFILE_ANY, kUnspecifiedLevel, + IsSupportedVideoType({VideoCodec::kVP8, VP8PROFILE_ANY, kUnspecifiedLevel, color_space, gfx::HdrMetadataType::kSmpteSt2086})); - EXPECT_FALSE(IsSupportedVideoType({kCodecVP8, VP8PROFILE_ANY, + EXPECT_FALSE(IsSupportedVideoType({VideoCodec::kVP8, VP8PROFILE_ANY, kUnspecifiedLevel, color_space, gfx::HdrMetadataType::kSmpteSt2094_10})); - EXPECT_FALSE(IsSupportedVideoType({kCodecVP8, VP8PROFILE_ANY, + EXPECT_FALSE(IsSupportedVideoType({VideoCodec::kVP8, VP8PROFILE_ANY, kUnspecifiedLevel, color_space, gfx::HdrMetadataType::kSmpteSt2094_40})); } diff --git a/chromium/media/base/supported_video_decoder_config_unittest.cc b/chromium/media/base/supported_video_decoder_config_unittest.cc index dd3dabdbe3d..14f0ad9146f 100644 --- a/chromium/media/base/supported_video_decoder_config_unittest.cc +++ b/chromium/media/base/supported_video_decoder_config_unittest.cc @@ -13,7 +13,7 @@ class SupportedVideoDecoderConfigTest : public ::testing::Test { public: SupportedVideoDecoderConfigTest() : decoder_config_( - TestVideoConfig::NormalCodecProfile(kCodecH264, + TestVideoConfig::NormalCodecProfile(VideoCodec::kH264, H264PROFILE_EXTENDED)) { supported_config_.profile_min = H264PROFILE_MIN; supported_config_.profile_max = H264PROFILE_MAX; diff --git a/chromium/media/base/svc_scalability_mode.cc b/chromium/media/base/svc_scalability_mode.cc new file mode 100644 index 00000000000..13eca157f43 --- /dev/null +++ b/chromium/media/base/svc_scalability_mode.cc @@ -0,0 +1,79 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/base/svc_scalability_mode.h" + +#include "base/notreached.h" + +namespace media { + +const char* GetScalabilityModeName(SVCScalabilityMode scalability_mode) { + switch (scalability_mode) { + case SVCScalabilityMode::kL1T2: + return "L1T2"; + case SVCScalabilityMode::kL1T3: + return "L1T3"; + case SVCScalabilityMode::kL2T1: + return "L2T1"; + case SVCScalabilityMode::kL2T2: + return "L2T2"; + case SVCScalabilityMode::kL2T3: + return "L2T3"; + case SVCScalabilityMode::kL3T1: + return "L3T1"; + case SVCScalabilityMode::kL3T2: + return "L3T2"; + case SVCScalabilityMode::kL3T3: + return "L3T3"; + case SVCScalabilityMode::kL2T1h: + return "L2T1h"; + case SVCScalabilityMode::kL2T2h: + return "L2T2h"; + case SVCScalabilityMode::kL2T3h: + return "L2T3h"; + case SVCScalabilityMode::kS2T1: + return "S2T1"; + case SVCScalabilityMode::kS2T2: + return "S2T2"; + case SVCScalabilityMode::kS2T3: + return "S2T3"; + case SVCScalabilityMode::kS2T1h: + return "S2T1h"; + case SVCScalabilityMode::kS2T2h: + return "S2T2h"; + case SVCScalabilityMode::kS2T3h: + return "S2T3h"; + case SVCScalabilityMode::kS3T1: + return "S3T1"; + case SVCScalabilityMode::kS3T2: + return "S3T2"; + case SVCScalabilityMode::kS3T3: + return "S3T3"; + case SVCScalabilityMode::kS3T1h: + return "S3T1h"; + case SVCScalabilityMode::kS3T2h: + return "S3T2h"; + case SVCScalabilityMode::kS3T3h: + return "S3T3h"; + case SVCScalabilityMode::kL2T2Key: + return "L2T2_KEY"; + case SVCScalabilityMode::kL2T2KeyShift: + return "L2T2_KEY_SHIFT"; + case SVCScalabilityMode::kL2T3Key: + return "L2T3_KEY"; + case SVCScalabilityMode::kL2T3KeyShift: + return "L2T3_KEY_SHIFT"; + case SVCScalabilityMode::kL3T2Key: + return "L3T2_KEY"; + case SVCScalabilityMode::kL3T2KeyShift: + return "L3T2_KEY_SHIFT"; + case SVCScalabilityMode::kL3T3Key: + return "L3T3_KEY"; + case SVCScalabilityMode::kL3T3KeyShift: + return "L3T3_KEY_SHIFT"; + } + NOTREACHED(); + return ""; +} +} // namespace media diff --git a/chromium/media/base/svc_scalability_mode.h b/chromium/media/base/svc_scalability_mode.h new file mode 100644 index 00000000000..65ce610af07 --- /dev/null +++ b/chromium/media/base/svc_scalability_mode.h @@ -0,0 +1,54 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_BASE_SVC_SCALABILITY_MODE_H_ +#define MEDIA_BASE_SVC_SCALABILITY_MODE_H_ + +#include "media/base/media_export.h" + +namespace media { + +// This enum class is the corresponding implementation with WebRTC-SVC. +// See https://www.w3.org/TR/webrtc-svc/#scalabilitymodes* for the detail. +enum class SVCScalabilityMode { + kL1T2, + kL1T3, + kL2T1, + kL2T2, + kL2T3, + kL3T1, + kL3T2, + kL3T3, + kL2T1h, + kL2T2h, + kL2T3h, + kS2T1, + kS2T2, + kS2T3, + kS2T1h, + kS2T2h, + kS2T3h, + kS3T1, + kS3T2, + kS3T3, + kS3T1h, + kS3T2h, + kS3T3h, + kL2T2Key, + kL2T2KeyShift, + kL2T3Key, + kL2T3KeyShift, + kL3T2Key, + kL3T2KeyShift, + kL3T3Key, + kL3T3KeyShift, +}; + +// Gets the WebRTC-SVC Spec defined scalability mode name. +MEDIA_EXPORT const char* GetScalabilityModeName( + SVCScalabilityMode scalability_mode); + +} // namespace media + +#endif // MEDIA_BASE_SVC_SCALABILITY_MODE_H_ diff --git a/chromium/media/base/test_data_util.cc b/chromium/media/base/test_data_util.cc index b3ccf07d9de..4940d4c4adc 100644 --- a/chromium/media/base/test_data_util.cc +++ b/chromium/media/base/test_data_util.cc @@ -167,14 +167,14 @@ const uint8_t kKeyId[] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // See http://crbug.com/592067 // Common test results. -const char kFailed[] = "FAILED"; +const char kFailedTitle[] = "FAILED"; // Upper case event name set by Utils.installTitleEventHandler(). -const char kEnded[] = "ENDED"; -const char kErrorEvent[] = "ERROR"; +const char kEndedTitle[] = "ENDED"; +const char kErrorEventTitle[] = "ERROR"; // Lower case event name as set by Utils.failTest(). -const char kError[] = "error"; +const char kErrorTitle[] = "error"; const base::FilePath::CharType kTestDataPath[] = FILE_PATH_LITERAL("media/test/data"); diff --git a/chromium/media/base/test_data_util.h b/chromium/media/base/test_data_util.h index ba6a3427ba7..79adec7de2e 100644 --- a/chromium/media/base/test_data_util.h +++ b/chromium/media/base/test_data_util.h @@ -18,10 +18,10 @@ namespace media { class DecoderBuffer; // Common test results. -extern const char kFailed[]; -extern const char kEnded[]; -extern const char kErrorEvent[]; -extern const char kError[]; +extern const char kFailedTitle[]; +extern const char kEndedTitle[]; +extern const char kErrorEventTitle[]; +extern const char kErrorTitle[]; // Returns a file path for a file in the media/test/data directory. base::FilePath GetTestDataFilePath(const std::string& name); diff --git a/chromium/media/base/test_helpers.cc b/chromium/media/base/test_helpers.cc index 3f2d50050d6..a046a9181aa 100644 --- a/chromium/media/base/test_helpers.cc +++ b/chromium/media/base/test_helpers.cc @@ -146,24 +146,24 @@ static VideoDecoderConfig GetTestConfig(VideoCodec codec, static VideoCodecProfile MinProfile(VideoCodec codec) { switch (codec) { - case kUnknownVideoCodec: - case kCodecVC1: - case kCodecMPEG2: - case kCodecMPEG4: + case VideoCodec::kUnknown: + case VideoCodec::kVC1: + case VideoCodec::kMPEG2: + case VideoCodec::kMPEG4: return VIDEO_CODEC_PROFILE_UNKNOWN; - case kCodecH264: + case VideoCodec::kH264: return H264PROFILE_MIN; - case kCodecTheora: + case VideoCodec::kTheora: return THEORAPROFILE_MIN; - case kCodecVP8: + case VideoCodec::kVP8: return VP8PROFILE_MIN; - case kCodecVP9: + case VideoCodec::kVP9: return VP9PROFILE_MIN; - case kCodecHEVC: + case VideoCodec::kHEVC: return HEVCPROFILE_MIN; - case kCodecDolbyVision: + case VideoCodec::kDolbyVision: return DOLBYVISION_PROFILE0; - case kCodecAV1: + case VideoCodec::kAV1: return AV1PROFILE_MIN; } } @@ -174,7 +174,7 @@ static const gfx::Size kExtraLargeSize(15360, 8640); // static VideoDecoderConfig TestVideoConfig::Invalid() { - return GetTestConfig(kUnknownVideoCodec, VIDEO_CODEC_PROFILE_UNKNOWN, + return GetTestConfig(VideoCodec::kUnknown, VIDEO_CODEC_PROFILE_UNKNOWN, VideoColorSpace::JPEG(), VIDEO_ROTATION_0, kNormalSize, false); } @@ -195,7 +195,7 @@ VideoDecoderConfig TestVideoConfig::NormalWithColorSpace( // static VideoDecoderConfig TestVideoConfig::NormalH264(VideoCodecProfile config) { - return GetTestConfig(kCodecH264, MinProfile(kCodecH264), + return GetTestConfig(VideoCodec::kH264, MinProfile(VideoCodec::kH264), VideoColorSpace::JPEG(), VIDEO_ROTATION_0, kNormalSize, false); } @@ -217,7 +217,7 @@ VideoDecoderConfig TestVideoConfig::NormalEncrypted(VideoCodec codec, // static VideoDecoderConfig TestVideoConfig::NormalRotated(VideoRotation rotation) { - return GetTestConfig(kCodecVP8, MinProfile(kCodecVP8), + return GetTestConfig(VideoCodec::kVP8, MinProfile(VideoCodec::kVP8), VideoColorSpace::JPEG(), rotation, kNormalSize, false); } @@ -274,25 +274,25 @@ gfx::Size TestVideoConfig::ExtraLargeCodedSize() { } AudioDecoderConfig TestAudioConfig::Normal() { - return AudioDecoderConfig(kCodecVorbis, kSampleFormatPlanarF32, + return AudioDecoderConfig(AudioCodec::kVorbis, kSampleFormatPlanarF32, CHANNEL_LAYOUT_STEREO, NormalSampleRateValue(), EmptyExtraData(), EncryptionScheme::kUnencrypted); } AudioDecoderConfig TestAudioConfig::NormalEncrypted() { - return AudioDecoderConfig(kCodecVorbis, kSampleFormatPlanarF32, + return AudioDecoderConfig(AudioCodec::kVorbis, kSampleFormatPlanarF32, CHANNEL_LAYOUT_STEREO, NormalSampleRateValue(), EmptyExtraData(), EncryptionScheme::kCenc); } AudioDecoderConfig TestAudioConfig::HighSampleRate() { - return AudioDecoderConfig(kCodecVorbis, kSampleFormatPlanarF32, + return AudioDecoderConfig(AudioCodec::kVorbis, kSampleFormatPlanarF32, CHANNEL_LAYOUT_STEREO, HighSampleRateValue(), EmptyExtraData(), EncryptionScheme::kUnencrypted); } AudioDecoderConfig TestAudioConfig::HighSampleRateEncrypted() { - return AudioDecoderConfig(kCodecVorbis, kSampleFormatPlanarF32, + return AudioDecoderConfig(AudioCodec::kVorbis, kSampleFormatPlanarF32, CHANNEL_LAYOUT_STEREO, HighSampleRateValue(), EmptyExtraData(), EncryptionScheme::kCenc); } diff --git a/chromium/media/base/test_helpers.h b/chromium/media/base/test_helpers.h index 81e73c76aca..1d91266d3e3 100644 --- a/chromium/media/base/test_helpers.h +++ b/chromium/media/base/test_helpers.h @@ -50,6 +50,10 @@ class WaitableMessageLoopEvent { public: WaitableMessageLoopEvent(); explicit WaitableMessageLoopEvent(base::TimeDelta timeout); + + WaitableMessageLoopEvent(const WaitableMessageLoopEvent&) = delete; + WaitableMessageLoopEvent& operator=(const WaitableMessageLoopEvent&) = delete; + ~WaitableMessageLoopEvent(); // Returns a thread-safe closure that will signal |this| when executed. @@ -79,8 +83,6 @@ class WaitableMessageLoopEvent { const base::TimeDelta timeout_; SEQUENCE_CHECKER(sequence_checker_); - - DISALLOW_COPY_AND_ASSIGN(WaitableMessageLoopEvent); }; // Provides pre-canned VideoDecoderConfig. These types are used for tests that @@ -90,30 +92,32 @@ class TestVideoConfig { // Returns a configuration that is invalid. static VideoDecoderConfig Invalid(); - static VideoDecoderConfig Normal(VideoCodec codec = kCodecVP8); + static VideoDecoderConfig Normal(VideoCodec codec = VideoCodec::kVP8); static VideoDecoderConfig NormalWithColorSpace( VideoCodec codec, const VideoColorSpace& color_space); static VideoDecoderConfig NormalH264(VideoCodecProfile = H264PROFILE_MIN); static VideoDecoderConfig NormalCodecProfile( - VideoCodec codec = kCodecVP8, + VideoCodec codec = VideoCodec::kVP8, VideoCodecProfile profile = VP8PROFILE_MIN); - static VideoDecoderConfig NormalEncrypted(VideoCodec codec = kCodecVP8, + static VideoDecoderConfig NormalEncrypted(VideoCodec codec = VideoCodec::kVP8, VideoCodecProfile = VP8PROFILE_MIN); static VideoDecoderConfig NormalRotated(VideoRotation rotation); // Returns a configuration that is larger in dimensions than Normal(). - static VideoDecoderConfig Large(VideoCodec codec = kCodecVP8); - static VideoDecoderConfig LargeEncrypted(VideoCodec codec = kCodecVP8); + static VideoDecoderConfig Large(VideoCodec codec = VideoCodec::kVP8); + static VideoDecoderConfig LargeEncrypted(VideoCodec codec = VideoCodec::kVP8); // Returns a configuration that is larger in dimensions that Large(). - static VideoDecoderConfig ExtraLarge(VideoCodec codec = kCodecVP8); - static VideoDecoderConfig ExtraLargeEncrypted(VideoCodec codec = kCodecVP8); + static VideoDecoderConfig ExtraLarge(VideoCodec codec = VideoCodec::kVP8); + static VideoDecoderConfig ExtraLargeEncrypted( + VideoCodec codec = VideoCodec::kVP8); static VideoDecoderConfig Custom(gfx::Size size, - VideoCodec codec = kCodecVP8); - static VideoDecoderConfig CustomEncrypted(gfx::Size size, - VideoCodec codec = kCodecVP8); + VideoCodec codec = VideoCodec::kVP8); + static VideoDecoderConfig CustomEncrypted( + gfx::Size size, + VideoCodec codec = VideoCodec::kVP8); // Returns coded size for Normal and Large config. static gfx::Size NormalCodedSize(); diff --git a/chromium/media/base/text_ranges.h b/chromium/media/base/text_ranges.h index 2b75822c9fd..e65553e1aee 100644 --- a/chromium/media/base/text_ranges.h +++ b/chromium/media/base/text_ranges.h @@ -20,6 +20,10 @@ namespace media { class MEDIA_EXPORT TextRanges { public: TextRanges(); + + TextRanges(const TextRanges&) = delete; + TextRanges& operator=(const TextRanges&) = delete; + ~TextRanges(); // Reset the current range pointer, such that we bind to a new range @@ -88,8 +92,6 @@ class MEDIA_EXPORT TextRanges { // The time range to which we bind following a Reset(). RangeMap::iterator curr_range_itr_; - - DISALLOW_COPY_AND_ASSIGN(TextRanges); }; } // namespace media diff --git a/chromium/media/base/text_ranges_unittest.cc b/chromium/media/base/text_ranges_unittest.cc index 69cf2e3f9c4..979ec2dd9b3 100644 --- a/chromium/media/base/text_ranges_unittest.cc +++ b/chromium/media/base/text_ranges_unittest.cc @@ -13,9 +13,7 @@ namespace media { class TextRangesTest : public ::testing::Test { protected: - bool AddCue(int seconds) { - return ranges_.AddCue(base::TimeDelta::FromSeconds(seconds)); - } + bool AddCue(int seconds) { return ranges_.AddCue(base::Seconds(seconds)); } void Reset() { ranges_.Reset(); diff --git a/chromium/media/base/text_renderer_unittest.cc b/chromium/media/base/text_renderer_unittest.cc index b00a269c0ea..2e25c2ac4b2 100644 --- a/chromium/media/base/text_renderer_unittest.cc +++ b/chromium/media/base/text_renderer_unittest.cc @@ -31,6 +31,10 @@ class FakeTextTrack : public TextTrack { public: FakeTextTrack(base::OnceClosure destroy_cb, const TextTrackConfig& config) : destroy_cb_(std::move(destroy_cb)), config_(config) {} + + FakeTextTrack(const FakeTextTrack&) = delete; + FakeTextTrack& operator=(const FakeTextTrack&) = delete; + ~FakeTextTrack() override { std::move(destroy_cb_).Run(); } MOCK_METHOD5(addWebVTTCue, @@ -42,9 +46,6 @@ class FakeTextTrack : public TextTrack { base::OnceClosure destroy_cb_; const TextTrackConfig config_; - - private: - DISALLOW_COPY_AND_ASSIGN(FakeTextTrack); }; class TextRendererTest : public testing::Test { @@ -145,7 +146,7 @@ class TextRendererTest : public testing::Test { FakeTextTrackStream* const text_stream = text_track_streams_[idx].get(); const base::TimeDelta start; - const base::TimeDelta duration = base::TimeDelta::FromSeconds(42); + const base::TimeDelta duration = base::Seconds(42); const std::string id = "id"; const std::string content = "subtitle"; const std::string settings; diff --git a/chromium/media/base/time_delta_interpolator.cc b/chromium/media/base/time_delta_interpolator.cc index 33e06a6f0be..a6eb4bfad72 100644 --- a/chromium/media/base/time_delta_interpolator.cc +++ b/chromium/media/base/time_delta_interpolator.cc @@ -69,8 +69,7 @@ base::TimeDelta TimeDeltaInterpolator::GetInterpolatedTime() { int64_t now_us = (tick_clock_->NowTicks() - reference_).InMicroseconds(); now_us = static_cast<int64_t>(now_us * playback_rate_); - base::TimeDelta interpolated_time = - lower_bound_ + base::TimeDelta::FromMicroseconds(now_us); + base::TimeDelta interpolated_time = lower_bound_ + base::Microseconds(now_us); if (upper_bound_ == kNoTimestamp) return interpolated_time; diff --git a/chromium/media/base/time_delta_interpolator.h b/chromium/media/base/time_delta_interpolator.h index 9a02eada2e5..1134272b75d 100644 --- a/chromium/media/base/time_delta_interpolator.h +++ b/chromium/media/base/time_delta_interpolator.h @@ -25,6 +25,10 @@ class MEDIA_EXPORT TimeDeltaInterpolator { // // |tick_clock| is used for sampling wall clock time for interpolating. explicit TimeDeltaInterpolator(const base::TickClock* tick_clock); + + TimeDeltaInterpolator(const TimeDeltaInterpolator&) = delete; + TimeDeltaInterpolator& operator=(const TimeDeltaInterpolator&) = delete; + ~TimeDeltaInterpolator(); bool interpolating() { return interpolating_; } @@ -76,8 +80,6 @@ class MEDIA_EXPORT TimeDeltaInterpolator { base::TimeTicks reference_; double playback_rate_; - - DISALLOW_COPY_AND_ASSIGN(TimeDeltaInterpolator); }; } // namespace media diff --git a/chromium/media/base/time_delta_interpolator_unittest.cc b/chromium/media/base/time_delta_interpolator_unittest.cc index 540768ee45b..ed8b35c5291 100644 --- a/chromium/media/base/time_delta_interpolator_unittest.cc +++ b/chromium/media/base/time_delta_interpolator_unittest.cc @@ -24,13 +24,13 @@ class TimeDeltaInterpolatorTest : public ::testing::Test { }; TEST_F(TimeDeltaInterpolatorTest, Created) { - const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(0); + const base::TimeDelta kExpected = base::Seconds(0); EXPECT_EQ(kExpected, interpolator_.GetInterpolatedTime()); } TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_NormalSpeed) { const base::TimeDelta kZero; - const base::TimeDelta kTimeToAdvance = base::TimeDelta::FromSeconds(2); + const base::TimeDelta kTimeToAdvance = base::Seconds(2); EXPECT_EQ(kZero, interpolator_.StartInterpolating()); AdvanceSystemTime(kTimeToAdvance); @@ -39,7 +39,7 @@ TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_NormalSpeed) { TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_DoubleSpeed) { const base::TimeDelta kZero; - const base::TimeDelta kTimeToAdvance = base::TimeDelta::FromSeconds(5); + const base::TimeDelta kTimeToAdvance = base::Seconds(5); interpolator_.SetPlaybackRate(2.0); EXPECT_EQ(kZero, interpolator_.StartInterpolating()); @@ -49,7 +49,7 @@ TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_DoubleSpeed) { TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_HalfSpeed) { const base::TimeDelta kZero; - const base::TimeDelta kTimeToAdvance = base::TimeDelta::FromSeconds(4); + const base::TimeDelta kTimeToAdvance = base::Seconds(4); interpolator_.SetPlaybackRate(0.5); EXPECT_EQ(kZero, interpolator_.StartInterpolating()); @@ -61,9 +61,9 @@ TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_ZeroSpeed) { // We'll play for 2 seconds at normal speed, 4 seconds at zero speed, and 8 // seconds at normal speed. const base::TimeDelta kZero; - const base::TimeDelta kPlayDuration1 = base::TimeDelta::FromSeconds(2); - const base::TimeDelta kPlayDuration2 = base::TimeDelta::FromSeconds(4); - const base::TimeDelta kPlayDuration3 = base::TimeDelta::FromSeconds(8); + const base::TimeDelta kPlayDuration1 = base::Seconds(2); + const base::TimeDelta kPlayDuration2 = base::Seconds(4); + const base::TimeDelta kPlayDuration3 = base::Seconds(8); const base::TimeDelta kExpected = kPlayDuration1 + kPlayDuration3; EXPECT_EQ(kZero, interpolator_.StartInterpolating()); @@ -81,9 +81,9 @@ TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_MultiSpeed) { // We'll play for 2 seconds at half speed, 4 seconds at normal speed, and 8 // seconds at double speed. const base::TimeDelta kZero; - const base::TimeDelta kPlayDuration1 = base::TimeDelta::FromSeconds(2); - const base::TimeDelta kPlayDuration2 = base::TimeDelta::FromSeconds(4); - const base::TimeDelta kPlayDuration3 = base::TimeDelta::FromSeconds(8); + const base::TimeDelta kPlayDuration1 = base::Seconds(2); + const base::TimeDelta kPlayDuration2 = base::Seconds(4); + const base::TimeDelta kPlayDuration3 = base::Seconds(8); const base::TimeDelta kExpected = kPlayDuration1 / 2 + kPlayDuration2 + 2 * kPlayDuration3; @@ -101,8 +101,8 @@ TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_MultiSpeed) { TEST_F(TimeDeltaInterpolatorTest, StopInterpolating) { const base::TimeDelta kZero; - const base::TimeDelta kPlayDuration = base::TimeDelta::FromSeconds(4); - const base::TimeDelta kPauseDuration = base::TimeDelta::FromSeconds(20); + const base::TimeDelta kPlayDuration = base::Seconds(4); + const base::TimeDelta kPauseDuration = base::Seconds(20); const base::TimeDelta kExpectedFirstPause = kPlayDuration; const base::TimeDelta kExpectedSecondPause = 2 * kPlayDuration; @@ -124,9 +124,9 @@ TEST_F(TimeDeltaInterpolatorTest, StopInterpolating) { } TEST_F(TimeDeltaInterpolatorTest, SetBounds_Stopped) { - const base::TimeDelta kFirstTime = base::TimeDelta::FromSeconds(4); - const base::TimeDelta kSecondTime = base::TimeDelta::FromSeconds(16); - const base::TimeDelta kArbitraryMaxTime = base::TimeDelta::FromSeconds(100); + const base::TimeDelta kFirstTime = base::Seconds(4); + const base::TimeDelta kSecondTime = base::Seconds(16); + const base::TimeDelta kArbitraryMaxTime = base::Seconds(100); interpolator_.SetBounds(kFirstTime, kArbitraryMaxTime, test_tick_clock_.NowTicks()); @@ -140,9 +140,9 @@ TEST_F(TimeDeltaInterpolatorTest, SetBounds_Started) { // We'll play for 4 seconds, then set the time to 12, then play for 4 more // seconds. const base::TimeDelta kZero; - const base::TimeDelta kPlayDuration = base::TimeDelta::FromSeconds(4); - const base::TimeDelta kUpdatedTime = base::TimeDelta::FromSeconds(12); - const base::TimeDelta kArbitraryMaxTime = base::TimeDelta::FromSeconds(100); + const base::TimeDelta kPlayDuration = base::Seconds(4); + const base::TimeDelta kUpdatedTime = base::Seconds(12); + const base::TimeDelta kArbitraryMaxTime = base::Seconds(100); const base::TimeDelta kExpected = kUpdatedTime + kPlayDuration; EXPECT_EQ(kZero, interpolator_.StartInterpolating()); @@ -156,8 +156,8 @@ TEST_F(TimeDeltaInterpolatorTest, SetBounds_Started) { TEST_F(TimeDeltaInterpolatorTest, SetUpperBound) { const base::TimeDelta kZero; - const base::TimeDelta kTimeInterval = base::TimeDelta::FromSeconds(4); - const base::TimeDelta kMaxTime = base::TimeDelta::FromSeconds(6); + const base::TimeDelta kTimeInterval = base::Seconds(4); + const base::TimeDelta kMaxTime = base::Seconds(6); EXPECT_EQ(kZero, interpolator_.StartInterpolating()); interpolator_.SetUpperBound(kMaxTime); @@ -173,10 +173,10 @@ TEST_F(TimeDeltaInterpolatorTest, SetUpperBound) { TEST_F(TimeDeltaInterpolatorTest, SetUpperBound_MultipleTimes) { const base::TimeDelta kZero; - const base::TimeDelta kTimeInterval = base::TimeDelta::FromSeconds(4); - const base::TimeDelta kMaxTime0 = base::TimeDelta::FromSeconds(120); - const base::TimeDelta kMaxTime1 = base::TimeDelta::FromSeconds(6); - const base::TimeDelta kMaxTime2 = base::TimeDelta::FromSeconds(12); + const base::TimeDelta kTimeInterval = base::Seconds(4); + const base::TimeDelta kMaxTime0 = base::Seconds(120); + const base::TimeDelta kMaxTime1 = base::Seconds(6); + const base::TimeDelta kMaxTime2 = base::Seconds(12); EXPECT_EQ(kZero, interpolator_.StartInterpolating()); interpolator_.SetUpperBound(kMaxTime0); diff --git a/chromium/media/base/tuneable.cc b/chromium/media/base/tuneable.cc index d82e68ef45a..0b71e94d563 100644 --- a/chromium/media/base/tuneable.cc +++ b/chromium/media/base/tuneable.cc @@ -43,9 +43,9 @@ base::TimeDelta GetParam<base::TimeDelta>(const char* name, base::TimeDelta minimum_value, base::TimeDelta default_value, base::TimeDelta maximum_value) { - return base::TimeDelta::FromMilliseconds(GetParam<int>( - name, minimum_value.InMilliseconds(), default_value.InMilliseconds(), - maximum_value.InMilliseconds())); + return base::Milliseconds(GetParam<int>(name, minimum_value.InMilliseconds(), + default_value.InMilliseconds(), + maximum_value.InMilliseconds())); } } // namespace diff --git a/chromium/media/base/tuneable_unittest.cc b/chromium/media/base/tuneable_unittest.cc index 1ea34fa93ed..813c9040890 100644 --- a/chromium/media/base/tuneable_unittest.cc +++ b/chromium/media/base/tuneable_unittest.cc @@ -105,9 +105,9 @@ TEST_F(TuneableTest, IntTuneableFromParams) { TEST_F(TuneableTest, OtherSpecializationsCompile) { // Since it's all templated, just be happy if it compiles and does something // somewhat sane. - constexpr base::TimeDelta min_value = base::TimeDelta::FromSeconds(0); - constexpr base::TimeDelta default_value = base::TimeDelta::FromSeconds(5); - constexpr base::TimeDelta max_value = base::TimeDelta::FromSeconds(10); + constexpr base::TimeDelta min_value = base::Seconds(0); + constexpr base::TimeDelta default_value = base::Seconds(5); + constexpr base::TimeDelta max_value = base::Seconds(10); Tuneable<base::TimeDelta> time_delta_tuneable("whatever", min_value, default_value, max_value); // Since the tuneable is not provided in the finch parameters, it should @@ -122,11 +122,11 @@ TEST_F(TuneableTest, TimeDeltaIsSpecifiedInMilliseconds) { // Since the finch params are constructed with the assumption that the value // will be interpreted as milliseconds, make sure that the Tuneable actually // does interpret it that way. - constexpr base::TimeDelta min_value = base::TimeDelta::FromSeconds(0); - constexpr base::TimeDelta max_value = base::TimeDelta::FromSeconds(100); + constexpr base::TimeDelta min_value = base::Seconds(0); + constexpr base::TimeDelta max_value = base::Seconds(100); Tuneable<base::TimeDelta> t(kTuneableTimeDeltaFiveSeconds, min_value, min_value, max_value); - EXPECT_EQ(t.value(), base::TimeDelta::FromSeconds(5)); + EXPECT_EQ(t.value(), base::Seconds(5)); } } // namespace media diff --git a/chromium/media/base/unaligned_shared_memory.h b/chromium/media/base/unaligned_shared_memory.h index 71bf064d652..f4fe2c976de 100644 --- a/chromium/media/base/unaligned_shared_memory.h +++ b/chromium/media/base/unaligned_shared_memory.h @@ -28,6 +28,9 @@ class MEDIA_EXPORT UnalignedSharedMemory { size_t size, bool read_only); + UnalignedSharedMemory(const UnalignedSharedMemory&) = delete; + UnalignedSharedMemory& operator=(const UnalignedSharedMemory&) = delete; + ~UnalignedSharedMemory(); // Map the shared memory region. Note that the passed |size| parameter should @@ -52,8 +55,6 @@ class MEDIA_EXPORT UnalignedSharedMemory { // Pointer to the unaligned data in the shared memory mapping. uint8_t* mapping_ptr_ = nullptr; - - DISALLOW_COPY_AND_ASSIGN(UnalignedSharedMemory); }; // Wrapper over base::WritableSharedMemoryMapping that is mapped at unaligned @@ -68,6 +69,9 @@ class MEDIA_EXPORT WritableUnalignedMapping { size_t size, off_t offset); + WritableUnalignedMapping(const WritableUnalignedMapping&) = delete; + WritableUnalignedMapping& operator=(const WritableUnalignedMapping&) = delete; + ~WritableUnalignedMapping(); size_t size() const { return size_; } @@ -86,8 +90,6 @@ class MEDIA_EXPORT WritableUnalignedMapping { // mapped and requested offset; strictly less than // base::SysInfo::VMAllocationGranularity(). size_t misalignment_; - - DISALLOW_COPY_AND_ASSIGN(WritableUnalignedMapping); }; // Wrapper over base::ReadOnlySharedMemoryMapping that is mapped at unaligned @@ -102,6 +104,9 @@ class MEDIA_EXPORT ReadOnlyUnalignedMapping { size_t size, off_t offset); + ReadOnlyUnalignedMapping(const ReadOnlyUnalignedMapping&) = delete; + ReadOnlyUnalignedMapping& operator=(const ReadOnlyUnalignedMapping&) = delete; + ~ReadOnlyUnalignedMapping(); size_t size() const { return size_; } @@ -120,8 +125,6 @@ class MEDIA_EXPORT ReadOnlyUnalignedMapping { // mapped and requested offset; strictly less than // base::SysInfo::VMAllocationGranularity(). size_t misalignment_; - - DISALLOW_COPY_AND_ASSIGN(ReadOnlyUnalignedMapping); }; } // namespace media diff --git a/chromium/media/base/use_after_free_checker.h b/chromium/media/base/use_after_free_checker.h index aefcaae2b59..1ffde9b5f37 100644 --- a/chromium/media/base/use_after_free_checker.h +++ b/chromium/media/base/use_after_free_checker.h @@ -5,6 +5,7 @@ #ifndef MEDIA_BASE_USE_AFTER_FREE_CHECKER_H_ #define MEDIA_BASE_USE_AFTER_FREE_CHECKER_H_ +#include "base/debug/crash_logging.h" #include "base/debug/dump_without_crashing.h" #include "base/location.h" #include "media/base/media_export.h" diff --git a/chromium/media/base/user_input_monitor.h b/chromium/media/base/user_input_monitor.h index 7b774949d71..aebbb8b67e5 100644 --- a/chromium/media/base/user_input_monitor.h +++ b/chromium/media/base/user_input_monitor.h @@ -33,6 +33,10 @@ WriteKeyPressMonitorCount(const base::WritableSharedMemoryMapping& shmem, class MEDIA_EXPORT UserInputMonitor { public: UserInputMonitor(); + + UserInputMonitor(const UserInputMonitor&) = delete; + UserInputMonitor& operator=(const UserInputMonitor&) = delete; + virtual ~UserInputMonitor(); // Creates a platform-specific instance of UserInputMonitorBase. @@ -52,15 +56,16 @@ class MEDIA_EXPORT UserInputMonitor { // number of keypresses happened within that time period, but should not make // any assumption on the initial value. virtual uint32_t GetKeyPressCount() const = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(UserInputMonitor); }; // Monitors and notifies about keyboard events. class MEDIA_EXPORT UserInputMonitorBase : public UserInputMonitor { public: UserInputMonitorBase(); + + UserInputMonitorBase(const UserInputMonitorBase&) = delete; + UserInputMonitorBase& operator=(const UserInputMonitorBase&) = delete; + ~UserInputMonitorBase() override; // A caller must call EnableKeyPressMonitoring(WithMapping) and @@ -84,8 +89,6 @@ class MEDIA_EXPORT UserInputMonitorBase : public UserInputMonitor { base::ReadOnlySharedMemoryRegion key_press_count_region_; SEQUENCE_CHECKER(owning_sequence_); - - DISALLOW_COPY_AND_ASSIGN(UserInputMonitorBase); }; } // namespace media diff --git a/chromium/media/base/user_input_monitor_linux.cc b/chromium/media/base/user_input_monitor_linux.cc index 58b7d3033fe..ba089a7ebcc 100644 --- a/chromium/media/base/user_input_monitor_linux.cc +++ b/chromium/media/base/user_input_monitor_linux.cc @@ -103,6 +103,10 @@ class UserInputMonitorLinux : public UserInputMonitorBase { public: explicit UserInputMonitorLinux( const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner); + + UserInputMonitorLinux(const UserInputMonitorLinux&) = delete; + UserInputMonitorLinux& operator=(const UserInputMonitorLinux&) = delete; + ~UserInputMonitorLinux() override; // Public UserInputMonitor overrides. @@ -117,8 +121,6 @@ class UserInputMonitorLinux : public UserInputMonitorBase { scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; UserInputMonitorAdapter* core_; - - DISALLOW_COPY_AND_ASSIGN(UserInputMonitorLinux); }; UserInputMonitorAdapter* CreateUserInputMonitor( diff --git a/chromium/media/base/user_input_monitor_mac.cc b/chromium/media/base/user_input_monitor_mac.cc index eac1a4fbd2d..92d3c01d549 100644 --- a/chromium/media/base/user_input_monitor_mac.cc +++ b/chromium/media/base/user_input_monitor_mac.cc @@ -18,11 +18,15 @@ namespace { // Update key press count in shared memory twice as frequent as // AudioInputController::AudioCallback::OnData() callback for WebRTC. constexpr base::TimeDelta kUpdateKeyPressCountIntervalMs = - base::TimeDelta::FromMilliseconds(5); + base::Milliseconds(5); class UserInputMonitorMac : public UserInputMonitorBase { public: UserInputMonitorMac(); + + UserInputMonitorMac(const UserInputMonitorMac&) = delete; + UserInputMonitorMac& operator=(const UserInputMonitorMac&) = delete; + ~UserInputMonitorMac() override; uint32_t GetKeyPressCount() const override; @@ -40,8 +44,6 @@ class UserInputMonitorMac : public UserInputMonitorBase { // Timer for updating key press count in |key_press_count_mapping_|. base::RepeatingTimer key_press_count_timer_; - - DISALLOW_COPY_AND_ASSIGN(UserInputMonitorMac); }; UserInputMonitorMac::UserInputMonitorMac() {} diff --git a/chromium/media/base/user_input_monitor_win.cc b/chromium/media/base/user_input_monitor_win.cc index 327b28bb711..5b779fe8fce 100644 --- a/chromium/media/base/user_input_monitor_win.cc +++ b/chromium/media/base/user_input_monitor_win.cc @@ -52,6 +52,10 @@ class UserInputMonitorWinCore explicit UserInputMonitorWinCore( scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); + + UserInputMonitorWinCore(const UserInputMonitorWinCore&) = delete; + UserInputMonitorWinCore& operator=(const UserInputMonitorWinCore&) = delete; + ~UserInputMonitorWinCore() override; // DestructionObserver overrides. @@ -90,14 +94,16 @@ class UserInputMonitorWinCore bool pause_monitoring_ = false; bool start_monitoring_after_hook_removed_ = false; - - DISALLOW_COPY_AND_ASSIGN(UserInputMonitorWinCore); }; class UserInputMonitorWin : public UserInputMonitorBase { public: explicit UserInputMonitorWin( const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner); + + UserInputMonitorWin(const UserInputMonitorWin&) = delete; + UserInputMonitorWin& operator=(const UserInputMonitorWin&) = delete; + ~UserInputMonitorWin() override; // Public UserInputMonitor overrides. @@ -112,8 +118,6 @@ class UserInputMonitorWin : public UserInputMonitorBase { scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; UserInputMonitorWinCore* core_; - - DISALLOW_COPY_AND_ASSIGN(UserInputMonitorWin); }; UserInputMonitorWinCore::UserInputMonitorWinCore( diff --git a/chromium/media/base/video_codecs.cc b/chromium/media/base/video_codecs.cc index 6c58bbabd66..8d2b7e3beca 100644 --- a/chromium/media/base/video_codecs.cc +++ b/chromium/media/base/video_codecs.cc @@ -17,27 +17,27 @@ namespace media { // The names come from src/third_party/ffmpeg/libavcodec/codec_desc.c std::string GetCodecName(VideoCodec codec) { switch (codec) { - case kUnknownVideoCodec: + case VideoCodec::kUnknown: return "unknown"; - case kCodecH264: + case VideoCodec::kH264: return "h264"; - case kCodecHEVC: + case VideoCodec::kHEVC: return "hevc"; - case kCodecDolbyVision: + case VideoCodec::kDolbyVision: return "dolbyvision"; - case kCodecVC1: + case VideoCodec::kVC1: return "vc1"; - case kCodecMPEG2: + case VideoCodec::kMPEG2: return "mpeg2video"; - case kCodecMPEG4: + case VideoCodec::kMPEG4: return "mpeg4"; - case kCodecTheora: + case VideoCodec::kTheora: return "theora"; - case kCodecVP8: + case VideoCodec::kVP8: return "vp8"; - case kCodecVP9: + case VideoCodec::kVP9: return "vp9"; - case kCodecAV1: + case VideoCodec::kAV1: return "av1"; } NOTREACHED(); @@ -867,7 +867,7 @@ bool ParseDolbyVisionCodecId(const std::string& codec_id, #endif VideoCodec StringToVideoCodec(const std::string& codec_id) { - VideoCodec codec = kUnknownVideoCodec; + VideoCodec codec = VideoCodec::kUnknown; VideoCodecProfile profile = VIDEO_CODEC_PROFILE_UNKNOWN; uint8_t level = 0; VideoColorSpace color_space; @@ -883,61 +883,61 @@ void ParseCodec(const std::string& codec_id, std::vector<std::string> elem = base::SplitString( codec_id, ".", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); if (elem.empty()) { - codec = kUnknownVideoCodec; + codec = VideoCodec::kUnknown; return; } if (codec_id == "vp8" || codec_id == "vp8.0") { - codec = kCodecVP8; + codec = VideoCodec::kVP8; return; } if (ParseNewStyleVp9CodecID(codec_id, &profile, &level, &color_space) || ParseLegacyVp9CodecID(codec_id, &profile, &level)) { - codec = kCodecVP9; + codec = VideoCodec::kVP9; return; } #if BUILDFLAG(ENABLE_AV1_DECODER) if (ParseAv1CodecId(codec_id, &profile, &level, &color_space)) { - codec = kCodecAV1; + codec = VideoCodec::kAV1; return; } #endif if (codec_id == "theora") { - codec = kCodecTheora; + codec = VideoCodec::kTheora; return; } if (ParseAVCCodecId(codec_id, &profile, &level)) { - codec = kCodecH264; + codec = VideoCodec::kH264; return; } #if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER) if (ParseAVCCodecId(TranslateLegacyAvc1CodecIds(codec_id), &profile, &level)) { - codec = kCodecH264; + codec = VideoCodec::kH264; return; } #endif #if BUILDFLAG(ENABLE_PLATFORM_HEVC) if (ParseHEVCCodecId(codec_id, &profile, &level)) { - codec = kCodecHEVC; + codec = VideoCodec::kHEVC; return; } #endif #if BUILDFLAG(ENABLE_PLATFORM_DOLBY_VISION) if (ParseDolbyVisionCodecId(codec_id, &profile, &level)) { - codec = kCodecDolbyVision; + codec = VideoCodec::kDolbyVision; return; } #endif - codec = kUnknownVideoCodec; + codec = VideoCodec::kUnknown; } VideoCodec VideoCodecProfileToVideoCodec(VideoCodecProfile profile) { switch (profile) { case VIDEO_CODEC_PROFILE_UNKNOWN: - return kUnknownVideoCodec; + return VideoCodec::kUnknown; case H264PROFILE_BASELINE: case H264PROFILE_MAIN: case H264PROFILE_EXTENDED: @@ -949,31 +949,36 @@ VideoCodec VideoCodecProfileToVideoCodec(VideoCodecProfile profile) { case H264PROFILE_SCALABLEHIGH: case H264PROFILE_STEREOHIGH: case H264PROFILE_MULTIVIEWHIGH: - return kCodecH264; + return VideoCodec::kH264; case HEVCPROFILE_MAIN: case HEVCPROFILE_MAIN10: case HEVCPROFILE_MAIN_STILL_PICTURE: - return kCodecHEVC; + return VideoCodec::kHEVC; case VP8PROFILE_ANY: - return kCodecVP8; + return VideoCodec::kVP8; case VP9PROFILE_PROFILE0: case VP9PROFILE_PROFILE1: case VP9PROFILE_PROFILE2: case VP9PROFILE_PROFILE3: - return kCodecVP9; + return VideoCodec::kVP9; case DOLBYVISION_PROFILE0: case DOLBYVISION_PROFILE4: case DOLBYVISION_PROFILE5: case DOLBYVISION_PROFILE7: case DOLBYVISION_PROFILE8: case DOLBYVISION_PROFILE9: - return kCodecDolbyVision; + return VideoCodec::kDolbyVision; case THEORAPROFILE_ANY: - return kCodecTheora; + return VideoCodec::kTheora; case AV1PROFILE_PROFILE_MAIN: case AV1PROFILE_PROFILE_HIGH: case AV1PROFILE_PROFILE_PRO: - return kCodecAV1; + return VideoCodec::kAV1; } } + +std::ostream& operator<<(std::ostream& os, const VideoCodec& codec) { + return os << GetCodecName(codec); +} + } // namespace media diff --git a/chromium/media/base/video_codecs.h b/chromium/media/base/video_codecs.h index 0e7dce197d8..12bf6e4508c 100644 --- a/chromium/media/base/video_codecs.h +++ b/chromium/media/base/video_codecs.h @@ -16,27 +16,27 @@ namespace media { class VideoColorSpace; // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.media -enum VideoCodec { +enum class VideoCodec { // These values are histogrammed over time; do not change their ordinal // values. When deleting a codec replace it with a dummy value; when adding a - // codec, do so at the bottom (and update kVideoCodecMax). - kUnknownVideoCodec = 0, - kCodecH264, - kCodecVC1, - kCodecMPEG2, - kCodecMPEG4, - kCodecTheora, - kCodecVP8, - kCodecVP9, - kCodecHEVC, - kCodecDolbyVision, - kCodecAV1, + // codec, do so at the bottom (and update kMaxValue). + kUnknown = 0, + kH264, + kVC1, + kMPEG2, + kMPEG4, + kTheora, + kVP8, + kVP9, + kHEVC, + kDolbyVision, + kAV1, // DO NOT ADD RANDOM VIDEO CODECS! // // The only acceptable time to add a new codec is if there is production code // that uses said codec in the same CL. - kVideoCodecMax = kCodecAV1, // Must equal the last "real" codec above. + kMaxValue = kAV1, // Must equal the last "real" codec above. }; // Video codec profiles. Keep in sync with mojo::VideoCodecProfile (see @@ -166,6 +166,9 @@ VideoCodecProfileToVideoCodec(VideoCodecProfile profile); std::string TranslateLegacyAvc1CodecIds(const std::string& codec_id); #endif +MEDIA_EXPORT std::ostream& operator<<(std::ostream& os, + const VideoCodec& codec); + } // namespace media #endif // MEDIA_BASE_VIDEO_CODECS_H_ diff --git a/chromium/media/base/video_color_space_unittest.cc b/chromium/media/base/video_color_space_unittest.cc index b8cf8dd3d07..71986269858 100644 --- a/chromium/media/base/video_color_space_unittest.cc +++ b/chromium/media/base/video_color_space_unittest.cc @@ -6,7 +6,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "ui/gfx/color_space.h" #include "ui/gfx/color_transform.h" -#include "ui/gfx/transform.h" +#include "ui/gfx/geometry/transform.h" namespace media { diff --git a/chromium/media/base/video_decoder_config.cc b/chromium/media/base/video_decoder_config.cc index 40c9707fae4..b28a2239029 100644 --- a/chromium/media/base/video_decoder_config.cc +++ b/chromium/media/base/video_decoder_config.cc @@ -69,7 +69,7 @@ void VideoDecoderConfig::Initialize(VideoCodec codec, } bool VideoDecoderConfig::IsValidConfig() const { - return codec_ != kUnknownVideoCodec && IsValidSize(coded_size_) && + return codec_ != VideoCodec::kUnknown && IsValidSize(coded_size_) && IsValidSize(natural_size_) && gfx::Rect(coded_size_).Contains(visible_rect_); } diff --git a/chromium/media/base/video_decoder_config.h b/chromium/media/base/video_decoder_config.h index 1eb9bf07c46..875de0d3125 100644 --- a/chromium/media/base/video_decoder_config.h +++ b/chromium/media/base/video_decoder_config.h @@ -160,7 +160,7 @@ class MEDIA_EXPORT VideoDecoderConfig { bool is_rtc() const { return is_rtc_; } private: - VideoCodec codec_ = kUnknownVideoCodec; + VideoCodec codec_ = VideoCodec::kUnknown; VideoCodecProfile profile_ = VIDEO_CODEC_PROFILE_UNKNOWN; // Optional video codec level. kNoVideoCodecLevel means the field is not diff --git a/chromium/media/base/video_decoder_config_unittest.cc b/chromium/media/base/video_decoder_config_unittest.cc index 22954f2de69..6bfa5b94889 100644 --- a/chromium/media/base/video_decoder_config_unittest.cc +++ b/chromium/media/base/video_decoder_config_unittest.cc @@ -14,7 +14,7 @@ static const gfx::Rect kVisibleRect(320, 240); static const gfx::Size kNaturalSize(320, 240); TEST(VideoDecoderConfigTest, AlphaModeSetCorrectly) { - VideoDecoderConfig config(kCodecVP8, VIDEO_CODEC_PROFILE_UNKNOWN, + VideoDecoderConfig config(VideoCodec::kVP8, VIDEO_CODEC_PROFILE_UNKNOWN, VideoDecoderConfig::AlphaMode::kIsOpaque, VideoColorSpace(), kNoTransformation, kCodedSize, kVisibleRect, kNaturalSize, EmptyExtraData(), @@ -22,7 +22,7 @@ TEST(VideoDecoderConfigTest, AlphaModeSetCorrectly) { EXPECT_TRUE(config.IsValidConfig()); EXPECT_EQ(config.alpha_mode(), VideoDecoderConfig::AlphaMode::kIsOpaque); - config.Initialize(kCodecVP8, VIDEO_CODEC_PROFILE_UNKNOWN, + config.Initialize(VideoCodec::kVP8, VIDEO_CODEC_PROFILE_UNKNOWN, VideoDecoderConfig::AlphaMode::kHasAlpha, VideoColorSpace(), kNoTransformation, kCodedSize, kVisibleRect, kNaturalSize, EmptyExtraData(), EncryptionScheme::kUnencrypted); @@ -30,10 +30,11 @@ TEST(VideoDecoderConfigTest, AlphaModeSetCorrectly) { } TEST(VideoDecoderConfigTest, SetProfile) { - VideoDecoderConfig config( - kCodecVP9, VP9PROFILE_PROFILE0, VideoDecoderConfig::AlphaMode::kIsOpaque, - VideoColorSpace(), kNoTransformation, kCodedSize, kVisibleRect, - kNaturalSize, EmptyExtraData(), EncryptionScheme::kUnencrypted); + VideoDecoderConfig config(VideoCodec::kVP9, VP9PROFILE_PROFILE0, + VideoDecoderConfig::AlphaMode::kIsOpaque, + VideoColorSpace(), kNoTransformation, kCodedSize, + kVisibleRect, kNaturalSize, EmptyExtraData(), + EncryptionScheme::kUnencrypted); config.set_profile(VP9PROFILE_PROFILE2); EXPECT_EQ(config.profile(), VP9PROFILE_PROFILE2); } diff --git a/chromium/media/base/video_encoder.h b/chromium/media/base/video_encoder.h index d7ca6801fb8..c6ee9c7d3c8 100644 --- a/chromium/media/base/video_encoder.h +++ b/chromium/media/base/video_encoder.h @@ -10,6 +10,7 @@ #include "media/base/bitrate.h" #include "media/base/media_export.h" #include "media/base/status.h" +#include "media/base/svc_scalability_mode.h" #include "media/base/video_codecs.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/gfx/geometry/size.h" @@ -54,11 +55,10 @@ class MEDIA_EXPORT VideoEncoder { absl::optional<int> keyframe_interval = 10000; - // Requested number of SVC temporal layers. - int temporal_layers = 1; - LatencyMode latency_mode = LatencyMode::Realtime; + absl::optional<SVCScalabilityMode> scalability_mode; + // Only used for H264 encoding. AvcOptions avc; }; diff --git a/chromium/media/base/video_frame.cc b/chromium/media/base/video_frame.cc index 9731ad2ca4a..8e59b5fc863 100644 --- a/chromium/media/base/video_frame.cc +++ b/chromium/media/base/video_frame.cc @@ -12,7 +12,6 @@ #include "base/atomic_sequence_num.h" #include "base/bind.h" #include "base/bits.h" -#include "base/callback_helpers.h" #include "base/cxx17_backports.h" #include "base/logging.h" #include "base/process/memory.h" @@ -388,6 +387,7 @@ scoped_refptr<VideoFrame> VideoFrame::WrapNativeTextures( // Wrapping native textures should... have textures. https://crbug.com/864145. DCHECK(frame->HasTextures()); + DCHECK_GT(frame->NumTextures(), 0u); return frame; } @@ -898,6 +898,18 @@ scoped_refptr<VideoFrame> VideoFrame::WrapVideoFrame( wrapping_frame->BackWithSharedMemory(frame->shm_region_); } + // Don't let a Matryoshka doll of frames occur. Do this here instead of above + // since |frame| may have different metadata than |frame->wrapped_frame_|. + // + // We must still keep |frame| alive though since it may have destruction + // observers which signal that the underlying resource is okay to reuse. E.g., + // VideoFramePool. + if (frame->wrapped_frame_) { + wrapping_frame->AddDestructionObserver( + base::BindOnce([](scoped_refptr<VideoFrame>) {}, frame)); + frame = frame->wrapped_frame_; + } + wrapping_frame->wrapped_frame_ = std::move(frame); return wrapping_frame; } @@ -1152,24 +1164,22 @@ bool VideoFrame::IsMappable() const { } bool VideoFrame::HasTextures() const { - // A SharedImage can be turned into a texture, and so it counts as a texture - // in the context of this call. return wrapped_frame_ ? wrapped_frame_->HasTextures() - : (mailbox_holders_[0].mailbox.IsSharedImage() || - !mailbox_holders_[0].mailbox.IsZero()); + : !mailbox_holders_[0].mailbox.IsZero(); } size_t VideoFrame::NumTextures() const { + if (wrapped_frame_) + return wrapped_frame_->NumTextures(); + if (!HasTextures()) return 0; - const auto& mailbox_holders = - wrapped_frame_ ? wrapped_frame_->mailbox_holders_ : mailbox_holders_; size_t i = 0; for (; i < NumPlanes(format()); ++i) { - if (mailbox_holders[i].mailbox.IsZero()) { + const auto& mailbox = mailbox_holders_[i].mailbox; + if (mailbox.IsZero()) return i; - } } return i; } @@ -1239,7 +1249,7 @@ const gpu::MailboxHolder& VideoFrame::mailbox_holder( size_t texture_index) const { DCHECK(HasTextures()); DCHECK(IsValidPlane(format(), texture_index)); - return wrapped_frame_ ? wrapped_frame_->mailbox_holders_[texture_index] + return wrapped_frame_ ? wrapped_frame_->mailbox_holder(texture_index) : mailbox_holders_[texture_index]; } @@ -1411,6 +1421,23 @@ gfx::Size VideoFrame::DetermineAlignedSize(VideoPixelFormat format, return adjusted; } +bool VideoFrame::IsValidSize(const gfx::Size& coded_size, + const gfx::Rect& visible_rect, + const gfx::Size& natural_size) { + int coded_size_area = coded_size.GetCheckedArea().ValueOrDefault(INT_MAX); + int natural_size_area = natural_size.GetCheckedArea().ValueOrDefault(INT_MAX); + static_assert(limits::kMaxCanvas < INT_MAX, ""); + return !(coded_size_area > limits::kMaxCanvas || + coded_size.width() > limits::kMaxDimension || + coded_size.height() > limits::kMaxDimension || + visible_rect.x() < 0 || visible_rect.y() < 0 || + visible_rect.right() > coded_size.width() || + visible_rect.bottom() > coded_size.height() || + natural_size_area > limits::kMaxCanvas || + natural_size.width() > limits::kMaxDimension || + natural_size.height() > limits::kMaxDimension); +} + // static bool VideoFrame::IsValidConfigInternal(VideoPixelFormat format, FrameControlType frame_control_type, @@ -1418,17 +1445,7 @@ bool VideoFrame::IsValidConfigInternal(VideoPixelFormat format, const gfx::Rect& visible_rect, const gfx::Size& natural_size) { // Check maximum limits for all formats. - int coded_size_area = coded_size.GetCheckedArea().ValueOrDefault(INT_MAX); - int natural_size_area = natural_size.GetCheckedArea().ValueOrDefault(INT_MAX); - static_assert(limits::kMaxCanvas < INT_MAX, ""); - if (coded_size_area > limits::kMaxCanvas || - coded_size.width() > limits::kMaxDimension || - coded_size.height() > limits::kMaxDimension || visible_rect.x() < 0 || - visible_rect.y() < 0 || visible_rect.right() > coded_size.width() || - visible_rect.bottom() > coded_size.height() || - natural_size_area > limits::kMaxCanvas || - natural_size.width() > limits::kMaxDimension || - natural_size.height() > limits::kMaxDimension) { + if (!IsValidSize(coded_size, visible_rect, natural_size)) { return false; } diff --git a/chromium/media/base/video_frame.h b/chromium/media/base/video_frame.h index 81c9ac7dc59..21432585b8b 100644 --- a/chromium/media/base/video_frame.h +++ b/chromium/media/base/video_frame.h @@ -121,6 +121,13 @@ class MEDIA_EXPORT VideoFrame : public base::RefCountedThreadSafe<VideoFrame> { VideoFrame(const VideoFrame&) = delete; VideoFrame& operator=(const VideoFrame&) = delete; + // Returns true if size is valid for a VideoFrame. This method returns false + // if the size is empty, even though it is possible to create a zero-sized + // VideoFrame if the VideoPixelFormat is PIXEL_FORMAT_UNKNOWN. + static bool IsValidSize(const gfx::Size& coded_size, + const gfx::Rect& visible_rect, + const gfx::Size& natural_size); + // Returns true if frame configuration is valid. static bool IsValidConfig(VideoPixelFormat format, StorageType storage_type, diff --git a/chromium/media/base/video_frame_metadata.cc b/chromium/media/base/video_frame_metadata.cc index 944151640dd..96c2c877d53 100644 --- a/chromium/media/base/video_frame_metadata.cc +++ b/chromium/media/base/video_frame_metadata.cc @@ -57,6 +57,9 @@ void VideoFrameMetadata::MergeMetadataFrom( MERGE_FIELD(wallclock_frame_duration, metadata_source); MERGE_FIELD(maximum_composition_delay_in_frames, metadata_source); MERGE_FIELD(hw_protected_validation_id, metadata_source); +#if BUILDFLAG(USE_VAAPI) + MERGE_FIELD(hw_va_protected_session_id, metadata_source); +#endif } } // namespace media diff --git a/chromium/media/base/video_frame_metadata.h b/chromium/media/base/video_frame_metadata.h index 379b26feed6..b26fb4933a3 100644 --- a/chromium/media/base/video_frame_metadata.h +++ b/chromium/media/base/video_frame_metadata.h @@ -10,6 +10,7 @@ #include "build/build_config.h" #include "media/base/media_export.h" #include "media/base/video_transformation.h" +#include "media/gpu/buildflags.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/gfx/geometry/rect.h" @@ -136,6 +137,18 @@ struct MEDIA_EXPORT VideoFrameMetadata { // properly displayed or not. Non-zero when valid. uint32_t hw_protected_validation_id = 0; +#if BUILDFLAG(USE_VAAPI) + // The ID of the VA-API protected session used to decode this frame, if + // applicable. The proper type is VAProtectedSessionID. However, in order to + // avoid including the VA-API headers in this file, we use the underlying + // type. Users of this field are expected to have compile-time assertions to + // ensure it's safe to use this as a VAProtectedSessionID. + // + // Notes on IPC: this field should not be copied to the Mojo version of + // VideoFrameMetadata because it should not cross process boundaries. + absl::optional<unsigned int> hw_va_protected_session_id; +#endif + // An UnguessableToken that identifies VideoOverlayFactory that created // this VideoFrame. It's used by Cast to help with video hole punch. absl::optional<base::UnguessableToken> overlay_plane_id; diff --git a/chromium/media/base/video_frame_pool.cc b/chromium/media/base/video_frame_pool.cc index b5db2c3fbab..52d82da5df9 100644 --- a/chromium/media/base/video_frame_pool.cc +++ b/chromium/media/base/video_frame_pool.cc @@ -132,7 +132,7 @@ void VideoFramePool::PoolImpl::FrameReleased(scoped_refptr<VideoFrame> frame) { // After this loop, |stale_index| is the index of the oldest non-stale frame. // Such an index must exist because |frame| is never stale. int stale_index = -1; - constexpr base::TimeDelta kStaleFrameLimit = base::TimeDelta::FromSeconds(10); + constexpr base::TimeDelta kStaleFrameLimit = base::Seconds(10); while (now - frames_[++stale_index].last_use_time > kStaleFrameLimit) { // Last frame should never be included since we just added it. DCHECK_LE(static_cast<size_t>(stale_index), frames_.size()); diff --git a/chromium/media/base/video_frame_pool_unittest.cc b/chromium/media/base/video_frame_pool_unittest.cc index 019111de709..a52ba7eb833 100644 --- a/chromium/media/base/video_frame_pool_unittest.cc +++ b/chromium/media/base/video_frame_pool_unittest.cc @@ -20,7 +20,7 @@ class VideoFramePoolTest VideoFramePoolTest() : pool_(new VideoFramePool()) { // Seed test clock with some dummy non-zero value to avoid confusion with // empty base::TimeTicks values. - test_clock_.Advance(base::TimeDelta::FromSeconds(1234)); + test_clock_.Advance(base::Seconds(1234)); pool_->SetTickClockForTesting(&test_clock_); } @@ -31,12 +31,10 @@ class VideoFramePoolTest gfx::Size natural_size(coded_size); scoped_refptr<VideoFrame> frame = - pool_->CreateFrame( - format, coded_size, visible_rect, natural_size, - base::TimeDelta::FromMilliseconds(timestamp_ms)); + pool_->CreateFrame(format, coded_size, visible_rect, natural_size, + base::Milliseconds(timestamp_ms)); EXPECT_EQ(format, frame->format()); - EXPECT_EQ(base::TimeDelta::FromMilliseconds(timestamp_ms), - frame->timestamp()); + EXPECT_EQ(base::Milliseconds(timestamp_ms), frame->timestamp()); if (format == PIXEL_FORMAT_ARGB) { EXPECT_EQ(coded_size, frame->coded_size()); } else { @@ -140,7 +138,7 @@ TEST_F(VideoFramePoolTest, StaleFramesAreExpired) { // Advance clock far enough to hit stale timer; ensure only frame_1 has its // resources released. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); + test_clock_.Advance(base::Minutes(1)); frame_2 = nullptr; CheckPoolSize(1u); } diff --git a/chromium/media/base/video_frame_unittest.cc b/chromium/media/base/video_frame_unittest.cc index e637fb202ac..7d9fac9b416 100644 --- a/chromium/media/base/video_frame_unittest.cc +++ b/chromium/media/base/video_frame_unittest.cc @@ -90,17 +90,17 @@ media::VideoFrameMetadata GetFullVideoFrameMetadata() { // base::TimeTicks base::TimeTicks now = base::TimeTicks::Now(); - metadata.receive_time = now + base::TimeDelta::FromMilliseconds(10); - metadata.capture_begin_time = now + base::TimeDelta::FromMilliseconds(20); - metadata.capture_end_time = now + base::TimeDelta::FromMilliseconds(30); - metadata.decode_begin_time = now + base::TimeDelta::FromMilliseconds(40); - metadata.decode_end_time = now + base::TimeDelta::FromMilliseconds(50); - metadata.reference_time = now + base::TimeDelta::FromMilliseconds(60); + metadata.receive_time = now + base::Milliseconds(10); + metadata.capture_begin_time = now + base::Milliseconds(20); + metadata.capture_end_time = now + base::Milliseconds(30); + metadata.decode_begin_time = now + base::Milliseconds(40); + metadata.decode_end_time = now + base::Milliseconds(50); + metadata.reference_time = now + base::Milliseconds(60); // base::TimeDeltas - metadata.processing_time = base::TimeDelta::FromMilliseconds(500); - metadata.frame_duration = base::TimeDelta::FromMilliseconds(16); - metadata.wallclock_frame_duration = base::TimeDelta::FromMilliseconds(17); + metadata.processing_time = base::Milliseconds(500); + metadata.frame_duration = base::Milliseconds(16); + metadata.wallclock_frame_duration = base::Milliseconds(17); return metadata; } @@ -170,8 +170,7 @@ void InitializeYV12Frame(VideoFrame* frame, double white_to_black) { // Given a |yv12_frame| this method converts the YV12 frame to RGBA and // makes sure that all the pixels of the RBG frame equal |expect_rgb_color|. -void ExpectFrameColor(media::VideoFrame* yv12_frame, - uint32_t expect_rgb_color) { +void ExpectFrameColor(VideoFrame* yv12_frame, uint32_t expect_rgb_color) { ASSERT_EQ(PIXEL_FORMAT_YV12, yv12_frame->format()); ASSERT_EQ(yv12_frame->stride(VideoFrame::kUPlane), yv12_frame->stride(VideoFrame::kVPlane)); @@ -216,7 +215,7 @@ void ExpectFrameExtents(VideoPixelFormat format, const char* expected_hash) { const unsigned char kFillByte = 0x80; const int kWidth = 61; const int kHeight = 31; - const base::TimeDelta kTimestamp = base::TimeDelta::FromMicroseconds(1337); + const base::TimeDelta kTimestamp = base::Microseconds(1337); gfx::Size size(kWidth, kHeight); scoped_refptr<VideoFrame> frame = VideoFrame::CreateFrame( @@ -247,16 +246,16 @@ void ExpectFrameExtents(VideoPixelFormat format, const char* expected_hash) { TEST(VideoFrame, CreateFrame) { const int kWidth = 64; const int kHeight = 48; - const base::TimeDelta kTimestamp = base::TimeDelta::FromMicroseconds(1337); + const base::TimeDelta kTimestamp = base::Microseconds(1337); // Create a YV12 Video Frame. gfx::Size size(kWidth, kHeight); - scoped_refptr<media::VideoFrame> frame = VideoFrame::CreateFrame( - media::PIXEL_FORMAT_YV12, size, gfx::Rect(size), size, kTimestamp); + scoped_refptr<VideoFrame> frame = VideoFrame::CreateFrame( + PIXEL_FORMAT_YV12, size, gfx::Rect(size), size, kTimestamp); ASSERT_TRUE(frame.get()); // Test VideoFrame implementation. - EXPECT_EQ(media::PIXEL_FORMAT_YV12, frame->format()); + EXPECT_EQ(PIXEL_FORMAT_YV12, frame->format()); { SCOPED_TRACE(""); InitializeYV12Frame(frame.get(), 0.0f); @@ -279,15 +278,15 @@ TEST(VideoFrame, CreateFrame) { EXPECT_EQ(MD5DigestToBase16(digest), "911991d51438ad2e1a40ed5f6fc7c796"); // Test single planar frame. - frame = VideoFrame::CreateFrame(media::PIXEL_FORMAT_ARGB, size, - gfx::Rect(size), size, kTimestamp); - EXPECT_EQ(media::PIXEL_FORMAT_ARGB, frame->format()); + frame = VideoFrame::CreateFrame(PIXEL_FORMAT_ARGB, size, gfx::Rect(size), + size, kTimestamp); + EXPECT_EQ(PIXEL_FORMAT_ARGB, frame->format()); EXPECT_GE(frame->stride(VideoFrame::kARGBPlane), frame->coded_size().width()); // Test double planar frame. - frame = VideoFrame::CreateFrame(media::PIXEL_FORMAT_NV12, size, - gfx::Rect(size), size, kTimestamp); - EXPECT_EQ(media::PIXEL_FORMAT_NV12, frame->format()); + frame = VideoFrame::CreateFrame(PIXEL_FORMAT_NV12, size, gfx::Rect(size), + size, kTimestamp); + EXPECT_EQ(PIXEL_FORMAT_NV12, frame->format()); // Test an empty frame. frame = VideoFrame::CreateEOSFrame(); @@ -302,13 +301,12 @@ TEST(VideoFrame, CreateFrame) { TEST(VideoFrame, CreateZeroInitializedFrame) { const int kWidth = 2; const int kHeight = 2; - const base::TimeDelta kTimestamp = base::TimeDelta::FromMicroseconds(1337); + const base::TimeDelta kTimestamp = base::Microseconds(1337); // Create a YV12 Video Frame. gfx::Size size(kWidth, kHeight); - scoped_refptr<media::VideoFrame> frame = - VideoFrame::CreateZeroInitializedFrame(media::PIXEL_FORMAT_YV12, size, - gfx::Rect(size), size, kTimestamp); + scoped_refptr<VideoFrame> frame = VideoFrame::CreateZeroInitializedFrame( + PIXEL_FORMAT_YV12, size, gfx::Rect(size), size, kTimestamp); ASSERT_TRUE(frame.get()); EXPECT_TRUE(frame->IsMappable()); @@ -325,7 +323,7 @@ TEST(VideoFrame, CreateBlackFrame) { const uint8_t kExpectedYRow[] = {0, 0}; const uint8_t kExpectedUVRow[] = {128}; - scoped_refptr<media::VideoFrame> frame = + scoped_refptr<VideoFrame> frame = VideoFrame::CreateBlackFrame(gfx::Size(kWidth, kHeight)); ASSERT_TRUE(frame.get()); EXPECT_TRUE(frame->IsMappable()); @@ -363,43 +361,66 @@ static void FrameNoLongerNeededCallback(bool* triggered) { TEST(VideoFrame, WrapVideoFrame) { const int kWidth = 4; const int kHeight = 4; - const base::TimeDelta kFrameDuration = base::TimeDelta::FromMicroseconds(42); + const base::TimeDelta kFrameDuration = base::Microseconds(42); - scoped_refptr<media::VideoFrame> frame; - bool done_callback_was_run = false; + scoped_refptr<VideoFrame> frame, frame2; + bool base_frame_done_callback_was_run = false; + bool wrapped_frame_done_callback_was_run = false; { - scoped_refptr<media::VideoFrame> wrapped_frame = - VideoFrame::CreateBlackFrame(gfx::Size(kWidth, kHeight)); - ASSERT_TRUE(wrapped_frame.get()); + auto base_frame = VideoFrame::CreateBlackFrame(gfx::Size(kWidth, kHeight)); + ASSERT_TRUE(base_frame); - gfx::Rect visible_rect(1, 1, 1, 1); + gfx::Rect visible_rect(0, 0, 2, 2); gfx::Size natural_size = visible_rect.size(); - wrapped_frame->metadata().frame_duration = kFrameDuration; - frame = media::VideoFrame::WrapVideoFrame( - wrapped_frame, wrapped_frame->format(), visible_rect, natural_size); - wrapped_frame->AddDestructionObserver( - base::BindOnce(&FrameNoLongerNeededCallback, &done_callback_was_run)); - EXPECT_EQ(wrapped_frame->coded_size(), frame->coded_size()); - EXPECT_EQ(wrapped_frame->data(media::VideoFrame::kYPlane), - frame->data(media::VideoFrame::kYPlane)); - EXPECT_NE(wrapped_frame->visible_rect(), frame->visible_rect()); + base_frame->metadata().frame_duration = kFrameDuration; + frame = VideoFrame::WrapVideoFrame(base_frame, base_frame->format(), + visible_rect, natural_size); + base_frame->AddDestructionObserver(base::BindOnce( + &FrameNoLongerNeededCallback, &base_frame_done_callback_was_run)); + EXPECT_EQ(base_frame->coded_size(), frame->coded_size()); + EXPECT_EQ(base_frame->data(VideoFrame::kYPlane), + frame->data(VideoFrame::kYPlane)); + EXPECT_NE(base_frame->visible_rect(), frame->visible_rect()); EXPECT_EQ(visible_rect, frame->visible_rect()); - EXPECT_NE(wrapped_frame->natural_size(), frame->natural_size()); + EXPECT_NE(base_frame->natural_size(), frame->natural_size()); EXPECT_EQ(natural_size, frame->natural_size()); // Verify metadata was copied to the wrapped frame. EXPECT_EQ(*frame->metadata().frame_duration, kFrameDuration); // Verify the metadata copy was a deep copy. - wrapped_frame->clear_metadata(); - EXPECT_NE(wrapped_frame->metadata().frame_duration.has_value(), + base_frame->clear_metadata(); + EXPECT_NE(base_frame->metadata().frame_duration.has_value(), frame->metadata().frame_duration.has_value()); + + frame->AddDestructionObserver(base::BindOnce( + &FrameNoLongerNeededCallback, &wrapped_frame_done_callback_was_run)); + + visible_rect = gfx::Rect(0, 0, 1, 1); + natural_size = visible_rect.size(); + frame2 = VideoFrame::WrapVideoFrame(frame, frame->format(), visible_rect, + natural_size); + EXPECT_EQ(base_frame->coded_size(), frame2->coded_size()); + EXPECT_EQ(base_frame->data(VideoFrame::kYPlane), + frame2->data(VideoFrame::kYPlane)); + EXPECT_NE(base_frame->visible_rect(), frame2->visible_rect()); + EXPECT_EQ(visible_rect, frame2->visible_rect()); + EXPECT_NE(base_frame->natural_size(), frame2->natural_size()); + EXPECT_EQ(natural_size, frame2->natural_size()); } - // Verify that |wrapped_frame| outlives |frame|. - EXPECT_FALSE(done_callback_was_run); + // At this point |base_frame| is held by |frame|, |frame2|. + EXPECT_FALSE(base_frame_done_callback_was_run); + EXPECT_FALSE(wrapped_frame_done_callback_was_run); + + // At this point |base_frame| is held by |frame2|, which also holds |frame|. frame.reset(); - EXPECT_TRUE(done_callback_was_run); + EXPECT_FALSE(base_frame_done_callback_was_run); + EXPECT_FALSE(wrapped_frame_done_callback_was_run); + + // Now all |base_frame| references should be released. + frame2.reset(); + EXPECT_TRUE(base_frame_done_callback_was_run); } // Create a frame that wraps unowned memory. @@ -408,15 +429,15 @@ TEST(VideoFrame, WrapExternalData) { gfx::Size coded_size(256, 256); gfx::Rect visible_rect(coded_size); CreateTestY16Frame(coded_size, visible_rect, memory); - auto timestamp = base::TimeDelta::FromMilliseconds(1); - auto frame = VideoFrame::WrapExternalData(media::PIXEL_FORMAT_Y16, coded_size, + auto timestamp = base::Milliseconds(1); + auto frame = VideoFrame::WrapExternalData(PIXEL_FORMAT_Y16, coded_size, visible_rect, visible_rect.size(), memory, sizeof(memory), timestamp); EXPECT_EQ(frame->coded_size(), coded_size); EXPECT_EQ(frame->visible_rect(), visible_rect); EXPECT_EQ(frame->timestamp(), timestamp); - EXPECT_EQ(frame->data(media::VideoFrame::kYPlane)[0], 0xff); + EXPECT_EQ(frame->data(VideoFrame::kYPlane)[0], 0xff); } // Create a frame that wraps read-only shared memory. @@ -430,22 +451,22 @@ TEST(VideoFrame, WrapSharedMemory) { gfx::Size coded_size(256, 256); gfx::Rect visible_rect(coded_size); CreateTestY16Frame(coded_size, visible_rect, mapping.memory()); - auto timestamp = base::TimeDelta::FromMilliseconds(1); + auto timestamp = base::Milliseconds(1); auto frame = VideoFrame::WrapExternalData( - media::PIXEL_FORMAT_Y16, coded_size, visible_rect, visible_rect.size(), + PIXEL_FORMAT_Y16, coded_size, visible_rect, visible_rect.size(), mapping.GetMemoryAsSpan<uint8_t>().data(), kDataSize, timestamp); frame->BackWithSharedMemory(®ion); EXPECT_EQ(frame->coded_size(), coded_size); EXPECT_EQ(frame->visible_rect(), visible_rect); EXPECT_EQ(frame->timestamp(), timestamp); - EXPECT_EQ(frame->data(media::VideoFrame::kYPlane)[0], 0xff); + EXPECT_EQ(frame->data(VideoFrame::kYPlane)[0], 0xff); } TEST(VideoFrame, WrapExternalGpuMemoryBuffer) { gfx::Size coded_size = gfx::Size(256, 256); gfx::Rect visible_rect(coded_size); - auto timestamp = base::TimeDelta::FromMilliseconds(1); + auto timestamp = base::Milliseconds(1); #if defined(OS_LINUX) || defined(OS_CHROMEOS) const uint64_t modifier = 0x001234567890abcdULL; #else @@ -455,14 +476,12 @@ TEST(VideoFrame, WrapExternalGpuMemoryBuffer) { std::make_unique<FakeGpuMemoryBuffer>( coded_size, gfx::BufferFormat::YUV_420_BIPLANAR, modifier); gfx::GpuMemoryBuffer* gmb_raw_ptr = gmb.get(); - gpu::MailboxHolder mailbox_holders[media::VideoFrame::kMaxPlanes] = { + gpu::MailboxHolder mailbox_holders[VideoFrame::kMaxPlanes] = { gpu::MailboxHolder(gpu::Mailbox::Generate(), gpu::SyncToken(), 5), gpu::MailboxHolder(gpu::Mailbox::Generate(), gpu::SyncToken(), 10)}; auto frame = VideoFrame::WrapExternalGpuMemoryBuffer( visible_rect, coded_size, std::move(gmb), mailbox_holders, - base::DoNothing::Once<const gpu::SyncToken&, - std::unique_ptr<gfx::GpuMemoryBuffer>>(), - timestamp); + base::DoNothing(), timestamp); EXPECT_EQ(frame->layout().format(), PIXEL_FORMAT_NV12); EXPECT_EQ(frame->layout().coded_size(), coded_size); @@ -498,7 +517,7 @@ TEST(VideoFrame, WrapExternalDmabufs) { planes[i].offset = offsets[i]; planes[i].size = sizes[i]; } - auto timestamp = base::TimeDelta::FromMilliseconds(1); + auto timestamp = base::Milliseconds(1); auto layout = VideoFrameLayout::CreateWithPlanes(PIXEL_FORMAT_I420, coded_size, planes); ASSERT_TRUE(layout); @@ -558,7 +577,7 @@ TEST(VideoFrame, TextureNoLongerNeededCallbackIsCalled) { gpu::CommandBufferId::FromUnsafeValue(1), 1); { - gpu::MailboxHolder holders[media::VideoFrame::kMaxPlanes] = { + gpu::MailboxHolder holders[VideoFrame::kMaxPlanes] = { gpu::MailboxHolder(gpu::Mailbox::Generate(), gpu::SyncToken(), 5)}; scoped_refptr<VideoFrame> frame = VideoFrame::WrapNativeTextures( PIXEL_FORMAT_ARGB, holders, @@ -599,7 +618,7 @@ TEST(VideoFrame, gpu::SyncToken called_sync_token; { - gpu::MailboxHolder holders[media::VideoFrame::kMaxPlanes] = { + gpu::MailboxHolder holders[VideoFrame::kMaxPlanes] = { gpu::MailboxHolder(mailbox[VideoFrame::kYPlane], sync_token, target), gpu::MailboxHolder(mailbox[VideoFrame::kUPlane], sync_token, target), gpu::MailboxHolder(mailbox[VideoFrame::kVPlane], sync_token, target), @@ -762,9 +781,8 @@ TEST(VideoFrameMetadata, PartialMergeMetadata) { VideoFrameMetadata full_metadata = GetFullVideoFrameMetadata(); const gfx::Rect kTempRect{100, 200, 300, 400}; - const base::TimeTicks kTempTicks = - base::TimeTicks::Now() + base::TimeDelta::FromSeconds(2); - const base::TimeDelta kTempDelta = base::TimeDelta::FromMilliseconds(31415); + const base::TimeTicks kTempTicks = base::TimeTicks::Now() + base::Seconds(2); + const base::TimeDelta kTempDelta = base::Milliseconds(31415); VideoFrameMetadata partial_metadata; partial_metadata.capture_update_rect = kTempRect; diff --git a/chromium/media/base/video_thumbnail_decoder_unittest.cc b/chromium/media/base/video_thumbnail_decoder_unittest.cc index f070c07cce9..5e510bba82b 100644 --- a/chromium/media/base/video_thumbnail_decoder_unittest.cc +++ b/chromium/media/base/video_thumbnail_decoder_unittest.cc @@ -39,9 +39,10 @@ class VideoThumbnailDecoderTest : public testing::Test { auto mock_video_decoder = std::make_unique<MockVideoDecoder>(); mock_video_decoder_ = mock_video_decoder.get(); VideoDecoderConfig valid_config( - kCodecVP8, VP8PROFILE_ANY, VideoDecoderConfig::AlphaMode::kIsOpaque, - VideoColorSpace(), kNoTransformation, gfx::Size(1, 1), gfx::Rect(1, 1), - gfx::Size(1, 1), EmptyExtraData(), EncryptionScheme::kUnencrypted); + VideoCodec::kVP8, VP8PROFILE_ANY, + VideoDecoderConfig::AlphaMode::kIsOpaque, VideoColorSpace(), + kNoTransformation, gfx::Size(1, 1), gfx::Rect(1, 1), gfx::Size(1, 1), + EmptyExtraData(), EncryptionScheme::kUnencrypted); thumbnail_decoder_ = std::make_unique<VideoThumbnailDecoder>( std::move(mock_video_decoder), valid_config, std::vector<uint8_t>{0u}); diff --git a/chromium/media/base/video_util.cc b/chromium/media/base/video_util.cc index 8c8d5f4a431..ebd61ffd5a3 100644 --- a/chromium/media/base/video_util.cc +++ b/chromium/media/base/video_util.cc @@ -7,6 +7,7 @@ #include <cmath> #include "base/bind.h" +#include "base/bits.h" #include "base/callback_helpers.h" #include "base/check_op.h" #include "base/logging.h" @@ -61,202 +62,159 @@ void FillRegionOutsideVisibleRect(uint8_t* data, } } -std::pair<SkColorType, GrGLenum> GetSkiaAndGlColorTypesForPlane( - VideoPixelFormat format, - size_t plane) { - // TODO(eugene): There is some strange channel switch during RGB readback. - // When frame's pixel format matches GL and Skia color types we get reversed - // channels. But why? +VideoPixelFormat ReadbackFormat(const media::VideoFrame& frame) { + switch (frame.format()) { + case PIXEL_FORMAT_I420: + case PIXEL_FORMAT_I420A: + case PIXEL_FORMAT_I422: + case PIXEL_FORMAT_I444: + case PIXEL_FORMAT_ARGB: + case PIXEL_FORMAT_XRGB: + case PIXEL_FORMAT_ABGR: + case PIXEL_FORMAT_XBGR: + return frame.format(); + case PIXEL_FORMAT_NV12: + // |frame| may be backed by a graphics buffer that is NV12, but sampled as + // a single RGB texture. + return frame.NumTextures() == 1 ? PIXEL_FORMAT_XRGB : PIXEL_FORMAT_NV12; + default: + // Currently unsupported. + return PIXEL_FORMAT_UNKNOWN; + } +} + +// TODO(eugene): There is some strange channel switch during RGB readback. +// When frame's pixel format matches GL and Skia color types we get reversed +// channels. But why? +SkColorType SkColorTypeForPlane(VideoPixelFormat format, size_t plane) { switch (format) { + case PIXEL_FORMAT_I420: + case PIXEL_FORMAT_I420A: + case PIXEL_FORMAT_I422: + case PIXEL_FORMAT_I444: + // kGray_8_SkColorType would make more sense but doesn't work on Windows. + return kAlpha_8_SkColorType; case PIXEL_FORMAT_NV12: - if (plane == VideoFrame::kUVPlane) - return {kR8G8_unorm_SkColorType, GL_RG8_EXT}; - if (plane == VideoFrame::kYPlane) - return {kAlpha_8_SkColorType, GL_R8_EXT}; - break; + return plane == media::VideoFrame::kYPlane ? kAlpha_8_SkColorType + : kR8G8_unorm_SkColorType; case PIXEL_FORMAT_XBGR: - if (plane == VideoFrame::kARGBPlane) - return {kRGBA_8888_SkColorType, GL_RGBA8_OES}; - break; case PIXEL_FORMAT_ABGR: - if (plane == VideoFrame::kARGBPlane) - return {kRGBA_8888_SkColorType, GL_RGBA8_OES}; - break; + return kRGBA_8888_SkColorType; case PIXEL_FORMAT_XRGB: - if (plane == VideoFrame::kARGBPlane) - return {kBGRA_8888_SkColorType, GL_BGRA8_EXT}; - break; case PIXEL_FORMAT_ARGB: - if (plane == VideoFrame::kARGBPlane) - return {kBGRA_8888_SkColorType, GL_BGRA8_EXT}; - break; + return kBGRA_8888_SkColorType; default: - break; + NOTREACHED(); + return kUnknown_SkColorType; } - NOTREACHED(); - return {kUnknown_SkColorType, 0}; } -scoped_refptr<VideoFrame> ReadbackTextureBackedFrameToMemorySyncGLES( - const VideoFrame& txt_frame, - gpu::raster::RasterInterface* ri, - GrDirectContext* gr_context, - VideoFramePool* pool) { - DCHECK(gr_context); - - if (txt_frame.NumTextures() > 2 || txt_frame.NumTextures() < 1) { - DLOG(ERROR) << "Readback is not possible for this frame: " - << txt_frame.AsHumanReadableString(); - return nullptr; - } - - VideoPixelFormat result_format = txt_frame.format(); - if (txt_frame.NumTextures() == 1 && result_format == PIXEL_FORMAT_NV12) { - // Even though |txt_frame| format is NV12 and it is NV12 in GPU memory, - // the texture is a RGB view that is produced by a shader on the fly. - // So we currently we currently can only read it back as RGB. - result_format = PIXEL_FORMAT_ARGB; +GrGLenum GLFormatForPlane(VideoPixelFormat format, size_t plane) { + switch (SkColorTypeForPlane(format, plane)) { + case kAlpha_8_SkColorType: + return GL_R8_EXT; + case kR8G8_unorm_SkColorType: + return GL_RG8_EXT; + case kRGBA_8888_SkColorType: + return GL_RGBA8_OES; + case kBGRA_8888_SkColorType: + return GL_BGRA8_EXT; + default: + NOTREACHED(); + return 0; } +} - scoped_refptr<VideoFrame> result = - pool - ? pool->CreateFrame(result_format, txt_frame.coded_size(), - txt_frame.visible_rect(), - txt_frame.natural_size(), txt_frame.timestamp()) - : VideoFrame::CreateFrame( - result_format, txt_frame.coded_size(), txt_frame.visible_rect(), - txt_frame.natural_size(), txt_frame.timestamp()); - result->set_color_space(txt_frame.ColorSpace()); - result->metadata().MergeMetadataFrom(txt_frame.metadata()); - result->metadata().texture_origin_is_top_left = true; - - size_t planes = VideoFrame::NumPlanes(result->format()); - for (size_t plane = 0; plane < planes; plane++) { - const gpu::MailboxHolder& holder = txt_frame.mailbox_holder(plane); - if (holder.mailbox.IsZero()) - return nullptr; - ri->WaitSyncTokenCHROMIUM(holder.sync_token.GetConstData()); - - int width = result->columns(plane); - int height = result->rows(plane); - - auto texture_id = ri->CreateAndConsumeForGpuRaster(holder.mailbox); - if (holder.mailbox.IsSharedImage()) { - ri->BeginSharedImageAccessDirectCHROMIUM( - texture_id, GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM); - } - - auto cleanup_fn = [](GLuint texture_id, bool shared, - gpu::raster::RasterInterface* ri) { - if (shared) - ri->EndSharedImageAccessDirectCHROMIUM(texture_id); - ri->DeleteGpuRasterTexture(texture_id); - }; - base::ScopedClosureRunner cleanup(base::BindOnce( - cleanup_fn, texture_id, holder.mailbox.IsSharedImage(), ri)); - - GrGLenum texture_format; - SkColorType sk_color_type; - std::tie(sk_color_type, texture_format) = - GetSkiaAndGlColorTypesForPlane(result->format(), plane); - GrGLTextureInfo gl_texture_info; - gl_texture_info.fID = texture_id; - gl_texture_info.fTarget = holder.texture_target; - gl_texture_info.fFormat = texture_format; - - GrBackendTexture texture(width, height, GrMipMapped::kNo, gl_texture_info); - auto image = SkImage::MakeFromTexture( - gr_context, texture, - txt_frame.metadata().texture_origin_is_top_left - ? kTopLeft_GrSurfaceOrigin - : kBottomLeft_GrSurfaceOrigin, - sk_color_type, kOpaque_SkAlphaType, /*colorSpace=*/nullptr); - - if (!image) { - DLOG(ERROR) << "Can't create SkImage from texture!" - << " plane:" << plane; - return nullptr; - } +bool ReadbackTexturePlaneToMemorySyncSkImage(const VideoFrame& src_frame, + size_t src_plane, + gfx::Rect& src_rect, + uint8_t* dest_pixels, + size_t dest_stride, + gpu::raster::RasterInterface* ri, + GrDirectContext* gr_context) { + DCHECK(gr_context); - auto info = - SkImageInfo::Make(width, height, sk_color_type, kOpaque_SkAlphaType); - SkPixmap pixmap(info, result->data(plane), result->row_bytes(plane)); - if (!image->readPixels(gr_context, pixmap, 0, 0, - SkImage::kDisallow_CachingHint)) { - DLOG(ERROR) << "Plane readback failed." - << " plane:" << plane << " width: " << width - << " height: " << height - << " minRowBytes: " << info.minRowBytes(); - return nullptr; - } + VideoPixelFormat format = ReadbackFormat(src_frame); + int width = src_frame.columns(src_plane); + int height = src_frame.rows(src_plane); + bool has_alpha = !IsOpaque(format) && src_frame.NumTextures() == 1; + + const gpu::MailboxHolder& holder = src_frame.mailbox_holder(src_plane); + DCHECK(!holder.mailbox.IsZero()); + ri->WaitSyncTokenCHROMIUM(holder.sync_token.GetConstData()); + auto texture_id = ri->CreateAndConsumeForGpuRaster(holder.mailbox); + if (holder.mailbox.IsSharedImage()) { + ri->BeginSharedImageAccessDirectCHROMIUM( + texture_id, GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM); } - - return result; -} - -scoped_refptr<VideoFrame> ReadbackTextureBackedFrameToMemorySyncOOP( - const VideoFrame& txt_frame, - gpu::raster::RasterInterface* ri, - VideoFramePool* pool) { - if (txt_frame.NumTextures() > 2 || txt_frame.NumTextures() < 1) { - DLOG(ERROR) << "Readback is not possible for this frame: " - << txt_frame.AsHumanReadableString(); - return nullptr; + base::ScopedClosureRunner cleanup(base::BindOnce( + [](GLuint texture_id, bool shared, gpu::raster::RasterInterface* ri) { + if (shared) + ri->EndSharedImageAccessDirectCHROMIUM(texture_id); + ri->DeleteGpuRasterTexture(texture_id); + }, + texture_id, holder.mailbox.IsSharedImage(), ri)); + + GrGLenum texture_format = GLFormatForPlane(format, src_plane); + SkColorType sk_color_type = SkColorTypeForPlane(format, src_plane); + SkAlphaType sk_alpha_type = + has_alpha ? kUnpremul_SkAlphaType : kOpaque_SkAlphaType; + + GrGLTextureInfo gl_texture_info; + gl_texture_info.fID = texture_id; + gl_texture_info.fTarget = holder.texture_target; + gl_texture_info.fFormat = texture_format; + GrBackendTexture texture(width, height, GrMipMapped::kNo, gl_texture_info); + + auto image = + SkImage::MakeFromTexture(gr_context, texture, + src_frame.metadata().texture_origin_is_top_left + ? kTopLeft_GrSurfaceOrigin + : kBottomLeft_GrSurfaceOrigin, + sk_color_type, sk_alpha_type, + /*colorSpace=*/nullptr); + if (!image) { + DLOG(ERROR) << "Can't create SkImage from texture plane " << src_plane; + return false; } - VideoPixelFormat result_format = txt_frame.format(); - if (txt_frame.NumTextures() == 1 && result_format == PIXEL_FORMAT_NV12) { - // Even though |txt_frame| format is NV12 and it is NV12 in GPU memory, - // the texture is a RGB view that is produced by a shader on the fly. - // So we currently we currently can only read it back as RGB. - result_format = PIXEL_FORMAT_ARGB; + auto dest_info = SkImageInfo::Make(src_rect.width(), src_rect.height(), + sk_color_type, sk_alpha_type); + SkPixmap dest_pixmap(dest_info, dest_pixels, dest_stride); + if (!image->readPixels(gr_context, dest_pixmap, src_rect.x(), src_rect.y(), + SkImage::kDisallow_CachingHint)) { + DLOG(ERROR) << "Plane readback failed." + << " plane:" << src_plane << " width: " << width + << " height: " << height; + return false; } - scoped_refptr<VideoFrame> result = - pool - ? pool->CreateFrame(result_format, txt_frame.coded_size(), - txt_frame.visible_rect(), - txt_frame.natural_size(), txt_frame.timestamp()) - : VideoFrame::CreateFrame( - result_format, txt_frame.coded_size(), txt_frame.visible_rect(), - txt_frame.natural_size(), txt_frame.timestamp()); - result->set_color_space(txt_frame.ColorSpace()); - result->metadata().MergeMetadataFrom(txt_frame.metadata()); - - size_t planes = VideoFrame::NumPlanes(result->format()); - for (size_t plane = 0; plane < planes; plane++) { - const gpu::MailboxHolder& holder = txt_frame.mailbox_holder(plane); - if (holder.mailbox.IsZero()) { - DLOG(ERROR) << "Can't readback video frame with Zero texture on plane " - << plane; - return nullptr; - } - ri->WaitSyncTokenCHROMIUM(holder.sync_token.GetConstData()); - - int width = result->columns(plane); - int height = result->rows(plane); - - GrGLenum texture_format; - SkColorType sk_color_type; - std::tie(sk_color_type, texture_format) = - GetSkiaAndGlColorTypesForPlane(result->format(), plane); - - auto info = - SkImageInfo::Make(width, height, sk_color_type, kOpaque_SkAlphaType); - - ri->ReadbackImagePixels(holder.mailbox, info, info.minRowBytes(), 0, 0, - result->data(plane)); - if (ri->GetError() != GL_NO_ERROR) { - DLOG(ERROR) << "Plane readback failed." - << " plane:" << plane << " width: " << width - << " height: " << height - << " minRowBytes: " << info.minRowBytes() - << " error: " << ri->GetError(); - return nullptr; - } - } + return true; +} - return result; +bool ReadbackTexturePlaneToMemorySyncOOP(const VideoFrame& src_frame, + size_t src_plane, + gfx::Rect& src_rect, + uint8_t* dest_pixels, + size_t dest_stride, + gpu::raster::RasterInterface* ri) { + VideoPixelFormat format = ReadbackFormat(src_frame); + bool has_alpha = !IsOpaque(format) && src_frame.NumTextures() == 1; + + const gpu::MailboxHolder& holder = src_frame.mailbox_holder(src_plane); + DCHECK(!holder.mailbox.IsZero()); + ri->WaitSyncTokenCHROMIUM(holder.sync_token.GetConstData()); + + SkColorType sk_color_type = SkColorTypeForPlane(format, src_plane); + SkAlphaType sk_alpha_type = + has_alpha ? kUnpremul_SkAlphaType : kOpaque_SkAlphaType; + + auto info = SkImageInfo::Make(src_rect.width(), src_rect.height(), + sk_color_type, sk_alpha_type); + ri->ReadbackImagePixels(holder.mailbox, info, dest_stride, src_rect.x(), + src_rect.y(), dest_pixels); + DCHECK_EQ(ri->GetError(), static_cast<GLenum>(GL_NO_ERROR)); + return true; } } // namespace @@ -556,6 +514,28 @@ gfx::Size ScaleSizeToEncompassTarget(const gfx::Size& size, return ScaleSizeToTarget(size, target, false); } +gfx::Rect CropSizeForScalingToTarget(const gfx::Size& size, + const gfx::Size& target, + size_t alignment) { + DCHECK_GT(alignment, 0u); + if (size.IsEmpty() || target.IsEmpty()) + return gfx::Rect(); + + gfx::Rect crop(ScaleSizeToFitWithinTarget(target, size)); + crop.set_width(base::checked_cast<int>(base::bits::AlignDown( + base::checked_cast<size_t>(crop.width()), alignment))); + crop.set_height(base::checked_cast<int>(base::bits::AlignDown( + base::checked_cast<size_t>(crop.height()), alignment))); + crop.set_x(base::checked_cast<int>(base::bits::AlignDown( + base::checked_cast<size_t>((size.width() - crop.width()) / 2), + alignment))); + crop.set_y(base::checked_cast<int>(base::bits::AlignDown( + base::checked_cast<size_t>((size.height() - crop.height()) / 2), + alignment))); + DCHECK(gfx::Rect(size).Contains(crop)); + return crop; +} + gfx::Size GetRectSizeFromOrigin(const gfx::Rect& rect) { return gfx::Size(rect.right(), rect.bottom()); } @@ -676,11 +656,53 @@ scoped_refptr<VideoFrame> ReadbackTextureBackedFrameToMemorySync( VideoFramePool* pool) { DCHECK(ri); + VideoPixelFormat format = ReadbackFormat(txt_frame); + if (format == PIXEL_FORMAT_UNKNOWN) { + DLOG(ERROR) << "Readback is not possible for this frame: " + << txt_frame.AsHumanReadableString(); + return nullptr; + } + + scoped_refptr<VideoFrame> result = + pool ? pool->CreateFrame(format, txt_frame.coded_size(), + txt_frame.visible_rect(), + txt_frame.natural_size(), txt_frame.timestamp()) + : VideoFrame::CreateFrame( + format, txt_frame.coded_size(), txt_frame.visible_rect(), + txt_frame.natural_size(), txt_frame.timestamp()); + result->set_color_space(txt_frame.ColorSpace()); + result->metadata().MergeMetadataFrom(txt_frame.metadata()); + + size_t planes = VideoFrame::NumPlanes(format); + for (size_t plane = 0; plane < planes; plane++) { + gfx::Rect src_rect(0, 0, txt_frame.columns(plane), txt_frame.rows(plane)); + if (!ReadbackTexturePlaneToMemorySync( + txt_frame, plane, src_rect, result->data(plane), + result->stride(plane), ri, gr_context)) { + return nullptr; + } + } + + return result; +} + +bool ReadbackTexturePlaneToMemorySync(const VideoFrame& src_frame, + size_t src_plane, + gfx::Rect& src_rect, + uint8_t* dest_pixels, + size_t dest_stride, + gpu::raster::RasterInterface* ri, + GrDirectContext* gr_context) { + DCHECK(ri); + if (gr_context) { - return ReadbackTextureBackedFrameToMemorySyncGLES(txt_frame, ri, gr_context, - pool); + return ReadbackTexturePlaneToMemorySyncSkImage(src_frame, src_plane, + src_rect, dest_pixels, + dest_stride, ri, gr_context); } - return ReadbackTextureBackedFrameToMemorySyncOOP(txt_frame, ri, pool); + + return ReadbackTexturePlaneToMemorySyncOOP(src_frame, src_plane, src_rect, + dest_pixels, dest_stride, ri); } Status ConvertAndScaleFrame(const VideoFrame& src_frame, @@ -958,8 +980,8 @@ scoped_refptr<VideoFrame> CreateFromSkImage(sk_sp<SkImage> sk_image, if (!frame) return nullptr; - frame->AddDestructionObserver(base::BindOnce( - base::DoNothing::Once<sk_sp<SkImage>>(), std::move(sk_image))); + frame->AddDestructionObserver( + base::BindOnce([](sk_sp<SkImage>) {}, std::move(sk_image))); return frame; } diff --git a/chromium/media/base/video_util.h b/chromium/media/base/video_util.h index c19b5b16b3b..87ecadd658d 100644 --- a/chromium/media/base/video_util.h +++ b/chromium/media/base/video_util.h @@ -101,6 +101,16 @@ MEDIA_EXPORT gfx::Size ScaleSizeToFitWithinTarget(const gfx::Size& size, MEDIA_EXPORT gfx::Size ScaleSizeToEncompassTarget(const gfx::Size& size, const gfx::Size& target); +// Calculates the largest sub-rectangle of a rectangle of size |size| with +// roughly the same aspect ratio as |target| and centered both horizontally +// and vertically within the rectangle. It's "roughly" the same aspect ratio +// because its dimensions may be rounded down to be a multiple of |alignment|. +// The origin of the rectangle is also aligned down to a multiple of +// |alignment|. Note that |alignment| must be a power of 2. +MEDIA_EXPORT gfx::Rect CropSizeForScalingToTarget(const gfx::Size& size, + const gfx::Size& target, + size_t alignment = 1u); + // Returns the size of a rectangle whose upper left corner is at the origin (0, // 0) and whose bottom right corner is the same as that of |rect|. This is // useful to get the size of a buffer that contains the visible rectangle plus @@ -143,6 +153,17 @@ MEDIA_EXPORT scoped_refptr<VideoFrame> ReadbackTextureBackedFrameToMemorySync( GrDirectContext* gr_context, VideoFramePool* pool = nullptr); +// Synchronously reads a single plane. |src_rect| is relative to the plane, +// which may be smaller than |frame| due to subsampling. +MEDIA_EXPORT bool ReadbackTexturePlaneToMemorySync( + const VideoFrame& src_frame, + size_t src_plane, + gfx::Rect& src_rect, + uint8_t* dest_pixels, + size_t dest_stride, + gpu::raster::RasterInterface* ri, + GrDirectContext* gr_context); + // Converts a frame with I420A format into I420 by dropping alpha channel. MEDIA_EXPORT scoped_refptr<VideoFrame> WrapAsI420VideoFrame( scoped_refptr<VideoFrame> frame); diff --git a/chromium/media/base/video_util_unittest.cc b/chromium/media/base/video_util_unittest.cc index dc3273851c6..e82e3caccbd 100644 --- a/chromium/media/base/video_util_unittest.cc +++ b/chromium/media/base/video_util_unittest.cc @@ -430,6 +430,44 @@ TEST_F(VideoUtilTest, ScaleSizeToEncompassTarget) { gfx::Size(0, 0), gfx::Size(2000000000, 2000000000)).IsEmpty()); } +TEST_F(VideoUtilTest, CropSizeForScalingToTarget) { + // Test same aspect ratios. + EXPECT_EQ(gfx::Rect(0, 0, 640, 360), + CropSizeForScalingToTarget(gfx::Size(640, 360), gfx::Size(16, 9))); + EXPECT_EQ(gfx::Rect(0, 0, 320, 240), + CropSizeForScalingToTarget(gfx::Size(320, 240), gfx::Size(4, 3))); + EXPECT_EQ( + gfx::Rect(0, 0, 320, 240), + CropSizeForScalingToTarget(gfx::Size(321, 241), gfx::Size(4, 3), 2)); + + // Test cropping 4:3 from 16:9. + EXPECT_EQ(gfx::Rect(80, 0, 480, 360), + CropSizeForScalingToTarget(gfx::Size(640, 360), gfx::Size(4, 3))); + EXPECT_EQ(gfx::Rect(53, 0, 320, 240), + CropSizeForScalingToTarget(gfx::Size(426, 240), gfx::Size(4, 3))); + EXPECT_EQ( + gfx::Rect(52, 0, 320, 240), + CropSizeForScalingToTarget(gfx::Size(426, 240), gfx::Size(4, 3), 2)); + + // Test cropping 16:9 from 4:3. + EXPECT_EQ(gfx::Rect(0, 30, 320, 180), + CropSizeForScalingToTarget(gfx::Size(320, 240), gfx::Size(16, 9))); + EXPECT_EQ(gfx::Rect(0, 9, 96, 54), + CropSizeForScalingToTarget(gfx::Size(96, 72), gfx::Size(16, 9))); + EXPECT_EQ(gfx::Rect(0, 8, 96, 54), + CropSizeForScalingToTarget(gfx::Size(96, 72), gfx::Size(16, 9), 2)); + + // Test abnormal inputs. + EXPECT_EQ(gfx::Rect(), + CropSizeForScalingToTarget(gfx::Size(0, 1), gfx::Size(1, 1))); + EXPECT_EQ(gfx::Rect(), + CropSizeForScalingToTarget(gfx::Size(1, 0), gfx::Size(1, 1))); + EXPECT_EQ(gfx::Rect(), + CropSizeForScalingToTarget(gfx::Size(1, 1), gfx::Size(0, 1))); + EXPECT_EQ(gfx::Rect(), + CropSizeForScalingToTarget(gfx::Size(1, 1), gfx::Size(1, 0))); +} + TEST_F(VideoUtilTest, PadToMatchAspectRatio) { EXPECT_EQ(gfx::Size(640, 480), PadToMatchAspectRatio(gfx::Size(640, 480), gfx::Size(640, 480))); @@ -525,9 +563,8 @@ TEST_F(VideoUtilTest, I420CopyWithPadding) { TEST_F(VideoUtilTest, WrapAsI420VideoFrame) { gfx::Size size(640, 480); - scoped_refptr<VideoFrame> src_frame = - VideoFrame::CreateFrame(PIXEL_FORMAT_I420A, size, gfx::Rect(size), size, - base::TimeDelta::FromDays(1)); + scoped_refptr<VideoFrame> src_frame = VideoFrame::CreateFrame( + PIXEL_FORMAT_I420A, size, gfx::Rect(size), size, base::Days(1)); scoped_refptr<VideoFrame> dst_frame = WrapAsI420VideoFrame(src_frame); EXPECT_EQ(dst_frame->format(), PIXEL_FORMAT_I420); diff --git a/chromium/media/base/wall_clock_time_source.cc b/chromium/media/base/wall_clock_time_source.cc index 9ddf51eb1af..cdfcc687993 100644 --- a/chromium/media/base/wall_clock_time_source.cc +++ b/chromium/media/base/wall_clock_time_source.cc @@ -94,8 +94,8 @@ base::TimeDelta WallClockTimeSource::CurrentMediaTime_Locked() { base::TimeTicks now = tick_clock_->NowTicks(); return base_timestamp_ + - base::TimeDelta::FromMicroseconds( - (now - reference_time_).InMicroseconds() * playback_rate_); + base::Microseconds((now - reference_time_).InMicroseconds() * + playback_rate_); } } // namespace media diff --git a/chromium/media/base/wall_clock_time_source.h b/chromium/media/base/wall_clock_time_source.h index 028c3522138..17d76a4e097 100644 --- a/chromium/media/base/wall_clock_time_source.h +++ b/chromium/media/base/wall_clock_time_source.h @@ -18,6 +18,10 @@ namespace media { class MEDIA_EXPORT WallClockTimeSource : public TimeSource { public: WallClockTimeSource(); + + WallClockTimeSource(const WallClockTimeSource&) = delete; + WallClockTimeSource& operator=(const WallClockTimeSource&) = delete; + ~WallClockTimeSource() override; // TimeSource implementation. @@ -50,8 +54,6 @@ class MEDIA_EXPORT WallClockTimeSource : public TimeSource { // TODO(scherkus): Remove internal locking from this class after access to // Renderer::CurrentMediaTime() is single threaded http://crbug.com/370634 base::Lock lock_; - - DISALLOW_COPY_AND_ASSIGN(WallClockTimeSource); }; } // namespace media diff --git a/chromium/media/base/wall_clock_time_source_unittest.cc b/chromium/media/base/wall_clock_time_source_unittest.cc index 49b6134c5a7..b643a6a7b2d 100644 --- a/chromium/media/base/wall_clock_time_source_unittest.cc +++ b/chromium/media/base/wall_clock_time_source_unittest.cc @@ -17,10 +17,14 @@ class WallClockTimeSourceTest : public testing::Test { time_source_.SetTickClockForTesting(tick_clock_.get()); AdvanceTimeInSeconds(1); } + + WallClockTimeSourceTest(const WallClockTimeSourceTest&) = delete; + WallClockTimeSourceTest& operator=(const WallClockTimeSourceTest&) = delete; + ~WallClockTimeSourceTest() override = default; void AdvanceTimeInSeconds(int seconds) { - tick_clock_->Advance(base::TimeDelta::FromSeconds(seconds)); + tick_clock_->Advance(base::Seconds(seconds)); } int CurrentMediaTimeInSeconds() { @@ -28,7 +32,7 @@ class WallClockTimeSourceTest : public testing::Test { } void SetMediaTimeInSeconds(int seconds) { - return time_source_.SetMediaTime(base::TimeDelta::FromSeconds(seconds)); + return time_source_.SetMediaTime(base::Seconds(seconds)); } base::TimeTicks ConvertMediaTime(base::TimeDelta timestamp, @@ -42,22 +46,19 @@ class WallClockTimeSourceTest : public testing::Test { bool IsWallClockNowForMediaTimeInSeconds(int seconds) { bool is_time_moving = false; return tick_clock_->NowTicks() == - ConvertMediaTime(base::TimeDelta::FromSeconds(seconds), - &is_time_moving); + ConvertMediaTime(base::Seconds(seconds), &is_time_moving); } bool IsTimeStopped() { bool is_time_moving = false; // Convert any random value, it shouldn't matter for this call. - ConvertMediaTime(base::TimeDelta::FromSeconds(1), &is_time_moving); + ConvertMediaTime(base::Seconds(1), &is_time_moving); return !is_time_moving; } protected: WallClockTimeSource time_source_; std::unique_ptr<base::SimpleTestTickClock> tick_clock_; - - DISALLOW_COPY_AND_ASSIGN(WallClockTimeSourceTest); }; TEST_F(WallClockTimeSourceTest, InitialTimeIsZero) { @@ -130,7 +131,7 @@ TEST_F(WallClockTimeSourceTest, StopTicking) { } TEST_F(WallClockTimeSourceTest, ConvertsTimestampsWhenStopped) { - const base::TimeDelta kOneSecond = base::TimeDelta::FromSeconds(1); + const base::TimeDelta kOneSecond = base::Seconds(1); bool is_time_moving = false; EXPECT_EQ(base::TimeTicks(), ConvertMediaTime(base::TimeDelta(), &is_time_moving)); diff --git a/chromium/media/base/win/d3d11_mocks.cc b/chromium/media/base/win/d3d11_mocks.cc index 41853a4fa24..326fe4bde33 100644 --- a/chromium/media/base/win/d3d11_mocks.cc +++ b/chromium/media/base/win/d3d11_mocks.cc @@ -9,6 +9,9 @@ namespace media { D3D11Texture2DMock::D3D11Texture2DMock() = default; D3D11Texture2DMock::~D3D11Texture2DMock() = default; +D3D11MultithreadMock::D3D11MultithreadMock() = default; +D3D11MultithreadMock::~D3D11MultithreadMock() = default; + D3D11BufferMock::D3D11BufferMock() = default; D3D11BufferMock::~D3D11BufferMock() = default; diff --git a/chromium/media/base/win/d3d11_mocks.h b/chromium/media/base/win/d3d11_mocks.h index d2ad6b8b426..91c611913fe 100644 --- a/chromium/media/base/win/d3d11_mocks.h +++ b/chromium/media/base/win/d3d11_mocks.h @@ -34,6 +34,19 @@ class D3D11Texture2DMock MOCK_STDCALL_METHOD1(GetDesc, void(D3D11_TEXTURE2D_DESC*)); }; +class D3D11MultithreadMock + : public Microsoft::WRL::RuntimeClass< + Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::ClassicCom>, + ID3D11Multithread> { + public: + D3D11MultithreadMock(); + ~D3D11MultithreadMock() override; + MOCK_STDCALL_METHOD0(Enter, void()); + MOCK_STDCALL_METHOD0(GetMultithreadProtected, BOOL()); + MOCK_STDCALL_METHOD0(Leave, void()); + MOCK_STDCALL_METHOD1(SetMultithreadProtected, BOOL(BOOL)); +}; + class D3D11BufferMock : public Microsoft::WRL::RuntimeClass< Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::ClassicCom>, diff --git a/chromium/media/base/win/dcomp_texture_wrapper.h b/chromium/media/base/win/dcomp_texture_wrapper.h index abb45dd5ebc..f14b39c46e2 100644 --- a/chromium/media/base/win/dcomp_texture_wrapper.h +++ b/chromium/media/base/win/dcomp_texture_wrapper.h @@ -23,26 +23,25 @@ class DCOMPTextureWrapper { public: virtual ~DCOMPTextureWrapper() = default; - // Initializes the DCOMPTexture and returns success/failure in `init_cb`. - // TODO(xhwang): Pass `DCOMPSurfaceHandleBoundCB` in `SetDCOMPSurface()`. - using DCOMPSurfaceHandleBoundCB = base::OnceCallback<void(bool)>; - using CompositionParamsReceivedCB = base::RepeatingCallback<void(gfx::Rect)>; - using InitCB = base::OnceCallback<void(bool)>; - virtual void Initialize(const gfx::Size& natural_size, - DCOMPSurfaceHandleBoundCB dcomp_handle_bound_cb, - CompositionParamsReceivedCB comp_params_received_cb, - InitCB init_cb) = 0; - - // Called whenever the video's natural size changes. - virtual void UpdateTextureSize(const gfx::Size& natural_size) = 0; - - // Sets the DirectComposition surface identified by `surface_token`. - virtual void SetDCOMPSurface(const base::UnguessableToken& surface_token) = 0; + // Initializes the DCOMPTexture and returns success/failure. + using OutputRectChangeCB = base::RepeatingCallback<void(gfx::Rect)>; + virtual bool Initialize(const gfx::Size& output_size, + OutputRectChangeCB output_rect_change_cb) = 0; + + // Called whenever the video's output size changes. + virtual void UpdateTextureSize(const gfx::Size& output_size) = 0; + + // Sets the DirectComposition surface identified by `token`. + using SetDCOMPSurfaceHandleCB = base::OnceCallback<void(bool)>; + virtual void SetDCOMPSurfaceHandle( + const base::UnguessableToken& token, + SetDCOMPSurfaceHandleCB set_dcomp_surface_handle_cb) = 0; // Creates VideoFrame which will be returned in `create_video_frame_cb`. using CreateVideoFrameCB = base::OnceCallback<void(scoped_refptr<VideoFrame>)>; - virtual void CreateVideoFrame(CreateVideoFrameCB create_video_frame_cb) = 0; + virtual void CreateVideoFrame(const gfx::Size& natural_size, + CreateVideoFrameCB create_video_frame_cb) = 0; }; } // namespace media diff --git a/chromium/media/base/win/dxgi_device_manager.cc b/chromium/media/base/win/dxgi_device_manager.cc index 33226904288..921669b1c8c 100644 --- a/chromium/media/base/win/dxgi_device_manager.cc +++ b/chromium/media/base/win/dxgi_device_manager.cc @@ -95,6 +95,8 @@ HRESULT DXGIDeviceManager::ResetDevice() { kDeviceFlags, nullptr, 0, D3D11_SDK_VERSION, &d3d_device, nullptr, nullptr); RETURN_ON_HR_FAILURE(hr, "D3D11 device creation failed", hr); + RETURN_ON_HR_FAILURE( + hr, media::SetDebugName(d3d_device.Get(), "Media_DXGIDeviceManager"), hr); // Since FrameServerClient background threads in the video capture process // call EnqueueSetEvent on Chromium's D3D11 device at the same time that // Chromium is actively using it in a worker thread, we need to protect access diff --git a/chromium/media/base/win/mf_helpers.cc b/chromium/media/base/win/mf_helpers.cc index 37cf1183709..be610b58562 100644 --- a/chromium/media/base/win/mf_helpers.cc +++ b/chromium/media/base/win/mf_helpers.cc @@ -10,6 +10,18 @@ namespace media { +namespace { + +// ID3D11DeviceChild, IDXGIObject and ID3D11Device implement SetPrivateData with +// the exact same parameters. +template <typename T> +HRESULT SetDebugNameInternal(T* d3d11_object, const char* debug_string) { + return d3d11_object->SetPrivateData(WKPDID_D3DDebugObjectName, + strlen(debug_string), debug_string); +} + +} // namespace + Microsoft::WRL::ComPtr<IMFSample> CreateEmptySampleWithBuffer( uint32_t buffer_length, int align) { @@ -70,8 +82,15 @@ HRESULT CopyCoTaskMemWideString(LPCWSTR in_string, LPWSTR* out_string) { HRESULT SetDebugName(ID3D11DeviceChild* d3d11_device_child, const char* debug_string) { - return d3d11_device_child->SetPrivateData(WKPDID_D3DDebugObjectName, - strlen(debug_string), debug_string); + return SetDebugNameInternal(d3d11_device_child, debug_string); +} + +HRESULT SetDebugName(ID3D11Device* d3d11_device, const char* debug_string) { + return SetDebugNameInternal(d3d11_device, debug_string); +} + +HRESULT SetDebugName(IDXGIObject* dxgi_object, const char* debug_string) { + return SetDebugNameInternal(dxgi_object, debug_string); } } // namespace media diff --git a/chromium/media/base/win/mf_helpers.h b/chromium/media/base/win/mf_helpers.h index 6bebf0310f5..3fd615fdac9 100644 --- a/chromium/media/base/win/mf_helpers.h +++ b/chromium/media/base/win/mf_helpers.h @@ -14,6 +14,8 @@ #include "media/base/win/mf_initializer_export.h" struct ID3D11DeviceChild; +struct ID3D11Device; +struct IDXGIObject; namespace media { @@ -60,6 +62,10 @@ CreateEmptySampleWithBuffer(uint32_t buffer_length, int align); class MF_INITIALIZER_EXPORT MediaBufferScopedPointer { public: explicit MediaBufferScopedPointer(IMFMediaBuffer* media_buffer); + + MediaBufferScopedPointer(const MediaBufferScopedPointer&) = delete; + MediaBufferScopedPointer& operator=(const MediaBufferScopedPointer&) = delete; + ~MediaBufferScopedPointer(); uint8_t* get() { return buffer_; } @@ -71,8 +77,6 @@ class MF_INITIALIZER_EXPORT MediaBufferScopedPointer { uint8_t* buffer_; DWORD max_length_; DWORD current_length_; - - DISALLOW_COPY_AND_ASSIGN(MediaBufferScopedPointer); }; // Copies |in_string| to |out_string| that is allocated with CoTaskMemAlloc(). @@ -83,6 +87,11 @@ MF_INITIALIZER_EXPORT HRESULT CopyCoTaskMemWideString(LPCWSTR in_string, // D3D11 retains the string passed to this function. MF_INITIALIZER_EXPORT HRESULT SetDebugName(ID3D11DeviceChild* d3d11_device_child, const char* debug_string); +MF_INITIALIZER_EXPORT HRESULT SetDebugName(ID3D11Device* d3d11_device, + const char* debug_string); +MF_INITIALIZER_EXPORT HRESULT SetDebugName(IDXGIObject* dxgi_object, + const char* debug_string); + } // namespace media #endif // MEDIA_BASE_WIN_MF_HELPERS_H_ |