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

Commit d66d8247 authored by Sungtak Lee's avatar Sungtak Lee
Browse files

AImageReader: Add setUsage() interface

Add setUsage() interface to update usage bits while using AImageReader.

The new interface should not be used for dynamic use cases.
Setup and cleanup for producer side should be done before use after
calling the interface.

Bug: 201479783
Test: presubmit
Change-Id: I5c146f98358b97c71770ac3655da0b4ae9db8afe
parent 00a570bd
Loading
Loading
Loading
Loading
+33 −0
Original line number Diff line number Diff line
@@ -655,6 +655,28 @@ AImageReader::acquireLatestImage(/*out*/AImage** image, /*out*/int* acquireFence
    }
}

media_status_t
AImageReader::setUsage(uint64_t usage) {
    Mutex::Autolock _l(mLock);
    if (!mIsOpen || mBufferItemConsumer == nullptr) {
        ALOGE("not ready to perform setUsage()");
        return AMEDIA_ERROR_INVALID_PARAMETER;
    }
    if (mUsage == usage) {
        return AMEDIA_OK;
    }

    uint64_t halUsage = AHardwareBuffer_convertToGrallocUsageBits(mUsage);
    status_t ret = mBufferItemConsumer->setConsumerUsageBits(halUsage);
    if (ret != OK) {
        ALOGE("setConsumerUsageBits() failed %d", ret);
        return AMEDIA_ERROR_UNKNOWN;
    }
    mUsage = usage;
    mHalUsage = halUsage;
    return AMEDIA_OK;
}

static
media_status_t validateParameters(int32_t width, int32_t height, int32_t format,
                                  uint64_t usage, int32_t maxImages,
@@ -912,3 +934,14 @@ media_status_t AImageReader_setBufferRemovedListener(
    reader->setBufferRemovedListener(listener);
    return AMEDIA_OK;
}

EXPORT
media_status_t AImageReader_setUsage(
    AImageReader *reader, uint64_t usage) {
    ALOGV("%s", __FUNCTION__);
    if (reader == nullptr) {
        ALOGE("%s: invalid argument! reader %p", __FUNCTION__, reader);
        return AMEDIA_ERROR_INVALID_PARAMETER;
    }
    return reader->setUsage(usage);
}
+3 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <inttypes.h>

#include <media/NdkImageReader.h>
#include <media-vndk/VndkImageReader.h>

#include <utils/List.h>
#include <utils/Mutex.h>
@@ -67,6 +68,7 @@ struct AImageReader : public RefBase {

    media_status_t setImageListener(AImageReader_ImageListener* listener);
    media_status_t setBufferRemovedListener(AImageReader_BufferRemovedListener* listener);
    media_status_t setUsage(uint64_t usage);

    media_status_t acquireNextImage(/*out*/AImage** image, /*out*/int* fenceFd);
    media_status_t acquireLatestImage(/*out*/AImage** image, /*out*/int* fenceFd);
@@ -120,7 +122,7 @@ struct AImageReader : public RefBase {
    const int32_t mWidth;
    const int32_t mHeight;
    int32_t mFormat;
    const uint64_t mUsage;  // AHARDWAREBUFFER_USAGE_* flags.
    uint64_t mUsage;  // AHARDWAREBUFFER_USAGE_* flags.
    const int32_t mMaxImages;

    // TODO(jwcai) Seems completely unused in AImageReader class.
+51 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _VNDK_IMAGE_READER_H
#define _VNDK_IMAGE_READER_H

// vndk is a superset of the NDK
#include <media/NdkImageReader.h>

__BEGIN_DECLS

/**
 * Set the usage of this image reader.
 *
 * <p>Note that calling this method will replace the previously set usage.</p>
 *
 * <p>Note: This will trigger re-allocation, could cause producer failures mid-stream
 * if the new usage combination isn't supported, and thus should be avoided as much as
 * possible regardless.</p>
 *
 * Available since API level 36.
 *
 * @param reader The image reader of interest.
 * @param usage specifies how the consumer will access the AImage.
 *              See {@link AImageReader_newWithUsage} parameter description for more details.
 * @return <ul>
 *         <li>{@link AMEDIA_OK} if the method call succeeds.</li>
 *         <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if reader is NULL.</li>
 *         <li>{@link AMEDIA_ERROR_UNKNOWN} if the method fails for some other reasons.</li></ul>
 *
 * @see AImage_getHardwareBuffer
 */
media_status_t AImageReader_setUsage(
        AImageReader* _Nonnull reader, uint64_t usage) __INTRODUCED_IN(36);

__END_DECLS

#endif //_VNDK_IMAGE_READER_H
+1 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ LIBMEDIANDK {
    AImageReader_newWithDataSpace; # introduced=UpsideDownCake
    AImageReader_setBufferRemovedListener; # introduced=26
    AImageReader_setImageListener; # introduced=24
    AImageReader_setUsage; # introduced=36 llndk
    AImage_delete; # introduced=24
    AImage_deleteAsync; # introduced=26
    AImage_getCropRect; # introduced=24