/* SPDX-License-Identifier: Apache-2.0 OR MIT */
/*
 * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
 */

#define MODULE_TAG "mpp_compat"

#include "mpp_debug.h"
#include "mpp_common.h"

#include "mpp_compat.h"
#include "mpp_compat_impl.h"

static MppCompat compats[] = {
    {
        MPP_COMPAT_INC_FBC_BUF_SIZE,
        MPP_COMPAT_BOOL,
        1,
#if defined(__ANDROID__)
        /*
         * The codecs might need extra lines for deblock output, but the
         * android world rather risk memory overflow than using the correct
         * buf size.
         */
        0,
#else
        1,
#endif
        "increase decoder fbc buffer size",
        &compats[1],
    },
    {
        MPP_COMPAT_ENC_ASYNC_INPUT,
        MPP_COMPAT_BOOL,
        1,
        0,
        "support encoder async input mode",
        NULL,
    },
    {
        MPP_COMPAT_DEC_FBC_HDR_256_ODD,
        MPP_COMPAT_BOOL,
        0,
        0,
        "set decoder fbc header stride to 256 odd align",
        NULL,
    },
};

RK_S32 *compat_ext_fbc_buf_size = &compats[MPP_COMPAT_INC_FBC_BUF_SIZE].value_usr;
RK_S32 *compat_ext_async_input  = &compats[MPP_COMPAT_ENC_ASYNC_INPUT].value_usr;
RK_S32 *compat_ext_fbc_hdr_256_odd  = &compats[MPP_COMPAT_DEC_FBC_HDR_256_ODD].value_usr;

MppCompat *mpp_compat_query(void)
{
    return compats;
}

MppCompat *mpp_compat_query_by_id(MppCompatId id)
{
    RK_U32 i;

    for (i = 0; i < MPP_ARRAY_ELEMS(compats); i++) {
        if (compats[i].feature_id == id)
            return &compats[i];
    }

    return NULL;
}

MPP_RET mpp_compat_update(MppCompat *compat, RK_S32 value)
{
    if (NULL == compat)
        return MPP_NOK;

    if (compat->feature_id >= MPP_COMPAT_BUTT)
        return MPP_NOK;

    if (compat != &compats[compat->feature_id])
        return MPP_NOK;

    if (compat->feature_type == MPP_COMPAT_BOOL)
        if (value != 0 && value != 1)
            return MPP_NOK;

    compat->value_usr = value;
    return MPP_OK;
}

void mpp_compat_show(void)
{
    const MppCompat *compat = compats;

    mpp_log("id| name -- mpp compat info\n");

    while (compat) {
        mpp_log("%d | %s\n", compat->feature_id, compat->name);

        compat = compat->next;
    }
}
