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

Commit 55d985e1 authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Snap for 5176559 from d41436e4 to qt-release

Change-Id: If027e3469a45a8b3313e1687129e66d058b815c3
parents d727297d d41436e4
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -189,6 +189,7 @@ inline static const char *asString(OMX_AUDIO_CODINGEXTTYPE i, const char *def =
    switch (i) {
    switch (i) {
        case OMX_AUDIO_CodingAndroidAC3:  return "AndroidAC3";
        case OMX_AUDIO_CodingAndroidAC3:  return "AndroidAC3";
        case OMX_AUDIO_CodingAndroidOPUS: return "AndroidOPUS";
        case OMX_AUDIO_CodingAndroidOPUS: return "AndroidOPUS";
        case OMX_AUDIO_CodingAndroidAC4:  return "AndroidAC4";
        default:                          return asString((OMX_AUDIO_CODINGTYPE)i, def);
        default:                          return asString((OMX_AUDIO_CODINGTYPE)i, def);
    }
    }
}
}
@@ -536,6 +537,7 @@ inline static const char *asString(OMX_INDEXEXTTYPE i, const char *def = "??") {
        case OMX_IndexParamAudioAndroidOpus:            return "ParamAudioAndroidOpus";
        case OMX_IndexParamAudioAndroidOpus:            return "ParamAudioAndroidOpus";
        case OMX_IndexParamAudioAndroidAacPresentation: return "ParamAudioAndroidAacPresentation";
        case OMX_IndexParamAudioAndroidAacPresentation: return "ParamAudioAndroidAacPresentation";
        case OMX_IndexParamAudioAndroidEac3:            return "ParamAudioAndroidEac3";
        case OMX_IndexParamAudioAndroidEac3:            return "ParamAudioAndroidEac3";
        case OMX_IndexParamAudioAndroidAc4:             return "ParamAudioAndroidAc4";
        case OMX_IndexParamAudioProfileQuerySupported:  return "ParamAudioProfileQuerySupported";
        case OMX_IndexParamAudioProfileQuerySupported:  return "ParamAudioProfileQuerySupported";
//      case OMX_IndexParamNalStreamFormatSupported:    return "ParamNalStreamFormatSupported";
//      case OMX_IndexParamNalStreamFormatSupported:    return "ParamNalStreamFormatSupported";
//      case OMX_IndexParamNalStreamFormat:             return "ParamNalStreamFormat";
//      case OMX_IndexParamNalStreamFormat:             return "ParamNalStreamFormat";
+10 −0
Original line number Original line Diff line number Diff line
@@ -48,6 +48,7 @@ typedef enum OMX_AUDIO_CODINGEXTTYPE {
    OMX_AUDIO_CodingAndroidAC3,         /**< AC3 encoded data */
    OMX_AUDIO_CodingAndroidAC3,         /**< AC3 encoded data */
    OMX_AUDIO_CodingAndroidOPUS,        /**< OPUS encoded data */
    OMX_AUDIO_CodingAndroidOPUS,        /**< OPUS encoded data */
    OMX_AUDIO_CodingAndroidEAC3,        /**< EAC3 encoded data */
    OMX_AUDIO_CodingAndroidEAC3,        /**< EAC3 encoded data */
    OMX_AUDIO_CodingAndroidAC4,         /**< AC4 encoded data */
} OMX_AUDIO_CODINGEXTTYPE;
} OMX_AUDIO_CODINGEXTTYPE;


