comparison 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
comparison
equal deleted inserted replaced
182:13f0666bd088 183:27e5f99f8991
21 #define _TS_SPLITTER_LITE_H_ 21 #define _TS_SPLITTER_LITE_H_
22 22
23 #define __STDC_FORMAT_MACROS 23 #define __STDC_FORMAT_MACROS
24 #include <inttypes.h> 24 #include <inttypes.h>
25 #include <unistd.h> 25 #include <unistd.h>
26 #include <limits.h>
27 26
28 #define LENGTH_PACKET (188) 27 #define LENGTH_PACKET (188)
29 #define MAX_PID (8192) 28 #define MAX_PID (8192)
30 #define MAX_SERVICES (50) 29 #define MAX_SERVICES (50)
31 #define LENGTH_CRC_DATA (176) 30 #define LENGTH_CRC_DATA (176)
35 #define TSS_SUCCESS (0) 34 #define TSS_SUCCESS (0)
36 #define TSS_ERROR (-1) 35 #define TSS_ERROR (-1)
37 #define TSS_NULL (-2) 36 #define TSS_NULL (-2)
38 #define LENGTH_PAT_HEADER (12) 37 #define LENGTH_PAT_HEADER (12)
39 #define C_CHAR_COMMA ',' 38 #define C_CHAR_COMMA ','
40 #define C_CHAR_DOT '.' 39 #define SECTION_CONTINUE (1)
41 #define LENGTH_TS_HEADER (4)
42 #define LENGTH_PES_HEADER (9)
43 #define LENGTH_PTS (5)
44 40
45 /* 改訂版デジタル放送教科書(上) P101 表1 ARIBでのPSI/SIの種類より参照 */ 41 typedef struct pmt_version {
46 #define PAT (0x0000) 42 int pid;
47 //#define PMT /* PATによる間接指定 */ 43 int version;
48 #define CAT (0x0001) 44 int packet;
49 #define NIT (0x0010) 45 } pmt_version;
50 #define SDT (0x0011)
51 #define BAT (0x0011)
52 #define EIT (0x0012) /* 0x0026, 0x0027 */
53 #define RST (0x0013)
54 #define TDT (0x0014) /* 地デジでは使用されない */
55 #define TOT (0x0014)
56 #define LIT (0x0020) /* またはPMTによる間接指定 */
57 #define ERT (0x0021) /* またはPMTによる間接指定 */
58 //#define ITT /* PMTによる間接指定 */
59 #define PCAT (0x0022)
60 #define BIT (0x0024)
61 #define NBIT (0x0025)
62 //#define ECM /* PMTによる間接指定 */
63 //#define EMM /* CATによる間接指定 */
64 #define LDT (0x0025)
65 #define DCT (0x0017)
66 //#define DTL /* DCTによる間接指定 */
67 #define DIT (0x001e)
68 #define SIT (0x001f)
69 #define SDTT (0x0023)
70 #define CDT (0x0029)
71 //#define DSM-CC_Section /* PMTによる間接指定 */
72
73 /* セクションヘッダ長 */
74 /* TS パケットに各セクションを設置する際、該当TSパケットの残サイズが
75 * いくつ以上あれば書き込めるかの判定に使用する。
76 * デコードにはあまり重要では無いかも
77 */
78 #define SECTION_LENGTH_PAT (8)
79 #define SECTION_LENGTH_PMT (8)
80 #define SECTION_LENGTH_CAT (8)
81 #define SECTION_LENGTH_NIT (8)
82 #define SECTION_LENGTH_BIT (8)
83 #define SECTION_LENGTH_SDT (11)
84 #define SECTION_LENGTH_EIT (14) /* H-EIT, M-EIT, L-EIT を示す */
85 #define SECTION_LENGTH_SDTT (15)
86 #define SECTION_LENGTH_CDT (13)
87 #define SECTION_LENGTH_TOT (10)
88
89 enum {
90 PTS_FLAG = 0x80,
91 DTS_FLAG = 0x40,
92 ESCR_FLAG = 0x20,
93 ES_RATE_FLAG = 0x10,
94 DSM_TRICK_MODE_FLAG = 0x08,
95 COPY_INFO_FLAG = 0x04,
96 CRC_FLAG = 0x02,
97 EXTENSION_FLAG = 0x01
98 };
99
100 enum {
101 PES_PRIVATE_DATA_FLAG = 0x80,
102 PACK_HEADER_FIELD_FLAG = 0x40,
103 PROGRAM_PACKET_SEQUENCE_COUNTER = 0x20,
104 PSTD_BUFFER_FLAG = 0x10,
105 PES_EXTENSION_FLAG2 = 0x01
106 };
107
108 /*
109 * PCRからSTCを生成する処理方式
110 * 1. PCRを二つ取得するまでループ(1.から4.までは初期処理で実施すること)
111 * 2. ループ開始時刻(PCR)と、ループ抜けた時刻(PCR)の差分を取る
112 * 3. ループ開始〜終了の間に処理したパケット数を数える
113 * 4. (2.のPCRの進んだ時間/3.のパケット数) の計算によって、1パケットによって進むPCRを想定する
114 * 5. TS受信時に、1つのパケットを処理する度に4.の想定する経過時刻をPCRに足し込んでSTCとする
115 * 6. PCRを新規に取得したら、STCを補正(そのまま代入)する
116 */
117 #define MAX_VIDEO (16)
118 #define MAX_AUDIO (32)
119 typedef struct _program_t
120 {
121 int64_t stc;
122 int64_t cue; /* 録画開始時刻 */
123 int pmt_packet_id; /* 該当Program(Service ID)に対応するPMT */
124 int pmt_version; /* 該当Program(Service ID)に対応するPMTのVersion */
125 int pcr_packet_id; /* 該当Program(Service ID)のPCRを保持するPID */
126 int64_t pcr1; /* PCR1 */
127 int64_t pcr2; /* PCR2 */
128 int pcr_packet_nb; /* 直前のPCRを受信したときのパケット数 */
129 int packet_nb; /* 直前のProgramの処理を実施したときのパケット数 */
130 int64_t pcr_incr; /* 該当Program(Service ID)に於いて、1つのTSパケットを処理した時に経過する(と想定する時間) */
131 int video_start; /* VODEO0を蓄積開始している? */
132 int64_t video_pts; /* 最後に処理したVODEO0のESのPTS */
133 int video_nb; /* PMT に存在するビデオストリームの数 */
134 int audio_nb; /* PMT に存在する音声ストリームの数 */
135 int video[MAX_VIDEO]; /* PS出力する場合に使うかも */
136 int audio[MAX_AUDIO]; /* PS出力する場合に使うかも */
137 } program_t;
138 /*
139 * program_t をサービスID分準備して、使用するイメージでいたけど、
140 * サービスIDの最大値は0xFFFFであるので、静的に確保すると stack が簡単に溢るので、
141 * 実行時に malloc とするかなぁ
142 * 本当は必要なだけallocするのが好ましいのだけど…
143 */
144
145 typedef struct _splitpesbuf_t
146 {
147 program_t *Program;
148 int64_t pts;
149 int64_t dts;
150 int size;
151 u_char buffer[3*1024*1024];
152 } splitpesbuf_t;
153
154 typedef struct _splitesbuf_t
155 {
156 program_t *Program;
157 int64_t pts;
158 int64_t dts;
159 int started; /* 該当ESが蓄積開始しているか */
160 int random_access_indicator; /* TS の random_access_indicator */
161 int fd; /* 該当ESのfd */
162 int size;
163 u_char buffer[3*1024*1024];
164 } splitesbuf_t;
165
166 /* PCR 共有用構造体 */
167 typedef struct _pcr_t
168 {
169 int pid;
170 int sid_nb; /* PCRを参照しているServiceID(ProgramID)の数 */
171 int sid[MAX_SERVICES];
172 } pcr_t;
173
174 46
175 /** 47 /**
176 * splitter構造体 48 * splitter構造体
177 */ 49 */
178 typedef struct splitter { 50 typedef struct splitter {
179 char *filename; /* ファイル名を上位からもらってくるためのポインタ */
180 char *arg_cue; /* 引数で取得してきた録画開始時刻(HHMISS) */
181 int esout; /* ES出力する? */
182 unsigned char pids[MAX_PID]; 51 unsigned char pids[MAX_PID];
183 unsigned char pmt_pids[MAX_PID]; 52 unsigned char pmt_pids[MAX_PID];
184 uint8_t cat_pids[MAX_PID];
185 uint8_t pcr_pids[MAX_PID]; /* PCRは複数ServiceID(ProgramID)で共有される */
186 pcr_t pcr[MAX_SERVICES];
187 int pcr_nb;
188 unsigned char* pat; 53 unsigned char* pat;
189 char** sid_list; 54 char** sid_list;
190 unsigned char pat_count; 55 unsigned char pat_count;
191 int pmt_retain; 56 int pmt_retain;
192 int pmt_counter; 57 int pmt_counter;
193 int avail_pmts[MAX_SERVICES]; 58 int avail_pmts[MAX_SERVICES];
59 pmt_version pmt_version[MAX_SERVICES];
194 int num_pmts; 60 int num_pmts;
195 splitpesbuf_t *pesbuf[MAX_PID]; 61 uint16_t section_remain[MAX_PID]; // セクション残りバイト数
196 splitesbuf_t *esbuf[MAX_PID]; 62 uint8_t packet_seq[MAX_PID]; // 巡回カウンタ
197 program_t *program; 63 int split_select_finish;
198 int pid_sid_table[MAX_PID]; /* pid to sid の変換を行うためのテーブル */
199 time_t time_cue;
200 time_t time_tot;
201 int tot_packet_nb; /* TOT受信時のパケット受信数 */
202 time_t split_start_time; 64 time_t split_start_time;
203 int split_select_finish;
204 } splitter; 65 } splitter;
205 66
206 /* b25 decoder would hoard up large chank */
207 typedef struct _splitbuf_t 67 typedef struct _splitbuf_t
208 { 68 {
209 int size; 69 u_char* buffer;
210 int buffer_length; 70 int buffer_size;
211 u_char *buffer; 71 int buffer_filled;
212 } splitbuf_t; 72 } splitbuf_t;
213 73
214 splitter* split_startup(char *sid, char *filename, char *cue_time); 74 splitter* split_startup(char *sid);
215 int split_select(splitter *sp, ARIB_STD_B25_BUFFER *sbuf); 75 int split_select(splitter *sp, ARIB_STD_B25_BUFFER *sbuf);
216 void split_shutdown(splitter *sp); 76 void split_shutdown(splitter *sp);
217 int split_ts(splitter *splitter, ARIB_STD_B25_BUFFER *sbuf, splitbuf_t *dbuf); 77 int split_ts(splitter *splitter, ARIB_STD_B25_BUFFER *sbuf, splitbuf_t *dbuf);
218 78
219 #endif 79 #endif