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

Commit 25c3a3d2 authored by Byeongjo Park's avatar Byeongjo Park Committed by Lajos Molnar
Browse files

VT: Rx side of CVO implementation to CCodec.



[Problem] video rotation is not working with CCodec in VT scenario.
[Cause] video rotation should be applied if cvo exists in
  meta() of MediaCodecBuffer.
[Solution] C2StreamRotationInfo of outputbuffer will be updated
  if cvo exist in inputbuffer.

Bug: 167935079

Signed-off-by: default avatarByeongjo Park <bjo.park@samsung.com>
Change-Id: Ib03bde00cefbeb4ac6ea4ea9eff150c686780c38
Merged-In: Ib03bde00cefbeb4ac6ea4ea9eff150c686780c38
parent 7bf2734a
Loading
Loading
Loading
Loading
+26 −8
Original line number Diff line number Diff line
@@ -253,6 +253,16 @@ status_t CCodecBufferChannel::queueInputBufferInternal(
            usesFrameReassembler = true;
            input->frameReassembler.process(buffer, &items);
        } else {
            int32_t cvo = 0;
            if (buffer->meta()->findInt32("cvo", &cvo)) {
                int32_t rotation = cvo % 360;
                // change rotation to counter-clock wise.
                rotation = ((rotation <= 0) ? 0 : 360) - rotation;

                Mutexed<OutputSurface>::Locked output(mOutputSurface);
                uint64_t frameIndex = work->input.ordinal.frameIndex.peeku();
                output->rotation[frameIndex] = rotation;
            }
            work->input.buffers.push_back(c2buffer);
            if (encryptedBlock) {
                work->input.infoBuffers.emplace_back(C2InfoBuffer::CreateLinearBuffer(
@@ -747,6 +757,22 @@ status_t CCodecBufferChannel::renderOutputBuffer(
                c2Buffer->getInfo(C2StreamRotationInfo::output::PARAM_TYPE));
    bool flip = rotation && (rotation->flip & 1);
    uint32_t quarters = ((rotation ? rotation->value : 0) / 90) & 3;

    {
        Mutexed<OutputSurface>::Locked output(mOutputSurface);
        if (output->surface == nullptr) {
            ALOGI("[%s] cannot render buffer without surface", mName);
            return OK;
        }
        int64_t frameIndex;
        buffer->meta()->findInt64("frameIndex", &frameIndex);
        if (output->rotation.count(frameIndex) != 0) {
            auto it = output->rotation.find(frameIndex);
            quarters = (it->second / 90) & 3;
            output->rotation.erase(it);
        }
    }

    uint32_t transform = 0;
    switch (quarters) {
        case 0: // no rotation
@@ -790,14 +816,6 @@ status_t CCodecBufferChannel::renderOutputBuffer(
        hdr10PlusInfo.reset();
    }

    {
        Mutexed<OutputSurface>::Locked output(mOutputSurface);
        if (output->surface == nullptr) {
            ALOGI("[%s] cannot render buffer without surface", mName);
            return OK;
        }
    }

    std::vector<C2ConstGraphicBlock> blocks = c2Buffer->data().graphicBlocks();
    if (blocks.size() != 1u) {
        ALOGD("[%s] expected 1 graphic block, but got %zu", mName, blocks.size());
+1 −0
Original line number Diff line number Diff line
@@ -293,6 +293,7 @@ private:
        sp<Surface> surface;
        uint32_t generation;
        int maxDequeueBuffers;
        std::map<uint64_t, int> rotation;
    };
    Mutexed<OutputSurface> mOutputSurface;

+1 −0
Original line number Diff line number Diff line
@@ -316,6 +316,7 @@ OutputBuffers::BufferAction OutputBuffers::popFromStashAndRegister(
    // Append information from the front stash entry to outBuffer.
    (*outBuffer)->meta()->setInt64("timeUs", entry.timestamp);
    (*outBuffer)->meta()->setInt32("flags", entry.flags);
    (*outBuffer)->meta()->setInt64("frameIndex", entry.ordinal.frameIndex.peekll());
    ALOGV("[%s] popFromStashAndRegister: "
          "out buffer index = %zu [%p] => %p + %zu (%lld)",
          mName, *index, outBuffer->get(),
+6 −0
Original line number Diff line number Diff line
@@ -746,9 +746,15 @@ bool NuPlayer::Decoder::handleAnOutputBuffer(

    mOutputBuffers.editItemAt(index) = buffer;

    int64_t frameIndex;
    bool frameIndexFound = buffer->meta()->findInt64("frameIndex", &frameIndex);

    buffer->setRange(offset, size);
    buffer->meta()->clear();
    buffer->meta()->setInt64("timeUs", timeUs);
    if (frameIndexFound) {
        buffer->meta()->setInt64("frameIndex", frameIndex);
    }

    bool eos = flags & MediaCodec::BUFFER_FLAG_EOS;
    // we do not expect CODECCONFIG or SYNCFRAME for decoder