rtc_video_decoder_factory.cc revision a3f7b4e666c476898878fa745f637129375cd889
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/renderer/media/rtc_video_decoder_factory.h"
6
7#include "base/location.h"
8#include "base/memory/scoped_ptr.h"
9#include "content/renderer/media/rtc_video_decoder.h"
10#include "media/filters/gpu_video_decoder_factories.h"
11
12namespace content {
13
14RTCVideoDecoderFactory::RTCVideoDecoderFactory(
15    const scoped_refptr<media::GpuVideoDecoderFactories>& gpu_factories)
16    : vda_loop_proxy_(gpu_factories->GetMessageLoop()) {
17  DVLOG(2) << "RTCVideoDecoderFactory";
18  // The decoder cannot be created in CreateVideoDecoder because VDA has to be
19  // created on |vda_loop_proxy_|, which can be the child thread. The child
20  // thread is blocked when CreateVideoDecoder runs. This supports only one
21  // VDA-powered <video> tag at a time.
22  // TODO(wuchengli): remove this restriction.
23  // |decoder_| can be null if VDA does not support VP8.
24  decoder_ = RTCVideoDecoder::Create(gpu_factories);
25}
26
27RTCVideoDecoderFactory::~RTCVideoDecoderFactory() {
28  DVLOG(2) << "~RTCVideoDecoderFactory";
29  if (decoder_) {
30    webrtc::VideoDecoder* decoder = decoder_.release();
31    if (!vda_loop_proxy_->DeleteSoon(FROM_HERE, decoder))
32      delete decoder;
33  }
34}
35
36webrtc::VideoDecoder* RTCVideoDecoderFactory::CreateVideoDecoder(
37    webrtc::VideoCodecType type) {
38  DVLOG(2) << "CreateVideoDecoder";
39  // Only VP8 is supported.
40  if (type == webrtc::kVideoCodecVP8)
41    return decoder_.release();
42  return NULL;
43}
44
45void RTCVideoDecoderFactory::DestroyVideoDecoder(
46    webrtc::VideoDecoder* decoder) {
47  DVLOG(2) << "DestroyVideoDecoder";
48  // Save back the decoder because it is the only one. VideoDecoder::Release
49  // should have been called.
50  decoder->RegisterDecodeCompleteCallback(NULL);
51  decoder_.reset(decoder);
52}
53
54}  // namespace content
55