/*
 * xcam_smart_description.h - libxcam smart analysis description
 *
 *  Copyright (c) 2015 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.
 *
 * Author: Zong Wei <wei.zong@intel.com>
 *         Wind Yuan <feng.yuan@intel.com>
 */

#ifndef C_XCAM_SMART_ANALYSIS_DESCRIPTION_H
#define C_XCAM_SMART_ANALYSIS_DESCRIPTION_H

#include <base/xcam_common.h>
#include <base/xcam_params.h>
#include <base/xcam_3a_result.h>
#include <base/xcam_buffer.h>

XCAM_BEGIN_DECLARE

#define XCAM_SMART_ANALYSIS_LIB_DESCRIPTION "xcam_smart_analysis_desciption"

typedef struct _XCamSmartAnalysisContext XCamSmartAnalysisContext;

typedef XCamReturn (*XcamPostResultsFunc) (
    XCamSmartAnalysisContext *context,
    const XCamVideoBuffer *buffer,
    XCam3aResultHead *results[], uint32_t res_count);


#define XCAM_SMART_PLUGIN_PRIORITY_HIGH     1
#define XCAM_SMART_PLUGIN_PRIORITY_DEFAULT  10
#define XCAM_SMART_PLUGIN_PRIORITY_LOW      100

/*  \brief C interface of Smart Analysis Description
  *     <version>          xcam version
  *     <size>               description structure size, sizeof (XCamSmartAnalysisDescription)
  *     <priority>           smart plugin priority; the less value the higher priority; 0, highest priority
  *     <name>             smart pluign name, or use file name if NULL
  */
typedef struct _XCamSmartAnalysisDescription {
    uint32_t                        version;
    uint32_t                        size;
    uint32_t                        priority;
    const char                     *name;

    /*! \brief initialize smart analysis context.
    *
    * \param[out]        context            create context handle
    * \param[out]        async_mode     0, sync mode; 1, async mode
    * \param[in]          post_func         plugin can use post_func to post results in async mode
    */
    XCamReturn (*create_context)  (XCamSmartAnalysisContext **context,
                                   uint32_t *async_mode, XcamPostResultsFunc post_func);
    /*! \brief destroy smart analysis context.
    *
    * \param[in]        context            create context handle
    */
    XCamReturn (*destroy_context) (XCamSmartAnalysisContext *context);

    /*! \brief update smart analysis context parameters.
    *
    * \param[in]        context            context handle
    * \param[in]        params            new parameters
    */
    XCamReturn (*update_params)   (XCamSmartAnalysisContext *context, const XCamSmartAnalysisParam *params);

    /*! \brief analyze data and get result,.
    *
    * \param[in]        context            context handle
    * \param[in]        buffer              image buffer
    * \param[out]      results             analysis results array, only for sync mode (<async_mode> = 0)
    * \param[in/out]  res_count        in, max results array size; out, return results count.
    */
    XCamReturn (*analyze)         (XCamSmartAnalysisContext *context, XCamVideoBuffer *buffer,
                                   XCam3aResultHead *results[], uint32_t *res_count);

    /*! \brief free smart results.
    *
    * \param[in]        context            context handle
    * \param[in]        results             analysis results
    * \param[in]        res_count         analysis results count
    */
    void       (*free_results)    (XCamSmartAnalysisContext *context, XCam3aResultHead *results[], uint32_t res_count);
} XCamSmartAnalysisDescription;

XCAM_END_DECLARE

#endif //C_XCAM_SMART_ANALYSIS_DESCRIPTION_H