ts_indexer: Add TS indexer. [1/1]
PD#SWPL-119993
Problem:
Need TS indexer
Solution:
Add ts indexer and test pass
Verify:
verify MPEG2/H264/HEVC on ubuntu
Change-Id: I69e49afc34f47090cb87fd2541e95fdc979a2e22
Signed-off-by: Yahui Han <yahui.han@amlogic.com>
diff --git a/include/ts_indexer.h b/include/ts_indexer.h
new file mode 100644
index 0000000..147ef18
--- /dev/null
+++ b/include/ts_indexer.h
@@ -0,0 +1,141 @@
+/**
+ * \file
+ * TS indexer.
+ */
+
+#ifndef _TS_INDEXER_H_
+#define _TS_INDEXER_H_
+
+#include <inttypes.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**Video format*/
+typedef enum {
+ TS_INDEXER_VIDEO_FORMAT_MPEG2, /**< MPEG2*/
+ TS_INDEXER_VIDEO_FORMAT_H264, /**< H264*/
+ TS_INDEXER_VIDEO_FORMAT_HEVC /**< HEVC*/
+} TS_Indexer_StreamFormat_t;
+
+/**Event type.*/
+typedef enum {
+ TS_INDEXER_EVENT_TYPE_VIDEO_I_FRAME, /**< Video I frame PTS.*/
+ TS_INDEXER_EVENT_TYPE_VIDEO_PTS, /**< Video PTS.*/
+ TS_INDEXER_EVENT_TYPE_AUDIO_PTS /**< Audio PTS.*/
+} TS_Indexer_EventType_t;
+
+/**Stream Parser state.*/
+typedef enum {
+ TS_INDEXER_STATE_INIT, /**< Init state.*/
+ TS_INDEXER_STATE_TS_START, /**< TS header state with start_indicator==1.*/
+ TS_INDEXER_STATE_PES_HEADER, /**< PES header state.*/
+ TS_INDEXER_STATE_PES_PTS, /**< PES pts state.*/
+ TS_INDEXER_STATE_PES_I_FRAME /**< PES I-frame state.*/
+} TS_Indexer_State_t;
+
+/**Event.*/
+typedef struct {
+ TS_Indexer_EventType_t type; /**< Event type.*/
+ int pid; /**< The PID of the stream.*/
+ uint64_t offset; /**< The offset of the first TS packet of this frame.*/
+ uint64_t pts; /**< The PTS of this frame.*/
+} TS_Indexer_Event_t;
+
+/**TS indexer.*/
+typedef struct TS_Indexer_s TS_Indexer_t;
+
+/**Event callback function.*/
+typedef void (*TS_Indexer_EventCallback_t) (TS_Indexer_t *ts_indexer, TS_Indexer_Event_t *event);
+
+/**PES parser.*/
+typedef struct {
+ uint64_t pts; /**< The a/v PTS.*/
+ uint64_t offset; /**< The current offset.*/
+ uint8_t data[184+16]; /**< The PES data.*/
+ int len; /**< The length of PES data`.*/
+ TS_Indexer_State_t state; /**< The stream state.*/
+} PESParser;
+
+/**TS parser.*/
+typedef struct {
+ int pid; /**< The a/v PID.*/
+ TS_Indexer_StreamFormat_t format; /**< The a/v format.*/
+ PESParser PES; /**< The PES parser.*/
+ uint64_t offset; /**< The offset of packet with start indicator.*/
+} TSParser;
+
+/**TS indexer.*/
+struct TS_Indexer_s {
+ TSParser video_parser; /**< The video parser.*/
+ TSParser audio_parser; /**< The audio parser.*/
+ uint64_t offset; /**< The current offset.*/
+ TS_Indexer_EventCallback_t callback; /**< The event callback function.*/
+};
+
+/**
+ * Initialize the TS indexer.
+ * \param ts_indexer The TS indexer to be initialized.
+ * \retval 0 On success.
+ * \retval -1 On error.
+ */
+int ts_indexer_init (TS_Indexer_t *ts_indexer);
+
+/**
+ * Release the TS indexer.
+ * \param ts_indexer The TS indexer to be released.
+ */
+void ts_indexer_destroy (TS_Indexer_t *ts_indexer);
+
+/**
+ * Set the video format.
+ * \param ts_indexer The TS indexer.
+ * \param format The video format.
+ * \retval 0 On success.
+ * \retval -1 On error.
+ */
+int ts_indexer_set_video_format (TS_Indexer_t *ts_indexer, TS_Indexer_StreamFormat_t format);
+
+/**
+ * Set the video PID.
+ * \param ts_indexer The TS indexer.
+ * \param pid The video PID.
+ * \retval 0 On success.
+ * \retval -1 On error.
+ */
+int ts_indexer_set_video_pid (TS_Indexer_t *ts_indexer, int pid);
+
+/**
+ * Set the audio PID.
+ * \param ts_indexer The TS indexer.
+ * \param pid The audio PID.
+ * \retval 0 On success.
+ * \retval -1 On error.
+ */
+int ts_indexer_set_audio_pid (TS_Indexer_t *ts_indexer, int pid);
+
+/**
+ * Set the event callback function.
+ * \param ts_indexer The TS indexer.
+ * \param callback The event callback function.
+ * \retval 0 On success.
+ * \retval -1 On error.
+ */
+int ts_indexer_set_event_callback (TS_Indexer_t *ts_indexer, TS_Indexer_EventCallback_t callback);
+
+/**
+ * Parse the TS stream and generate the index data.
+ * \param ts_indexer The TS indexer.
+ * \param data The TS data.
+ * \param len The length of the TS data in bytes.
+ * \return The left TS data length of bytes.
+ */
+int ts_indexer_parse (TS_Indexer_t *ts_indexer, uint8_t *data, int len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_TS_INDEXER_H_*/
+