mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 17:20:36 +00:00
wavparse: remove ifdef'ed code
We do have adtl and cue parse as part of toc handling alreday. The fmt code is a left over from <0.10 times.
This commit is contained in:
parent
9dde5e29da
commit
73fe1d1f6f
1 changed files with 0 additions and 426 deletions
|
@ -281,432 +281,6 @@ gst_wavparse_init (GstWavParse * wavparse)
|
||||||
gst_element_add_pad (GST_ELEMENT_CAST (wavparse), wavparse->srcpad);
|
gst_element_add_pad (GST_ELEMENT_CAST (wavparse), wavparse->srcpad);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: why is that not in use? */
|
|
||||||
#if 0
|
|
||||||
static void
|
|
||||||
gst_wavparse_parse_adtl (GstWavParse * wavparse, int len)
|
|
||||||
{
|
|
||||||
guint32 got_bytes;
|
|
||||||
GstByteStream *bs = wavparse->bs;
|
|
||||||
gst_riff_chunk *temp_chunk, chunk;
|
|
||||||
guint8 *tempdata;
|
|
||||||
struct _gst_riff_labl labl, *temp_labl;
|
|
||||||
struct _gst_riff_ltxt ltxt, *temp_ltxt;
|
|
||||||
struct _gst_riff_note note, *temp_note;
|
|
||||||
char *label_name;
|
|
||||||
GstProps *props;
|
|
||||||
GstPropsEntry *entry;
|
|
||||||
GstCaps *new_caps;
|
|
||||||
GList *caps = NULL;
|
|
||||||
|
|
||||||
props = wavparse->metadata->properties;
|
|
||||||
|
|
||||||
while (len > 0) {
|
|
||||||
got_bytes =
|
|
||||||
gst_bytestream_peek_bytes (bs, &tempdata, sizeof (gst_riff_chunk));
|
|
||||||
if (got_bytes != sizeof (gst_riff_chunk)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
temp_chunk = (gst_riff_chunk *) tempdata;
|
|
||||||
|
|
||||||
chunk.id = GUINT32_FROM_LE (temp_chunk->id);
|
|
||||||
chunk.size = GUINT32_FROM_LE (temp_chunk->size);
|
|
||||||
|
|
||||||
if (chunk.size == 0) {
|
|
||||||
gst_bytestream_flush (bs, sizeof (gst_riff_chunk));
|
|
||||||
len -= sizeof (gst_riff_chunk);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (chunk.id) {
|
|
||||||
case GST_RIFF_adtl_labl:
|
|
||||||
got_bytes =
|
|
||||||
gst_bytestream_peek_bytes (bs, &tempdata,
|
|
||||||
sizeof (struct _gst_riff_labl));
|
|
||||||
if (got_bytes != sizeof (struct _gst_riff_labl)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
temp_labl = (struct _gst_riff_labl *) tempdata;
|
|
||||||
labl.id = GUINT32_FROM_LE (temp_labl->id);
|
|
||||||
labl.size = GUINT32_FROM_LE (temp_labl->size);
|
|
||||||
labl.identifier = GUINT32_FROM_LE (temp_labl->identifier);
|
|
||||||
|
|
||||||
gst_bytestream_flush (bs, sizeof (struct _gst_riff_labl));
|
|
||||||
len -= sizeof (struct _gst_riff_labl);
|
|
||||||
|
|
||||||
got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, labl.size - 4);
|
|
||||||
if (got_bytes != labl.size - 4) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
label_name = (char *) tempdata;
|
|
||||||
|
|
||||||
gst_bytestream_flush (bs, ((labl.size - 4) + 1) & ~1);
|
|
||||||
len -= (((labl.size - 4) + 1) & ~1);
|
|
||||||
|
|
||||||
new_caps = gst_caps_new ("label",
|
|
||||||
"application/x-gst-metadata",
|
|
||||||
gst_props_new ("identifier", G_TYPE_INT (labl.identifier),
|
|
||||||
"name", G_TYPE_STRING (label_name), NULL));
|
|
||||||
|
|
||||||
if (gst_props_get (props, "labels", &caps, NULL)) {
|
|
||||||
caps = g_list_append (caps, new_caps);
|
|
||||||
} else {
|
|
||||||
caps = g_list_append (NULL, new_caps);
|
|
||||||
|
|
||||||
entry = gst_props_entry_new ("labels", GST_PROPS_GLIST (caps));
|
|
||||||
gst_props_add_entry (props, entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_RIFF_adtl_ltxt:
|
|
||||||
got_bytes =
|
|
||||||
gst_bytestream_peek_bytes (bs, &tempdata,
|
|
||||||
sizeof (struct _gst_riff_ltxt));
|
|
||||||
if (got_bytes != sizeof (struct _gst_riff_ltxt)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
temp_ltxt = (struct _gst_riff_ltxt *) tempdata;
|
|
||||||
ltxt.id = GUINT32_FROM_LE (temp_ltxt->id);
|
|
||||||
ltxt.size = GUINT32_FROM_LE (temp_ltxt->size);
|
|
||||||
ltxt.identifier = GUINT32_FROM_LE (temp_ltxt->identifier);
|
|
||||||
ltxt.length = GUINT32_FROM_LE (temp_ltxt->length);
|
|
||||||
ltxt.purpose = GUINT32_FROM_LE (temp_ltxt->purpose);
|
|
||||||
ltxt.country = GUINT16_FROM_LE (temp_ltxt->country);
|
|
||||||
ltxt.language = GUINT16_FROM_LE (temp_ltxt->language);
|
|
||||||
ltxt.dialect = GUINT16_FROM_LE (temp_ltxt->dialect);
|
|
||||||
ltxt.codepage = GUINT16_FROM_LE (temp_ltxt->codepage);
|
|
||||||
|
|
||||||
gst_bytestream_flush (bs, sizeof (struct _gst_riff_ltxt));
|
|
||||||
len -= sizeof (struct _gst_riff_ltxt);
|
|
||||||
|
|
||||||
if (ltxt.size - 20 > 0) {
|
|
||||||
got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, ltxt.size - 20);
|
|
||||||
if (got_bytes != ltxt.size - 20) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_bytestream_flush (bs, ((ltxt.size - 20) + 1) & ~1);
|
|
||||||
len -= (((ltxt.size - 20) + 1) & ~1);
|
|
||||||
|
|
||||||
label_name = (char *) tempdata;
|
|
||||||
} else {
|
|
||||||
label_name = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
new_caps = gst_caps_new ("ltxt",
|
|
||||||
"application/x-gst-metadata",
|
|
||||||
gst_props_new ("identifier", G_TYPE_INT (ltxt.identifier),
|
|
||||||
"name", G_TYPE_STRING (label_name),
|
|
||||||
"length", G_TYPE_INT (ltxt.length), NULL));
|
|
||||||
|
|
||||||
if (gst_props_get (props, "ltxts", &caps, NULL)) {
|
|
||||||
caps = g_list_append (caps, new_caps);
|
|
||||||
} else {
|
|
||||||
caps = g_list_append (NULL, new_caps);
|
|
||||||
|
|
||||||
entry = gst_props_entry_new ("ltxts", GST_PROPS_GLIST (caps));
|
|
||||||
gst_props_add_entry (props, entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_RIFF_adtl_note:
|
|
||||||
got_bytes =
|
|
||||||
gst_bytestream_peek_bytes (bs, &tempdata,
|
|
||||||
sizeof (struct _gst_riff_note));
|
|
||||||
if (got_bytes != sizeof (struct _gst_riff_note)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
temp_note = (struct _gst_riff_note *) tempdata;
|
|
||||||
note.id = GUINT32_FROM_LE (temp_note->id);
|
|
||||||
note.size = GUINT32_FROM_LE (temp_note->size);
|
|
||||||
note.identifier = GUINT32_FROM_LE (temp_note->identifier);
|
|
||||||
|
|
||||||
gst_bytestream_flush (bs, sizeof (struct _gst_riff_note));
|
|
||||||
len -= sizeof (struct _gst_riff_note);
|
|
||||||
|
|
||||||
got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, note.size - 4);
|
|
||||||
if (got_bytes != note.size - 4) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_bytestream_flush (bs, ((note.size - 4) + 1) & ~1);
|
|
||||||
len -= (((note.size - 4) + 1) & ~1);
|
|
||||||
|
|
||||||
label_name = (char *) tempdata;
|
|
||||||
|
|
||||||
new_caps = gst_caps_new ("note",
|
|
||||||
"application/x-gst-metadata",
|
|
||||||
gst_props_new ("identifier", G_TYPE_INT (note.identifier),
|
|
||||||
"name", G_TYPE_STRING (label_name), NULL));
|
|
||||||
|
|
||||||
if (gst_props_get (props, "notes", &caps, NULL)) {
|
|
||||||
caps = g_list_append (caps, new_caps);
|
|
||||||
} else {
|
|
||||||
caps = g_list_append (NULL, new_caps);
|
|
||||||
|
|
||||||
entry = gst_props_entry_new ("notes", GST_PROPS_GLIST (caps));
|
|
||||||
gst_props_add_entry (props, entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
g_print ("Unknown chunk: %" GST_FOURCC_FORMAT "\n",
|
|
||||||
GST_FOURCC_ARGS (chunk.id));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
g_object_notify (G_OBJECT (wavparse), "metadata");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_wavparse_parse_cues (GstWavParse * wavparse, int len)
|
|
||||||
{
|
|
||||||
guint32 got_bytes;
|
|
||||||
GstByteStream *bs = wavparse->bs;
|
|
||||||
struct _gst_riff_cue *temp_cue, cue;
|
|
||||||
struct _gst_riff_cuepoints *points;
|
|
||||||
guint8 *tempdata;
|
|
||||||
int i;
|
|
||||||
GList *cues = NULL;
|
|
||||||
GstPropsEntry *entry;
|
|
||||||
|
|
||||||
while (len > 0) {
|
|
||||||
int required;
|
|
||||||
|
|
||||||
got_bytes =
|
|
||||||
gst_bytestream_peek_bytes (bs, &tempdata,
|
|
||||||
sizeof (struct _gst_riff_cue));
|
|
||||||
temp_cue = (struct _gst_riff_cue *) tempdata;
|
|
||||||
|
|
||||||
/* fixup for our big endian friends */
|
|
||||||
cue.id = GUINT32_FROM_LE (temp_cue->id);
|
|
||||||
cue.size = GUINT32_FROM_LE (temp_cue->size);
|
|
||||||
cue.cuepoints = GUINT32_FROM_LE (temp_cue->cuepoints);
|
|
||||||
|
|
||||||
gst_bytestream_flush (bs, sizeof (struct _gst_riff_cue));
|
|
||||||
if (got_bytes != sizeof (struct _gst_riff_cue)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
len -= sizeof (struct _gst_riff_cue);
|
|
||||||
|
|
||||||
/* -4 because cue.size contains the cuepoints size
|
|
||||||
and we've already flushed that out of the system */
|
|
||||||
required = cue.size - 4;
|
|
||||||
got_bytes = gst_bytestream_peek_bytes (bs, &tempdata, required);
|
|
||||||
gst_bytestream_flush (bs, ((required) + 1) & ~1);
|
|
||||||
if (got_bytes != required) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
len -= (((cue.size - 4) + 1) & ~1);
|
|
||||||
|
|
||||||
/* now we have an array of struct _gst_riff_cuepoints in tempdata */
|
|
||||||
points = (struct _gst_riff_cuepoints *) tempdata;
|
|
||||||
|
|
||||||
for (i = 0; i < cue.cuepoints; i++) {
|
|
||||||
GstCaps *caps;
|
|
||||||
|
|
||||||
caps = gst_caps_new ("cues",
|
|
||||||
"application/x-gst-metadata",
|
|
||||||
gst_props_new ("identifier", G_TYPE_INT (points[i].identifier),
|
|
||||||
"position", G_TYPE_INT (points[i].offset), NULL));
|
|
||||||
cues = g_list_append (cues, caps);
|
|
||||||
}
|
|
||||||
|
|
||||||
entry = gst_props_entry_new ("cues", GST_PROPS_GLIST (cues));
|
|
||||||
gst_props_add_entry (wavparse->metadata->properties, entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_object_notify (G_OBJECT (wavparse), "metadata");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read 'fmt ' header */
|
|
||||||
static gboolean
|
|
||||||
gst_wavparse_fmt (GstWavParse * wav)
|
|
||||||
{
|
|
||||||
gst_riff_strf_auds *header = NULL;
|
|
||||||
GstCaps *caps;
|
|
||||||
|
|
||||||
if (!gst_riff_read_strf_auds (wav, &header))
|
|
||||||
goto no_fmt;
|
|
||||||
|
|
||||||
wav->format = header->format;
|
|
||||||
wav->rate = header->rate;
|
|
||||||
wav->channels = header->channels;
|
|
||||||
if (wav->channels == 0)
|
|
||||||
goto no_channels;
|
|
||||||
|
|
||||||
wav->blockalign = header->blockalign;
|
|
||||||
wav->width = (header->blockalign * 8) / header->channels;
|
|
||||||
wav->depth = header->size;
|
|
||||||
wav->bps = header->av_bps;
|
|
||||||
if (wav->bps <= 0)
|
|
||||||
goto no_bps;
|
|
||||||
|
|
||||||
/* Note: gst_riff_create_audio_caps might need to fix values in
|
|
||||||
* the header header depending on the format, so call it first */
|
|
||||||
/* FIXME: Need to handle the channel reorder map */
|
|
||||||
caps = gst_riff_create_audio_caps (header->format, NULL, header, NULL, NULL);
|
|
||||||
g_free (header);
|
|
||||||
|
|
||||||
if (caps == NULL)
|
|
||||||
goto no_caps;
|
|
||||||
|
|
||||||
gst_wavparse_create_sourcepad (wav);
|
|
||||||
gst_pad_use_fixed_caps (wav->srcpad);
|
|
||||||
gst_pad_set_active (wav->srcpad, TRUE);
|
|
||||||
gst_pad_set_caps (wav->srcpad, caps);
|
|
||||||
gst_caps_free (caps);
|
|
||||||
gst_element_add_pad (GST_ELEMENT_CAST (wav), wav->srcpad);
|
|
||||||
gst_element_no_more_pads (GST_ELEMENT_CAST (wav));
|
|
||||||
|
|
||||||
GST_DEBUG ("frequency %u, channels %u", wav->rate, wav->channels);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
/* ERRORS */
|
|
||||||
no_fmt:
|
|
||||||
{
|
|
||||||
GST_ELEMENT_ERROR (wav, STREAM, TYPE_NOT_FOUND, (NULL),
|
|
||||||
("No FMT tag found"));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
no_channels:
|
|
||||||
{
|
|
||||||
GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL),
|
|
||||||
("Stream claims to contain zero channels - invalid data"));
|
|
||||||
g_free (header);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
no_bps:
|
|
||||||
{
|
|
||||||
GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL),
|
|
||||||
("Stream claims to bitrate of <= zero - invalid data"));
|
|
||||||
g_free (header);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
no_caps:
|
|
||||||
{
|
|
||||||
GST_ELEMENT_ERROR (wav, STREAM, TYPE_NOT_FOUND, (NULL), (NULL));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_wavparse_other (GstWavParse * wav)
|
|
||||||
{
|
|
||||||
guint32 tag, length;
|
|
||||||
|
|
||||||
if (!gst_riff_peek_head (wav, &tag, &length, NULL)) {
|
|
||||||
GST_WARNING_OBJECT (wav, "could not peek head");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
GST_DEBUG_OBJECT (wav, "got tag (%08x) %4.4s, length %u", tag,
|
|
||||||
(const gchar *) &tag, length);
|
|
||||||
|
|
||||||
switch (tag) {
|
|
||||||
case GST_RIFF_TAG_LIST:
|
|
||||||
if (!(tag = gst_riff_peek_list (wav))) {
|
|
||||||
GST_WARNING_OBJECT (wav, "could not peek list");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (tag) {
|
|
||||||
case GST_RIFF_LIST_INFO:
|
|
||||||
if (!gst_riff_read_list (wav, &tag) || !gst_riff_read_info (wav)) {
|
|
||||||
GST_WARNING_OBJECT (wav, "could not read list");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_RIFF_LIST_adtl:
|
|
||||||
if (!gst_riff_read_skip (wav)) {
|
|
||||||
GST_WARNING_OBJECT (wav, "could not read skip");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
GST_DEBUG_OBJECT (wav, "skipping tag (%08x) %4.4s", tag,
|
|
||||||
(gchar *) & tag);
|
|
||||||
if (!gst_riff_read_skip (wav)) {
|
|
||||||
GST_WARNING_OBJECT (wav, "could not read skip");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_RIFF_TAG_data:
|
|
||||||
if (!gst_bytestream_flush (wav->bs, 8)) {
|
|
||||||
GST_WARNING_OBJECT (wav, "could not flush 8 bytes");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (wav, "switching to data mode");
|
|
||||||
wav->state = GST_WAVPARSE_DATA;
|
|
||||||
wav->datastart = gst_bytestream_tell (wav->bs);
|
|
||||||
if (length == 0) {
|
|
||||||
guint64 file_length;
|
|
||||||
|
|
||||||
/* length is 0, data probably stretches to the end
|
|
||||||
* of file */
|
|
||||||
GST_DEBUG_OBJECT (wav, "length is 0 trying to find length");
|
|
||||||
/* get length of file */
|
|
||||||
file_length = gst_bytestream_length (wav->bs);
|
|
||||||
if (file_length == -1) {
|
|
||||||
GST_DEBUG_OBJECT (wav,
|
|
||||||
"could not get file length, assuming data to eof");
|
|
||||||
/* could not get length, assuming till eof */
|
|
||||||
length = G_MAXUINT32;
|
|
||||||
}
|
|
||||||
if (file_length > G_MAXUINT32) {
|
|
||||||
GST_DEBUG_OBJECT (wav, "file length %" G_GUINT64_FORMAT
|
|
||||||
", clipping to 32 bits", file_length);
|
|
||||||
/* could not get length, assuming till eof */
|
|
||||||
length = G_MAXUINT32;
|
|
||||||
} else {
|
|
||||||
GST_DEBUG_OBJECT (wav, "file length %" G_GUINT64_FORMAT
|
|
||||||
", datalength %u", file_length, length);
|
|
||||||
/* substract offset of datastart from length */
|
|
||||||
length = file_length - wav->datastart;
|
|
||||||
GST_DEBUG_OBJECT (wav, "datalength %u", length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
wav->datasize = (guint64) length;
|
|
||||||
GST_DEBUG_OBJECT (wav, "datasize = %ld", length)
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_RIFF_TAG_cue:
|
|
||||||
if (!gst_riff_read_skip (wav)) {
|
|
||||||
GST_WARNING_OBJECT (wav, "could not read skip");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
GST_WARNING_OBJECT (wav, "skipping tag %" GST_FOURCC_FORMAT,
|
|
||||||
GST_FOURCC_ARGS (tag));
|
|
||||||
if (!gst_riff_read_skip (wav))
|
|
||||||
return FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_wavparse_parse_file_header (GstElement * element, GstBuffer * buf)
|
gst_wavparse_parse_file_header (GstElement * element, GstBuffer * buf)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue