summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hervey <bilboed@bilboed.com>2018-02-15 18:06:45 +0100
committerEdward Hervey <bilboed@bilboed.com>2018-03-06 14:47:02 +0100
commit29f58d9db05b4008478252b41c0c17d6fd39b037 (patch)
tree26b0f12dad2a632af8555e5d4c91199d565b424d
parentfd3bb4403164d3ef03759401e9fbd4661c636ca0 (diff)
WIP decklink ANC support
-rw-r--r--sys/decklink/gstdecklink.cpp14
-rw-r--r--sys/decklink/gstdecklink.h1
-rw-r--r--sys/decklink/gstdecklinkvideosink.cpp7
-rw-r--r--sys/decklink/gstdecklinkvideosrc.cpp46
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);