rtc_video_decoder_factory.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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
11namespace content {
12
13RTCVideoDecoderFactory::RTCVideoDecoderFactory(
14    const scoped_refptr<media::GpuVideoDecoder::Factories>& gpu_factories)
15    : vda_loop_proxy_(gpu_factories->GetMessageLoop()) {
16  DVLOG(2) << "RTCVideoDecoderFactory";
17  // The decoder cannot be created in CreateVideoDecoder because VDA has to be
18  // created on |vda_loop_proxy_|, which can be the child thread. The child
19  // thread is blocked when CreateVideoDecoder runs. This supports only one
20  // VDA-powered <video> tag at a time.
21  // TODO(wuchengli): remove this restriction.
22  // |decoder_| can be null if VDA does not support VP8.
23  decoder_ = RTCVideoDecoder::Create(gpu_factories);
24}
25
26RTCVideoDecoderFactory::~RTCVideoDecoderFactory() {
27  DVLOG(2) << "~RTCVideoDecoderFactory";
28  if (decoder_) {
29    webrtc::VideoDecoder* decoder = decoder_.release();
30    if (!vda_loop_proxy_->DeleteSoon(FROM_HERE, decoder))
31      delete decoder;
32  }
33}
34
35webrtc::VideoDecoder* RTCVideoDecoderFactory::CreateVideoDecoder(
36    webrtc::VideoCodecType type) {
37  DVLOG(2) << "CreateVideoDecoder";
38  // Only VP8 is supported.
39  if (type == webrtc::kVideoCodecVP8)
40    return decoder_.release();
41  return NULL;
42}
43
44void RTCVideoDecoderFactory::DestroyVideoDecoder(
45    webrtc::VideoDecoder* decoder) {
46  DVLOG(2) << "DestroyVideoDecoder";
47  // Save back the decoder because it is the only one. VideoDecoder::Release
48  // should have been called.
49  decoder->RegisterDecodeCompleteCallback(NULL);
50  decoder_.reset(decoder);
51}
52
53}  // namespace content
54