android8.1上新增camera设备

    在工作中,camera这一块上,可能会有各种各样的需求。比如有人想新增一个虚拟摄像头,当用户app打开摄像头设备时,打开的不是系统默认的camera hal代码,而是自己指定的代码,用自己事先准备好的视频数据,来喂给app;也有人想在系统默认的一套app框架上,新增一个外接的usbcamera,并且要能溶入到camera框架中。app只需要指定usbcamera的id,就能像打开普通摄像头那样,去打开我们的usbcamera;也有人,想在现有的框架上,同时兼容老的hal1+api1流程的android8.0之前的camera,又想新增一个符合android8.0的hidl接口规范的camera模块。

        上面所有的需求,归纳起来,核心的就是一点,即如何去新增一个camera hal模块。我这篇博客,是以在mtk android8.0上新增一个usbcamera hal模块来讲的。当然,新增虚拟摄像头,流程跟这个也是一模一样的。

        好了,既然是想在android8.0上新增一套符合hidl接口规范的camera流程,那么我们先要了解一下,android原生的hidl接口下的camera流程,下面我们先讲一讲这块。

        在android8.0之前,frameworks层的cameraservice和hal层的camera代码是在同一个进程的,这样不利于hal层部份独立升级。针对这个问题,8.0后,就推出了hidl机制,将frameworks层和hal层分成了两个进程,从而进行了解耦。借用网上的一张图片来大致的表明下这个区别:

        这么一来,看似调用变复杂了,但其实是殊途同归,hal层代码和之前基本上没有变化。具体到camera而言,就是在frameworks层和hal层中间,增加了一个cameraProvider来做为两方联系的桥梁。现在的调用流程,再借网上一张图一用:

        接下来以上面这张图来大致的说一下调用流程:

        1.) 开机注册cameraProvider(cameraProvider里会和具体的camera hal层对应起来)

        2.) 开机实例化cameraService

        3.) 查找并列出所有的cameraProvider(这一步会通过hw_get_module来将camera的hal层代码load出来)

        这基本上就是camera开机后从frameworks加载到hal层的路线了。下面再具体一步步来分析。

 

开机注册cameraProvider

        在我们的hardware\interfaces\camera\provider\2.4\default目录下,有一个android.hardware.camera.provider@2.4-service.rc文件

 
  1. service camera-provider-2-4 /vendor/bin/hw/android.hardware.camera.provider@2.4-service

  2. class hal

  3. user cameraserver

  4. group audio camera input drmrpc

  5. ioprio rt 4

  6. capabilities SYS_NICE

  7. writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks

        当开机时,会自动调用这个文件去启动服务camera-provider-2-4,然后它会调用到/vendor/bin/hw/android.hardware.camera.provider@2.4-service这个文件。然后会调到hardware\interfaces\camera\provider\2.4\default\service.cpp

 
  1. int main()

  2. {

  3. ALOGI("Camera provider Service is starting.");

  4. // The camera HAL may communicate to other vendor components via

  5. // /dev/vndbinder

  6. android::ProcessState::initWithDriver("/dev/vndbinder");

  7. return defaultPassthroughServiceImplementation<ICameraProvider>("legacy/0", /*maxThreads*/ 6);

  8. }

        然后这里会用hidl的标准接口去将我们的"legacy/0"注册到服务上去。

 
  1. system\libhidl\transport\include\hidl\LegacySupport.h

  2.  
  3. template<class Interface>

  4. __attribute__((warn_unused_result))

  5. status_t defaultPassthroughServiceImplementation(std::string name,

  6. size_t maxThreads = 1) {

  7. configureRpcThreadpool(maxThreads, true);

  8. status_t result = registerPassthroughServiceImplementation<Interface>(name);

  9.  
  10. if (result != OK) {

  11. return result;

  12. }

  13.  
  14. joinRpcThreadpool();

  15. return 0;

  16. }

        在这里有一点要注意,这里的"legacy/0"必须要先在工程根目录 device/***/芯片名/manifest.xml里先声明,否则即使这里注册了,后面也会因为找不到而报错.

 
  1. <hal format="hidl">

  2. <name>android.hardware.camera.provider</name>

  3. <transport>hwbinder</transport>

  4. <version>2.4</version>

  5. <interface>

  6. <name>ICameraProvider</name>

  7. <instance>legacy/0</instance>

  8. </interface>

  9. </hal>

 

开机实例化cameraService

        在frameworks\av\camera\cameraserver里有个cameraserver.rc, 它在开机的时候,也会自动启动.

 
  1. service cameraserver /system/bin/cameraserver

  2. class main

  3. user cameraserver

  4. group audio camera input drmrpc

  5. ioprio rt 4

  6. writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks

        然后它会调用到frameworks\av\camera\cameraserver\main_cameraserver.cpp

 
  1. int main(int argc __unused, char** argv __unused)

  2. {

  3. signal(SIGPIPE, SIG_IGN);

  4.  
  5. //!++

  6. #if 0

  7. // Set 3 threads for HIDL calls

  8. hardware::configureRpcThreadpool(3, /*willjoin*/ false);

  9. #else

  10. // Set 6 threads for HIDL calls, features need more threads to handle preview+capture

  11. hardware::configureRpcThreadpool(6, /*willjoin*/ false);

  12. #endif

  13. //!--

  14.  
  15. sp<ProcessState> proc(ProcessState::self());

  16. sp<IServiceManager> sm = defaultServiceManager();

  17. ALOGI("ServiceManager: %p", sm.get());

  18. CameraService::instantiate();

  19. ProcessState::self()->startThreadPool();

  20. IPCThreadState::self()->joinThreadPool();

  21. }

       在这个main函数里,我们只需要关注CameraService::instantiate();这行代码. 我们的CameraService继承了BinderService.h.这个:instantiate()调用到了BinderService.h里的代码

 
  1. frameworks\native\libs\binder\include\binder\BinderService.h

  2.  
  3. template<typename SERVICE>

  4. class BinderService

  5. {

  6. public:

  7. static status_t publish(bool allowIsolated = false) {

  8. sp<IServiceManager> sm(defaultServiceManager());

  9. return sm->addService(

  10. String16(SERVICE::getServiceName()),

  11. new SERVICE(), allowIsolated);

  12. }

  13.  
  14. static void publishAndJoinThreadPool(bool allowIsolated = false) {

  15. publish(allowIsolated);

  16. joinThreadPool();

  17. }

  18.  
  19. static void instantiate() { publish(); }

  20.  
  21. static status_t shutdown() { return NO_ERROR; }

  22.  
  23. private:

  24. static void joinThreadPool() {

  25. sp<ProcessState> ps(ProcessState::self());

  26. ps->startThreadPool();

  27. ps->giveThreadPoolName();

  28. IPCThreadState::self()->joinThreadPool();

  29. }

  30. };

  31.  
  32.  
  33. }; // namespa

        从这个文件可以看出,instantiate最终还是调用到了IServiceManager里的addService, 将我们的cameraService注册到了系统的服务管理器里去了.

        这里调用到CameraService后, 因为是开机第一次调用,它的引用计数为1,所以会调用到CameraService::onFirstRef()这个函数. 这个函数是从CameraService的父类RefBase里继承过来的.该函数在强引用sp新增引用计数时调用,什么意思?就是当 有sp包装的类初始化的时候调用.我们再看看cameraService::onFirstRef()

 
  1. frameworks\av\services\camera\libcameraservice\CameraService.cpp

  2.  
  3. void CameraService::onFirstRef()

  4. {

  5. ALOGI("CameraService process starting");

  6.  
  7. BnCameraService::onFirstRef();

  8.  
  9. // Update battery life tracking if service is restarting

  10. BatteryNotifier& notifier(BatteryNotifier::getInstance());

  11. notifier.noteResetCamera();

  12. notifier.noteResetFlashlight();

  13.  
  14. status_t res = INVALID_OPERATION;

  15.  
  16. res = enumerateProviders();

  17. if (res == OK) {

  18. mInitialized = true;

  19. }

  20.  
  21. CameraService::pingCameraServiceProxy();

  22. }

        在这个函数里,我们只关注enumerateProviders(),这里就到了列出所有cameraProvider.

 

