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

Commit fa241417 authored by James Zern's avatar James Zern Committed by Automerger Merge Worker
Browse files

Merge changes from topic "cherrypicker-L37800000960770833:N73100001370865678"...

Merge changes from topic "cherrypicker-L37800000960770833:N73100001370865678" into udc-dev am: d6046eef

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/av/+/23353837



Change-Id: I8eb8afb5fbf092666f7110105050171f8ab65268
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 3c8a4bfa d6046eef
Loading
Loading
Loading
Loading
+45 −5
Original line number Diff line number Diff line
@@ -29,6 +29,14 @@
#include <media/stagefright/foundation/AUtils.h>
#include <media/stagefright/foundation/MediaDefs.h>

// libyuv version required for I410ToAB30Matrix and I210ToAB30Matrix.
#if LIBYUV_VERSION >= 1780
#include <algorithm>
#define HAVE_LIBYUV_I410_I210_TO_AB30 1
#else
#define HAVE_LIBYUV_I410_I210_TO_AB30 0
#endif

namespace android {

// codecname set and passed in as a compile flag from Android.bp
@@ -818,6 +826,7 @@ bool C2SoftGav1Dec::outputBuffer(const std::shared_ptr<C2BlockPool> &pool,
      allowRGBA1010102 = true;
    }
    format = getHalPixelFormatForBitDepth10(allowRGBA1010102);
#if !HAVE_LIBYUV_I410_I210_TO_AB30
    if ((format == HAL_PIXEL_FORMAT_RGBA_1010102) &&
        (buffer->image_format != libgav1::kImageFormatYuv420)) {
        ALOGE("Only YUV420 output is supported when targeting RGBA_1010102");
@@ -826,6 +835,7 @@ bool C2SoftGav1Dec::outputBuffer(const std::shared_ptr<C2BlockPool> &pool,
      work->workletsProcessed = 1u;
      return false;
    }
#endif
  }

  if (mHalPixelFormat != format) {
@@ -889,11 +899,41 @@ bool C2SoftGav1Dec::outputBuffer(const std::shared_ptr<C2BlockPool> &pool,
    size_t srcVStride = buffer->stride[2] / 2;

    if (format == HAL_PIXEL_FORMAT_RGBA_1010102) {
        bool processed = false;
#if HAVE_LIBYUV_I410_I210_TO_AB30
        if (buffer->image_format == libgav1::kImageFormatYuv444) {
            libyuv::I410ToAB30Matrix(srcY, srcYStride, srcU, srcUStride, srcV, srcVStride,
                                     dstY, dstYStride, &libyuv::kYuvV2020Constants,
                                     mWidth, mHeight);
            processed = true;
        } else if (buffer->image_format == libgav1::kImageFormatYuv422) {
            libyuv::I210ToAB30Matrix(srcY, srcYStride, srcU, srcUStride, srcV, srcVStride,
                                     dstY, dstYStride, &libyuv::kYuvV2020Constants,
                                     mWidth, mHeight);
            processed = true;
        }
#endif  // HAVE_LIBYUV_I410_I210_TO_AB30
        if (!processed) {
            if (isMonochrome) {
                const size_t tmpSize = mWidth;
                const bool needFill = tmpSize > mTmpFrameBufferSize;
                if (!allocTmpFrameBuffer(tmpSize)) {
                    ALOGE("Error allocating temp conversion buffer (%zu bytes)", tmpSize);
                    setError(work, C2_NO_MEMORY);
                    return false;
                }
                srcU = srcV = mTmpFrameBuffer.get();
                srcUStride = srcVStride = 0;
                if (needFill) {
                    std::fill_n(mTmpFrameBuffer.get(), tmpSize, 512);
                }
            }
            convertYUV420Planar16ToY410OrRGBA1010102(
                    (uint32_t *)dstY, srcY, srcU, srcV, srcYStride,
                    srcUStride, srcVStride,
                    dstYStride / sizeof(uint32_t), mWidth, mHeight,
                    std::static_pointer_cast<const C2ColorAspectsStruct>(codedColorAspects));
        }
    } else if (format == HAL_PIXEL_FORMAT_YCBCR_P010) {
        dstYStride /= 2;
        dstUStride /= 2;