rtc_video_decoder_factory.cc revision bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3
1e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o// Copyright 2013 The Chromium Authors. All rights reserved. 2e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o// Use of this source code is governed by a BSD-style license that can be 3e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o// found in the LICENSE file. 4e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 550b380b4d4ab668bad45033e3a8aaf93c7f42844Theodore Ts'o#include "content/renderer/media/rtc_video_decoder_factory.h" 6e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 7e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include "base/location.h" 8e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include "base/memory/scoped_ptr.h" 9e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include "content/renderer/media/renderer_gpu_video_decoder_factories.h" 10e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include "content/renderer/media/rtc_video_decoder.h" 11e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include "media/filters/gpu_video_decoder_factories.h" 12e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 13e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallnamespace content { 14e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 15e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP AbgrallRTCVideoDecoderFactory::RTCVideoDecoderFactory( 16762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o const scoped_refptr<RendererGpuVideoDecoderFactories>& gpu_factories) 17762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o : gpu_factories_(gpu_factories) { 18762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o DVLOG(2) << "RTCVideoDecoderFactory"; 19762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o} 20762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o 21762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'oRTCVideoDecoderFactory::~RTCVideoDecoderFactory() { 22e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o DVLOG(2) << "~RTCVideoDecoderFactory"; 2348e6e81362f264aee4f3945c14928efaf71a06c9Theodore Ts'o} 24762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o 25762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'owebrtc::VideoDecoder* RTCVideoDecoderFactory::CreateVideoDecoder( 26762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o webrtc::VideoCodecType type) { 27762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o DVLOG(2) << "CreateVideoDecoder"; 28762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o // RendererGpuVideoDecoderFactories is not thread safe. It cannot be shared 29762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o // by different decoders. This method runs on Chrome_libJingle_WorkerThread 30762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o // and the child thread is blocked while this runs. We cannot create new gpu 31762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o // factories here. Clone one instead. 327292355283b90f1da3a86713b9f85074da22bb84Theodore Ts'o scoped_ptr<RTCVideoDecoder> decoder = 337292355283b90f1da3a86713b9f85074da22bb84Theodore Ts'o RTCVideoDecoder::Create(type, gpu_factories_->Clone()); 347292355283b90f1da3a86713b9f85074da22bb84Theodore Ts'o return decoder.release(); 357a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o} 36e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 3788fe61c7c39b97193100d61ac4785de1fb05d130Theodore Ts'ovoid RTCVideoDecoderFactory::DestroyVideoDecoder( 38e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o webrtc::VideoDecoder* decoder) { 39762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o DVLOG(2) << "DestroyVideoDecoder"; 40762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o gpu_factories_->GetMessageLoop()->DeleteSoon(FROM_HERE, decoder); 41762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o} 4209f3eba28a4d3c050a548eab571b73352b131021Theodore Ts'o 43762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o} // namespace content 44762c7c65103615d976beeb4c8e2d1d9a79c87d86Theodore Ts'o