diff options
author | Edward Hervey <bilboed@bilboed.com> | 2018-02-15 18:06:45 +0100 |
---|---|---|
committer | Edward Hervey <bilboed@bilboed.com> | 2018-03-06 14:47:02 +0100 |
commit | 29f58d9db05b4008478252b41c0c17d6fd39b037 (patch) | |
tree | 26b0f12dad2a632af8555e5d4c91199d565b424d | |
parent | fd3bb4403164d3ef03759401e9fbd4661c636ca0 (diff) |
WIP decklink ANC support
-rw-r--r-- | sys/decklink/gstdecklink.cpp | 14 | ||||
-rw-r--r-- | sys/decklink/gstdecklink.h | 1 | ||||
-rw-r--r-- | sys/decklink/gstdecklinkvideosink.cpp | 7 | ||||
-rw-r--r-- | sys/decklink/gstdecklinkvideosrc.cpp | 46 |
4 files changed, 60 insertions, 8 deletions
diff --git a/sys/decklink/gstdecklink.cpp b/sys/decklink/gstdecklink.cpp index e1f91ba25..18dc03878 100644 --- a/sys/decklink/gstdecklink.cpp +++ b/sys/decklink/gstdecklink.cpp @@ -462,6 +462,20 @@ gst_decklink_type_from_video_format (GstVideoFormat f) return GST_DECKLINK_VIDEO_FORMAT_AUTO; } +GstVideoFormat +gst_decklink_video_format_from_type (BMDPixelFormat pf) +{ + guint i; + + for (i = 1; i < G_N_ELEMENTS (formats); i++) { + if (formats[i].format == pf) + return formats[i].vformat; + } + g_assert_not_reached (); + return GST_VIDEO_FORMAT_UNKNOWN; +} + + const BMDTimecodeFormat gst_decklink_timecode_format_from_enum (GstDecklinkTimecodeFormat f) { diff --git a/sys/decklink/gstdecklink.h b/sys/decklink/gstdecklink.h index 0b65bb25a..e8a0f2678 100644 --- a/sys/decklink/gstdecklink.h +++ b/sys/decklink/gstdecklink.h @@ -178,6 +178,7 @@ enum _BMDKeyerMode const BMDPixelFormat gst_decklink_pixel_format_from_type (GstDecklinkVideoFormat t); const gint gst_decklink_bpp_from_type (GstDecklinkVideoFormat t); const GstDecklinkVideoFormat gst_decklink_type_from_video_format (GstVideoFormat f); +GstVideoFormat gst_decklink_video_format_from_type (BMDPixelFormat pf); const BMDTimecodeFormat gst_decklink_timecode_format_from_enum (GstDecklinkTimecodeFormat f); const GstDecklinkTimecodeFormat gst_decklink_timecode_format_to_enum (BMDTimecodeFormat f); const BMDKeyerMode gst_decklink_keyer_mode_from_enum (GstDecklinkKeyerMode m); diff --git a/sys/decklink/gstdecklinkvideosink.cpp b/sys/decklink/gstdecklinkvideosink.cpp index cf8b42ced..8cae2c687 100644 --- a/sys/decklink/gstdecklinkvideosink.cpp +++ b/sys/decklink/gstdecklinkvideosink.cpp @@ -728,7 +728,8 @@ gst_decklink_video_sink_prepare (GstBaseSink * bsink, GstBuffer * buffer) g_free (tc_str); } - gst_decklink_video_sink_convert_to_internal_clock (self, &running_time, &running_time_duration); + gst_decklink_video_sink_convert_to_internal_clock (self, &running_time, + &running_time_duration); if (!self->output->started) { GST_LOG_OBJECT (self, "Showing video frame synchronously because PAUSED"); @@ -1020,8 +1021,8 @@ gst_decklink_video_sink_stop_scheduled_playback (GstDecklinkVideoSink * self) // Wait until scheduled playback actually stopped do { - g_cond_wait (&self->output->cond, &self->output->lock); - self->output->output->IsScheduledPlaybackRunning (&active); + g_cond_wait (&self->output->cond, &self->output->lock); + self->output->output->IsScheduledPlaybackRunning (&active); } while (active); } self->internal_base_time = GST_CLOCK_TIME_NONE; diff --git a/sys/decklink/gstdecklinkvideosrc.cpp b/sys/decklink/gstdecklinkvideosrc.cpp index 5e97ac176..4545cb6a3 100644 --- a/sys/decklink/gstdecklinkvideosrc.cpp +++ b/sys/decklink/gstdecklinkvideosrc.cpp @@ -25,6 +25,7 @@ #include "gstdecklinkvideosrc.h" #include <string.h> +#include <gst/video/video-vbi.h> GST_DEBUG_CATEGORY_STATIC (gst_decklink_video_src_debug); #define GST_CAT_DEFAULT gst_decklink_video_src_debug @@ -744,7 +745,8 @@ gst_decklink_video_src_got_frame (GstElement * element, flags = (GstVideoTimeCodeFlags) (flags | GST_VIDEO_TIME_CODE_FLAGS_INTERLACED); - if (bmode->fps_d == 1001 && (bmode->fps_n == 30000 || bmode->fps_n == 60000)) + if (bmode->fps_d == 1001 && (bmode->fps_n == 30000 + || bmode->fps_n == 60000)) flags = (GstVideoTimeCodeFlags) (flags | GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME); @@ -841,15 +843,17 @@ gst_decklink_video_src_create (GstPushSrc * bsrc, GstBuffer ** buffer) running_time = gst_segment_to_running_time (&GST_BASE_SRC (self)->segment, GST_FORMAT_TIME, f.timestamp); - msg = gst_message_new_qos (GST_OBJECT (self), TRUE, running_time, f.stream_timestamp, - f.timestamp, f.duration); + msg = + gst_message_new_qos (GST_OBJECT (self), TRUE, running_time, + f.stream_timestamp, f.timestamp, f.duration); gst_message_set_qos_stats (msg, GST_FORMAT_TIME, self->processed, self->dropped); gst_element_post_message (GST_ELEMENT (self), msg); } if (self->first_stream_time == GST_CLOCK_TIME_NONE) self->first_stream_time = f.stream_timestamp; - self->processed = f.stream_timestamp - self->dropped - self->first_stream_time; + self->processed = + f.stream_timestamp - self->dropped - self->first_stream_time; self->expected_stream_time = f.stream_timestamp + f.stream_duration; g_mutex_unlock (&self->lock); @@ -894,6 +898,39 @@ gst_decklink_video_src_create (GstPushSrc * bsrc, GstBuffer ** buffer) } } + mode = gst_decklink_get_mode (self->mode); + + if (1) { + IDeckLinkVideoFrameAncillary *vanc_frame = NULL; + if (vf->frame->GetAncillaryData (&vanc_frame) == S_OK) { + gint fi; + guint8 *vancdata; + // guint16 outputdata[2000]; + GstVideoFormat vf; + // FIXME : Move to a central location + GstVideoVBIParser *parser = NULL; + + vf = gst_decklink_video_format_from_type (vanc_frame->GetPixelFormat ()); + + GST_DEBUG_OBJECT (self, "Have ancillary data ?"); + // FIXME : restrict what vbi lines to look for depending on the format + for (fi = 1; fi < 42; fi++) { + if (vanc_frame->GetBufferForVerticalBlankingLine (fi, + (void **) &vancdata) == S_OK) { + GstVideoAncillary gstanc; + if (parser == NULL) + parser = gst_video_vbi_parser_new (vf, mode->width); + GST_DEBUG_OBJECT (self, "Might have data on line %d", fi); + gst_video_vbi_parser_add_line (parser, vancdata); + gst_video_vbi_parser_get_ancillary (parser, &gstanc); + } + } + vanc_frame->Release (); + if (parser) + gst_video_vbi_parser_free (parser); + } + } + if (f.no_signal) GST_BUFFER_FLAG_SET (*buffer, GST_BUFFER_FLAG_GAP); GST_BUFFER_TIMESTAMP (*buffer) = f.timestamp; @@ -907,7 +944,6 @@ gst_decklink_video_src_create (GstPushSrc * bsrc, GstBuffer ** buffer) gst_static_caps_get (&hardware_reference), f.hardware_timestamp, f.hardware_duration); - mode = gst_decklink_get_mode (self->mode); if (mode->interlaced && mode->tff) GST_BUFFER_FLAG_SET (*buffer, GST_VIDEO_BUFFER_FLAG_TFF | GST_VIDEO_BUFFER_FLAG_INTERLACED); |