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