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/capture/video/android/video_capture_device_android.h" | 5 #include "media/capture/video/android/video_capture_device_android.h" |
6 | 6 |
7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
8 #include "base/android/jni_string.h" | 8 #include "base/android/jni_string.h" |
9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
10 #include "jni/VideoCapture_jni.h" | 10 #include "jni/VideoCapture_jni.h" |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 got_first_frame_ = false; | 61 got_first_frame_ = false; |
62 } | 62 } |
63 | 63 |
64 JNIEnv* env = AttachCurrentThread(); | 64 JNIEnv* env = AttachCurrentThread(); |
65 | 65 |
66 jboolean ret = Java_VideoCapture_allocate( | 66 jboolean ret = Java_VideoCapture_allocate( |
67 env, j_capture_.obj(), params.requested_format.frame_size.width(), | 67 env, j_capture_.obj(), params.requested_format.frame_size.width(), |
68 params.requested_format.frame_size.height(), | 68 params.requested_format.frame_size.height(), |
69 params.requested_format.frame_rate); | 69 params.requested_format.frame_rate); |
70 if (!ret) { | 70 if (!ret) { |
71 SetErrorState("failed to allocate"); | 71 SetErrorState(FROM_HERE, "failed to allocate"); |
72 return; | 72 return; |
73 } | 73 } |
74 | 74 |
75 // Store current width and height. | 75 // Store current width and height. |
76 capture_format_.frame_size.SetSize( | 76 capture_format_.frame_size.SetSize( |
77 Java_VideoCapture_queryWidth(env, j_capture_.obj()), | 77 Java_VideoCapture_queryWidth(env, j_capture_.obj()), |
78 Java_VideoCapture_queryHeight(env, j_capture_.obj())); | 78 Java_VideoCapture_queryHeight(env, j_capture_.obj())); |
79 capture_format_.frame_rate = | 79 capture_format_.frame_rate = |
80 Java_VideoCapture_queryFrameRate(env, j_capture_.obj()); | 80 Java_VideoCapture_queryFrameRate(env, j_capture_.obj()); |
81 capture_format_.pixel_format = GetColorspace(); | 81 capture_format_.pixel_format = GetColorspace(); |
82 DCHECK_NE(capture_format_.pixel_format, media::PIXEL_FORMAT_UNKNOWN); | 82 DCHECK_NE(capture_format_.pixel_format, media::PIXEL_FORMAT_UNKNOWN); |
83 CHECK(capture_format_.frame_size.GetArea() > 0); | 83 CHECK(capture_format_.frame_size.GetArea() > 0); |
84 CHECK(!(capture_format_.frame_size.width() % 2)); | 84 CHECK(!(capture_format_.frame_size.width() % 2)); |
85 CHECK(!(capture_format_.frame_size.height() % 2)); | 85 CHECK(!(capture_format_.frame_size.height() % 2)); |
86 | 86 |
87 if (capture_format_.frame_rate > 0) { | 87 if (capture_format_.frame_rate > 0) { |
88 frame_interval_ = base::TimeDelta::FromMicroseconds( | 88 frame_interval_ = base::TimeDelta::FromMicroseconds( |
89 (base::Time::kMicrosecondsPerSecond + capture_format_.frame_rate - 1) / | 89 (base::Time::kMicrosecondsPerSecond + capture_format_.frame_rate - 1) / |
90 capture_format_.frame_rate); | 90 capture_format_.frame_rate); |
91 } | 91 } |
92 | 92 |
93 DVLOG(1) << "VideoCaptureDeviceAndroid::Allocate: queried frame_size=" | 93 DVLOG(1) << "VideoCaptureDeviceAndroid::Allocate: queried frame_size=" |
94 << capture_format_.frame_size.ToString() | 94 << capture_format_.frame_size.ToString() |
95 << ", frame_rate=" << capture_format_.frame_rate; | 95 << ", frame_rate=" << capture_format_.frame_rate; |
96 | 96 |
97 ret = Java_VideoCapture_startCapture(env, j_capture_.obj()); | 97 ret = Java_VideoCapture_startCapture(env, j_capture_.obj()); |
98 if (!ret) { | 98 if (!ret) { |
99 SetErrorState("failed to start capture"); | 99 SetErrorState(FROM_HERE, "failed to start capture"); |
100 return; | 100 return; |
101 } | 101 } |
102 | 102 |
103 { | 103 { |
104 base::AutoLock lock(lock_); | 104 base::AutoLock lock(lock_); |
105 state_ = kCapturing; | 105 state_ = kCapturing; |
106 } | 106 } |
107 } | 107 } |
108 | 108 |
109 void VideoCaptureDeviceAndroid::StopAndDeAllocate() { | 109 void VideoCaptureDeviceAndroid::StopAndDeAllocate() { |
110 DVLOG(1) << "VideoCaptureDeviceAndroid::StopAndDeAllocate"; | 110 DVLOG(1) << "VideoCaptureDeviceAndroid::StopAndDeAllocate"; |
111 { | 111 { |
112 base::AutoLock lock(lock_); | 112 base::AutoLock lock(lock_); |
113 if (state_ != kCapturing && state_ != kError) | 113 if (state_ != kCapturing && state_ != kError) |
114 return; | 114 return; |
115 } | 115 } |
116 | 116 |
117 JNIEnv* env = AttachCurrentThread(); | 117 JNIEnv* env = AttachCurrentThread(); |
118 | 118 |
119 jboolean ret = Java_VideoCapture_stopCapture(env, j_capture_.obj()); | 119 jboolean ret = Java_VideoCapture_stopCapture(env, j_capture_.obj()); |
120 if (!ret) { | 120 if (!ret) { |
121 SetErrorState("failed to stop capture"); | 121 SetErrorState(FROM_HERE, "failed to stop capture"); |
122 return; | 122 return; |
123 } | 123 } |
124 | 124 |
125 { | 125 { |
126 base::AutoLock lock(lock_); | 126 base::AutoLock lock(lock_); |
127 state_ = kIdle; | 127 state_ = kIdle; |
128 client_.reset(); | 128 client_.reset(); |
129 } | 129 } |
130 | 130 |
131 Java_VideoCapture_deallocate(env, j_capture_.obj()); | 131 Java_VideoCapture_deallocate(env, j_capture_.obj()); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 capture_format_, rotation, | 164 capture_format_, rotation, |
165 base::TimeTicks::Now()); | 165 base::TimeTicks::Now()); |
166 } | 166 } |
167 | 167 |
168 env->ReleaseByteArrayElements(data, buffer, JNI_ABORT); | 168 env->ReleaseByteArrayElements(data, buffer, JNI_ABORT); |
169 } | 169 } |
170 | 170 |
171 void VideoCaptureDeviceAndroid::OnError(JNIEnv* env, | 171 void VideoCaptureDeviceAndroid::OnError(JNIEnv* env, |
172 jobject obj, | 172 jobject obj, |
173 jstring message) { | 173 jstring message) { |
174 SetErrorState(base::android::ConvertJavaStringToUTF8(env, message)); | 174 SetErrorState(FROM_HERE, |
| 175 base::android::ConvertJavaStringToUTF8(env, message)); |
175 } | 176 } |
176 | 177 |
177 VideoPixelFormat VideoCaptureDeviceAndroid::GetColorspace() { | 178 VideoPixelFormat VideoCaptureDeviceAndroid::GetColorspace() { |
178 JNIEnv* env = AttachCurrentThread(); | 179 JNIEnv* env = AttachCurrentThread(); |
179 const int current_capture_colorspace = | 180 const int current_capture_colorspace = |
180 Java_VideoCapture_getColorspace(env, j_capture_.obj()); | 181 Java_VideoCapture_getColorspace(env, j_capture_.obj()); |
181 switch (current_capture_colorspace) { | 182 switch (current_capture_colorspace) { |
182 case ANDROID_IMAGE_FORMAT_YV12: | 183 case ANDROID_IMAGE_FORMAT_YV12: |
183 return media::PIXEL_FORMAT_YV12; | 184 return media::PIXEL_FORMAT_YV12; |
184 case ANDROID_IMAGE_FORMAT_YUV_420_888: | 185 case ANDROID_IMAGE_FORMAT_YUV_420_888: |
185 return media::PIXEL_FORMAT_I420; | 186 return media::PIXEL_FORMAT_I420; |
186 case ANDROID_IMAGE_FORMAT_NV21: | 187 case ANDROID_IMAGE_FORMAT_NV21: |
187 return media::PIXEL_FORMAT_NV21; | 188 return media::PIXEL_FORMAT_NV21; |
188 case ANDROID_IMAGE_FORMAT_UNKNOWN: | 189 case ANDROID_IMAGE_FORMAT_UNKNOWN: |
189 default: | 190 default: |
190 return media::PIXEL_FORMAT_UNKNOWN; | 191 return media::PIXEL_FORMAT_UNKNOWN; |
191 } | 192 } |
192 } | 193 } |
193 | 194 |
194 void VideoCaptureDeviceAndroid::SetErrorState(const std::string& reason) { | 195 void VideoCaptureDeviceAndroid::SetErrorState( |
| 196 const tracked_objects::Location& from_here, |
| 197 const std::string& reason) { |
195 { | 198 { |
196 base::AutoLock lock(lock_); | 199 base::AutoLock lock(lock_); |
197 state_ = kError; | 200 state_ = kError; |
198 } | 201 } |
199 client_->OnError(reason); | 202 client_->OnError(from_here, reason); |
200 } | 203 } |
201 | 204 |
202 } // namespace media | 205 } // namespace media |
OLD | NEW |