Skip to content

is offset required here for accessing output buffer? #21021

@anonymouss

Description

@anonymouss

buffer = std::vector<uint8_t>(codecBuffer + info.offset, codecBuffer + bufferSize);

uint8_t* codecBuffer = AMediaCodec_getOutputBuffer(mediaCodec.get(), bufferIndex, &bufferSize);
buffer = std::vector<uint8_t>(codecBuffer + info.offset, codecBuffer + bufferSize);

Per Android NDK code, AMediaCodec_getOutputBuffer() already returns underlying raw buffer contains offset
https://android.googlesource.com/platform/frameworks/av/+/master/media/ndk/NdkMediaCodec.cpp#575

EXPORT
uint8_t* AMediaCodec_getOutputBuffer(AMediaCodec *mData, size_t idx, size_t *out_size) {
    if (mData->mAsyncNotify != NULL) {
        // Asynchronous mode
        sp<MediaCodecBuffer> abuf;
        if (mData->mCodec->getOutputBuffer(idx, &abuf) != 0) {
            return NULL;
        }

        if (out_size != NULL) {
            *out_size = abuf->capacity();
        }
        return abuf->data();
    }
...

https://android.googlesource.com/platform/frameworks/av/+/913efd2bb99a056eb44395a93c6aa361a96dde6a/include/media/stagefright/foundation/ABuffer.h#39

    uint8_t *base() { return (uint8_t *)mData; }
    uint8_t *data() { return (uint8_t *)mData + mRangeOffset; }
    size_t capacity() const { return mCapacity; }
    size_t size() const { return mRangeLength; }
    size_t offset() const { return mRangeOffset; }

Which means codecBuffer already have info.offset. Hence, is codecBuffer + info.offset still required?

BTW: info.offset is from MediaCodecBuffer/ABuffer .offset() too.
https://android.googlesource.com/platform/frameworks/av/+/master/media/ndk/NdkMediaCodec.cpp#627
https://android.googlesource.com/platform/frameworks/av/+/3fdb405/media/libstagefright/MediaCodec.cpp#405

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions