diff options
| author | Zhijun He <zhijunhe@google.com> | 2015-06-01 15:44:31 -0700 | 
|---|---|---|
| committer | Zhijun He <zhijunhe@google.com> | 2015-06-03 20:22:06 -0700 | 
| commit | 1fa8999c91d5df81949aa723000058380cd3faa2 (patch) | |
| tree | 3ebf10fd408c34bc35108c24df5ccbd02e2153eb /services/camera | |
| parent | 4170eeec0a2dc2a9543b7e4674a43b3d2faac61d (diff) | |
| download | frameworks_av-1fa8999c91d5df81949aa723000058380cd3faa2.zip frameworks_av-1fa8999c91d5df81949aa723000058380cd3faa2.tar.gz frameworks_av-1fa8999c91d5df81949aa723000058380cd3faa2.tar.bz2  | |
Camera2: implement high speed video APIs
Bug: 21442271
Change-Id: Ia0ae5bbd3e8c81bad293c29987301a2457817d12
Diffstat (limited to 'services/camera')
8 files changed, 53 insertions, 10 deletions
diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp index b6f6677..4d276be 100644 --- a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp +++ b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp @@ -269,14 +269,34 @@ status_t CameraDeviceClient::cancelRequest(int requestId, int64_t* lastFrameNumb  status_t CameraDeviceClient::beginConfigure() {      // TODO: Implement this. -    ALOGE("%s: Not implemented yet.", __FUNCTION__); +    ALOGV("%s: Not implemented yet.", __FUNCTION__);      return OK;  } -status_t CameraDeviceClient::endConfigure() { +status_t CameraDeviceClient::endConfigure(bool isConstrainedHighSpeed) {      ALOGV("%s: ending configure (%d input stream, %zu output streams)",              __FUNCTION__, mInputStream.configured ? 1 : 0, mStreamMap.size()); +    // Sanitize the high speed session against necessary capability bit. +    if (isConstrainedHighSpeed) { +        CameraMetadata staticInfo = mDevice->info(); +        camera_metadata_entry_t entry = staticInfo.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES); +        bool isConstrainedHighSpeedSupported = false; +        for(size_t i = 0; i < entry.count; ++i) { +            uint8_t capability = entry.data.u8[i]; +            if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO) { +                isConstrainedHighSpeedSupported = true; +                break; +            } +        } +        if (!isConstrainedHighSpeedSupported) { +            ALOGE("%s: Camera %d: Try to create a constrained high speed configuration on a device" +                    " that doesn't support it.", +                          __FUNCTION__, mCameraId); +            return INVALID_OPERATION; +        } +    } +      status_t res;      if ( (res = checkPid(__FUNCTION__) ) != OK) return res; @@ -284,7 +304,7 @@ status_t CameraDeviceClient::endConfigure() {      if (!mDevice.get()) return DEAD_OBJECT; -    return mDevice->configureStreams(); +    return mDevice->configureStreams(isConstrainedHighSpeed);  }  status_t CameraDeviceClient::deleteStream(int streamId) { diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.h b/services/camera/libcameraservice/api2/CameraDeviceClient.h index b8d8bea..3bda70c 100644 --- a/services/camera/libcameraservice/api2/CameraDeviceClient.h +++ b/services/camera/libcameraservice/api2/CameraDeviceClient.h @@ -79,7 +79,7 @@ public:      virtual status_t beginConfigure(); -    virtual status_t endConfigure(); +    virtual status_t endConfigure(bool isConstrainedHighSpeed = false);      // Returns -EBUSY if device is not idle      virtual status_t      deleteStream(int streamId); diff --git a/services/camera/libcameraservice/common/CameraDeviceBase.h b/services/camera/libcameraservice/common/CameraDeviceBase.h index f02fc32..64236c5 100644 --- a/services/camera/libcameraservice/common/CameraDeviceBase.h +++ b/services/camera/libcameraservice/common/CameraDeviceBase.h @@ -157,7 +157,7 @@ class CameraDeviceBase : public virtual RefBase {       * - BAD_VALUE if the set of streams was invalid (e.g. fmts or sizes)       * - INVALID_OPERATION if the device was in the wrong state       */ -    virtual status_t configureStreams() = 0; +    virtual status_t configureStreams(bool isConstrainedHighSpeed = false) = 0;      // get the buffer producer of the input stream      virtual status_t getInputBufferProducer( diff --git a/services/camera/libcameraservice/common/CameraModule.cpp b/services/camera/libcameraservice/common/CameraModule.cpp index 2f0117d..fcbf958 100644 --- a/services/camera/libcameraservice/common/CameraModule.cpp +++ b/services/camera/libcameraservice/common/CameraModule.cpp @@ -116,6 +116,21 @@ void CameraModule::deriveCameraCharacteristicsKeys(          availableCharsKeys.push(ANDROID_STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES);          chars.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, availableCharsKeys); +        // Need update android.control.availableHighSpeedVideoConfigurations since HAL3.3 +        // adds batch size to this array. +        entry = chars.find(ANDROID_CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS); +        if (entry.count > 0) { +            Vector<int32_t> highSpeedConfig; +            for (size_t i = 0; i < entry.count; i += 4) { +                highSpeedConfig.add(entry.data.i32[i]); // width +                highSpeedConfig.add(entry.data.i32[i + 1]); // height +                highSpeedConfig.add(entry.data.i32[i + 2]); // fps_min +                highSpeedConfig.add(entry.data.i32[i + 3]); // fps_max +                highSpeedConfig.add(1); // batchSize_max. default to 1 for HAL3.2 +            } +            chars.update(ANDROID_CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS, +                    highSpeedConfig); +        }      }      return;  } diff --git a/services/camera/libcameraservice/device2/Camera2Device.cpp b/services/camera/libcameraservice/device2/Camera2Device.cpp index f6645f3..7aba0ee 100644 --- a/services/camera/libcameraservice/device2/Camera2Device.cpp +++ b/services/camera/libcameraservice/device2/Camera2Device.cpp @@ -415,7 +415,7 @@ status_t Camera2Device::deleteReprocessStream(int id) {      return OK;  } -status_t Camera2Device::configureStreams() { +status_t Camera2Device::configureStreams(bool isConstrainedHighSpeed) {      ATRACE_CALL();      ALOGV("%s: E", __FUNCTION__); diff --git a/services/camera/libcameraservice/device2/Camera2Device.h b/services/camera/libcameraservice/device2/Camera2Device.h index fd1240a..a9affa2 100644 --- a/services/camera/libcameraservice/device2/Camera2Device.h +++ b/services/camera/libcameraservice/device2/Camera2Device.h @@ -68,7 +68,7 @@ class Camera2Device: public CameraDeviceBase {      virtual status_t deleteStream(int id);      virtual status_t deleteReprocessStream(int id);      // No-op on HAL2 devices -    virtual status_t configureStreams(); +    virtual status_t configureStreams(bool isConstrainedHighSpeed = false);      virtual status_t getInputBufferProducer(              sp<IGraphicBufferProducer> *producer);      virtual status_t createDefaultRequest(int templateId, CameraMetadata *request); diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 45d9421..731f74c 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -419,6 +419,8 @@ status_t Camera3Device::dump(int fd, const Vector<String16> &args) {          lines.appendFormat("    Error cause: %s\n", mErrorCause.string());      }      lines.appendFormat("    Stream configuration:\n"); +    lines.appendFormat("    Operation mode: %s \n", mIsConstrainedHighSpeedConfiguration ? +            "CONSTAINED HIGH SPEED VIDEO" : "NORMAL");      if (mInputStream != NULL) {          write(fd, lines.string(), lines.size()); @@ -1023,12 +1025,13 @@ status_t Camera3Device::deleteReprocessStream(int id) {      return INVALID_OPERATION;  } -status_t Camera3Device::configureStreams() { +status_t Camera3Device::configureStreams(bool isConstrainedHighSpeed) {      ATRACE_CALL();      ALOGV("%s: E", __FUNCTION__);      Mutex::Autolock il(mInterfaceLock);      Mutex::Autolock l(mLock); +    mIsConstrainedHighSpeedConfiguration = isConstrainedHighSpeed;      return configureStreamsLocked();  } @@ -1528,7 +1531,9 @@ status_t Camera3Device::configureStreamsLocked() {      ALOGV("%s: Camera %d: Starting stream configuration", __FUNCTION__, mId);      camera3_stream_configuration config; - +    config.operation_mode = mIsConstrainedHighSpeedConfiguration ? +            CAMERA3_STREAM_CONFIGURATION_CONSTRAINED_HIGH_SPEED_MODE : +            CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE;      config.num_streams = (mInputStream != NULL) + mOutputStreams.size();      Vector<camera3_stream_t*> streams; diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h index b9313fc..b3db2e9 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.h +++ b/services/camera/libcameraservice/device3/Camera3Device.h @@ -115,7 +115,7 @@ class Camera3Device :      virtual status_t deleteStream(int id);      virtual status_t deleteReprocessStream(int id); -    virtual status_t configureStreams(); +    virtual status_t configureStreams(bool isConstraiedHighSpeed = false);      virtual status_t getInputBufferProducer(              sp<IGraphicBufferProducer> *producer); @@ -173,6 +173,9 @@ class Camera3Device :      // Camera device ID      const int                  mId; +    // Flag indicating is the current active stream configuration is constrained high speed. +    bool                       mIsConstrainedHighSpeedConfiguration; +      /**** Scope for mLock ****/      camera3_device_t          *mHal3Device;  | 
