5 #include "arib_std_b25.h"
6 #include "arib_std_b25_error_code.h"
8 #include "ts_common_types.h"
9 #include "ts_section_parser.h"
11 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
13 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
40 int32_t program_number
;
43 TS_SECTION_PARSER
*pmt
;
47 TS_STREAM_LIST streams
;
48 TS_STREAM_LIST old_strm
;
60 TS_SECTION_PARSER
*ecm
;
81 int64_t normal_packet
;
96 TS_SECTION_PARSER
*pat
;
97 TS_SECTION_PARSER
*cat
;
99 TS_STREAM_LIST strm_pool
;
104 DECRYPTOR_LIST decrypt
;
110 int32_t ca_system_id
;
113 TS_SECTION_PARSER
*emm
;
118 } ARIB_STD_B25_PRIVATE_DATA
;
122 int32_t associated_information_length
;
123 int32_t protocol_number
;
124 int32_t broadcaster_group_id
;
125 int32_t update_number
;
126 int32_t expiration_date
;
129 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
131 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
132 enum TS_STREAM_TYPE
{
133 TS_STREAM_TYPE_11172_2_VIDEO
= 0x01,
134 TS_STREAM_TYPE_13818_2_VIDEO
= 0x02,
135 TS_STREAM_TYPE_11172_3_AUDIO
= 0x03,
136 TS_STREAM_TYPE_13818_3_AUDIO
= 0x04,
137 TS_STREAM_TYPE_13818_1_PRIVATE_SECTIONS
= 0x05,
138 TS_STREAM_TYPE_13818_1_PES_PRIVATE_DATA
= 0x06,
139 TS_STREAM_TYPE_13522_MHEG
= 0x07,
140 TS_STREAM_TYPE_13818_1_DSM_CC
= 0x08,
141 TS_STREAM_TYPE_H_222_1
= 0x09,
142 TS_STREAM_TYPE_13818_6_TYPE_A
= 0x0a,
143 TS_STREAM_TYPE_13818_6_TYPE_B
= 0x0b,
144 TS_STREAM_TYPE_13818_6_TYPE_C
= 0x0c,
145 TS_STREAM_TYPE_13818_6_TYPE_D
= 0x0d,
146 TS_STREAM_TYPE_13818_1_AUX
= 0x0e,
147 TS_STREAM_TYPE_13818_7_AUDIO_ADTS
= 0x0f,
148 TS_STREAM_TYPE_14496_2_VISUAL
= 0x10,
149 TS_STREAM_TYPE_14496_3_AUDIO_LATM
= 0x11,
150 TS_STREAM_TYPE_14496_1_PES_SL_PACKET
= 0x12,
151 TS_STREAM_TYPE_14496_1_SECTIONS_SL_PACKET
= 0x13,
152 TS_STREAM_TYPE_13818_6_SYNC_DWLOAD_PROTCOL
= 0x14,
156 TS_SECTION_ID_PROGRAM_ASSOCIATION
= 0x00,
157 TS_SECTION_ID_CONDITIONAL_ACCESS
= 0x01,
158 TS_SECTION_ID_PROGRAM_MAP
= 0x02,
159 TS_SECTION_ID_DESCRIPTION
= 0x03,
160 TS_SECTION_ID_14496_SCENE_DESCRIPTION
= 0x04,
161 TS_SECTION_ID_14496_OBJECT_DESCRIPTION
= 0x05,
163 /* ARIB STD-B10 stuff */
164 TS_SECTION_ID_DSM_CC_HEAD
= 0x3a,
165 TS_SECTION_ID_DSM_CC_TAIL
= 0x3f,
166 TS_SECTION_ID_NIT_ACTUAL
= 0x40,
167 TS_SECTION_ID_NIT_OTHER
= 0x41,
168 TS_SECTION_ID_SDT_ACTUAL
= 0x42,
169 TS_SECTION_ID_SDT_OTHER
= 0x46,
170 TS_SECTION_ID_BAT
= 0x4a,
171 TS_SECTION_ID_EIT_ACTUAL_CURRENT
= 0x4e,
172 TS_SECTION_ID_EIT_OTHER_CURRENT
= 0x4f,
173 TS_SECTION_ID_EIT_ACTUAL_SCHEDULE_HEAD
= 0x50,
174 TS_SECTION_ID_EIT_ACTUAL_SCHEDULE_TAIL
= 0x5f,
175 TS_SECTION_ID_EIT_OTHER_SCHEDULE_HEAD
= 0x60,
176 TS_SECTION_ID_EIT_OTHER_SCHEDULE_TAIL
= 0x6f,
177 TS_SECTION_ID_TDT
= 0x70,
178 TS_SECTION_ID_RST
= 0x71,
179 TS_SECTION_ID_ST
= 0x72,
180 TS_SECTION_ID_TOT
= 0x73,
181 TS_SECTION_ID_AIT
= 0x74,
182 TS_SECTION_ID_DIT
= 0x7e,
183 TS_SECTION_ID_SIT
= 0x7f,
184 TS_SECTION_ID_ECM_S
= 0x82,
185 TS_SECTION_ID_ECM
= 0x83,
186 TS_SECTION_ID_EMM_S
= 0x84,
187 TS_SECTION_ID_EMM_MESSAGE
= 0x85,
188 TS_SECTION_ID_DCT
= 0xc0,
189 TS_SECTION_ID_DLT
= 0xc1,
190 TS_SECTION_ID_PCAT
= 0xc2,
191 TS_SECTION_ID_SDTT
= 0xc3,
192 TS_SECTION_ID_BIT
= 0xc4,
193 TS_SECTION_ID_NBIT_BODY
= 0xc5,
194 TS_SECTION_ID_NBIT_REFERENCE
= 0xc6,
195 TS_SECTION_ID_LDT
= 0xc7,
196 TS_SECTION_ID_CDT
= 0xc8,
197 TS_SECTION_ID_LIT
= 0xd0,
198 TS_SECTION_ID_ERT
= 0xd1,
199 TS_SECTION_ID_ITT
= 0xd2,
202 enum TS_DESCRIPTOR_TAG
{
203 TS_DESCRIPTOR_TAG_VIDEO_STREAM
= 0x02,
204 TS_DESCRIPTOR_TAG_AUDIO_STREAM
= 0x03,
205 TS_DESCRIPTOR_TAG_HIERARCHY
= 0x04,
206 TS_DESCRIPTOR_TAG_REGISTRATION
= 0x05,
207 TS_DESCRIPTOR_TAG_DATA_STREAM_ALIGNMENT
= 0x06,
208 TS_DESCRIPTOR_TAG_TARGET_BACKGROUND_GRID
= 0x07,
209 TS_DESCRIPTOR_TAG_VIDEO_WINDOW
= 0x08,
210 TS_DESCRIPTOR_TAG_CA
= 0x09,
211 TS_DESCRIPTOR_TAG_ISO_639_LANGUAGE
= 0x0a,
212 TS_DESCRIPTOR_TAG_SYSTEM_CLOCK
= 0x0b,
213 TS_DESCRIPTOR_TAG_MULTIPLEX_BUF_UTILIZ
= 0x0c,
214 TS_DESCRIPTOR_TAG_COPYRIGHT
= 0x0d,
215 TS_DESCRIPTOR_TAG_MAXIMUM_BITRATE
= 0x0e,
216 TS_DESCRIPTOR_TAG_PRIVATE_DATA_INDICATOR
= 0x0f,
217 TS_DESCRIPTOR_TAG_SMOOTHING_BUFFER
= 0x10,
218 TS_DESCRIPTOR_TAG_STD
= 0x11,
219 TS_DESCRIPTOR_TAG_IBP
= 0x12,
220 TS_DESCRIPTOR_TAG_MPEG4_VIDEO
= 0x1b,
221 TS_DESCRIPTOR_TAG_MPEG4_AUDIO
= 0x1c,
222 TS_DESCRIPTOR_TAG_IOD
= 0x1d,
223 TS_DESCRIPTOR_TAG_SL
= 0x1e,
224 TS_DESCRIPTOR_TAG_FMC
= 0x1f,
225 TS_DESCRIPTOR_TAG_EXTERNAL_ES_ID
= 0x20,
226 TS_DESCRIPTOR_TAG_MUXCODE
= 0x21,
227 TS_DESCRIPTOR_TAG_FMX_BUFFER_SIZE
= 0x22,
228 TS_DESCRIPTOR_TAG_MULTIPLEX_BUFFER
= 0x23,
229 TS_DESCRIPTOR_TAG_AVC_VIDEO
= 0x28,
230 TS_DESCRIPTOR_TAG_AVC_TIMING_HRD
= 0x2a,
232 /* ARIB STD-B10 stuff */
233 TS_DESCRIPTOR_TAG_NETWORK_NAME
= 0x40,
234 TS_DESCRIPTOR_TAG_SERVICE_LIST
= 0x41,
235 TS_DESCRIPTOR_TAG_STUFFING
= 0x42,
236 TS_DESCRIPTOR_TAG_SATELLITE_DELIVERY_SYS
= 0x43,
237 TS_DESCRIPTOR_TAG_CABLE_DISTRIBUTION
= 0x44,
238 TS_DESCRIPTOR_TAG_BOUNQUET_NAME
= 0x47,
239 TS_DESCRIPTOR_TAG_SERVICE
= 0x48,
240 TS_DESCRIPTOR_TAG_COUNTRY_AVAILABILITY
= 0x49,
241 TS_DESCRIPTOR_TAG_LINKAGE
= 0x4a,
242 TS_DESCRIPTOR_TAG_NVOD_REFERENCE
= 0x4b,
243 TS_DESCRIPTOR_TAG_TIME_SHIFTED_SERVICE
= 0x4c,
244 TS_DESCRIPTOR_TAG_SHORT_EVENT
= 0x4d,
245 TS_DESCRIPTOR_TAG_EXTENDED_EVENT
= 0x4e,
246 TS_DESCRIPTOR_TAG_TIME_SHIFTED_EVENT
= 0x4f,
247 TS_DESCRIPTOR_TAG_COMPONENT
= 0x50,
248 TS_DESCRIPTOR_TAG_MOSAIC
= 0x51,
249 TS_DESCRIPTOR_TAG_STREAM_IDENTIFIER
= 0x52,
250 TS_DESCRIPTOR_TAG_CA_IDENTIFIER
= 0x53,
251 TS_DESCRIPTOR_TAG_CONTENT
= 0x54,
252 TS_DESCRIPTOR_TAG_PARENTAL_RATING
= 0x55,
253 TS_DESCRIPTOR_TAG_LOCAL_TIME_OFFSET
= 0x58,
254 TS_DESCRIPTOR_TAG_PARTIAL_TRANSPORT_STREAM
= 0x63,
255 TS_DESCRIPTOR_TAG_HIERARCHICAL_TRANSMISSION
= 0xc0,
256 TS_DESCRIPTOR_TAG_DIGITAL_COPY_CONTROL
= 0xc1,
257 TS_DESCRIPTOR_TAG_NETWORK_IDENTIFICATION
= 0xc2,
258 TS_DESCRIPTOR_TAG_PARTIAL_TRANSPORT_TIME
= 0xc3,
259 TS_DESCRIPTOR_TAG_AUDIO_COMPONENT
= 0xc4,
260 TS_DESCRIPTOR_TAG_HYPERLINK
= 0xc5,
261 TS_DESCRIPTOR_TAG_TARGET_REGION
= 0xc6,
262 TS_DESCRIPTOR_TAG_DATA_COTENT
= 0xc7,
263 TS_DESCRIPTOR_TAG_VIDEO_DECODE_CONTROL
= 0xc8,
264 TS_DESCRIPTOR_TAG_DOWNLOAD_CONTENT
= 0xc9,
265 TS_DESCRIPTOR_TAG_CA_EMM_TS
= 0xca,
266 TS_DESCRIPTOR_TAG_CA_CONTRACT_INFORMATION
= 0xcb,
267 TS_DESCRIPTOR_TAG_CA_SERVICE
= 0xcc,
268 TS_DESCRIPTOR_TAG_TS_INFORMATION
= 0xcd,
269 TS_DESCRIPTOR_TAG_EXTENDED_BROADCASTER
= 0xce,
270 TS_DESCRIPTOR_TAG_LOGO_TRANSMISSION
= 0xcf,
271 TS_DESCRIPTOR_TAG_BASIC_LOCAL_EVENT
= 0xd0,
272 TS_DESCRIPTOR_TAG_REFERENCE
= 0xd1,
273 TS_DESCRIPTOR_TAG_NODE_RELATION
= 0xd2,
274 TS_DESCRIPTOR_TAG_SHORT_NODE_INFORMATION
= 0xd3,
275 TS_DESCRIPTOR_TAG_STC_REFERENCE
= 0xd4,
276 TS_DESCRIPTOR_TAG_SERIES
= 0xd5,
277 TS_DESCRIPTOR_TAG_EVENT_GROUP
= 0xd6,
278 TS_DESCRIPTOR_TAG_SI_PARAMETER
= 0xd7,
279 TS_DESCRIPTOR_TAG_BROADCASTER_NAME
= 0xd8,
280 TS_DESCRIPTOR_TAG_COMPONENT_GROUP
= 0xd9,
281 TS_DESCRIPTOR_TAG_SI_PRIME_TS
= 0xda,
282 TS_DESCRIPTOR_TAG_BOARD_INFORMATION
= 0xdb,
283 TS_DESCRIPTOR_TAG_LDT_LINKAGE
= 0xdc,
284 TS_DESCRIPTOR_TAG_CONNECTED_TRANSMISSION
= 0xdd,
285 TS_DESCRIPTOR_TAG_CONTENT_AVAILABILITY
= 0xde,
286 TS_DESCRIPTOR_TAG_VALUE_EXTENSION
= 0xdf,
287 TS_DESCRIPTOR_TAG_SERVICE_GROUP
= 0xe0,
288 TS_DESCRIPTOR_TAG_CARUSEL_COMPOSITE
= 0xf7,
289 TS_DESCRIPTOR_TAG_CONDITIONAL_PLAYBACK
= 0xf8,
290 TS_DESCRIPTOR_TAG_CABLE_TS_DIVISSION
= 0xf9,
291 TS_DESCRIPTOR_TAG_TERRESTRIAL_DELIVERY_SYS
= 0xfa,
292 TS_DESCRIPTOR_TAG_PARTIAL_RECEPTION
= 0xfb,
293 TS_DESCRIPTOR_TAG_EMERGENCY_INFOMATION
= 0xfc,
294 TS_DESCRIPTOR_TAG_DATA_COMPONENT
= 0xfd,
295 TS_DESCRIPTOR_TAG_SYSTEM_MANAGEMENT
= 0xfe,
299 PID_MAP_TYPE_UNKNOWN
= 0x0000,
300 PID_MAP_TYPE_PAT
= 0x0100,
301 PID_MAP_TYPE_PMT
= 0x0200,
302 PID_MAP_TYPE_NIT
= 0x0300,
303 PID_MAP_TYPE_PCR
= 0x0400,
304 PID_MAP_TYPE_ECM
= 0x0500,
305 PID_MAP_TYPE_EMM
= 0x0600,
306 PID_MAP_TYPE_EIT
= 0x0700,
307 PID_MAP_TYPE_CAT
= 0x0800,
308 PID_MAP_TYPE_OTHER
= 0xff00,
311 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
312 function prottypes (interface method)
313 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
314 static void release_arib_std_b25(void *std_b25
);
315 static int set_multi2_round_arib_std_b25(void *std_b25
, int32_t round
);
316 static int set_strip_arib_std_b25(void *std_b25
, int32_t strip
);
317 static int set_emm_proc_arib_std_b25(void *std_b25
, int32_t on
);
318 static int set_b_cas_card_arib_std_b25(void *std_b25
, B_CAS_CARD
*bcas
);
319 static int reset_arib_std_b25(void *std_b25
);
320 static int flush_arib_std_b25(void *std_b25
);
321 static int put_arib_std_b25(void *std_b25
, ARIB_STD_B25_BUFFER
*buf
);
322 static int get_arib_std_b25(void *std_b25
, ARIB_STD_B25_BUFFER
*buf
);
323 static int get_program_count_arib_std_b25(void *std_b25
);
324 static int get_program_info_arib_std_b25(void *std_b25
, ARIB_STD_B25_PROGRAM_INFO
*info
, int idx
);
326 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
327 global function implementation
328 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
329 ARIB_STD_B25
*create_arib_std_b25()
334 ARIB_STD_B25_PRIVATE_DATA
*prv
;
336 n
= sizeof(ARIB_STD_B25_PRIVATE_DATA
);
337 n
+= sizeof(ARIB_STD_B25
);
339 prv
= (ARIB_STD_B25_PRIVATE_DATA
*)calloc(1, n
);
344 prv
->multi2_round
= 4;
346 r
= (ARIB_STD_B25
*)(prv
+1);
347 r
->private_data
= prv
;
349 r
->release
= release_arib_std_b25
;
350 r
->set_multi2_round
= set_multi2_round_arib_std_b25
;
351 r
->set_strip
= set_strip_arib_std_b25
;
352 r
->set_emm_proc
= set_emm_proc_arib_std_b25
;
353 r
->set_b_cas_card
= set_b_cas_card_arib_std_b25
;
354 r
->reset
= reset_arib_std_b25
;
355 r
->flush
= flush_arib_std_b25
;
356 r
->put
= put_arib_std_b25
;
357 r
->get
= get_arib_std_b25
;
358 r
->get_program_count
= get_program_count_arib_std_b25
;
359 r
->get_program_info
= get_program_info_arib_std_b25
;
364 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
365 function prottypes (private method)
366 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
367 static ARIB_STD_B25_PRIVATE_DATA
*private_data(void *std_b25
);
368 static void teardown(ARIB_STD_B25_PRIVATE_DATA
*prv
);
369 static int select_unit_size(ARIB_STD_B25_PRIVATE_DATA
*prv
);
370 static int find_pat(ARIB_STD_B25_PRIVATE_DATA
*prv
);
371 static int proc_pat(ARIB_STD_B25_PRIVATE_DATA
*prv
);
372 static int check_pmt_complete(ARIB_STD_B25_PRIVATE_DATA
*prv
);
373 static int find_pmt(ARIB_STD_B25_PRIVATE_DATA
*prv
);
374 static int proc_pmt(ARIB_STD_B25_PRIVATE_DATA
*prv
, TS_PROGRAM
*pgrm
);
375 static int32_t find_ca_descriptor_pid(uint8_t *head
, uint8_t *tail
, int32_t ca_system_id
);
376 static int32_t add_ecm_stream(ARIB_STD_B25_PRIVATE_DATA
*prv
, TS_STREAM_LIST
*list
, int32_t ecm_pid
);
377 static int check_ecm_complete(ARIB_STD_B25_PRIVATE_DATA
*prv
);
378 static int find_ecm(ARIB_STD_B25_PRIVATE_DATA
*prv
);
379 static int proc_ecm(DECRYPTOR_ELEM
*dec
, B_CAS_CARD
*bcas
, int32_t multi2_round
);
380 static int proc_arib_std_b25(ARIB_STD_B25_PRIVATE_DATA
*prv
);
382 static int proc_cat(ARIB_STD_B25_PRIVATE_DATA
*prv
);
383 static int proc_emm(ARIB_STD_B25_PRIVATE_DATA
*prv
);
385 static void release_program(ARIB_STD_B25_PRIVATE_DATA
*prv
, TS_PROGRAM
*pgrm
);
387 static void unref_stream(ARIB_STD_B25_PRIVATE_DATA
*prv
, int32_t pid
);
389 static DECRYPTOR_ELEM
*set_decryptor(ARIB_STD_B25_PRIVATE_DATA
*prv
, int32_t pid
);
390 static void remove_decryptor(ARIB_STD_B25_PRIVATE_DATA
*prv
, DECRYPTOR_ELEM
*dec
);
391 static DECRYPTOR_ELEM
*select_active_decryptor(DECRYPTOR_ELEM
*a
, DECRYPTOR_ELEM
*b
, int32_t pid
);
392 static void bind_stream_decryptor(ARIB_STD_B25_PRIVATE_DATA
*prv
, int32_t pid
, DECRYPTOR_ELEM
*dec
);
393 static void unlock_all_decryptor(ARIB_STD_B25_PRIVATE_DATA
*prv
);
395 static TS_STREAM_ELEM
*get_stream_list_head(TS_STREAM_LIST
*list
);
396 static TS_STREAM_ELEM
*find_stream_list_elem(TS_STREAM_LIST
*list
, int32_t pid
);
397 static TS_STREAM_ELEM
*create_stream_elem(int32_t pid
, int32_t type
);
398 static void put_stream_list_tail(TS_STREAM_LIST
*list
, TS_STREAM_ELEM
*elem
);
399 static void clear_stream_list(TS_STREAM_LIST
*list
);
401 static int reserve_work_buffer(TS_WORK_BUFFER
*buf
, int32_t size
);
402 static int append_work_buffer(TS_WORK_BUFFER
*buf
, uint8_t *data
, int32_t size
);
403 static void reset_work_buffer(TS_WORK_BUFFER
*buf
);
404 static void release_work_buffer(TS_WORK_BUFFER
*buf
);
406 static void extract_ts_header(TS_HEADER
*dst
, uint8_t *src
);
407 static void extract_emm_fixed_part(EMM_FIXED_PART
*dst
, uint8_t *src
);
409 static uint8_t *resync(uint8_t *head
, uint8_t *tail
, int32_t unit
);
410 static uint8_t *resync_force(uint8_t *head
, uint8_t *tail
, int32_t unit
);
412 /* static uint32_t crc32(uint8_t *head, uint8_t *tail); */
414 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
415 interface method implementation
416 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
417 static void release_arib_std_b25(void *std_b25
)
419 ARIB_STD_B25_PRIVATE_DATA
*prv
;
421 prv
= private_data(std_b25
);
430 static int set_multi2_round_arib_std_b25(void *std_b25
, int32_t round
)
432 ARIB_STD_B25_PRIVATE_DATA
*prv
;
434 prv
= private_data(std_b25
);
436 return ARIB_STD_B25_ERROR_INVALID_PARAM
;
439 prv
->multi2_round
= round
;
444 static int set_strip_arib_std_b25(void *std_b25
, int32_t strip
)
446 ARIB_STD_B25_PRIVATE_DATA
*prv
;
448 prv
= private_data(std_b25
);
450 return ARIB_STD_B25_ERROR_INVALID_PARAM
;
458 static int set_emm_proc_arib_std_b25(void *std_b25
, int32_t on
)
460 ARIB_STD_B25_PRIVATE_DATA
*prv
;
462 prv
= private_data(std_b25
);
464 return ARIB_STD_B25_ERROR_INVALID_PARAM
;
467 prv
->emm_proc_on
= on
;
472 static int set_b_cas_card_arib_std_b25(void *std_b25
, B_CAS_CARD
*bcas
)
475 B_CAS_INIT_STATUS is
;
476 ARIB_STD_B25_PRIVATE_DATA
*prv
;
478 prv
= private_data(std_b25
);
480 return ARIB_STD_B25_ERROR_INVALID_PARAM
;
484 if(prv
->bcas
!= NULL
){
485 n
= prv
->bcas
->get_init_status(bcas
, &is
);
487 return ARIB_STD_B25_ERROR_INVALID_B_CAS_STATUS
;
489 prv
->ca_system_id
= is
.ca_system_id
;
490 n
= prv
->bcas
->get_id(prv
->bcas
, &(prv
->casid
));
492 return ARIB_STD_B25_ERROR_INVALID_B_CAS_STATUS
;
499 static int reset_arib_std_b25(void *std_b25
)
501 ARIB_STD_B25_PRIVATE_DATA
*prv
;
503 prv
= private_data(std_b25
);
505 return ARIB_STD_B25_ERROR_INVALID_PARAM
;
513 static int flush_arib_std_b25(void *std_b25
)
530 ARIB_STD_B25_PRIVATE_DATA
*prv
;
532 prv
= private_data(std_b25
);
534 return ARIB_STD_B25_ERROR_INVALID_PARAM
;
537 if(prv
->unit_size
< 188){
538 r
= select_unit_size(prv
);
544 r
= proc_arib_std_b25(prv
);
549 unit
= prv
->unit_size
;
550 curr
= prv
->sbuf
.head
;
551 tail
= prv
->sbuf
.tail
;
553 m
= prv
->dbuf
.tail
- prv
->dbuf
.head
;
555 if(!reserve_work_buffer(&(prv
->dbuf
), m
+n
)){
556 return ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
561 while( (curr
+188) <= tail
){
564 p
= resync_force(curr
, tail
, unit
);
571 extract_ts_header(&hdr
, curr
);
572 crypt
= hdr
.transport_scrambling_control
;
575 if(hdr
.transport_error_indicator
!= 0){
576 /* bit error - append output buffer without parsing */
577 if(!append_work_buffer(&(prv
->dbuf
), curr
, 188)){
578 r
= ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
584 if( (pid
== 0x1fff) && (prv
->strip
) ){
589 if(hdr
.adaptation_field_control
& 0x02){
593 if( (n
< 1) && ((n
< 0) || (hdr
.adaptation_field_control
& 0x01)) ){
600 (hdr
.adaptation_field_control
& 0x01) ){
602 if(prv
->map
[pid
].type
== PID_MAP_TYPE_OTHER
){
603 dec
= (DECRYPTOR_ELEM
*)(prv
->map
[pid
].target
);
604 }else if( (prv
->map
[pid
].type
== 0) &&
605 (prv
->decrypt
.count
== 1) ){
606 dec
= prv
->decrypt
.head
;
611 if( (dec
!= NULL
) && (dec
->m2
!= NULL
) ){
612 m
= dec
->m2
->decrypt(dec
->m2
, crypt
, p
, n
);
614 r
= ARIB_STD_B25_ERROR_DECRYPT_FAILURE
;
618 prv
->map
[pid
].normal_packet
+= 1;
620 prv
->map
[pid
].undecrypted
+= 1;
623 prv
->map
[pid
].normal_packet
+= 1;
626 if(!append_work_buffer(&(prv
->dbuf
), curr
, 188)){
627 r
= ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
631 if(prv
->map
[pid
].type
== PID_MAP_TYPE_ECM
){
632 dec
= (DECRYPTOR_ELEM
*)(prv
->map
[pid
].target
);
633 if( (dec
== NULL
) || (dec
->ecm
== NULL
) ){
634 /* this code will never execute */
635 r
= ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE
;
638 m
= dec
->ecm
->put(dec
->ecm
, &hdr
, p
, n
);
640 r
= ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE
;
643 m
= dec
->ecm
->get_count(dec
->ecm
);
645 r
= ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE
;
651 r
= proc_ecm(dec
, prv
->bcas
, prv
->multi2_round
);
655 }else if(prv
->map
[pid
].type
== PID_MAP_TYPE_PMT
){
656 pgrm
= (TS_PROGRAM
*)(prv
->map
[pid
].target
);
657 if( (pgrm
== NULL
) || (pgrm
->pmt
== NULL
) ){
658 /* this code will never execute */
659 r
= ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE
;
662 m
= pgrm
->pmt
->put(pgrm
->pmt
, &hdr
, p
, n
);
664 r
= ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE
;
667 m
= pgrm
->pmt
->get_count(pgrm
->pmt
);
669 r
= ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE
;
675 r
= proc_pmt(prv
, pgrm
);
679 }else if(prv
->map
[pid
].type
== PID_MAP_TYPE_EMM
){
680 if( prv
->emm_proc_on
== 0){
683 if( prv
->emm
== NULL
){
684 prv
->emm
= create_ts_section_parser();
685 if(prv
->emm
== NULL
){
686 r
= ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE
;
690 m
= prv
->emm
->put(prv
->emm
, &hdr
, p
, n
);
692 r
= ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE
;
695 m
= prv
->emm
->get_count(prv
->emm
);
697 r
= ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE
;
707 }else if(pid
== 0x0001){
708 if( prv
->cat
== NULL
){
709 prv
->cat
= create_ts_section_parser();
710 if(prv
->cat
== NULL
){
711 r
= ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
715 m
= prv
->cat
->put(prv
->cat
, &hdr
, p
, n
);
717 r
= ARIB_STD_B25_ERROR_CAT_PARSE_FAILURE
;
720 m
= prv
->cat
->get_count(prv
->cat
);
722 r
= ARIB_STD_B25_ERROR_CAT_PARSE_FAILURE
;
732 }else if(pid
== 0x0000){
733 if( prv
->pat
== NULL
){
734 prv
->pat
= create_ts_section_parser();
735 if(prv
->pat
== NULL
){
736 r
= ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
740 m
= prv
->pat
->put(prv
->pat
, &hdr
, p
, n
);
742 r
= ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE
;
745 m
= prv
->pat
->get_count(prv
->pat
);
747 r
= ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE
;
765 m
= curr
- prv
->sbuf
.head
;
767 if( (n
< 1024) || (m
> (prv
->sbuf
.max
/2) ) ){
771 prv
->sbuf
.tail
= p
+n
;
773 prv
->sbuf
.head
= curr
;
779 static int put_arib_std_b25(void *std_b25
, ARIB_STD_B25_BUFFER
*buf
)
783 ARIB_STD_B25_PRIVATE_DATA
*prv
;
785 prv
= private_data(std_b25
);
786 if( (prv
== NULL
) || (buf
== NULL
) ){
787 return ARIB_STD_B25_ERROR_INVALID_PARAM
;
790 if(!append_work_buffer(&(prv
->sbuf
), buf
->data
, buf
->size
)){
791 return ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
794 if(prv
->unit_size
< 188){
795 n
= select_unit_size(prv
);
799 if(prv
->unit_size
< 188){
805 if(prv
->p_count
< 1){
810 if(prv
->p_count
< 1){
811 if(prv
->sbuf_offset
< (16*1024*1024)){
815 /* exceed sbuf limit */
816 return ARIB_STD_B25_ERROR_NO_PAT_IN_HEAD_16M
;
819 prv
->sbuf_offset
= 0;
822 if(!check_pmt_complete(prv
)){
827 if(!check_pmt_complete(prv
)){
828 if(prv
->sbuf_offset
< (32*1024*1024)){
832 /* exceed sbuf limit */
833 return ARIB_STD_B25_ERROR_NO_PMT_IN_HEAD_32M
;
836 prv
->sbuf_offset
= 0;
839 if(!check_ecm_complete(prv
)){
844 if(!check_ecm_complete(prv
)){
845 if(prv
->sbuf_offset
< (32*1024*1024)){
849 /* exceed sbuf limit */
850 return ARIB_STD_B25_ERROR_NO_ECM_IN_HEAD_32M
;
853 prv
->sbuf_offset
= 0;
856 return proc_arib_std_b25(prv
);
859 static int get_arib_std_b25(void *std_b25
, ARIB_STD_B25_BUFFER
*buf
)
861 ARIB_STD_B25_PRIVATE_DATA
*prv
;
862 prv
= private_data(std_b25
);
863 if( (prv
== NULL
) || (buf
== NULL
) ){
864 return ARIB_STD_B25_ERROR_INVALID_PARAM
;
867 buf
->data
= prv
->dbuf
.head
;
868 buf
->size
= prv
->dbuf
.tail
- prv
->dbuf
.head
;
870 reset_work_buffer(&(prv
->dbuf
));
875 static int get_program_count_arib_std_b25(void *std_b25
)
877 ARIB_STD_B25_PRIVATE_DATA
*prv
;
879 prv
= private_data(std_b25
);
881 return ARIB_STD_B25_ERROR_INVALID_PARAM
;
887 static int get_program_info_arib_std_b25(void *std_b25
, ARIB_STD_B25_PROGRAM_INFO
*info
, int idx
)
889 ARIB_STD_B25_PRIVATE_DATA
*prv
;
893 TS_STREAM_ELEM
*strm
;
898 prv
= private_data(std_b25
);
899 if( (prv
== NULL
) || (info
== NULL
) || (idx
< 0) || (idx
>= prv
->p_count
) ){
900 return ARIB_STD_B25_ERROR_INVALID_PARAM
;
903 pgrm
= prv
->program
+ idx
;
905 memset(info
, 0, sizeof(ARIB_STD_B25_PROGRAM_INFO
));
907 info
->program_number
= pgrm
->program_number
;
910 info
->total_packet_count
+= prv
->map
[pid
].normal_packet
;
911 info
->total_packet_count
+= prv
->map
[pid
].undecrypted
;
912 info
->undecrypted_packet_count
+= prv
->map
[pid
].undecrypted
;
915 if( (pid
!= 0) && (pid
!= 0x1fff) ){
916 info
->total_packet_count
+= prv
->map
[pid
].normal_packet
;
917 info
->total_packet_count
+= prv
->map
[pid
].undecrypted
;
918 info
->undecrypted_packet_count
+= prv
->map
[pid
].undecrypted
;
921 strm
= pgrm
->streams
.head
;
924 if(prv
->map
[pid
].type
== PID_MAP_TYPE_ECM
){
925 dec
= (DECRYPTOR_ELEM
*)(prv
->map
[pid
].target
);
926 info
->ecm_unpurchased_count
+= dec
->unpurchased
;
927 info
->last_ecm_error_code
= dec
->last_error
;
929 info
->total_packet_count
+= prv
->map
[pid
].normal_packet
;
930 info
->total_packet_count
+= prv
->map
[pid
].undecrypted
;
931 info
->undecrypted_packet_count
+= prv
->map
[pid
].undecrypted
;
932 strm
= (TS_STREAM_ELEM
*)(strm
->next
);
938 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
939 private method implementation
940 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
941 static ARIB_STD_B25_PRIVATE_DATA
*private_data(void *std_b25
)
944 ARIB_STD_B25_PRIVATE_DATA
*r
;
946 p
= (ARIB_STD_B25
*)std_b25
;
951 r
= (ARIB_STD_B25_PRIVATE_DATA
*)p
->private_data
;
952 if( ((void *)(r
+1)) != ((void *)p
) ){
959 static void teardown(ARIB_STD_B25_PRIVATE_DATA
*prv
)
964 prv
->sbuf_offset
= 0;
966 if(prv
->pat
!= NULL
){
967 prv
->pat
->release(prv
->pat
);
970 if(prv
->cat
!= NULL
){
971 prv
->cat
->release(prv
->cat
);
975 if(prv
->program
!= NULL
){
976 for(i
=0;i
<prv
->p_count
;i
++){
977 release_program(prv
, prv
->program
+i
);
984 clear_stream_list(&(prv
->strm_pool
));
986 while(prv
->decrypt
.head
!= NULL
){
987 remove_decryptor(prv
, prv
->decrypt
.head
);
990 memset(prv
->map
, 0, sizeof(prv
->map
));
993 if(prv
->emm
!= NULL
){
994 prv
->emm
->release(prv
->emm
);
998 release_work_buffer(&(prv
->sbuf
));
999 release_work_buffer(&(prv
->dbuf
));
1002 static int select_unit_size(ARIB_STD_B25_PRIVATE_DATA
*prv
)
1008 unsigned char *head
;
1010 unsigned char *tail
;
1012 head
= prv
->sbuf
.head
;
1013 tail
= prv
->sbuf
.tail
;
1016 memset(count
, 0, sizeof(count
));
1018 // 1st step, count up 0x47 interval
1019 while( (buf
+188) < tail
){
1036 // 2nd step, select maximum appeared interval
1039 for(i
=188;i
<320;i
++){
1040 if(m
< count
[i
-188]){
1046 // 3rd step, verify unit_size
1048 if( (m
< 8) || ((w
+3*n
) < (tail
-head
)) ){
1049 return ARIB_STD_B25_ERROR_NON_TS_INPUT_STREAM
;
1057 static int find_pat(ARIB_STD_B25_PRIVATE_DATA
*prv
)
1071 unit
= prv
->unit_size
;
1072 curr
= prv
->sbuf
.head
+ prv
->sbuf_offset
;
1073 tail
= prv
->sbuf
.tail
;
1075 while( (curr
+unit
) < tail
){
1076 if( (curr
[0] != 0x47) || (curr
[unit
] != 0x47) ){
1077 p
= resync(curr
, tail
, unit
);
1083 extract_ts_header(&hdr
, curr
);
1084 if(hdr
.pid
== 0x0000){
1087 if(hdr
.adaptation_field_control
& 0x02){
1090 size
= 188 - (p
-curr
);
1095 if(prv
->pat
== NULL
){
1096 prv
->pat
= create_ts_section_parser();
1097 if(prv
->pat
== NULL
){
1098 return ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
1102 n
= prv
->pat
->put(prv
->pat
, &hdr
, p
, size
);
1104 r
= ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE
;
1108 n
= prv
->pat
->get_count(prv
->pat
);
1110 r
= ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE
;
1124 prv
->sbuf_offset
= curr
- prv
->sbuf
.head
;
1126 if( (prv
->pat
!= NULL
) && (prv
->pat
->get_count(prv
->pat
) > 0) ){
1133 static int proc_pat(ARIB_STD_B25_PRIVATE_DATA
*prv
)
1140 int32_t program_number
;
1150 memset(§
, 0, sizeof(sect
));
1152 n
= prv
->pat
->get(prv
->pat
, §
);
1154 r
= ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE
;
1158 if(sect
.hdr
.table_id
!= TS_SECTION_ID_PROGRAM_ASSOCIATION
){
1159 r
= ARIB_STD_B25_WARN_TS_SECTION_ID_MISSMATCH
;
1163 len
= (sect
.tail
- sect
.data
) - 4;
1166 work
= (TS_PROGRAM
*)calloc(count
, sizeof(TS_PROGRAM
));
1168 r
= ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
1172 if(prv
->program
!= NULL
){
1173 for(i
=0;i
<prv
->p_count
;i
++){
1174 release_program(prv
, prv
->program
+i
);
1177 prv
->program
= NULL
;
1180 memset(&(prv
->map
), 0, sizeof(prv
->map
));
1186 while( (head
+4) <= tail
){
1187 program_number
= ((head
[0] << 8) | head
[1]);
1188 pid
= ((head
[2] << 8) | head
[3]) & 0x1fff;
1189 if(program_number
!= 0){
1190 work
[i
].program_number
= program_number
;
1191 work
[i
].pmt_pid
= pid
;
1192 work
[i
].pmt
= create_ts_section_parser();
1193 if(work
[i
].pmt
== NULL
){
1194 r
= ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
1197 prv
->map
[pid
].type
= PID_MAP_TYPE_PMT
;
1198 prv
->map
[pid
].target
= work
+i
;
1204 prv
->program
= work
;
1207 prv
->map
[0x0000].ref
= 1;
1208 prv
->map
[0x0000].type
= PID_MAP_TYPE_PAT
;
1209 prv
->map
[0x0000].target
= NULL
;
1212 if(sect
.raw
!= NULL
){
1213 n
= prv
->pat
->ret(prv
->pat
, §
);
1214 if( (n
< 0) && (r
== 0) ){
1215 r
= ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE
;
1222 static int check_pmt_complete(ARIB_STD_B25_PRIVATE_DATA
*prv
)
1227 memset(num
, 0, sizeof(num
));
1229 for(i
=0;i
<prv
->p_count
;i
++){
1230 n
= prv
->program
[i
].phase
;
1250 static int find_pmt(ARIB_STD_B25_PRIVATE_DATA
*prv
)
1265 unit
= prv
->unit_size
;
1266 curr
= prv
->sbuf
.head
+ prv
->sbuf_offset
;
1267 tail
= prv
->sbuf
.tail
;
1269 while( (curr
+unit
) < tail
){
1271 if( (curr
[0] != 0x47) || (curr
[unit
] != 0x47) ){
1272 p
= resync(curr
, tail
, unit
);
1279 extract_ts_header(&hdr
, curr
);
1281 if(prv
->map
[hdr
.pid
].type
!= PID_MAP_TYPE_PMT
){
1284 pgrm
= (TS_PROGRAM
*)(prv
->map
[hdr
.pid
].target
);
1289 if(pgrm
->phase
== 0){
1292 if(hdr
.adaptation_field_control
& 0x02){
1295 size
= 188 - (p
-curr
);
1300 if(pgrm
->pmt
== NULL
){
1301 /* this code will never execute */
1302 r
= ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE
;
1307 n
= pgrm
->pmt
->put(pgrm
->pmt
, &hdr
, p
, size
);
1309 r
= ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE
;
1313 n
= pgrm
->pmt
->get_count(pgrm
->pmt
);
1315 r
=ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE
;
1322 r
= proc_pmt(prv
, pgrm
);
1328 /* broken or unexpected section data */
1332 if(check_pmt_complete(prv
)){
1347 prv
->sbuf_offset
= curr
- prv
->sbuf
.head
;
1352 static int proc_pmt(ARIB_STD_B25_PRIVATE_DATA
*prv
, TS_PROGRAM
*pgrm
)
1368 DECRYPTOR_ELEM
*dec
[2];
1371 TS_STREAM_ELEM
*strm
;
1375 memset(§
, 0, sizeof(sect
));
1377 n
= pgrm
->pmt
->get(pgrm
->pmt
, §
);
1379 r
= ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE
;
1382 if(sect
.hdr
.table_id
!= TS_SECTION_ID_PROGRAM_MAP
){
1383 r
= ARIB_STD_B25_WARN_TS_SECTION_ID_MISSMATCH
;
1390 pgrm
->pcr_pid
= ((head
[0] << 8) | head
[1]) & 0x1fff;
1391 length
= ((head
[2] << 8) | head
[3]) & 0x0fff;
1393 if(head
+length
> tail
){
1394 r
= ARIB_STD_B25_WARN_BROKEN_TS_SECTION
;
1398 /* find major ecm_pid and regist decryptor */
1399 ecm_pid
= find_ca_descriptor_pid(head
, head
+length
, prv
->ca_system_id
);
1400 if( (ecm_pid
!= 0) && (ecm_pid
!= 0x1fff) ){
1401 dec
[0] = set_decryptor(prv
, ecm_pid
);
1403 r
= ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
1408 if (prv
->decrypt
.count
== 1) {
1409 dec
[0] = prv
->decrypt
.head
;
1416 /* unref old stream entries */
1417 while( (strm
= get_stream_list_head(&(pgrm
->old_strm
))) != NULL
){
1418 unref_stream(prv
, strm
->pid
);
1419 memset(strm
, 0, sizeof(TS_STREAM_ELEM
));
1420 put_stream_list_tail(&(prv
->strm_pool
), strm
);
1423 /* save current streams */
1424 memcpy(&(pgrm
->old_strm
), &(pgrm
->streams
), sizeof(TS_STREAM_LIST
));
1425 memset(&(pgrm
->streams
), 0, sizeof(TS_STREAM_LIST
));
1427 /* add current stream entries */
1428 if( (ecm_pid
!= 0) && (ecm_pid
!= 0x1fff) ){
1429 if(!add_ecm_stream(prv
, &(pgrm
->streams
), ecm_pid
)){
1430 r
= ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
1435 while( head
+4 < tail
){
1438 pid
= ((head
[1] << 8) | head
[2]) & 0x1fff;
1439 length
= ((head
[3] << 8) | head
[4]) & 0x0fff;
1441 ecm_pid
= find_ca_descriptor_pid(head
, head
+length
, prv
->ca_system_id
);
1444 if( (ecm_pid
!= 0) && (ecm_pid
!= 0x1fff) ){
1445 dec
[1] = set_decryptor(prv
, ecm_pid
);
1447 r
= ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
1450 if(!add_ecm_stream(prv
, &(pgrm
->streams
), ecm_pid
)){
1451 r
= ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
1458 strm
= get_stream_list_head(&(prv
->strm_pool
));
1460 strm
= create_stream_elem(pid
, type
);
1462 r
= ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
1470 prv
->map
[pid
].type
= PID_MAP_TYPE_OTHER
;
1471 prv
->map
[pid
].ref
+= 1;
1473 dw
= select_active_decryptor(dec
[0], dec
[1], ecm_pid
);
1474 bind_stream_decryptor(prv
, pid
, dw
);
1476 put_stream_list_tail(&(pgrm
->streams
), strm
);
1480 if( dec
[0] != NULL
){
1482 if( dec
[0]->ref
< 1 ){
1483 remove_decryptor(prv
, dec
[0]);
1488 if(sect
.raw
!= NULL
){
1489 n
= pgrm
->pmt
->ret(pgrm
->pmt
, §
);
1490 if( (n
< 0) && (r
== 0) ){
1491 return ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE
;
1498 static int32_t find_ca_descriptor_pid(uint8_t *head
, uint8_t *tail
, int32_t ca_system_id
)
1506 while(head
+1 < tail
){
1510 if( (tag
== 0x09) && /* CA_descriptor */
1512 (head
+len
<= tail
) ){
1513 ca_sys_id
= ((head
[0] << 8) | head
[1]);
1514 ca_pid
= ((head
[2] << 8) | head
[3]) & 0x1fff;
1515 if(ca_sys_id
== ca_system_id
){
1525 static int add_ecm_stream(ARIB_STD_B25_PRIVATE_DATA
*prv
, TS_STREAM_LIST
*list
, int32_t ecm_pid
)
1527 TS_STREAM_ELEM
*strm
;
1529 strm
= find_stream_list_elem(list
, ecm_pid
);
1531 // ECM is already registered
1535 strm
= get_stream_list_head(&(prv
->strm_pool
));
1537 strm
= create_stream_elem(ecm_pid
, PID_MAP_TYPE_ECM
);
1542 strm
->pid
= ecm_pid
;
1543 strm
->type
= PID_MAP_TYPE_ECM
;
1546 put_stream_list_tail(list
, strm
);
1547 prv
->map
[ecm_pid
].ref
+= 1;
1552 static int check_ecm_complete(ARIB_STD_B25_PRIVATE_DATA
*prv
)
1557 memset(num
, 0, sizeof(num
));
1559 e
= prv
->decrypt
.head
;
1568 e
= (DECRYPTOR_ELEM
*)(e
->next
);
1582 static int find_ecm(ARIB_STD_B25_PRIVATE_DATA
*prv
)
1594 DECRYPTOR_ELEM
*dec
;
1597 unit
= prv
->unit_size
;
1598 curr
= prv
->sbuf
.head
+ prv
->sbuf_offset
;
1599 tail
= prv
->sbuf
.tail
;
1601 while( (curr
+unit
) < tail
){
1602 if( (curr
[0] != 0x47) || (curr
[unit
] != 0x47) ){
1603 p
= resync(curr
, tail
, unit
);
1609 extract_ts_header(&hdr
, curr
);
1610 if(prv
->map
[hdr
.pid
].type
!= PID_MAP_TYPE_ECM
){
1613 dec
= (DECRYPTOR_ELEM
*)(prv
->map
[hdr
.pid
].target
);
1618 if(dec
->phase
== 0){
1621 if(hdr
.adaptation_field_control
& 0x02){
1624 size
= 188 - (p
-curr
);
1629 if(dec
->ecm
== NULL
){
1630 /* this code will never execute */
1631 r
= ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE
;
1636 n
= dec
->ecm
->put(dec
->ecm
, &hdr
, p
, size
);
1638 r
= ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE
;
1642 n
= dec
->ecm
->get_count(dec
->ecm
);
1644 r
= ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE
;
1652 r
= proc_ecm(dec
, prv
->bcas
, prv
->multi2_round
);
1657 if( (r
> 0) && (r
!= ARIB_STD_B25_WARN_UNPURCHASED_ECM
) ){
1658 /* broken or unexpected section data */
1663 if(check_ecm_complete(prv
)){
1679 prv
->sbuf_offset
= curr
- prv
->sbuf
.head
;
1684 static int proc_ecm(DECRYPTOR_ELEM
*dec
, B_CAS_CARD
*bcas
, int32_t multi2_round
)
1691 B_CAS_INIT_STATUS is
;
1692 B_CAS_ECM_RESULT res
;
1697 memset(§
, 0, sizeof(sect
));
1700 r
= ARIB_STD_B25_ERROR_EMPTY_B_CAS_CARD
;
1704 n
= dec
->ecm
->get(dec
->ecm
, §
);
1706 r
= ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE
;
1709 if(sect
.hdr
.table_id
!= TS_SECTION_ID_ECM_S
){
1710 r
= ARIB_STD_B25_WARN_TS_SECTION_ID_MISSMATCH
;
1715 /* previous ECM has returned unpurchased
1716 skip this pid for B-CAS card load reduction */
1717 dec
->unpurchased
+= 1;
1718 r
= ARIB_STD_B25_WARN_UNPURCHASED_ECM
;
1722 length
= (sect
.tail
- sect
.data
) - 4;
1725 r
= bcas
->proc_ecm(bcas
, &res
, p
, length
);
1727 if(dec
->m2
!= NULL
){
1728 dec
->m2
->clear_scramble_key(dec
->m2
);
1730 r
= ARIB_STD_B25_ERROR_ECM_PROC_FAILURE
;
1734 if( (res
.return_code
!= 0x0800) &&
1735 (res
.return_code
!= 0x0400) &&
1736 (res
.return_code
!= 0x0200) ){
1737 /* return_code is not equal "purchased" */
1738 if(dec
->m2
!= NULL
){
1739 dec
->m2
->release(dec
->m2
);
1742 dec
->unpurchased
+= 1;
1743 dec
->last_error
= res
.return_code
;
1745 r
= ARIB_STD_B25_WARN_UNPURCHASED_ECM
;
1749 if(dec
->m2
== NULL
){
1750 dec
->m2
= create_multi2();
1751 if(dec
->m2
== NULL
){
1752 return ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
1754 r
= bcas
->get_init_status(bcas
, &is
);
1756 return ARIB_STD_B25_ERROR_INVALID_B_CAS_STATUS
;
1758 dec
->m2
->set_system_key(dec
->m2
, is
.system_key
);
1759 dec
->m2
->set_init_cbc(dec
->m2
, is
.init_cbc
);
1760 dec
->m2
->set_round(dec
->m2
, multi2_round
);
1763 dec
->m2
->set_scramble_key(dec
->m2
, res
.scramble_key
);
1767 fprintf(stdout
, "----\n");
1768 fprintf(stdout
, "odd: ");
1770 fprintf(stdout
, " %02x", res
.scramble_key
[i
]);
1772 fprintf(stdout
, "\n");
1773 fprintf(stdout
, "even:");
1775 fprintf(stdout
, " %02x", res
.scramble_key
[i
]);
1777 fprintf(stdout
, "\n");
1782 if(sect
.raw
!= NULL
){
1783 n
= dec
->ecm
->ret(dec
->ecm
, §
);
1784 if( (n
< 0) && (r
== 0) ){
1785 r
= ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE
;
1792 static void dump_pts(uint8_t *src
, int32_t crypt
)
1794 int32_t pts_dts_flag
;
1797 src
+= 4; // TS ヘッダ部
1798 src
+= 4; // start_code_prefix + stream_id 部
1799 src
+= 2; // packet_length 部
1801 pts_dts_flag
= (src
[1] >> 6) & 3;
1804 if(pts_dts_flag
& 2){
1806 pts
= (src
[0] >> 1) & 0x07;
1808 pts
+= ((src
[1] << 8) + src
[2]) >> 1;
1810 pts
+= ((src
[3] << 8) + src
[4]) >> 1;
1813 if(pts_dts_flag
& 1){
1815 dts
= (src
[0] >> 1) & 0x07;
1817 dts
+= ((src
[1] << 8) + src
[2]) >> 1;
1819 dts
+= ((src
[3] << 8) + src
[4]) >> 1;
1822 if(pts_dts_flag
== 2){
1823 fprintf(stdout
, " key=%d, pts=%"PRId64
"\n", crypt
, pts
/90);
1828 static int proc_arib_std_b25(ARIB_STD_B25_PRIVATE_DATA
*prv
)
1842 DECRYPTOR_ELEM
*dec
;
1845 unit
= prv
->unit_size
;
1846 curr
= prv
->sbuf
.head
;
1847 tail
= prv
->sbuf
.tail
;
1849 m
= prv
->dbuf
.tail
- prv
->dbuf
.head
;
1851 if(!reserve_work_buffer(&(prv
->dbuf
), m
+n
)){
1852 return ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
1857 while( (curr
+unit
) < tail
){
1859 if( (curr
[0] != 0x47) || (curr
[unit
] != 0x47) ){
1860 p
= resync(curr
, tail
, unit
);
1867 extract_ts_header(&hdr
, curr
);
1868 crypt
= hdr
.transport_scrambling_control
;
1871 if(hdr
.transport_error_indicator
!= 0){
1872 /* bit error - append output buffer without parsing */
1873 if(!append_work_buffer(&(prv
->dbuf
), curr
, 188)){
1874 r
= ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
1880 if( (pid
== 0x1fff) && (prv
->strip
) ){
1881 /* strip null(padding) stream */
1886 if(hdr
.adaptation_field_control
& 0x02){
1890 if( (n
< 1) && ((n
< 0) || (hdr
.adaptation_field_control
& 0x01)) ){
1897 (hdr
.adaptation_field_control
& 0x01) ){
1899 if(prv
->map
[pid
].type
== PID_MAP_TYPE_OTHER
){
1900 dec
= (DECRYPTOR_ELEM
*)(prv
->map
[pid
].target
);
1901 }else if( (prv
->map
[pid
].type
== 0) &&
1902 (prv
->decrypt
.count
== 1) ){
1903 dec
= prv
->decrypt
.head
;
1908 if( (dec
!= NULL
) && (dec
->m2
!= NULL
) ){
1909 m
= dec
->m2
->decrypt(dec
->m2
, crypt
, p
, n
);
1911 r
= ARIB_STD_B25_ERROR_DECRYPT_FAILURE
;
1915 prv
->map
[pid
].normal_packet
+= 1;
1917 prv
->map
[pid
].undecrypted
+= 1;
1920 prv
->map
[pid
].normal_packet
+= 1;
1923 if( (hdr
.payload_unit_start_indicator
!= 0) && (pid
== 0x111) ){
1924 dump_pts(curr
, crypt
);
1927 if(!append_work_buffer(&(prv
->dbuf
), curr
, 188)){
1928 r
= ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
1932 if(prv
->map
[pid
].type
== PID_MAP_TYPE_ECM
){
1933 dec
= (DECRYPTOR_ELEM
*)(prv
->map
[pid
].target
);
1934 if( (dec
== NULL
) || (dec
->ecm
== NULL
) ){
1935 /* this code will never execute */
1936 r
= ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE
;
1939 m
= dec
->ecm
->put(dec
->ecm
, &hdr
, p
, n
);
1941 r
= ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE
;
1944 m
= dec
->ecm
->get_count(dec
->ecm
);
1946 r
= ARIB_STD_B25_ERROR_ECM_PARSE_FAILURE
;
1952 r
= proc_ecm(dec
, prv
->bcas
, prv
->multi2_round
);
1956 }else if(prv
->map
[pid
].type
== PID_MAP_TYPE_PMT
){
1957 pgrm
= (TS_PROGRAM
*)(prv
->map
[pid
].target
);
1958 if( (pgrm
== NULL
) || (pgrm
->pmt
== NULL
) ){
1959 /* this code will never execute */
1960 r
= ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE
;
1963 m
= pgrm
->pmt
->put(pgrm
->pmt
, &hdr
, p
, n
);
1965 r
= ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE
;
1968 m
= pgrm
->pmt
->get_count(pgrm
->pmt
);
1970 r
= ARIB_STD_B25_ERROR_PMT_PARSE_FAILURE
;
1976 r
= proc_pmt(prv
, pgrm
);
1980 }else if(prv
->map
[pid
].type
== PID_MAP_TYPE_EMM
){
1981 if( prv
->emm_proc_on
== 0){
1984 if( prv
->emm
== NULL
){
1985 prv
->emm
= create_ts_section_parser();
1986 if(prv
->emm
== NULL
){
1987 r
= ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE
;
1991 m
= prv
->emm
->put(prv
->emm
, &hdr
, p
, n
);
1993 r
= ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE
;
1996 m
= prv
->emm
->get_count(prv
->emm
);
1998 r
= ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE
;
2008 }else if(pid
== 0x0001){
2009 if( prv
->cat
== NULL
){
2010 prv
->cat
= create_ts_section_parser();
2011 if(prv
->cat
== NULL
){
2012 r
= ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
2016 m
= prv
->cat
->put(prv
->cat
, &hdr
, p
, n
);
2018 r
= ARIB_STD_B25_ERROR_CAT_PARSE_FAILURE
;
2021 m
= prv
->cat
->get_count(prv
->cat
);
2023 r
= ARIB_STD_B25_ERROR_CAT_PARSE_FAILURE
;
2033 }else if(pid
== 0x0000){
2034 if( prv
->pat
== NULL
){
2035 prv
->pat
= create_ts_section_parser();
2036 if(prv
->pat
== NULL
){
2037 r
= ARIB_STD_B25_ERROR_NO_ENOUGH_MEMORY
;
2041 m
= prv
->pat
->put(prv
->pat
, &hdr
, p
, n
);
2043 r
= ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE
;
2046 m
= prv
->pat
->get_count(prv
->pat
);
2048 r
= ARIB_STD_B25_ERROR_PAT_PARSE_FAILURE
;
2063 m
= curr
- prv
->sbuf
.head
;
2065 if( (n
< 1024) || (m
> (prv
->sbuf
.max
/2) ) ){
2069 prv
->sbuf
.tail
= p
+n
;
2071 prv
->sbuf
.head
= curr
;
2077 static int proc_cat(ARIB_STD_B25_PRIVATE_DATA
*prv
)
2086 memset(§
, 0, sizeof(sect
));
2088 n
= prv
->cat
->get(prv
->cat
, §
);
2090 r
= ARIB_STD_B25_ERROR_CAT_PARSE_FAILURE
;
2094 if(sect
.hdr
.table_id
!= TS_SECTION_ID_CONDITIONAL_ACCESS
){
2095 r
= ARIB_STD_B25_WARN_TS_SECTION_ID_MISSMATCH
;
2099 emm_pid
= find_ca_descriptor_pid(sect
.data
, sect
.tail
-4, prv
->ca_system_id
);
2100 if( (emm_pid
!= 0x0000) && (emm_pid
!= 0x1fff) ){
2101 if( (prv
->map
[emm_pid
].target
!= NULL
) &&
2102 (prv
->map
[emm_pid
].type
== PID_MAP_TYPE_OTHER
) ){
2103 DECRYPTOR_ELEM
*dec
;
2104 dec
= (DECRYPTOR_ELEM
*)(prv
->map
[emm_pid
].target
);
2107 remove_decryptor(prv
, dec
);
2110 prv
->emm_pid
= emm_pid
;
2111 prv
->map
[emm_pid
].ref
= 1;
2112 prv
->map
[emm_pid
].type
= PID_MAP_TYPE_EMM
;
2113 prv
->map
[emm_pid
].target
= NULL
;
2116 prv
->map
[0x0001].ref
= 1;
2117 prv
->map
[0x0001].type
= PID_MAP_TYPE_CAT
;
2118 prv
->map
[0x0001].target
= NULL
;
2122 if(sect
.raw
!= NULL
){
2123 n
= prv
->cat
->ret(prv
->cat
, §
);
2124 if( (n
< 0) && (r
== 0) ){
2125 r
= ARIB_STD_B25_ERROR_CAT_PARSE_FAILURE
;
2132 static int proc_emm(ARIB_STD_B25_PRIVATE_DATA
*prv
)
2143 EMM_FIXED_PART emm_hdr
;
2146 memset(§
, 0, sizeof(sect
));
2148 if(prv
->bcas
== NULL
){
2149 r
= ARIB_STD_B25_ERROR_EMPTY_B_CAS_CARD
;
2153 while( (n
= prv
->emm
->get_count(prv
->emm
)) > 0 ){
2155 n
= prv
->emm
->get(prv
->emm
, §
);
2157 r
= ARIB_STD_B25_ERROR_CAT_PARSE_FAILURE
;
2161 if(sect
.hdr
.table_id
== TS_SECTION_ID_EMM_MESSAGE
){
2162 /* EMM_MESSAGE is not supported */
2164 }else if(sect
.hdr
.table_id
!= TS_SECTION_ID_EMM_S
){
2165 r
= ARIB_STD_B25_WARN_TS_SECTION_ID_MISSMATCH
;
2170 tail
= sect
.tail
- 4;
2172 while( (head
+13) <= tail
){
2174 extract_emm_fixed_part(&emm_hdr
, head
);
2175 len
= emm_hdr
.associated_information_length
+7;
2176 if( (head
+len
) > tail
){
2177 /* broken EMM element */
2181 for(j
=0;j
<prv
->casid
.count
;j
++){
2182 if(prv
->casid
.data
[j
] == emm_hdr
.card_id
){
2183 n
= prv
->bcas
->proc_emm(prv
->bcas
, head
, len
);
2185 r
= ARIB_STD_B25_ERROR_EMM_PROC_FAILURE
;
2188 unlock_all_decryptor(prv
);
2196 if(sect
.raw
!= NULL
){
2197 n
= prv
->emm
->ret(prv
->emm
, §
);
2198 if( (n
< 0) && (r
== 0) ){
2199 r
= ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE
;
2202 memset(§
, 0, sizeof(sect
));
2207 if(sect
.raw
!= NULL
){
2208 n
= prv
->emm
->ret(prv
->emm
, §
);
2209 if( (n
< 0) && (r
== 0) ){
2210 r
= ARIB_STD_B25_ERROR_EMM_PARSE_FAILURE
;
2217 static void release_program(ARIB_STD_B25_PRIVATE_DATA
*prv
, TS_PROGRAM
*pgrm
)
2220 TS_STREAM_ELEM
*strm
;
2222 pid
= pgrm
->pmt_pid
;
2224 if(pgrm
->pmt
!= NULL
){
2225 pgrm
->pmt
->release(pgrm
->pmt
);
2229 while( (strm
= get_stream_list_head(&(pgrm
->old_strm
))) != NULL
){
2230 unref_stream(prv
, strm
->pid
);
2231 memset(strm
, 0, sizeof(TS_STREAM_ELEM
));
2232 put_stream_list_tail(&(prv
->strm_pool
), strm
);
2235 while( (strm
= get_stream_list_head(&(pgrm
->streams
))) != NULL
){
2236 unref_stream(prv
, strm
->pid
);
2237 memset(strm
, 0, sizeof(TS_STREAM_ELEM
));
2238 put_stream_list_tail(&(prv
->strm_pool
), strm
);
2241 prv
->map
[pid
].type
= PID_MAP_TYPE_UNKNOWN
;
2242 prv
->map
[pid
].ref
= 0;
2243 prv
->map
[pid
].target
= NULL
;
2246 static void unref_stream(ARIB_STD_B25_PRIVATE_DATA
*prv
, int32_t pid
)
2248 DECRYPTOR_ELEM
*dec
;
2250 prv
->map
[pid
].ref
-= 1;
2251 if( prv
->map
[pid
].ref
< 1 ){
2252 if( (prv
->map
[pid
].target
!= NULL
) &&
2253 (prv
->map
[pid
].type
== PID_MAP_TYPE_OTHER
) ){
2254 dec
= (DECRYPTOR_ELEM
*)(prv
->map
[pid
].target
);
2257 remove_decryptor(prv
, dec
);
2260 prv
->map
[pid
].type
= PID_MAP_TYPE_UNKNOWN
;
2261 prv
->map
[pid
].ref
= 0;
2262 prv
->map
[pid
].target
= NULL
;
2266 static DECRYPTOR_ELEM
*set_decryptor(ARIB_STD_B25_PRIVATE_DATA
*prv
, int32_t pid
)
2271 if(prv
->map
[pid
].type
== PID_MAP_TYPE_ECM
){
2272 r
= (DECRYPTOR_ELEM
*)(prv
->map
[pid
].target
);
2277 r
= (DECRYPTOR_ELEM
*)calloc(1, sizeof(DECRYPTOR_ELEM
));
2282 r
->ecm
= create_ts_section_parser();
2288 if(prv
->decrypt
.tail
!= NULL
){
2289 r
->prev
= prv
->decrypt
.tail
;
2291 prv
->decrypt
.tail
->next
= r
;
2292 prv
->decrypt
.tail
= r
;
2293 prv
->decrypt
.count
+= 1;
2297 prv
->decrypt
.head
= r
;
2298 prv
->decrypt
.tail
= r
;
2299 prv
->decrypt
.count
= 1;
2302 if( (prv
->map
[pid
].type
== PID_MAP_TYPE_OTHER
) &&
2303 (prv
->map
[pid
].target
!= NULL
) ){
2304 DECRYPTOR_ELEM
*dec
;
2305 dec
= (DECRYPTOR_ELEM
*)(prv
->map
[pid
].target
);
2308 remove_decryptor(prv
, dec
);
2312 prv
->map
[pid
].type
= PID_MAP_TYPE_ECM
;
2313 prv
->map
[pid
].target
= r
;
2318 static void remove_decryptor(ARIB_STD_B25_PRIVATE_DATA
*prv
, DECRYPTOR_ELEM
*dec
)
2322 DECRYPTOR_ELEM
*prev
;
2323 DECRYPTOR_ELEM
*next
;
2326 if( (prv
->map
[pid
].type
== PID_MAP_TYPE_ECM
) &&
2327 (prv
->map
[pid
].target
== ((void *)dec
)) ){
2328 prv
->map
[pid
].type
= PID_MAP_TYPE_UNKNOWN
;
2329 prv
->map
[pid
].target
= NULL
;
2332 prev
= (DECRYPTOR_ELEM
*)(dec
->prev
);
2333 next
= (DECRYPTOR_ELEM
*)(dec
->next
);
2337 prv
->decrypt
.head
= next
;
2342 prv
->decrypt
.tail
= prev
;
2344 prv
->decrypt
.count
-= 1;
2346 if(dec
->ecm
!= NULL
){
2347 dec
->ecm
->release(dec
->ecm
);
2351 if(dec
->m2
!= NULL
){
2352 dec
->m2
->release(dec
->m2
);
2359 static DECRYPTOR_ELEM
*select_active_decryptor(DECRYPTOR_ELEM
*a
, DECRYPTOR_ELEM
*b
, int32_t pid
)
2364 if( pid
== 0x1fff ){
2370 static void bind_stream_decryptor(ARIB_STD_B25_PRIVATE_DATA
*prv
, int32_t pid
, DECRYPTOR_ELEM
*dec
)
2372 DECRYPTOR_ELEM
*old
;
2374 old
= (DECRYPTOR_ELEM
*)(prv
->map
[pid
].target
);
2376 /* already binded - do nothing */
2383 remove_decryptor(prv
, old
);
2385 prv
->map
[pid
].target
= NULL
;
2389 prv
->map
[pid
].target
= dec
;
2394 static void unlock_all_decryptor(ARIB_STD_B25_PRIVATE_DATA
*prv
)
2398 e
= prv
->decrypt
.head
;
2401 e
= (DECRYPTOR_ELEM
*)(e
->next
);
2405 static TS_STREAM_ELEM
*get_stream_list_head(TS_STREAM_LIST
*list
)
2414 list
->head
= (TS_STREAM_ELEM
*)(r
->next
);
2415 if(list
->head
== NULL
){
2419 list
->head
->prev
= NULL
;
2429 static TS_STREAM_ELEM
*find_stream_list_elem(TS_STREAM_LIST
*list
, int32_t pid
)
2438 r
= (TS_STREAM_ELEM
*)(r
->next
);
2444 static TS_STREAM_ELEM
*create_stream_elem(int32_t pid
, int32_t type
)
2448 r
= (TS_STREAM_ELEM
*)calloc(1, sizeof(TS_STREAM_ELEM
));
2459 static void put_stream_list_tail(TS_STREAM_LIST
*list
, TS_STREAM_ELEM
*elem
)
2461 if(list
->tail
!= NULL
){
2462 elem
->prev
= list
->tail
;
2464 list
->tail
->next
= elem
;
2476 static void clear_stream_list(TS_STREAM_LIST
*list
)
2478 TS_STREAM_ELEM
*p
,*n
;
2482 n
= (TS_STREAM_ELEM
*)(p
->next
);
2492 static int reserve_work_buffer(TS_WORK_BUFFER
*buf
, int32_t size
)
2497 if(buf
->max
>= size
){
2511 p
= (uint8_t *)malloc(n
);
2517 if(buf
->pool
!= NULL
){
2518 m
= buf
->tail
- buf
->head
;
2520 memcpy(p
, buf
->head
, m
);
2534 static int append_work_buffer(TS_WORK_BUFFER
*buf
, uint8_t *data
, int32_t size
)
2539 /* ignore - do nothing */
2543 m
= buf
->tail
- buf
->pool
;
2545 if( (m
+size
) > buf
->max
){
2546 if(!reserve_work_buffer(buf
, m
+size
)){
2551 memcpy(buf
->tail
, data
, size
);
2557 static void reset_work_buffer(TS_WORK_BUFFER
*buf
)
2559 buf
->head
= buf
->pool
;
2560 buf
->tail
= buf
->pool
;
2563 static void release_work_buffer(TS_WORK_BUFFER
*buf
)
2565 if(buf
->pool
!= NULL
){
2574 static void extract_ts_header(TS_HEADER
*dst
, uint8_t *src
)
2577 dst
->transport_error_indicator
= (src
[1] >> 7) & 0x01;
2578 dst
->payload_unit_start_indicator
= (src
[1] >> 6) & 0x01;
2579 dst
->transport_priority
= (src
[1] >> 5) & 0x01;
2580 dst
->pid
= ((src
[1] & 0x1f) << 8) | src
[2];
2581 dst
->transport_scrambling_control
= (src
[3] >> 6) & 0x03;
2582 dst
->adaptation_field_control
= (src
[3] >> 4) & 0x03;
2583 dst
->continuity_counter
= src
[3] & 0x0f;
2586 static void extract_emm_fixed_part(EMM_FIXED_PART
*dst
, uint8_t *src
)
2592 dst
->card_id
= (dst
->card_id
<< 8) | src
[i
];
2595 dst
->associated_information_length
= src
[ 6];
2596 dst
->protocol_number
= src
[ 7];
2597 dst
->broadcaster_group_id
= src
[ 8];
2598 dst
->update_number
= (src
[ 9]<<8)|src
[10];
2599 dst
->expiration_date
= (src
[11]<<8)|src
[12];
2602 static uint8_t *resync(uint8_t *head
, uint8_t *tail
, int32_t unit_size
)
2608 tail
-= unit_size
* 8;
2609 while( buf
<= tail
){
2612 if(buf
[unit_size
*i
] != 0x47){
2626 static uint8_t *resync_force(uint8_t *head
, uint8_t *tail
, int32_t unit_size
)
2632 while( buf
<= (tail
-188) ){
2634 n
= (tail
- buf
) / unit_size
;
2639 if(buf
[unit_size
*i
] != 0x47){