diff --git a/tools/emulator/system/camera/EmulatedCamera2.cpp b/tools/emulator/system/camera/EmulatedCamera2.cpp index 1634b2f6b..599bd161d 100644 --- a/tools/emulator/system/camera/EmulatedCamera2.cpp +++ b/tools/emulator/system/camera/EmulatedCamera2.cpp @@ -22,7 +22,7 @@ * for all camera API calls that defined by camera2_device_ops_t API. */ -#define LOG_NDEBUG 0 +//#define LOG_NDEBUG 0 #define LOG_TAG "EmulatedCamera2_Camera" #include diff --git a/tools/emulator/system/camera/EmulatedCameraFactory.cpp b/tools/emulator/system/camera/EmulatedCameraFactory.cpp index 48d1d99a5..84248caa6 100755 --- a/tools/emulator/system/camera/EmulatedCameraFactory.cpp +++ b/tools/emulator/system/camera/EmulatedCameraFactory.cpp @@ -19,7 +19,7 @@ * available for emulation. */ -#define LOG_NDEBUG 0 +//#define LOG_NDEBUG 0 #define LOG_TAG "EmulatedCamera_Factory" #include #include @@ -44,6 +44,7 @@ EmulatedCameraFactory::EmulatedCameraFactory() mFakeCameraNum(0), mConstructedOK(false) { + status_t res; /* Connect to the factory service in the emulator, and create Qemu cameras. */ if (mQemuClient.connectClient(NULL) == NO_ERROR) { /* Connection has succeeded. Create emulated cameras for each camera @@ -90,7 +91,10 @@ EmulatedCameraFactory::EmulatedCameraFactory() if (mEmulatedCameras[camera_id] != NULL) { ALOGV("%s: Back camera device version is %d", __FUNCTION__, getBackCameraHalVersion()); - if (mEmulatedCameras[camera_id]->Initialize() != NO_ERROR) { + res = mEmulatedCameras[camera_id]->Initialize(); + if (res != NO_ERROR) { + ALOGE("%s: Unable to intialize back camera %d: %s (%d)", + __FUNCTION__, camera_id, strerror(-res), res); delete mEmulatedCameras[camera_id]; mEmulatedCameraNum--; } @@ -139,7 +143,10 @@ EmulatedCameraFactory::EmulatedCameraFactory() if (mEmulatedCameras[camera_id] != NULL) { ALOGV("%s: Front camera device version is %d", __FUNCTION__, getFrontCameraHalVersion()); - if (mEmulatedCameras[camera_id]->Initialize() != NO_ERROR) { + res = mEmulatedCameras[camera_id]->Initialize(); + if (res != NO_ERROR) { + ALOGE("%s: Unable to intialize front camera %d: %s (%d)", + __FUNCTION__, camera_id, strerror(-res), res); delete mEmulatedCameras[camera_id]; mEmulatedCameraNum--; } diff --git a/tools/emulator/system/camera/EmulatedFakeCamera2.cpp b/tools/emulator/system/camera/EmulatedFakeCamera2.cpp index bd4c579a9..2e4259e9c 100644 --- a/tools/emulator/system/camera/EmulatedFakeCamera2.cpp +++ b/tools/emulator/system/camera/EmulatedFakeCamera2.cpp @@ -19,7 +19,7 @@ * functionality of an advanced fake camera. */ -#define LOG_NDEBUG 0 +//#define LOG_NDEBUG 0 #define LOG_TAG "EmulatedCamera_FakeCamera2" #include @@ -30,23 +30,40 @@ namespace android { -const uint32_t EmulatedFakeCamera2::kAvailableFormats[1] = { - HAL_PIXEL_FORMAT_RAW_SENSOR +const uint32_t EmulatedFakeCamera2::kAvailableFormats[3] = { + HAL_PIXEL_FORMAT_RAW_SENSOR, + HAL_PIXEL_FORMAT_YV12, + HAL_PIXEL_FORMAT_YCrCb_420_SP }; -const uint32_t EmulatedFakeCamera2::kAvailableSizesPerFormat[1] = { - 1 -}; - -const uint32_t EmulatedFakeCamera2::kAvailableSizes[2] = { +const uint32_t EmulatedFakeCamera2::kAvailableRawSizes[2] = { 640, 480 // Sensor::kResolution[0], Sensor::kResolution[1] }; -const uint64_t EmulatedFakeCamera2::kAvailableMinFrameDurations[1] = { +const uint64_t EmulatedFakeCamera2::kAvailableRawMinDurations[1] = { Sensor::kFrameDurationRange[0] }; +const uint32_t EmulatedFakeCamera2::kAvailableProcessedSizes[2] = { + 640, 480 + // Sensor::kResolution[0], Sensor::kResolution[1] +}; + +const uint64_t EmulatedFakeCamera2::kAvailableProcessedMinDurations[1] = { + Sensor::kFrameDurationRange[0] +}; + +const uint32_t EmulatedFakeCamera2::kAvailableJpegSizes[2] = { + 640, 480 + // Sensor::kResolution[0], Sensor::kResolution[1] +}; + +const uint64_t EmulatedFakeCamera2::kAvailableJpegMinDurations[1] = { + Sensor::kFrameDurationRange[0] +}; + + EmulatedFakeCamera2::EmulatedFakeCamera2(int cameraId, bool facingBack, struct hw_module_t* module) @@ -69,55 +86,20 @@ EmulatedFakeCamera2::~EmulatedFakeCamera2() { status_t EmulatedFakeCamera2::Initialize() { status_t res; - mCameraInfo = allocate_camera_metadata(10,100); - res = add_camera_metadata_entry(mCameraInfo, - ANDROID_SENSOR_EXPOSURE_TIME_RANGE, - Sensor::kExposureTimeRange, 2); - - res = add_camera_metadata_entry(mCameraInfo, - ANDROID_SENSOR_MAX_FRAME_DURATION, - &Sensor::kFrameDurationRange[1], 1); - - res = add_camera_metadata_entry(mCameraInfo, - ANDROID_SENSOR_AVAILABLE_SENSITIVITIES, - Sensor::kAvailableSensitivities, - sizeof(Sensor::kAvailableSensitivities) - /sizeof(uint32_t)); - - res = add_camera_metadata_entry(mCameraInfo, - ANDROID_SENSOR_COLOR_FILTER_ARRANGEMENT, - &Sensor::kColorFilterArrangement, 1); - - res = add_camera_metadata_entry(mCameraInfo, - ANDROID_SENSOR_PIXEL_ARRAY_SIZE, - Sensor::kResolution, 2); - - res = add_camera_metadata_entry(mCameraInfo, - ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, - Sensor::kResolution, 2); - - res = add_camera_metadata_entry(mCameraInfo, - ANDROID_SCALER_AVAILABLE_FORMATS, - kAvailableFormats, - sizeof(kAvailableFormats)/sizeof(uint32_t)); - - res = add_camera_metadata_entry(mCameraInfo, - ANDROID_SCALER_AVAILABLE_SIZES_PER_FORMAT, - kAvailableSizesPerFormat, - sizeof(kAvailableSizesPerFormat)/sizeof(uint32_t)); - - res = add_camera_metadata_entry(mCameraInfo, - ANDROID_SCALER_AVAILABLE_SIZES, - kAvailableSizes, - sizeof(kAvailableSizes)/sizeof(uint32_t)); - - res = add_camera_metadata_entry(mCameraInfo, - ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, - kAvailableMinFrameDurations, - sizeof(kAvailableMinFrameDurations)/sizeof(uint32_t)); - - // TODO: Add all the others + res = constructStaticInfo(&mCameraInfo, true); + if (res != OK) { + ALOGE("%s: Unable to allocate static info: %s (%d)", + __FUNCTION__, strerror(-res), res); + return res; + } + res = constructStaticInfo(&mCameraInfo, false); + if (res != OK) { + ALOGE("%s: Unable to fill in static info: %s (%d)", + __FUNCTION__, strerror(-res), res); + return res; + } + if (res != OK) return res; return NO_ERROR; } @@ -226,376 +208,6 @@ int EmulatedFakeCamera2::constructDefaultRequest( return res; } -status_t EmulatedFakeCamera2::constructDefaultRequest( - int request_template, - camera_metadata_t **request, - bool sizeRequest) { - - size_t entryCount = 0; - size_t dataCount = 0; - status_t ret; - -#define ADD_OR_SIZE( tag, data, count ) \ - if ( ( ret = addOrSize(*request, sizeRequest, &entryCount, &dataCount, \ - tag, data, count) ) != OK ) return ret - - static const int64_t USEC = 1000LL; - static const int64_t MSEC = USEC * 1000LL; - static const int64_t SEC = MSEC * 1000LL; - - /** android.request */ - - static const uint8_t metadataMode = ANDROID_REQUEST_METADATA_NONE; - ADD_OR_SIZE(ANDROID_REQUEST_METADATA_MODE, &metadataMode, 1); - - // OUTPUT_STREAMS set by user - // FRAME_COUNT set by user - - /** android.lens */ - - static const float focusDistance = 0; - ADD_OR_SIZE(ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1); - - static const float aperture = 2.8f; - ADD_OR_SIZE(ANDROID_LENS_APERTURE, &aperture, 1); - - static const float focalLength = 5.0f; - ADD_OR_SIZE(ANDROID_LENS_FOCAL_LENGTH, &focalLength, 1); - - static const float filterDensity = 0; - ADD_OR_SIZE(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1); - - static const uint8_t opticalStabilizationMode = - ANDROID_LENS_OPTICAL_STABILIZATION_OFF; - ADD_OR_SIZE(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, - &opticalStabilizationMode, 1); - - // FOCUS_RANGE set only in frame - - /** android.sensor */ - - static const int64_t exposureTime = 30 * MSEC; - ADD_OR_SIZE(ANDROID_SENSOR_EXPOSURE_TIME, &exposureTime, 1); - - static const int64_t frameDuration = 33333333L; // 1/30 s - ADD_OR_SIZE(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1); - - static const int32_t sensitivity = 400; - ADD_OR_SIZE(ANDROID_SENSOR_SENSITIVITY, &sensitivity, 1); - - // TIMESTAMP set only in frame - - /** android.flash */ - - uint8_t flashMode = 0; - switch (request_template) { - case CAMERA2_TEMPLATE_PREVIEW: - flashMode = ANDROID_FLASH_OFF; - break; - case CAMERA2_TEMPLATE_STILL_CAPTURE: - flashMode = ANDROID_FLASH_AUTO_SINGLE; - break; - case CAMERA2_TEMPLATE_VIDEO_RECORD: - flashMode = ANDROID_FLASH_OFF; - break; - case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: - flashMode = ANDROID_FLASH_OFF; - break; - case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: - flashMode = ANDROID_FLASH_OFF; - break; - default: - flashMode = ANDROID_FLASH_OFF; - break; - } - ADD_OR_SIZE(ANDROID_FLASH_MODE, &flashMode, 1); - - static const uint8_t flashPower = 10; - ADD_OR_SIZE(ANDROID_FLASH_FIRING_POWER, &flashPower, 1); - - static const int64_t firingTime = 0; - ADD_OR_SIZE(ANDROID_FLASH_FIRING_TIME, &firingTime, 1); - - /** Processing block modes */ - uint8_t hotPixelMode = 0; - uint8_t demosaicMode = 0; - uint8_t noiseMode = 0; - uint8_t shadingMode = 0; - uint8_t geometricMode = 0; - uint8_t colorMode = 0; - uint8_t tonemapMode = 0; - uint8_t edgeMode = 0; - switch (request_template) { - case CAMERA2_TEMPLATE_PREVIEW: - hotPixelMode = ANDROID_PROCESSING_FAST; - demosaicMode = ANDROID_PROCESSING_FAST; - noiseMode = ANDROID_PROCESSING_FAST; - shadingMode = ANDROID_PROCESSING_FAST; - geometricMode = ANDROID_PROCESSING_FAST; - colorMode = ANDROID_PROCESSING_FAST; - tonemapMode = ANDROID_PROCESSING_FAST; - edgeMode = ANDROID_PROCESSING_FAST; - break; - case CAMERA2_TEMPLATE_STILL_CAPTURE: - hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY; - demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY; - noiseMode = ANDROID_PROCESSING_HIGH_QUALITY; - shadingMode = ANDROID_PROCESSING_HIGH_QUALITY; - geometricMode = ANDROID_PROCESSING_HIGH_QUALITY; - colorMode = ANDROID_PROCESSING_HIGH_QUALITY; - tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY; - edgeMode = ANDROID_PROCESSING_HIGH_QUALITY; - break; - case CAMERA2_TEMPLATE_VIDEO_RECORD: - hotPixelMode = ANDROID_PROCESSING_FAST; - demosaicMode = ANDROID_PROCESSING_FAST; - noiseMode = ANDROID_PROCESSING_FAST; - shadingMode = ANDROID_PROCESSING_FAST; - geometricMode = ANDROID_PROCESSING_FAST; - colorMode = ANDROID_PROCESSING_FAST; - tonemapMode = ANDROID_PROCESSING_FAST; - edgeMode = ANDROID_PROCESSING_FAST; - break; - case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: - hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY; - demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY; - noiseMode = ANDROID_PROCESSING_HIGH_QUALITY; - shadingMode = ANDROID_PROCESSING_HIGH_QUALITY; - geometricMode = ANDROID_PROCESSING_HIGH_QUALITY; - colorMode = ANDROID_PROCESSING_HIGH_QUALITY; - tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY; - edgeMode = ANDROID_PROCESSING_HIGH_QUALITY; - break; - case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: - hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY; - demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY; - noiseMode = ANDROID_PROCESSING_HIGH_QUALITY; - shadingMode = ANDROID_PROCESSING_HIGH_QUALITY; - geometricMode = ANDROID_PROCESSING_HIGH_QUALITY; - colorMode = ANDROID_PROCESSING_HIGH_QUALITY; - tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY; - edgeMode = ANDROID_PROCESSING_HIGH_QUALITY; - break; - default: - hotPixelMode = ANDROID_PROCESSING_FAST; - demosaicMode = ANDROID_PROCESSING_FAST; - noiseMode = ANDROID_PROCESSING_FAST; - shadingMode = ANDROID_PROCESSING_FAST; - geometricMode = ANDROID_PROCESSING_FAST; - colorMode = ANDROID_PROCESSING_FAST; - tonemapMode = ANDROID_PROCESSING_FAST; - edgeMode = ANDROID_PROCESSING_FAST; - break; - } - ADD_OR_SIZE(ANDROID_HOT_PIXEL_MODE, &hotPixelMode, 1); - ADD_OR_SIZE(ANDROID_DEMOSAIC_MODE, &demosaicMode, 1); - ADD_OR_SIZE(ANDROID_NOISE_MODE, &noiseMode, 1); - ADD_OR_SIZE(ANDROID_SHADING_MODE, &shadingMode, 1); - ADD_OR_SIZE(ANDROID_GEOMETRIC_MODE, &geometricMode, 1); - ADD_OR_SIZE(ANDROID_COLOR_MODE, &colorMode, 1); - ADD_OR_SIZE(ANDROID_TONEMAP_MODE, &tonemapMode, 1); - ADD_OR_SIZE(ANDROID_EDGE_MODE, &edgeMode, 1); - - /** android.noise */ - static const uint8_t noiseStrength = 5; - ADD_OR_SIZE(ANDROID_NOISE_STRENGTH, &noiseStrength, 1); - - /** android.color */ - static const float colorTransform[9] = { - 1.0f, 0.f, 0.f, - 0.f, 1.f, 0.f, - 0.f, 0.f, 1.f - }; - ADD_OR_SIZE(ANDROID_COLOR_TRANSFORM, colorTransform, 9); - - /** android.tonemap */ - static const float tonemapCurve[4] = { - 0.f, 0.f, - 1.f, 1.f - }; - ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_RED, tonemapCurve, 4); - ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_GREEN, tonemapCurve, 4); - ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_BLUE, tonemapCurve, 4); - - /** android.edge */ - static const uint8_t edgeStrength = 5; - ADD_OR_SIZE(ANDROID_EDGE_STRENGTH, &edgeStrength, 1); - - /** android.scaler */ - static const int32_t cropRegion[3] = { - 0, 0, Sensor::kResolution[0] - }; - ADD_OR_SIZE(ANDROID_SCALER_CROP_REGION, cropRegion, 3); - - /** android.jpeg */ - static const int32_t jpegQuality = 80; - ADD_OR_SIZE(ANDROID_JPEG_QUALITY, &jpegQuality, 1); - - static const int32_t thumbnailSize[2] = { - 640, 480 - }; - ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSize, 2); - - static const int32_t thumbnailQuality = 80; - ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_QUALITY, &thumbnailQuality, 1); - - static const double gpsCoordinates[2] = { - 0, 0 - }; - ADD_OR_SIZE(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 2); - - static const uint8_t gpsProcessingMethod[32] = "None"; - ADD_OR_SIZE(ANDROID_JPEG_GPS_PROCESSING_METHOD, gpsProcessingMethod, 32); - - static const int64_t gpsTimestamp = 0; - ADD_OR_SIZE(ANDROID_JPEG_GPS_TIMESTAMP, &gpsTimestamp, 1); - - static const int32_t jpegOrientation = 0; - ADD_OR_SIZE(ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1); - - /** android.stats */ - - static const uint8_t faceDetectMode = ANDROID_STATS_FACE_DETECTION_OFF; - ADD_OR_SIZE(ANDROID_STATS_FACE_DETECT_MODE, &faceDetectMode, 1); - - static const uint8_t histogramMode = ANDROID_STATS_OFF; - ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_MODE, &histogramMode, 1); - - static const uint8_t sharpnessMapMode = ANDROID_STATS_OFF; - ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_MODE, &sharpnessMapMode, 1); - - // faceRectangles, faceScores, faceLandmarks, faceIds, histogram, - // sharpnessMap only in frames - - /** android.control */ - - uint8_t controlIntent = 0; - switch (request_template) { - case CAMERA2_TEMPLATE_PREVIEW: - controlIntent = ANDROID_CONTROL_INTENT_PREVIEW; - break; - case CAMERA2_TEMPLATE_STILL_CAPTURE: - controlIntent = ANDROID_CONTROL_INTENT_STILL_CAPTURE; - break; - case CAMERA2_TEMPLATE_VIDEO_RECORD: - controlIntent = ANDROID_CONTROL_INTENT_VIDEO_RECORD; - break; - case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: - controlIntent = ANDROID_CONTROL_INTENT_VIDEO_SNAPSHOT; - break; - case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: - controlIntent = ANDROID_CONTROL_INTENT_ZERO_SHUTTER_LAG; - break; - default: - controlIntent = ANDROID_CONTROL_INTENT_CUSTOM; - break; - } - ADD_OR_SIZE(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); - - static const uint8_t controlMode = ANDROID_CONTROL_AUTO; - ADD_OR_SIZE(ANDROID_CONTROL_MODE, &controlMode, 1); - - static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_OFF; - ADD_OR_SIZE(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); - - static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; - ADD_OR_SIZE(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); - - static const uint8_t aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; - ADD_OR_SIZE(ANDROID_CONTROL_AE_MODE, &aeMode, 1); - - static const int32_t controlRegions[5] = { - 0, 0, Sensor::kResolution[0], Sensor::kResolution[1], 1000 - }; - ADD_OR_SIZE(ANDROID_CONTROL_AE_REGIONS, controlRegions, 5); - - static const int32_t aeExpCompensation = 0; - ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION, &aeExpCompensation, 1); - - static const int32_t aeTargetFpsRange[2] = { - 10, 30 - }; - ADD_OR_SIZE(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, aeTargetFpsRange, 2); - - static const uint8_t aeAntibandingMode = - ANDROID_CONTROL_AE_ANTIBANDING_AUTO; - ADD_OR_SIZE(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &aeAntibandingMode, 1); - - static const uint8_t awbMode = - ANDROID_CONTROL_AWB_AUTO; - ADD_OR_SIZE(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); - - ADD_OR_SIZE(ANDROID_CONTROL_AWB_REGIONS, controlRegions, 5); - - uint8_t afMode = 0; - switch (request_template) { - case CAMERA2_TEMPLATE_PREVIEW: - afMode = ANDROID_CONTROL_AF_AUTO; - break; - case CAMERA2_TEMPLATE_STILL_CAPTURE: - afMode = ANDROID_CONTROL_AF_AUTO; - break; - case CAMERA2_TEMPLATE_VIDEO_RECORD: - afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO; - break; - case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: - afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO; - break; - case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: - afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE; - break; - default: - afMode = ANDROID_CONTROL_AF_AUTO; - break; - } - ADD_OR_SIZE(ANDROID_CONTROL_AF_MODE, &afMode, 1); - - ADD_OR_SIZE(ANDROID_CONTROL_AF_REGIONS, controlRegions, 5); - - static const uint8_t vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF; - ADD_OR_SIZE(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vstabMode, 1); - - // aeState, awbState, afState only in frame - - /** Allocate metadata if sizing */ - if (sizeRequest) { - ALOGV("Allocating %d entries, %d extra bytes for " - "request template type %d", - entryCount, dataCount, request_template); - *request = allocate_camera_metadata(entryCount, dataCount); - if (*request == NULL) { - ALOGE("Unable to allocate new request template type %d " - "(%d entries, %d bytes extra data)", request_template, - entryCount, dataCount); - return NO_MEMORY; - } - } - return OK; -#undef ADD_OR_SIZE -} - -status_t EmulatedFakeCamera2::addOrSize(camera_metadata_t *request, - bool sizeRequest, - size_t *entryCount, - size_t *dataCount, - uint32_t tag, - const void *entryData, - size_t entryDataCount) { - status_t res; - if (!sizeRequest) { - return add_camera_metadata_entry(request, tag, entryData, - entryDataCount); - } else { - int type = get_camera_metadata_tag_type(tag); - if (type < 0 ) return BAD_VALUE; - (*entryCount)++; - (*dataCount) += calculate_camera_metadata_entry_data_size(type, - entryDataCount); - return OK; - } -} - - int EmulatedFakeCamera2::allocateStream( uint32_t width, uint32_t height, @@ -613,27 +225,37 @@ int EmulatedFakeCamera2::allocateStream( return BAD_VALUE; } - unsigned int numFormats = sizeof(kAvailableFormats) / sizeof(uint32_t); - unsigned int formatIdx = 0; - unsigned int sizeOffsetIdx = 0; - for (; formatIdx < numFormats; formatIdx++) { - if (format == (int)kAvailableFormats[formatIdx]) break; - sizeOffsetIdx += kAvailableSizesPerFormat[formatIdx]; + if (format != CAMERA2_HAL_PIXEL_FORMAT_OPAQUE) { + unsigned int numFormats = sizeof(kAvailableFormats) / sizeof(uint32_t); + unsigned int formatIdx = 0; + unsigned int sizeOffsetIdx = 0; + for (; formatIdx < numFormats; formatIdx++) { + if (format == (int)kAvailableFormats[formatIdx]) break; + } + if (formatIdx == numFormats) { + ALOGE("%s: Format 0x%x is not supported", __FUNCTION__, format); + return BAD_VALUE; + } } - if (formatIdx == numFormats) { - ALOGW("%s: Format 0x%x is not supported", __FUNCTION__, format); - return BAD_VALUE; + const uint32_t *availableSizes; + size_t availableSizeCount; + if (format == HAL_PIXEL_FORMAT_RAW_SENSOR) { + availableSizes = kAvailableRawSizes; + availableSizeCount = sizeof(kAvailableRawSizes)/sizeof(uint32_t); + } else { + availableSizes = kAvailableProcessedSizes; + availableSizeCount = sizeof(kAvailableProcessedSizes)/sizeof(uint32_t); } + // TODO: JPEG sizes + unsigned int resIdx = 0; - - for (; resIdx < kAvailableSizesPerFormat[formatIdx]; resIdx++) { - uint32_t widthMatch = kAvailableSizes[ (sizeOffsetIdx + resIdx)*2 + 0]; - uint32_t heightMatch = kAvailableSizes[ (sizeOffsetIdx + resIdx)*2 + 1]; - if (width == widthMatch && height == heightMatch) break; + for (; resIdx < availableSizeCount; resIdx++) { + if (availableSizes[resIdx * 2] == width && + availableSizes[resIdx * 2 + 1] == height) break; } - if (resIdx == kAvailableSizesPerFormat[formatIdx]) { - ALOGW("%s: Format 0x%x does not support resolution %d, %d", __FUNCTION__, + if (resIdx == availableSizeCount) { + ALOGE("%s: Format 0x%x does not support resolution %d, %d", __FUNCTION__, format, width, height); return BAD_VALUE; } @@ -1153,4 +775,646 @@ bool EmulatedFakeCamera2::ReadoutThread::threadLoop() { return true; } +/** Private methods */ + +status_t EmulatedFakeCamera2::constructStaticInfo( + camera_metadata_t **info, + bool sizeRequest) { + + size_t entryCount = 0; + size_t dataCount = 0; + status_t ret; + +#define ADD_OR_SIZE( tag, data, count ) \ + if ( ( ret = addOrSize(*info, sizeRequest, &entryCount, &dataCount, \ + tag, data, count) ) != OK ) return ret + + // android.lens + + static const float minFocusDistance = 0; + ADD_OR_SIZE(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, + &minFocusDistance, 1); + ADD_OR_SIZE(ANDROID_LENS_HYPERFOCAL_DISTANCE, + &minFocusDistance, 1); + + static const float focalLength = 3.30f; // mm + ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS, + &focalLength, 1); + static const float aperture = 2.8f; + ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_APERTURES, + &aperture, 1); + static const float filterDensity = 0; + ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FILTER_DENSITY, + &filterDensity, 1); + static const uint8_t availableOpticalStabilization = + ANDROID_LENS_OPTICAL_STABILIZATION_OFF; + ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_OPTICAL_STABILIZATION, + &availableOpticalStabilization, 1); + + static const int32_t lensShadingMapSize[] = {1, 1}; + ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP_SIZE, lensShadingMapSize, + sizeof(lensShadingMapSize)/sizeof(int32_t)); + + static const float lensShadingMap[3 * 1 * 1 ] = + { 1.f, 1.f, 1.f }; + ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP, lensShadingMap, + sizeof(lensShadingMap)/sizeof(float)); + + // Identity transform + static const int32_t geometricCorrectionMapSize[] = {2, 2}; + ADD_OR_SIZE(ANDROID_LENS_GEOMETRIC_CORRECTION_MAP_SIZE, + geometricCorrectionMapSize, + sizeof(geometricCorrectionMapSize)/sizeof(int32_t)); + + static const float geometricCorrectionMap[2 * 3 * 2 * 2] = { + 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, + 1.f, 0.f, 1.f, 0.f, 1.f, 0.f, + 0.f, 1.f, 0.f, 1.f, 0.f, 1.f, + 1.f, 1.f, 1.f, 1.f, 1.f, 1.f}; + ADD_OR_SIZE(ANDROID_LENS_GEOMETRIC_CORRECTION_MAP, + geometricCorrectionMap, + sizeof(geometricCorrectionMap)/sizeof(float)); + + int32_t lensFacing = mFacingBack ? + ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; + ADD_OR_SIZE(ANDROID_LENS_FACING, &lensFacing, 1); + + float lensPosition[3]; + if (mFacingBack) { + // Back-facing camera is center-top on device + lensPosition[0] = 0; + lensPosition[1] = 20; + lensPosition[2] = -5; + } else { + // Front-facing camera is center-right on device + lensPosition[0] = 20; + lensPosition[1] = 20; + lensPosition[2] = 0; + } + ADD_OR_SIZE(ANDROID_LENS_POSITION, lensPosition, sizeof(lensPosition)/ + sizeof(float)); + + // android.sensor + + ADD_OR_SIZE(ANDROID_SENSOR_EXPOSURE_TIME_RANGE, + Sensor::kExposureTimeRange, 2); + + ADD_OR_SIZE(ANDROID_SENSOR_MAX_FRAME_DURATION, + &Sensor::kFrameDurationRange[1], 1); + + ADD_OR_SIZE(ANDROID_SENSOR_AVAILABLE_SENSITIVITIES, + Sensor::kAvailableSensitivities, + sizeof(Sensor::kAvailableSensitivities) + /sizeof(uint32_t)); + + ADD_OR_SIZE(ANDROID_SENSOR_COLOR_FILTER_ARRANGEMENT, + &Sensor::kColorFilterArrangement, 1); + + static const float sensorPhysicalSize[2] = {3.20f, 2.40f}; // mm + ADD_OR_SIZE(ANDROID_SENSOR_PHYSICAL_SIZE, + sensorPhysicalSize, 2); + + ADD_OR_SIZE(ANDROID_SENSOR_PIXEL_ARRAY_SIZE, + Sensor::kResolution, 2); + + ADD_OR_SIZE(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, + Sensor::kResolution, 2); + + ADD_OR_SIZE(ANDROID_SENSOR_WHITE_LEVEL, + &Sensor::kMaxRawValue, 1); + + static const int32_t blackLevelPattern[4] = { + Sensor::kBlackLevel, Sensor::kBlackLevel, + Sensor::kBlackLevel, Sensor::kBlackLevel + }; + ADD_OR_SIZE(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, + blackLevelPattern, sizeof(blackLevelPattern)/sizeof(int32_t)); + + //TODO: sensor color calibration fields + + // android.flash + static const uint8_t flashAvailable = 0; + ADD_OR_SIZE(ANDROID_FLASH_AVAILABLE, &flashAvailable, 1); + + static const int64_t flashChargeDuration = 0; + ADD_OR_SIZE(ANDROID_FLASH_CHARGE_DURATION, &flashChargeDuration, 1); + + // android.tonemap + + static const int32_t tonemapCurvePoints = 128; + ADD_OR_SIZE(ANDROID_TONEMAP_MAX_CURVE_POINTS, &tonemapCurvePoints, 1); + + // android.scaler + + ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_FORMATS, + kAvailableFormats, + sizeof(kAvailableFormats)/sizeof(uint32_t)); + + ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_SIZES, + kAvailableRawSizes, + sizeof(kAvailableRawSizes)/sizeof(uint32_t)); + + ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, + kAvailableRawMinDurations, + sizeof(kAvailableRawMinDurations)/sizeof(uint64_t)); + + ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, + kAvailableProcessedSizes, + sizeof(kAvailableProcessedSizes)/sizeof(uint32_t)); + + ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS, + kAvailableProcessedMinDurations, + sizeof(kAvailableProcessedMinDurations)/sizeof(uint64_t)); + + ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, + kAvailableJpegSizes, + sizeof(kAvailableJpegSizes)/sizeof(uint32_t)); + + ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS, + kAvailableJpegMinDurations, + sizeof(kAvailableJpegMinDurations)/sizeof(uint64_t)); + + static const float maxZoom = 10; + ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, + &maxZoom, 1); + + // android.jpeg + + static const int32_t jpegThumbnailSizes[] = { + 160, 120, + 320, 240, + 640, 480 + }; + ADD_OR_SIZE(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, + jpegThumbnailSizes, sizeof(jpegThumbnailSizes)/sizeof(int32_t)); + + // android.stats + + static const uint8_t availableFaceDetectModes[] = { + ANDROID_STATS_FACE_DETECTION_OFF + }; + ADD_OR_SIZE(ANDROID_STATS_AVAILABLE_FACE_DETECT_MODES, + availableFaceDetectModes, + sizeof(availableFaceDetectModes)); + + static const int32_t maxFaceCount = 0; + ADD_OR_SIZE(ANDROID_STATS_MAX_FACE_COUNT, + &maxFaceCount, 1); + + static const int32_t histogramSize = 64; + ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_BUCKET_COUNT, + &histogramSize, 1); + + static const int32_t maxHistogramCount = 1000; + ADD_OR_SIZE(ANDROID_STATS_MAX_HISTOGRAM_COUNT, + &maxHistogramCount, 1); + + static const int32_t sharpnessMapSize[2] = {64, 64}; + ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_SIZE, + sharpnessMapSize, sizeof(sharpnessMapSize)/sizeof(int32_t)); + + static const int32_t maxSharpnessMapValue = 1000; + ADD_OR_SIZE(ANDROID_STATS_MAX_SHARPNESS_MAP_VALUE, + &maxSharpnessMapValue, 1); + + // android.control + + static const uint8_t availableSceneModes[] = { + ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED + }; + ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, + availableSceneModes, sizeof(availableSceneModes)); + + static const uint8_t availableEffects[] = { + ANDROID_CONTROL_EFFECT_OFF + }; + ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_EFFECTS, + availableEffects, sizeof(availableEffects)); + + int32_t max3aRegions = 0; + ADD_OR_SIZE(ANDROID_CONTROL_MAX_REGIONS, + &max3aRegions, 1); + + static const uint8_t availableAeModes[] = { + ANDROID_CONTROL_AE_OFF, + ANDROID_CONTROL_AE_ON + }; + ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_MODES, + availableAeModes, sizeof(availableAeModes)); + + static const camera_metadata_rational exposureCompensationStep = { + 1, 3 + }; + ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, + &exposureCompensationStep, 1); + + int32_t exposureCompensationRange[] = {-9, 9}; + ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, + exposureCompensationRange, + sizeof(exposureCompensationRange)/sizeof(int32_t)); + + static const int32_t availableTargetFpsRanges[] = { + 5, 30 + }; + ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, + availableTargetFpsRanges, + sizeof(availableTargetFpsRanges)/sizeof(int32_t)); + + static const uint8_t availableAntibandingModes[] = { + ANDROID_CONTROL_AE_ANTIBANDING_OFF, + ANDROID_CONTROL_AE_ANTIBANDING_AUTO + }; + ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, + availableAntibandingModes, sizeof(availableAntibandingModes)); + + static const uint8_t availableAwbModes[] = { + ANDROID_CONTROL_AWB_OFF, + ANDROID_CONTROL_AWB_AUTO, + ANDROID_CONTROL_AWB_INCANDESCENT, + ANDROID_CONTROL_AWB_FLUORESCENT, + ANDROID_CONTROL_AWB_DAYLIGHT, + ANDROID_CONTROL_AWB_SHADE + }; + ADD_OR_SIZE(ANDROID_CONTROL_AWB_AVAILABLE_MODES, + availableAwbModes, sizeof(availableAwbModes)); + + static const uint8_t availableAfModes[] = { + ANDROID_CONTROL_AF_OFF + }; + ADD_OR_SIZE(ANDROID_CONTROL_AF_AVAILABLE_MODES, + availableAfModes, sizeof(availableAfModes)); + + static const uint8_t availableVstabModes[] = { + ANDROID_CONTROL_VIDEO_STABILIZATION_OFF + }; + ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, + availableVstabModes, sizeof(availableVstabModes)); + +#undef ADD_OR_SIZE + /** Allocate metadata if sizing */ + if (sizeRequest) { + ALOGV("Allocating %d entries, %d extra bytes for " + "static camera info", + entryCount, dataCount); + *info = allocate_camera_metadata(entryCount, dataCount); + if (*info == NULL) { + ALOGE("Unable to allocate camera static info" + "(%d entries, %d bytes extra data)", + entryCount, dataCount); + return NO_MEMORY; + } + } + return OK; +} + +status_t EmulatedFakeCamera2::constructDefaultRequest( + int request_template, + camera_metadata_t **request, + bool sizeRequest) { + + size_t entryCount = 0; + size_t dataCount = 0; + status_t ret; + +#define ADD_OR_SIZE( tag, data, count ) \ + if ( ( ret = addOrSize(*request, sizeRequest, &entryCount, &dataCount, \ + tag, data, count) ) != OK ) return ret + + static const int64_t USEC = 1000LL; + static const int64_t MSEC = USEC * 1000LL; + static const int64_t SEC = MSEC * 1000LL; + + /** android.request */ + + static const uint8_t metadataMode = ANDROID_REQUEST_METADATA_NONE; + ADD_OR_SIZE(ANDROID_REQUEST_METADATA_MODE, &metadataMode, 1); + + // OUTPUT_STREAMS set by user + // FRAME_COUNT set by user + + /** android.lens */ + + static const float focusDistance = 0; + ADD_OR_SIZE(ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1); + + static const float aperture = 2.8f; + ADD_OR_SIZE(ANDROID_LENS_APERTURE, &aperture, 1); + + static const float focalLength = 5.0f; + ADD_OR_SIZE(ANDROID_LENS_FOCAL_LENGTH, &focalLength, 1); + + static const float filterDensity = 0; + ADD_OR_SIZE(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1); + + static const uint8_t opticalStabilizationMode = + ANDROID_LENS_OPTICAL_STABILIZATION_OFF; + ADD_OR_SIZE(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, + &opticalStabilizationMode, 1); + + // FOCUS_RANGE set only in frame + + /** android.sensor */ + + static const int64_t exposureTime = 30 * MSEC; + ADD_OR_SIZE(ANDROID_SENSOR_EXPOSURE_TIME, &exposureTime, 1); + + static const int64_t frameDuration = 33333333L; // 1/30 s + ADD_OR_SIZE(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1); + + static const int32_t sensitivity = 400; + ADD_OR_SIZE(ANDROID_SENSOR_SENSITIVITY, &sensitivity, 1); + + // TIMESTAMP set only in frame + + /** android.flash */ + + static const uint8_t flashMode = ANDROID_FLASH_OFF; + ADD_OR_SIZE(ANDROID_FLASH_MODE, &flashMode, 1); + + static const uint8_t flashPower = 10; + ADD_OR_SIZE(ANDROID_FLASH_FIRING_POWER, &flashPower, 1); + + static const int64_t firingTime = 0; + ADD_OR_SIZE(ANDROID_FLASH_FIRING_TIME, &firingTime, 1); + + /** Processing block modes */ + uint8_t hotPixelMode = 0; + uint8_t demosaicMode = 0; + uint8_t noiseMode = 0; + uint8_t shadingMode = 0; + uint8_t geometricMode = 0; + uint8_t colorMode = 0; + uint8_t tonemapMode = 0; + uint8_t edgeMode = 0; + switch (request_template) { + case CAMERA2_TEMPLATE_PREVIEW: + hotPixelMode = ANDROID_PROCESSING_FAST; + demosaicMode = ANDROID_PROCESSING_FAST; + noiseMode = ANDROID_PROCESSING_FAST; + shadingMode = ANDROID_PROCESSING_FAST; + geometricMode = ANDROID_PROCESSING_FAST; + colorMode = ANDROID_PROCESSING_FAST; + tonemapMode = ANDROID_PROCESSING_FAST; + edgeMode = ANDROID_PROCESSING_FAST; + break; + case CAMERA2_TEMPLATE_STILL_CAPTURE: + hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY; + demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY; + noiseMode = ANDROID_PROCESSING_HIGH_QUALITY; + shadingMode = ANDROID_PROCESSING_HIGH_QUALITY; + geometricMode = ANDROID_PROCESSING_HIGH_QUALITY; + colorMode = ANDROID_PROCESSING_HIGH_QUALITY; + tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY; + edgeMode = ANDROID_PROCESSING_HIGH_QUALITY; + break; + case CAMERA2_TEMPLATE_VIDEO_RECORD: + hotPixelMode = ANDROID_PROCESSING_FAST; + demosaicMode = ANDROID_PROCESSING_FAST; + noiseMode = ANDROID_PROCESSING_FAST; + shadingMode = ANDROID_PROCESSING_FAST; + geometricMode = ANDROID_PROCESSING_FAST; + colorMode = ANDROID_PROCESSING_FAST; + tonemapMode = ANDROID_PROCESSING_FAST; + edgeMode = ANDROID_PROCESSING_FAST; + break; + case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: + hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY; + demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY; + noiseMode = ANDROID_PROCESSING_HIGH_QUALITY; + shadingMode = ANDROID_PROCESSING_HIGH_QUALITY; + geometricMode = ANDROID_PROCESSING_HIGH_QUALITY; + colorMode = ANDROID_PROCESSING_HIGH_QUALITY; + tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY; + edgeMode = ANDROID_PROCESSING_HIGH_QUALITY; + break; + case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: + hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY; + demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY; + noiseMode = ANDROID_PROCESSING_HIGH_QUALITY; + shadingMode = ANDROID_PROCESSING_HIGH_QUALITY; + geometricMode = ANDROID_PROCESSING_HIGH_QUALITY; + colorMode = ANDROID_PROCESSING_HIGH_QUALITY; + tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY; + edgeMode = ANDROID_PROCESSING_HIGH_QUALITY; + break; + default: + hotPixelMode = ANDROID_PROCESSING_FAST; + demosaicMode = ANDROID_PROCESSING_FAST; + noiseMode = ANDROID_PROCESSING_FAST; + shadingMode = ANDROID_PROCESSING_FAST; + geometricMode = ANDROID_PROCESSING_FAST; + colorMode = ANDROID_PROCESSING_FAST; + tonemapMode = ANDROID_PROCESSING_FAST; + edgeMode = ANDROID_PROCESSING_FAST; + break; + } + ADD_OR_SIZE(ANDROID_HOT_PIXEL_MODE, &hotPixelMode, 1); + ADD_OR_SIZE(ANDROID_DEMOSAIC_MODE, &demosaicMode, 1); + ADD_OR_SIZE(ANDROID_NOISE_MODE, &noiseMode, 1); + ADD_OR_SIZE(ANDROID_SHADING_MODE, &shadingMode, 1); + ADD_OR_SIZE(ANDROID_GEOMETRIC_MODE, &geometricMode, 1); + ADD_OR_SIZE(ANDROID_COLOR_MODE, &colorMode, 1); + ADD_OR_SIZE(ANDROID_TONEMAP_MODE, &tonemapMode, 1); + ADD_OR_SIZE(ANDROID_EDGE_MODE, &edgeMode, 1); + + /** android.noise */ + static const uint8_t noiseStrength = 5; + ADD_OR_SIZE(ANDROID_NOISE_STRENGTH, &noiseStrength, 1); + + /** android.color */ + static const float colorTransform[9] = { + 1.0f, 0.f, 0.f, + 0.f, 1.f, 0.f, + 0.f, 0.f, 1.f + }; + ADD_OR_SIZE(ANDROID_COLOR_TRANSFORM, colorTransform, 9); + + /** android.tonemap */ + static const float tonemapCurve[4] = { + 0.f, 0.f, + 1.f, 1.f + }; + ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_RED, tonemapCurve, 4); + ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_GREEN, tonemapCurve, 4); + ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_BLUE, tonemapCurve, 4); + + /** android.edge */ + static const uint8_t edgeStrength = 5; + ADD_OR_SIZE(ANDROID_EDGE_STRENGTH, &edgeStrength, 1); + + /** android.scaler */ + static const int32_t cropRegion[3] = { + 0, 0, Sensor::kResolution[0] + }; + ADD_OR_SIZE(ANDROID_SCALER_CROP_REGION, cropRegion, 3); + + /** android.jpeg */ + static const int32_t jpegQuality = 80; + ADD_OR_SIZE(ANDROID_JPEG_QUALITY, &jpegQuality, 1); + + static const int32_t thumbnailSize[2] = { + 640, 480 + }; + ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSize, 2); + + static const int32_t thumbnailQuality = 80; + ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_QUALITY, &thumbnailQuality, 1); + + static const double gpsCoordinates[2] = { + 0, 0 + }; + ADD_OR_SIZE(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 2); + + static const uint8_t gpsProcessingMethod[32] = "None"; + ADD_OR_SIZE(ANDROID_JPEG_GPS_PROCESSING_METHOD, gpsProcessingMethod, 32); + + static const int64_t gpsTimestamp = 0; + ADD_OR_SIZE(ANDROID_JPEG_GPS_TIMESTAMP, &gpsTimestamp, 1); + + static const int32_t jpegOrientation = 0; + ADD_OR_SIZE(ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1); + + /** android.stats */ + + static const uint8_t faceDetectMode = ANDROID_STATS_FACE_DETECTION_OFF; + ADD_OR_SIZE(ANDROID_STATS_FACE_DETECT_MODE, &faceDetectMode, 1); + + static const uint8_t histogramMode = ANDROID_STATS_OFF; + ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_MODE, &histogramMode, 1); + + static const uint8_t sharpnessMapMode = ANDROID_STATS_OFF; + ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_MODE, &sharpnessMapMode, 1); + + // faceRectangles, faceScores, faceLandmarks, faceIds, histogram, + // sharpnessMap only in frames + + /** android.control */ + + uint8_t controlIntent = 0; + switch (request_template) { + case CAMERA2_TEMPLATE_PREVIEW: + controlIntent = ANDROID_CONTROL_INTENT_PREVIEW; + break; + case CAMERA2_TEMPLATE_STILL_CAPTURE: + controlIntent = ANDROID_CONTROL_INTENT_STILL_CAPTURE; + break; + case CAMERA2_TEMPLATE_VIDEO_RECORD: + controlIntent = ANDROID_CONTROL_INTENT_VIDEO_RECORD; + break; + case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: + controlIntent = ANDROID_CONTROL_INTENT_VIDEO_SNAPSHOT; + break; + case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: + controlIntent = ANDROID_CONTROL_INTENT_ZERO_SHUTTER_LAG; + break; + default: + controlIntent = ANDROID_CONTROL_INTENT_CUSTOM; + break; + } + ADD_OR_SIZE(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); + + static const uint8_t controlMode = ANDROID_CONTROL_AUTO; + ADD_OR_SIZE(ANDROID_CONTROL_MODE, &controlMode, 1); + + static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_OFF; + ADD_OR_SIZE(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); + + static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; + ADD_OR_SIZE(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); + + static const uint8_t aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; + ADD_OR_SIZE(ANDROID_CONTROL_AE_MODE, &aeMode, 1); + + static const int32_t controlRegions[5] = { + 0, 0, Sensor::kResolution[0], Sensor::kResolution[1], 1000 + }; + ADD_OR_SIZE(ANDROID_CONTROL_AE_REGIONS, controlRegions, 5); + + static const int32_t aeExpCompensation = 0; + ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION, &aeExpCompensation, 1); + + static const int32_t aeTargetFpsRange[2] = { + 10, 30 + }; + ADD_OR_SIZE(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, aeTargetFpsRange, 2); + + static const uint8_t aeAntibandingMode = + ANDROID_CONTROL_AE_ANTIBANDING_AUTO; + ADD_OR_SIZE(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &aeAntibandingMode, 1); + + static const uint8_t awbMode = + ANDROID_CONTROL_AWB_AUTO; + ADD_OR_SIZE(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); + + ADD_OR_SIZE(ANDROID_CONTROL_AWB_REGIONS, controlRegions, 5); + + uint8_t afMode = 0; + switch (request_template) { + case CAMERA2_TEMPLATE_PREVIEW: + afMode = ANDROID_CONTROL_AF_AUTO; + break; + case CAMERA2_TEMPLATE_STILL_CAPTURE: + afMode = ANDROID_CONTROL_AF_AUTO; + break; + case CAMERA2_TEMPLATE_VIDEO_RECORD: + afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO; + break; + case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: + afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO; + break; + case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: + afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE; + break; + default: + afMode = ANDROID_CONTROL_AF_AUTO; + break; + } + ADD_OR_SIZE(ANDROID_CONTROL_AF_MODE, &afMode, 1); + + ADD_OR_SIZE(ANDROID_CONTROL_AF_REGIONS, controlRegions, 5); + + static const uint8_t vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF; + ADD_OR_SIZE(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vstabMode, 1); + + // aeState, awbState, afState only in frame + + /** Allocate metadata if sizing */ + if (sizeRequest) { + ALOGV("Allocating %d entries, %d extra bytes for " + "request template type %d", + entryCount, dataCount, request_template); + *request = allocate_camera_metadata(entryCount, dataCount); + if (*request == NULL) { + ALOGE("Unable to allocate new request template type %d " + "(%d entries, %d bytes extra data)", request_template, + entryCount, dataCount); + return NO_MEMORY; + } + } + return OK; +#undef ADD_OR_SIZE +} + +status_t EmulatedFakeCamera2::addOrSize(camera_metadata_t *request, + bool sizeRequest, + size_t *entryCount, + size_t *dataCount, + uint32_t tag, + const void *entryData, + size_t entryDataCount) { + status_t res; + if (!sizeRequest) { + return add_camera_metadata_entry(request, tag, entryData, + entryDataCount); + } else { + int type = get_camera_metadata_tag_type(tag); + if (type < 0 ) return BAD_VALUE; + (*entryCount)++; + (*dataCount) += calculate_camera_metadata_entry_data_size(type, + entryDataCount); + return OK; + } +} + + }; /* namespace android */ diff --git a/tools/emulator/system/camera/EmulatedFakeCamera2.h b/tools/emulator/system/camera/EmulatedFakeCamera2.h index 1f0199c91..000568719 100644 --- a/tools/emulator/system/camera/EmulatedFakeCamera2.h +++ b/tools/emulator/system/camera/EmulatedFakeCamera2.h @@ -130,6 +130,11 @@ private: /**************************************************************************** * Utility methods ***************************************************************************/ + /** Construct static camera metadata, two-pass */ + status_t constructStaticInfo( + camera_metadata_t **info, + bool sizeRequest); + /** Two-pass implementation of constructDefaultRequest */ status_t constructDefaultRequest( int request_template, @@ -144,7 +149,6 @@ private: const void *entry_data, size_t entry_count); - /**************************************************************************** * Pipeline controller threads ***************************************************************************/ @@ -220,9 +224,12 @@ private: ***************************************************************************/ private: static const uint32_t kAvailableFormats[]; - static const uint32_t kAvailableSizesPerFormat[]; - static const uint32_t kAvailableSizes[]; - static const uint64_t kAvailableMinFrameDurations[]; + static const uint32_t kAvailableRawSizes[]; + static const uint64_t kAvailableRawMinDurations[]; + static const uint32_t kAvailableProcessedSizes[]; + static const uint64_t kAvailableProcessedMinDurations[]; + static const uint32_t kAvailableJpegSizes[]; + static const uint64_t kAvailableJpegMinDurations[]; /**************************************************************************** * Data members. diff --git a/tools/emulator/system/camera/fake-pipeline2/Sensor.cpp b/tools/emulator/system/camera/fake-pipeline2/Sensor.cpp index d24d166df..7f81c8577 100644 --- a/tools/emulator/system/camera/fake-pipeline2/Sensor.cpp +++ b/tools/emulator/system/camera/fake-pipeline2/Sensor.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#define LOG_NDEBUG 0 +//#define LOG_NDEBUG 0 #define LOG_TAG "EmulatedCamera2_Sensor" #include