mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-30 19:18:31 +00:00
decklinkvideo/audiosrc: Add GstReferenceTimestampMeta with the stream time to each buffer
This is basically a frame counter provided by the driver and it's advancing at the speed of the HDMI/SDI input. Having this available on each buffer allows to know what constant-framerate-based timestamp each frame is corresponding to and can be used e.g. to write out files accordingly without having the local pipeline clock timestamps used. https://bugzilla.gnome.org/show_bug.cgi?id=779213
This commit is contained in:
parent
129bee3d02
commit
d5684d5b14
2 changed files with 17 additions and 0 deletions
|
@ -61,6 +61,7 @@ typedef struct
|
||||||
{
|
{
|
||||||
IDeckLinkAudioInputPacket *packet;
|
IDeckLinkAudioInputPacket *packet;
|
||||||
GstClockTime timestamp;
|
GstClockTime timestamp;
|
||||||
|
GstClockTime stream_timestamp;
|
||||||
gboolean no_signal;
|
gboolean no_signal;
|
||||||
} CapturePacket;
|
} CapturePacket;
|
||||||
|
|
||||||
|
@ -531,6 +532,7 @@ gst_decklink_audio_src_got_packet (GstElement * element,
|
||||||
memset (&p, 0, sizeof (p));
|
memset (&p, 0, sizeof (p));
|
||||||
p.packet = packet;
|
p.packet = packet;
|
||||||
p.timestamp = timestamp;
|
p.timestamp = timestamp;
|
||||||
|
p.stream_timestamp = packet_time;
|
||||||
p.no_signal = no_signal;
|
p.no_signal = no_signal;
|
||||||
packet->AddRef ();
|
packet->AddRef ();
|
||||||
gst_queue_array_push_tail_struct (self->current_packets, &p);
|
gst_queue_array_push_tail_struct (self->current_packets, &p);
|
||||||
|
@ -553,6 +555,8 @@ gst_decklink_audio_src_create (GstPushSrc * bsrc, GstBuffer ** buffer)
|
||||||
GstClockTime start_time, end_time;
|
GstClockTime start_time, end_time;
|
||||||
guint64 start_offset, end_offset;
|
guint64 start_offset, end_offset;
|
||||||
gboolean discont = FALSE;
|
gboolean discont = FALSE;
|
||||||
|
static GstStaticCaps stream_reference =
|
||||||
|
GST_STATIC_CAPS ("timestamp/x-stream");
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
g_mutex_lock (&self->lock);
|
g_mutex_lock (&self->lock);
|
||||||
|
@ -667,6 +671,10 @@ retry:
|
||||||
GST_BUFFER_TIMESTAMP (*buffer) = timestamp;
|
GST_BUFFER_TIMESTAMP (*buffer) = timestamp;
|
||||||
GST_BUFFER_DURATION (*buffer) = duration;
|
GST_BUFFER_DURATION (*buffer) = duration;
|
||||||
|
|
||||||
|
gst_buffer_add_reference_timestamp_meta (*buffer,
|
||||||
|
gst_static_caps_get (&stream_reference), p->stream_timestamp,
|
||||||
|
end_time - start_time);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (self,
|
GST_DEBUG_OBJECT (self,
|
||||||
"Outputting buffer %p with timestamp %" GST_TIME_FORMAT " and duration %"
|
"Outputting buffer %p with timestamp %" GST_TIME_FORMAT " and duration %"
|
||||||
GST_TIME_FORMAT, *buffer, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (*buffer)),
|
GST_TIME_FORMAT, *buffer, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (*buffer)),
|
||||||
|
|
|
@ -55,6 +55,8 @@ typedef struct
|
||||||
{
|
{
|
||||||
IDeckLinkVideoInputFrame *frame;
|
IDeckLinkVideoInputFrame *frame;
|
||||||
GstClockTime timestamp, duration;
|
GstClockTime timestamp, duration;
|
||||||
|
GstClockTime stream_timestamp;
|
||||||
|
GstClockTime stream_duration;
|
||||||
GstDecklinkModeEnum mode;
|
GstDecklinkModeEnum mode;
|
||||||
BMDPixelFormat format;
|
BMDPixelFormat format;
|
||||||
GstVideoTimeCode *tc;
|
GstVideoTimeCode *tc;
|
||||||
|
@ -684,6 +686,8 @@ gst_decklink_video_src_got_frame (GstElement * element,
|
||||||
f.frame = frame;
|
f.frame = frame;
|
||||||
f.timestamp = timestamp;
|
f.timestamp = timestamp;
|
||||||
f.duration = duration;
|
f.duration = duration;
|
||||||
|
f.stream_timestamp = stream_time;
|
||||||
|
f.stream_duration = stream_duration;
|
||||||
f.mode = mode;
|
f.mode = mode;
|
||||||
f.format = frame->GetPixelFormat ();
|
f.format = frame->GetPixelFormat ();
|
||||||
f.no_signal = no_signal;
|
f.no_signal = no_signal;
|
||||||
|
@ -743,6 +747,8 @@ gst_decklink_video_src_create (GstPushSrc * bsrc, GstBuffer ** buffer)
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
gboolean caps_changed = FALSE;
|
gboolean caps_changed = FALSE;
|
||||||
const GstDecklinkMode *mode;
|
const GstDecklinkMode *mode;
|
||||||
|
static GstStaticCaps stream_reference =
|
||||||
|
GST_STATIC_CAPS ("timestamp/x-stream");
|
||||||
|
|
||||||
g_mutex_lock (&self->lock);
|
g_mutex_lock (&self->lock);
|
||||||
while (gst_queue_array_is_empty (self->current_frames) && !self->flushing) {
|
while (gst_queue_array_is_empty (self->current_frames) && !self->flushing) {
|
||||||
|
@ -840,6 +846,9 @@ gst_decklink_video_src_create (GstPushSrc * bsrc, GstBuffer ** buffer)
|
||||||
GST_BUFFER_DURATION (*buffer) = f.duration;
|
GST_BUFFER_DURATION (*buffer) = f.duration;
|
||||||
if (f.tc != NULL)
|
if (f.tc != NULL)
|
||||||
gst_buffer_add_video_time_code_meta (*buffer, f.tc);
|
gst_buffer_add_video_time_code_meta (*buffer, f.tc);
|
||||||
|
gst_buffer_add_reference_timestamp_meta (*buffer,
|
||||||
|
gst_static_caps_get (&stream_reference), f.stream_timestamp,
|
||||||
|
f.stream_duration);
|
||||||
|
|
||||||
mode = gst_decklink_get_mode (self->mode);
|
mode = gst_decklink_get_mode (self->mode);
|
||||||
if (mode->interlaced && mode->tff)
|
if (mode->interlaced && mode->tff)
|
||||||
|
|
Loading…
Reference in a new issue