typedef struct OMX_AUDIO_PARAM_ANDROID_AC3TYPE {
typedef struct OMX_AUDIO_PARAM_ANDROID_AC3TYPE {
@@ -68,6 +69,15 @@ typedef struct OMX_AUDIO_PARAM_ANDROID_EAC3TYPE {
                                        variable or unknown sampling rate. */
                                        variable or unknown sampling rate. */
} OMX_AUDIO_PARAM_ANDROID_EAC3TYPE;
} OMX_AUDIO_PARAM_ANDROID_EAC3TYPE;


typedef struct OMX_AUDIO_PARAM_ANDROID_AC4TYPE {
    OMX_U32 nSize;                 /**< size of the structure in bytes */
    OMX_VERSIONTYPE nVersion;      /**< OMX specification version information */
    OMX_U32 nPortIndex;            /**< port that this structure applies to */
    OMX_U32 nChannels;             /**< Number of channels */
    OMX_U32 nSampleRate;           /**< Sampling rate of the source data.  Use 0 for
                                        variable or unknown sampling rate. */
} OMX_AUDIO_PARAM_ANDROID_AC4TYPE;

typedef struct OMX_AUDIO_PARAM_ANDROID_OPUSTYPE {
typedef struct OMX_AUDIO_PARAM_ANDROID_OPUSTYPE {
    OMX_U32 nSize;            /**< size of the structure in bytes */
    OMX_U32 nSize;            /**< size of the structure in bytes */
    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+1 −0
Original line number Original line Diff line number Diff line
@@ -64,6 +64,7 @@ typedef enum OMX_INDEXEXTTYPE {
    OMX_IndexParamAudioAndroidEac3,                 /**< reference: OMX_AUDIO_PARAM_ANDROID_EAC3TYPE */
    OMX_IndexParamAudioAndroidEac3,                 /**< reference: OMX_AUDIO_PARAM_ANDROID_EAC3TYPE */
    OMX_IndexParamAudioProfileQuerySupported,       /**< reference: OMX_AUDIO_PARAM_ANDROID_PROFILETYPE */
    OMX_IndexParamAudioProfileQuerySupported,       /**< reference: OMX_AUDIO_PARAM_ANDROID_PROFILETYPE */
    OMX_IndexParamAudioAndroidAacDrcPresentation,   /**< reference: OMX_AUDIO_PARAM_ANDROID_AACDRCPRESENTATIONTYPE */
    OMX_IndexParamAudioAndroidAacDrcPresentation,   /**< reference: OMX_AUDIO_PARAM_ANDROID_AACDRCPRESENTATIONTYPE */
    OMX_IndexParamAudioAndroidAc4,                  /**< reference: OMX_AUDIO_PARAM_ANDROID_AC4TYPE */
    OMX_IndexExtAudioEndUnused,
    OMX_IndexExtAudioEndUnused,


    /* Image parameters and configurations */
    /* Image parameters and configurations */
+1 −1
Original line number Original line Diff line number Diff line
@@ -207,7 +207,7 @@ TEST_F(SurfaceTest, QueryConsumerUsage) {
}
}


TEST_F(SurfaceTest, QueryDefaultBuffersDataSpace) {
TEST_F(SurfaceTest, QueryDefaultBuffersDataSpace) {
    const android_dataspace TEST_DATASPACE = HAL_DATASPACE_SRGB;
    const android_dataspace TEST_DATASPACE = HAL_DATASPACE_V0_SRGB;
    sp<IGraphicBufferProducer> producer;
    sp<IGraphicBufferProducer> producer;
    sp<IGraphicBufferConsumer> consumer;
    sp<IGraphicBufferConsumer> consumer;
    BufferQueue::createBufferQueue(&producer, &consumer);
    BufferQueue::createBufferQueue(&producer, &consumer);
+105 −3
Original line number Original line Diff line number Diff line
@@ -61,6 +61,16 @@ namespace {
// to use Binder.
// to use Binder.
static constexpr char kBufferHubClientPath[] = "system/buffer_hub/client";
static constexpr char kBufferHubClientPath[] = "system/buffer_hub/client";


using dvr::BufferHubDefs::AnyClientAcquired;
using dvr::BufferHubDefs::AnyClientGained;
using dvr::BufferHubDefs::AnyClientPosted;
using dvr::BufferHubDefs::IsClientAcquired;
using dvr::BufferHubDefs::IsClientGained;
using dvr::BufferHubDefs::IsClientPosted;
using dvr::BufferHubDefs::IsClientReleased;
using dvr::BufferHubDefs::kHighBitsMask;
using dvr::BufferHubDefs::kMetadataHeaderSize;

} // namespace
} // namespace


BufferHubClient::BufferHubClient() : Client(ClientChannelFactory::Create(kBufferHubClientPath)) {}
BufferHubClient::BufferHubClient() : Client(ClientChannelFactory::Create(kBufferHubClientPath)) {}
@@ -151,11 +161,17 @@ int BufferHubBuffer::ImportGraphicBuffer() {
    }
    }


    size_t metadataSize = static_cast<size_t>(bufferTraits.metadata_size());
    size_t metadataSize = static_cast<size_t>(bufferTraits.metadata_size());
    if (metadataSize < dvr::BufferHubDefs::kMetadataHeaderSize) {
    if (metadataSize < kMetadataHeaderSize) {
        ALOGE("BufferHubBuffer::ImportGraphicBuffer: metadata too small: %zu", metadataSize);
        ALOGE("BufferHubBuffer::ImportGraphicBuffer: metadata too small: %zu", metadataSize);
        return -EINVAL;
        return -EINVAL;
    }
    }


    // Populate shortcuts to the atomics in metadata.
    auto metadata_header = mMetadata.metadata_header();
    buffer_state_ = &metadata_header->buffer_state;
    fence_state_ = &metadata_header->fence_state;
    active_clients_bit_mask_ = &metadata_header->active_clients_bit_mask;

    // Import the buffer: We only need to hold on the native_handle_t here so that
    // Import the buffer: We only need to hold on the native_handle_t here so that
    // GraphicBuffer instance can be created in future.
    // GraphicBuffer instance can be created in future.
    mBufferHandle = bufferTraits.take_buffer_handle();
    mBufferHandle = bufferTraits.take_buffer_handle();
@@ -176,7 +192,93 @@ int BufferHubBuffer::ImportGraphicBuffer() {


    // TODO(b/112012161) Set up shared fences.
    // TODO(b/112012161) Set up shared fences.
    ALOGD("BufferHubBuffer::ImportGraphicBuffer: id=%d, buffer_state=%" PRIx64 ".", id(),
    ALOGD("BufferHubBuffer::ImportGraphicBuffer: id=%d, buffer_state=%" PRIx64 ".", id(),
          mMetadata.metadata_header()->buffer_state.load(std::memory_order_acquire));
          buffer_state_->load(std::memory_order_acquire));
    return 0;
}

int BufferHubBuffer::Gain() {
    uint64_t current_buffer_state = buffer_state_->load(std::memory_order_acquire);
    if (IsClientGained(current_buffer_state, mClientStateMask)) {
        ALOGV("%s: Buffer is already gained by this client %" PRIx64 ".", __FUNCTION__,
              mClientStateMask);
        return 0;
    }
    do {
        if (AnyClientGained(current_buffer_state & (~mClientStateMask)) ||
            AnyClientAcquired(current_buffer_state)) {
            ALOGE("%s: Buffer is in use, id=%d mClientStateMask=%" PRIx64 " state=%" PRIx64 ".",
                  __FUNCTION__, mId, mClientStateMask, current_buffer_state);
            return -EBUSY;
        }
        // Change the buffer state to gained state, whose value happens to be the same as
        // mClientStateMask.
    } while (!buffer_state_->compare_exchange_weak(current_buffer_state, mClientStateMask,
                                                   std::memory_order_acq_rel,
                                                   std::memory_order_acquire));
    // TODO(b/119837586): Update fence state and return GPU fence.
    return 0;
}

int BufferHubBuffer::Post() {
    uint64_t current_buffer_state = buffer_state_->load(std::memory_order_acquire);
    uint64_t current_active_clients_bit_mask = 0ULL;
    uint64_t updated_buffer_state = 0ULL;
    do {
        if (!IsClientGained(current_buffer_state, mClientStateMask)) {
            ALOGE("%s: Cannot post a buffer that is not gained by this client. buffer_id=%d "
                  "mClientStateMask=%" PRIx64 " state=%" PRIx64 ".",
                  __FUNCTION__, mId, mClientStateMask, current_buffer_state);
            return -EBUSY;
        }
        // Set the producer client buffer state to released, other clients' buffer state to posted.
        current_active_clients_bit_mask = active_clients_bit_mask_->load(std::memory_order_acquire);
        updated_buffer_state =
                current_active_clients_bit_mask & (~mClientStateMask) & kHighBitsMask;
    } while (!buffer_state_->compare_exchange_weak(current_buffer_state, updated_buffer_state,
                                                   std::memory_order_acq_rel,
                                                   std::memory_order_acquire));
    // TODO(b/119837586): Update fence state and return GPU fence if needed.
    return 0;
}

int BufferHubBuffer::Acquire() {
    uint64_t current_buffer_state = buffer_state_->load(std::memory_order_acquire);
    if (IsClientAcquired(current_buffer_state, mClientStateMask)) {
        ALOGV("%s: Buffer is already acquired by this client %" PRIx64 ".", __FUNCTION__,
              mClientStateMask);
        return 0;
    }
    uint64_t updated_buffer_state = 0ULL;
    do {
        if (!IsClientPosted(current_buffer_state, mClientStateMask)) {
            ALOGE("%s: Cannot acquire a buffer that is not in posted state. buffer_id=%d "
                  "mClientStateMask=%" PRIx64 " state=%" PRIx64 ".",
                  __FUNCTION__, mId, mClientStateMask, current_buffer_state);
            return -EBUSY;
        }
        // Change the buffer state for this consumer from posted to acquired.
        updated_buffer_state = current_buffer_state ^ mClientStateMask;
    } while (!buffer_state_->compare_exchange_weak(current_buffer_state, updated_buffer_state,
                                                   std::memory_order_acq_rel,
                                                   std::memory_order_acquire));
    // TODO(b/119837586): Update fence state and return GPU fence.
    return 0;
}

int BufferHubBuffer::Release() {
    uint64_t current_buffer_state = buffer_state_->load(std::memory_order_acquire);
    if (IsClientReleased(current_buffer_state, mClientStateMask)) {
        ALOGV("%s: Buffer is already released by this client %" PRIx64 ".", __FUNCTION__,
              mClientStateMask);
        return 0;
    }
    uint64_t updated_buffer_state = 0ULL;
    do {
        updated_buffer_state = current_buffer_state & (~mClientStateMask);
    } while (!buffer_state_->compare_exchange_weak(current_buffer_state, updated_buffer_state,
                                                   std::memory_order_acq_rel,
                                                   std::memory_order_acquire));
    // TODO(b/119837586): Update fence state and return GPU fence if needed.
    return 0;
    return 0;
}
}


Loading