From 4f7ef56c53175d8768c7713c3e7aeacb4541722e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 10 Dec 2018 17:34:03 +0200 Subject: [PATCH] isomp4: Replace GST_VIDEO_CAPTION_TYPE_CEA608_IN_CEA708_RAW with CEA608_S334_1A For the demuxer we have to select line offset 0 for the time being as this information is not passed over MOV. --- gst/isomp4/gstqtmux.c | 12 ++++++------ gst/isomp4/gstqtmuxmap.c | 2 +- gst/isomp4/qtdemux.c | 19 ++++++++++--------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/gst/isomp4/gstqtmux.c b/gst/isomp4/gstqtmux.c index 26c2498234..999b97ad38 100644 --- a/gst/isomp4/gstqtmux.c +++ b/gst/isomp4/gstqtmux.c @@ -882,7 +882,7 @@ gst_qt_mux_prepare_jpc_buffer (GstQTPad * qtpad, GstBuffer * buf, } static gsize -extract_608_field_from_cc_data (const guint8 * ccdata, gsize ccdata_size, +extract_608_field_from_s334_1a (const guint8 * ccdata, gsize ccdata_size, guint field, guint8 ** res) { guint8 *storage; @@ -894,8 +894,8 @@ extract_608_field_from_cc_data (const guint8 * ccdata, gsize ccdata_size, /* Iterate over the ccdata and put the corresponding tuples for the given field * in the storage */ for (i = 0; i < ccdata_size; i += 3) { - if ((field == 1 && ccdata[i * 3] == 0xfc) || - (field == 2 && ccdata[i * 3] == 0xfd)) { + if ((field == 1 && (ccdata[i * 3] & 0x80)) || + (field == 2 && !(ccdata[i * 3] & 0x80))) { GST_DEBUG ("Storing matching cc for field %d : 0x%02x 0x%02x", field, ccdata[i * 3 + 1], ccdata[i * 3 + 2]); if (res_size >= storage_size) { @@ -948,9 +948,9 @@ gst_qt_mux_prepare_caption_buffer (GstQTPad * qtpad, GstBuffer * buf, gsize write_offs = 0; cdat_size = - extract_608_field_from_cc_data (inmap.data, inmap.size, 1, &cdat); + extract_608_field_from_s334_1a (inmap.data, inmap.size, 1, &cdat); cdt2_size = - extract_608_field_from_cc_data (inmap.data, inmap.size, 2, &cdt2); + extract_608_field_from_s334_1a (inmap.data, inmap.size, 2, &cdt2); if (cdat_size) total_size += cdat_size + 8; @@ -6108,7 +6108,7 @@ gst_qt_mux_caption_sink_set_caps (GstQTPad * qtpad, GstCaps * caps) structure = gst_caps_get_structure (caps, 0); - /* We know we only handle 608,format=cc_data and 708,format=cdp */ + /* We know we only handle 608,format=s334-1a and 708,format=cdp */ if (gst_structure_has_name (structure, "closedcaption/x-cea-608")) { fourcc_entry = FOURCC_c608; } else if (gst_structure_has_name (structure, "closedcaption/x-cea-708")) { diff --git a/gst/isomp4/gstqtmuxmap.c b/gst/isomp4/gstqtmuxmap.c index 6735f9d5d7..7fa741aad8 100644 --- a/gst/isomp4/gstqtmuxmap.c +++ b/gst/isomp4/gstqtmuxmap.c @@ -167,7 +167,7 @@ "format=(string)utf8" #define CEA608_CAPS \ - "closedcaption/x-cea-608, format=(string)cc_data" + "closedcaption/x-cea-608, format=(string)s334-1a" #define CEA708_CAPS \ "closedcaption/x-cea-708, format=(string)cdp" diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c index 105bda133d..24665329b7 100644 --- a/gst/isomp4/qtdemux.c +++ b/gst/isomp4/qtdemux.c @@ -5606,7 +5606,7 @@ gst_qtdemux_align_buffer (GstQTDemux * demux, } static guint8 * -convert_to_ccdata (const guint8 * ccpair, guint8 ccpair_size, guint field, +convert_to_s334_1a (const guint8 * ccpair, guint8 ccpair_size, guint field, gsize * res) { guint8 *storage; @@ -5616,10 +5616,11 @@ convert_to_ccdata (const guint8 * ccpair, guint8 ccpair_size, guint field, *res = ccpair_size / 2 * 3; storage = g_malloc (*res); for (i = 0; i * 2 < ccpair_size; i += 1) { + /* FIXME: Use line offset 0 as we simply can't know here */ if (field == 1) - storage[i * 3] = 0xfc; + storage[i * 3] = 0x80 | 0x00; else - storage[i * 3] = 0xfd; + storage[i * 3] = 0x00 | 0x00; storage[i * 3 + 1] = ccpair[i * 2]; storage[i * 3 + 2] = ccpair[i * 2 + 1]; } @@ -5663,11 +5664,11 @@ extract_cc_from_data (QtDemuxStream * stream, const guint8 * data, gsize size, goto invalid_cdat; } - /* Convert to cc_data triplet */ + /* Convert to S334-1 Annex A byte triplet */ if (fourcc == FOURCC_cdat) - cdat = convert_to_ccdata (data + 8, atom_length - 8, 1, &cdat_size); + cdat = convert_to_s334_1a (data + 8, atom_length - 8, 1, &cdat_size); else - cdt2 = convert_to_ccdata (data + 8, atom_length - 8, 2, &cdt2_size); + cdt2 = convert_to_s334_1a (data + 8, atom_length - 8, 2, &cdt2_size); GST_DEBUG_OBJECT (stream->pad, "size:%" G_GSIZE_FORMAT " atom_length:%u", size, atom_length); @@ -5679,7 +5680,7 @@ extract_cc_from_data (QtDemuxStream * stream, const guint8 * data, gsize size, if (fourcc == FOURCC_cdat) { if (cdat == NULL) cdat = - convert_to_ccdata (data + atom_length + 8, + convert_to_s334_1a (data + atom_length + 8, new_atom_length - 8, 1, &cdat_size); else GST_WARNING_OBJECT (stream->pad, @@ -5687,7 +5688,7 @@ extract_cc_from_data (QtDemuxStream * stream, const guint8 * data, gsize size, } else { if (cdt2 == NULL) cdt2 = - convert_to_ccdata (data + atom_length + 8, + convert_to_s334_1a (data + atom_length + 8, new_atom_length - 8, 2, &cdt2_size); else GST_WARNING_OBJECT (stream->pad, @@ -15329,7 +15330,7 @@ qtdemux_sub_caps (GstQTDemux * qtdemux, QtDemuxStream * stream, _codec ("CEA 608 Closed Caption"); caps = gst_caps_new_simple ("closedcaption/x-cea-608", "format", - G_TYPE_STRING, "cc_data", NULL); + G_TYPE_STRING, "s334-1a", NULL); stream->need_process = TRUE; break; case FOURCC_c708: