From f55ac43672d6cdaeb412b14964b7701b3d7de4b5 Mon Sep 17 00:00:00 2001 From: Seven Du Date: Thu, 23 Jul 2015 17:15:13 +0800 Subject: [PATCH] FS-7677 handle packet loss --- src/mod/applications/mod_av/avcodec.c | 31 ++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/mod/applications/mod_av/avcodec.c b/src/mod/applications/mod_av/avcodec.c index 4fc3cb20b7..44967bf347 100644 --- a/src/mod/applications/mod_av/avcodec.c +++ b/src/mod/applications/mod_av/avcodec.c @@ -182,6 +182,7 @@ typedef struct h264_codec_context_s { AVPacket encoder_avpacket; our_h264_nalu_t nalus[MAX_NALUS]; enum AVCodecID av_codec_id; + uint16_t last_seq; // last received frame->seq } h264_codec_context_t; static uint8_t ff_input_buffer_padding[FF_INPUT_BUFFER_PADDING_SIZE] = { 0 }; @@ -298,6 +299,7 @@ static switch_status_t buffer_h263_packets(h264_codec_context_t *context, switch uint8_t *data = frame->data; int header_len = 4; // Mode A, default h263_payload_header_t *h = (h263_payload_header_t *)data; + int delta = 0; if (h->f) { if (h->p) { @@ -309,11 +311,38 @@ static switch_status_t buffer_h263_packets(h264_codec_context_t *context, switch } #if 0 - if (h->i == 0) { + //emulate packet loss + static int z = 0; + if ((z++ % 200 == 0) && h->i) return SWITCH_STATUS_RESTART; +#endif + +#if 0 + if (h->i == 0 && frame->m) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Got a H263 Key Frame\n"); } #endif + delta = frame->seq - context->last_seq; + + if (delta > 1) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "packet loss? frame seq: %d last seq: %d, delta = %d\n", frame->seq, context->last_seq, delta); + if (delta > 2) { // wait for key frame + if (h->i) { + switch_set_flag(frame, SFF_WAIT_KEY_FRAME); + return SWITCH_STATUS_RESTART; + } else { // key frame + context->last_seq = frame->seq; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Received a H263 key frame after delta %d\n", delta); + } + } + // return SWITCH_STATUS_RESTART; + } else if (delta < 1) { + // probabaly stream changed + return SWITCH_STATUS_RESTART; + } else { // delta == 1 + context->last_seq = frame->seq; + } + if (0) { static char *h263_src[] = { "NONE",