codec2: Gralloc blob linear buffer allocator

Bug: 143180475
Test: make libcodec2_vndk
Change-Id: I55de82ec7029d0759c4cf914ad6c92e170277c78
diff --git a/media/codec2/vndk/C2AllocatorGralloc.cpp b/media/codec2/vndk/C2AllocatorGralloc.cpp
index fecbba3..78ac355 100644
--- a/media/codec2/vndk/C2AllocatorGralloc.cpp
+++ b/media/codec2/vndk/C2AllocatorGralloc.cpp
@@ -810,6 +810,70 @@
             break;
         }
 
+        case PixelFormat4::BLOB: {
+            void* pointer = nullptr;
+            if (mMapper2) {
+                if (!mMapper2->lock(const_cast<native_handle_t*>(mBuffer), grallocUsage,
+                                    {(int32_t)rect.left, (int32_t)rect.top, (int32_t)rect.width,
+                                     (int32_t)rect.height},
+                                    // TODO: fence
+                                    hidl_handle(),
+                                    [&err, &pointer](const auto& maperr, const auto& mapPointer) {
+                                        err = maperr2error(maperr);
+                                        if (err == C2_OK) {
+                                            pointer = mapPointer;
+                                        }
+                                    }).isOk()) {
+                    ALOGE("failed transaction: lock(BLOB)");
+                    return C2_CORRUPTED;
+                }
+            } else if (mMapper3) {
+                if (!mMapper3->lock(
+                        const_cast<native_handle_t*>(mBuffer),
+                        grallocUsage,
+                        { (int32_t)rect.left, (int32_t)rect.top,
+                          (int32_t)rect.width, (int32_t)rect.height },
+                        // TODO: fence
+                        hidl_handle(),
+                        [&err, &pointer](const auto &maperr, const auto &mapPointer,
+                                         int32_t bytesPerPixel, int32_t bytesPerStride) {
+                            err = maperr2error(maperr);
+                            if (err == C2_OK) {
+                                pointer = mapPointer;
+                            }
+                            (void)bytesPerPixel;
+                            (void)bytesPerStride;
+                        }).isOk()) {
+                    ALOGE("failed transaction: lock(BLOB) (@3.0)");
+                    return C2_CORRUPTED;
+                }
+            } else {
+                if (!mMapper4->lock(
+                        const_cast<native_handle_t *>(mBuffer),
+                        grallocUsage,
+                        { (int32_t)rect.left, (int32_t)rect.top,
+                          (int32_t)rect.width, (int32_t)rect.height },
+                        // TODO: fence
+                        hidl_handle(),
+                        [&err, &pointer](const auto &maperr, const auto &mapPointer) {
+                            err = maperr2error(maperr);
+                            if (err == C2_OK) {
+                                pointer = mapPointer;
+                            }
+                        }).isOk()) {
+                    ALOGE("failed transaction: lock(BLOB) (@4.0)");
+                    return C2_CORRUPTED;
+                }
+            }
+            if (err != C2_OK) {
+                ALOGD("lock failed: %d", err);
+                return err;
+            }
+
+            *addr = static_cast<uint8_t*>(pointer);
+            break;
+        }
+
         case PixelFormat4::YCBCR_420_888:
             // fall-through
         case PixelFormat4::YV12: