|
|
|
@@ -1,6 +1,9 @@ |
|
|
|
#include "listener_mediaclock.h" |
|
|
|
extern int errno; |
|
|
|
|
|
|
|
static uint64_t last_packet_time_ns = 0; |
|
|
|
|
|
|
|
|
|
|
|
int create_avb_Mediaclock_Listener( FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc, char* avb_dev_name, |
|
|
|
char* stream_id, char* destination_mac, |
|
|
|
struct sockaddr_in **si_other_avb, struct pollfd **avtp_transport_socket_fds) |
|
|
|
@@ -101,18 +104,28 @@ uint64_t mediaclock_listener_wait_recv_ts( FILE* filepointer, ieee1722_avtp_driv |
|
|
|
((*ieee1722mc)->streamid8[7] == (uint8_t) stream_packet[25]) |
|
|
|
){ |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
* |
|
|
|
* 6 or less samples per packet? => |
|
|
|
* |
|
|
|
*/ |
|
|
|
int samples_in_packet = 0; |
|
|
|
uint64_t adjust_packet_time_ns = 0; |
|
|
|
uint64_t packet_arrival_time_ns = 0; |
|
|
|
uint64_t ipg_to_last_packet_ns = 0; |
|
|
|
|
|
|
|
int bytes_per_stereo_channel = 12 /*CHANNEL_COUNT_STEREO * AVTP_SAMPLES_PER_CHANNEL_PER_PACKET = 2*6 */ * sizeof(uint32_t); |
|
|
|
int avtp_hdr_len = ETHERNET_HDR_LENGTH + 32 /*AVB_HEADER_LENGTH*/; |
|
|
|
|
|
|
|
struct timeval sys_time; |
|
|
|
|
|
|
|
if (clock_gettime(CLOCK_REALTIME, &sys_time)) { |
|
|
|
fprintf(filepointer, " Clockrealtime Error\n");fflush(filepointer); |
|
|
|
} |
|
|
|
packet_arrival_time_ns = (sys_time.tv_sec*1000000000LL + sys_time.tv_usec*1000); |
|
|
|
ipg_to_last_packet_ns = packet_arrival_time_ns - last_packet_time_ns; |
|
|
|
last_packet_time_ns = packet_arrival_time_ns; |
|
|
|
|
|
|
|
/* |
|
|
|
* |
|
|
|
* 6 or less samples per packet? => |
|
|
|
* |
|
|
|
*/ |
|
|
|
for( int s = avtp_hdr_len; s < avtp_hdr_len + bytes_per_stereo_channel; s += sizeof(uint32_t) ){ |
|
|
|
|
|
|
|
if(stream_packet[ s ] != 0x00){ |
|
|
|
@@ -124,10 +137,7 @@ uint64_t mediaclock_listener_wait_recv_ts( FILE* filepointer, ieee1722_avtp_driv |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if( samples_in_packet < 6 ){ |
|
|
|
if( samples_in_packet < 6){ |
|
|
|
adjust_packet_time_ns = samples_in_packet / ieee1722mc->sample_rate * 1000000000; |
|
|
|
} |
|
|
|
|
|
|
|
@@ -154,14 +164,9 @@ uint64_t mediaclock_listener_wait_recv_ts( FILE* filepointer, ieee1722_avtp_driv |
|
|
|
// } |
|
|
|
// } |
|
|
|
|
|
|
|
/* inaccurate */ |
|
|
|
struct timeval sys_time; |
|
|
|
|
|
|
|
if (clock_gettime(CLOCK_REALTIME, &sys_time)) { |
|
|
|
fprintf(filepointer, " Clockrealtime Error\n");fflush(filepointer); |
|
|
|
} |
|
|
|
|
|
|
|
return (uint64_t)(sys_time.tv_usec * 1000) - adjust_packet_time_ns; |
|
|
|
return ipg_to_last_packet_ns - adjust_packet_time_ns; |
|
|
|
} |
|
|
|
return -1; |
|
|
|
|
|
|
|
@@ -188,12 +193,6 @@ uint64_t mediaclock_listener_wait_recv( FILE* filepointer, ieee1722_avtp_driver_ |
|
|
|
((*ieee1722mc)->streamid8[6] == (uint8_t) stream_packet[24]) && |
|
|
|
((*ieee1722mc)->streamid8[7] == (uint8_t) stream_packet[25]) |
|
|
|
){ |
|
|
|
/* inaccurate */ |
|
|
|
struct timeval sys_time; |
|
|
|
|
|
|
|
if (clock_gettime(CLOCK_REALTIME, &sys_time)) { |
|
|
|
fprintf(filepointer, " Clockrealtime Error\n");fflush(filepointer); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
@@ -201,9 +200,40 @@ uint64_t mediaclock_listener_wait_recv( FILE* filepointer, ieee1722_avtp_driver_ |
|
|
|
* 6 or less samples per packet? => |
|
|
|
* |
|
|
|
*/ |
|
|
|
int samples_in_packet = 0; |
|
|
|
uint64_t adjust_packet_time_ns = 0; |
|
|
|
|
|
|
|
int bytes_per_stereo_channel = 12 /*CHANNEL_COUNT_STEREO * AVTP_SAMPLES_PER_CHANNEL_PER_PACKET = 2*6 */ * sizeof(uint32_t); |
|
|
|
int avtp_hdr_len = ETHERNET_HDR_LENGTH + 32 /*AVB_HEADER_LENGTH*/; |
|
|
|
|
|
|
|
for( int s = avtp_hdr_len; s < avtp_hdr_len + bytes_per_stereo_channel; s += sizeof(uint32_t) ){ |
|
|
|
|
|
|
|
if(stream_packet[ s ] != 0x00){ |
|
|
|
// fprintf(filepointer, "avb sample %d %x %x %x %x \n", s, avb_packet[ s ], |
|
|
|
// avb_packet[ s + 1 ], |
|
|
|
// avb_packet[ s + 2 ], |
|
|
|
// avb_packet[ s + 3 ] );fflush(filepointer); |
|
|
|
samples_in_packet++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return (uint64_t)(sys_time.tv_usec * 1000); |
|
|
|
|
|
|
|
|
|
|
|
if( samples_in_packet < 6 ){ |
|
|
|
adjust_packet_time_ns = samples_in_packet / ieee1722mc->sample_rate * 1000000000; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* inaccurate */ |
|
|
|
struct timeval sys_time; |
|
|
|
|
|
|
|
if (clock_gettime(CLOCK_REALTIME, &sys_time)) { |
|
|
|
fprintf(filepointer, " Clockrealtime Error\n");fflush(filepointer); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return (uint64_t)(sys_time.tv_usec * 1000) - adjust_packet_time_ns; |
|
|
|
} |
|
|
|
} |
|
|
|
return -1; |
|
|
|
@@ -233,6 +263,36 @@ uint64_t mediaclock_listener_poll_recv( FILE* filepointer, ieee1722_avtp_driver_ |
|
|
|
((*ieee1722mc)->streamid8[6] == (uint8_t) stream_packet[24]) && |
|
|
|
((*ieee1722mc)->streamid8[7] == (uint8_t) stream_packet[25]) |
|
|
|
){ |
|
|
|
/* |
|
|
|
* |
|
|
|
* 6 or less samples per packet? => |
|
|
|
* |
|
|
|
*/ |
|
|
|
int samples_in_packet = 0; |
|
|
|
uint64_t adjust_packet_time_ns = 0; |
|
|
|
|
|
|
|
int bytes_per_stereo_channel = 12 /*CHANNEL_COUNT_STEREO * AVTP_SAMPLES_PER_CHANNEL_PER_PACKET = 2*6 */ * sizeof(uint32_t); |
|
|
|
int avtp_hdr_len = ETHERNET_HDR_LENGTH + 32 /*AVB_HEADER_LENGTH*/; |
|
|
|
|
|
|
|
for( int s = avtp_hdr_len; s < avtp_hdr_len + bytes_per_stereo_channel; s += sizeof(uint32_t) ){ |
|
|
|
|
|
|
|
if(stream_packet[ s ] != 0x00){ |
|
|
|
// fprintf(filepointer, "avb sample %d %x %x %x %x \n", s, avb_packet[ s ], |
|
|
|
// avb_packet[ s + 1 ], |
|
|
|
// avb_packet[ s + 2 ], |
|
|
|
// avb_packet[ s + 3 ] );fflush(filepointer); |
|
|
|
samples_in_packet++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if( samples_in_packet < 6 ){ |
|
|
|
adjust_packet_time_ns = samples_in_packet / ieee1722mc->sample_rate * 1000000000; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* inaccurate */ |
|
|
|
struct timeval sys_time; |
|
|
|
|
|
|
|
@@ -240,7 +300,7 @@ uint64_t mediaclock_listener_poll_recv( FILE* filepointer, ieee1722_avtp_driver_ |
|
|
|
fprintf(filepointer, " Clockrealtime Error\n");fflush(filepointer); |
|
|
|
} |
|
|
|
|
|
|
|
return (uint64_t)(sys_time.tv_usec * 1000); |
|
|
|
return (uint64_t)(sys_time.tv_usec * 1000) - adjust_packet_time_ns; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|