summaryrefslogtreecommitdiff
path: root/libavformat/mpegts.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavformat/mpegts.c')
-rw-r--r--libavformat/mpegts.c43
1 files changed, 18 insertions, 25 deletions
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 9593c20fcb..02ae1705e7 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -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);
}
}