Use SeqNum Arithmetic in Video Receiver

This commit is contained in:
Florian Märkl 2019-06-12 18:10:55 +02:00
commit 6ca1a80758
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
2 changed files with 12 additions and 10 deletions

View file

@ -22,6 +22,7 @@
#include "thread.h" #include "thread.h"
#include "log.h" #include "log.h"
#include "gkcrypt.h" #include "gkcrypt.h"
#include "seqnum.h"
#include <netinet/in.h> #include <netinet/in.h>
#include <stdbool.h> #include <stdbool.h>
@ -71,11 +72,11 @@ typedef struct chiaki_takion_t
typedef struct chiaki_takion_av_packet_t typedef struct chiaki_takion_av_packet_t
{ {
uint16_t packet_index; ChiakiSeqNum16 packet_index;
uint16_t frame_index; ChiakiSeqNum16 frame_index;
bool uses_nalu_info_structs; bool uses_nalu_info_structs;
bool is_video; bool is_video;
uint16_t unit_index; ChiakiSeqNum16 unit_index;
uint16_t units_in_frame_total; // regular + units_in_frame_additional uint16_t units_in_frame_total; // regular + units_in_frame_additional
uint16_t units_in_frame_additional; uint16_t units_in_frame_additional;
uint32_t codec; uint32_t codec;

View file

@ -63,9 +63,9 @@ CHIAKI_EXPORT void chiaki_video_receiver_stream_info(ChiakiVideoReceiver *video_
CHIAKI_EXPORT void chiaki_video_receiver_av_packet(ChiakiVideoReceiver *video_receiver, ChiakiTakionAVPacket *packet) CHIAKI_EXPORT void chiaki_video_receiver_av_packet(ChiakiVideoReceiver *video_receiver, ChiakiTakionAVPacket *packet)
{ {
// TODO: roll over ChiakiSeqNum16 frame_index = packet->frame_index;
int32_t frame_index = (int32_t)packet->frame_index; if(video_receiver->frame_index_cur >= 0
if(frame_index < video_receiver->frame_index_cur) && chiaki_seq_num_16_gt(frame_index, (ChiakiSeqNum16)video_receiver->frame_index_cur))
{ {
CHIAKI_LOGW(video_receiver->log, "Video Receiver received old frame packet\n"); CHIAKI_LOGW(video_receiver->log, "Video Receiver received old frame packet\n");
return; return;
@ -88,9 +88,10 @@ CHIAKI_EXPORT void chiaki_video_receiver_av_packet(ChiakiVideoReceiver *video_re
video_receiver->session->video_sample_cb(profile->header, profile->header_sz, video_receiver->session->video_sample_cb_user); video_receiver->session->video_sample_cb(profile->header, profile->header_sz, video_receiver->session->video_sample_cb_user);
} }
if(frame_index > video_receiver->frame_index_cur) if(video_receiver->frame_index_cur < 0 ||
chiaki_seq_num_16_gt(frame_index, (ChiakiSeqNum16)video_receiver->frame_index_cur))
{ {
if(video_receiver->frame_index_prev != video_receiver->frame_index_cur) if(video_receiver->frame_index_cur >= 0 && video_receiver->frame_index_prev != video_receiver->frame_index_cur)
{ {
uint8_t *frame; uint8_t *frame;
size_t frame_size; size_t frame_size;
@ -110,8 +111,8 @@ CHIAKI_EXPORT void chiaki_video_receiver_av_packet(ChiakiVideoReceiver *video_re
video_receiver->frame_index_prev = video_receiver->frame_index_cur; video_receiver->frame_index_prev = video_receiver->frame_index_cur;
} }
if(frame_index > video_receiver->frame_index_cur + 1 if(chiaki_seq_num_16_gt(frame_index, (ChiakiSeqNum16)video_receiver->frame_index_cur + 1)
&& !(frame_index == 1 && video_receiver->frame_index_cur == -1)) // ok for frame 1 && !(frame_index == 1 && video_receiver->frame_index_cur < 0)) // ok for frame 1
{ {
CHIAKI_LOGW(video_receiver->log, "Skipped from frame %d to %d\n", (int)video_receiver->frame_index_cur, (int)frame_index); CHIAKI_LOGW(video_receiver->log, "Skipped from frame %d to %d\n", (int)video_receiver->frame_index_cur, (int)frame_index);
// TODO: fake frame? // TODO: fake frame?