diff --git a/src/formats/hevc_recv_normal.cc b/src/formats/hevc_recv_normal.cc index a571368..4750869 100644 --- a/src/formats/hevc_recv_normal.cc +++ b/src/formats/hevc_recv_normal.cc @@ -246,6 +246,12 @@ rtp_error_t __hevc_receiver(kvz_rtp::receiver *receiver) /* initialize new frame */ if (finfo.find(c_ts) == finfo.end()) { + /* make sure we haven't discarded the frame "c_ts" before */ + if (dropped.find(c_ts) != dropped.end()) { + LOG_WARN("packet belonging to a dropped frame was received!"); + continue; + } + /* when initializing a new frame, we need to keep twothings in mind: * 1) new intra frame will supersede older intra frame * 2) new inter fame is accepted only if current intra has been returned @@ -259,8 +265,10 @@ rtp_error_t __hevc_receiver(kvz_rtp::receiver *receiver) /* drop old intra if a new one is received */ if (nal_type == NT_INTRA) { - if (intra != INVALID_TS) + if (intra != INVALID_TS) { __drop_frame(finfo, intra); + dropped.insert(intra); + } intra = c_ts; } @@ -336,8 +344,10 @@ rtp_error_t __hevc_receiver(kvz_rtp::receiver *receiver) } if (__frame_late(finfo.at(c_ts))) { - if (nal_type != NT_INTRA || (nal_type == NT_INTRA && !enable_idelay)) + if (nal_type != NT_INTRA || (nal_type == NT_INTRA && !enable_idelay)) { __drop_frame(finfo, c_ts); + dropped.insert(c_ts); + } } } while (ret == RTP_OK); }