Index: content/renderer/media/rtc_video_decoder.cc |
diff --git a/content/renderer/media/rtc_video_decoder.cc b/content/renderer/media/rtc_video_decoder.cc |
deleted file mode 100644 |
index d795daf7edf49adf5f6f7006b434d970056a9f7e..0000000000000000000000000000000000000000 |
--- a/content/renderer/media/rtc_video_decoder.cc |
+++ /dev/null |
@@ -1,199 +0,0 @@ |
-// Copyright (c) 2012 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/renderer/media/rtc_video_decoder.h" |
- |
-#include <algorithm> |
- |
-#include "base/bind.h" |
-#include "base/callback.h" |
-#include "base/message_loop.h" |
-#include "media/base/demuxer.h" |
-#include "media/base/limits.h" |
-#include "media/base/video_frame.h" |
-#include "media/base/video_util.h" |
-#include "third_party/libjingle/source/talk/base/timeutils.h" |
-#include "third_party/libjingle/source/talk/media/base/videoframe.h" |
- |
-using media::CopyUPlane; |
-using media::CopyVPlane; |
-using media::CopyYPlane; |
-using media::DemuxerStream; |
-using media::kNoTimestamp; |
-using media::PIPELINE_OK; |
-using media::PipelineStatusCB; |
-using media::StatisticsCB; |
-using media::VideoDecoder; |
- |
-namespace content { |
- |
-RTCVideoDecoder::RTCVideoDecoder(base::TaskRunner* video_decoder_thread, |
- base::TaskRunner* main_thread, |
- webrtc::VideoTrackInterface* video_track) |
- : video_decoder_thread_(video_decoder_thread), |
- main_thread_(main_thread), |
- visible_size_(640, 480), |
- state_(kUnInitialized), |
- got_first_frame_(false), |
- video_track_(video_track) { |
-} |
- |
-void RTCVideoDecoder::Initialize(const scoped_refptr<DemuxerStream>& stream, |
- const PipelineStatusCB& status_cb, |
- const StatisticsCB& statistics_cb) { |
- main_thread_->PostTask( |
- FROM_HERE, |
- base::Bind(&RTCVideoDecoder::RegisterToVideoTrack, this)); |
- if (!video_decoder_thread_->RunsTasksOnCurrentThread()) { |
- video_decoder_thread_->PostTask( |
- FROM_HERE, |
- base::Bind(&RTCVideoDecoder::Initialize, this, |
- stream, status_cb, statistics_cb)); |
- return; |
- } |
- |
- state_ = kNormal; |
- status_cb.Run(PIPELINE_OK); |
- |
- // TODO(acolwell): Implement stats. |
-} |
- |
-void RTCVideoDecoder::Read(const ReadCB& read_cb) { |
- if (!video_decoder_thread_->RunsTasksOnCurrentThread()) { |
- video_decoder_thread_->PostTask( |
- FROM_HERE, |
- base::Bind(&RTCVideoDecoder::Read, this, read_cb)); |
- return; |
- } |
- |
- base::AutoLock auto_lock(lock_); |
- CHECK(read_cb_.is_null()); |
- |
- if (state_ == kStopped) { |
- read_cb.Run(kOk, NULL); |
- return; |
- } |
- |
- read_cb_ = read_cb; |
-} |
- |
-void RTCVideoDecoder::Reset(const base::Closure& closure) { |
- if (!video_decoder_thread_->RunsTasksOnCurrentThread()) { |
- video_decoder_thread_->PostTask( |
- FROM_HERE, |
- base::Bind(&RTCVideoDecoder::Reset, this, closure)); |
- return; |
- } |
- |
- CancelPendingRead(); |
- closure.Run(); |
-} |
- |
-void RTCVideoDecoder::Stop(const base::Closure& closure) { |
- main_thread_->PostTask( |
- FROM_HERE, |
- base::Bind(&RTCVideoDecoder::DeregisterFromVideoTrack, this)); |
- if (!video_decoder_thread_->RunsTasksOnCurrentThread()) { |
- video_decoder_thread_->PostTask( |
- FROM_HERE, base::Bind(&RTCVideoDecoder::Stop, this, closure)); |
- return; |
- } |
- |
- state_ = kStopped; |
- CancelPendingRead(); |
- closure.Run(); |
-} |
- |
-void RTCVideoDecoder::SetSize(int width, int height) { |
- visible_size_.SetSize(width, height); |
-} |
- |
-// TODO(wjia): this function can be split into two parts so that the |lock_| |
-// can be removed. |
-// First creates media::VideoFrame, then post a task onto |message_loop_| |
-// to deliver that frame. |
-void RTCVideoDecoder::RenderFrame(const cricket::VideoFrame* frame) { |
- // Called from libjingle thread. |
- DCHECK(frame); |
- |
- base::TimeDelta timestamp = base::TimeDelta::FromMilliseconds( |
- frame->GetTimeStamp() / talk_base::kNumNanosecsPerMillisec); |
- |
- ReadCB read_cb; |
- { |
- base::AutoLock auto_lock(lock_); |
- if (read_cb_.is_null() || state_ != kNormal) { |
- // TODO(ronghuawu): revisit TS adjustment when crbug.com/111672 is |
- // resolved. |
- if (got_first_frame_) { |
- start_time_ += timestamp - last_frame_timestamp_; |
- } |
- last_frame_timestamp_ = timestamp; |
- return; |
- } |
- std::swap(read_cb, read_cb_); |
- } |
- |
- // Rebase timestamp with zero as starting point. |
- if (!got_first_frame_) { |
- start_time_ = timestamp; |
- got_first_frame_ = true; |
- } |
- |
- // Always allocate a new frame. |
- // |
- // TODO(scherkus): migrate this to proper buffer recycling. |
- scoped_refptr<media::VideoFrame> video_frame = |
- media::VideoFrame::CreateFrame(media::VideoFrame::YV12, |
- visible_size_, |
- gfx::Rect(visible_size_), |
- visible_size_, |
- timestamp - start_time_); |
- last_frame_timestamp_ = timestamp; |
- |
- // Aspect ratio unsupported; DCHECK when there are non-square pixels. |
- DCHECK_EQ(frame->GetPixelWidth(), 1u); |
- DCHECK_EQ(frame->GetPixelHeight(), 1u); |
- |
- int y_rows = frame->GetHeight(); |
- int uv_rows = frame->GetHeight() / 2; // YV12 format. |
- CopyYPlane(frame->GetYPlane(), frame->GetYPitch(), y_rows, video_frame); |
- CopyUPlane(frame->GetUPlane(), frame->GetUPitch(), uv_rows, video_frame); |
- CopyVPlane(frame->GetVPlane(), frame->GetVPitch(), uv_rows, video_frame); |
- |
- read_cb.Run(kOk, video_frame); |
-} |
- |
-void RTCVideoDecoder::CancelPendingRead() { |
- DCHECK(video_decoder_thread_->RunsTasksOnCurrentThread()); |
- ReadCB read_cb; |
- { |
- base::AutoLock auto_lock(lock_); |
- std::swap(read_cb, read_cb_); |
- } |
- |
- if (!read_cb.is_null()) { |
- read_cb.Run(kOk, NULL); |
- } |
-} |
- |
-void RTCVideoDecoder::RegisterToVideoTrack() { |
- DCHECK(main_thread_->RunsTasksOnCurrentThread()); |
- if (video_track_) |
- video_track_->AddRenderer(this); |
-} |
- |
-void RTCVideoDecoder::DeregisterFromVideoTrack() { |
- DCHECK(main_thread_->RunsTasksOnCurrentThread()); |
- if (video_track_) { |
- video_track_->RemoveRenderer(this); |
- video_track_ = NULL; |
- } |
-} |
- |
-RTCVideoDecoder::~RTCVideoDecoder() { |
- DCHECK_NE(kNormal, state_); |
-} |
- |
-} // namespace content |