diff src/tssplitter_lite.h @ 183:27e5f99f8991

Delete ES out function. Merge Yazawa's tssplitter_lite. Add liner option.
author Naoya OYAMA <naoya.oyama@gmail.com>
date Mon, 05 May 2014 22:08:21 +0900
parents 7d8a5bb874ad
children dc0d3addfd18
line wrap: on
line diff
--- a/src/tssplitter_lite.h	Mon May 05 21:59:36 2014 +0900
+++ b/src/tssplitter_lite.h	Mon May 05 22:08:21 2014 +0900
@@ -23,7 +23,6 @@
 #define __STDC_FORMAT_MACROS
 #include <inttypes.h>
 #include <unistd.h>
-#include <limits.h>
 
 #define LENGTH_PACKET		(188)
 #define MAX_PID				(8192)
@@ -37,181 +36,42 @@
 #define TSS_NULL			(-2)
 #define LENGTH_PAT_HEADER	(12)
 #define C_CHAR_COMMA		','
-#define C_CHAR_DOT			'.'
-#define LENGTH_TS_HEADER (4)
-#define LENGTH_PES_HEADER (9)
-#define LENGTH_PTS (5)
-
-/* 改訂版デジタル放送教科書(上) P101 表1 ARIBでのPSI/SIの種類より参照 */
-#define PAT					(0x0000)
-//#define PMT						 /* PATによる間接指定 */
-#define CAT					(0x0001)
-#define NIT					(0x0010)
-#define SDT					(0x0011)
-#define BAT					(0x0011)
-#define EIT					(0x0012) /* 0x0026, 0x0027 */
-#define RST					(0x0013)
-#define TDT					(0x0014) /* 地デジでは使用されない */
-#define TOT					(0x0014)
-#define LIT					(0x0020) /* またはPMTによる間接指定 */
-#define	ERT					(0x0021) /* またはPMTによる間接指定 */
-//#define ITT						 /* PMTによる間接指定 */
-#define PCAT				(0x0022)
-#define BIT					(0x0024)
-#define NBIT				(0x0025)
-//#define ECM						 /* PMTによる間接指定 */
-//#define EMM						 /* CATによる間接指定 */
-#define LDT					(0x0025)
-#define DCT					(0x0017)
-//#define DTL						 /* DCTによる間接指定 */
-#define DIT					(0x001e)
-#define SIT					(0x001f)
-#define SDTT				(0x0023)
-#define CDT					(0x0029)
-//#define DSM-CC_Section			 /* PMTによる間接指定 */
-
-/* セクションヘッダ長 */
-/* TS パケットに各セクションを設置する際、該当TSパケットの残サイズが
- * いくつ以上あれば書き込めるかの判定に使用する。
- * デコードにはあまり重要では無いかも
- */
-#define SECTION_LENGTH_PAT	(8)
-#define SECTION_LENGTH_PMT	(8)
-#define SECTION_LENGTH_CAT	(8)
-#define SECTION_LENGTH_NIT	(8)
-#define SECTION_LENGTH_BIT	(8)
-#define SECTION_LENGTH_SDT	(11)
-#define SECTION_LENGTH_EIT	(14) /* H-EIT, M-EIT, L-EIT を示す */
-#define SECTION_LENGTH_SDTT	(15)
-#define SECTION_LENGTH_CDT	(13)
-#define SECTION_LENGTH_TOT	(10)
-
-enum {
-	PTS_FLAG = 0x80,
-	DTS_FLAG = 0x40,
-	ESCR_FLAG = 0x20,
-	ES_RATE_FLAG = 0x10,
-	DSM_TRICK_MODE_FLAG = 0x08,
-	COPY_INFO_FLAG = 0x04,
-	CRC_FLAG = 0x02,
-	EXTENSION_FLAG = 0x01
-};
+#define SECTION_CONTINUE	(1)
 
