diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-10-08 05:25:27 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-10-08 05:25:27 +0200 |
commit | f464b02d2214009344c2b5975e3ca2feb3c3ba38 (patch) | |
tree | 070fd5b89c3642ddb22372b97f99ac3299d34654 /libavformat | |
parent | 43bbc3f477a2dc5ab18fe10147e0f3964cdb4f41 (diff) | |
download | ffmpeg-f464b02d2214009344c2b5975e3ca2feb3c3ba38.tar.gz |
mpegts: fuzzy crc check for not so spec compliant files
Fixes Ticket598
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/mpegts.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index aed3cea69c..33a0eaf08c 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -123,6 +123,7 @@ struct MpegTSContext { unsigned int nb_prg; struct Program *prg; + int8_t crc_validity[NB_PID_MAX]; /** filters for various streams specified by PMT + for the PAT and PMT */ MpegTSFilter *pids[NB_PID_MAX]; @@ -277,6 +278,7 @@ static int discard_pid(MpegTSContext *ts, unsigned int pid) static void write_section_data(AVFormatContext *s, MpegTSFilter *tss1, const uint8_t *buf, int buf_size, int is_start) { + MpegTSContext *ts = s->priv_data; MpegTSSectionFilter *tss = &tss1->u.section_filter; int len; @@ -304,10 +306,19 @@ static void write_section_data(AVFormatContext *s, MpegTSFilter *tss1, } if (tss->section_h_size != -1 && tss->section_index >= tss->section_h_size) { + int crc_valid = 1; tss->end_of_section_reached = 1; - if (!tss->check_crc || - av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, - tss->section_buf, tss->section_h_size) == 0) + + 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 (crc_valid){ + ts->crc_validity[ tss1->pid ] = 100; + }else if(ts->crc_validity[ tss1->pid ] > -10){ + ts->crc_validity[ tss1->pid ]--; + }else + crc_valid = 2; + } + if (crc_valid) tss->section_cb(tss1, tss->section_buf, tss->section_h_size); } } |