| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/common/gpu/media/fake_video_decode_accelerator.h" | 5 #include "content/common/gpu/media/fake_video_decode_accelerator.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 | 22 |
| 23 static const uint32_t kDefaultTextureTarget = GL_TEXTURE_2D; | 23 static const uint32_t kDefaultTextureTarget = GL_TEXTURE_2D; |
| 24 // Must be at least 2 since the rendering helper will switch between textures | 24 // Must be at least 2 since the rendering helper will switch between textures |
| 25 // and if there is only one, it will wait for the next one that will never come. | 25 // and if there is only one, it will wait for the next one that will never come. |
| 26 // Must also be an even number as otherwise there won't be the same amount of | 26 // Must also be an even number as otherwise there won't be the same amount of |
| 27 // white and black frames. | 27 // white and black frames. |
| 28 static const unsigned int kNumBuffers = media::limits::kMaxVideoFrames + | 28 static const unsigned int kNumBuffers = media::limits::kMaxVideoFrames + |
| 29 (media::limits::kMaxVideoFrames & 1u); | 29 (media::limits::kMaxVideoFrames & 1u); |
| 30 | 30 |
| 31 FakeVideoDecodeAccelerator::FakeVideoDecodeAccelerator( | 31 FakeVideoDecodeAccelerator::FakeVideoDecodeAccelerator( |
| 32 gfx::GLContext* gl, | 32 const gfx::Size& size, |
| 33 gfx::Size size, | 33 const MakeGLContextCurrentCallback& make_context_current_cb) |
| 34 const base::Callback<bool(void)>& make_context_current) | |
| 35 : child_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 34 : child_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| 36 client_(NULL), | 35 client_(NULL), |
| 37 make_context_current_(make_context_current), | 36 make_context_current_cb_(make_context_current_cb), |
| 38 gl_(gl), | |
| 39 frame_buffer_size_(size), | 37 frame_buffer_size_(size), |
| 40 flushing_(false), | 38 flushing_(false), |
| 41 weak_this_factory_(this) { | 39 weak_this_factory_(this) {} |
| 42 } | |
| 43 | 40 |
| 44 FakeVideoDecodeAccelerator::~FakeVideoDecodeAccelerator() { | 41 FakeVideoDecodeAccelerator::~FakeVideoDecodeAccelerator() { |
| 45 } | 42 } |
| 46 | 43 |
| 47 bool FakeVideoDecodeAccelerator::Initialize(const Config& config, | 44 bool FakeVideoDecodeAccelerator::Initialize(const Config& config, |
| 48 Client* client) { | 45 Client* client) { |
| 49 DCHECK(child_task_runner_->BelongsToCurrentThread()); | 46 DCHECK(child_task_runner_->BelongsToCurrentThread()); |
| 50 if (config.profile == media::VIDEO_CODEC_PROFILE_UNKNOWN) { | 47 if (config.profile == media::VIDEO_CODEC_PROFILE_UNKNOWN) { |
| 51 LOG(ERROR) << "unknown codec profile"; | 48 LOG(ERROR) << "unknown codec profile"; |
| 52 return false; | 49 return false; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 4]); | 92 4]); |
| 96 memset(white_data.get(), | 93 memset(white_data.get(), |
| 97 UINT8_MAX, | 94 UINT8_MAX, |
| 98 frame_buffer_size_.width() * frame_buffer_size_.height() * 4); | 95 frame_buffer_size_.width() * frame_buffer_size_.height() * 4); |
| 99 scoped_ptr<uint8_t[]> black_data( | 96 scoped_ptr<uint8_t[]> black_data( |
| 100 new uint8_t[frame_buffer_size_.width() * frame_buffer_size_.height() * | 97 new uint8_t[frame_buffer_size_.width() * frame_buffer_size_.height() * |
| 101 4]); | 98 4]); |
| 102 memset(black_data.get(), | 99 memset(black_data.get(), |
| 103 0, | 100 0, |
| 104 frame_buffer_size_.width() * frame_buffer_size_.height() * 4); | 101 frame_buffer_size_.width() * frame_buffer_size_.height() * 4); |
| 105 if (!make_context_current_.Run()) { | 102 if (!make_context_current_cb_.Run()) { |
| 106 LOG(ERROR) << "ReusePictureBuffer(): could not make context current"; | 103 LOG(ERROR) << "ReusePictureBuffer(): could not make context current"; |
| 107 return; | 104 return; |
| 108 } | 105 } |
| 109 for (size_t index = 0; index < buffers.size(); ++index) { | 106 for (size_t index = 0; index < buffers.size(); ++index) { |
| 110 DCHECK_LE(1u, buffers[index].texture_ids().size()); | 107 DCHECK_LE(1u, buffers[index].texture_ids().size()); |
| 111 glBindTexture(GL_TEXTURE_2D, buffers[index].texture_ids()[0]); | 108 glBindTexture(GL_TEXTURE_2D, buffers[index].texture_ids()[0]); |
| 112 // Every other frame white and the rest black. | 109 // Every other frame white and the rest black. |
| 113 uint8_t* data = index % 2 ? white_data.get() : black_data.get(); | 110 uint8_t* data = index % 2 ? white_data.get() : black_data.get(); |
| 114 glTexImage2D(GL_TEXTURE_2D, | 111 glTexImage2D(GL_TEXTURE_2D, |
| 115 0, | 112 0, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 } | 152 } |
| 156 | 153 |
| 157 void FakeVideoDecodeAccelerator::Destroy() { | 154 void FakeVideoDecodeAccelerator::Destroy() { |
| 158 while (!queued_bitstream_ids_.empty()) { | 155 while (!queued_bitstream_ids_.empty()) { |
| 159 client_->NotifyEndOfBitstreamBuffer(queued_bitstream_ids_.front()); | 156 client_->NotifyEndOfBitstreamBuffer(queued_bitstream_ids_.front()); |
| 160 queued_bitstream_ids_.pop(); | 157 queued_bitstream_ids_.pop(); |
| 161 } | 158 } |
| 162 delete this; | 159 delete this; |
| 163 } | 160 } |
| 164 | 161 |
| 165 bool FakeVideoDecodeAccelerator::CanDecodeOnIOThread() { | 162 bool FakeVideoDecodeAccelerator::TryToSetupDecodeOnSeparateThread( |
| 166 return true; | 163 const base::WeakPtr<Client>& decode_client, |
| 164 const scoped_refptr<base::SingleThreadTaskRunner>& decode_task_runner) { |
| 165 return false; |
| 167 } | 166 } |
| 168 | 167 |
| 169 void FakeVideoDecodeAccelerator::DoPictureReady() { | 168 void FakeVideoDecodeAccelerator::DoPictureReady() { |
| 170 if (flushing_ && queued_bitstream_ids_.empty()) { | 169 if (flushing_ && queued_bitstream_ids_.empty()) { |
| 171 flushing_ = false; | 170 flushing_ = false; |
| 172 client_->NotifyFlushDone(); | 171 client_->NotifyFlushDone(); |
| 173 } | 172 } |
| 174 while (!free_output_buffers_.empty() && !queued_bitstream_ids_.empty()) { | 173 while (!free_output_buffers_.empty() && !queued_bitstream_ids_.empty()) { |
| 175 int bitstream_id = queued_bitstream_ids_.front(); | 174 int bitstream_id = queued_bitstream_ids_.front(); |
| 176 queued_bitstream_ids_.pop(); | 175 queued_bitstream_ids_.pop(); |
| 177 int buffer_id = free_output_buffers_.front(); | 176 int buffer_id = free_output_buffers_.front(); |
| 178 free_output_buffers_.pop(); | 177 free_output_buffers_.pop(); |
| 179 | 178 |
| 180 const media::Picture picture = | 179 const media::Picture picture = |
| 181 media::Picture(buffer_id, | 180 media::Picture(buffer_id, |
| 182 bitstream_id, | 181 bitstream_id, |
| 183 gfx::Rect(frame_buffer_size_), | 182 gfx::Rect(frame_buffer_size_), |
| 184 false); | 183 false); |
| 185 client_->PictureReady(picture); | 184 client_->PictureReady(picture); |
| 186 // Bitstream no longer needed. | 185 // Bitstream no longer needed. |
| 187 client_->NotifyEndOfBitstreamBuffer(bitstream_id); | 186 client_->NotifyEndOfBitstreamBuffer(bitstream_id); |
| 188 if (flushing_ && queued_bitstream_ids_.empty()) { | 187 if (flushing_ && queued_bitstream_ids_.empty()) { |
| 189 flushing_ = false; | 188 flushing_ = false; |
| 190 client_->NotifyFlushDone(); | 189 client_->NotifyFlushDone(); |
| 191 } | 190 } |
| 192 } | 191 } |
| 193 } | 192 } |
| 194 | 193 |
| 195 } // namespace content | 194 } // namespace content |
| OLD | NEW |