查找并列出所有的cameraProvider

        

 
  1.  
  2. status_t CameraService::enumerateProviders() {

  3. status_t res;

  4. Mutex::Autolock l(mServiceLock);

  5.  
  6. if (nullptr == mCameraProviderManager.get()) {

  7. mCameraProviderManager = new CameraProviderManager();

  8. res = mCameraProviderManager->initialize(this);

  9. ......

  10. }

  11. ......

  12. }

        这个函数里,创建了一个CameraProviderManager对象,并调进行了初始化.

 
  1. frameworks\av\services\camera\libcameraservice\common\CameraProviderManager.cpp

  2.  
  3. status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener,

  4. ServiceInteractionProxy* proxy) {

  5. std::lock_guard<std::mutex> lock(mInterfaceMutex);

  6. if (proxy == nullptr) {

  7. ALOGE("%s: No valid service interaction proxy provided", __FUNCTION__);

  8. return BAD_VALUE;

  9. }

  10. mListener = listener;

  11. mServiceProxy = proxy;

  12.  
  13. // Registering will trigger notifications for all already-known providers

  14. bool success = mServiceProxy->registerForNotifications(

  15. /* instance name, empty means no filter */ "",

  16. this);

  17. if (!success) {

  18. ALOGE("%s: Unable to register with hardware service manager for notifications "

  19. "about camera providers", __FUNCTION__);

  20. return INVALID_OPERATION;

  21. }

  22.  
  23. // See if there's a passthrough HAL, but let's not complain if there's not

  24. addProviderLocked(kLegacyProviderName, /*expected*/ false);

  25.  
  26. return OK;

  27. }

        在这个初始化函数里,我们只关注addProviderLocked, 我们可以看到,这个函数传进了一个kLegacyProviderName, 它的值定义在这个文件的上面:

        const std::string kLegacyProviderName("legacy/0");

        大家注意到了没有,它的值和我们之前hardware\interfaces\camera\provider\2.4\default\service.cpp里注册服务时return defaultPassthroughServiceImplementation<ICameraProvider>("legacy/0", /*maxThreads*/ 6); 以及manifest.xml里<instance>legacy/0</instance>的值都是一致的. 如果这个值不致,则会调用不成功.

        好了,再回到addProviderLocked这个函数来, 这个函数的作用, 就是去加载camera对应的hal层代码, 并将它的信息保存在ProviderInfo里,后面我们就可以通过这个ProviderInfo, 去实行addDevice、getCameraInfo等操作。

 
  1. status_t CameraProviderManager::addProviderLocked(const std::string& newProvider, bool expected) {

  2. for (const auto& providerInfo : mProviders) {

  3. if (providerInfo->mProviderName == newProvider) {

  4. ALOGW("%s: Camera provider HAL with name '%s' already registered", __FUNCTION__,

  5. newProvider.c_str());

  6. return ALREADY_EXISTS;

  7. }

  8. }

  9.  
  10. sp<provider::V2_4::ICameraProvider> interface;

  11. interface = mServiceProxy->getService(newProvider);

  12.  
  13. if (interface == nullptr) {

  14. if (expected) {

  15. ALOGE("%s: Camera provider HAL '%s' is not actually available", __FUNCTION__,

  16. newProvider.c_str());

  17. return BAD_VALUE;

  18. } else {

  19. return OK;

  20. }

  21. }

  22.  
  23. sp<ProviderInfo> providerInfo =

  24. new ProviderInfo(newProvider, interface, this);

  25. status_t res = providerInfo->initialize();

  26. if (res != OK) {

  27. return res;

  28. }

  29.  
  30. mProviders.push_back(providerInfo);

  31.  
  32. return OK;

  33. }

        这里先检查一下,传进来的newProvider是不是已经添加过,如果已经添加了,就不再处理,直接返回。如果没添加过,就会进行下一步的操作。这里的interface = mServiceProxy->getService(newProvider);,会调用到hardware\interfaces\camera\provider\2.4\default\CameraProvider.cpp的HIDL_FETCH_ICameraProvider函数。

 
  1. ICameraProvider* HIDL_FETCH_ICameraProvider(const char* name) {

  2. if (strcmp(name, kLegacyProviderName) != 0) {

  3. return nullptr;

  4. }

  5. CameraProvider* provider = new CameraProvider();

  6. if (provider == nullptr) {

  7. ALOGE("%s: cannot allocate camera provider!", __FUNCTION__);

  8. return nullptr;

  9. }

  10. if (provider->isInitFailed()) {

  11. ALOGE("%s: camera provider init failed!", __FUNCTION__);

  12. delete provider;

  13. return nullptr;

  14. }

  15. return provider;

  16. }

        在这个函数里,会创建一个CameraProvider对象。

 
  1. CameraProvider::CameraProvider() :

  2. camera_module_callbacks_t({sCameraDeviceStatusChange,

  3. sTorchModeStatusChange}) {

  4. mInitFailed = initialize();

  5. }

 
  1. bool CameraProvider::initialize() {

  2. camera_module_t *rawModule;

  3.  
  4. int err = hw_get_module("camera", (const hw_module_t **)&rawModule);

  5. if (err < 0) {

  6. ALOGE("Could not load camera HAL module: %d (%s)", err, strerror(-err));

  7. return true;

  8. }

  9.  
  10. mModule = new CameraModule(rawModule);

  11. err = mModule->init();

  12. ......

  13. }

        在这个初始化函数中,会看到一个我们非常熟悉的函数hw_get_module。到这里,就跟我们android8.0之前的流程一模一样的了,都是去直接和hal层打交道了。

        在CameraProvider里有一个地方值得大家注意

 
  1. std::string cameraId, int deviceVersion) {

  2. // Maybe consider create a version check method and SortedVec to speed up?

  3. if (deviceVersion != CAMERA_DEVICE_API_VERSION_1_0 &&

  4. deviceVersion != CAMERA_DEVICE_API_VERSION_3_2 &&

  5. deviceVersion != CAMERA_DEVICE_API_VERSION_3_3 &&

  6. deviceVersion != CAMERA_DEVICE_API_VERSION_3_4 ) {

  7. return hidl_string("");

  8. }

  9. bool isV1 = deviceVersion == CAMERA_DEVICE_API_VERSION_1_0;

  10. int versionMajor = isV1 ? 1 : 3;

  11. int versionMinor = isV1 ? 0 : mPreferredHal3MinorVersion;

  12. char deviceName[kMaxCameraDeviceNameLen];

  13. snprintf(deviceName, sizeof(deviceName), "device@%d.%d/legacy/%s",

  14. versionMajor, versionMinor, cameraId.c_str());

  15. return deviceName;

  16. }

        从这里看来,如果我们的camera使用了hidl和hal打交道的话,我们hal里的版本号,必须是1.0或者是大于3.2的,如果我们的hal层的的版本号为3.0或3.1的话,是不能正确的加载成功的。

 

        上面用到的图片,引用了https://blog.csdn.net/qq_16775897/article/details/81240600这个博客的,大家也可以去这篇博客看看。启动流程都是一致的,这博主也讲得比较详细。

 

        好了,上面就将android8.0上camera hal层代码的加载流程基本讲完了。有了上面的基础,下面我们再来一步步的讲下,怎么去新增一个camera hal。

###############################################################################################################################################################################################################################################################################################################

移植一个camera hal,需要做的有以下几点:

1.)在device\mediatek\mt6580\manifest.xml里新增要增加的camera的instance

2.)在frameworks\av\services\camera\libcameraservice\common\CameraProviderManager.cpp里,将要添加的camera provider给addProviderLocked进来

3.)在hardware\interfaces\camera\provider\2.4\default\CameraProvider.cpp里将要增加的camera,通过hw_get_module这样给load进来。

4.)准备好对应的camera hal代码

 

配置manifest.xml

 
  1. <hal format="hidl">

  2. <name>android.hardware.camera.provider</name>

  3. <transport>hwbinder</transport>

  4. <version>2.4</version>

  5. <interface>

  6. <name>ICameraProvider</name>

  7. <instance>internal/0</instance>

  8. <instance>legacy/1</instance>

  9. </interface>

  10. </hal>

        因为mtkcamera已经有了一个camera hal1,名字为internal/0, 所以我们的usbcamera对应的名字跟在它的后面即可。注意,“legacy/1”这个名字的前面“legacy”这串,可以随便取,比如可以叫”abc/1",只要其他用到的地方都叫这个名字就可以。但是这个后面的“1”,不能弄错。前面已经为0了,这个就必须为1,同理,如果还有一个摄像头,就要为2了。因为在CameraProviderManager.cpp里的ProviderInfo::parseDeviceName,是通过后面这个数字,来取对应的id值的。如果我们将这个usbcamera的id也写为0,即名字为“legacy/0”,那么在ProviderInfo::parseDeviceName这里取出来的id,就会和前面的已经有了的主摄冲突。

 

添加camera的ProviderInfo

        在frameworks\av\services\camera\libcameraservice\common\CameraProviderManager.cpp的initialize函数里,将kLegacyProviderName改成"legacy/1"

 
  1. status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener,

  2. ServiceInteractionProxy* proxy) {

  3. ......

  4. // See if there's a passthrough HAL, but let's not complain if there's not

  5. addProviderLocked("legacy/1", /*expected*/ false);

  6.  
  7. return OK;

  8. }

        在hardware\interfaces\camera\provider\2.4\default\service.cpp里的main函数里,将"legacy/1"注册上来

 
  1. int main()

  2. {

  3. ALOGI("Camera provider Service is starting.");

  4. // The camera HAL may communicate to other vendor components via

  5. // /dev/vndbinder

  6. android::ProcessState::initWithDriver("/dev/vndbinder");

  7. return defaultPassthroughServiceImplementation<ICameraProvider>("legacy/1", /*maxThreads*/ 6);

  8. }

        在hardware\interfaces\camera\provider\2.4\default\CameraProvider.cpp里,将kLegacyProviderName改成"legacy/1";它会被HIDL_FETCH_ICameraProvider调用。

 

hw_get_module对应camera的hal代码

        在hardware\interfaces\camera\provider\2.4\default\CameraProvider.cpp里的initialize()函数里,hw_get_module参数传进去的名字,改成我们usbcamera hal里指定的名字

        int err = hw_get_module("usbcamera", (const hw_module_t **)&rawModule);

 

