int write_section(struct lib_ccx_ctx *ctx, struct ts_payload *payload, unsigned char*buf, int size, int pos) { if (payload->pesstart) { memcpy(payload->section_buf, buf, size); payload->section_index = size; payload->section_size = -1; } else { memcpy(payload->section_buf + payload->section_index, buf, size); payload->section_index += size; } if(payload->section_size == -1 && payload->section_index >= 3) payload->section_size = (RB16(payload->section_buf + 1) & 0xfff) + 3 ; if(payload->section_index >= (unsigned)payload->section_size) { if(parse_PMT(ctx, payload->section_buf,payload->section_size,pos)) return 1; } return 0; }
BOOL parse_TS(BYTE *ts_stream) { uint8_t tsph.sync = TS_SYNC_BYTE(ts_stream); if(tsph.sync != 0x47){ debuglog("sync bytes missed!"); return FALSE; } tsph.transport_error_indicator = TS_ERROR(ts_stream); tsph.payload_uint_start_indicator = TS_PAYLOAD_START(ts_stream); tsph.transport_priority = TS_PRIORITY(ts_stream); tsph.PID = TS_PID(ts_stream); tsph.transport_scrambling = TS_SCRAMBLING(ts_stream); tsph.adaptation_field_control = TS_ADAPT_CTL(ts_stream); tsph.continuity_counter = TS_CONT_COUNT(ts_stream); debuglog("ts:transport_error_indicator:%d\n payload_uint_start_indicator:%d\n transport_priority:%d\n PID:%d\n transport_scrambling:%d\n continuity_counter:%d\n", tsph.transport_error_indicator, tsph.payload_uint_start_indicator, tsph.transport_priority, tsph.PID, tsph.transport_scrambling, tsph.continuity_counter); if(!tsph.transport_error_indicator) { int len = 0; len += 4; if(is_psi(tsph.PID)) { if(tsph.payload_uint_start_indicator == 1) { tsph.pointer_field = TS_POINTER_FIELD(ts_stream + len); len = len + tsph.pointer_field + 1; } else { /*TS包的净荷不带有PSI/SI包数据的第一个字节,没有pointer_field *psi/si信息跨越两个ts包,不解析 */ debuglog("此ts包是另一个psi/si表未完部分,暂为解析"); return FALSE; } switch(tsph.adaptation_field_control) { case 0x03: /* 有adaptation,也有净荷 */ tsph.adaptation_fields = (tsadaptation_filed *)malloc(sizeof(tsadaptation_filed)); if(!tsph.adaptation_fields) { debuglog("malloc tsph.adaptation_field failed"); return FALSE; } tsph.adaptation_fields->adapt_field_len = TS_ADAPT_LEN(ts_stream); len = len + tsph.adaptation_fields->adapt_field_len + 1; /* adapt_field_len表示在它后面的数据的长度 */ break; case 0x01:/* 只有净荷数据 */ case 0x02:/* 只有adaptation */ case 0x00:/* 保留 */ default: break; } BYTE* sec_start = ts_stream + len; /* psi/si表起始位置 */ switch(tsph.PID) { /* todo:对不同的错误可以给一个错误号 */ case 0x0000: if(!parse_PAT(sec_start)) { debuglog("parse pat failed!check log..."); return FALSE; } break; case 0x0001: if(!parse_CAT(sec_start)) { debuglog("parse cat failed!check log..."); return FALSE; } break; case 0x0010: if(!parse_NIT(sec_start)) { debuglog("parse nit failed!check log..."); return FALSE; } break; case 0x0011: if(!parse_SDT(sec_start)) { debuglog("parse sdt failed!check log..."); return FALSE; } break; case 0x0012: if(!parse_EIT(sec_start)) { debuglog("parse eit failed!check log..."); return FALSE; } break; case 0x0014: // parse_TDT(); // parse_TOD(); break; default: if(is_pmt_pid(tsph.PID)) { parse_PMT(sec_start); } break; } } else { if(is_es_pid(tsph.PID)) { /*parse_ES()*/ } else { /*parse_Others() */ } } } else { debuglog("transport error!"); return FALSE; } free(tsph.adaptation_fields); tsph.adaptation_fields = NULL; return TRUE; }