Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Side by Side Diff: content/renderer/media/rtc_video_decoder.cc

Issue 457733002: Support for H264 HW offload for webRTC. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: More nits from posciak. Updated unittest. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/rtc_video_decoder.h" 5 #include "content/renderer/media/rtc_video_decoder.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/memory/ref_counted.h" 9 #include "base/memory/ref_counted.h"
10 #include "base/message_loop/message_loop_proxy.h" 10 #include "base/message_loop/message_loop_proxy.h"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 size_t size) 64 size_t size)
65 : bitstream_buffer_id(bitstream_buffer_id), 65 : bitstream_buffer_id(bitstream_buffer_id),
66 timestamp(timestamp), 66 timestamp(timestamp),
67 size(size) {} 67 size(size) {}
68 68
69 RTCVideoDecoder::BufferData::BufferData() {} 69 RTCVideoDecoder::BufferData::BufferData() {}
70 70
71 RTCVideoDecoder::BufferData::~BufferData() {} 71 RTCVideoDecoder::BufferData::~BufferData() {}
72 72
73 RTCVideoDecoder::RTCVideoDecoder( 73 RTCVideoDecoder::RTCVideoDecoder(
74 webrtc::VideoCodecType type,
74 const scoped_refptr<media::GpuVideoAcceleratorFactories>& factories) 75 const scoped_refptr<media::GpuVideoAcceleratorFactories>& factories)
75 : factories_(factories), 76 : video_codec_type_(type),
77 factories_(factories),
76 decoder_texture_target_(0), 78 decoder_texture_target_(0),
77 next_picture_buffer_id_(0), 79 next_picture_buffer_id_(0),
78 state_(UNINITIALIZED), 80 state_(UNINITIALIZED),
79 decode_complete_callback_(NULL), 81 decode_complete_callback_(NULL),
80 num_shm_buffers_(0), 82 num_shm_buffers_(0),
81 next_bitstream_buffer_id_(0), 83 next_bitstream_buffer_id_(0),
82 reset_bitstream_buffer_id_(ID_INVALID), 84 reset_bitstream_buffer_id_(ID_INVALID),
83 weak_factory_(this) { 85 weak_factory_(this) {
84 DCHECK(!factories_->GetTaskRunner()->BelongsToCurrentThread()); 86 DCHECK(!factories_->GetTaskRunner()->BelongsToCurrentThread());
85 } 87 }
(...skipping 23 matching lines...) Expand all
109 scoped_ptr<RTCVideoDecoder> RTCVideoDecoder::Create( 111 scoped_ptr<RTCVideoDecoder> RTCVideoDecoder::Create(
110 webrtc::VideoCodecType type, 112 webrtc::VideoCodecType type,
111 const scoped_refptr<media::GpuVideoAcceleratorFactories>& factories) { 113 const scoped_refptr<media::GpuVideoAcceleratorFactories>& factories) {
112 scoped_ptr<RTCVideoDecoder> decoder; 114 scoped_ptr<RTCVideoDecoder> decoder;
113 // Convert WebRTC codec type to media codec profile. 115 // Convert WebRTC codec type to media codec profile.
114 media::VideoCodecProfile profile; 116 media::VideoCodecProfile profile;
115 switch (type) { 117 switch (type) {
116 case webrtc::kVideoCodecVP8: 118 case webrtc::kVideoCodecVP8:
117 profile = media::VP8PROFILE_MAIN; 119 profile = media::VP8PROFILE_MAIN;
118 break; 120 break;
121 case webrtc::kVideoCodecH264:
122 profile = media::H264PROFILE_MAIN;
123 break;
119 default: 124 default:
120 DVLOG(2) << "Video codec not supported:" << type; 125 DVLOG(2) << "Video codec not supported:" << type;
121 return decoder.Pass(); 126 return decoder.Pass();
122 } 127 }
123 128
124 base::WaitableEvent waiter(true, false); 129 base::WaitableEvent waiter(true, false);
125 decoder.reset(new RTCVideoDecoder(factories)); 130 decoder.reset(new RTCVideoDecoder(type, factories));
126 decoder->factories_->GetTaskRunner()->PostTask( 131 decoder->factories_->GetTaskRunner()->PostTask(
127 FROM_HERE, 132 FROM_HERE,
128 base::Bind(&RTCVideoDecoder::CreateVDA, 133 base::Bind(&RTCVideoDecoder::CreateVDA,
129 base::Unretained(decoder.get()), 134 base::Unretained(decoder.get()),
130 profile, 135 profile,
131 &waiter)); 136 &waiter));
132 waiter.Wait(); 137 waiter.Wait();
133 // vda can be NULL if VP8 is not supported. 138 // vda can be NULL if VP8 is not supported.
134 if (decoder->vda_ != NULL) { 139 if (decoder->vda_ != NULL) {
135 decoder->state_ = INITIALIZED; 140 decoder->state_ = INITIALIZED;
136 } else { 141 } else {
137 factories->GetTaskRunner()->DeleteSoon(FROM_HERE, decoder.release()); 142 factories->GetTaskRunner()->DeleteSoon(FROM_HERE, decoder.release());
138 } 143 }
139 return decoder.Pass(); 144 return decoder.Pass();
140 } 145 }
141 146
142 int32_t RTCVideoDecoder::InitDecode(const webrtc::VideoCodec* codecSettings, 147 int32_t RTCVideoDecoder::InitDecode(const webrtc::VideoCodec* codecSettings,
143 int32_t /*numberOfCores*/) { 148 int32_t /*numberOfCores*/) {
144 DVLOG(2) << "InitDecode"; 149 DVLOG(2) << "InitDecode";
145 DCHECK_EQ(codecSettings->codecType, webrtc::kVideoCodecVP8); 150 DCHECK(video_codec_type_ == codecSettings->codecType);
146 if (codecSettings->codecSpecific.VP8.feedbackModeOn) { 151 if (codecSettings->codecType == webrtc::kVideoCodecVP8 &&
152 codecSettings->codecSpecific.VP8.feedbackModeOn) {
147 LOG(ERROR) << "Feedback mode not supported"; 153 LOG(ERROR) << "Feedback mode not supported";
148 return RecordInitDecodeUMA(WEBRTC_VIDEO_CODEC_ERROR); 154 return RecordInitDecodeUMA(WEBRTC_VIDEO_CODEC_ERROR);
149 } 155 }
150 156
151 base::AutoLock auto_lock(lock_); 157 base::AutoLock auto_lock(lock_);
152 if (state_ == UNINITIALIZED || state_ == DECODE_ERROR) { 158 if (state_ == UNINITIALIZED || state_ == DECODE_ERROR) {
153 LOG(ERROR) << "VDA is not initialized. state=" << state_; 159 LOG(ERROR) << "VDA is not initialized. state=" << state_;
154 return RecordInitDecodeUMA(WEBRTC_VIDEO_CODEC_UNINITIALIZED); 160 return RecordInitDecodeUMA(WEBRTC_VIDEO_CODEC_UNINITIALIZED);
155 } 161 }
156 // Create some shared memory if the queue is empty. 162 // Create some shared memory if the queue is empty.
(...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 UMA_HISTOGRAM_BOOLEAN("Media.RTCVideoDecoderInitDecodeSuccess", sample); 802 UMA_HISTOGRAM_BOOLEAN("Media.RTCVideoDecoderInitDecodeSuccess", sample);
797 return status; 803 return status;
798 } 804 }
799 805
800 void RTCVideoDecoder::DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent() 806 void RTCVideoDecoder::DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent()
801 const { 807 const {
802 DCHECK(factories_->GetTaskRunner()->BelongsToCurrentThread()); 808 DCHECK(factories_->GetTaskRunner()->BelongsToCurrentThread());
803 } 809 }
804 810
805 } // namespace content 811 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698