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
gst_wavparse_parse_file_header (GstElement * element, GstBuffer * buf)
{