summaryrefslogtreecommitdiff
path: root/libavformat/mpegts.c
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2020-12-27 19:38:50 +0100
committerMarton Balint <cus@passwd.hu>2021-01-09 22:38:12 +0100
commit10c8e532943cc1339cf42d3f84eed4eafd8b0ca8 (patch)
tree0604472273a2042148ddb28696d6eac9449ec159 /libavformat/mpegts.c
parent5ea37923a8aaa3f670c1455c783c10d3142f4a71 (diff)
avformat/mpegts: rework clearing and adding pid to program
And use better function names. Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'libavformat/mpegts.c')
-rw-r--r--libavformat/mpegts.c59
1 files changed, 25 insertions, 34 deletions
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 3712dad1c8..1b990f7a66 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -285,16 +285,12 @@ static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
prg->nb_stream_indexes = 0;
}
-static void clear_program(MpegTSContext *ts, unsigned int programid)
+static void clear_program(struct Program *p)
{
- int i;
-
- clear_avprogram(ts, programid);
- for (i = 0; i < ts->nb_prg; i++)
- if (ts->prg[i].id == programid) {
- ts->prg[i].nb_pids = 0;
- ts->prg[i].pmt_found = 0;
- }
+ if (!p)
+ return;
+ p->nb_pids = 0;
+ p->pmt_found = 0;
}
static void clear_programs(MpegTSContext *ts)
@@ -303,24 +299,22 @@ static void clear_programs(MpegTSContext *ts)
ts->nb_prg = 0;
}
-static void add_pat_entry(MpegTSContext *ts, unsigned int programid)
+static struct Program * add_program(MpegTSContext *ts, unsigned int programid)
{
struct Program *p;
if (av_reallocp_array(&ts->prg, ts->nb_prg + 1, sizeof(*ts->prg)) < 0) {
ts->nb_prg = 0;
- return;
+ return NULL;
}
p = &ts->prg[ts->nb_prg];
p->id = programid;
- p->nb_pids = 0;
- p->pmt_found = 0;
+ clear_program(p);
ts->nb_prg++;
+ return p;
}
-static void add_pid_to_pmt(MpegTSContext *ts, unsigned int programid,
- unsigned int pid)
+static void add_pid_to_program(struct Program *p, unsigned int pid)
{
- struct Program *p = get_program(ts, programid);
int i;
if (!p)
return;
@@ -335,15 +329,6 @@ static void add_pid_to_pmt(MpegTSContext *ts, unsigned int programid,
p->pids[p->nb_pids++] = pid;
}
-static void set_pmt_found(MpegTSContext *ts, unsigned int programid)
-{
- struct Program *p = get_program(ts, programid);
- if (!p)
- return;
-
- p->pmt_found = 1;
-}
-
static void update_av_program_info(AVFormatContext *s, unsigned int programid,
unsigned int pid, int version)
{
@@ -2290,6 +2275,7 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
int desc_list_len;
uint32_t prog_reg_desc = 0; /* registration descriptor */
int stream_identifier = -1;
+ struct Program *prg;
int mp4_descr_count = 0;
Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = { { 0 } };
@@ -2313,16 +2299,20 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
if (!ts->scan_all_pmts && ts->skip_changes)
return;
- if (ts->skip_unknown_pmt && !get_program(ts, h->id))
+ prg = get_program(ts, h->id);
+
+ if (ts->skip_unknown_pmt && !prg)
return;
- if (!ts->skip_clear)
- clear_program(ts, h->id);
+ if (!ts->skip_clear) {
+ clear_avprogram(ts, h->id);
+ clear_program(prg);
+ }
pcr_pid = get16(&p, p_end);
if (pcr_pid < 0)
return;
pcr_pid &= 0x1fff;
- add_pid_to_pmt(ts, h->id, pcr_pid);
+ add_pid_to_program(prg, pcr_pid);
update_av_program_info(ts->stream, h->id, pcr_pid, h->version);
av_log(ts->stream, AV_LOG_TRACE, "pcr_pid=0x%x\n", pcr_pid);
@@ -2362,8 +2352,8 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
if (!ts->pkt)
ts->stop_parse = 2;
- set_pmt_found(ts, h->id);
-
+ if (prg)
+ prg->pmt_found = 1;
for (i = 0; ; i++) {
st = 0;
@@ -2453,7 +2443,7 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
if (pes && !pes->stream_type)
mpegts_set_stream_info(st, pes, stream_type, prog_reg_desc);
- add_pid_to_pmt(ts, h->id, pid);
+ add_pid_to_program(prg, pid);
av_program_add_stream_index(ts->stream, h->id, st->index);
@@ -2532,6 +2522,7 @@ static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
/* NIT info */
} else {
MpegTSFilter *fil = ts->pids[pmt_pid];
+ struct Program *prg;
program = av_new_program(ts->stream, sid);
if (program) {
program->program_num = sid;
@@ -2545,8 +2536,8 @@ static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
if (!ts->pids[pmt_pid])
mpegts_open_section_filter(ts, pmt_pid, pmt_cb, ts, 1);
- add_pat_entry(ts, sid);
- add_pid_to_pmt(ts, sid, pmt_pid);
+ prg = add_program(ts, sid);
+ add_pid_to_program(prg, pmt_pid);
}
}