mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-01 17:31:10 +00:00
wavparse: add 'note' chunk support
Add 'note' chunk support in TOC as GST_TAG_COMMENT https://bugzilla.gnome.org/show_bug.cgi?id=696549
This commit is contained in:
parent
a55ccff854
commit
5ae92ce770
2 changed files with 70 additions and 7 deletions
|
@ -139,7 +139,7 @@ typedef struct
|
||||||
*/
|
*/
|
||||||
guint32 cue_point_id;
|
guint32 cue_point_id;
|
||||||
gchar *text;
|
gchar *text;
|
||||||
} GstWavParseLabl;
|
} GstWavParseLabl, GstWavParseNote;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_wavparse_class_init (GstWavParseClass * klass)
|
gst_wavparse_class_init (GstWavParseClass * klass)
|
||||||
|
@ -1219,14 +1219,43 @@ gst_wavparse_labl_chunk (GstWavParse * wav, const guint8 * data, guint32 size)
|
||||||
/* parse data */
|
/* parse data */
|
||||||
data += 8;
|
data += 8;
|
||||||
labl->cue_point_id = GST_READ_UINT32_LE (data);
|
labl->cue_point_id = GST_READ_UINT32_LE (data);
|
||||||
labl->text = (gchar *) g_new0 (gchar *, size - 4 + 1);
|
labl->text = g_memdup (data + 4, size - 4);
|
||||||
memcpy (labl->text, data + 4, size - 4);
|
|
||||||
|
|
||||||
wav->labls = g_list_append (wav->labls, labl);
|
wav->labls = g_list_append (wav->labls, labl);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* gst_wavparse_note_chunk:
|
||||||
|
* @wav GstWavParse object
|
||||||
|
* @data holder for data
|
||||||
|
* @size holder for data size
|
||||||
|
*
|
||||||
|
* Parse note from @data to wav->notes.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE when note chunk is available
|
||||||
|
*/
|
||||||
|
static gboolean
|
||||||
|
gst_wavparse_note_chunk (GstWavParse * wav, const guint8 * data, guint32 size)
|
||||||
|
{
|
||||||
|
GstWavParseNote *note;
|
||||||
|
|
||||||
|
if (size < 5)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
note = g_new0 (GstWavParseNote, 1);
|
||||||
|
|
||||||
|
/* parse data */
|
||||||
|
data += 8;
|
||||||
|
note->cue_point_id = GST_READ_UINT32_LE (data);
|
||||||
|
note->text = g_memdup (data + 4, size - 4);
|
||||||
|
|
||||||
|
wav->notes = g_list_append (wav->notes, note);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* gst_wavparse_adtl_chunk:
|
* gst_wavparse_adtl_chunk:
|
||||||
* @wav GstWavParse object
|
* @wav GstWavParse object
|
||||||
|
@ -1248,6 +1277,10 @@ gst_wavparse_adtl_chunk (GstWavParse * wav, const guint8 * data, guint32 size)
|
||||||
switch (ltag) {
|
switch (ltag) {
|
||||||
case GST_RIFF_TAG_labl:
|
case GST_RIFF_TAG_labl:
|
||||||
gst_wavparse_labl_chunk (wav, data + offset, size);
|
gst_wavparse_labl_chunk (wav, data + offset, size);
|
||||||
|
break;
|
||||||
|
case GST_RIFF_TAG_note:
|
||||||
|
gst_wavparse_note_chunk (wav, data + offset, size);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1258,6 +1291,24 @@ gst_wavparse_adtl_chunk (GstWavParse * wav, const guint8 * data, guint32 size)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GstTagList *
|
||||||
|
gst_wavparse_get_tags_toc_entry (GstToc * toc, gchar * id)
|
||||||
|
{
|
||||||
|
GstTagList *tags = NULL;
|
||||||
|
GstTocEntry *entry = NULL;
|
||||||
|
|
||||||
|
entry = gst_toc_find_entry (toc, id);
|
||||||
|
if (entry != NULL) {
|
||||||
|
tags = gst_toc_entry_get_tags (entry);
|
||||||
|
if (tags == NULL) {
|
||||||
|
tags = gst_tag_list_new_empty ();
|
||||||
|
gst_toc_entry_set_tags (entry, tags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tags;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* gst_wavparse_create_toc:
|
* gst_wavparse_create_toc:
|
||||||
* @wav GstWavParse object
|
* @wav GstWavParse object
|
||||||
|
@ -1272,6 +1323,7 @@ gst_wavparse_create_toc (GstWavParse * wav)
|
||||||
GList *list;
|
GList *list;
|
||||||
GstWavParseCue *cue;
|
GstWavParseCue *cue;
|
||||||
GstWavParseLabl *labl;
|
GstWavParseLabl *labl;
|
||||||
|
GstWavParseNote *note;
|
||||||
GstTagList *tags;
|
GstTagList *tags;
|
||||||
GstToc *toc;
|
GstToc *toc;
|
||||||
GstTocEntry *entry = NULL, *cur_subentry = NULL, *prev_subentry = NULL;
|
GstTocEntry *entry = NULL, *cur_subentry = NULL, *prev_subentry = NULL;
|
||||||
|
@ -1322,13 +1374,23 @@ gst_wavparse_create_toc (GstWavParse * wav)
|
||||||
while (list) {
|
while (list) {
|
||||||
labl = list->data;
|
labl = list->data;
|
||||||
id = g_strdup_printf ("%08x", labl->cue_point_id);
|
id = g_strdup_printf ("%08x", labl->cue_point_id);
|
||||||
cur_subentry = gst_toc_find_entry (toc, id);
|
tags = gst_wavparse_get_tags_toc_entry (toc, id);
|
||||||
g_free (id);
|
g_free (id);
|
||||||
if (cur_subentry != NULL) {
|
if (tags != NULL) {
|
||||||
tags = gst_tag_list_new_empty ();
|
|
||||||
gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_TITLE, labl->text,
|
gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_TITLE, labl->text,
|
||||||
NULL);
|
NULL);
|
||||||
gst_toc_entry_set_tags (cur_subentry, tags);
|
}
|
||||||
|
list = g_list_next (list);
|
||||||
|
}
|
||||||
|
list = g_list_first (wav->notes);
|
||||||
|
while (list) {
|
||||||
|
note = list->data;
|
||||||
|
id = g_strdup_printf ("%08x", note->cue_point_id);
|
||||||
|
tags = gst_wavparse_get_tags_toc_entry (toc, id);
|
||||||
|
g_free (id);
|
||||||
|
if (tags != NULL) {
|
||||||
|
gst_tag_list_add (tags, GST_TAG_MERGE_PREPEND, GST_TAG_COMMENT,
|
||||||
|
note->text, NULL);
|
||||||
}
|
}
|
||||||
list = g_list_next (list);
|
list = g_list_next (list);
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,6 +69,7 @@ struct _GstWavParse {
|
||||||
GstToc *toc;
|
GstToc *toc;
|
||||||
GList *cues;
|
GList *cues;
|
||||||
GList *labls;
|
GList *labls;
|
||||||
|
GList *notes;
|
||||||
GstEvent *start_segment;
|
GstEvent *start_segment;
|
||||||
|
|
||||||
/* WAVE decoding state */
|
/* WAVE decoding state */
|
||||||
|
|
Loading…
Reference in a new issue