diff options
author | Edward Hervey <edward@centricular.com> | 2018-01-31 15:10:03 +0100 |
---|---|---|
committer | Edward Hervey <bilboed@bilboed.com> | 2018-02-02 09:19:02 +0100 |
commit | a57fa95c32abf09d73755b9804144d13ec2897be (patch) | |
tree | d30e4e21e9c88ed1521862cddd2b8544b51256e6 | |
parent | ad8a6cb6399c100e3ed74c3672e1cd69a718aa85 (diff) |
https://bugzilla.gnome.org/show_bug.cgi?id=606643
-rw-r--r-- | gst/isomp4/fourcc.h | 4 | ||||
-rw-r--r-- | gst/isomp4/qtdemux.c | 60 | ||||
-rw-r--r-- | gst/isomp4/qtdemux_types.c | 1 |
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,}, }; |