Browse Source

num_packets_per_period and latency calc w/o SO_TIMESTAMPING, packet_time_adjustment for less than 6 samples

pull/450/head
Christoph Kuhr 7 years ago
parent
commit
5a0adfb0c1
5 changed files with 66 additions and 18 deletions
  1. +9
    -3
      linux/avb/JackAVBDriver.cpp
  2. +3
    -3
      linux/avb/avb_1722avtp.c
  3. +3
    -3
      linux/avb/avb_1722avtp.h
  4. +48
    -6
      linux/avb/listener_mediaclock.c
  5. +3
    -3
      linux/avb/listener_mediaclock.h

+ 9
- 3
linux/avb/JackAVBDriver.cpp View File

@@ -175,11 +175,17 @@ int JackAVBPDriver::Read()
int ret = 0;
JSList *node = ieee1722mc.capture_ports;

num_packets_even_odd ? num_packets_even_odd = 0 : num_packets_even_odd = 1; // even = 0, odd = 1
int num_packets = (int)( ieee1722mc->period_size / 6 ) + num_packets_even_odd;

/*
*
* Even Odd Calc will cause xruns. cumulative_delay_ns must be calculated sample accurate in mediaclock listener
*
*/
//num_packets_even_odd ? num_packets_even_odd = 0 : num_packets_even_odd = 1; // even = 0, odd = 1
int num_packets = (int)( ieee1722mc->period_size / 6 ) + 1; // + num_packets_even_odd;

int cumulative_delay_ns = 0;

uint64_t cumulative_delay_ns = 0;
for(int n=0; n<num_packets; n++){
cumulative_delay_ns += wait_recv_1722_mediaclockstream( &ieee1722mc );
}


+ 3
- 3
linux/avb/avb_1722avtp.c View File

@@ -520,17 +520,17 @@ int startup_1722_driver( ieee1722_avtp_driver_state_t *ieee1722mc )
}
}

int poll_recv_1722_mediaclockstream( ieee1722_avtp_driver_state_t *ieee1722mc )
uint64_t poll_recv_1722_mediaclockstream( ieee1722_avtp_driver_state_t *ieee1722mc )
{
return mediaclock_listener_poll_recv( filepointer, &ieee1722mc, &si_other_avb, &avtp_transport_socket_fds );
}

int wait_recv_1722_mediaclockstream( ieee1722_avtp_driver_state_t *ieee1722mc )
uint64_t wait_recv_1722_mediaclockstream( ieee1722_avtp_driver_state_t *ieee1722mc )
{
return mediaclock_listener_wait_recv( filepointer, &ieee1722mc, &si_other_avb, &avtp_transport_socket_fds );
}

int wait_recv_ts_1722_mediaclockstream( ieee1722_avtp_driver_state_t *ieee1722mc )
uint64_t wait_recv_ts_1722_mediaclockstream( ieee1722_avtp_driver_state_t *ieee1722mc )
{
return mediaclock_listener_wait_recv_ts( filepointer, &ieee1722mc, &si_other_avb, &avtp_transport_socket_fds );
}


+ 3
- 3
linux/avb/avb_1722avtp.h View File

@@ -47,9 +47,9 @@ int init_1722_driver( ieee1722_avtp_driver_state_t *ieee1722mc, const char* na
char* stream_id, char* destination_mac,
int sample_rate, int period_size, int num_periods);
int startup_1722_driver( ieee1722_avtp_driver_state_t *ieee1722mc);
int poll_recv_1722_mediaclockstream( ieee1722_avtp_driver_state_t *ieee1722mc );
int wait_recv_1722_mediaclockstream( ieee1722_avtp_driver_state_t *ieee1722mc );
int wait_recv_ts_1722_mediaclockstream( ieee1722_avtp_driver_state_t *ieee1722mc );
uint64_t poll_recv_1722_mediaclockstream( ieee1722_avtp_driver_state_t *ieee1722mc );
uint64_t wait_recv_1722_mediaclockstream( ieee1722_avtp_driver_state_t *ieee1722mc );
uint64_t wait_recv_ts_1722_mediaclockstream( ieee1722_avtp_driver_state_t *ieee1722mc );
int shutdown_1722_driver( ieee1722_avtp_driver_state_t *ieee1722mc);




