|
|
|
@@ -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); |
|
|
|
} |
|
|
|
} |
|
|
|
|