diff --git a/ap2_buffered_audio_processor.c b/ap2_buffered_audio_processor.c index 75fa0c0b..e115510a 100644 --- a/ap2_buffered_audio_processor.c +++ b/ap2_buffered_audio_processor.c @@ -198,6 +198,8 @@ void *rtp_buffered_audio_processor(void *arg) { int packets_played_in_this_sequence = 0; int play_enabled = 0; + + int very_early_packets_signalled = 0; // double requested_lead_time = 0.0; // normal lead time minimum -- maybe it should be about 0.1 // wait until our timing information is valid @@ -368,7 +370,7 @@ void *rtp_buffered_audio_processor(void *arg) { } else { - debug(3, "immediate flush of block %u until block %u", seq_no, + debug(4, "immediate flush of block %u until block %u", seq_no, conn->ap2_immediate_flush_until_sequence_number); ap2_immediate_flush_requested = 1; new_audio_block_needed = 1; // @@ -444,27 +446,37 @@ void *rtp_buffered_audio_processor(void *arg) { // debug(1,"player buffer size and occupancy: %u and %u", player_buffer_size, // player_buffer_occupancy); - // If we are playing and there is room in the player buffer, go ahead and decode the block + // If we are playing and there is room in the player buffer, and the block it not too + // early, go ahead and decode the block // and send it to the player. Otherwise, keep the block and sleep for a while. - if ((play_enabled != 0) && - (((1.0 * player_buffer_occupancy * conn->frames_per_packet) / conn->input_rate) <= - config.audio_decoded_buffer_desired_length)) { - uint64_t buffer_should_be_time; - frame_to_local_time(timestamp, &buffer_should_be_time, conn); + // calculate if there is room in the decoded audio buffer... + int audio_decoded_buffer_below_desired_length = ((1.0 * player_buffer_occupancy * conn->frames_per_packet) / conn->input_rate) <= config.audio_decoded_buffer_desired_length; + uint64_t buffer_should_be_time; + + int have_valid_time = (frame_to_local_time(timestamp, &buffer_should_be_time, conn) == 0); + + // calculate the lead time to make sure it's not too early... + int64_t lead_time = buffer_should_be_time - get_absolute_time_in_ns(); + + if ((play_enabled != 0) && (have_valid_time != 0) && + (audio_decoded_buffer_below_desired_length != 0) && + (lead_time * 1E-9 < (config.audio_decoded_buffer_desired_length + 0.1))) { + + very_early_packets_signalled = 0; //reset very early packet warning signaller + // try to identify blocks that are timed to before the last buffer, and drop 'em int64_t time_from_last_buffer_time = buffer_should_be_time - previous_buffer_should_be_time; if ((packets_played_in_this_sequence == 0) || (time_from_last_buffer_time > 0)) { - int64_t lead_time = buffer_should_be_time - get_absolute_time_in_ns(); + payload_length = 0; if (ssrc_is_recognised(payload_ssrc) != 0) { // prepare_decoding_chain(conn, payload_ssrc); unsigned long long new_payload_length = 0; payload_pointer = m + leading_free_space_length; - if ((lead_time < (int64_t)30000000000L) && - (lead_time >= 0)) { // only decipher the packet if it's not too late or too early + if (lead_time >= 0) { // only decipher the packet if it's not too late int response = -1; // guess that there is a problem if (conn->session_key != NULL) { unsigned char nonce[12]; @@ -623,6 +635,11 @@ void *rtp_buffered_audio_processor(void *arg) { } new_audio_block_needed = 1; // the block has been used up and is no longer current } else { + if ((have_valid_time != 0) && (very_early_packets_signalled == 0) && (lead_time * 1E-9 > (config.audio_decoded_buffer_desired_length + 0.2))) { + debug(1, "incoming frame suddenly (?) has a lead time of %f seconds, with a desired decoded buffer length of %f.", 1.0 * lead_time * 1E-9, config.audio_decoded_buffer_desired_length); + very_early_packets_signalled = 1; + } + usleep(20000); // wait for a while } }