|
|
|
@@ -110,10 +110,6 @@ struct MpegTSContext { |
|
|
|
/** list of PMTs in the last PAT seen */ |
|
|
|
MpegTSService **services; |
|
|
|
|
|
|
|
/** filter for the PAT */ |
|
|
|
MpegTSFilter *pat_filter; |
|
|
|
/** filter for the PMT for the MPEG program number specified by req_sid */ |
|
|
|
MpegTSFilter *pmt_filter; |
|
|
|
/** MPEG program number of stream we want to decode */ |
|
|
|
int req_sid; |
|
|
|
|
|
|
|
@@ -158,7 +154,7 @@ static void write_section_data(AVFormatContext *s, MpegTSFilter *tss1, |
|
|
|
tss->end_of_section_reached = 1; |
|
|
|
if (!tss->check_crc || |
|
|
|
av_crc(av_crc04C11DB7, -1, tss->section_buf, tss->section_h_size) == 0) |
|
|
|
tss->section_cb(tss->opaque, tss->section_buf, tss->section_h_size); |
|
|
|
tss->section_cb(tss1, tss->section_buf, tss->section_h_size); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@@ -393,9 +389,9 @@ static MpegTSService *new_service(MpegTSContext *ts, int sid, |
|
|
|
return service; |
|
|
|
} |
|
|
|
|
|
|
|
static void pmt_cb(void *opaque, const uint8_t *section, int section_len) |
|
|
|
static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) |
|
|
|
{ |
|
|
|
MpegTSContext *ts = opaque; |
|
|
|
MpegTSContext *ts = filter->u.section_filter.opaque; |
|
|
|
SectionHeader h1, *h = &h1; |
|
|
|
PESContext *pes; |
|
|
|
AVStream *st; |
|
|
|
@@ -538,13 +534,12 @@ static void pmt_cb(void *opaque, const uint8_t *section, int section_len) |
|
|
|
} |
|
|
|
/* all parameters are there */ |
|
|
|
ts->stop_parse=1; |
|
|
|
mpegts_close_filter(ts, ts->pmt_filter); |
|
|
|
ts->pmt_filter = NULL; |
|
|
|
mpegts_close_filter(ts, filter); |
|
|
|
} |
|
|
|
|
|
|
|
static void pat_cb(void *opaque, const uint8_t *section, int section_len) |
|
|
|
static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) |
|
|
|
{ |
|
|
|
MpegTSContext *ts = opaque; |
|
|
|
MpegTSContext *ts = filter->u.section_filter.opaque; |
|
|
|
SectionHeader h1, *h = &h1; |
|
|
|
const uint8_t *p, *p_end; |
|
|
|
int sid, pmt_pid; |
|
|
|
@@ -574,7 +569,7 @@ static void pat_cb(void *opaque, const uint8_t *section, int section_len) |
|
|
|
/* NIT info */ |
|
|
|
} else { |
|
|
|
if (ts->req_sid == sid) { |
|
|
|
ts->pmt_filter = mpegts_open_section_filter(ts, pmt_pid, |
|
|
|
mpegts_open_section_filter(ts, pmt_pid, |
|
|
|
pmt_cb, ts, 1); |
|
|
|
goto found; |
|
|
|
} |
|
|
|
@@ -584,14 +579,13 @@ static void pat_cb(void *opaque, const uint8_t *section, int section_len) |
|
|
|
ts->stop_parse=1; |
|
|
|
|
|
|
|
found: |
|
|
|
mpegts_close_filter(ts, ts->pat_filter); |
|
|
|
ts->pat_filter = NULL; |
|
|
|
mpegts_close_filter(ts, filter); |
|
|
|
} |
|
|
|
|
|
|
|
/* add all services found in the PAT */ |
|
|
|
static void pat_scan_cb(void *opaque, const uint8_t *section, int section_len) |
|
|
|
static void pat_scan_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) |
|
|
|
{ |
|
|
|
MpegTSContext *ts = opaque; |
|
|
|
MpegTSContext *ts = filter->u.section_filter.opaque; |
|
|
|
SectionHeader h1, *h = &h1; |
|
|
|
const uint8_t *p, *p_end; |
|
|
|
int sid, pmt_pid; |
|
|
|
@@ -626,20 +620,19 @@ static void pat_scan_cb(void *opaque, const uint8_t *section, int section_len) |
|
|
|
ts->stop_parse = 1; |
|
|
|
|
|
|
|
/* remove filter */ |
|
|
|
mpegts_close_filter(ts, ts->pat_filter); |
|
|
|
ts->pat_filter = NULL; |
|
|
|
mpegts_close_filter(ts, filter); |
|
|
|
} |
|
|
|
|
|
|
|
static void mpegts_set_service(MpegTSContext *ts, int sid) |
|
|
|
{ |
|
|
|
ts->req_sid = sid; |
|
|
|
ts->pat_filter = mpegts_open_section_filter(ts, PAT_PID, |
|
|
|
mpegts_open_section_filter(ts, PAT_PID, |
|
|
|
pat_cb, ts, 1); |
|
|
|
} |
|
|
|
|
|
|
|
static void sdt_cb(void *opaque, const uint8_t *section, int section_len) |
|
|
|
static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) |
|
|
|
{ |
|
|
|
MpegTSContext *ts = opaque; |
|
|
|
MpegTSContext *ts = filter->u.section_filter.opaque; |
|
|
|
SectionHeader h1, *h = &h1; |
|
|
|
const uint8_t *p, *p_end, *desc_list_end, *desc_end; |
|
|
|
int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type; |
|
|
|
@@ -720,7 +713,7 @@ static void mpegts_scan_sdt(MpegTSContext *ts) |
|
|
|
than nothing !) */ |
|
|
|
static void mpegts_scan_pat(MpegTSContext *ts) |
|
|
|
{ |
|
|
|
ts->pat_filter = mpegts_open_section_filter(ts, PAT_PID, |
|
|
|
mpegts_open_section_filter(ts, PAT_PID, |
|
|
|
pat_scan_cb, ts, 1); |
|
|
|
} |
|
|
|
|
|
|
|
@@ -766,10 +759,10 @@ static int64_t get_pts(const uint8_t *p) |
|
|
|
} |
|
|
|
|
|
|
|
/* return non zero if a packet could be constructed */ |
|
|
|
static void mpegts_push_data(void *opaque, |
|
|
|
static void mpegts_push_data(MpegTSFilter *filter, |
|
|
|
const uint8_t *buf, int buf_size, int is_start) |
|
|
|
{ |
|
|
|
PESContext *pes = opaque; |
|
|
|
PESContext *pes = filter->u.pes_filter.opaque; |
|
|
|
MpegTSContext *ts = pes->ts; |
|
|
|
const uint8_t *p; |
|
|
|
int len, code; |
|
|
|
@@ -1044,7 +1037,7 @@ static void handle_packet(MpegTSContext *ts, const uint8_t *packet) |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
tss->u.pes_filter.pes_cb(tss->u.pes_filter.opaque, |
|
|
|
tss->u.pes_filter.pes_cb(tss, |
|
|
|
p, p_end - p, is_start); |
|
|
|
} |
|
|
|
} |
|
|
|
|