summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gst/isomp4/fourcc.h4
-rw-r--r--gst/isomp4/qtdemux.c60
-rw-r--r--gst/isomp4/qtdemux_types.c1
3 files changed, 63 insertions, 2 deletions
diff --git a/gst/isomp4/fourcc.h b/gst/isomp4/fourcc.h
index be5c7c04e..e3503cb59 100644
--- a/gst/isomp4/fourcc.h
+++ b/gst/isomp4/fourcc.h
@@ -95,6 +95,10 @@ G_BEGIN_DECLS
#define FOURCC_avc1 GST_MAKE_FOURCC('a','v','c','1')
#define FOURCC_avc3 GST_MAKE_FOURCC('a','v','c','3')
#define FOURCC_avcC GST_MAKE_FOURCC('a','v','c','C')
+#define FOURCC_c608 GST_MAKE_FOURCC('c','6','0','8')
+#define FOURCC_c708 GST_MAKE_FOURCC('c','7','0','8')
+#define FOURCC_cdat GST_MAKE_FOURCC('c','d','a','t')
+#define FOURCC_clcp GST_MAKE_FOURCC('c','l','c','p')
#define FOURCC_clip GST_MAKE_FOURCC('c','l','i','p')
#define FOURCC_cmov GST_MAKE_FOURCC('c','m','o','v')
#define FOURCC_cmvd GST_MAKE_FOURCC('c','m','v','d')
diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c
index 4fda82a82..8a12327a8 100644
--- a/gst/isomp4/qtdemux.c
+++ b/gst/isomp4/qtdemux.c
@@ -5352,6 +5352,33 @@ gst_qtdemux_align_buffer (GstQTDemux * demux,
return buffer;
}
+static guint8 *
+extract_cc_from_cdat (const guint8 * data, gsize size, gsize * cclen)
+{
+ guint8 *res = NULL;
+ guint32 atom_length, fourcc;
+
+ *cclen = 0;
+ if (size < 8)
+ goto invalid_cdat;
+ atom_length = QT_UINT32 (data);
+ fourcc = QT_FOURCC (data + 4);
+
+ if (G_UNLIKELY (atom_length > size || atom_length == 8
+ || fourcc != FOURCC_cdat))
+ goto invalid_cdat;
+
+ *cclen = atom_length - 8;
+ res = g_memdup (data + 8, *cclen);
+
+ return res;
+
+ /* Errors */
+invalid_cdat:
+ GST_WARNING ("[cdat] atom is too small or invalid");
+ return NULL;
+}
+
/* the input buffer metadata must be writable,
* but time/duration etc not yet set and need not be preserved */
static GstBuffer *
@@ -5372,7 +5399,7 @@ gst_qtdemux_process_buffer (GstQTDemux * qtdemux, QtDemuxStream * stream,
if (G_UNLIKELY (stream->subtype != FOURCC_text
&& stream->subtype != FOURCC_sbtl &&
- stream->subtype != FOURCC_subp)) {
+ stream->subtype != FOURCC_subp && stream->subtype != FOURCC_clcp)) {
return buf;
}
@@ -5390,6 +5417,23 @@ gst_qtdemux_process_buffer (GstQTDemux * qtdemux, QtDemuxStream * stream,
return buf;
}
+ if (stream->subtype == FOURCC_clcp) {
+ guint8 *cc;
+ gsize cclen = 0;
+ /* For closed caption, we need to extract the information from the
+ * [cdat] atom */
+ cc = extract_cc_from_cdat (map.data, map.size, &cclen);
+ gst_buffer_unmap (buf, &map);
+ gst_buffer_unref (buf);
+ if (cc) {
+ buf = _gst_buffer_new_wrapped (cc, cclen, g_free);
+ } else {
+ /* Conversion failed or there's nothing */
+ buf = NULL;
+ }
+ return buf;
+ }
+
nsize = GST_READ_UINT16_BE (map.data);
nsize = MIN (nsize, map.size - 2);
@@ -11519,7 +11563,8 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
}
entry->sampled = TRUE;
} else if (stream->subtype == FOURCC_subp || stream->subtype == FOURCC_text
- || stream->subtype == FOURCC_sbtl || stream->subtype == FOURCC_subt) {
+ || stream->subtype == FOURCC_sbtl || stream->subtype == FOURCC_subt
+ || stream->subtype == FOURCC_clcp) {
entry->sampled = TRUE;
entry->sparse = TRUE;
@@ -14404,6 +14449,17 @@ qtdemux_sub_caps (GstQTDemux * qtdemux, QtDemuxStream * stream,
_codec ("XML subtitles");
caps = gst_caps_new_empty_simple ("application/ttml+xml");
break;
+ case FOURCC_c608:
+ _codec ("CEA 608 Closed Caption");
+ caps = gst_caps_new_empty_simple ("closedcaption/x-cea-608");
+ stream->need_process = TRUE;
+ break;
+ case FOURCC_c708:
+ _codec ("CEA 708 Closed Caption");
+ caps = gst_caps_new_empty_simple ("closedcaption/x-cea-708");
+ stream->need_process = TRUE;
+ break;
+
default:
{
caps = _get_unknown_codec_name ("text", fourcc);
diff --git a/gst/isomp4/qtdemux_types.c b/gst/isomp4/qtdemux_types.c
index 88db8c2ce..1d5840394 100644
--- a/gst/isomp4/qtdemux_types.c
+++ b/gst/isomp4/qtdemux_types.c
@@ -213,6 +213,7 @@ static const QtNodeType qt_node_types[] = {
{FOURCC_pssh, "protection system specific header", 0},
{FOURCC_tenc, "track encryption", 0},
{FOURCC_stpp, "XML subtitle sample entry", 0},
+ {FOURCC_clcp, "Closed Caption", 0},
{0, "unknown", 0,},
};