Commit 89f23e87 authored by Francois Cartegnie's avatar Francois Cartegnie

really identify duplicates

parent 311cd26e
...@@ -98,6 +98,7 @@ void *dvbpsi_decoder_new(dvbpsi_callback_gather_t pf_gather, ...@@ -98,6 +98,7 @@ void *dvbpsi_decoder_new(dvbpsi_callback_gather_t pf_gather,
p_decoder->i_section_max_size = i_section_max_size; p_decoder->i_section_max_size = i_section_max_size;
p_decoder->b_discontinuity = b_discontinuity; p_decoder->b_discontinuity = b_discontinuity;
p_decoder->i_continuity_counter = DVBPSI_INVALID_CC; p_decoder->i_continuity_counter = DVBPSI_INVALID_CC;
p_decoder->prevpacket[0] = 0;
p_decoder->p_current_section = NULL; p_decoder->p_current_section = NULL;
p_decoder->b_current_valid = false; p_decoder->b_current_valid = false;
...@@ -293,11 +294,19 @@ bool dvbpsi_packet_push(dvbpsi_t *p_dvbpsi, const uint8_t* p_data) ...@@ -293,11 +294,19 @@ bool dvbpsi_packet_push(dvbpsi_t *p_dvbpsi, const uint8_t* p_data)
if (i_expected_counter == ((p_decoder->i_continuity_counter + 1) & 0xf) if (i_expected_counter == ((p_decoder->i_continuity_counter + 1) & 0xf)
&& !p_decoder->b_discontinuity) && !p_decoder->b_discontinuity)
{ {
dvbpsi_error(p_dvbpsi, "PSI decoder", if(!memcmp(p_decoder->prevpacket, p_data, 188))
"TS duplicate (received %d, expected %d) for PID %d", {
p_decoder->i_continuity_counter, i_expected_counter, dvbpsi_debug(p_dvbpsi, "PSI decoder",
((uint16_t)(p_data[1] & 0x1f) << 8) | p_data[2]); "TS duplicate (received %d, expected %d) for PID %d",
return false; p_decoder->i_continuity_counter, i_expected_counter,
((uint16_t)(p_data[1] & 0x1f) << 8) | p_data[2]);
return false;
}
else /* Fake duplicate */
{
/* force discontinuity */
i_expected_counter = p_decoder->i_continuity_counter + 1;
}
} }
if (i_expected_counter != p_decoder->i_continuity_counter) if (i_expected_counter != p_decoder->i_continuity_counter)
...@@ -315,6 +324,8 @@ bool dvbpsi_packet_push(dvbpsi_t *p_dvbpsi, const uint8_t* p_data) ...@@ -315,6 +324,8 @@ bool dvbpsi_packet_push(dvbpsi_t *p_dvbpsi, const uint8_t* p_data)
} }
} }
memcpy(p_decoder->prevpacket, p_data, 188);
/* Return if no payload in the TS packet */ /* Return if no payload in the TS packet */
if (!(p_data[3] & 0x10)) if (!(p_data[3] & 0x10))
return false; return false;
......
...@@ -264,6 +264,7 @@ typedef void (*dvbpsi_callback_del_t)(dvbpsi_t *p_dvbpsi, /*!< pointer to dvbp ...@@ -264,6 +264,7 @@ typedef void (*dvbpsi_callback_del_t)(dvbpsi_t *p_dvbpsi, /*!< pointer to dvbp
bool b_discontinuity; /*!< Discontinuity flag */ \ bool b_discontinuity; /*!< Discontinuity flag */ \
bool b_current_valid; /*!< Current valid indicator */ \ bool b_current_valid; /*!< Current valid indicator */ \
uint8_t i_continuity_counter; /*!< Continuity counter */ \ uint8_t i_continuity_counter; /*!< Continuity counter */ \
uint8_t prevpacket[188]; /*!< Previous packet data */ \
uint8_t i_last_section_number;/*!< Last received section number */ \ uint8_t i_last_section_number;/*!< Last received section number */ \
dvbpsi_psi_section_t *p_current_section; /*!< Current section */ \ dvbpsi_psi_section_t *p_current_section; /*!< Current section */ \
dvbpsi_psi_section_t *p_sections; /*!< List of received PSI sections */ \ dvbpsi_psi_section_t *p_sections; /*!< List of received PSI sections */ \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment