aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2015-05-19 20:56:10 +0200
committerMichael Niedermayer <michaelni@gmx.at>2015-05-19 20:56:10 +0200
commitd45eef081469053c9487ef21254b03608f8f669d (patch)
tree07b21eba12fecc94703b2502ec93691680164013
parentefb28e3c510b7666107cd2aa25da61c9d33101b0 (diff)
parent844201e35fe575710be8218d45828df49b77f205 (diff)
downloadffmpeg-d45eef081469053c9487ef21254b03608f8f669d.tar.gz
Merge commit '844201e35fe575710be8218d45828df49b77f205' into release/2.4
* commit '844201e35fe575710be8218d45828df49b77f205': mpegts: Update the PSI/SI table only if the version change Conflicts: libavformat/mpegts.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavformat/mpegts.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 88082692b1..3fe6aa460c 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -75,6 +75,7 @@ typedef void SetServiceCallback (void *opaque, int ret);
typedef struct MpegTSSectionFilter {
int section_index;
int section_h_size;
+ int last_ver;
uint8_t *section_buf;
unsigned int check_crc : 1;
unsigned int end_of_section_reached : 1;
@@ -459,6 +460,8 @@ static MpegTSFilter *mpegts_open_section_filter(MpegTSContext *ts,
sec->opaque = opaque;
sec->section_buf = av_malloc(MAX_SECTION_SIZE);
sec->check_crc = check_crc;
+ sec->last_ver = -1;
+
if (!sec->section_buf) {
av_free(filter);
return NULL;
@@ -1437,6 +1440,7 @@ static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section,
int section_len)
{
MpegTSContext *ts = filter->u.section_filter.opaque;
+ MpegTSSectionFilter *tssf = &filter->u.section_filter;
SectionHeader h;
const uint8_t *p, *p_end;
AVIOContext pb;
@@ -1451,6 +1455,9 @@ static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section,
return;
if (h.tid != M4OD_TID)
return;
+ if (h.version == tssf->last_ver)
+ return;
+ tssf->last_ver = h.version;
mp4_read_od(s, p, (unsigned) (p_end - p), mp4_descr, &mp4_descr_count,
MAX_MP4_DESCR_COUNT);
@@ -1720,6 +1727,7 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
{
MpegTSContext *ts = filter->u.section_filter.opaque;
+ MpegTSSectionFilter *tssf = &filter->u.section_filter;
SectionHeader h1, *h = &h1;
PESContext *pes;
AVStream *st;
@@ -1739,6 +1747,9 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
p = section;
if (parse_section_header(h, &p, p_end) < 0)
return;
+ if (h->version == tssf->last_ver)
+ return;
+ tssf->last_ver = h->version;
av_dlog(ts->stream, "sid=0x%x sec_num=%d/%d\n",
h->id, h->sec_num, h->last_sec_num);
@@ -1886,6 +1897,7 @@ out:
static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
{
MpegTSContext *ts = filter->u.section_filter.opaque;
+ MpegTSSectionFilter *tssf = &filter->u.section_filter;
SectionHeader h1, *h = &h1;
const uint8_t *p, *p_end;
int sid, pmt_pid;
@@ -1903,6 +1915,9 @@ static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
if (ts->skip_changes)
return;
+ if (h->version == tssf->last_ver)
+ return;
+ tssf->last_ver = h->version;
ts->stream->ts_id = h->id;
clear_programs(ts);
@@ -1956,6 +1971,7 @@ static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
{
MpegTSContext *ts = filter->u.section_filter.opaque;
+ MpegTSSectionFilter *tssf = &filter->u.section_filter;
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;
@@ -1972,6 +1988,10 @@ static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
return;
if (ts->skip_changes)
return;
+ if (h->version == tssf->last_ver)
+ return;
+ tssf->last_ver = h->version;
+
onid = get16(&p, p_end);
if (onid < 0)
return;