OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 | 29 |
30 RTCVideoDecoder::RTCVideoDecoder(MessageLoop* message_loop, | 30 RTCVideoDecoder::RTCVideoDecoder(MessageLoop* message_loop, |
31 const std::string& url) | 31 const std::string& url) |
32 : message_loop_(message_loop), | 32 : message_loop_(message_loop), |
33 visible_size_(640, 480), | 33 visible_size_(640, 480), |
34 url_(url), | 34 url_(url), |
35 state_(kUnInitialized), | 35 state_(kUnInitialized), |
36 got_first_frame_(false) { | 36 got_first_frame_(false) { |
37 } | 37 } |
38 | 38 |
39 RTCVideoDecoder::~RTCVideoDecoder() {} | |
40 | |
41 void RTCVideoDecoder::Initialize(DemuxerStream* demuxer_stream, | |
42 const PipelineStatusCB& status_cb, | |
43 const StatisticsCB& statistics_cb) { | |
44 if (MessageLoop::current() != message_loop_) { | |
45 message_loop_->PostTask( | |
46 FROM_HERE, | |
47 base::Bind(&RTCVideoDecoder::Initialize, this, | |
48 make_scoped_refptr(demuxer_stream), | |
49 status_cb, statistics_cb)); | |
50 return; | |
51 } | |
52 | |
53 DCHECK_EQ(MessageLoop::current(), message_loop_); | |
54 state_ = kNormal; | |
55 status_cb.Run(PIPELINE_OK); | |
56 | |
57 // TODO(acolwell): Implement stats. | |
58 } | |
59 | |
60 void RTCVideoDecoder::Play(const base::Closure& callback) { | 39 void RTCVideoDecoder::Play(const base::Closure& callback) { |
61 if (MessageLoop::current() != message_loop_) { | 40 if (MessageLoop::current() != message_loop_) { |
62 message_loop_->PostTask(FROM_HERE, | 41 message_loop_->PostTask(FROM_HERE, |
63 base::Bind(&RTCVideoDecoder::Play, this, callback)); | 42 base::Bind(&RTCVideoDecoder::Play, this, callback)); |
64 return; | 43 return; |
65 } | 44 } |
66 | 45 |
67 DCHECK_EQ(MessageLoop::current(), message_loop_); | 46 DCHECK_EQ(MessageLoop::current(), message_loop_); |
68 | 47 |
69 callback.Run(); | 48 callback.Run(); |
70 } | 49 } |
71 | 50 |
| 51 void RTCVideoDecoder::Seek(base::TimeDelta time, const PipelineStatusCB& cb) { |
| 52 if (MessageLoop::current() != message_loop_) { |
| 53 message_loop_->PostTask(FROM_HERE, |
| 54 base::Bind(&RTCVideoDecoder::Seek, this, |
| 55 time, cb)); |
| 56 return; |
| 57 } |
| 58 |
| 59 DCHECK_EQ(MessageLoop::current(), message_loop_); |
| 60 state_ = kNormal; |
| 61 cb.Run(PIPELINE_OK); |
| 62 } |
| 63 |
72 void RTCVideoDecoder::Pause(const base::Closure& callback) { | 64 void RTCVideoDecoder::Pause(const base::Closure& callback) { |
73 if (MessageLoop::current() != message_loop_) { | 65 if (MessageLoop::current() != message_loop_) { |
74 message_loop_->PostTask(FROM_HERE, | 66 message_loop_->PostTask(FROM_HERE, |
75 base::Bind(&RTCVideoDecoder::Pause, | 67 base::Bind(&RTCVideoDecoder::Pause, |
76 this, callback)); | 68 this, callback)); |
77 return; | 69 return; |
78 } | 70 } |
79 | 71 |
80 DCHECK_EQ(MessageLoop::current(), message_loop_); | 72 DCHECK_EQ(MessageLoop::current(), message_loop_); |
81 | 73 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 return; | 112 return; |
121 } | 113 } |
122 | 114 |
123 DCHECK_EQ(MessageLoop::current(), message_loop_); | 115 DCHECK_EQ(MessageLoop::current(), message_loop_); |
124 | 116 |
125 state_ = kStopped; | 117 state_ = kStopped; |
126 | 118 |
127 VideoDecoder::Stop(callback); | 119 VideoDecoder::Stop(callback); |
128 } | 120 } |
129 | 121 |
130 void RTCVideoDecoder::Seek(base::TimeDelta time, const PipelineStatusCB& cb) { | 122 void RTCVideoDecoder::Initialize(DemuxerStream* demuxer_stream, |
| 123 const PipelineStatusCB& status_cb, |
| 124 const StatisticsCB& statistics_cb) { |
131 if (MessageLoop::current() != message_loop_) { | 125 if (MessageLoop::current() != message_loop_) { |
132 message_loop_->PostTask(FROM_HERE, | 126 message_loop_->PostTask( |
133 base::Bind(&RTCVideoDecoder::Seek, this, | 127 FROM_HERE, |
134 time, cb)); | 128 base::Bind(&RTCVideoDecoder::Initialize, this, |
135 return; | 129 make_scoped_refptr(demuxer_stream), |
| 130 status_cb, statistics_cb)); |
| 131 return; |
136 } | 132 } |
137 | 133 |
138 DCHECK_EQ(MessageLoop::current(), message_loop_); | 134 DCHECK_EQ(MessageLoop::current(), message_loop_); |
139 state_ = kNormal; | 135 state_ = kNormal; |
140 cb.Run(PIPELINE_OK); | 136 status_cb.Run(PIPELINE_OK); |
| 137 |
| 138 // TODO(acolwell): Implement stats. |
141 } | 139 } |
142 | 140 |
143 void RTCVideoDecoder::Read(const ReadCB& callback) { | 141 void RTCVideoDecoder::Read(const ReadCB& callback) { |
144 if (MessageLoop::current() != message_loop_) { | 142 if (MessageLoop::current() != message_loop_) { |
145 message_loop_->PostTask( | 143 message_loop_->PostTask( |
146 FROM_HERE, | 144 FROM_HERE, |
147 base::Bind(&RTCVideoDecoder::Read, this, callback)); | 145 base::Bind(&RTCVideoDecoder::Read, this, callback)); |
148 return; | 146 return; |
149 } | 147 } |
150 DCHECK_EQ(MessageLoop::current(), message_loop_); | 148 DCHECK_EQ(MessageLoop::current(), message_loop_); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 | 210 |
213 int y_rows = frame->GetHeight(); | 211 int y_rows = frame->GetHeight(); |
214 int uv_rows = frame->GetHeight() / 2; // YV12 format. | 212 int uv_rows = frame->GetHeight() / 2; // YV12 format. |
215 CopyYPlane(frame->GetYPlane(), frame->GetYPitch(), y_rows, video_frame); | 213 CopyYPlane(frame->GetYPlane(), frame->GetYPitch(), y_rows, video_frame); |
216 CopyUPlane(frame->GetUPlane(), frame->GetUPitch(), uv_rows, video_frame); | 214 CopyUPlane(frame->GetUPlane(), frame->GetUPitch(), uv_rows, video_frame); |
217 CopyVPlane(frame->GetVPlane(), frame->GetVPitch(), uv_rows, video_frame); | 215 CopyVPlane(frame->GetVPlane(), frame->GetVPitch(), uv_rows, video_frame); |
218 | 216 |
219 read_cb.Run(kOk, video_frame); | 217 read_cb.Run(kOk, video_frame); |
220 return true; | 218 return true; |
221 } | 219 } |
| 220 |
| 221 RTCVideoDecoder::~RTCVideoDecoder() {} |
OLD | NEW |