From 03ab3610c76eae0223a02c8871f6f58d114446ed Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Tue, 11 Nov 2008 19:52:05 +0000 Subject: [PATCH] gst/qtdemux/: Add cover and alternative copyright tag, and enhance some existing ones by marking them as container at... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_tag_add_tmpo), (qtdemux_tag_add_covr), (qtdemux_parse_udta): * gst/qtdemux/qtdemux_fourcc.h: * gst/qtdemux/qtdemux_types.c: Add cover and alternative copyright tag, and enhance some existing ones by marking them as container atoms. --- ChangeLog | 9 +++++++++ gst/qtdemux/qtdemux.c | 35 ++++++++++++++++++++++++++++++++++- gst/qtdemux/qtdemux_fourcc.h | 2 ++ gst/qtdemux/qtdemux_types.c | 7 +++++++ 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index b9f84df297..1b33eba062 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-11-11 Mark Nauwelaerts + + * gst/qtdemux/qtdemux.c: (qtdemux_tag_add_tmpo), + (qtdemux_tag_add_covr), (qtdemux_parse_udta): + * gst/qtdemux/qtdemux_fourcc.h: + * gst/qtdemux/qtdemux_types.c: + Add cover and alternative copyright tag, and enhance some existing + ones by marking them as container atoms. + 2008-11-11 Wim Taymans * gst/rtp/gstrtpg729pay.c: (gst_rtp_g729_pay_set_caps): diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c index 6d371931d8..2dddd27bcc 100644 --- a/gst/qtdemux/qtdemux.c +++ b/gst/qtdemux/qtdemux.c @@ -3958,7 +3958,7 @@ qtdemux_tag_add_tmpo (GstQTDemux * qtdemux, const char *tag1, GNode * node) type = QT_UINT32 ((guint8 *) data->data + 8); GST_DEBUG_OBJECT (qtdemux, "have tempo tag, type=%d,len=%d", type, len); /* some files wrongly have a type 0x0f=15, but it should be 0x15 */ - if ((type == 0x00000015 || type == 0x0000000f) && len >= 16) { + if ((type == 0x00000015 || type == 0x0000000f) && len >= 18) { n1 = QT_UINT16 ((guint8 *) data->data + 16); if (n1) { /* do not add bpm=0 */ @@ -3970,6 +3970,30 @@ qtdemux_tag_add_tmpo (GstQTDemux * qtdemux, const char *tag1, GNode * node) } } +static void +qtdemux_tag_add_covr (GstQTDemux * qtdemux, const char *tag1, GNode * node) +{ + GNode *data; + int len; + int type; + GstBuffer *buf; + + data = qtdemux_tree_get_child_by_type (node, FOURCC_data); + if (data) { + len = QT_UINT32 (data->data); + type = QT_UINT32 ((guint8 *) data->data + 8); + GST_DEBUG_OBJECT (qtdemux, "have covr tag, type=%d,len=%d", type, len); + if ((type == 0x0000000d || type == 0x0000000e) && len > 16) { + if ((buf = gst_tag_image_data_to_image_buffer (data->data + 16, len - 16, + GST_TAG_IMAGE_TYPE_NONE))) { + GST_DEBUG_OBJECT (qtdemux, "adding tag size %d", len - 16); + gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE, + tag1, buf, NULL); + } + } + } +} + static void qtdemux_tag_add_date (GstQTDemux * qtdemux, const char *tag, GNode * node) { @@ -4108,6 +4132,10 @@ qtdemux_parse_udta (GstQTDemux * qtdemux, GNode * udta) node = qtdemux_tree_get_child_by_type (ilst, FOURCC__cpy); if (node) { qtdemux_tag_add_str (qtdemux, GST_TAG_COPYRIGHT, node); + } else { + node = qtdemux_tree_get_child_by_type (ilst, FOURCC_cprt); + if (node) + qtdemux_tag_add_str (qtdemux, GST_TAG_COPYRIGHT, node); } node = qtdemux_tree_get_child_by_type (ilst, FOURCC__cmt); @@ -4163,6 +4191,11 @@ qtdemux_parse_udta (GstQTDemux * qtdemux, GNode * udta) qtdemux_tag_add_tmpo (qtdemux, GST_TAG_BEATS_PER_MINUTE, node); } + node = qtdemux_tree_get_child_by_type (ilst, FOURCC_covr); + if (node) { + qtdemux_tag_add_covr (qtdemux, GST_TAG_PREVIEW_IMAGE, node); + } + node = qtdemux_tree_get_child_by_type (ilst, FOURCC_keyw); if (node) { qtdemux_tag_add_str (qtdemux, GST_TAG_KEYWORDS, node); diff --git a/gst/qtdemux/qtdemux_fourcc.h b/gst/qtdemux/qtdemux_fourcc.h index a030f1b626..ca0b463a55 100644 --- a/gst/qtdemux/qtdemux_fourcc.h +++ b/gst/qtdemux/qtdemux_fourcc.h @@ -87,12 +87,14 @@ G_BEGIN_DECLS #define FOURCC__grp GST_MAKE_FOURCC(0xa9,'g','r','p') #define FOURCC__alb GST_MAKE_FOURCC(0xa9,'a','l','b') #define FOURCC__day GST_MAKE_FOURCC(0xa9,'d','a','y') +#define FOURCC_cprt GST_MAKE_FOURCC('c','p','r','t') #define FOURCC_gnre GST_MAKE_FOURCC('g','n','r','e') #define FOURCC_disc GST_MAKE_FOURCC('d','i','s','c') #define FOURCC_disk GST_MAKE_FOURCC('d','i','s','k') #define FOURCC_trkn GST_MAKE_FOURCC('t','r','k','n') #define FOURCC_cpil GST_MAKE_FOURCC('c','p','i','l') #define FOURCC_tmpo GST_MAKE_FOURCC('t','m','p','o') +#define FOURCC_covr GST_MAKE_FOURCC('c','o','v','r') #define FOURCC__too GST_MAKE_FOURCC(0xa9,'t','o','o') #define FOURCC_____ GST_MAKE_FOURCC('-','-','-','-') #define FOURCC_free GST_MAKE_FOURCC('f','r','e','e') diff --git a/gst/qtdemux/qtdemux_types.c b/gst/qtdemux/qtdemux_types.c index 5a1afed993..a0e4513da3 100644 --- a/gst/qtdemux/qtdemux_types.c +++ b/gst/qtdemux/qtdemux_types.c @@ -98,12 +98,19 @@ static const QtNodeType qt_node_types[] = { {FOURCC__grp, "Group", QT_FLAG_CONTAINER,}, {FOURCC__alb, "Album", QT_FLAG_CONTAINER,}, {FOURCC__day, "Date", QT_FLAG_CONTAINER,}, + {FOURCC__cpy, "Copyright", QT_FLAG_CONTAINER,}, + {FOURCC__cmt, "Comment", QT_FLAG_CONTAINER,}, + {FOURCC__des, "Description", QT_FLAG_CONTAINER,}, {FOURCC_gnre, "Genre", QT_FLAG_CONTAINER,}, {FOURCC_trkn, "Track Number", QT_FLAG_CONTAINER,}, {FOURCC_disc, "Disc Number", QT_FLAG_CONTAINER,}, {FOURCC_disk, "Disc Number", QT_FLAG_CONTAINER,}, + {FOURCC_cprt, "Copyright", QT_FLAG_CONTAINER,}, {FOURCC_cpil, "cpil", QT_FLAG_CONTAINER,}, {FOURCC_tmpo, "Tempo", QT_FLAG_CONTAINER,}, + {FOURCC_covr, "Cover", QT_FLAG_CONTAINER,}, + {FOURCC_keyw, "Keywords", QT_FLAG_CONTAINER,}, + {FOURCC_kywd, "Keywords", QT_FLAG_CONTAINER,}, {FOURCC__too, "too", QT_FLAG_CONTAINER,}, {FOURCC_____, "----", QT_FLAG_CONTAINER,}, {FOURCC_data, "data", 0, qtdemux_dump_unknown},