/*
 * Copyright (C) 2014-2017 Intel Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#define LOG_TAG "GfxLinuxGeneric"

#include "Camera3GFXFormat.h"
#include "PlatformData.h"
#include "LogHelper.h"

namespace cros {
namespace intel {

/* Native handle int indices, as offsets on top of numFds.
 * Keep this in synch with gralloc_priv.h, which is in cameralibs!
 */
enum NativeHandleIntIndices {
    NATIVE_HANDLE_MAGIC = 0,
    NATIVE_HANDLE_FLAGS,
    NATIVE_HANDLE_SIZE,
    NATIVE_HANDLE_OFFSET,
    NATIVE_HANDLE_WIDTH,
    NATIVE_HANDLE_HEIGHT,
    NATIVE_HANDLE_STRIDE,
    NATIVE_HANDLE_HALFORMAT,
    NATIVE_HANDLE_USAGE,
    /* insert here when updating */
    NATIVE_HANDLE_INT_MAX
};

int v4L2Fmt2GFXFmt(int v4l2Fmt)
{
    int gfxFmt = -1;

    switch (v4l2Fmt) {
    case V4L2_PIX_FMT_JPEG:
        gfxFmt = HAL_PIXEL_FORMAT_BLOB;
        break;
    case V4L2_PIX_FMT_SBGGR8:
    case V4L2_PIX_FMT_SRGGB8:
    case V4L2_PIX_FMT_SGRBG8:
    case V4L2_PIX_FMT_SRGGB10:
    case V4L2_PIX_FMT_SGRBG10:
    case V4L2_PIX_FMT_SGRBG12:
    case V4L2_PIX_FMT_SBGGR10:
#ifdef V4L2_PIX_FMT_SBGGR10P
    case V4L2_PIX_FMT_SBGGR10P:
#endif
#ifdef V4L2_PIX_FMT_SGBRG10P
    case V4L2_PIX_FMT_SGBRG10P:
#endif
#ifdef V4L2_PIX_FMT_SGRBG10P
    case V4L2_PIX_FMT_SGRBG10P:
#endif
#ifdef V4L2_PIX_FMT_SRGGB10P
    case V4L2_PIX_FMT_SRGGB10P:
#endif
    case V4L2_PIX_FMT_SBGGR12:
    case V4L2_PIX_FMT_SGBRG12:
    case V4L2_PIX_FMT_SRGGB12:
#ifdef V4L2_PIX_FMT_SGRBG12V32
    case V4L2_PIX_FMT_SGRBG12V32:
#endif
#ifdef V4L2_PIX_FMT_CIO2_SRGGB10
    case V4L2_PIX_FMT_CIO2_SRGGB10:
#endif
        gfxFmt = HAL_PIXEL_FORMAT_RAW16;
        break;
    case V4L2_PIX_FMT_YVU420:
#ifdef V4L2_PIX_FMT_YUYV420_V32
    case V4L2_PIX_FMT_YUYV420_V32:
#endif
        gfxFmt = HAL_PIXEL_FORMAT_YV12;
        break;
    case V4L2_PIX_FMT_IPU3_SBGGR10:
    case V4L2_PIX_FMT_IPU3_SGBRG10:
    case V4L2_PIX_FMT_IPU3_SGRBG10:
    case V4L2_PIX_FMT_IPU3_SRGGB10:
        gfxFmt = HAL_PIXEL_FORMAT_RAW10;
        break;
    case V4L2_META_FMT_IPU3_PARAMS:
    case V4L2_META_FMT_IPU3_STAT_3A:
    case V4L2_META_FMT_IPU3_STAT_DVS:
    case V4L2_META_FMT_IPU3_STAT_LACE:
        gfxFmt = HAL_PIXEL_FORMAT_RAW_OPAQUE;
        break;
    case V4L2_PIX_FMT_NV21:
        gfxFmt = HAL_PIXEL_FORMAT_YCrCb_420_SP;
        break;
    case V4L2_PIX_FMT_NV12:
        gfxFmt = HAL_PIXEL_FORMAT_NV12_LINEAR_CAMERA_INTEL;
        break;
    case V4L2_PIX_FMT_YUYV:
        gfxFmt = HAL_PIXEL_FORMAT_YCbCr_422_I;
        break;
    default:
        LOGE("%s: no gfx format for v4l2 0x%x, %s!",
             __FUNCTION__, v4l2Fmt,
             v4l2Fmt2Str(v4l2Fmt));
        break;
    }

    return gfxFmt;
}

int widthToStride(int fourcc, int width)
{
    /**
     * Raw format has special aligning requirements
     */
    int stride = 0;
    if (isBayerFormat(fourcc))
        return ALIGN128(width);
    switch (fourcc) {
    case V4L2_PIX_FMT_NV12:
    case V4L2_PIX_FMT_NV21:
    case V4L2_PIX_FMT_YVU420:
        stride =  ALIGN64(width);
        break;
    case V4L2_PIX_FMT_YUYV:
        stride =  ALIGN32(width);
        break;
    default:
        stride = ALIGN64(width);
        break;
    }
    return stride;
}

} /* namespace intel */
} /* namespace cros */
