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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_RENDERER_MEDIA_RENDER_MEDIA_CLIENT_H_
#define CONTENT_RENDERER_MEDIA_RENDER_MEDIA_CLIENT_H_
#include <vector>
#include "base/synchronization/waitable_event.h"
#include "media/base/audio_parameters.h"
#include "media/base/decoder.h"
#include "media/base/key_systems_support_registration.h"
#include "media/base/media_client.h"
#include "media/base/supported_audio_decoder_config.h"
#include "media/base/supported_video_decoder_config.h"
#include "media/mojo/mojom/audio_decoder.mojom.h"
#include "media/mojo/mojom/interface_factory.mojom.h"
#include "media/mojo/mojom/video_decoder.mojom.h"
#include "media/mojo/mojom/video_encode_accelerator.mojom.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/bindings/shared_remote.h"
#include "services/viz/public/mojom/gpu.mojom.h"
namespace content {
// RenderMediaClient is purely plumbing to make content embedder customizations
// visible to the lower media layer.
class RenderMediaClient : public media::MediaClient {
public:
RenderMediaClient(const RenderMediaClient&) = delete;
RenderMediaClient& operator=(const RenderMediaClient&) = delete;
// Initialize RenderMediaClient and SetMediaClient(). Note that the instance
// is not exposed because no content code needs to directly access it.
static void Initialize();
// MediaClient implementation.
bool IsDecoderSupportedAudioType(const media::AudioType& type) final;
bool IsDecoderSupportedVideoType(const media::VideoType& type) final;
bool IsEncoderSupportedVideoType(const media::VideoType& type) final;
bool IsSupportedBitstreamAudioCodec(media::AudioCodec codec) final;
std::optional<::media::AudioRendererAlgorithmParameters>
GetAudioRendererAlgorithmParameters(
media::AudioParameters audio_parameters) final;
media::ExternalMemoryAllocator* GetMediaAllocator() final;
private:
RenderMediaClient();
~RenderMediaClient() override;
void GetSupportedVideoEncoderConfigs();
void OnInterfaceFactoryDisconnected();
void OnGpuDisconnected();
void OnAudioDecoderDisconnected();
void OnVideoDecoderDisconnected();
void OnVideoEncoderDisconnected();
void OnGetSupportedAudioDecoderConfigs(
const media::SupportedAudioDecoderConfigs& configs);
void OnGetSupportedVideoDecoderConfigs(
const media::SupportedVideoDecoderConfigs& configs,
media::VideoDecoderType type);
void OnGetSupportedVideoEncoderConfigs(
const media::VideoEncodeAccelerator::SupportedProfiles& configs);
const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
SEQUENCE_CHECKER(main_thread_sequence_checker_);
// Used to indicate if optional video profile support information has been
// retrieved from the |video_decoder_for_supported_profiles_|. May be waited
// upon by any thread but the RenderThread since it's always signaled from the
// RenderThread.
[[maybe_unused]] base::WaitableEvent did_video_decoder_update_;
// Used to indicate if optional audio codec support information has been
// retrieved from the MojoAudioDecoder. May be waited upon by any thread but
// the RenderThread since it's always signaled from the RenderThread.
[[maybe_unused]] base::WaitableEvent did_audio_decoder_update_;
// Used to indicate if optional video profile support information has been
// retrieved from the |video_encoder_for_supported_profiles_|.
[[maybe_unused]] bool did_video_encoder_update_ = false;
[[maybe_unused]] mojo::Remote<media::mojom::InterfaceFactory>
interface_factory_for_supported_profiles_
GUARDED_BY_CONTEXT(main_thread_sequence_checker_);
[[maybe_unused]] mojo::Remote<viz::mojom::Gpu> gpu_for_supported_profiles_
GUARDED_BY_CONTEXT(main_thread_sequence_checker_);
[[maybe_unused]] mojo::SharedRemote<media::mojom::VideoDecoder>
video_decoder_for_supported_profiles_
GUARDED_BY_CONTEXT(main_thread_sequence_checker_);
[[maybe_unused]] mojo::SharedRemote<media::mojom::AudioDecoder>
audio_decoder_for_supported_configs_
GUARDED_BY_CONTEXT(main_thread_sequence_checker_);
[[maybe_unused]] mojo::SharedRemote<
media::mojom::VideoEncodeAcceleratorProvider>
video_encoder_for_supported_profiles_
GUARDED_BY_CONTEXT(main_thread_sequence_checker_);
};
} // namespace content
#endif // CONTENT_RENDERER_MEDIA_RENDER_MEDIA_CLIENT_H_
|