准备好对应的camera hal代码

       我们的usbcamera hal代码,我们放在hardware\libhardware\modules\camera\libuvccamera下面。在这个目录里,有个HalModule.cpp文件,里面定义了camera_module_t的结构体,它的id就是"usbcamera", 在CameraProvider.cpp里hw_get_module时,发现这里定义的id和它要找的id一致,就会load到我们的usbcamera了。

 
  1. #include <hardware/camera_common.h>

  2. #include <cutils/log.h>

  3. #include <utils/misc.h>

  4. #include <cstdlib>

  5. #include <cassert>

  6.  
  7. #include "Camera.h"

  8.  
  9. /******************************************************************************\

  10. DECLARATIONS

  11. Not used in any other project source files, header file is redundant

  12. \******************************************************************************/

  13.  
  14. extern camera_module_t HAL_MODULE_INFO_SYM;

  15.  
  16. namespace android {

  17. namespace HalModule {

  18.  
  19. /* Available cameras */

  20. extern Camera *cams[];

  21.  
  22. static int getNumberOfCameras();

  23. static int getCameraInfo(int cameraId, struct camera_info *info);

  24. static int setCallbacks(const camera_module_callbacks_t *callbacks);

  25. static void getVendorTagOps(vendor_tag_ops_t* ops);

  26. static int openDevice(const hw_module_t *module, const char *name, hw_device_t **device);

  27.  
  28. static struct hw_module_methods_t moduleMethods = {

  29. .open = openDevice

  30. };

  31.  
  32. }; /* namespace HalModule */

  33. }; /* namespace android */

  34.  
  35. /******************************************************************************\

  36. DEFINITIONS

  37. \******************************************************************************/

  38.  
  39. camera_module_t HAL_MODULE_INFO_SYM = {

  40. .common = {

  41. .tag = HARDWARE_MODULE_TAG,

  42. .module_api_version = CAMERA_MODULE_API_VERSION_2_3,

  43. .hal_api_version = HARDWARE_HAL_API_VERSION,

  44. .id = "usbcamera",

  45. .name = "V4l2 Camera",

  46. .author = "Antmicro Ltd.",

  47. .methods = &android::HalModule::moduleMethods,

  48. .dso = NULL,

  49. .reserved = {0}

  50. },

  51. .get_number_of_cameras = android::HalModule::getNumberOfCameras,

  52. .get_camera_info = android::HalModule::getCameraInfo,

  53. .set_callbacks = android::HalModule::setCallbacks,

  54. };

  55.  
  56. namespace android {

  57. namespace HalModule {

  58.  
  59. static Camera mainCamera;

  60. Camera *cams[] = {

  61. &mainCamera

  62. };

  63.  
  64. static int getNumberOfCameras() {

  65. return NELEM(cams);

  66. };

  67.  
  68. static int getCameraInfo(int cameraId, struct camera_info *info) {

  69. cameraId = 0;//cameraId - 1;

  70. if(cameraId < 0 || cameraId >= getNumberOfCameras()) {

  71. return -ENODEV;

  72. }

  73. if(!cams[cameraId]->isValid()) {

  74. return -ENODEV;

  75. }

  76. return cams[cameraId]->cameraInfo(info);

  77. }

  78.  
  79. int setCallbacks(const camera_module_callbacks_t * /*callbacks*/) {

  80. ALOGI("%s: lihb setCallbacks", __FUNCTION__);

  81. /* TODO: Implement for hotplug support */

  82. return OK;

  83. }

  84.  
  85. static int openDevice(const hw_module_t *module, const char *name, hw_device_t **device) {

  86. if (module != &HAL_MODULE_INFO_SYM.common) {

  87. return -EINVAL;

  88. }

  89. if (name == NULL) {

  90. return -EINVAL;

  91. }

  92. errno = 0;

  93. int cameraId = (int)strtol(name, NULL, 10);

  94. cameraId = 0;

  95. if(errno || cameraId < 0 || cameraId >= getNumberOfCameras()) {

  96. return -EINVAL;

  97. }

  98. if(!cams[cameraId]->isValid()) {

  99. *device = NULL;

  100. return -ENODEV;

  101. }

  102.  
  103. return cams[cameraId]->openDevice(device);

  104. }

  105.  
  106. }; /* namespace HalModule */

  107. }; /* namespace android */

        大家可能会发现,在getCameraInfo函数里,我将cameraId写死成了0,但是前面我们不是刚说过,我们的usbcamera是第二个摄像头,id要为1么?其实这里的id,和前面说的那个id,不是同一个意思。在这里之所以写成0,是因为我们这套usbcamera hal代码上面,只挂了一个摄像头,这个摄像头对应的代码放在Camera *cams[]数组里,这个数组里只放了一个对象,所以id自然就要为0了。然后我们在我们的halModule.cpp里操作getCameraInfo或openDevice时,就会通过这个数组调用到static Camera mainCamera;这里定义的这个Camera对象了。这个Camera,也是我们自己写的代码:

 
  1. //Camera.h

  2.  
  3. #ifndef CAMERA_H

  4. #define CAMERA_H

  5.  
  6. #include <utils/Errors.h>

  7. #include <hardware/camera_common.h>

  8. #include <V4l2Device.h>

  9. #include <hardware/camera3.h>

  10. #include <camera/CameraMetadata.h>

  11. #include <utils/Mutex.h>

  12.  
  13. #include "Workers.h"

  14. #include "ImageConverter.h"

  15. #include "DbgUtils.h"

  16.  
  17.  
  18. #include <cutils/ashmem.h>

  19. #include <cutils/log.h>

  20. #include <sys/mman.h>

  21. #include "VGA_YUV422.h"

  22.  
  23. namespace android {

  24.  
  25. class Camera: public camera3_device {

  26. public:

  27. Camera();

  28. virtual ~Camera();

  29.  
  30. bool isValid() { return mValid; }

  31.  
  32. virtual status_t cameraInfo(struct camera_info *info);

  33.  
  34. virtual int openDevice(hw_device_t **device);

  35. virtual int closeDevice();

  36. protected:

  37. virtual camera_metadata_t * staticCharacteristics();

  38. virtual int initialize(const camera3_callback_ops_t *callbackOps);

  39. virtual int configureStreams(camera3_stream_configuration_t *streamList);

  40. virtual const camera_metadata_t * constructDefaultRequestSettings(int type);

  41. virtual int registerStreamBuffers(const camera3_stream_buffer_set_t *bufferSet);

  42. virtual int processCaptureRequest(camera3_capture_request_t *request);

  43.  
  44. /* HELPERS/SUBPROCEDURES */

  45.  
  46. void notifyShutter(uint32_t frameNumber, uint64_t timestamp);

  47. void processCaptureResult(uint32_t frameNumber, const camera_metadata_t *result, const Vector<camera3_stream_buffer> &buffers);

  48.  
  49. camera_metadata_t *mStaticCharacteristics;

  50. camera_metadata_t *mDefaultRequestSettings[CAMERA3_TEMPLATE_COUNT];

  51. CameraMetadata mLastRequestSettings;

  52.  
  53. V4l2Device *mDev;

  54. bool mValid;

  55. const camera3_callback_ops_t *mCallbackOps;

  56.  
  57. size_t mJpegBufferSize;

  58.  
  59. private:

  60. ImageConverter mConverter;

  61. Mutex mMutex;

  62. uint8_t* mFrameBuffer;

  63. uint8_t* rszbuffer;

  64.  
  65. int mProperty_enableTimesTamp = -1;

  66.  
  67. /* STATIC WRAPPERS */

  68.  
  69. static int sClose(hw_device_t *device);

  70. static int sInitialize(const struct camera3_device *device, const camera3_callback_ops_t *callback_ops);

  71. static int sConfigureStreams(const struct camera3_device *device, camera3_stream_configuration_t *stream_list);

  72. static int sRegisterStreamBuffers(const struct camera3_device *device, const camera3_stream_buffer_set_t *buffer_set);

  73. static const camera_metadata_t * sConstructDefaultRequestSettings(const struct camera3_device *device, int type);

  74. static int sProcessCaptureRequest(const struct camera3_device *device, camera3_capture_request_t *request);

  75. static void sGetMetadataVendorTagOps(const struct camera3_device *device, vendor_tag_query_ops_t* ops);

  76. static void sDump(const struct camera3_device *device, int fd);

  77. static int sFlush(const struct camera3_device *device);

  78. static void _AddTimesTamp(uint8_t* buffer, int32_t width, int32_t height);

  79.  
  80. static camera3_device_ops_t sOps;

  81. };

  82.  
  83. }; /* namespace android */

  84.  
  85. #endif // CAMERA_H

 

 

 
  1. /*

  2. * Copyright (C) 2015-2016 Antmicro

  3. *

  4. * Licensed under the Apache License, Version 2.0 (the "License");

  5. * you may not use this file except in compliance with the License.

  6. * You may obtain a copy of the License at

  7. *

  8. * http://www.apache.org/licenses/LICENSE-2.0

  9. *

  10. * Unless required by applicable law or agreed to in writing, software

  11. * distributed under the License is distributed on an "AS IS" BASIS,

  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

  13. * See the License for the specific language governing permissions and

  14. * limitations under the License.

  15. */

  16.  
  17. #define LOG_TAG "usb-Camera"

  18. #define LOG_NDEBUG 0

  19.  
  20. #include <hardware/camera3.h>

  21. #include <camera/CameraMetadata.h>

  22. #include <utils/misc.h>

  23. #include <utils/Log.h>

  24. #include <hardware/gralloc.h>

  25. #include <ui/Rect.h>

  26. #include <ui/GraphicBufferMapper.h>

  27. #include <ui/Fence.h>

  28. #include <assert.h>

  29.  
  30. #include "DbgUtils.h"

  31. #include "Camera.h"

  32. #include "ImageConverter.h"

  33. #include "libyuv.h"

  34.  
  35. //#include <sprd_exvideo.h>

  36. #include <cutils/properties.h>

  37.  
  38. #include <cstdlib>

  39. #include <cstdio>

  40. namespace android {

  41. /**

  42. * \class Camera

  43. *

  44. * Android's Camera 3 device implementation.

  45. *

  46. * Declaration of camera capabilities, frame request handling, etc. This code

  47. * is what Android framework talks to.

  48. */

  49.  
  50. Camera::Camera()

  51. : mStaticCharacteristics(NULL)

  52. , mCallbackOps(NULL)

  53. , mJpegBufferSize(0) {

  54. ALOGI("Camera() start");

  55. DBGUTILS_AUTOLOGCALL(__func__);

  56. for(size_t i = 0; i < NELEM(mDefaultRequestSettings); i++) {

  57. mDefaultRequestSettings[i] = NULL;

  58. }

  59.  
  60. common.tag = HARDWARE_DEVICE_TAG;

  61. common.version = CAMERA_DEVICE_API_VERSION_3_2;//CAMERA_DEVICE_API_VERSION_3_0;

  62. common.module = &HAL_MODULE_INFO_SYM.common;

  63. common.close = Camera::sClose;

  64. ops = &sOps;

  65. priv = NULL;

  66.  
  67. mValid = true;

  68. mFrameBuffer = new uint8_t[640*480*4];

  69. rszbuffer = new uint8_t[640*480*4];

  70. mDev = new V4l2Device();

  71. if(!mDev) {

  72. mValid = false;

  73. }

  74. }

  75.  
  76. Camera::~Camera() {

  77. DBGUTILS_AUTOLOGCALL(__func__);

  78. gWorkers.stop();

  79. mDev->disconnect();

  80. delete[] mFrameBuffer;

  81. delete[] rszbuffer;

  82. delete mDev;

  83. }

  84.  
  85. status_t Camera::cameraInfo(struct camera_info *info) {

  86. DBGUTILS_AUTOLOGCALL(__func__);

  87. ALOGI("Camera::cameraInfo entry");

  88. ALOGE("Camera::cameraInfo entry");

  89. Mutex::Autolock lock(mMutex);

  90. info->facing = CAMERA_FACING_FRONT;//BACK;//FRONT;

  91. info->orientation = 0;

  92. info->device_version = CAMERA_DEVICE_API_VERSION_3_2;//CAMERA_DEVICE_API_VERSION_3_0;//CAMERA_DEVICE_API_VERSION_3_4;

  93. info->static_camera_characteristics = staticCharacteristics();

  94.  
  95. return NO_ERROR;

  96. }

  97.  
  98. int Camera::openDevice(hw_device_t **device) {

  99. ALOGI("%s",__FUNCTION__);

  100. DBGUTILS_AUTOLOGCALL(__func__);

  101. Mutex::Autolock lock(mMutex);

  102. char enableTimesTamp[PROPERTY_VALUE_MAX];

  103. char enableAVI[PROPERTY_VALUE_MAX];

  104. mDev->connect();

  105. *device = &common;

  106.  
  107. gWorkers.start();

  108. return NO_ERROR;

  109. }

  110.  
  111. int Camera::closeDevice() {

  112. ALOGI("%s",__FUNCTION__);

  113. DBGUTILS_AUTOLOGCALL(__func__);

  114. Mutex::Autolock lock(mMutex);

  115.  
  116. gWorkers.stop();

  117. mDev->disconnect();

  118. return NO_ERROR;

  119. }

  120.  
  121. camera_metadata_t *Camera::staticCharacteristics() {

  122. if(mStaticCharacteristics)

  123. return mStaticCharacteristics;

  124.  
  125. CameraMetadata cm;

  126.  
  127. auto &resolutions = mDev->availableResolutions();

  128. auto &previewResolutions = resolutions;

  129. auto sensorRes = mDev->sensorResolution();

  130.  
  131. /***********************************\

  132. |* START OF CAMERA CHARACTERISTICS *|

  133. \***********************************/

  134.  
  135. /* fake, but valid aspect ratio */

  136. const float sensorInfoPhysicalSize[] = {

  137. 5.0f,

  138. 5.0f * (float)sensorRes.height / (float)sensorRes.width

  139. };

  140. cm.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, sensorInfoPhysicalSize, NELEM(sensorInfoPhysicalSize));

  141.  
  142. /* fake */

  143. static const float lensInfoAvailableFocalLengths[] = {3.30f};

  144. cm.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, lensInfoAvailableFocalLengths, NELEM(lensInfoAvailableFocalLengths));

  145.  
  146. static const uint8_t lensFacing = ANDROID_LENS_FACING_FRONT;

  147. cm.update(ANDROID_LENS_FACING, &lensFacing, 1);

  148. const int32_t sensorInfoPixelArraySize[] = {

  149. (int32_t)sensorRes.width,

  150. (int32_t)sensorRes.height

  151. };

  152. cm.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, sensorInfoPixelArraySize, NELEM(sensorInfoPixelArraySize));

  153.  
  154. const int32_t sensorInfoActiveArraySize[] = {

  155. 0, 0,

  156. (int32_t)sensorRes.width, (int32_t)sensorRes.height

  157. };

  158. cm.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, sensorInfoActiveArraySize, NELEM(sensorInfoActiveArraySize));

  159.  
  160. static const int32_t scalerAvailableFormats[] = {

  161. HAL_PIXEL_FORMAT_RGBA_8888, //预览流

  162. HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,//预览流

  163. /* Non-preview one, must be last - see following code */

  164. HAL_PIXEL_FORMAT_BLOB//拍照流

  165. };

  166. cm.update(ANDROID_SCALER_AVAILABLE_FORMATS, scalerAvailableFormats, NELEM(scalerAvailableFormats));

  167.  
  168. /* Only for HAL_PIXEL_FORMAT_BLOB */

  169. const size_t mainStreamConfigsCount = resolutions.size();

  170. /* For all other supported pixel formats */

  171. const size_t previewStreamConfigsCount = previewResolutions.size() * (NELEM(scalerAvailableFormats) - 1);

  172. const size_t streamConfigsCount = mainStreamConfigsCount + previewStreamConfigsCount;

  173.  
  174. int32_t scalerAvailableStreamConfigurations[streamConfigsCount * 4];

  175. int64_t scalerAvailableMinFrameDurations[streamConfigsCount * 4];

  176.  
  177. int32_t scalerAvailableProcessedSizes[previewResolutions.size() * 2];

  178. int64_t scalerAvailableProcessedMinDurations[previewResolutions.size()];

  179. int32_t scalerAvailableJpegSizes[resolutions.size() * 2];

  180. int64_t scalerAvailableJpegMinDurations[resolutions.size()];

  181.  
  182. size_t i4 = 0;

  183. size_t i2 = 0;

  184. size_t i1 = 0;

  185. /* Main stream configurations */

  186. for(size_t resId = 0; resId < resolutions.size(); ++resId) {

  187. scalerAvailableStreamConfigurations[i4 + 0] = HAL_PIXEL_FORMAT_BLOB;

  188. scalerAvailableStreamConfigurations[i4 + 1] = (int32_t)resolutions[resId].width;

  189. scalerAvailableStreamConfigurations[i4 + 2] = (int32_t)resolutions[resId].height;

  190. scalerAvailableStreamConfigurations[i4 + 3] = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT;

  191.  
  192. scalerAvailableMinFrameDurations[i4 + 0] = HAL_PIXEL_FORMAT_BLOB;

  193. scalerAvailableMinFrameDurations[i4 + 1] = (int32_t)resolutions[resId].width;

  194. scalerAvailableMinFrameDurations[i4 + 2] = (int32_t)resolutions[resId].height;

  195. scalerAvailableMinFrameDurations[i4 + 3] = 1000000000 / 30; /* TODO: read from the device */

  196.  
  197. scalerAvailableJpegSizes[i2 + 0] = (int32_t)resolutions[resId].width;

  198. scalerAvailableJpegSizes[i2 + 1] = (int32_t)resolutions[resId].height;

  199.  
  200. scalerAvailableJpegMinDurations[i1] = 1000000000 / 30; /* TODO: read from the device */

  201.  
  202. i4 += 4;

  203. i2 += 2;

  204. i1 += 1;

  205. }

  206. i2 = 0;

  207. i1 = 0;

  208. /* Preview stream configurations */

  209. for(size_t resId = 0; resId < previewResolutions.size(); ++resId) {

  210. for(size_t fmtId = 0; fmtId < NELEM(scalerAvailableFormats) - 1; ++fmtId) {

  211. scalerAvailableStreamConfigurations[i4 + 0] = scalerAvailableFormats[fmtId];

  212. scalerAvailableStreamConfigurations[i4 + 1] = (int32_t)previewResolutions[resId].width;

  213. scalerAvailableStreamConfigurations[i4 + 2] = (int32_t)previewResolutions[resId].height;

  214. scalerAvailableStreamConfigurations[i4 + 3] = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT;

  215.  
  216. scalerAvailableMinFrameDurations[i4 + 0] = scalerAvailableFormats[fmtId];

  217. scalerAvailableMinFrameDurations[i4 + 1] = (int32_t)previewResolutions[resId].width;

  218. scalerAvailableMinFrameDurations[i4 + 2] = (int32_t)previewResolutions[resId].height;

  219. scalerAvailableMinFrameDurations[i4 + 3] = 1000000000 / 10; /* TODO: read from the device */

  220.  
  221. i4 += 4;

  222. }

  223. scalerAvailableProcessedSizes[i2 + 0] = (int32_t)previewResolutions[resId].width;

  224. scalerAvailableProcessedSizes[i2 + 1] = (int32_t)previewResolutions[resId].height;

  225.  
  226. scalerAvailableProcessedMinDurations[i1] = 1000000000 / 10; /* TODO: read from the device */

  227.  
  228. i2 += 2;

  229. i1 += 1;

  230. }

  231. cm.update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, scalerAvailableStreamConfigurations, (size_t)NELEM(scalerAvailableStreamConfigurations));

  232. cm.update(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, scalerAvailableMinFrameDurations, (size_t)NELEM(scalerAvailableMinFrameDurations));

  233. /* Probably fake */

  234. cm.update(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, scalerAvailableMinFrameDurations, (size_t)NELEM(scalerAvailableMinFrameDurations));

  235. cm.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, scalerAvailableJpegSizes, (size_t)NELEM(scalerAvailableJpegSizes));

  236. cm.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS, scalerAvailableJpegMinDurations, (size_t)NELEM(scalerAvailableJpegMinDurations));

  237. cm.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, scalerAvailableProcessedSizes, (size_t)NELEM(scalerAvailableProcessedSizes));

  238. cm.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS, scalerAvailableProcessedMinDurations, (size_t)NELEM(scalerAvailableProcessedMinDurations));

  239.  
  240. //添加capabilities集,否则api2的接口,在调用getStreamConfigurationMap去获取REQUEST_AVAILABLE_CAPABILITIES值时会失败。

  241. Vector<uint8_t> available_capabilities;

  242. available_capabilities.add(ANDROID_REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS);

  243. available_capabilities.add(ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING);

  244. available_capabilities.add(ANDROID_REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING);

  245. cm.update(ANDROID_REQUEST_AVAILABLE_CAPABILITIES,

  246. available_capabilities.array(),

  247. available_capabilities.size());

  248.  
  249. /* ~8.25 bit/px (https://en.wikipedia.org/wiki/JPEG#Sample_photographs) */

  250. /* Use 9 bit/px, add buffer info struct size, round up to page size */

  251. mJpegBufferSize = sensorRes.width * sensorRes.height * 9 + sizeof(camera3_jpeg_blob);

  252. mJpegBufferSize = (mJpegBufferSize + PAGE_SIZE - 1u) & ~(PAGE_SIZE - 1u);

  253. const int32_t jpegMaxSize = (int32_t)mJpegBufferSize;

  254. cm.update(ANDROID_JPEG_MAX_SIZE, &jpegMaxSize, 1);

  255.  
  256. static const int32_t jpegAvailableThumbnailSizes[] = {

  257. 0, 0,

  258. 320, 240

  259. };

  260. cm.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, jpegAvailableThumbnailSizes, NELEM(jpegAvailableThumbnailSizes));

  261.  
  262. static const int32_t sensorOrientation = 90;

  263. cm.update(ANDROID_SENSOR_ORIENTATION, &sensorOrientation, 1);

  264.  
  265. static const uint8_t flashInfoAvailable = ANDROID_FLASH_INFO_AVAILABLE_FALSE;

  266. cm.update(ANDROID_FLASH_INFO_AVAILABLE, &flashInfoAvailable, 1);

  267.  
  268. static const float scalerAvailableMaxDigitalZoom = 1;

  269. cm.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, &scalerAvailableMaxDigitalZoom, 1);

  270.  
  271. static const uint8_t statisticsFaceDetectModes[] = {

  272. ANDROID_STATISTICS_FACE_DETECT_MODE_OFF

  273. };

  274. cm.update(ANDROID_STATISTICS_FACE_DETECT_MODE, statisticsFaceDetectModes, NELEM(statisticsFaceDetectModes));

  275.  
  276. static const int32_t statisticsInfoMaxFaceCount = 0;

  277. cm.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, &statisticsInfoMaxFaceCount, 1);

  278.  
  279. static const uint8_t controlAvailableSceneModes[] = {

  280. ANDROID_CONTROL_SCENE_MODE_DISABLED

  281. };

  282. cm.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, controlAvailableSceneModes, NELEM(controlAvailableSceneModes));

  283.  
  284. static const uint8_t controlAvailableEffects[] = {

  285. ANDROID_CONTROL_EFFECT_MODE_OFF

  286. };

  287. cm.update(ANDROID_CONTROL_AVAILABLE_EFFECTS, controlAvailableEffects, NELEM(controlAvailableEffects));

  288.  
  289. static const int32_t controlMaxRegions[] = {

  290. 0, /* AE */

  291. 0, /* AWB */

  292. 0 /* AF */

  293. };

  294. cm.update(ANDROID_CONTROL_MAX_REGIONS, controlMaxRegions, NELEM(controlMaxRegions));

  295.  
  296. static const uint8_t controlAeAvailableModes[] = {

  297. ANDROID_CONTROL_AE_MODE_OFF

  298. };

  299. cm.update(ANDROID_CONTROL_AE_AVAILABLE_MODES, controlAeAvailableModes, NELEM(controlAeAvailableModes));

  300.  
  301. static const camera_metadata_rational controlAeCompensationStep = {1, 3};

  302. cm.update(ANDROID_CONTROL_AE_COMPENSATION_STEP, &controlAeCompensationStep, 1);

  303.  
  304. int32_t controlAeCompensationRange[] = {-9, 9};

  305. cm.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, controlAeCompensationRange, NELEM(controlAeCompensationRange));

  306.  
  307. static const int32_t controlAeAvailableTargetFpsRanges[] = {

  308. 10, 20

  309. };

  310. cm.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, controlAeAvailableTargetFpsRanges, NELEM(controlAeAvailableTargetFpsRanges));

  311.  
  312. static const uint8_t controlAeAvailableAntibandingModes[] = {

  313. ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF

  314. };

  315. cm.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, controlAeAvailableAntibandingModes, NELEM(controlAeAvailableAntibandingModes));

  316.  
  317. static const uint8_t controlAwbAvailableModes[] = {

  318. ANDROID_CONTROL_AWB_MODE_AUTO,

  319. ANDROID_CONTROL_AWB_MODE_OFF

  320. };

  321. cm.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, controlAwbAvailableModes, NELEM(controlAwbAvailableModes));

  322.  
  323. static const uint8_t controlAfAvailableModes[] = {

  324. ANDROID_CONTROL_AF_MODE_OFF

  325. };

  326. cm.update(ANDROID_CONTROL_AF_AVAILABLE_MODES, controlAfAvailableModes, NELEM(controlAfAvailableModes));

  327.  
  328. static const uint8_t controlAvailableVideoStabilizationModes[] = {

  329. ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF

  330. };

  331. cm.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, controlAvailableVideoStabilizationModes, NELEM(controlAvailableVideoStabilizationModes));

  332.  
  333. const uint8_t infoSupportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED;

  334. cm.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, &infoSupportedHardwareLevel, 1);

  335.  
  336. /***********************************\

  337. |* END OF CAMERA CHARACTERISTICS *|

  338. \***********************************/

  339.  
  340. mStaticCharacteristics = cm.release();

  341. return mStaticCharacteristics;

  342. }

  343.  
  344. int Camera::initialize(const camera3_callback_ops_t *callbackOps) {

  345. DBGUTILS_AUTOLOGCALL(__func__);

  346. Mutex::Autolock lock(mMutex);

  347.  
  348. mCallbackOps = callbackOps;

  349. return NO_ERROR;

  350. }

  351.  
  352. const camera_metadata_t * Camera::constructDefaultRequestSettings(int type) {

  353. DBGUTILS_AUTOLOGCALL(__func__);

  354. Mutex::Autolock lock(mMutex);

  355. /* TODO: validate type */

  356.  
  357. if(mDefaultRequestSettings[type]) {

  358. return mDefaultRequestSettings[type];

  359. }

  360.  
  361. CameraMetadata cm;

  362.  
  363. static const int32_t requestId = 0;

  364. cm.update(ANDROID_REQUEST_ID, &requestId, 1);

  365.  
  366. static const float lensFocusDistance = 0.0f;

  367. cm.update(ANDROID_LENS_FOCUS_DISTANCE, &lensFocusDistance, 1);

  368.  
  369. auto sensorSize = mDev->sensorResolution();

  370. const int32_t scalerCropRegion[] = {

  371. 0, 0,

  372. (int32_t)sensorSize.width, (int32_t)sensorSize.height

  373. };

  374. cm.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, NELEM(scalerCropRegion));

  375.  
  376. static const int32_t jpegThumbnailSize[] = {

  377. 0, 0

  378. };

  379. cm.update(ANDROID_JPEG_THUMBNAIL_SIZE, jpegThumbnailSize, NELEM(jpegThumbnailSize));

  380.  
  381. static const uint8_t jpegThumbnailQuality = 50;

  382. cm.update(ANDROID_JPEG_THUMBNAIL_QUALITY, &jpegThumbnailQuality, 1);

  383.  
  384. static const double jpegGpsCoordinates[] = {

  385. 0, 0

  386. };

  387. cm.update(ANDROID_JPEG_GPS_COORDINATES, jpegGpsCoordinates, NELEM(jpegGpsCoordinates));

  388.  
  389. static const uint8_t jpegGpsProcessingMethod[32] = "None";

  390. cm.update(ANDROID_JPEG_GPS_PROCESSING_METHOD, jpegGpsProcessingMethod, NELEM(jpegGpsProcessingMethod));

  391.  
  392. static const int64_t jpegGpsTimestamp = 0;

  393. cm.update(ANDROID_JPEG_GPS_TIMESTAMP, &jpegGpsTimestamp, 1);

  394.  
  395. static const int32_t jpegOrientation = 0;

  396. cm.update(ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1);

  397.  
  398. /** android.stats */

  399.  
  400. static const uint8_t statisticsFaceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;

  401. cm.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &statisticsFaceDetectMode, 1);

  402.  
  403. static const uint8_t statisticsHistogramMode = ANDROID_STATISTICS_HISTOGRAM_MODE_OFF;

  404. cm.update(ANDROID_STATISTICS_HISTOGRAM_MODE, &statisticsHistogramMode, 1);

  405.  
  406. static const uint8_t statisticsSharpnessMapMode = ANDROID_STATISTICS_SHARPNESS_MAP_MODE_OFF;

  407. cm.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, &statisticsSharpnessMapMode, 1);

  408.  
  409. uint8_t controlCaptureIntent = 0;

  410. switch (type) {

  411. case CAMERA3_TEMPLATE_PREVIEW: controlCaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; break;

  412. case CAMERA3_TEMPLATE_STILL_CAPTURE: controlCaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; break;

  413. case CAMERA3_TEMPLATE_VIDEO_RECORD: controlCaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; break;

  414. case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: controlCaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; break;

  415. case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: controlCaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; break;

  416. default: controlCaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; break;

  417. }

  418. cm.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlCaptureIntent, 1);

  419.  
  420. static const uint8_t controlMode = ANDROID_CONTROL_MODE_OFF;

  421. cm.update(ANDROID_CONTROL_MODE, &controlMode, 1);

  422.  
  423. static const uint8_t controlEffectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;

  424. cm.update(ANDROID_CONTROL_EFFECT_MODE, &controlEffectMode, 1);

  425.  
  426. static const uint8_t controlSceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY;

  427. cm.update(ANDROID_CONTROL_SCENE_MODE, &controlSceneMode, 1);

  428.  
  429. static const uint8_t controlAeMode = ANDROID_CONTROL_AE_MODE_OFF;

  430. cm.update(ANDROID_CONTROL_AE_MODE, &controlAeMode, 1);

  431.  
  432. static const uint8_t controlAeLock = ANDROID_CONTROL_AE_LOCK_OFF;

  433. cm.update(ANDROID_CONTROL_AE_LOCK, &controlAeLock, 1);

  434.  
  435. static const int32_t controlAeRegions[] = {

  436. 0, 0,

  437. (int32_t)sensorSize.width, (int32_t)sensorSize.height,

  438. 1000

  439. };

  440. cm.update(ANDROID_CONTROL_AE_REGIONS, controlAeRegions, NELEM(controlAeRegions));

  441. cm.update(ANDROID_CONTROL_AWB_REGIONS, controlAeRegions, NELEM(controlAeRegions));

  442. cm.update(ANDROID_CONTROL_AF_REGIONS, controlAeRegions, NELEM(controlAeRegions));

  443.  
  444. static const int32_t controlAeExposureCompensation = 0;

  445. cm.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &controlAeExposureCompensation, 1);

  446.  
  447. static const int32_t controlAeTargetFpsRange[] = {

  448. 10, 20

  449. };

  450. cm.update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, controlAeTargetFpsRange, NELEM(controlAeTargetFpsRange));

  451.  
  452. static const uint8_t controlAeAntibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF;

  453. cm.update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &controlAeAntibandingMode, 1);

  454.  
  455. static const uint8_t controlAwbMode = ANDROID_CONTROL_AWB_MODE_OFF;

  456. cm.update(ANDROID_CONTROL_AWB_MODE, &controlAwbMode, 1);

  457.  
  458. static const uint8_t controlAwbLock = ANDROID_CONTROL_AWB_LOCK_OFF;

  459. cm.update(ANDROID_CONTROL_AWB_LOCK, &controlAwbLock, 1);

  460.  
  461. uint8_t controlAfMode = ANDROID_CONTROL_AF_MODE_OFF;

  462. cm.update(ANDROID_CONTROL_AF_MODE, &controlAfMode, 1);

  463.  
  464. static const uint8_t controlAeState = ANDROID_CONTROL_AE_STATE_CONVERGED;

  465. cm.update(ANDROID_CONTROL_AE_STATE, &controlAeState, 1);

  466. static const uint8_t controlAfState = ANDROID_CONTROL_AF_STATE_INACTIVE;

  467. cm.update(ANDROID_CONTROL_AF_STATE, &controlAfState, 1);

  468. static const uint8_t controlAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE;

  469. cm.update(ANDROID_CONTROL_AWB_STATE, &controlAwbState, 1);

  470.  
  471. static const uint8_t controlVideoStabilizationMode = ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF;

  472. cm.update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &controlVideoStabilizationMode, 1);

  473.  
  474. static const int32_t controlAePrecaptureId = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE;

  475. cm.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, &controlAePrecaptureId, 1);

  476.  
  477. static const int32_t controlAfTriggerId = 0;

  478. cm.update(ANDROID_CONTROL_AF_TRIGGER_ID, &controlAfTriggerId, 1);

  479.  
  480. mDefaultRequestSettings[type] = cm.release();

  481. return mDefaultRequestSettings[type];

  482. }

  483.  
  484. int Camera::configureStreams(camera3_stream_configuration_t *streamList) {

  485. DBGUTILS_AUTOLOGCALL(__func__);

  486. Mutex::Autolock lock(mMutex);

  487. ALOGI("configureStreams");

  488. /* TODO: sanity checks */

  489.  
  490. ALOGI("+-------------------------------------------------------------------------------");

  491. ALOGI("| STREAMS FROM FRAMEWORK");

  492. ALOGI("+-------------------------------------------------------------------------------");

  493. for(size_t i = 0; i < streamList->num_streams; ++i) {

  494. camera3_stream_t *newStream = streamList->streams[i];

  495. ALOGI("| p=%p fmt=0x%.2x type=%u usage=0x%.8x size=%4ux%-4u buf_no=%u",

  496. newStream,

  497. newStream->format,

  498. newStream->stream_type,

  499. newStream->usage,

  500. newStream->width,

  501. newStream->height,

  502. newStream->max_buffers);

  503. }

  504. ALOGI("+-------------------------------------------------------------------------------");

  505.  
  506. /* TODO: do we need input stream? */

  507. camera3_stream_t *inStream = NULL;

  508. unsigned width = 0;

  509. unsigned height = 0;

  510. for(size_t i = 0; i < streamList->num_streams; ++i) {

  511. camera3_stream_t *newStream = streamList->streams[i];

  512.  
  513. /* TODO: validate: null */

  514.  
  515. if(newStream->stream_type == CAMERA3_STREAM_INPUT || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {

  516. if(inStream) {

  517. ALOGI("Only one input/bidirectional stream allowed (previous is %p, this %p)", inStream, newStream);

  518. return BAD_VALUE;

  519. }

  520. inStream = newStream;

  521. }

  522.  
  523. /* TODO: validate format */

  524.  
  525. if(newStream->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {

  526. newStream->format = HAL_PIXEL_FORMAT_RGBA_8888;

  527. }

  528.  
  529. /* TODO: support ZSL */

  530. if(newStream->usage & GRALLOC_USAGE_HW_CAMERA_ZSL) {

  531. ALOGI("ZSL STREAM FOUND! It is not supported for now.");

  532. ALOGI(" Disable it by placing following line in /system/build.prop:");

  533. ALOGI(" camera.disable_zsl_mode=1");

  534. return BAD_VALUE;

  535. }

  536.  
  537. switch(newStream->stream_type) {

  538. case CAMERA3_STREAM_OUTPUT: newStream->usage = GRALLOC_USAGE_SW_WRITE_OFTEN; break;

  539. case CAMERA3_STREAM_INPUT: newStream->usage = GRALLOC_USAGE_SW_READ_OFTEN; break;

  540. case CAMERA3_STREAM_BIDIRECTIONAL: newStream->usage = GRALLOC_USAGE_SW_WRITE_OFTEN | GRALLOC_USAGE_SW_READ_OFTEN; break;

  541. }

  542. newStream->max_buffers = 1; /* TODO: support larger queue */

  543.  
  544. if(newStream->width * newStream->height > width * height) {

  545. width = newStream->width;

  546. height = newStream->height;

  547. }

  548.  
  549. /* TODO: store stream pointers somewhere and configure only new ones */

  550. }

  551.  
  552. if(mDev->isNeedsetResolution(width, height))

  553. {

  554. if(mDev->isStreaming())

  555. {

  556. if (!mDev->setStreaming(false))

  557. {

  558. ALOGI("Could not stop streaming");

  559. return NO_INIT;

  560. }

  561. }

  562. if (!mDev->setResolution(width, height))

  563. {

  564. ALOGI("Could not set resolution");

  565. return NO_INIT;

  566. }

  567. }

  568.  
  569.  
  570.  
  571. ALOGI("+-------------------------------------------------------------------------------");

  572. ALOGI("| STREAMS AFTER CHANGES");

  573. ALOGI("+-------------------------------------------------------------------------------");

  574. for(size_t i = 0; i < streamList->num_streams; ++i) {

  575. const camera3_stream_t *newStream = streamList->streams[i];

  576. ALOGI("| p=%p fmt=0x%.2x type=%u usage=0x%.8x size=%4ux%-4u buf_no=%u",

  577. newStream,

  578. newStream->format,

  579. newStream->stream_type,

  580. newStream->usage,

  581. newStream->width,

  582. newStream->height,

  583. newStream->max_buffers);

  584. }

  585. ALOGI("+-------------------------------------------------------------------------------");

  586.  
  587. if(!mDev->setStreaming(true)) {

  588. ALOGI("Could not start streaming");

  589. return NO_INIT;

  590. }

  591.  
  592. return NO_ERROR;

  593. }

  594.  
  595. int Camera::registerStreamBuffers(const camera3_stream_buffer_set_t *bufferSet) {

  596. DBGUTILS_AUTOLOGCALL(__func__);

  597. Mutex::Autolock lock(mMutex);

  598. ALOGI("+-------------------------------------------------------------------------------");

  599. ALOGI("| BUFFERS FOR STREAM %p", bufferSet->stream);

  600. ALOGI("+-------------------------------------------------------------------------------");

  601. for (size_t i = 0; i < bufferSet->num_buffers; ++i) {

  602. ALOGI("| p=%p", bufferSet->buffers[i]);

  603. }

  604. ALOGI("+-------------------------------------------------------------------------------");

  605.  
  606. return OK;

  607. }

  608.  
  609. int Camera::processCaptureRequest(camera3_capture_request_t *request) {

  610.  
  611. assert(request != NULL);

  612. Mutex::Autolock lock(mMutex);

  613.  
  614. BENCHMARK_HERE(120);

  615. FPSCOUNTER_HERE(120);

  616.  
  617. CameraMetadata cm;

  618. const V4l2Device::VBuffer *frame = NULL;

  619. auto res = mDev->resolution();

  620. status_t e;

  621. Vector<camera3_stream_buffer> buffers;

  622.  
  623. auto timestamp = systemTime();

  624. if(request->settings == NULL && mLastRequestSettings.isEmpty()) {

  625. ALOGI("processCaptureRequest error 1, First request does not have metadata, BAD_VALUE is %d", BAD_VALUE);

  626. return BAD_VALUE;

  627. }

  628.  
  629. if(request->input_buffer) {

  630. /* Ignore input buffer */

  631. /* TODO: do we expect any input buffer? */

  632. request->input_buffer->release_fence = -1;

  633. }

  634.  
  635. if(!request->settings) {

  636. cm.acquire(mLastRequestSettings);

  637. } else {

  638. cm = request->settings;

  639. }

  640.  
  641. notifyShutter(request->frame_number, (uint64_t)timestamp);

  642.  
  643. BENCHMARK_SECTION("Lock/Read") {

  644. frame = mDev->readLock();

  645. }

  646.  
  647. if(!frame) {

  648. ALOGI("processCaptureRequest error 2, NOT_ENOUGH_DATA is %d", NOT_ENOUGH_DATA);

  649. return NOT_ENOUGH_DATA;

  650. }

  651.  
  652. buffers.setCapacity(request->num_output_buffers);

  653.  
  654. uint8_t *rgbaBuffer = NULL;

  655.  
  656. char aviRecordering[PROPERTY_VALUE_MAX];

  657. for(size_t i = 0; i < request->num_output_buffers; ++i) {

  658. const camera3_stream_buffer &srcBuf = request->output_buffers[i];

  659. uint8_t *buf = NULL;

  660. sp<Fence> acquireFence = new Fence(srcBuf.acquire_fence);

  661. e = acquireFence->wait(1500); /* FIXME: magic number */

  662. if(e == TIMED_OUT) {

  663. ALOGI("processCaptureRequest buffer %p frame %-4u Wait on acquire fence timed out", srcBuf.buffer, request->frame_number);

  664. }

  665. if(e == NO_ERROR) {

  666. const Rect rect((int)srcBuf.stream->width, (int)srcBuf.stream->height);

  667. e = GraphicBufferMapper::get().lock(*srcBuf.buffer, GRALLOC_USAGE_SW_WRITE_OFTEN, rect, (void **)&buf);

  668. if(e != NO_ERROR) {

  669. ALOGI("processCaptureRequest buffer %p frame %-4u lock failed", srcBuf.buffer, request->frame_number);

  670. }

  671. }

  672. if(e != NO_ERROR) {

  673. ALOGI("processCaptureRequest error 3, e is %d, errno is %d, acquire_fence is %d", e, errno, srcBuf.acquire_fence);

  674. do GraphicBufferMapper::get().unlock(*request->output_buffers[i].buffer); while(i--);

  675. return NO_INIT;

  676. }

  677.  
  678. switch(srcBuf.stream->format) {

  679. case HAL_PIXEL_FORMAT_RGBA_8888: {

  680. if(!rgbaBuffer) {

  681. BENCHMARK_SECTION("YUV->RGBA") {

  682. /* FIXME: better format detection */

  683. if(frame->pixFmt == V4L2_PIX_FMT_YUYV) {

  684. //mConverter.UYVYToRGBA(frame->buf, buf, res.width, res.height);

  685. libyuv::YUY2ToI422(frame->buf, res.width*2,

  686. mFrameBuffer, res.width,

  687. &mFrameBuffer[res.width*res.height], res.width / 2,

  688. &mFrameBuffer[res.width*res.height + res.width*res.height / 2], res.width / 2,

  689. res.width, res.height);

  690.  
  691. _AddTimesTamp(mFrameBuffer, res.width, res.height);

  692. libyuv::I422ToABGR(mFrameBuffer, res.width,

  693. &mFrameBuffer[res.width*res.height], res.width / 2,

  694. &mFrameBuffer[res.width*res.height + res.width*res.height / 2], res.width / 2,

  695. buf,res.width*4,

  696. res.width, res.height);

  697. } else if (frame->pixFmt == V4L2_PIX_FMT_MJPEG) {

  698.  
  699. libyuv::MJPGToI420(frame->buf, frame->len,

  700. rszbuffer, res.width,

  701. &rszbuffer[res.width * res.height], res.width / 2 ,

  702. &rszbuffer[res.width * res.height * 5 / 4 ], res.width / 2 ,

  703. res.width, res.height,

  704. res.width, res.height);

  705.  
  706.  
  707.  
  708. _AddTimesTamp(rszbuffer, res.width, res.height);

  709.  
  710. libyuv::I420ToABGR(rszbuffer, res.width,

  711. &rszbuffer[res.width * res.height], res.width / 2 ,

  712. &rszbuffer[res.width * res.height * 5 / 4 ], res.width / 2 ,

  713. buf, res.width*4,

  714. res.width, res.height);

  715. // ALOGI("%s, MJPG convert done!", __FUNCTION__);

  716. } else {

  717. ;//mConverter.YUY2ToRGBA(frame->buf, buf, res.width, res.height);

  718. }

  719. rgbaBuffer = buf;

  720. }

  721. } else {

  722. BENCHMARK_SECTION("Buf Copy") {

  723. memcpy(buf, rgbaBuffer, srcBuf.stream->width * srcBuf.stream->height * 4);

  724. }

  725. }

  726. break;

  727. }

  728. case HAL_PIXEL_FORMAT_BLOB: {

  729. BENCHMARK_SECTION("YUV->JPEG") {

  730. const size_t maxImageSize = mJpegBufferSize - sizeof(camera3_jpeg_blob);

  731. uint8_t jpegQuality = 95;

  732. if(cm.exists(ANDROID_JPEG_QUALITY)) {

  733. jpegQuality = *cm.find(ANDROID_JPEG_QUALITY).data.u8;

  734. }

  735. ALOGI("JPEG quality = %u", jpegQuality);

  736.  
  737. /* FIXME: better format detection */

  738. uint8_t *bufEnd = NULL;

  739. if(frame->pixFmt == V4L2_PIX_FMT_UYVY)

  740. {

  741. ALOGI("processCaptureRequest HAL_PIXEL_FORMAT_BLOB frame->pixFmt == V4L2_PIX_FMT_UYVY");

  742. // bufEnd = mConverter.UYVYToJPEG(frame->buf, buf, res.width, res.height, maxImageSize, jpegQuality);

  743. }

  744. else if (frame->pixFmt == V4L2_PIX_FMT_MJPEG) {

  745. ALOGI("processCaptureRequest HAL_PIXEL_FORMAT_BLOB frame->pixFmt == V4L2_PIX_FMT_MJPEG");

  746.  
  747.  
  748.  
  749. int count = frame->len / mPageSize;

  750. int mod = frame->len % mPageSize;

  751. uint8_t *destbuf = buf;

  752. uint8_t * srcBuf = frame->buf;

  753. for(int i=0; i<count; ++i)

  754. {

  755. memcpy(destbuf, srcBuf, mPageSize);

  756. destbuf += mPageSize;

  757. srcBuf += mPageSize;

  758. }

  759. if(mod != 0)

  760. {

  761. memcpy(destbuf, srcBuf, mod);

  762. }

  763. //memcpy(buf, frame->buf, frame->len);

  764. bufEnd = buf + frame->len;

  765. } else

  766. {

  767. ALOGI("processCaptureRequest HAL_PIXEL_FORMAT_BLOB YUY2ToJPEG");

  768. // bufEnd = mConverter.YUY2ToJPEG(frame->buf, buf, res.width, res.height, maxImageSize, jpegQuality);

  769. }

  770.  
  771. if(bufEnd != buf) {

  772. camera3_jpeg_blob *jpegBlob = reinterpret_cast<camera3_jpeg_blob*>(buf + maxImageSize);

  773. jpegBlob->jpeg_blob_id = CAMERA3_JPEG_BLOB_ID;

  774. jpegBlob->jpeg_size = (uint32_t)(bufEnd - buf);

  775. } else {

  776. ALOGI("%s: JPEG image too big!", __FUNCTION__);

  777. }

  778. }

  779. break;

  780. }

  781. default:

  782. ALOGI("Unknown pixel format %d in buffer %p (stream %p), ignoring", srcBuf.stream->format, srcBuf.buffer, srcBuf.stream);

  783. }

  784. }

  785.  
  786. /* Unlocking all buffers in separate loop allows to copy data from already processed buffer to not yet processed one */

  787. for(size_t i = 0; i < request->num_output_buffers; ++i) {

  788. const camera3_stream_buffer &srcBuf = request->output_buffers[i];

  789.  
  790. GraphicBufferMapper::get().unlock(*srcBuf.buffer);

  791. buffers.push_back(srcBuf);

  792. buffers.editTop().acquire_fence = -1;

  793. buffers.editTop().release_fence = -1;

  794. buffers.editTop().status = CAMERA3_BUFFER_STATUS_OK;

  795. }

  796.  
  797. BENCHMARK_SECTION("Unlock") {

  798. mDev->unlock(frame);

  799. }

  800.  
  801. int64_t sensorTimestamp = timestamp;

  802. int64_t syncFrameNumber = request->frame_number;

  803.  
  804. cm.update(ANDROID_SENSOR_TIMESTAMP, &sensorTimestamp, 1);

  805. cm.update(ANDROID_SYNC_FRAME_NUMBER, &syncFrameNumber, 1);

  806.  
  807. auto result = cm.getAndLock();

  808. processCaptureResult(request->frame_number, result, buffers);

  809. cm.unlock(result);

  810.  
  811. // Cache the settings for next time

  812. mLastRequestSettings.acquire(cm);

  813.  
  814. /* Print stats */

  815. char bmOut[1024];

  816. BENCHMARK_STRING(bmOut, sizeof(bmOut), 6);

  817. // ALOGI(" time (avg): %s", bmOut);

  818. // ALOGI("processCaptureRequest no error");

  819. return NO_ERROR;

  820. }

  821.  
  822. inline void Camera::notifyShutter(uint32_t frameNumber, uint64_t timestamp) {

  823. camera3_notify_msg_t msg;

  824. msg.type = CAMERA3_MSG_SHUTTER;

  825. msg.message.shutter.frame_number = frameNumber;

  826. msg.message.shutter.timestamp = timestamp;

  827. mCallbackOps->notify(mCallbackOps, &msg);

  828. }

  829.  
  830. void Camera::processCaptureResult(uint32_t frameNumber, const camera_metadata_t *result, const Vector<camera3_stream_buffer> &buffers) {

  831. camera3_capture_result captureResult;

  832. captureResult.frame_number = frameNumber;

  833. captureResult.result = result;

  834. captureResult.num_output_buffers = buffers.size();

  835. captureResult.output_buffers = buffers.array();

  836. captureResult.input_buffer = NULL;

  837. captureResult.partial_result = 0;

  838.  
  839. mCallbackOps->process_capture_result(mCallbackOps, &captureResult);

  840. }

  841.  
  842. /******************************************************************************\

  843. STATIC WRAPPERS

  844. \******************************************************************************/

  845.  
  846. int Camera::sClose(hw_device_t *device) {

  847. /* TODO: check device module */

  848. Camera *thiz = static_cast<Camera *>(reinterpret_cast<camera3_device_t *>(device));

  849. return thiz->closeDevice();

  850. }

  851.  
  852. int Camera::sInitialize(const camera3_device *device, const camera3_callback_ops_t *callback_ops) {

  853. /* TODO: check pointers */

  854. Camera *thiz = static_cast<Camera *>(const_cast<camera3_device *>(device));

  855. return thiz->initialize(callback_ops);

  856. }

  857.  
  858. int Camera::sConfigureStreams(const camera3_device *device, camera3_stream_configuration_t *stream_list) {

  859. /* TODO: check pointers */

  860. Camera *thiz = static_cast<Camera *>(const_cast<camera3_device *>(device));

  861. return thiz->configureStreams(stream_list);

  862. }

  863.  
  864. int Camera::sRegisterStreamBuffers(const camera3_device *device, const camera3_stream_buffer_set_t *buffer_set) {

  865. /* TODO: check pointers */

  866. Camera *thiz = static_cast<Camera *>(const_cast<camera3_device *>(device));

  867. return thiz->registerStreamBuffers(buffer_set);

  868. }

  869.  
  870. const camera_metadata_t * Camera::sConstructDefaultRequestSettings(const camera3_device *device, int type) {

  871. /* TODO: check pointers */

  872. Camera *thiz = static_cast<Camera *>(const_cast<camera3_device *>(device));

  873. return thiz->constructDefaultRequestSettings(type);

  874. }

  875.  
  876. int Camera::sProcessCaptureRequest(const camera3_device *device, camera3_capture_request_t *request) {

  877. /* TODO: check pointers */

  878. Camera *thiz = static_cast<Camera *>(const_cast<camera3_device *>(device));

  879. return thiz->processCaptureRequest(request);

  880. }

  881.  
  882. void Camera::sGetMetadataVendorTagOps(const camera3_device *device, vendor_tag_query_ops_t *ops) {

  883. /* TODO: implement */

  884. }

  885.  
  886. void Camera::sDump(const camera3_device *device, int fd) {

  887. /* TODO: implement */

  888. }

  889.  
  890. int Camera::sFlush(const camera3_device *device) {

  891. /* TODO: implement */

  892. return NO_ERROR;//-ENODEV;

  893. }

  894.  
  895. camera3_device_ops_t Camera::sOps = {

  896. .initialize = Camera::sInitialize,

  897. .configure_streams = Camera::sConfigureStreams,

  898. .register_stream_buffers = Camera::sRegisterStreamBuffers,

  899. .construct_default_request_settings = Camera::sConstructDefaultRequestSettings,

  900. .process_capture_request = Camera::sProcessCaptureRequest,

  901. .get_metadata_vendor_tag_ops = Camera::sGetMetadataVendorTagOps,

  902. .dump = Camera::sDump,

  903. .flush = Camera::sFlush,

  904. .reserved = {0}

  905. };

  906.  
  907. }; /* namespace android */

        大家请注意,在Camera.cpp的Camera()里调用了common.version  = CAMERA_DEVICE_API_VERSION_3_2;  在cameraInfo里调用了info->device_version = CAMERA_DEVICE_API_VERSION_3_2; 这里表示,我们的hal的版本定义为了hal3.2。

        我们的HalModule.cpp的get_camera_info指向了HalModule::getCameraInfo,  getCameraInfo里又调用到了Camera::cameraInfo,然后Camera::cameraInfo通过staticCharacteristics来,获取我们usbcamera的属性。这样在app上就可以通过getCameraInfo来获取我们usbcamera的属性了。也可以使用下面的方法来获取我们预览或者拍尺寸等:

 
  1. public List<Size> getSupportedPreviewSizes() {

  2. StreamConfigurationMap configMap;

  3. CameraCharacteristics mCameraCharacteristics;

  4. try {

  5. configMap = mCameraCharacteristics.get(

  6. CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);

  7. } catch (Exception ex) {

  8. return new ArrayList<>(0);

  9. }

  10. ArrayList<Size> supportedPictureSizes = new ArrayList<>();

  11. for (android.util.Size androidSize : configMap.getOutputSizes(SurfaceTexture.class)) {

  12. supportedPictureSizes.add(new Size(androidSize));

  13. }

  14.  
  15. return supportedPictureSizes;

  16. }

        我这个usbcamera,可以同时兼容api1和api2,当然,如果想要让api2也来调用的话,camera_metadata_t *mStaticCharacteristics;这个值要配好,必须按api2的规范来,该有的值一个都不能少,要不然app在调用getStreamConfigurationMap去获取属性时,就有可能会因为获取不到对应的值而报错。

       比如一开始,我在staticCharacteristics这个函数里,没有配置ANDROID_REQUEST_AVAILABLE_CAPABILITIES相关的属性。然后app在用api2的接口去getStreamConfigurationMap的时候,就因为找不到REQUEST_AVAILABLE_CAPABILITIES而报错了。至于api2都需要哪些配置项,大家可以参考frameworks\base\core\java\android\hardware\camera2\impl\CameraMetadataNative.java里的getStreamConfigurationMap()这个函数,这里需要的,都给加上,都必须加上。

        后来报错后,我在staticCharacteristics这个函数里,加下了如下代码,就可以了:

 
  1. Vector<uint8_t> available_capabilities;

  2. available_capabilities.add(ANDROID_REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS);

  3. available_capabilities.add(ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING);

  4. available_capabilities.add(ANDROID_REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING);

  5. cm.update(ANDROID_REQUEST_AVAILABLE_CAPABILITIES,

  6. available_capabilities.array(),

  7. available_capabilities.size());

        到这里,我们一个完整的usbcamera hal就添加完成了。当然,虚拟摄像头也是一样的。唯一不同的是camera.cpp里的processCaptureRequest这个函数。我们的usbcamera是真正的一个摄像头,是可以取到实景的,所以就按照v4l2的标准来读取,然后按camera hal的规范来填充就可以。 但是虚拟摄像头因为是没有真正的摄像头的,它取的景,是底层事先录好一个视频,然后喂给buff的。所以虚拟摄像头,需要修改processCaptureRequest这个函数。

        虚拟摄像头,只需要在这个函数里,按照app设置的帧率来循环读取视频里的数据,然后abgr的格式,喂给processCaptureResult这个函数,这个函数,再通过回调mCallbackOps->process_capture_result,返回给上面即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据来源:中经数据库 主要指标110多个(全部都是纯粹的 市辖区 指标),大致是: GDP GDP增速 第一产业增加值占GDP比重 第二产业增加值占GDP比重 第三产业增加值占GDP比重 人均GDP 社会消费品零售总额 固定资产投资(不含农户) 新设外商投资企业数_外商直接投资 实际利用外资金额(美元) 一般公共预算收入 一般公共预算支出 一般公共预算支出_教育 一般公共预算支出_科学技术 金融机构人民币各项存款余额_个人储蓄存款 金融机构人民币各项存款余额 金融机构人民币各项贷款余额 规模以上工业企业单位数 规模以上工业企业单位数_内资企业 规模以上工业企业单位数_港澳台商投资企业 规模以上工业企业单位数_外商投资企业 规模以上工业总产值 规模以上工业总产值_内资企业 规模以上工业总产值_港澳台商投资企业 规模以上工业总产值_外商投资企业 规模以上工业企业流动资产合计 规模以上工业企业固定资产合计 规模以上工业企业利润总额 规模以上工业企业应交增值税 规模以上工业企业主营业务税金及附加 户籍人口数 年均户籍人口数 户籍人口自然增长率 第一产业就业人员占全部城镇单位就业人员比重 第二产业就业人员占全部城镇单位就业人员比重 第三产业就业人员占全部城镇单位就业人员比重 城镇非私营单位就业人员数 城镇非私营单位就业人员数_第一产业 城镇非私营单位就业人员数_第二产业 城镇非私营单位就业人员数_第三产业 城镇非私营单位就业人员数_农、林、牧、渔业 城镇非私营单位就业人员数_采矿业 城镇非私营单位就业人员数_制造业 城镇非私营单位就业人员数_电力、热力、燃气及水生产和供应业 城镇非私营单位就业人员数_建筑业 城镇非私营单位就业人员数_批发和零售业 城镇非私营单位就业人员数_交通运输、仓储和邮政业 城镇非私营单位就业人员数_住宿和餐饮业 城镇非私营单位就业人员数_信息传输、软件和信息技术服务业 城镇非私营单位就业人员数_金融业 城镇非私营单位就业人员数_房地产业 城镇非私营单位就业人员数_租赁和商务服务业 城镇非私营单位就业人员数_科学研究和技术服务业 城镇非私营单位就业人员数_水利、环境和公共设施管理业 城镇非私营单位就业人员数_居民服务、修理和其他服务业 城镇非私营单位就业人员数_教育 城镇非私营单位就业人员数_卫生和社会工作 城镇非私营单位就业人员数_文化、体育和娱乐业 城镇非私营单位就业人员数_公共管理、社会保障和社会组织 城镇非私营单位在岗职工平均人数 城镇就业人员数_私营企业和个体 城镇非私营单位在岗职工工资总额 城镇非私营单位在岗职工平均工资 城镇登记失业人员数 建成区面积 建设用地面积 建设用地面积_居住用地 液化石油气供气总量 液化石油气供气总量_居民家庭 人工煤气、天然气供气总量 人工煤气、天然气供气总量_居民家庭 液化石油气用气人口 人工煤气、天然气用气人口 城市公共汽电车运营车辆数 城市出租汽车运营车辆数 城市公共汽电车客运总量 道路面积 排水管道长度 建成区绿化覆盖面积 建成区绿化覆盖率 绿地面积 公园绿地面积 维护建设资金支出 土地面积 生活用水供水量 供水总量 全社会用电量 城乡居民生活用电量 工业生产用电量 房地产开发投资 房地产开发投资_住宅 限额以上批发和零售业法人单位数 限额以上批发和零售业商品销售总额 普通中学学校数 中等职业教育学校数 普通小学学校数 普通高等学校专任教师数 普通中学专任教师数 中等职业教育专任教师数 普通小学专任教师数 普通高等学校在校生数 普通中学在校生数 中等职业教育在校生数 普通小学在校生数 电视节目综合人口覆盖率 公共图书馆总藏量_图书 医疗卫生机构数_医院和卫生院 卫生人员数_执业(助理)医师 医疗卫生机构床位数_医院和卫生院 城镇职工基本养老保险参保人数 职工基本医疗保险参保人数 失业保险参保人数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值