下载代码,调试方法等见Chromium视频播放相关调试记录_bberdong的博客-优快云博客
硬解流程
GPU进程
MediaService::CreateInterfaceFactory,然后创建了InterfaceFactoryImpl。
创建解码器
- gpu进程收到了一个message创建了一个MojoVideoDecoderService出来
源码路径: media/mojo/services/interface_factory_impl.cc
void InterfaceFactoryImpl::CreateVideoDecoder(
mojo::PendingReceiver<mojom::VideoDecoder> receiver,
mojo::PendingRemote<media::stable::mojom::StableVideoDecoder>
dst_video_decoder) {
DVLOG(2) << __func__;
#if BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
video_decoder_receivers_.Add(std::make_unique<MojoVideoDecoderService>(
mojo_media_client_, &cdm_service_context_,
std::move(dst_video_decoder)),
std::move(receiver));
#endif // BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
}
- MojoVideoDecoderService创建了一个platform video decoder。咱们这里是VadVideoDecoder
源码路径: media/mojo/services/mojo_video_decoder_service.cc
void MojoVideoDecoderService::Construct(...
{
...
decoder_ = mojo_media_client_->CreateVideoDecoder(...)
...
}
// decoder_定义
std::unique_ptr<media::VideoDecoder> decoder_;
// mojo_media_client_定义
// Decoder factory.
raw_ptr<MojoMediaClient> mojo_media_client_;
而GpuMojoMediaClient继承自MojoMediaClient
std::unique_ptr<VideoDecoder> GpuMojoMediaClient::CreateVideoDecoder(...
{
...
return CreatePlatformVideoDecoder(traits);
...
}
调用的CreatePlatformVideoDecoder方法在另外一个文件里
源码路径: media/mojo/services/gpu_mojo_media_client_cros.cc
std::unique_ptr<VideoDecoder> CreatePlatformVideoDecoder(
const VideoDecoderTraits& traits) {
switch (GetActualPlatformDecoderImplementation(traits.gpu_preferences,
traits.gpu_info)) {
case VideoDecoderType::kVaapi:
case VideoDecoderType::kV4L2: {
auto frame_pool = std::make_unique<PlatformVideoFramePool>(
traits.gpu_memory_buffer_factory);
auto frame_converter