Index: media/base/android/video_decoder_job.cc |
diff --git a/media/base/android/video_decoder_job.cc b/media/base/android/video_decoder_job.cc |
deleted file mode 100644 |
index bca7fa4afb4be1cdd9237fe33ff8ff412092cbda..0000000000000000000000000000000000000000 |
--- a/media/base/android/video_decoder_job.cc |
+++ /dev/null |
@@ -1,169 +0,0 @@ |
-// Copyright 2013 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 "media/base/android/video_decoder_job.h" |
- |
-#include <utility> |
- |
-#include "base/bind.h" |
-#include "base/lazy_instance.h" |
-#include "base/threading/thread.h" |
-#include "media/base/android/media_drm_bridge.h" |
-#include "media/base/android/sdk_media_codec_bridge.h" |
- |
-namespace media { |
- |
-class VideoDecoderThread : public base::Thread { |
- public: |
- VideoDecoderThread() : base::Thread("MediaSource_VideoDecoderThread") { |
- Start(); |
- } |
-}; |
- |
-// TODO(qinmin): Check if it is tolerable to use worker pool to handle all the |
-// decoding tasks so that we don't need a global thread here. |
-// http://crbug.com/245750 |
-base::LazyInstance<VideoDecoderThread>::Leaky |
- g_video_decoder_thread = LAZY_INSTANCE_INITIALIZER; |
- |
-VideoDecoderJob::VideoDecoderJob( |
- const base::Closure& request_data_cb, |
- const base::Closure& on_demuxer_config_changed_cb) |
- : MediaDecoderJob(g_video_decoder_thread.Pointer()->task_runner(), |
- request_data_cb, |
- on_demuxer_config_changed_cb), |
- video_codec_(kUnknownVideoCodec), |
- config_width_(0), |
- config_height_(0), |
- output_width_(0), |
- output_height_(0) { |
-} |
- |
-VideoDecoderJob::~VideoDecoderJob() {} |
- |
-bool VideoDecoderJob::SetVideoSurface(gl::ScopedJavaSurface surface) { |
- // For an empty surface, always pass it to the |media_codec_bridge_| job so |
- // that it can detach from the current one. Otherwise, don't pass an |
- // unprotected surface if the video content requires a protected one. |
- if (!surface.IsEmpty() && IsProtectedSurfaceRequired() && |
- !surface.is_protected()) { |
- return false; |
- } |
- |
- surface_ = std::move(surface); |
- need_to_reconfig_decoder_job_ = true; |
- return true; |
-} |
- |
-bool VideoDecoderJob::HasStream() const { |
- return video_codec_ != kUnknownVideoCodec; |
-} |
- |
-void VideoDecoderJob::ReleaseDecoderResources() { |
- MediaDecoderJob::ReleaseDecoderResources(); |
- surface_ = gl::ScopedJavaSurface(); |
-} |
- |
-void VideoDecoderJob::SetDemuxerConfigs(const DemuxerConfigs& configs) { |
- video_codec_ = configs.video_codec; |
- config_width_ = configs.video_size.width(); |
- config_height_ = configs.video_size.height(); |
- set_is_content_encrypted(configs.is_video_encrypted); |
- if (!media_codec_bridge_) { |
- output_width_ = config_width_; |
- output_height_ = config_height_; |
- } |
-} |
- |
-void VideoDecoderJob::ReleaseOutputBuffer( |
- int output_buffer_index, |
- size_t offset, |
- size_t size, |
- bool render_output, |
- bool is_late_frame, |
- base::TimeDelta current_presentation_timestamp, |
- MediaCodecStatus status, |
- const DecoderCallback& callback) { |
- media_codec_bridge_->ReleaseOutputBuffer(output_buffer_index, render_output); |
- callback.Run(status, is_late_frame, current_presentation_timestamp, |
- current_presentation_timestamp); |
-} |
- |
-bool VideoDecoderJob::ComputeTimeToRender() const { |
- return true; |
-} |
- |
-bool VideoDecoderJob::IsCodecReconfigureNeeded( |
- const DemuxerConfigs& configs) const { |
- if (!media_codec_bridge_) |
- return true; |
- |
- if (!AreDemuxerConfigsChanged(configs)) |
- return false; |
- |
- bool only_size_changed = false; |
- if (video_codec_ == configs.video_codec && |
- is_content_encrypted() == configs.is_video_encrypted) { |
- only_size_changed = true; |
- } |
- |
- return !only_size_changed || |
- !static_cast<VideoCodecBridge*>(media_codec_bridge_.get())-> |
- IsAdaptivePlaybackSupported(configs.video_size.width(), |
- configs.video_size.height()); |
-} |
- |
-bool VideoDecoderJob::AreDemuxerConfigsChanged( |
- const DemuxerConfigs& configs) const { |
- return video_codec_ != configs.video_codec || |
- is_content_encrypted() != configs.is_video_encrypted || |
- config_width_ != configs.video_size.width() || |
- config_height_ != configs.video_size.height(); |
-} |
- |
-MediaDecoderJob::MediaDecoderJobStatus |
- VideoDecoderJob::CreateMediaCodecBridgeInternal() { |
- if (surface_.IsEmpty()) { |
- ReleaseMediaCodecBridge(); |
- return STATUS_FAILURE; |
- } |
- |
- // If we cannot find a key frame in cache, browser seek is needed. |
- bool next_video_data_is_iframe = SetCurrentFrameToPreviouslyCachedKeyFrame(); |
- if (!next_video_data_is_iframe) |
- return STATUS_KEY_FRAME_REQUIRED; |
- |
- bool is_secure = is_content_encrypted() && drm_bridge() && |
- drm_bridge()->IsProtectedSurfaceRequired(); |
- |
- media_codec_bridge_.reset(VideoCodecBridge::CreateDecoder( |
- video_codec_, is_secure, gfx::Size(config_width_, config_height_), |
- surface_.j_surface().obj(), GetMediaCrypto())); |
- |
- if (!media_codec_bridge_) |
- return STATUS_FAILURE; |
- |
- return STATUS_SUCCESS; |
-} |
- |
-bool VideoDecoderJob::UpdateOutputFormat() { |
- if (!media_codec_bridge_) |
- return false; |
- int prev_output_width = output_width_; |
- int prev_output_height = output_height_; |
- // See b/18224769. The values reported from MediaCodecBridge::GetOutputSize |
- // correspond to the actual video frame size, but this is not necessarily the |
- // size that should be output. |
- output_width_ = config_width_; |
- output_height_ = config_height_; |
- return (output_width_ != prev_output_width) || |
- (output_height_ != prev_output_height); |
-} |
- |
-bool VideoDecoderJob::IsProtectedSurfaceRequired() { |
- return is_content_encrypted() && drm_bridge() && |
- drm_bridge()->IsProtectedSurfaceRequired(); |
-} |
- |
-} // namespace media |