fix: 对接GPS数据

This commit is contained in:
nnbcccscdscdsc
2026-04-11 12:15:27 +08:00
parent 84e0cc54d2
commit 757e6da2b2
5 changed files with 314 additions and 7 deletions

View File

@@ -621,24 +621,28 @@ static int video_sender_drain_pending_messages(video_sender_t *sender) {
}
}
static int video_sender_send_packet(video_sender_t *sender, const AVPacket *encoded_pkt, uint64_t timestamp) {
static int video_sender_send_packet(
video_sender_t *sender,
const AVPacket *encoded_pkt,
const video_pipeline_packet_metadata_t *metadata
) {
uint8_t *payload;
size_t payload_len;
int rc;
if (sender == NULL || sender->client == NULL || encoded_pkt == NULL) {
if (sender == NULL || sender->client == NULL || encoded_pkt == NULL || metadata == NULL) {
errno = EINVAL;
return -1;
}
payload_len = (size_t) encoded_pkt->size + sizeof(timestamp);
payload_len = (size_t) encoded_pkt->size + sizeof(*metadata);
if (video_sender_ensure_buffer_capacity(sender, payload_len) != 0) {
return -1;
}
payload = sender->send_buffer;
memcpy(payload, encoded_pkt->data, (size_t) encoded_pkt->size);
memcpy(payload + encoded_pkt->size, &timestamp, sizeof(timestamp));
memcpy(payload + encoded_pkt->size, metadata, sizeof(*metadata));
rc = kcp_client_send_binary(sender->client, sender->target_peer, payload, payload_len);
if (rc != 0) {
return rc;
@@ -837,9 +841,11 @@ int video_pipeline_run(const video_pipeline_config_t *config, video_pipeline_sta
double encode_end_ms = 0.0;
double send_start_ms = 0.0;
double send_end_ms = 0.0;
video_pipeline_packet_metadata_t packet_metadata;
int frame_number = frame_index + 1;
memset(&transport_stats, 0, sizeof(transport_stats));
memset(&packet_metadata, 0, sizeof(packet_metadata));
if (config->max_frames > 0 && frame_index >= config->max_frames) {
break;
@@ -924,6 +930,9 @@ int video_pipeline_run(const video_pipeline_config_t *config, video_pipeline_sta
send_start_ms = encode_end_ms;
}
packet_metadata.timestamp_ms = (uint64_t) get_realtime_ms();
packet_metadata.gps_data = get_latest_gps_for_video();
kcp_client_runtime_stats_snapshot(sender.client, &transport_stats);
if (video_sender_hard_backpressure_active(config, &transport_stats)) {
uint32_t now_ms = omni_now_millis32();
@@ -1002,7 +1011,7 @@ int video_pipeline_run(const video_pipeline_config_t *config, video_pipeline_sta
continue;
}
if (video_sender_send_packet(&sender, encoded_pkt, (uint64_t) get_realtime_ms()) != 0) {
if (video_sender_send_packet(&sender, encoded_pkt, &packet_metadata) != 0) {
pthread_mutex_lock(&stats->mutex);
stats->send_errors += 1;
pthread_mutex_unlock(&stats->mutex);