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

Commit c2607559 authored by Patryk Busse's avatar Patryk Busse
Browse files

Correct crop size for software encoders

When using surface crop size may be set to incorrect
value and cause errors when copying buffers.
To prevent that, encoders will set crop size to expected
image size.

Bug: b/232396154

Test: android.mediav2.cts.CodecEncoderSurfaceTest
      android.mediav2.cts.CodecEncoderTest

Change-Id: Iafa4f9f1a49760c2b5345b8768b476a2fd7510f6
parent f03a0a27
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -1768,17 +1768,20 @@ void C2SoftAvcEnc::process(
    //         }
    //     }
    // }
    std::shared_ptr<const C2GraphicView> view;
    std::shared_ptr<C2GraphicView> view;
    std::shared_ptr<C2Buffer> inputBuffer;
    if (!work->input.buffers.empty()) {
        inputBuffer = work->input.buffers[0];
        view = std::make_shared<const C2GraphicView>(
        view = std::make_shared<C2GraphicView>(
                inputBuffer->data().graphicBlocks().front().map().get());
        if (view->error() != C2_OK) {
            ALOGE("graphic view map err = %d", view->error());
            work->workletsProcessed = 1u;
            return;
        }
        //(b/232396154)
        //workaround for incorrect crop size in view when using surface mode
        view->setCrop_be(C2Rect(mSize->width, mSize->height));
    }

    do {
+5 −2
Original line number Diff line number Diff line
@@ -1109,14 +1109,14 @@ void C2SoftHevcEnc::process(const std::unique_ptr<C2Work>& work,
        }
    }

    std::shared_ptr<const C2GraphicView> view;
    std::shared_ptr<C2GraphicView> view;
    std::shared_ptr<C2Buffer> inputBuffer = nullptr;
    bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0);
    if (eos) mSignalledEos = true;

    if (!work->input.buffers.empty()) {
        inputBuffer = work->input.buffers[0];
        view = std::make_shared<const C2GraphicView>(
        view = std::make_shared<C2GraphicView>(
            inputBuffer->data().graphicBlocks().front().map().get());
        if (view->error() != C2_OK) {
            ALOGE("graphic view map err = %d", view->error());
@@ -1125,6 +1125,9 @@ void C2SoftHevcEnc::process(const std::unique_ptr<C2Work>& work,
            work->workletsProcessed = 1u;
            return;
        }
        //(b/232396154)
        //workaround for incorrect crop size in view when using surface mode
        view->setCrop_be(C2Rect(mSize->width, mSize->height));
    }
    IHEVCE_PLUGIN_STATUS_T err = IHEVCE_EOK;

+5 −2
Original line number Diff line number Diff line
@@ -464,18 +464,21 @@ void C2SoftMpeg4Enc::process(
        }
    }

    std::shared_ptr<const C2GraphicView> rView;
    std::shared_ptr<C2GraphicView> rView;
    std::shared_ptr<C2Buffer> inputBuffer;
    bool eos = ((work->input.flags & C2FrameData::FLAG_END_OF_STREAM) != 0);
    if (!work->input.buffers.empty()) {
        inputBuffer = work->input.buffers[0];
        rView = std::make_shared<const C2GraphicView>(
        rView = std::make_shared<C2GraphicView>(
                inputBuffer->data().graphicBlocks().front().map().get());
        if (rView->error() != C2_OK) {
            ALOGE("graphic view map err = %d", rView->error());
            work->result = rView->error();
            return;
        }
        //(b/232396154)
        //workaround for incorrect crop size in view when using surface mode
        rView->setCrop_be(C2Rect(mSize->width, mSize->height));
    } else {
        fillEmptyWork(work);
        if (eos) {
+5 −2
Original line number Diff line number Diff line
@@ -683,17 +683,20 @@ void C2SoftVpxEnc::process(
        return;
    }

    std::shared_ptr<const C2GraphicView> rView;
    std::shared_ptr<C2GraphicView> rView;
    std::shared_ptr<C2Buffer> inputBuffer;
    if (!work->input.buffers.empty()) {
        inputBuffer = work->input.buffers[0];
        rView = std::make_shared<const C2GraphicView>(
        rView = std::make_shared<C2GraphicView>(
                    inputBuffer->data().graphicBlocks().front().map().get());
        if (rView->error() != C2_OK) {
            ALOGE("graphic view map err = %d", rView->error());
            work->result = C2_CORRUPTED;
            return;
        }
        //(b/232396154)
        //workaround for incorrect crop size in view when using surface mode
        rView->setCrop_be(C2Rect(mSize->width, mSize->height));
    } else {
        ALOGV("Empty input Buffer");
        uint32_t flags = 0;