OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "media/video/capture/android/video_capture_device_android.h" | 5 #include "media/video/capture/android/video_capture_device_android.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/android/jni_android.h" | 9 #include "base/android/jni_android.h" |
10 #include "base/android/jni_string.h" | 10 #include "base/android/jni_string.h" |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 return ret.release(); | 79 return ret.release(); |
80 return NULL; | 80 return NULL; |
81 } | 81 } |
82 | 82 |
83 // static | 83 // static |
84 bool VideoCaptureDeviceAndroid::RegisterVideoCaptureDevice(JNIEnv* env) { | 84 bool VideoCaptureDeviceAndroid::RegisterVideoCaptureDevice(JNIEnv* env) { |
85 return RegisterNativesImpl(env); | 85 return RegisterNativesImpl(env); |
86 } | 86 } |
87 | 87 |
88 VideoCaptureDeviceAndroid::VideoCaptureDeviceAndroid(const Name& device_name) | 88 VideoCaptureDeviceAndroid::VideoCaptureDeviceAndroid(const Name& device_name) |
89 : state_(kIdle), got_first_frame_(false), device_name_(device_name) {} | 89 : state_(kIdle), |
| 90 got_first_frame_(false), |
| 91 device_name_(device_name), |
| 92 current_settings_() { |
| 93 } |
90 | 94 |
91 VideoCaptureDeviceAndroid::~VideoCaptureDeviceAndroid() { | 95 VideoCaptureDeviceAndroid::~VideoCaptureDeviceAndroid() { |
92 StopAndDeAllocate(); | 96 StopAndDeAllocate(); |
93 } | 97 } |
94 | 98 |
95 bool VideoCaptureDeviceAndroid::Init() { | 99 bool VideoCaptureDeviceAndroid::Init() { |
96 int id; | 100 int id; |
97 if (!base::StringToInt(device_name_.id(), &id)) | 101 if (!base::StringToInt(device_name_.id(), &id)) |
98 return false; | 102 return false; |
99 | 103 |
100 JNIEnv* env = AttachCurrentThread(); | 104 JNIEnv* env = AttachCurrentThread(); |
101 | 105 |
102 j_capture_.Reset(Java_VideoCapture_createVideoCapture( | 106 j_capture_.Reset(Java_VideoCapture_createVideoCapture( |
103 env, base::android::GetApplicationContext(), id, | 107 env, base::android::GetApplicationContext(), id, |
104 reinterpret_cast<intptr_t>(this))); | 108 reinterpret_cast<intptr_t>(this))); |
105 | 109 |
106 return true; | 110 return true; |
107 } | 111 } |
108 | 112 |
109 void VideoCaptureDeviceAndroid::AllocateAndStart( | 113 void VideoCaptureDeviceAndroid::AllocateAndStart( |
110 const VideoCaptureParams& params, | 114 const VideoCaptureCapability& capture_format, |
111 scoped_ptr<Client> client) { | 115 scoped_ptr<Client> client) { |
112 DVLOG(1) << "VideoCaptureDeviceAndroid::AllocateAndStart"; | 116 DVLOG(1) << "VideoCaptureDeviceAndroid::AllocateAndStart"; |
113 { | 117 { |
114 base::AutoLock lock(lock_); | 118 base::AutoLock lock(lock_); |
115 if (state_ != kIdle) | 119 if (state_ != kIdle) |
116 return; | 120 return; |
117 client_ = client.Pass(); | 121 client_ = client.Pass(); |
118 got_first_frame_ = false; | 122 got_first_frame_ = false; |
119 } | 123 } |
120 | 124 |
121 JNIEnv* env = AttachCurrentThread(); | 125 JNIEnv* env = AttachCurrentThread(); |
122 | 126 |
123 jboolean ret = | 127 jboolean ret = Java_VideoCapture_allocate(env, |
124 Java_VideoCapture_allocate(env, | 128 j_capture_.obj(), |
125 j_capture_.obj(), | 129 capture_format.width, |
126 params.requested_format.frame_size.width(), | 130 capture_format.height, |
127 params.requested_format.frame_size.height(), | 131 capture_format.frame_rate); |
128 params.requested_format.frame_rate); | |
129 if (!ret) { | 132 if (!ret) { |
130 SetErrorState("failed to allocate"); | 133 SetErrorState("failed to allocate"); |
131 return; | 134 return; |
132 } | 135 } |
133 | 136 |
134 // Store current width and height. | 137 // Store current width and height. |
135 capture_format_.frame_size.SetSize( | 138 current_settings_.width = |
136 Java_VideoCapture_queryWidth(env, j_capture_.obj()), | 139 Java_VideoCapture_queryWidth(env, j_capture_.obj()); |
137 Java_VideoCapture_queryHeight(env, j_capture_.obj())); | 140 current_settings_.height = |
138 capture_format_.frame_rate = | 141 Java_VideoCapture_queryHeight(env, j_capture_.obj()); |
| 142 current_settings_.frame_rate = |
139 Java_VideoCapture_queryFrameRate(env, j_capture_.obj()); | 143 Java_VideoCapture_queryFrameRate(env, j_capture_.obj()); |
140 capture_format_.pixel_format = GetColorspace(); | 144 current_settings_.color = GetColorspace(); |
141 DCHECK_NE(capture_format_.pixel_format, media::PIXEL_FORMAT_UNKNOWN); | 145 DCHECK_NE(current_settings_.color, media::PIXEL_FORMAT_UNKNOWN); |
142 CHECK(capture_format_.frame_size.GetArea() > 0); | 146 CHECK(current_settings_.width > 0 && !(current_settings_.width % 2)); |
143 CHECK(!(capture_format_.frame_size.width() % 2)); | 147 CHECK(current_settings_.height > 0 && !(current_settings_.height % 2)); |
144 CHECK(!(capture_format_.frame_size.height() % 2)); | |
145 | 148 |
146 if (capture_format_.frame_rate > 0) { | 149 if (capture_format.frame_rate > 0) { |
147 frame_interval_ = base::TimeDelta::FromMicroseconds( | 150 frame_interval_ = base::TimeDelta::FromMicroseconds( |
148 (base::Time::kMicrosecondsPerSecond + capture_format_.frame_rate - 1) / | 151 (base::Time::kMicrosecondsPerSecond + capture_format.frame_rate - 1) / |
149 capture_format_.frame_rate); | 152 capture_format.frame_rate); |
150 } | 153 } |
151 | 154 |
152 DVLOG(1) << "VideoCaptureDeviceAndroid::Allocate: queried frame_size=" | 155 DVLOG(1) << "VideoCaptureDeviceAndroid::Allocate: queried width=" |
153 << capture_format_.frame_size.ToString() | 156 << current_settings_.width |
154 << ", frame_rate=" << capture_format_.frame_rate; | 157 << ", height=" |
| 158 << current_settings_.height |
| 159 << ", frame_rate=" |
| 160 << current_settings_.frame_rate; |
155 | 161 |
156 jint result = Java_VideoCapture_startCapture(env, j_capture_.obj()); | 162 jint result = Java_VideoCapture_startCapture(env, j_capture_.obj()); |
157 if (result < 0) { | 163 if (result < 0) { |
158 SetErrorState("failed to start capture"); | 164 SetErrorState("failed to start capture"); |
159 return; | 165 return; |
160 } | 166 } |
161 | 167 |
162 { | 168 { |
163 base::AutoLock lock(lock_); | 169 base::AutoLock lock(lock_); |
164 state_ = kCapturing; | 170 state_ = kCapturing; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 // Deliver the frame when it doesn't arrive too early. | 227 // Deliver the frame when it doesn't arrive too early. |
222 if (expected_next_frame_time_ <= current_time) { | 228 if (expected_next_frame_time_ <= current_time) { |
223 expected_next_frame_time_ += frame_interval_; | 229 expected_next_frame_time_ += frame_interval_; |
224 | 230 |
225 client_->OnIncomingCapturedFrame(reinterpret_cast<uint8*>(buffer), | 231 client_->OnIncomingCapturedFrame(reinterpret_cast<uint8*>(buffer), |
226 length, | 232 length, |
227 base::Time::Now(), | 233 base::Time::Now(), |
228 rotation, | 234 rotation, |
229 flip_vert, | 235 flip_vert, |
230 flip_horiz, | 236 flip_horiz, |
231 capture_format_); | 237 current_settings_); |
232 } | 238 } |
233 | 239 |
234 env->ReleaseByteArrayElements(data, buffer, JNI_ABORT); | 240 env->ReleaseByteArrayElements(data, buffer, JNI_ABORT); |
235 } | 241 } |
236 | 242 |
237 VideoPixelFormat VideoCaptureDeviceAndroid::GetColorspace() { | 243 VideoPixelFormat VideoCaptureDeviceAndroid::GetColorspace() { |
238 JNIEnv* env = AttachCurrentThread(); | 244 JNIEnv* env = AttachCurrentThread(); |
239 int current_capture_colorspace = | 245 int current_capture_colorspace = |
240 Java_VideoCapture_getColorspace(env, j_capture_.obj()); | 246 Java_VideoCapture_getColorspace(env, j_capture_.obj()); |
241 switch (current_capture_colorspace){ | 247 switch (current_capture_colorspace){ |
(...skipping 16 matching lines...) Expand all Loading... |
258 void VideoCaptureDeviceAndroid::SetErrorState(const std::string& reason) { | 264 void VideoCaptureDeviceAndroid::SetErrorState(const std::string& reason) { |
259 LOG(ERROR) << "VideoCaptureDeviceAndroid::SetErrorState: " << reason; | 265 LOG(ERROR) << "VideoCaptureDeviceAndroid::SetErrorState: " << reason; |
260 { | 266 { |
261 base::AutoLock lock(lock_); | 267 base::AutoLock lock(lock_); |
262 state_ = kError; | 268 state_ = kError; |
263 } | 269 } |
264 client_->OnError(); | 270 client_->OnError(); |
265 } | 271 } |
266 | 272 |
267 } // namespace media | 273 } // namespace media |
OLD | NEW |