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 3 // found in the LICENSE file. 4 5 #ifndef MEDIA_VIDEO_CAPTURE_ANDROID_VIDEO_CAPTURE_DEVICE_ANDROID_H_ 6 #define MEDIA_VIDEO_CAPTURE_ANDROID_VIDEO_CAPTURE_DEVICE_ANDROID_H_ 7 8 #include <jni.h> 9 #include <string> 10 11 #include "base/android/scoped_java_ref.h" 12 #include "base/synchronization/lock.h" 13 #include "base/threading/thread.h" 14 #include "base/time/time.h" 15 #include "media/base/media_export.h" 16 #include "media/video/capture/video_capture_device.h" 17 18 namespace media { 19 20 // VideoCaptureDevice on Android. The VideoCaptureDevice API's are called 21 // by VideoCaptureManager on its own thread, while OnFrameAvailable is called 22 // on JAVA thread (i.e., UI thread). Both will access |state_| and |client_|, 23 // but only VideoCaptureManager would change their value. 24 class MEDIA_EXPORT VideoCaptureDeviceAndroid : public VideoCaptureDevice { 25 public: 26 // Automatically generated enum to interface with Java world. 27 enum AndroidImageFormat { 28 #define DEFINE_ANDROID_IMAGEFORMAT(name, value) name = value, 29 #include "media/video/capture/android/imageformat_list.h" 30 #undef DEFINE_ANDROID_IMAGEFORMAT 31 }; 32 33 explicit VideoCaptureDeviceAndroid(const Name& device_name); 34 virtual ~VideoCaptureDeviceAndroid(); 35 36 static VideoCaptureDevice* Create(const Name& device_name); 37 static bool RegisterVideoCaptureDevice(JNIEnv* env); 38 39 // Registers the Java VideoCaptureDevice pointer, used by the rest of the 40 // methods of the class to operate the Java capture code. This method must be 41 // called after the class constructor and before AllocateAndStart(). 42 bool Init(); 43 44 // VideoCaptureDevice implementation. 45 virtual void AllocateAndStart(const VideoCaptureParams& params, 46 scoped_ptr<Client> client) OVERRIDE; 47 virtual void StopAndDeAllocate() OVERRIDE; 48 49 // Implement org.chromium.media.VideoCapture.nativeOnFrameAvailable. 50 void OnFrameAvailable( 51 JNIEnv* env, 52 jobject obj, 53 jbyteArray data, 54 jint length, 55 jint rotation); 56 57 private: 58 enum InternalState { 59 kIdle, // The device is opened but not in use. 60 kCapturing, // Video is being captured. 61 kError // Hit error. User needs to recover by destroying the object. 62 }; 63 64 VideoPixelFormat GetColorspace(); 65 void SetErrorState(const std::string& reason); 66 67 // Prevent racing on accessing |state_| and |client_| since both could be 68 // accessed from different threads. 69 base::Lock lock_; 70 InternalState state_; 71 bool got_first_frame_; 72 base::TimeTicks expected_next_frame_time_; 73 base::TimeDelta frame_interval_; 74 scoped_ptr<VideoCaptureDevice::Client> client_; 75 76 Name device_name_; 77 VideoCaptureFormat capture_format_; 78 79 // Java VideoCaptureAndroid instance. 80 base::android::ScopedJavaLocalRef<jobject> j_capture_; 81 82 DISALLOW_IMPLICIT_CONSTRUCTORS(VideoCaptureDeviceAndroid); 83 }; 84 85 } // namespace media 86 87 #endif // MEDIA_VIDEO_CAPTURE_ANDROID_VIDEO_CAPTURE_DEVICE_ANDROID_H_ 88