| Index: content/common/gpu/media/fake_video_decode_accelerator.cc
|
| diff --git a/content/common/gpu/media/fake_video_decode_accelerator.cc b/content/common/gpu/media/fake_video_decode_accelerator.cc
|
| deleted file mode 100644
|
| index cb594255b385d251f2a23f0585472cfafb4a416b..0000000000000000000000000000000000000000
|
| --- a/content/common/gpu/media/fake_video_decode_accelerator.cc
|
| +++ /dev/null
|
| @@ -1,196 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/common/gpu/media/fake_video_decode_accelerator.h"
|
| -
|
| -#include <stddef.h>
|
| -#include <string.h>
|
| -
|
| -#include <memory>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/location.h"
|
| -#include "base/thread_task_runner_handle.h"
|
| -#include "media/base/bitstream_buffer.h"
|
| -#include "media/base/limits.h"
|
| -#include "ui/gl/gl_context.h"
|
| -#include "ui/gl/gl_implementation.h"
|
| -#include "ui/gl/gl_surface.h"
|
| -#include "ui/gl/gl_surface_egl.h"
|
| -#include "ui/gl/gl_surface_glx.h"
|
| -
|
| -namespace content {
|
| -
|
| -static const uint32_t kDefaultTextureTarget = GL_TEXTURE_2D;
|
| -// Must be at least 2 since the rendering helper will switch between textures
|
| -// and if there is only one, it will wait for the next one that will never come.
|
| -// Must also be an even number as otherwise there won't be the same amount of
|
| -// white and black frames.
|
| -static const unsigned int kNumBuffers = media::limits::kMaxVideoFrames +
|
| - (media::limits::kMaxVideoFrames & 1u);
|
| -
|
| -FakeVideoDecodeAccelerator::FakeVideoDecodeAccelerator(
|
| - const gfx::Size& size,
|
| - const MakeGLContextCurrentCallback& make_context_current_cb)
|
| - : child_task_runner_(base::ThreadTaskRunnerHandle::Get()),
|
| - client_(NULL),
|
| - make_context_current_cb_(make_context_current_cb),
|
| - frame_buffer_size_(size),
|
| - flushing_(false),
|
| - weak_this_factory_(this) {}
|
| -
|
| -FakeVideoDecodeAccelerator::~FakeVideoDecodeAccelerator() {
|
| -}
|
| -
|
| -bool FakeVideoDecodeAccelerator::Initialize(const Config& config,
|
| - Client* client) {
|
| - DCHECK(child_task_runner_->BelongsToCurrentThread());
|
| - if (config.profile == media::VIDEO_CODEC_PROFILE_UNKNOWN) {
|
| - LOG(ERROR) << "unknown codec profile";
|
| - return false;
|
| - }
|
| - if (config.is_encrypted) {
|
| - NOTREACHED() << "encrypted streams are not supported";
|
| - return false;
|
| - }
|
| -
|
| - // V4L2VideoDecodeAccelerator waits until first decode call to ask for buffers
|
| - // This class asks for it on initialization instead.
|
| - client_ = client;
|
| - client_->ProvidePictureBuffers(kNumBuffers, 1, frame_buffer_size_,
|
| - kDefaultTextureTarget);
|
| - return true;
|
| -}
|
| -
|
| -void FakeVideoDecodeAccelerator::Decode(
|
| - const media::BitstreamBuffer& bitstream_buffer) {
|
| - // We won't really read from the bitstream_buffer, close the handle.
|
| - if (base::SharedMemory::IsHandleValid(bitstream_buffer.handle()))
|
| - base::SharedMemory::CloseHandle(bitstream_buffer.handle());
|
| -
|
| - if (bitstream_buffer.id() < 0) {
|
| - LOG(ERROR) << "Invalid bitstream: id=" << bitstream_buffer.id();
|
| - client_->NotifyError(INVALID_ARGUMENT);
|
| - return;
|
| - }
|
| -
|
| - int bitstream_buffer_id = bitstream_buffer.id();
|
| - queued_bitstream_ids_.push(bitstream_buffer_id);
|
| - child_task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&FakeVideoDecodeAccelerator::DoPictureReady,
|
| - weak_this_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -// Similar to UseOutputBitstreamBuffer for the encode accelerator.
|
| -void FakeVideoDecodeAccelerator::AssignPictureBuffers(
|
| - const std::vector<media::PictureBuffer>& buffers) {
|
| - DCHECK(buffers.size() == kNumBuffers);
|
| - DCHECK(!(buffers.size()%2));
|
| -
|
| - // Save buffers and mark all buffers as ready for use.
|
| - std::unique_ptr<uint8_t[]> white_data(
|
| - new uint8_t[frame_buffer_size_.width() * frame_buffer_size_.height() *
|
| - 4]);
|
| - memset(white_data.get(),
|
| - UINT8_MAX,
|
| - frame_buffer_size_.width() * frame_buffer_size_.height() * 4);
|
| - std::unique_ptr<uint8_t[]> black_data(
|
| - new uint8_t[frame_buffer_size_.width() * frame_buffer_size_.height() *
|
| - 4]);
|
| - memset(black_data.get(),
|
| - 0,
|
| - frame_buffer_size_.width() * frame_buffer_size_.height() * 4);
|
| - if (!make_context_current_cb_.Run()) {
|
| - LOG(ERROR) << "ReusePictureBuffer(): could not make context current";
|
| - return;
|
| - }
|
| - for (size_t index = 0; index < buffers.size(); ++index) {
|
| - DCHECK_LE(1u, buffers[index].texture_ids().size());
|
| - glBindTexture(GL_TEXTURE_2D, buffers[index].texture_ids()[0]);
|
| - // Every other frame white and the rest black.
|
| - uint8_t* data = index % 2 ? white_data.get() : black_data.get();
|
| - glTexImage2D(GL_TEXTURE_2D,
|
| - 0,
|
| - GL_RGBA,
|
| - frame_buffer_size_.width(),
|
| - frame_buffer_size_.height(),
|
| - 0,
|
| - GL_RGBA,
|
| - GL_UNSIGNED_BYTE,
|
| - data);
|
| - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
| - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
| - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
| - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
| - glBindTexture(GL_TEXTURE_2D, 0);
|
| - free_output_buffers_.push(buffers[index].id());
|
| - }
|
| - child_task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&FakeVideoDecodeAccelerator::DoPictureReady,
|
| - weak_this_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void FakeVideoDecodeAccelerator::ReusePictureBuffer(int32_t picture_buffer_id) {
|
| - free_output_buffers_.push(picture_buffer_id);
|
| - child_task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&FakeVideoDecodeAccelerator::DoPictureReady,
|
| - weak_this_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void FakeVideoDecodeAccelerator::Flush() {
|
| - flushing_ = true;
|
| - child_task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&FakeVideoDecodeAccelerator::DoPictureReady,
|
| - weak_this_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void FakeVideoDecodeAccelerator::Reset() {
|
| - while (!queued_bitstream_ids_.empty()) {
|
| - client_->NotifyEndOfBitstreamBuffer(queued_bitstream_ids_.front());
|
| - queued_bitstream_ids_.pop();
|
| - }
|
| - client_->NotifyResetDone();
|
| -}
|
| -
|
| -void FakeVideoDecodeAccelerator::Destroy() {
|
| - while (!queued_bitstream_ids_.empty()) {
|
| - client_->NotifyEndOfBitstreamBuffer(queued_bitstream_ids_.front());
|
| - queued_bitstream_ids_.pop();
|
| - }
|
| - delete this;
|
| -}
|
| -
|
| -bool FakeVideoDecodeAccelerator::TryToSetupDecodeOnSeparateThread(
|
| - const base::WeakPtr<Client>& decode_client,
|
| - const scoped_refptr<base::SingleThreadTaskRunner>& decode_task_runner) {
|
| - return false;
|
| -}
|
| -
|
| -void FakeVideoDecodeAccelerator::DoPictureReady() {
|
| - if (flushing_ && queued_bitstream_ids_.empty()) {
|
| - flushing_ = false;
|
| - client_->NotifyFlushDone();
|
| - }
|
| - while (!free_output_buffers_.empty() && !queued_bitstream_ids_.empty()) {
|
| - int bitstream_id = queued_bitstream_ids_.front();
|
| - queued_bitstream_ids_.pop();
|
| - int buffer_id = free_output_buffers_.front();
|
| - free_output_buffers_.pop();
|
| -
|
| - const media::Picture picture =
|
| - media::Picture(buffer_id,
|
| - bitstream_id,
|
| - gfx::Rect(frame_buffer_size_),
|
| - false);
|
| - client_->PictureReady(picture);
|
| - // Bitstream no longer needed.
|
| - client_->NotifyEndOfBitstreamBuffer(bitstream_id);
|
| - if (flushing_ && queued_bitstream_ids_.empty()) {
|
| - flushing_ = false;
|
| - client_->NotifyFlushDone();
|
| - }
|
| - }
|
| -}
|
| -
|
| -} // namespace content
|
|
|