/*
 * libdvs.h - abstract header for DVS (Digital Video Stabilizer)
 *
 *    Copyright (c) 2014-2016 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>
 */

#ifndef _LIB_DVS_HPP
#define _LIB_DVS_HPP

#include <stdio.h>

#if (defined __linux__)
#define DVSAPI __attribute__((visibility("default")))
#endif

typedef struct DvsData
{
    cv::UMat data;

    virtual ~DvsData () {};
} DvsData;


typedef struct DvsResult
{
    int frame_id;
    bool valid;
    int frame_width;
    int frame_height;
    double proj_mat[3][3];

    DvsResult(): frame_id(-1), valid(false)
    {};
} DvsResult;


typedef struct  DvsConfig
{
    bool use_ocl; //ture:ocl path; false:cpu path;
    int frame_width;
    int frame_height;
    int radius;
    float stdev;
    int features;
    double minDistance;

    DvsConfig()
    {
        use_ocl = true;
        frame_width = 1;
        frame_height = 1;
        radius = 15;
        stdev = 10.0f;
        features = 1000;
        minDistance = 15.0f;
    }
} DvsConfig;

typedef struct DvsInterface
{
    virtual ~DvsInterface() {}
    /// initialize model from memory
    virtual int init(int width, int height, bool twoPass) = 0;

    /// set detection parameters, if config = NULL, default parameters will be used
    virtual void setConfig(DvsConfig* config) = 0;

    /// release memory
    virtual void release() = 0;

    /// apply homography estimation to an input image
    /// @param frame input 8-bit single channel UMAT image (color image must be transferred to gray-scale)
    /// @param result output homography estimation result of the input image
    virtual void nextStabilizedMotion(DvsData* frame, DvsResult* result) = 0;

} DvsInterface;

extern "C" DVSAPI DvsInterface* getDigitalVideoStabilizer(void);

#endif