+ 48
- 6
linux/avb/listener_mediaclock.c View File

@@ -45,7 +45,7 @@ void delete_avb_Mediaclock_Listener( FILE* filepointer, ieee1722_avtp_driver_sta
{
}

int mediaclock_listener_wait_recv_ts( FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc, struct sockaddr_in **si_other_avb, struct pollfd **avtp_transport_socket_fds )
uint64_t mediaclock_listener_wait_recv_ts( FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc, struct sockaddr_in **si_other_avb, struct pollfd **avtp_transport_socket_fds )
{
socklen_t slen_avb = sizeof(struct sockaddr_in);
char stream_packet[BUFLEN];
@@ -100,6 +100,40 @@ int mediaclock_listener_wait_recv_ts( FILE* filepointer, ieee1722_avtp_driver_st
((*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;
}




// struct cmsghdr *cmsg = (struct cmsghdr *)malloc(sizeof(struct cmsghdr));
// cmsg = CMSG_FIRSTHDR(&msg);
// fprintf(filepointer, "stream packet! %d %d %d\n", cmsg->cmsg_len, cmsg->cmsg_level, cmsg->cmsg_type);fflush(filepointer);
@@ -127,13 +161,13 @@ int mediaclock_listener_wait_recv_ts( FILE* filepointer, ieee1722_avtp_driver_st
fprintf(filepointer, " Clockrealtime Error\n");fflush(filepointer);
}

return (int)(sys_time.tv_usec * 1000);
return (uint64_t)(sys_time.tv_usec * 1000) - adjust_packet_time_ns;
}
return -1;

}

uint mediaclock_listener_wait_recv( FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc, struct sockaddr_in **si_other_avb, struct pollfd **avtp_transport_socket_fds )
uint64_t mediaclock_listener_wait_recv( FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc, struct sockaddr_in **si_other_avb, struct pollfd **avtp_transport_socket_fds )
{
int recv_len=0;
int rc;
@@ -161,14 +195,22 @@ uint mediaclock_listener_wait_recv( FILE* filepointer, ieee1722_avtp_driver_stat
fprintf(filepointer, " Clockrealtime Error\n");fflush(filepointer);
}

return (int)(sys_time.tv_usec * 1000);

/*
*
* 6 or less samples per packet? =>
*
*/


return (uint64_t)(sys_time.tv_usec * 1000);
}
}
return -1;

}

int mediaclock_listener_poll_recv( FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc, struct sockaddr_in **si_other_avb, struct pollfd **avtp_transport_socket_fds )
uint64_t mediaclock_listener_poll_recv( FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc, struct sockaddr_in **si_other_avb, struct pollfd **avtp_transport_socket_fds )
{
int recv_len=0;
int rc;
@@ -198,7 +240,7 @@ int mediaclock_listener_poll_recv( FILE* filepointer, ieee1722_avtp_driver_state
fprintf(filepointer, " Clockrealtime Error\n");fflush(filepointer);
}

return (int)(sys_time.tv_usec * 1000);
return (uint64_t)(sys_time.tv_usec * 1000);
}
}
}


+ 3
- 3
linux/avb/listener_mediaclock.h View File

@@ -43,13 +43,13 @@ int create_avb_Mediaclock_Listener( FILE* filepointer, ieee1722_avtp_driver_stat
struct sockaddr_in **si_other_avb, struct pollfd **avtp_transport_socket_fds);
void delete_avb_Mediaclock_Listener( FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc);

int mediaclock_listener_wait_recv_ts( FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc,
uint64_t mediaclock_listener_wait_recv_ts( FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc,
struct sockaddr_in **si_other_avb, struct pollfd **avtp_transport_socket_fds );

int mediaclock_listener_wait_recv( FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc,
uint64_t mediaclock_listener_wait_recv( FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc,
struct sockaddr_in **si_other_avb, struct pollfd **avtp_transport_socket_fds );

int mediaclock_listener_poll_recv( FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc,
uint64_t mediaclock_listener_poll_recv( FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc,
struct sockaddr_in **si_other_avb, struct pollfd **avtp_transport_socket_fds );

#ifdef __cplusplus


Loading…
Cancel
Save