diff options
Diffstat (limited to 'sys/decklink/gstdecklinkvideosrc.cpp')
-rw-r--r-- | sys/decklink/gstdecklinkvideosrc.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/sys/decklink/gstdecklinkvideosrc.cpp b/sys/decklink/gstdecklinkvideosrc.cpp index f048ab3f1..4d0caea4b 100644 --- a/sys/decklink/gstdecklinkvideosrc.cpp +++ b/sys/decklink/gstdecklinkvideosrc.cpp @@ -884,19 +884,24 @@ gst_decklink_video_src_got_frame (GstElement * element, static void extract_cc_from_vbi (GstDecklinkVideoSrc * self, GstBuffer ** buffer, - VideoFrame * vf, const GstDecklinkMode * mode) + VideoFrame * vf) { IDeckLinkVideoFrameAncillary *vanc_frame = NULL; gint fi; guint8 *vancdata; GstVideoFormat videoformat; gboolean found = FALSE; + GstDecklinkModeEnum mode_enum; + const GstDecklinkMode *mode; if (vf->frame->GetAncillaryData (&vanc_frame) != S_OK) return; videoformat = gst_decklink_video_format_from_type (vanc_frame->GetPixelFormat ()); + mode_enum = + gst_decklink_get_mode_enum_from_bmd (vanc_frame->GetDisplayMode ()); + mode = gst_decklink_get_mode (mode_enum); if (videoformat == GST_VIDEO_FORMAT_UNKNOWN) { GST_DEBUG_OBJECT (self, "Unknown video format for Ancillary data"); @@ -904,7 +909,8 @@ extract_cc_from_vbi (GstDecklinkVideoSrc * self, GstBuffer ** buffer, return; } - if (videoformat != self->anc_vformat && self->vbiparser) { + if ((videoformat != self->anc_vformat || mode->width != self->anc_width) + && self->vbiparser) { gst_video_vbi_parser_free (self->vbiparser); self->vbiparser = NULL; } @@ -922,6 +928,7 @@ extract_cc_from_vbi (GstDecklinkVideoSrc * self, GstBuffer ** buffer, if (self->vbiparser == NULL) { self->vbiparser = gst_video_vbi_parser_new (videoformat, mode->width); self->anc_vformat = videoformat; + self->anc_width = mode->width; } GST_DEBUG_OBJECT (self, "Might have data on line %d", fi); gst_video_vbi_parser_add_line (self->vbiparser, vancdata); @@ -1085,6 +1092,7 @@ gst_decklink_video_src_create (GstPushSrc * bsrc, GstBuffer ** buffer) gst_video_vbi_parser_free (self->vbiparser); self->vbiparser = NULL; self->anc_vformat = GST_VIDEO_FORMAT_UNKNOWN; + self->anc_width = 0; } } @@ -1119,12 +1127,10 @@ gst_decklink_video_src_create (GstPushSrc * bsrc, GstBuffer ** buffer) } } - mode = gst_decklink_get_mode (self->mode); - // If we have a format that supports VANC and we are asked to extract CC, // then do it here. if (self->output_cc && mode->vanc && !self->no_signal) - extract_cc_from_vbi (self, buffer, vf, mode); + extract_cc_from_vbi (self, buffer, vf); if (f.no_signal) GST_BUFFER_FLAG_SET (*buffer, GST_BUFFER_FLAG_GAP); @@ -1139,6 +1145,7 @@ 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->caps_mode); if (mode->interlaced && mode->tff) GST_BUFFER_FLAG_SET (*buffer, GST_VIDEO_BUFFER_FLAG_TFF | GST_VIDEO_BUFFER_FLAG_INTERLACED); @@ -1293,6 +1300,7 @@ gst_decklink_video_src_stop (GstDecklinkVideoSrc * self) gst_video_vbi_parser_free (self->vbiparser); self->vbiparser = NULL; self->anc_vformat = GST_VIDEO_FORMAT_UNKNOWN; + self->anc_width = 0; } return TRUE; @@ -1360,6 +1368,7 @@ gst_decklink_video_src_change_state (GstElement * element, } self->vbiparser = NULL; self->anc_vformat = GST_VIDEO_FORMAT_UNKNOWN; + self->anc_width = 0; break; case GST_STATE_CHANGE_READY_TO_PAUSED: self->flushing = FALSE; |