if (!rtp->recv_buffer) {
/* If there is no receive buffer then we can pass back the frame directly */
- return ast_rtp_interpret(instance, srtp, &addr, read_area, res, prev_seqno);
+ frame = ast_rtp_interpret(instance, srtp, &addr, read_area, res, prev_seqno);
+ AST_LIST_INSERT_TAIL(&frames, frame, frame_list);
+ return AST_LIST_FIRST(&frames);
} else if (rtp->expectedrxseqno == -1 || seqno == rtp->expectedrxseqno) {
rtp->expectedrxseqno = seqno + 1;
* return it directly without duplicating it.
*/
if (!ast_data_buffer_count(rtp->recv_buffer)) {
- return ast_rtp_interpret(instance, srtp, &addr, read_area, res, prev_seqno);
+ frame = ast_rtp_interpret(instance, srtp, &addr, read_area, res, prev_seqno);
+ AST_LIST_INSERT_TAIL(&frames, frame, frame_list);
+ return AST_LIST_FIRST(&frames);
}
if (!AST_VECTOR_REMOVE_CMP_ORDERED(&rtp->missing_seqno, seqno, find_by_value,
* chance it will be overwritten.
*/
if (!ast_data_buffer_get(rtp->recv_buffer, seqno + 1)) {
- return ast_rtp_interpret(instance, srtp, &addr, read_area, res, prev_seqno);
+ frame = ast_rtp_interpret(instance, srtp, &addr, read_area, res, prev_seqno);
+ AST_LIST_INSERT_TAIL(&frames, frame, frame_list);
+ return AST_LIST_FIRST(&frames);
}
/* Otherwise we need to dupe the frame so that the potential processing of frames placed after
AST_VECTOR_RESET(&rtp->missing_seqno, AST_VECTOR_ELEM_CLEANUP_NOOP);
return AST_LIST_FIRST(&frames);
- } else if (seqno < rtp->expectedrxseqno) {
+ }
+
+ /* We're finished with the frames list */
+ ast_frame_free(AST_LIST_FIRST(&frames), 0);
+
+ if (seqno < rtp->expectedrxseqno) {
/* If this is a packet from the past then we have received a duplicate packet, so just drop it */
ast_debug(2, "Received an old packet with sequence number '%d' on RTP instance '%p', dropping it\n",
seqno, instance);
ast_rtcp_calculate_sr_rr_statistics(instance, rtcp_report, remote_address, ice, sr);
}
}
-
- return &ast_null_frame;
}
return &ast_null_frame;