blob: 37aa29178d3b6d860461fd7fa2052e5158266ded [file] [log] [blame]
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef _SWDEMUX_H
#define _SWDEMUX_H
#include <linux/types.h>
//#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
/**Boolean value true.*/
#define SWDMX_TRUE 1
/**Boolean value false.*/
#define SWDMX_FALSE 0
/**Function result: OK.*/
#define SWDMX_OK 1
/**Function result: no error but do nothing.*/
#define SWDMX_NONE 0
/**Function result: error.*/
#define SWDMX_ERR -1
/**Section data callback function.*/
typedef void (*swdmx_sec_cb)(u8 *data,
int len,
void *udata);
/**Length of the section filter.*/
#define SWDMX_SEC_FILTER_LEN 16
/**TS packet filter's parameters.*/
struct swdmx_tsfilter_params {
u16 pid; /**< PID of the stream.*/
};
/**Section filter's parameters.*/
struct swdmx_secfilter_params {
u16 pid; /**< PID of the section.*/
u8 crc32; /**< CRC32 check.*/
u8 value[SWDMX_SEC_FILTER_LEN]; /**< Value array.*/
u8 mask[SWDMX_SEC_FILTER_LEN]; /**< Mask array.*/
u8 mode[SWDMX_SEC_FILTER_LEN]; /**< Match mode array.*/
};
/**TS packet.*/
struct swdmx_tspacket {
u16 pid; /**< PID.*/
u8 payload_start; /**< Payload start flag.*/
u8 priority; /**< TS packet priority.*/
u8 error; /**< Error flag.*/
u8 scramble; /**< Scramble flag.*/
u8 cc; /**< Continuous counter.*/
u8 *packet; /**< Packet buffer.*/
int packet_len; /**< Packet length.*/
u8 *adp_field; /**< Adaptation field buffer.*/
int adp_field_len; /**< Adaptation field length.*/
u8 *payload; /**< Payload buffer.*/
int payload_len; /**< Payload length.*/
};
/**DVBCSA2 parameter.*/
enum {
SWDMX_DVBCSA2_PARAM_ODD_KEY, /**< 8 bytes odd key.*/
SWDMX_DVBCSA2_PARAM_EVEN_KEY /**< 8 bytes even key.*/
};
/**Scrambled data alignment.*/
enum {
SWDMX_DESC_ALIGN_HEAD, /**< Align to payload head.*/
SWDMX_DESC_ALIGN_TAIL /**< Align to payload tail.*/
};
/**AES ECB parameter.*/
enum {
SWDMX_AES_ECB_PARAM_ODD_KEY, /**< 16 bytes odd key.*/
SWDMX_AES_ECB_PARAM_EVEN_KEY, /**< 16 bytes even key.*/
SWDMX_AES_ECB_PARAM_ALIGN /**< Alignment.*/
};
/**AES CBC parameter.*/
enum {
SWDMX_AES_CBC_PARAM_ODD_KEY, /**< 16 bytes odd key.*/
SWDMX_AES_CBC_PARAM_EVEN_KEY, /**< 16 bytes even key.*/
SWDMX_AES_CBC_PARAM_ALIGN, /**< Align to head.*/
SWDMX_AES_CBC_PARAM_ODD_IV, /**< 16 bytes odd key's IV data.*/
SWDMX_AES_CBC_PARAM_EVEN_IV /**< 16 bytes even key's ID data.*/
};
/**TS packet callback function.*/
typedef void (*swdmx_tspacket_cb)(struct swdmx_tspacket *pkt,
void *udata);
/**
* Create a new TS packet parser.
* \return The new TS parser.
*/
extern struct swdmx_ts_parser*
swdmx_ts_parser_new(void);
/**
* Set the TS packet size.
* \param tsp The TS parser.
* \param size The packet size.
* \retval SWDMX_OK On success.
* \retval SWDMX_ERR On error.
*/
extern int
swdmx_ts_parser_set_packet_size(struct swdmx_ts_parser *tsp,
int size);
/**
* Add a TS packet callback function to the TS parser.
* \param tsp The TS parser.
* \param cb The callback function.
* \param data The user defined data used as the callback's parameter.
* \retval SWDMX_OK On success.
* \retval SWDMX_ERR On error.
*/
extern int
swdmx_ts_parser_add_ts_packet_cb(struct swdmx_ts_parser *tsp,
swdmx_tspacket_cb cb,
void *data);
/**
* Remove a TS packet callback function from the TS parser.
* \param tsp The TS parser.
* \param cb The callback function.
* \param data The user defined data used as the callback's parameter.
* \retval SWDMX_OK On success.
* \retval SWDMX_ERR On error.
*/
extern int
swdmx_ts_parser_remove_ts_packet_cb(struct swdmx_ts_parser *tsp,
swdmx_tspacket_cb cb,
void *data);
/**
* Parse TS data.
* \param tsp The TS parser.
* \param data Input TS data.
* \param len Input data length in bytes.
* \return Parse data length in bytes.
*/
extern int
swdmx_ts_parser_run(struct swdmx_ts_parser *tsp,
u8 *data,
int len);
/**
* Free an unused TS parser.
* \param tsp The TS parser to be freed.
*/
extern void
swdmx_ts_parser_free(struct swdmx_ts_parser *tsp);
/**
* Create a new demux.
* \return The new demux.
*/
extern struct swdmx_demux*
swdmx_demux_new(void);
/**
* Allocate a new TS packet filter from the demux.
* \param dmx The demux.
* \return The new TS packet filter.
*/
extern struct swdmx_tsfilter*
swdmx_demux_alloc_ts_filter(struct swdmx_demux *dmx);
/**
* Allocate a new section filter from the demux.
* \param dmx The demux.
* \return The new section filter.
*/
extern struct swdmx_secfilter*
swdmx_demux_alloc_sec_filter(struct swdmx_demux *dmx);
/**
* TS packet input function of the demux.
* \param pkt Input TS packet.
* \param dmx The demux.
*/
extern void
swdmx_demux_ts_packet_cb(struct swdmx_tspacket *pkt,
void *dmx);
/**
* Free an unused demux.
* \param dmx The demux to be freed.
*/
extern void
swdmx_demux_free(struct swdmx_demux *dmx);
/**
* Set the TS filter's parameters.
* \param filter The filter.
* \param params Parameters of the filter.
* \retval SWDMX_OK On success.
* \retval SWDMX_ERR On error.
*/
extern int
swdmx_ts_filter_set_params(struct swdmx_tsfilter *filter,
struct swdmx_tsfilter_params *params);
/**
* Add a TS packet callback to the TS filter.
* \param filter The TS filter.
* \param cb The callback function.
* \param data User defined data used as callback's parameter.
* \retval SWDMX_OK On success.
* \retval SWDMX_ERR On error.
*/
extern int
swdmx_ts_filter_add_ts_packet_cb(struct swdmx_tsfilter *filter,
swdmx_tspacket_cb cb,
void *data);
/**
* Remove a TS packet callback from the TS filter.
* \param filter The TS filter.
* \param cb The callback function.
* \param data User defined data used as callback's parameter.
* \retval SWDMX_OK On success.
* \retval SWDMX_ERR On error.
*/
extern int
swdmx_ts_filter_remove_ts_packet_cb(struct swdmx_tsfilter *filter,
swdmx_tspacket_cb cb,
void *data);
/**
* Enable the TS filter.
* \param filter The TS filter.
* \retval SWDMX_OK On success.
* \retval SWDMX_ERR On error.
*/
extern int
swdmx_ts_filter_enable(struct swdmx_tsfilter *filter);
/**
* Disable the TS filter.
* \param filter The filter.
* \retval SWDMX_OK On success.
* \retval SWDMX_ERR On error.
*/
extern int
swdmx_ts_filter_disable(struct swdmx_tsfilter *filter);
/**
* Free an unused TS filter.
* \param filter The ts filter to be freed.
*/
extern void
swdmx_ts_filter_free(struct swdmx_tsfilter *filter);
/**
* Set the section filter's parameters.
* \param filter The section filter.
* \param params Parameters of the filter.
* \retval SWDMX_OK On success.
* \retval SWDMX_ERR On error.
*/
extern int
swdmx_sec_filter_set_params(struct swdmx_secfilter *filter,
struct swdmx_secfilter_params *params);
/**
* Add a section callback to the section filter.
* \param filter The section filter.
* \param cb The callback function.
* \param data User defined data used as callback's parameter.
* \retval SWDMX_OK On success.
* \retval SWDMX_ERR On error.
*/
extern int
swdmx_sec_filter_add_section_cb(struct swdmx_secfilter *filter,
swdmx_sec_cb cb,
void *data);
/**
* Remove a section callback from the section filter.
* \param filter The section filter.
* \param cb The callback function.
* \param data User defined data used as callback's parameter.
* \retval SWDMX_OK On success.
* \retval SWDMX_ERR On error.
*/
extern int
swdmx_sec_filter_remove_section_cb(struct swdmx_secfilter *filter,
swdmx_sec_cb cb,
void *data);
/**
* Enable the section filter.
* \param filter The section filter.
* \retval SWDMX_OK On success.
* \retval SWDMX_ERR On error.
*/
extern int
swdmx_sec_filter_enable(struct swdmx_secfilter *filter);
/**
* Disable the section filter.
* \param filter The section filter.
* \retval SWDMX_OK On success.
* \retval SWDMX_ERR On error.
*/
extern int
swdmx_sec_filter_disable(struct swdmx_secfilter *filter);
/**
* Free an unused section filter.
* \param filter The section filter to be freed.
*/
extern void
swdmx_sec_filter_free(struct swdmx_secfilter *filter);
#ifdef __cplusplus
}
#endif
#endif