diff --git a/lib/raop_rtp_mirror.c b/lib/raop_rtp_mirror.c index bae8911..fcac4bc 100644 --- a/lib/raop_rtp_mirror.c +++ b/lib/raop_rtp_mirror.c @@ -436,7 +436,7 @@ raop_rtp_mirror_thread(void *arg) #endif payload_decrypted = NULL; h264_decode_struct h264_data; - h264_data.pts = ntp_timestamp; + h264_data.ntp_time = ntp_timestamp; h264_data.nal_count = nalus_count; /*nal_count will be the number of nal units in the packet */ h264_data.data_len = payload_size; h264_data.data = payload_out; diff --git a/lib/stream.h b/lib/stream.h index c5e9186..834484c 100644 --- a/lib/stream.h +++ b/lib/stream.h @@ -22,7 +22,7 @@ typedef struct { int nal_count; unsigned char *data; int data_len; - uint64_t pts; + uint64_t ntp_time; } h264_decode_struct; typedef struct { diff --git a/renderers/audio_renderer_gstreamer.c b/renderers/audio_renderer_gstreamer.c index 7e0944b..ad73818 100644 --- a/renderers/audio_renderer_gstreamer.c +++ b/renderers/audio_renderer_gstreamer.c @@ -203,9 +203,10 @@ void audio_renderer_render_buffer(raop_ntp_t *ntp, unsigned char* data, int data * but is 0x80, 0x81 or 0x82: 0x100000(00,01,10) in ios9, ios10 devices * * first byte of AAC_LC should be 0xff (ADTS) (but has never been seen). */ - buffer = gst_buffer_new_and_alloc(data_len); + buffer = gst_buffer_new_allocate(NULL, data_len, NULL); g_assert(buffer != NULL); - GST_BUFFER_PTS(buffer) = (GstClockTime) ntp_time; + /* ntp_time is PTS given as UTC in usec */ + GST_BUFFER_PTS(buffer) = (GstClockTime) (ntp_time * 1000); gst_buffer_fill(buffer, 0, data, data_len); switch (renderer->ct){ case 8: /*AAC-ELD*/ diff --git a/renderers/video_renderer.h b/renderers/video_renderer.h index 15ad920..ce1033d 100644 --- a/renderers/video_renderer.h +++ b/renderers/video_renderer.h @@ -49,7 +49,7 @@ void video_renderer_init (logger_t *logger, const char *server_name, videoflip_t const char *decoder, const char *converter, const char *videosink, const bool *fullscreen); void video_renderer_start (); void video_renderer_stop (); -void video_renderer_render_buffer (raop_ntp_t *ntp, unsigned char* data, int data_len, uint64_t pts, int nal_count); +void video_renderer_render_buffer (raop_ntp_t *ntp, unsigned char* data, int data_len, uint64_t ntp_time, int nal_count); void video_renderer_flush (); unsigned int video_renderer_listen(void *loop); void video_renderer_destroy (); diff --git a/renderers/video_renderer_gstreamer.c b/renderers/video_renderer_gstreamer.c index 5b34ba1..24a9ec3 100644 --- a/renderers/video_renderer_gstreamer.c +++ b/renderers/video_renderer_gstreamer.c @@ -101,13 +101,14 @@ static logger_t *logger = NULL; static unsigned short width, height, width_source, height_source; /* not currently used */ static bool first_packet = false; -/* apple uses colorimetry=1:3:5:1 (not recognized by gstreamer v4l2) * +/* apple uses colorimetry=1:3:5:1 * + * (not recognized by v4l2 plugin in Gstreamer < 1.20.4) * * See .../gst-libs/gst/video/video-color.h in gst-plugins-base * * range = 1 -> GST_VIDEO_COLOR_RANGE_0_255 ("full RGB") * * matrix = 3 -> GST_VIDEO_COLOR_MATRIX_BT709 * * transfer = 5 -> GST_VIDEO_TRANSFER_BT709 * * primaries = 1 -> GST_VIDEO_COLOR_PRIMARIES_BT709 * - * closest is BT709, 2:3:5:1 with * + * closest used by GStreamer < 1.20.4 is BT709, 2:3:5:1 with * * * range = 2 -> GST_VIDEO_COLOR_RANGE_16_235 ("limited RGB") */ static const char h264_caps[]="video/x-h264,stream-format=(string)byte-stream,alignment=(string)au"; @@ -210,7 +211,7 @@ void video_renderer_start() { #endif } -void video_renderer_render_buffer(raop_ntp_t *ntp, unsigned char* data, int data_len, uint64_t pts, int nal_count) { +void video_renderer_render_buffer(raop_ntp_t *ntp, unsigned char* data, int data_len, uint64_t ntp_time, int nal_count) { GstBuffer *buffer; g_assert(data_len != 0); /* first four bytes of valid h264 video data are 0x00, 0x00, 0x00, 0x01. * @@ -224,9 +225,10 @@ void video_renderer_render_buffer(raop_ntp_t *ntp, unsigned char* data, int data logger_log(logger, LOGGER_INFO, "Begin streaming to GStreamer video pipeline"); first_packet = false; } - buffer = gst_buffer_new_and_alloc(data_len); + buffer = gst_buffer_new_allocate(NULL, data_len, NULL); g_assert(buffer != NULL); - GST_BUFFER_PTS(buffer) = (GstClockTime) pts; + /* ntp_time is PTS given as UTC in usec */ + GST_BUFFER_PTS(buffer) = (GstClockTime) (ntp_time * 1000); gst_buffer_fill(buffer, 0, data, data_len); gst_app_src_push_buffer (GST_APP_SRC(renderer->appsrc), buffer); #ifdef X_DISPLAY_FIX diff --git a/uxplay.cpp b/uxplay.cpp index 0b3e5d6..e162ee6 100644 --- a/uxplay.cpp +++ b/uxplay.cpp @@ -999,7 +999,7 @@ extern "C" void video_process (void *cls, raop_ntp_t *ntp, h264_decode_struct *d dump_video_to_file(data->data, data->data_len); } if (use_video) { - video_renderer_render_buffer(ntp, data->data, data->data_len, data->pts, data->nal_count); + video_renderer_render_buffer(ntp, data->data, data->data_len, data->ntp_time, data->nal_count); } }