| 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 <map> | 5 #include <map> |
| 6 #include <string> | 6 #include <string> |
| 7 | 7 |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 | 107 |
| 108 class MockVideoCaptureHost : public VideoCaptureHost { | 108 class MockVideoCaptureHost : public VideoCaptureHost { |
| 109 public: | 109 public: |
| 110 MockVideoCaptureHost(MediaStreamManager* manager) | 110 MockVideoCaptureHost(MediaStreamManager* manager) |
| 111 : VideoCaptureHost(manager), | 111 : VideoCaptureHost(manager), |
| 112 return_buffers_(false), | 112 return_buffers_(false), |
| 113 dump_video_(false) {} | 113 dump_video_(false) {} |
| 114 | 114 |
| 115 // A list of mock methods. | 115 // A list of mock methods. |
| 116 MOCK_METHOD4(OnNewBufferCreated, | 116 MOCK_METHOD4(OnNewBufferCreated, |
| 117 void(int device_id, base::SharedMemoryHandle handle, | 117 void(int device_id, |
| 118 int length, int buffer_id)); | 118 base::SharedMemoryHandle handle, |
| 119 int length, |
| 120 int buffer_id)); |
| 119 MOCK_METHOD2(OnBufferFreed, | 121 MOCK_METHOD2(OnBufferFreed, |
| 120 void(int device_id, int buffer_id)); | 122 void(int device_id, int buffer_id)); |
| 121 MOCK_METHOD4(OnBufferFilled, | 123 MOCK_METHOD4(OnBufferFilled, |
| 122 void(int device_id, | 124 void(int device_id, |
| 123 int buffer_id, | 125 int buffer_id, |
| 124 base::TimeTicks timestamp, | 126 const media::VideoCaptureFormat& format, |
| 125 const media::VideoCaptureFormat& format)); | 127 base::TimeTicks timestamp)); |
| 128 MOCK_METHOD5(OnMailboxBufferFilled, |
| 129 void(int device_id, |
| 130 int buffer_id, |
| 131 const gpu::MailboxHolder& mailbox_holder, |
| 132 const media::VideoCaptureFormat& format, |
| 133 base::TimeTicks timestamp)); |
| 126 MOCK_METHOD2(OnStateChanged, void(int device_id, VideoCaptureState state)); | 134 MOCK_METHOD2(OnStateChanged, void(int device_id, VideoCaptureState state)); |
| 127 | 135 |
| 128 // Use class DumpVideo to write I420 video to file. | 136 // Use class DumpVideo to write I420 video to file. |
| 129 void SetDumpVideo(bool enable) { | 137 void SetDumpVideo(bool enable) { |
| 130 dump_video_ = enable; | 138 dump_video_ = enable; |
| 131 } | 139 } |
| 132 | 140 |
| 133 void SetReturnReceivedDibs(bool enable) { | 141 void SetReturnReceivedDibs(bool enable) { |
| 134 return_buffers_ = enable; | 142 return_buffers_ = enable; |
| 135 } | 143 } |
| 136 | 144 |
| 137 // Return Dibs we currently have received. | 145 // Return Dibs we currently have received. |
| 138 void ReturnReceivedDibs(int device_id) { | 146 void ReturnReceivedDibs(int device_id) { |
| 139 int handle = GetReceivedDib(); | 147 int handle = GetReceivedDib(); |
| 140 while (handle) { | 148 while (handle) { |
| 141 this->OnReceiveEmptyBuffer(device_id, handle); | 149 this->OnReceiveEmptyBuffer(device_id, handle, 0); |
| 142 handle = GetReceivedDib(); | 150 handle = GetReceivedDib(); |
| 143 } | 151 } |
| 144 } | 152 } |
| 145 | 153 |
| 146 int GetReceivedDib() { | 154 int GetReceivedDib() { |
| 147 if (filled_dib_.empty()) | 155 if (filled_dib_.empty()) |
| 148 return 0; | 156 return 0; |
| 149 std::map<int, base::SharedMemory*>::iterator it = filled_dib_.begin(); | 157 std::map<int, base::SharedMemory*>::iterator it = filled_dib_.begin(); |
| 150 int h = it->first; | 158 int h = it->first; |
| 151 delete it->second; | 159 delete it->second; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 166 virtual bool Send(IPC::Message* message) OVERRIDE { | 174 virtual bool Send(IPC::Message* message) OVERRIDE { |
| 167 CHECK(message); | 175 CHECK(message); |
| 168 | 176 |
| 169 // In this method we dispatch the messages to the according handlers as if | 177 // In this method we dispatch the messages to the according handlers as if |
| 170 // we are the renderer. | 178 // we are the renderer. |
| 171 bool handled = true; | 179 bool handled = true; |
| 172 IPC_BEGIN_MESSAGE_MAP(MockVideoCaptureHost, *message) | 180 IPC_BEGIN_MESSAGE_MAP(MockVideoCaptureHost, *message) |
| 173 IPC_MESSAGE_HANDLER(VideoCaptureMsg_NewBuffer, OnNewBufferCreatedDispatch) | 181 IPC_MESSAGE_HANDLER(VideoCaptureMsg_NewBuffer, OnNewBufferCreatedDispatch) |
| 174 IPC_MESSAGE_HANDLER(VideoCaptureMsg_FreeBuffer, OnBufferFreedDispatch) | 182 IPC_MESSAGE_HANDLER(VideoCaptureMsg_FreeBuffer, OnBufferFreedDispatch) |
| 175 IPC_MESSAGE_HANDLER(VideoCaptureMsg_BufferReady, OnBufferFilledDispatch) | 183 IPC_MESSAGE_HANDLER(VideoCaptureMsg_BufferReady, OnBufferFilledDispatch) |
| 184 IPC_MESSAGE_HANDLER(VideoCaptureMsg_MailboxBufferReady, |
| 185 OnMailboxBufferFilledDispatch) |
| 176 IPC_MESSAGE_HANDLER(VideoCaptureMsg_StateChanged, OnStateChangedDispatch) | 186 IPC_MESSAGE_HANDLER(VideoCaptureMsg_StateChanged, OnStateChangedDispatch) |
| 177 IPC_MESSAGE_UNHANDLED(handled = false) | 187 IPC_MESSAGE_UNHANDLED(handled = false) |
| 178 IPC_END_MESSAGE_MAP() | 188 IPC_END_MESSAGE_MAP() |
| 179 EXPECT_TRUE(handled); | 189 EXPECT_TRUE(handled); |
| 180 | 190 |
| 181 delete message; | 191 delete message; |
| 182 return true; | 192 return true; |
| 183 } | 193 } |
| 184 | 194 |
| 185 // These handler methods do minimal things and delegate to the mock methods. | 195 // These handler methods do minimal things and delegate to the mock methods. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 198 | 208 |
| 199 std::map<int, base::SharedMemory*>::iterator it = | 209 std::map<int, base::SharedMemory*>::iterator it = |
| 200 filled_dib_.find(buffer_id); | 210 filled_dib_.find(buffer_id); |
| 201 ASSERT_TRUE(it != filled_dib_.end()); | 211 ASSERT_TRUE(it != filled_dib_.end()); |
| 202 delete it->second; | 212 delete it->second; |
| 203 filled_dib_.erase(it); | 213 filled_dib_.erase(it); |
| 204 } | 214 } |
| 205 | 215 |
| 206 void OnBufferFilledDispatch(int device_id, | 216 void OnBufferFilledDispatch(int device_id, |
| 207 int buffer_id, | 217 int buffer_id, |
| 208 base::TimeTicks timestamp, | 218 const media::VideoCaptureFormat& frame_format, |
| 209 const media::VideoCaptureFormat& frame_format) { | 219 base::TimeTicks timestamp) { |
| 210 base::SharedMemory* dib = filled_dib_[buffer_id]; | 220 base::SharedMemory* dib = filled_dib_[buffer_id]; |
| 211 ASSERT_TRUE(dib != NULL); | 221 ASSERT_TRUE(dib != NULL); |
| 212 if (dump_video_) { | 222 if (dump_video_) { |
| 213 if (!format_.IsValid()) { | 223 if (!format_.IsValid()) { |
| 214 dumper_.StartDump(frame_format.frame_size.width(), | 224 dumper_.StartDump(frame_format.frame_size.width(), |
| 215 frame_format.frame_size.height()); | 225 frame_format.frame_size.height()); |
| 216 format_ = frame_format; | 226 format_ = frame_format; |
| 217 } | 227 } |
| 218 ASSERT_EQ(format_.frame_size.width(), frame_format.frame_size.width()) | 228 ASSERT_EQ(format_.frame_size.width(), frame_format.frame_size.width()) |
| 219 << "Dump format does not handle variable resolution."; | 229 << "Dump format does not handle variable resolution."; |
| 220 ASSERT_EQ(format_.frame_size.height(), frame_format.frame_size.height()) | 230 ASSERT_EQ(format_.frame_size.height(), frame_format.frame_size.height()) |
| 221 << "Dump format does not handle variable resolution."; | 231 << "Dump format does not handle variable resolution."; |
| 222 dumper_.NewVideoFrame(dib->memory()); | 232 dumper_.NewVideoFrame(dib->memory()); |
| 223 } | 233 } |
| 224 | 234 |
| 225 OnBufferFilled(device_id, buffer_id, timestamp, frame_format); | 235 OnBufferFilled(device_id, buffer_id, frame_format, timestamp); |
| 226 if (return_buffers_) { | 236 if (return_buffers_) { |
| 227 VideoCaptureHost::OnReceiveEmptyBuffer(device_id, buffer_id); | 237 VideoCaptureHost::OnReceiveEmptyBuffer(device_id, buffer_id, 0); |
| 228 } | 238 } |
| 229 } | 239 } |
| 230 | 240 |
| 241 void OnMailboxBufferFilledDispatch(int device_id, |
| 242 int buffer_id, |
| 243 const gpu::MailboxHolder& mailbox_holder, |
| 244 const media::VideoCaptureFormat& format, |
| 245 base::TimeTicks timestamp) { |
| 246 OnMailboxBufferFilled( |
| 247 device_id, buffer_id, mailbox_holder, format, timestamp); |
| 248 if (return_buffers_) { |
| 249 VideoCaptureHost::OnReceiveEmptyBuffer( |
| 250 device_id, buffer_id, mailbox_holder.sync_point); |
| 251 } |
| 252 } |
| 253 |
| 231 void OnStateChangedDispatch(int device_id, VideoCaptureState state) { | 254 void OnStateChangedDispatch(int device_id, VideoCaptureState state) { |
| 232 OnStateChanged(device_id, state); | 255 OnStateChanged(device_id, state); |
| 233 } | 256 } |
| 234 | 257 |
| 235 std::map<int, base::SharedMemory*> filled_dib_; | 258 std::map<int, base::SharedMemory*> filled_dib_; |
| 236 bool return_buffers_; | 259 bool return_buffers_; |
| 237 bool dump_video_; | 260 bool dump_video_; |
| 238 media::VideoCaptureFormat format_; | 261 media::VideoCaptureFormat format_; |
| 239 DumpVideo dumper_; | 262 DumpVideo dumper_; |
| 240 }; | 263 }; |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 #ifdef DUMP_VIDEO | 526 #ifdef DUMP_VIDEO |
| 504 TEST_F(VideoCaptureHostTest, CaptureAndDumpVideoVga) { | 527 TEST_F(VideoCaptureHostTest, CaptureAndDumpVideoVga) { |
| 505 CaptureAndDumpVideo(640, 480, 30); | 528 CaptureAndDumpVideo(640, 480, 30); |
| 506 } | 529 } |
| 507 TEST_F(VideoCaptureHostTest, CaptureAndDump720P) { | 530 TEST_F(VideoCaptureHostTest, CaptureAndDump720P) { |
| 508 CaptureAndDumpVideo(1280, 720, 30); | 531 CaptureAndDumpVideo(1280, 720, 30); |
| 509 } | 532 } |
| 510 #endif | 533 #endif |
| 511 | 534 |
| 512 } // namespace content | 535 } // namespace content |
| OLD | NEW |