comparison recpt1/tssplitter_lite.h @ 122:4009737ea899

add es output arg: add start_time arg:
author Naoya OYAMA <naoya.oyama@gmail.com>
date Wed, 05 May 2010 20:43:43 +0900
parents e915d31c5bd9
children
comparison
equal deleted inserted replaced
121:e915d31c5bd9 122:4009737ea899
117 #define MAX_VIDEO (16) 117 #define MAX_VIDEO (16)
118 #define MAX_AUDIO (32) 118 #define MAX_AUDIO (32)
119 typedef struct _program_t 119 typedef struct _program_t
120 { 120 {
121 int64_t stc; 121 int64_t stc;
122 int64_t cue_time; /* 録画開始時刻 */ 122 int64_t cue; /* 録画開始時刻 */
123 int pmt_packet_id; /* 該当Program(Service ID)に対応するPMT */ 123 int pmt_packet_id; /* 該当Program(Service ID)に対応するPMT */
124 int pmt_version; /* 該当Program(Service ID)に対応するPMTのVersion */ 124 int pmt_version; /* 該当Program(Service ID)に対応するPMTのVersion */
125 int pcr_packet_id; /* 該当Program(Service ID)のPCRを保持するPID */ 125 int pcr_packet_id; /* 該当Program(Service ID)のPCRを保持するPID */
126 int64_t pcr1; /* PCR1 */ 126 int64_t pcr1; /* PCR1 */
127 int64_t pcr2; /* PCR2 */ 127 int64_t pcr2; /* PCR2 */
128 int packet_nb; /* PCR計算用カウンタ */ 128 int pcr_packet_nb; /* 直前のPCRを受信したときのパケット数 */
129 int packet_nb; /* 直前のProgramの処理を実施したときのパケット数 */
129 int64_t pcr_incr; /* 該当Program(Service ID)に於いて、1つのTSパケットを処理した時に経過する(と想定する時間) */ 130 int64_t pcr_incr; /* 該当Program(Service ID)に於いて、1つのTSパケットを処理した時に経過する(と想定する時間) */
130 int video_start; /* VODEO0を蓄積開始している? */ 131 int video_start; /* VODEO0を蓄積開始している? */
131 int64_t video_pts; /* 最後に処理したVODEO0のESのPTS */ 132 int64_t video_pts; /* 最後に処理したVODEO0のESのPTS */
132 int video_nb; /* PMT に存在するビデオストリームの数 */ 133 int video_nb; /* PMT に存在するビデオストリームの数 */
133 int audio_nb; /* PMT に存在する音声ストリームの数 */ 134 int audio_nb; /* PMT に存在する音声ストリームの数 */
134 int video[MAX_VIDEO]; /* PS出力する場合に使うかも */ 135 int video[MAX_VIDEO]; /* PS出力する場合に使うかも */
135 int audio[MAX_AUDIO]; /* PS出力する場合に使うかも */ 136 int audio[MAX_AUDIO]; /* PS出力する場合に使うかも */
136 //splitpesbuf_t *pesbuf;
137 //splitesbuf_t *esbuf;
138 } program_t; 137 } program_t;
139 /* 138 /*
140 * program_t をサービスID分準備して、使用するイメージでいたけど、 139 * program_t をサービスID分準備して、使用するイメージでいたけど、
141 * サービスIDの最大値は0xFFFFであるので、静的に確保すると stack が簡単に溢るので、 140 * サービスIDの最大値は0xFFFFであるので、静的に確保すると stack が簡単に溢るので、
142 * 実行時に malloc とするかなぁ 141 * 実行時に malloc とするかなぁ
144 */ 143 */
145 144
146 typedef struct _splitpesbuf_t 145 typedef struct _splitpesbuf_t
147 { 146 {
148 program_t *Program; 147 program_t *Program;
149 int random_access_indicator; /* TS の random_access_indicator */
150 int64_t pts; 148 int64_t pts;
151 int64_t dts; 149 int64_t dts;
152 int size; 150 int size;
153 u_char buffer[3*1024*1024]; 151 u_char buffer[128*1024];
154 } splitpesbuf_t; 152 } splitpesbuf_t;
155 153
156 typedef struct _splitesbuf_t 154 typedef struct _splitesbuf_t
157 { 155 {
158 program_t *Program; 156 program_t *Program;
163 int fd; /* 該当ESのfd */ 161 int fd; /* 該当ESのfd */
164 int size; 162 int size;
165 u_char buffer[3*1024*1024]; 163 u_char buffer[3*1024*1024];
166 } splitesbuf_t; 164 } splitesbuf_t;
167 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
168 /** 175 /**
169 * splitter構造体 176 * splitter構造体
170 */ 177 */
171 typedef struct splitter { 178 typedef struct splitter {
179 char *filename; /* ファイル名を上位からもらってくるためのポインタ */
180 char *arg_cue; /* 引数で取得してきた録画開始時刻(HHMISS) */
181 int esout; /* ES出力する? */
172 unsigned char pids[MAX_PID]; 182 unsigned char pids[MAX_PID];
173 unsigned char pmt_pids[MAX_PID]; 183 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;
174 unsigned char* pat; 188 unsigned char* pat;
175 char** sid_list; 189 char** sid_list;
176 unsigned char pat_count; 190 unsigned char pat_count;
177 int pmt_retain; 191 int pmt_retain;
178 int pmt_counter; 192 int pmt_counter;
179 int avail_pmts[MAX_SERVICES]; 193 int avail_pmts[MAX_SERVICES];
180 int num_pmts; 194 int num_pmts;
181 // struct timespec tot_offset;
182 // struct timespec STC_timespec;
183 int64_t stc;
184 int64_t cue_time;
185 int status;
186 splitpesbuf_t *pesbuf[MAX_PID]; 195 splitpesbuf_t *pesbuf[MAX_PID];
187 splitesbuf_t *esbuf[MAX_PID]; 196 splitesbuf_t *esbuf[MAX_PID];
188 program_t *program; 197 program_t *program;
189 int pid_sid_table[MAX_PID]; /* pid to sid の変換を行うためのテーブル */ 198 int pid_sid_table[MAX_PID]; /* pid to sid の変換を行うためのテーブル */
190 char *filename; /* ファイル名を上位からもらってくるためのポインタ */ 199 time_t time_cue;
191 int esout; /* ES出力する? */ 200 time_t time_tot;
201 int tot_packet_nb; /* TOT受信時のパケット受信数 */
192 } splitter; 202 } splitter;
193 203
194 /* b25 decoder would hoard up large chank */ 204 /* b25 decoder would hoard up large chank */
195 typedef struct _splitbuf_t 205 typedef struct _splitbuf_t
196 { 206 {
197 int size; 207 int size;
198 u_char buffer[1024*1024]; 208 u_char buffer[1024*1024];
199 } splitbuf_t; 209 } splitbuf_t;
200 210
201 splitter* split_startup(char *sid, char *filename); 211 splitter* split_startup(char *sid, char *filename, char *cue_time);
202 int split_select(splitter *sp, ARIB_STD_B25_BUFFER *sbuf); 212 int split_select(splitter *sp, ARIB_STD_B25_BUFFER *sbuf);
203 void split_shutdown(splitter *sp); 213 void split_shutdown(splitter *sp);
204 int split_ts(splitter *splitter, ARIB_STD_B25_BUFFER *sbuf, splitbuf_t *dbuf); 214 int split_ts(splitter *splitter, ARIB_STD_B25_BUFFER *sbuf, splitbuf_t *dbuf);
205 215
206 #endif 216 #endif