Home | History | Annotate | Download | only in android
      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