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