/* SPDX-License-Identifier: LGPL-2.1-only OR BSD-3-Clause */
/******************************************************************************
 *
 * This file is provided under a dual license.  When you use or
 * distribute this software, you may choose to be licensed under
 * version 2.1 of the GNU Lesser General Public License
 * ("LGPLv2.1 License") or BSD License.
 *
 * LGPLv2.1 License
 *
 * Copyright(C) 2019 MediaTek Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2.1 of the GNU Lesser General Public
 * License as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html for more
 * details.
 *
 * BSD LICENSE
 *
 * Copyright(C) 2019 MediaTek Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  * Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *****************************************************************************/

/*-----------------------------------------------------------------------------
 * $RCSfile: u_sect_eng.h,v $
 * $Revision: #1 $
 * $Date: 2015/05/29 $
 * $Author: brianpc.huang $
 *
 * Description:
 *         This header file contains SECT engine specific definitions, which
 *         are exported.
 *------------------------------------------------------------------------*/

#ifndef _U_SECT_ENG_H_
#define _U_SECT_ENG_H_


/*--------------------------------------------------------------------------
                    include files
--------------------------------------------------------------------------*/

#include "u_handle_grp.h"
#include "u_common.h"
#include "u_tm.h"


/*--------------------------------------------------------------------------
                    macros, defines, typedefs, enums
 -------------------------------------------------------------------------*/

/* Default SECT engine name. */
#define SECT_DEFAULT_NAME  "sect_engine"

#define MAX_SECT_REQ_PATTERN_LEN  32        /* 8 */

/* SECT engine handle types. */
#define TMT_SECT_FILTER  (TMT_SECT + ((HANDLE_TYPE_T)  0))
#define TMT_SECT_REQ     (TMT_SECT + ((HANDLE_TYPE_T)  1))


/* SECT engine load types. */
#define SECT_LOAD_TYPE_PID          ((TM_LOAD_TYPE_LAST_ENTRY + \
            ((TM_LOAD_TYPE_T) 0)) | TM_LOAD_TYPE_SINGLE_SRC)
#define SECT_LOAD_TYPE_PID_TS_DESCR ((TM_LOAD_TYPE_LAST_ENTRY + \
            ((TM_LOAD_TYPE_T) 1)) | TM_LOAD_TYPE_SINGLE_SRC)
#define SECT_LOAD_TYPE_REQ          ((TM_LOAD_TYPE_LAST_ENTRY + \
            ((TM_LOAD_TYPE_T) 2)) | TM_LOAD_TYPE_FEED_SECTION | \
              TM_LOAD_TYPE_SINGLE_SRC)
#define SECT_LOAD_TYPE_PID_BUFF     ((TM_LOAD_TYPE_LAST_ENTRY + \
            ((TM_LOAD_TYPE_T) 3)) | TM_LOAD_TYPE_SINGLE_SRC)
#define SECT_LOAD_TYPE_PID_TS_DESCR_BUFF ((TM_LOAD_TYPE_LAST_ENTRY + \
             ((TM_LOAD_TYPE_T) 4)) | TM_LOAD_TYPE_SINGLE_SRC)

typedef enum {
    SECT_FLAG_SET,
    SECT_FLAG_CLEAR,
    SECT_FLAG_IGNORE
} FLAG_VALUE;

/* Holds a PID and TS descriptor */
typedef struct _SECT_PID_TS_DESCR_T
{
    TS_DESCR_T    t_ts_descr;

    MPEG_2_PID_T  t_pid;
}   SECT_PID_TS_DESCR_T;

/* Holds a PID and TS descriptor and ring buffer details*/
typedef struct _SECT_PID_TS_DESCR_BUFF_T
{
    TS_DESCR_T    t_ts_descr;
    MPEG_2_PID_T  t_pid;
    UINT16        ui2_num_slots;
    BOOL          b_prealloc;
}   SECT_PID_TS_DESCR_BUFF_T;

typedef struct _SECT_REQ_T 
{
    UINT8            ui1_tbl_id;
    UINT8            ui1_tbl_id_mask;

    FLAG_VALUE       e_priv_ind;
    FLAG_VALUE       e_sect_syn_ind;

    BOOL             b_ignore_crc;
    BOOL             b_ignore_version;
    BOOL             b_ignore_ts_id;
    BOOL             b_ignore_on_id;

    /* offset in section that pos and neg filters start */
    UINT8            ui1_offset;

    /* length of pos and neg filters/masks */
    UINT8            ui1_pattern_len;

    UINT8            aui1_pos_pattern[MAX_SECT_REQ_PATTERN_LEN];
    UINT8            aui1_pos_mask   [MAX_SECT_REQ_PATTERN_LEN];

    UINT8            aui1_neg_pattern[MAX_SECT_REQ_PATTERN_LEN];
    UINT8            aui1_neg_mask   [MAX_SECT_REQ_PATTERN_LEN];
} SECT_REQ_T;

/* SECT engine configuration structure. */
typedef struct _SECT_CONFIG_T
{
    UINT8   ui1_num_filters;

    UINT8   ui1_num_filter_objs;

    SIZE_T  z_buff_size;

    UINT16  ui2_num_reqs;

}   SECT_CONFIG_T;

#endif /* _U_SECT_ENG_H_ */
