diff --git a/cmd/v1_camera_pipeline_ifdef.c b/cmd/v1_camera_pipeline_ifdef.c index 00b8789..0cd1ad7 100644 --- a/cmd/v1_camera_pipeline_ifdef.c +++ b/cmd/v1_camera_pipeline_ifdef.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -56,7 +57,7 @@ typedef struct } VideoSender; static int video_sender_init(VideoSender *sender); -static int video_sender_send_packet(VideoSender *sender, const AVPacket *encoded_pkt); +static int video_sender_send_packet(VideoSender *sender, const AVPacket *encoded_pkt, uint64_t timestamp); static void video_sender_close(VideoSender *sender); typedef struct @@ -72,6 +73,13 @@ double get_time_ms() return ts.tv_sec * 1000.0 + ts.tv_nsec / 1000000.0; } +int64_t get_realtime_ms() +{ + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + return (int64_t)ts.tv_sec * 1000 + ts.tv_nsec / 1000000; +} + static const char *env_or_default(const char *name, const char *fallback) { const char *value = getenv(name); @@ -127,18 +135,41 @@ static int video_sender_init(VideoSender *sender) return 0; } -static int video_sender_send_packet(VideoSender *sender, const AVPacket *encoded_pkt) +static int video_sender_send_packet(VideoSender *sender, const AVPacket *encoded_pkt, uint64_t timestamp) { + uint8_t *senddata; + size_t payload_len; + int rc; + if (sender == NULL || sender->client == NULL || encoded_pkt == NULL) { errno = EINVAL; return -1; } - return kcp_client_send_binary( + if (encoded_pkt->size < 0) + { + errno = EINVAL; + return -1; + } + + payload_len = (size_t)encoded_pkt->size + sizeof(timestamp); + senddata = (uint8_t *)malloc(payload_len); + if (senddata == NULL) + { + errno = ENOMEM; + return -1; + } + + memcpy(senddata, encoded_pkt->data, (size_t)encoded_pkt->size); + memcpy(senddata + encoded_pkt->size, ×tamp, sizeof(timestamp)); + + rc = kcp_client_send_binary( sender->client, sender->target_peer, - encoded_pkt->data, - (size_t)encoded_pkt->size); + senddata, + payload_len); + free(senddata); + return rc; } static void video_sender_close(VideoSender *sender) @@ -478,7 +509,7 @@ int main() PRINT_TIME("Frame | Capture | Decode | Scale | Encode | Total | Size | Marker\n"); PRINT_TIME("------|---------|--------|-------|--------|-------|------|--------\n"); - for (int i = 0; i < 100; i++) + for (int i = 0; i < 10000; i++) { // 只有在开启 DEBUG_TIMING 时才声明这些时间变量 #ifdef DEBUG_TIMING @@ -605,8 +636,12 @@ int main() // 如果不开启宏,也打印一些基本信息 printf("Frame %d processed\n", i + 1); #endif - - if (encoded_pkt && video_sender_send_packet(&sender, encoded_pkt) != 0) + int64_t unixtime_ms; + if (encoded_pkt) + { + unixtime_ms = get_realtime_ms(); + } + if (encoded_pkt && video_sender_send_packet(&sender, encoded_pkt, unixtime_ms) != 0) { perror("video_sender_send_packet"); av_frame_free(&decoded_frame);