From 48f48cc4bae149aec81ecb995fb5fc849926bee4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 10 Dec 2018 15:54:49 +0200 Subject: [PATCH] closedcaption: Replace GST_VIDEO_CAPTION_TYPE_CEA608_IN_CEA708_RAW with CEA608_S334_1A As a side-effect we can now actually store the line offset in the line21dec element, and have to perform fewer transformations in the decklink elements (which were also buggy as they assumed a single byte triplet per meta). --- ext/closedcaption/gstcccombiner.c | 7 +++---- ext/closedcaption/gstccextractor.c | 6 +++--- ext/closedcaption/gstline21dec.c | 16 ++++++++++++++-- sys/decklink/gstdecklinkvideosink.cpp | 19 ++----------------- sys/decklink/gstdecklinkvideosrc.cpp | 7 +------ 5 files changed, 23 insertions(+), 32 deletions(-) diff --git a/ext/closedcaption/gstcccombiner.c b/ext/closedcaption/gstcccombiner.c index 144f650d12..dd11920119 100644 --- a/ext/closedcaption/gstcccombiner.c +++ b/ext/closedcaption/gstcccombiner.c @@ -48,7 +48,7 @@ static GstStaticPadTemplate captiontemplate = GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS - ("closedcaption/x-cea-608,format={ (string) raw, (string) cc_data}; " + ("closedcaption/x-cea-608,format={ (string) raw, (string) s334-1a}; " "closedcaption/x-cea-708,format={ (string) cc_data, (string) cdp }")); G_DEFINE_TYPE (GstCCCombiner, gst_cc_combiner, GST_TYPE_AGGREGATOR); @@ -353,9 +353,8 @@ gst_cc_combiner_sink_event (GstAggregator * aggregator, if (gst_structure_has_name (s, "closedcaption/x-cea-608")) { if (strcmp (format, "raw") == 0) { self->current_caption_type = GST_VIDEO_CAPTION_TYPE_CEA608_RAW; - } else if (strcmp (format, "cc_data") == 0) { - self->current_caption_type = - GST_VIDEO_CAPTION_TYPE_CEA608_IN_CEA708_RAW; + } else if (strcmp (format, "s334-1a") == 0) { + self->current_caption_type = GST_VIDEO_CAPTION_TYPE_CEA608_S334_1A; } else { g_assert_not_reached (); } diff --git a/ext/closedcaption/gstccextractor.c b/ext/closedcaption/gstccextractor.c index 5e5abfda10..b18cfabd03 100644 --- a/ext/closedcaption/gstccextractor.c +++ b/ext/closedcaption/gstccextractor.c @@ -57,7 +57,7 @@ static GstStaticPadTemplate captiontemplate = GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS - ("closedcaption/x-cea-608,format={ (string) raw, (string) cc_data}; " + ("closedcaption/x-cea-608,format={ (string) raw, (string) s334-1a}; " "closedcaption/x-cea-708,format={ (string) cc_data, (string) cdp }")); G_DEFINE_TYPE (GstCCExtractor, gst_cc_extractor, GST_TYPE_ELEMENT); @@ -284,9 +284,9 @@ create_caps_from_caption_type (GstVideoCaptionType caption_type, caption_caps = gst_caps_new_simple ("closedcaption/x-cea-608", "format", G_TYPE_STRING, "raw", NULL); break; - case GST_VIDEO_CAPTION_TYPE_CEA608_IN_CEA708_RAW: + case GST_VIDEO_CAPTION_TYPE_CEA608_S334_1A: caption_caps = gst_caps_new_simple ("closedcaption/x-cea-608", - "format", G_TYPE_STRING, "cc_data", NULL); + "format", G_TYPE_STRING, "s334-1a", NULL); break; case GST_VIDEO_CAPTION_TYPE_CEA708_RAW: caption_caps = gst_caps_new_simple ("closedcaption/x-cea-708", diff --git a/ext/closedcaption/gstline21dec.c b/ext/closedcaption/gstline21dec.c index 03bf94cf69..53833860fd 100644 --- a/ext/closedcaption/gstline21dec.c +++ b/ext/closedcaption/gstline21dec.c @@ -408,13 +408,25 @@ gst_line_21_decoder_scan (GstLine21Decoder * self, GstVideoFrame * frame) GST_DEBUG_OBJECT (self, "No CC found"); self->line21_offset = -1; } else { - guint8 ccdata[6] = { 0xfc, 0x80, 0x80, 0xfd, 0x80, 0x80 }; /* Initialize the ccdata */ + guint base_line1 = 0, base_line2 = 0; + guint8 ccdata[6] = { 0x80, 0x80, 0x80, 0x00, 0x80, 0x80 }; /* Initialize the ccdata */ + + if (GST_VIDEO_FRAME_HEIGHT (frame) == 525) { + base_line1 = 9; + base_line2 = 272; + } else if (GST_VIDEO_FRAME_HEIGHT (frame) == 625) { + base_line1 = 5; + base_line2 = 318; + } + + ccdata[0] |= (base_line1 < i ? i - base_line1 : 0) & 0x1f; ccdata[1] = sliced[0].data[0]; ccdata[2] = sliced[0].data[1]; + ccdata[3] |= (base_line2 < i ? i - base_line2 : 0) & 0x1f; ccdata[4] = sliced[1].data[0]; ccdata[5] = sliced[1].data[1]; gst_buffer_add_video_caption_meta (frame->buffer, - GST_VIDEO_CAPTION_TYPE_CEA608_IN_CEA708_RAW, ccdata, 6); + GST_VIDEO_CAPTION_TYPE_CEA608_S334_1A, ccdata, 6); GST_TRACE_OBJECT (self, "Got CC 0x%02x 0x%02x / 0x%02x 0x%02x '%c%c / %c%c'", ccdata[1], ccdata[2], ccdata[4], ccdata[5], diff --git a/sys/decklink/gstdecklinkvideosink.cpp b/sys/decklink/gstdecklinkvideosink.cpp index dfc847a123..ef8a20fdd0 100644 --- a/sys/decklink/gstdecklinkvideosink.cpp +++ b/sys/decklink/gstdecklinkvideosink.cpp @@ -808,26 +808,11 @@ gst_decklink_video_sink_prepare (GstBaseSink * bsink, GstBuffer * buffer) break; } - case GST_VIDEO_CAPTION_TYPE_CEA608_IN_CEA708_RAW:{ - guint8 data[3]; - - /* This is the offset from line 9 for 525-line fields and from line - * 5 for 625-line fields. - * - * The highest bit is set for field 1 but not for field 0 - */ - data[0] = - self->info.height == - 525 ? self->caption_line - 9 : self->caption_line - 5; - if (cc_meta->data[0] == 0xFD) - data[0] |= 0x80; - data[1] = cc_meta->data[1]; - data[2] = cc_meta->data[2]; - + case GST_VIDEO_CAPTION_TYPE_CEA608_S334_1A:{ if (!gst_video_vbi_encoder_add_ancillary (self->vbiencoder, FALSE, GST_VIDEO_ANCILLARY_DID16_S334_EIA_708 >> 8, - GST_VIDEO_ANCILLARY_DID16_S334_EIA_708 & 0xff, data, 3)) + GST_VIDEO_ANCILLARY_DID16_S334_EIA_708 & 0xff, cc_meta->data, cc_meta->size)) GST_WARNING_OBJECT (self, "Couldn't add meta to ancillary data"); got_captions = TRUE; diff --git a/sys/decklink/gstdecklinkvideosrc.cpp b/sys/decklink/gstdecklinkvideosrc.cpp index bb14d3730a..1ef7f93883 100644 --- a/sys/decklink/gstdecklinkvideosrc.cpp +++ b/sys/decklink/gstdecklinkvideosrc.cpp @@ -850,13 +850,8 @@ extract_cc_from_vbi (GstDecklinkVideoSrc * self, GstBuffer ** buffer, GST_DEBUG_OBJECT (self, "Adding CEA-608 meta to buffer for line %d", fi); GST_MEMDUMP_OBJECT (self, "CEA608", gstanc.data, gstanc.data_count); - /* The first byte actually contains the field and line offset but - * for CEA608-in-CEA708 we can't store the line offset, and it's - * generally not needed - */ - gstanc.data[0] = (gstanc.data[0] & 0x80) ? 0xFD : 0xFC; gst_buffer_add_video_caption_meta (*buffer, - GST_VIDEO_CAPTION_TYPE_CEA608_IN_CEA708_RAW, gstanc.data, + GST_VIDEO_CAPTION_TYPE_CEA608_S334_1A, gstanc.data, gstanc.data_count); break; default: