| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <deque> | |
| 8 | |
| 9 #include "base/bind.h" | 7 #include "base/bind.h" |
| 10 #include "base/callback.h" | 8 #include "base/callback.h" |
| 11 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 12 #include "base/task.h" | 10 #include "base/task.h" |
| 13 #include "media/base/demuxer.h" | 11 #include "media/base/demuxer.h" |
| 14 #include "media/base/filter_host.h" | 12 #include "media/base/filter_host.h" |
| 15 #include "media/base/filters.h" | 13 #include "media/base/filters.h" |
| 16 #include "media/base/limits.h" | 14 #include "media/base/limits.h" |
| 17 #include "media/base/video_frame.h" | 15 #include "media/base/video_frame.h" |
| 18 #include "media/base/video_util.h" | 16 #include "media/base/video_util.h" |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 return; | 78 return; |
| 81 } | 79 } |
| 82 | 80 |
| 83 DCHECK_EQ(MessageLoop::current(), message_loop_); | 81 DCHECK_EQ(MessageLoop::current(), message_loop_); |
| 84 | 82 |
| 85 state_ = kPaused; | 83 state_ = kPaused; |
| 86 | 84 |
| 87 VideoDecoder::Pause(callback); | 85 VideoDecoder::Pause(callback); |
| 88 } | 86 } |
| 89 | 87 |
| 88 void RTCVideoDecoder::Flush(const base::Closure& callback) { |
| 89 if (MessageLoop::current() != message_loop_) { |
| 90 message_loop_->PostTask(FROM_HERE, |
| 91 base::Bind(&RTCVideoDecoder::Flush, |
| 92 this, callback)); |
| 93 return; |
| 94 } |
| 95 |
| 96 DCHECK_EQ(MessageLoop::current(), message_loop_); |
| 97 |
| 98 ReadCB read_cb; |
| 99 { |
| 100 base::AutoLock auto_lock(lock_); |
| 101 if (!read_cb_.is_null()) { |
| 102 std::swap(read_cb, read_cb_); |
| 103 } |
| 104 } |
| 105 |
| 106 if (!read_cb.is_null()) { |
| 107 scoped_refptr<media::VideoFrame> video_frame = |
| 108 media::VideoFrame::CreateBlackFrame(visible_size_.width(), |
| 109 visible_size_.height()); |
| 110 read_cb.Run(video_frame); |
| 111 } |
| 112 |
| 113 VideoDecoder::Flush(callback); |
| 114 } |
| 115 |
| 90 void RTCVideoDecoder::Stop(const base::Closure& callback) { | 116 void RTCVideoDecoder::Stop(const base::Closure& callback) { |
| 91 if (MessageLoop::current() != message_loop_) { | 117 if (MessageLoop::current() != message_loop_) { |
| 92 message_loop_->PostTask(FROM_HERE, | 118 message_loop_->PostTask(FROM_HERE, |
| 93 base::Bind(&RTCVideoDecoder::Stop, | 119 base::Bind(&RTCVideoDecoder::Stop, |
| 94 this, callback)); | 120 this, callback)); |
| 95 return; | 121 return; |
| 96 } | 122 } |
| 97 | 123 |
| 98 DCHECK_EQ(MessageLoop::current(), message_loop_); | 124 DCHECK_EQ(MessageLoop::current(), message_loop_); |
| 99 | 125 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 } | 160 } |
| 135 | 161 |
| 136 bool RTCVideoDecoder::SetSize(int width, int height, int reserved) { | 162 bool RTCVideoDecoder::SetSize(int width, int height, int reserved) { |
| 137 visible_size_.SetSize(width, height); | 163 visible_size_.SetSize(width, height); |
| 138 | 164 |
| 139 // TODO(vrk): Provide natural size when aspect ratio support is implemented. | 165 // TODO(vrk): Provide natural size when aspect ratio support is implemented. |
| 140 host()->SetNaturalVideoSize(visible_size_); | 166 host()->SetNaturalVideoSize(visible_size_); |
| 141 return true; | 167 return true; |
| 142 } | 168 } |
| 143 | 169 |
| 170 // TODO(wjia): this function can be split into two parts so that the |lock_| |
| 171 // can be removed. |
| 172 // First creates media::VideoFrame, then post a task onto |message_loop_| |
| 173 // to deliver that frame. |
| 144 bool RTCVideoDecoder::RenderFrame(const cricket::VideoFrame* frame) { | 174 bool RTCVideoDecoder::RenderFrame(const cricket::VideoFrame* frame) { |
| 145 // Called from libjingle thread. | 175 // Called from libjingle thread. |
| 146 DCHECK(frame); | 176 DCHECK(frame); |
| 147 | 177 |
| 148 if (state_ != kNormal) | 178 if (state_ != kNormal) |
| 149 return true; | 179 return true; |
| 150 | 180 |
| 151 ReadCB read_cb; | 181 ReadCB read_cb; |
| 152 { | 182 { |
| 153 base::AutoLock auto_lock(lock_); | 183 base::AutoLock auto_lock(lock_); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 173 | 203 |
| 174 int y_rows = frame->GetHeight(); | 204 int y_rows = frame->GetHeight(); |
| 175 int uv_rows = frame->GetHeight() / 2; // YV12 format. | 205 int uv_rows = frame->GetHeight() / 2; // YV12 format. |
| 176 CopyYPlane(frame->GetYPlane(), frame->GetYPitch(), y_rows, video_frame); | 206 CopyYPlane(frame->GetYPlane(), frame->GetYPitch(), y_rows, video_frame); |
| 177 CopyUPlane(frame->GetUPlane(), frame->GetUPitch(), uv_rows, video_frame); | 207 CopyUPlane(frame->GetUPlane(), frame->GetUPitch(), uv_rows, video_frame); |
| 178 CopyVPlane(frame->GetVPlane(), frame->GetVPitch(), uv_rows, video_frame); | 208 CopyVPlane(frame->GetVPlane(), frame->GetVPitch(), uv_rows, video_frame); |
| 179 | 209 |
| 180 read_cb.Run(video_frame); | 210 read_cb.Run(video_frame); |
| 181 return true; | 211 return true; |
| 182 } | 212 } |
| OLD | NEW |