1fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang/* 2fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 3fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * 4fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * Permission is hereby granted, free of charge, to any person obtaining a 5fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * copy of this software and associated documentation files (the 6fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * "Software"), to deal in the Software without restriction, including 7fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * without limitation the rights to use, copy, modify, merge, publish, 8fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * distribute, sub license, and/or sell copies of the Software, and to 9fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * permit persons to whom the Software is furnished to do so, subject to 10fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * the following conditions: 11fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * 12fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * The above copyright notice and this permission notice (including the 13fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * next paragraph) shall be included in all copies or substantial portions 14fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * of the Software. 15fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * 16fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 19fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 20fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * 24fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * Authors: 25fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * Fei Jiang <fei.jiang@intel.com> 26fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * Austin Yuan <austin.yuan@intel.com> 27fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * 28fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang */ 29fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 30fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#include "android/psb_gralloc.h" 31fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#include <cutils/log.h> 32fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#include <utils/threads.h> 33fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#include <ui/PixelFormat.h> 34fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#include <hardware/gralloc.h> 35fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#include <system/graphics.h> 36fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#include <hardware/hardware.h> 37eb5827ee91388bdeda5789ff6a84a918e14d580dCheng Yao#ifdef BAYTRAIL 38eb5827ee91388bdeda5789ff6a84a918e14d580dCheng Yao#include <ufo/gralloc.h> 3976f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#else 402046ea17ddb468c845f542a88761a03b04898fd7Vinil Cheeramvelil#include <hal/hal_public.h> 4176f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#include <sync/sync.h> 422046ea17ddb468c845f542a88761a03b04898fd7Vinil Cheeramvelil#endif 432046ea17ddb468c845f542a88761a03b04898fd7Vinil Cheeramvelil 44fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiangusing namespace android; 45fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 46fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#ifdef LOG_TAG 47fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#undef LOG_TAG 48fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#endif 49fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 50fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang#define LOG_TAG "pvr_drv_video" 51fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 5276f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#ifdef BAYTRAIL 5376f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachanstatic const gralloc_module_t *mGralloc; 5476f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#else 5576f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachanstatic const hw_device_t *mGralloc; 5676f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#endif 57fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 58fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiangint gralloc_lock(buffer_handle_t handle, 5976f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan int usage, int left, int top, int width, int height, 6076f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan void** vaddr) 61fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang{ 62b7c527a64448cfeedb2fe114b673af667f92faf2hding int err, j; 63fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 6476f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan if (!mGralloc) { 6546ec2e2bd4bfdfe667d89afad353cf3c351e705eywan ALOGW("%s: gralloc module has not been initialized. Should initialize it first", __func__); 662db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu if (gralloc_init()) { 67cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan ALOGE("%s: can't find the %s module", __func__, GRALLOC_HARDWARE_MODULE_ID); 682db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu return -1; 692db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu } 702db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu } 712db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu 7276f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#ifdef BAYTRAIL 7376f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan err = mGralloc->lock(mGralloc, handle, usage, 7476f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan left, top, width, height, 7576f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan vaddr); 7676f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#else 7776f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan const gralloc1_rect_t r = { 7876f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan .left = left, 7976f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan .top = top, 8076f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan .width = width, 8176f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan .height = height 8276f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan }; 8376f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan err = gralloc_lock_async_img(mGralloc, handle, usage, &r, vaddr, -1); 84098d51ceb6eb2ef08c89224446163aa17aee7cbcDaniel Cardenas#endif 8576f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan ALOGV("gralloc_lock: handle is %p, usage is %x, vaddr is %p.\n", handle, usage, *vaddr); 86fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (err){ 8746ec2e2bd4bfdfe667d89afad353cf3c351e705eywan ALOGE("lock(...) failed %d (%s).\n", err, strerror(-err)); 88751400dde1eac64dd41c7de33fcddf8a939e4ab2hding return -1; 89751400dde1eac64dd41c7de33fcddf8a939e4ab2hding } else { 9046ec2e2bd4bfdfe667d89afad353cf3c351e705eywan ALOGV("lock returned with address %p\n", *vaddr); 91751400dde1eac64dd41c7de33fcddf8a939e4ab2hding } 92fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 93fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return err; 94fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang} 95fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 96fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiangint gralloc_unlock(buffer_handle_t handle) 97fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang{ 98fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang int err; 99fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 10076f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan if (!mGralloc) { 10146ec2e2bd4bfdfe667d89afad353cf3c351e705eywan ALOGW("%s: gralloc module has not been initialized. Should initialize it first", __func__); 1022db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu if (gralloc_init()) { 103cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan ALOGE("%s: can't find the %s module", __func__, GRALLOC_HARDWARE_MODULE_ID); 1042db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu return -1; 1052db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu } 1062db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu } 1072db64e390f8b1a9ac4cfea98d89f45ec94d11d65Jason Hu 10876f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#ifdef BAYTRAIL 10976f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan err = mGralloc->unlock(mGralloc, handle); 11076f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#else 11176f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan int releaseFence = -1; 11276f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan err = gralloc_unlock_async_img(mGralloc, handle, &releaseFence); 11376f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan if (releaseFence >= 0) { 11476f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan sync_wait(releaseFence, -1); 11576f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan close(releaseFence); 11676f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan } 11776f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#endif 118fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (err) { 11946ec2e2bd4bfdfe667d89afad353cf3c351e705eywan ALOGE("unlock(...) failed %d (%s)", err, strerror(-err)); 120751400dde1eac64dd41c7de33fcddf8a939e4ab2hding return -1; 121751400dde1eac64dd41c7de33fcddf8a939e4ab2hding } else { 12246ec2e2bd4bfdfe667d89afad353cf3c351e705eywan ALOGV("unlock returned\n"); 123751400dde1eac64dd41c7de33fcddf8a939e4ab2hding } 124fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 125fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return err; 126fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang} 127fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 12806e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Huint gralloc_register(buffer_handle_t handle) 12906e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu{ 13006e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu int err = 0; 13106e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu 13276f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan if (!mGralloc) { 13306e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu ALOGW("%s: gralloc module has not been initialized.", __func__); 13406e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu if (gralloc_init()) { 13506e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu ALOGE("%s: can't find the %s module", __func__, 13606e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu GRALLOC_HARDWARE_MODULE_ID); 13706e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu return -1; 13806e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu } 13906e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu } 14006e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu 14176f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan err = gralloc_register_img(mGralloc, handle); 14206e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu if (err) { 14306e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu ALOGE("%s failed with %d (%s).\n", __func__, err, strerror(-err)); 14406e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu return -1; 14506e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu } else { 14606e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu ALOGV("registered buffer %p successfully\n", handle); 14706e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu } 14806e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu 14906e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu return err; 15006e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu} 15106e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu 15206e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Huint gralloc_unregister(buffer_handle_t handle) 15306e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu{ 15406e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu int err = 0; 15506e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu 15676f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan if (!mGralloc) { 15706e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu ALOGW("%s: gralloc module has not been initialized.", __func__); 15806e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu if (gralloc_init()) { 15906e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu ALOGE("%s: can't find the %s module", __func__, 16006e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu GRALLOC_HARDWARE_MODULE_ID); 16106e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu return -1; 16206e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu } 16306e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu } 16406e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu 16576f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan err = gralloc_unregister_img(mGralloc, handle); 16606e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu if (err) { 16706e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu ALOGE("%s failed with %d (%s).\n", __func__, err, strerror(-err)); 16806e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu return -1; 16906e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu } else { 17006e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu ALOGV("unregistered buffer %p successfully\n", handle); 17106e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu } 17206e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu 17306e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu return err; 17406e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu} 17506e002d2cd1c3698b9ce4c96363a67e60e62707bAustin Hu 176fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiangint gralloc_init(void) 177fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang{ 17876f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan int err; 17976f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan 18076f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#ifdef BAYTRAIL 18176f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan err = hw_get_module(GRALLOC_HW_MODULE_ID, (const hw_module_t **)&mGralloc); 18276f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#else 18376f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan err = gralloc_open_img(&mGralloc); 18476f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#endif 185fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (err) { 18646ec2e2bd4bfdfe667d89afad353cf3c351e705eywan ALOGE("FATAL: can't find the %s module", GRALLOC_HARDWARE_MODULE_ID); 187fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return -1; 188fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } else 18946ec2e2bd4bfdfe667d89afad353cf3c351e705eywan ALOGD("hw_get_module returned\n"); 190fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 191fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return 0; 192fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang} 193fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 194707b8b113fe163bc866f6de89ce08385772ef4e7nguoint gralloc_getdisplaystatus(buffer_handle_t handle, int* status) 195707b8b113fe163bc866f6de89ce08385772ef4e7nguo{ 196707b8b113fe163bc866f6de89ce08385772ef4e7nguo int err; 19776f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan 19876f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#ifdef BAYTRAIL 19976f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan *status = mGralloc->perform(mGralloc, INTEL_UFO_GRALLOC_MODULE_PERFORM_GET_BO_STATUS, handle); 20076f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan err = 0; 20176f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan#else 20296fcbcb36c67aff2f6a723c468d500c1e2c98504Vinil Cheeramvelil uint32_t _status = 0U; 20376f9c460fdad60c6b670774e55c8001944caabdcAlistair Strachan err = gralloc_get_display_status_img(mGralloc, handle, &_status); 20496fcbcb36c67aff2f6a723c468d500c1e2c98504Vinil Cheeramvelil *status = (int)_status; 205eb5827ee91388bdeda5789ff6a84a918e14d580dCheng Yao#endif 206707b8b113fe163bc866f6de89ce08385772ef4e7nguo if (err){ 20746ec2e2bd4bfdfe667d89afad353cf3c351e705eywan ALOGE("gralloc_getdisplaystatus(...) failed %d (%s).\n", err, strerror(-err)); 208707b8b113fe163bc866f6de89ce08385772ef4e7nguo return -1; 209707b8b113fe163bc866f6de89ce08385772ef4e7nguo } 210707b8b113fe163bc866f6de89ce08385772ef4e7nguo 211707b8b113fe163bc866f6de89ce08385772ef4e7nguo return err; 212707b8b113fe163bc866f6de89ce08385772ef4e7nguo} 2132046ea17ddb468c845f542a88761a03b04898fd7Vinil Cheeramvelil 2142046ea17ddb468c845f542a88761a03b04898fd7Vinil Cheeramvelilint gralloc_getbuffd(buffer_handle_t handle) 2152046ea17ddb468c845f542a88761a03b04898fd7Vinil Cheeramvelil{ 2162046ea17ddb468c845f542a88761a03b04898fd7Vinil Cheeramvelil return ((IMG_native_handle_t*)handle)->fd[0]; 2172046ea17ddb468c845f542a88761a03b04898fd7Vinil Cheeramvelil} 218