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