| 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 |