目录

Camera Metadata (C/C++)

Metadata is the description and context of image information returned by the camera application. It provides detailed data for the image information, such as the coordinates of a viewfinder frame for identifying a portrait in a photo or video.

Metadata primarily uses a TAG (Key) to locate the corresponding data (Value), enabling parameter and configuration information transfer while reducing memory copy operations.

How to Develop

For detailed API descriptions, see OH_Camera.

  1. Import the NDK.

    #include <cstdint>
    #include <native_buffer/buffer_common.h>
    #include <unistd.h>
    #include <string>
    #include <thread>
    #include <cstdio>
    #include <fcntl.h>
    #include <map>
    #include <vector>
    #include <native_buffer/native_buffer.h>
    #include "iostream"
    #include "mutex"
    
    #include "hilog/log.h"
    #include "ohcamera/camera.h"
    #include "ohcamera/camera_input.h"
    #include "ohcamera/capture_session.h"
    #include "ohcamera/photo_output.h"
    #include "ohcamera/preview_output.h"
    #include "ohcamera/video_output.h"
    #include "napi/native_api.h"
    #include "ohcamera/camera_manager.h"
    #include <window_manager/oh_display_info.h>
    #include <window_manager/oh_display_manager.h>
    
    namespace OHOS_CAMERA_SAMPLE {
    class NDKCamera {
      public:
        struct CameraBuildingConfig {
            char *str;
            uint32_t focusMode;
            uint32_t cameraDeviceIndex;
            bool isVideo;
            bool isHdr;
            char *videoId;
        };
        ~NDKCamera();
        explicit NDKCamera(CameraBuildingConfig config);
        // ...
    };
    } // namespace OHOS_CAMERA_SAMPLE
  2. Link the dynamic library in the CMake script.

    target_link_libraries(entry PUBLIC
        libace_napi.z.so
        libohcamera.so
        libhilog_ndk.z.so
    )
  3. Call OH_CameraManager_GetSupportedCameraOutputCapability() to obtain the metadata types supported by the current device, and then call OH_CameraManager_CreateMetadataOutput() to create a metadata output stream.

    Camera_ErrorCode NDKCamera::CreateMetadataOutput(void)
    {
        metaDataObjectType_ = cameraOutputCapability_->supportedMetadataObjectTypes[0];
        if (metaDataObjectType_ == nullptr) {
            OH_LOG_ERROR(LOG_APP, "Get metaDataObjectType failed.");
            return CAMERA_INVALID_ARGUMENT;
        }
        ret_ = OH_CameraManager_CreateMetadataOutput(cameraManager_, metaDataObjectType_, &metadataOutput_);
        if (metadataOutput_ == nullptr || ret_ != CAMERA_OK) {
            OH_LOG_ERROR(LOG_APP, "CreateMetadataOutput failed.");
            return CAMERA_INVALID_ARGUMENT;
        }
        MetadataOutputRegisterCallback();
        return ret_;
    }
  4. Call OH_CameraManager_CreateCaptureSession() to create a session.

    ret = OH_CameraManager_CreateCaptureSession(cameraManager_, &captureSession_);
    if (captureSession_ == nullptr || ret != CAMERA_OK) {
        OH_LOG_ERROR(LOG_APP, "Create captureSession failed.");
    }
  5. Configure the session. After the configuration, call OH_CaptureSession_Start() to output metadata. If the call fails, an error code is returned. For details about the error code types, see Camera_ErrorCode.

    // Start configuring the session.
    Camera_ErrorCode ret = OH_CaptureSession_BeginConfig(captureSession_);
    
    // Add the camera input stream to the session.
    ret = OH_CaptureSession_AddInput(captureSession_, cameraInput_);
    
    // Add the camera preview stream to the session.
    ret = OH_CaptureSession_AddPreviewOutput(captureSession_, previewOutput_);
    
    if (isVideo_) {
        // Add the camera video stream to the session.
        AddVideoOutput();
        if (isHdrVideo) {
            // HDR Vivid video requires setting the color space to OH_COLORSPACE_BT2020_HLG_LIMIT.
            OH_NativeBuffer_ColorSpace colorSpace = OH_NativeBuffer_ColorSpace::OH_COLORSPACE_BT2020_HLG_LIMIT;
            SetColorSpace(colorSpace);
        }
    } else {
        // Add the camera photo stream to the session.
        AddPhotoOutput();
        ret = CreateMetadataOutput();
        ret = OH_CaptureSession_AddMetadataOutput(captureSession_, metadataOutput_);
        OH_NativeBuffer_ColorSpace colorSpace = OH_NativeBuffer_ColorSpace::OH_COLORSPACE_P3_FULL;
        SetColorSpace(colorSpace);
    }
    
    // Commit the session configuration.
    ret = OH_CaptureSession_CommitConfig(captureSession_);
    // ...
    
    InitPreviewRotation();
    // Start the session.
    OH_LOG_INFO(LOG_APP, "session start");
    ret = OH_CaptureSession_Start(captureSession_);
  6. Call OH_MetadataOutput_Stop() to stop outputting metadata. If the API call fails, a corresponding error code is returned.

    Camera_ErrorCode StopMetadataOutput(Camera_MetadataOutput* metadataOutput)
    {
        Camera_ErrorCode ret = OH_MetadataOutput_Stop(metadataOutput);
        if (ret != CAMERA_OK) {
            OH_LOG_ERROR(LOG_APP, "OH_MetadataOutput_Stop failed.");
        }
        return ret;
    }

Status Listening

During camera application development, you can listen for the status of metadata objects and output stream.