diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2015-05-01 02:14:14 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2015-05-01 02:14:14 +0200 |
commit | e0153145f6f8f3aa813652980862bafc8fd9b5c9 (patch) | |
tree | b2f545ed42b129e80eb8f49c38d8a43bc685329d /libavformat/mpegts.c | |
parent | 4b6be54bed27eb7fc8f005505ff38e71b3c86cec (diff) | |
download | ffmpeg-streaming-e0153145f6f8f3aa813652980862bafc8fd9b5c9.zip ffmpeg-streaming-e0153145f6f8f3aa813652980862bafc8fd9b5c9.tar.gz |
avformat/mpegts: Detect changes in packet through CRC instead of just the 5bit version
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/mpegts.c')
-rw-r--r-- | libavformat/mpegts.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 5100f37..613584e 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -76,6 +76,8 @@ typedef struct MpegTSSectionFilter { int section_index; int section_h_size; int last_ver; + unsigned crc; + unsigned last_crc; uint8_t *section_buf; unsigned int check_crc : 1; unsigned int end_of_section_reached : 1; @@ -419,6 +421,9 @@ static void write_section_data(MpegTSContext *ts, MpegTSFilter *tss1, if (tss->check_crc) { crc_valid = !av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, tss->section_buf, tss->section_h_size); + if (tss->section_h_size >= 4) + tss->crc = AV_RB32(tss->section_buf + tss->section_h_size - 4); + if (crc_valid) { ts->crc_validity[ tss1->pid ] = 100; }else if (ts->crc_validity[ tss1->pid ] > -10) { @@ -585,10 +590,11 @@ typedef struct SectionHeader { static int skip_identical(const SectionHeader *h, MpegTSSectionFilter *tssf) { - if (h->version == tssf->last_ver) + if (h->version == tssf->last_ver && tssf->last_crc == tssf->crc) return 1; tssf->last_ver = h->version; + tssf->last_crc = tssf->crc; return 0; } |