gst/auparse/gstauparse.c: add support for ADPCM streams (CCITT g72x) decoder for those in the works

Original commit message from CVS:
* gst/auparse/gstauparse.c : add support for ADPCM streams (CCITT g72x)
decoder for those in the works
This commit is contained in:
Stéphane Loeuillet 2004-05-14 10:01:23 +00:00
parent 39ca83a534
commit 75263d8875

View file

@ -51,10 +51,11 @@ static GstStaticPadTemplate gst_auparse_src_template =
GST_PAD_SOMETIMES, /* FIXME: spider */
GST_STATIC_CAPS (GST_AUDIO_INT_PAD_TEMPLATE_CAPS "; " /* 24-bit PCM is barely supported by gstreamer actually */
GST_AUDIO_FLOAT_PAD_TEMPLATE_CAPS "; " /* 64-bit float is barely supported by gstreamer actually */
"audio/x-alaw, " "rate = (int) [ 8000, 192000 ], " "channels = (int) [ 1, 2 ]; " "audio/x-mulaw, " "rate = (int) [ 8000, 192000 ], " "channels = (int) [ 1, 2 ]" /*"; "
"audio/x-adpcm, "
"layout = (string) { g721, g722, g723_3, g723_5 }" */ )
/* Nothing to decode those ADPCM streams for now */
"audio/x-alaw, " "rate = (int) [ 8000, 192000 ], "
"channels = (int) [ 1, 2 ]" "; " "audio/x-mulaw, "
"rate = (int) [ 8000, 192000 ], " "channels = (int) [ 1, 2 ]" "; "
/* Nothing to decode those ADPCM streams for now */
"audio/x-adpcm, " "layout = (string) { g721, g722, g723_3, g723_5 }")
);
/* AuParse signals and args */
@ -165,6 +166,9 @@ gst_auparse_chain (GstPad * pad, GstData * _data)
glong size;
GstCaps *tempcaps;
gint law = 0, depth, ieee = 0;
gchar layout[7];
layout[0] = 0;
g_return_if_fail (pad != NULL);
g_return_if_fail (GST_IS_PAD (pad));
@ -184,34 +188,36 @@ gst_auparse_chain (GstPad * pad, GstData * _data)
guint32 *head = (guint32 *) data;
/* normal format is big endian (au is a Sparc format) */
if (GUINT32_FROM_BE (*head) == 0x2e736e64) { /* ".snd" */
if (GST_READ_UINT32_BE (head) == 0x2e736e64) { /* ".snd" */
head++;
auparse->le = 0;
auparse->offset = GUINT32_FROM_BE (*head);
auparse->offset = GST_READ_UINT32_BE (head);
head++;
auparse->size = GUINT32_FROM_BE (*head); /* Do not trust size, could be set to -1 : unknown */
/* Do not trust size, could be set to -1 : unknown */
auparse->size = GST_READ_UINT32_BE (head);
head++;
auparse->encoding = GUINT32_FROM_BE (*head);
auparse->encoding = GST_READ_UINT32_BE (head);
head++;
auparse->frequency = GUINT32_FROM_BE (*head);
auparse->frequency = GST_READ_UINT32_BE (head);
head++;
auparse->channels = GUINT32_FROM_BE (*head);
auparse->channels = GST_READ_UINT32_BE (head);
head++;
/* and of course, someone had to invent a little endian
* version. Used by DEC systems. */
} else if (GUINT32_FROM_LE (*head) == 0x0064732E) { /* other source say it is "dns." */
} else if (GST_READ_UINT32_LE (head) == 0x0064732E) { /* other source say it is "dns." */
head++;
auparse->le = 1;
auparse->offset = GUINT32_FROM_LE (*head);
auparse->offset = GST_READ_UINT32_LE (head);
head++;
auparse->size = GUINT32_FROM_LE (*head); /* Do not trust size, could be set to -1 : unknown */
/* Do not trust size, could be set to -1 : unknown */
auparse->size = GST_READ_UINT32_LE (head);
head++;
auparse->encoding = GUINT32_FROM_LE (*head);
auparse->encoding = GST_READ_UINT32_LE (*head);
head++;
auparse->frequency = GUINT32_FROM_LE (*head);
auparse->frequency = GST_READ_UINT32_LE (*head);
head++;
auparse->channels = GUINT32_FROM_LE (*head);
auparse->channels = GST_READ_UINT32_LE (*head);
head++;
} else {
@ -268,6 +274,19 @@ Samples :
depth = 64;
break;
case 23: /* 4-bit CCITT G.721 ADPCM 32kbps -> modplug/libsndfile (compressed 8-bit mu-law) */
strcpy (layout, "g721");
break;
case 24: /* 8-bit CCITT G.722 ADPCM -> rtp */
strcpy (layout, "g722");
break;
case 25: /* 3-bit CCITT G.723.3 ADPCM 24kbps -> rtp/xine/modplug/libsndfile */
strcpy (layout, "g723_3");
break;
case 26: /* 5-bit CCITT G.723.5 ADPCM 40kbps -> rtp/xine/modplug/libsndfile */
strcpy (layout, "g723_5");
break;
case 8: /* Fragmented sample data */
case 9: /* AU_ENCODING_NESTED */
@ -287,11 +306,6 @@ Samples :
case 21: /* Music kit DSP commands */
case 22: /* Music kit DSP commands samples */
case 23: /* 4-bit CCITT G.721 ADPCM 32kbps -> modplug/libsndfile (compressed 8-bit mu-law) */
case 24: /* 8-bit CCITT G.722 ADPCM -> rtp */
case 25: /* 3-bit CCITT G.723.3 ADPCM 24kbps -> rtp/xine/modplug/libsndfile */
case 26: /* 5-bit CCITT G.723.5 ADPCM 40kbps -> rtp/xine/modplug/libsndfile */
default:
GST_ELEMENT_ERROR (auparse, STREAM, FORMAT, (NULL), (NULL));
gst_buffer_unref (buf);
@ -313,11 +327,9 @@ Samples :
"width", G_TYPE_INT, depth,
"endianness", G_TYPE_INT,
auparse->le ? G_LITTLE_ENDIAN : G_BIG_ENDIAN, NULL);
/*
} else if (layout) {
} else if (layout[0]) {
tempcaps = gst_caps_new_simple ("audio/x-adpcm",
"layout", G_TYPE_STRING, layout, NULL);
*/
} else {
tempcaps = gst_caps_new_simple ("audio/x-raw-int",
"endianness", G_TYPE_INT,