Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d46a6b9f authored by Eino-Ville Talvala's avatar Eino-Ville Talvala
Browse files

Camera1 API: Support SW encoders for new camera HALs

- Support new set video format/dataspace command in camera service
  - HALv3: Select gralloc usage flags based on format
  - HALv1: Pass format command directly to HAL layer
- Use format/dataspace command in CameraSource
- Switch all API1 recording to use metadata mode
- Switch all >= HALv2 API1 recording to use kMetadataBufferTypeANWBuffer

Bug: 13222807
Change-Id: I2e609b92c65792611bb1dab09e0c41c363ebbc42
parent b4b4cd11
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -83,7 +83,7 @@ public:
                                          Size videoSize,
                                          int32_t frameRate,
                                          const sp<IGraphicBufferProducer>& surface,
                                          bool storeMetaDataInVideoBuffers = false);
                                          bool storeMetaDataInVideoBuffers = true);

    virtual ~CameraSource();

@@ -149,6 +149,8 @@ protected:
    int32_t  mNumInputBuffers;
    int32_t  mVideoFrameRate;
    int32_t  mColorFormat;
    int32_t  mEncoderFormat;
    int32_t  mEncoderDataSpace;
    status_t mInitCheck;

    sp<Camera>   mCamera;
+4 −11
Original line number Diff line number Diff line
@@ -1194,8 +1194,7 @@ void StagefrightRecorder::clipVideoFrameWidth() {
    }
}

status_t StagefrightRecorder::checkVideoEncoderCapabilities(
        bool *supportsCameraSourceMetaDataMode) {
status_t StagefrightRecorder::checkVideoEncoderCapabilities() {
    /* hardware codecs must support camera source meta data mode */
    Vector<CodecCapabilities> codecs;
    OMXClient client;
@@ -1207,9 +1206,6 @@ status_t StagefrightRecorder::checkVideoEncoderCapabilities(
             mVideoEncoder == VIDEO_ENCODER_VP8 ? MEDIA_MIMETYPE_VIDEO_VP8 :
             mVideoEncoder == VIDEO_ENCODER_H264 ? MEDIA_MIMETYPE_VIDEO_AVC : ""),
            false /* decoder */, true /* hwCodec */, &codecs);
    *supportsCameraSourceMetaDataMode = codecs.size() > 0;
    ALOGV("encoder %s camera source meta-data mode",
            *supportsCameraSourceMetaDataMode ? "supports" : "DOES NOT SUPPORT");

    if (!mCaptureTimeLapse) {
        // Dont clip for time lapse capture as encoder will have enough
@@ -1418,9 +1414,7 @@ status_t StagefrightRecorder::setupMediaSource(
status_t StagefrightRecorder::setupCameraSource(
        sp<CameraSource> *cameraSource) {
    status_t err = OK;
    bool encoderSupportsCameraSourceMetaDataMode;
    if ((err = checkVideoEncoderCapabilities(
                &encoderSupportsCameraSourceMetaDataMode)) != OK) {
    if ((err = checkVideoEncoderCapabilities()) != OK) {
        return err;
    }
    Size videoSize;
@@ -1436,14 +1430,13 @@ status_t StagefrightRecorder::setupCameraSource(
        mCameraSourceTimeLapse = CameraSourceTimeLapse::CreateFromCamera(
                mCamera, mCameraProxy, mCameraId, mClientName, mClientUid,
                videoSize, mFrameRate, mPreviewSurface,
                mTimeBetweenTimeLapseFrameCaptureUs,
                encoderSupportsCameraSourceMetaDataMode);
                mTimeBetweenTimeLapseFrameCaptureUs);
        *cameraSource = mCameraSourceTimeLapse;
    } else {
        *cameraSource = CameraSource::CreateFromCamera(
                mCamera, mCameraProxy, mCameraId, mClientName, mClientUid,
                videoSize, mFrameRate,
                mPreviewSurface, encoderSupportsCameraSourceMetaDataMode);
                mPreviewSurface);
    }
    mCamera.clear();
    mCameraProxy.clear();
+1 −2
Original line number Diff line number Diff line
@@ -141,8 +141,7 @@ private:
    status_t setupRTPRecording();
    status_t setupMPEG2TSRecording();
    sp<MediaSource> createAudioSource();
    status_t checkVideoEncoderCapabilities(
            bool *supportsCameraSourceMetaDataMode);
    status_t checkVideoEncoderCapabilities();
    status_t checkAudioEncoderCapabilities();
    // Generic MediaSource set-up. Returns the appropriate
    // source (CameraSource or SurfaceMediaSource)
+17 −0
Original line number Diff line number Diff line
@@ -608,6 +608,16 @@ status_t CameraSource::startCameraRecording() {
        }
    }

    err = mCamera->sendCommand(
        CAMERA_CMD_SET_VIDEO_FORMAT, mEncoderFormat, mEncoderDataSpace);

    // This could happen for CameraHAL1 clients; thus the failure is
    // not a fatal error
    if (err != OK) {
        ALOGW("Failed to set video encoder format/dataspace to %d, %d due to %d",
                mEncoderFormat, mEncoderDataSpace, err);
    }

    err = OK;
    if (mCameraFlags & FLAGS_HOT_CAMERA) {
        mCamera->unlock();
@@ -645,6 +655,9 @@ status_t CameraSource::start(MetaData *meta) {

    mStartTimeUs = 0;
    mNumInputBuffers = 0;
    mEncoderFormat = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED;
    mEncoderDataSpace = HAL_DATASPACE_BT709;

    if (meta) {
        int64_t startTimeUs;
        if (meta->findInt64(kKeyTime, &startTimeUs)) {
@@ -656,6 +669,10 @@ status_t CameraSource::start(MetaData *meta) {
            CHECK_GT(nBuffers, 0);
            mNumInputBuffers = nBuffers;
        }

        // TODO: Read in format/dataspace from somewhere
        // Uncomment to test SW encoders until TODO is resolved
        // mEncoderFormat = HAL_PIXEL_FORMAT_YCbCr_420_888;
    }

    status_t err;
+1 −0
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ LOCAL_SHARED_LIBRARIES:= \
LOCAL_C_INCLUDES += \
    system/media/camera/include \
    system/media/private/camera/include \
    frameworks/native/include/media/openmax \
    external/jpeg


Loading