mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-23 06:26:23 +00:00
wavparse: emit midi-base-note tag from data in 'smpl' chunk
Add parsing of the 'smpl' chunk. Right now we only grab the midi-base-note and emit it as a tag.
This commit is contained in:
parent
5ddf6a5e32
commit
2e277bb341
1 changed files with 81 additions and 0 deletions
|
@ -1253,6 +1253,42 @@ gst_wavparse_note_chunk (GstWavParse * wav, const guint8 * data, guint32 size)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* gst_wavparse_smpl_chunk:
|
||||||
|
* @wav GstWavParse object
|
||||||
|
* @data holder for data
|
||||||
|
* @size holder for data size
|
||||||
|
*
|
||||||
|
* Parse smpl chunk from @data.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE when cue chunk is available
|
||||||
|
*/
|
||||||
|
static gboolean
|
||||||
|
gst_wavparse_smpl_chunk (GstWavParse * wav, const guint8 * data, guint32 size)
|
||||||
|
{
|
||||||
|
guint32 note_number;
|
||||||
|
|
||||||
|
/*
|
||||||
|
manufacturer_id = GST_READ_UINT32_LE (data);
|
||||||
|
product_id = GST_READ_UINT32_LE (data + 4);
|
||||||
|
sample_period = GST_READ_UINT32_LE (data + 8);
|
||||||
|
*/
|
||||||
|
note_number = GST_READ_UINT32_LE (data + 12);
|
||||||
|
/*
|
||||||
|
pitch_fraction = GST_READ_UINT32_LE (data + 16);
|
||||||
|
SMPTE_format = GST_READ_UINT32_LE (data + 20);
|
||||||
|
SMPTE_offset = GST_READ_UINT32_LE (data + 24);
|
||||||
|
num_sample_loops = GST_READ_UINT32_LE (data + 28);
|
||||||
|
List of Sample Loops, 24 bytes each
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!wav->tags)
|
||||||
|
wav->tags = gst_tag_list_new_empty ();
|
||||||
|
gst_tag_list_add (wav->tags, GST_TAG_MERGE_REPLACE,
|
||||||
|
GST_TAG_MIDI_BASE_NOTE, (guint) note_number, NULL);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* gst_wavparse_adtl_chunk:
|
* gst_wavparse_adtl_chunk:
|
||||||
* @wav GstWavParse object
|
* @wav GstWavParse object
|
||||||
|
@ -1819,6 +1855,7 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
||||||
data_size);
|
data_size);
|
||||||
gst_buffer_unmap (buf, &map);
|
gst_buffer_unmap (buf, &map);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
GST_INFO_OBJECT (wav, "Ignoring LIST chunk %" GST_FOURCC_FORMAT,
|
GST_INFO_OBJECT (wav, "Ignoring LIST chunk %" GST_FOURCC_FORMAT,
|
||||||
|
@ -1874,6 +1911,50 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
||||||
wav->offset += size;
|
wav->offset += size;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case GST_RIFF_TAG_smpl:{
|
||||||
|
const gint data_size = size;
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (wav, "Have 'smpl' TAG, size : %u", data_size);
|
||||||
|
if (wav->streaming) {
|
||||||
|
const guint8 *data = NULL;
|
||||||
|
|
||||||
|
if (!gst_wavparse_peek_chunk (wav, &tag, &size)) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
gst_adapter_flush (wav->adapter, 8);
|
||||||
|
wav->offset += 8;
|
||||||
|
data = gst_adapter_map (wav->adapter, data_size);
|
||||||
|
if (!gst_wavparse_smpl_chunk (wav, data, data_size)) {
|
||||||
|
goto header_read_error;
|
||||||
|
}
|
||||||
|
gst_adapter_unmap (wav->adapter);
|
||||||
|
} else {
|
||||||
|
GstMapInfo map;
|
||||||
|
|
||||||
|
wav->offset += 8;
|
||||||
|
gst_buffer_unref (buf);
|
||||||
|
buf = NULL;
|
||||||
|
if ((res =
|
||||||
|
gst_pad_pull_range (wav->sinkpad, wav->offset,
|
||||||
|
data_size, &buf)) != GST_FLOW_OK)
|
||||||
|
goto header_read_error;
|
||||||
|
gst_buffer_map (buf, &map, GST_MAP_READ);
|
||||||
|
if (!gst_wavparse_smpl_chunk (wav, (const guint8 *) map.data,
|
||||||
|
data_size)) {
|
||||||
|
goto header_read_error;
|
||||||
|
}
|
||||||
|
gst_buffer_unmap (buf, &map);
|
||||||
|
}
|
||||||
|
size = GST_ROUND_UP_2 (size);
|
||||||
|
if (wav->streaming) {
|
||||||
|
gst_adapter_flush (wav->adapter, size);
|
||||||
|
} else {
|
||||||
|
gst_buffer_unref (buf);
|
||||||
|
}
|
||||||
|
size = GST_ROUND_UP_2 (size);
|
||||||
|
wav->offset += size;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
if (!gst_waveparse_ignore_chunk (wav, buf, tag, size))
|
if (!gst_waveparse_ignore_chunk (wav, buf, tag, size))
|
||||||
/* need more data */
|
/* need more data */
|
||||||
|
|
Loading…
Reference in a new issue