-enum {
-	PES_PRIVATE_DATA_FLAG = 0x80,
-	PACK_HEADER_FIELD_FLAG = 0x40,
-	PROGRAM_PACKET_SEQUENCE_COUNTER = 0x20,
-	PSTD_BUFFER_FLAG = 0x10,
-	PES_EXTENSION_FLAG2 = 0x01
-};
-
-/*
- * PCRからSTCを生成する処理方式
- * 1. PCRを二つ取得するまでループ(1.から4.までは初期処理で実施すること)
- * 2. ループ開始時刻(PCR)と、ループ抜けた時刻(PCR)の差分を取る
- * 3. ループ開始〜終了の間に処理したパケット数を数える
- * 4. (2.のPCRの進んだ時間/3.のパケット数) の計算によって、1パケットによって進むPCRを想定する
- * 5. TS受信時に、1つのパケットを処理する度に4.の想定する経過時刻をPCRに足し込んでSTCとする
- * 6. PCRを新規に取得したら、STCを補正(そのまま代入)する
- */
-#define MAX_VIDEO (16)
-#define MAX_AUDIO (32)
-typedef struct _program_t
-{
-	int64_t stc;
-	int64_t cue;		/* 録画開始時刻 */
-	int pmt_packet_id;	/* 該当Program(Service ID)に対応するPMT */
-	int pmt_version;	/* 該当Program(Service ID)に対応するPMTのVersion */
-	int pcr_packet_id;	/* 該当Program(Service ID)のPCRを保持するPID */
-	int64_t pcr1;	/* PCR1 */
-	int64_t pcr2;	/* PCR2 */
-	int pcr_packet_nb;	/* 直前のPCRを受信したときのパケット数 */
-	int packet_nb;	/* 直前のProgramの処理を実施したときのパケット数 */
-	int64_t pcr_incr;	/* 該当Program(Service ID)に於いて、1つのTSパケットを処理した時に経過する(と想定する時間) */
-	int video_start;		/* VODEO0を蓄積開始している? */
-	int64_t video_pts;		/* 最後に処理したVODEO0のESのPTS */
-	int video_nb;			/* PMT に存在するビデオストリームの数 */
-	int audio_nb;			/* PMT に存在する音声ストリームの数 */
-	int video[MAX_VIDEO];	/* PS出力する場合に使うかも */
-	int audio[MAX_AUDIO];	/* PS出力する場合に使うかも */
-} program_t;
-/*
- * program_t をサービスID分準備して、使用するイメージでいたけど、
- * サービスIDの最大値は0xFFFFであるので、静的に確保すると stack が簡単に溢るので、
- * 実行時に malloc とするかなぁ
- * 本当は必要なだけallocするのが好ましいのだけど…
- */
-
-typedef struct _splitpesbuf_t
-{
-	program_t *Program;
-	int64_t pts;
-	int64_t dts;
-    int size;
-    u_char buffer[3*1024*1024];
-} splitpesbuf_t;
-
-typedef struct _splitesbuf_t
-{
-	program_t *Program;
-	int64_t pts;
-	int64_t dts;
-	int started; /* 該当ESが蓄積開始しているか */
-	int random_access_indicator; /* TS の random_access_indicator */
-	int fd; /* 該当ESのfd */
-    int size;
-    u_char buffer[3*1024*1024];
-} splitesbuf_t;
-
-/* PCR 共有用構造体 */
-typedef struct _pcr_t
-{
-	int pid;
-	int sid_nb; /* PCRを参照しているServiceID(ProgramID)の数 */
-	int sid[MAX_SERVICES];
-} pcr_t;
-
+typedef struct pmt_version {
+  int pid;
+  int version;
+  int packet;
+} pmt_version;
 
 /**
  * splitter構造体
  */
 typedef struct splitter {
-	char *filename; /* ファイル名を上位からもらってくるためのポインタ */
-	char *arg_cue; /* 引数で取得してきた録画開始時刻(HHMISS) */
-	int esout; /* ES出力する? */
 	unsigned char	pids[MAX_PID];
 	unsigned char	pmt_pids[MAX_PID];
-	uint8_t			cat_pids[MAX_PID];
-	uint8_t			pcr_pids[MAX_PID]; /* PCRは複数ServiceID(ProgramID)で共有される */
-	pcr_t			pcr[MAX_SERVICES];
-	int				pcr_nb;
 	unsigned char*	pat;
 	char**			sid_list;
 	unsigned char	pat_count;
 	int pmt_retain;
 	int pmt_counter;
 	int avail_pmts[MAX_SERVICES];
+	pmt_version pmt_version[MAX_SERVICES];
 	int num_pmts;
-	splitpesbuf_t *pesbuf[MAX_PID];
-	splitesbuf_t *esbuf[MAX_PID];
-	program_t *program;
-	int pid_sid_table[MAX_PID]; /* pid to sid の変換を行うためのテーブル */
-	time_t time_cue;
-	time_t time_tot;
-	int tot_packet_nb; /* TOT受信時のパケット受信数 */
+	uint16_t section_remain[MAX_PID];	// セクション残りバイト数
+	uint8_t packet_seq[MAX_PID];	// 巡回カウンタ
+        int split_select_finish;
 	time_t split_start_time;
-	int split_select_finish;
 } splitter;
 
-/* b25 decoder would hoard up large chank */
 typedef struct _splitbuf_t
 {
-    int size;
-    int buffer_length;
-    u_char *buffer;
+	u_char* buffer;
+	int buffer_size;
+	int buffer_filled;
 } splitbuf_t;
 
-splitter* split_startup(char *sid, char *filename, char *cue_time);
+splitter* split_startup(char *sid);
 int split_select(splitter *sp, ARIB_STD_B25_BUFFER *sbuf);
 void split_shutdown(splitter *sp);
 int split_ts(splitter *splitter, ARIB_STD_B25_BUFFER *sbuf, splitbuf_t *dbuf);