gint channels_max = 2;
switch (codec_id) {
- case GST_RIFF_WAVE_FORMAT_MPEGL3: /* mp3 */
- caps = gst_caps_new_simple ("audio/mpeg",
- "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL);
- if (codec_name)
- *codec_name = g_strdup ("MPEG-1 layer 3");
- break;
-
- case GST_RIFF_WAVE_FORMAT_MPEGL12: /* mp1 or mp2 */
- caps = gst_caps_new_simple ("audio/mpeg",
- "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 2, NULL);
- if (codec_name)
- *codec_name = g_strdup ("MPEG-1 layer 2");
- break;
-
case GST_RIFF_WAVE_FORMAT_PCM: /* PCM */
if (strf != NULL) {
gint ba = strf->blockalign;
block_align = TRUE;
break;
+ case GST_RIFF_WAVE_FORMAT_IBM_CVSD:
+ goto unknown;
+
+ case GST_RIFF_WAVE_FORMAT_ALAW:
+ if (strf != NULL) {
+ if (strf->size != 8) {
+ GST_WARNING ("invalid depth (%d) of alaw audio, overwriting.",
+ strf->size);
+ strf->size = 8;
+ strf->av_bps = 8;
+ strf->blockalign = strf->av_bps * strf->channels;
+ }
+ if (strf->av_bps == 0 || strf->blockalign == 0) {
+ GST_WARNING ("fixing av_bps (%d) and blockalign (%d) of alaw audio",
+ strf->av_bps, strf->blockalign);
+ strf->av_bps = strf->size;
+ strf->blockalign = strf->av_bps * strf->channels;
+ }
+ }
+ caps = gst_caps_new_simple ("audio/x-alaw", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("A-law audio");
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_MULAW:
+ if (strf != NULL) {
+ if (strf->size != 8) {
+ GST_WARNING ("invalid depth (%d) of mulaw audio, overwriting.",
+ strf->size);
+ strf->size = 8;
+ strf->av_bps = 8;
+ strf->blockalign = strf->av_bps * strf->channels;
+ }
+ if (strf->av_bps == 0 || strf->blockalign == 0) {
+ GST_WARNING ("fixing av_bps (%d) and blockalign (%d) of mulaw audio",
+ strf->av_bps, strf->blockalign);
+ strf->av_bps = strf->size;
+ strf->blockalign = strf->av_bps * strf->channels;
+ }
+ }
+ caps = gst_caps_new_simple ("audio/x-mulaw", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("Mu-law audio");
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_OKI_ADPCM:
+ goto unknown;
+
case GST_RIFF_WAVE_FORMAT_DVI_ADPCM:
caps = gst_caps_new_simple ("audio/x-adpcm",
"layout", G_TYPE_STRING, "dvi", NULL);
block_align = TRUE;
break;
- case GST_RIFF_WAVE_FORMAT_MULAW:
- if (strf != NULL && strf->size != 8) {
- GST_WARNING ("invalid depth (%d) of mulaw audio, overwriting.",
- strf->size);
- strf->size = 8;
- strf->av_bps = 8;
- strf->blockalign = strf->av_bps * strf->channels;
- }
- if (strf != NULL && (strf->av_bps == 0 || strf->blockalign == 0)) {
- GST_WARNING ("fixing av_bps (%d) and blockalign (%d) of mulaw audio",
- strf->av_bps, strf->blockalign);
- strf->av_bps = strf->size;
- strf->blockalign = strf->av_bps * strf->channels;
- }
- caps = gst_caps_new_simple ("audio/x-mulaw", NULL);
+ case GST_RIFF_WAVE_FORMAT_GSM610:
+ case GST_RIFF_WAVE_FORMAT_MSN:
+ caps = gst_caps_new_simple ("audio/ms-gsm", NULL);
if (codec_name)
- *codec_name = g_strdup ("Mu-law audio");
+ *codec_name = g_strdup ("MS GSM audio");
break;
- case GST_RIFF_WAVE_FORMAT_ALAW:
- if (strf != NULL && strf->size != 8) {
- GST_WARNING ("invalid depth (%d) of alaw audio, overwriting.",
- strf->size);
- strf->size = 8;
- strf->av_bps = 8;
- strf->blockalign = strf->av_bps * strf->channels;
- }
- if (strf != NULL && (strf->av_bps == 0 || strf->blockalign == 0)) {
- GST_WARNING ("fixing av_bps (%d) and blockalign (%d) of alaw audio",
- strf->av_bps, strf->blockalign);
- strf->av_bps = strf->size;
- strf->blockalign = strf->av_bps * strf->channels;
- }
- caps = gst_caps_new_simple ("audio/x-alaw", NULL);
+ case GST_RIFF_WAVE_FORMAT_MPEGL12: /* mp1 or mp2 */
+ caps = gst_caps_new_simple ("audio/mpeg",
+ "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 2, NULL);
if (codec_name)
- *codec_name = g_strdup ("A-law audio");
+ *codec_name = g_strdup ("MPEG-1 layer 2");
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_MPEGL3: /* mp3 */
+ caps = gst_caps_new_simple ("audio/mpeg",
+ "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3, NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("MPEG-1 layer 3");
break;
case GST_RIFF_WAVE_FORMAT_VORBIS1: /* ogg/vorbis mode 1 */
break;
}
default:
+ unknown:
GST_WARNING ("Unknown audio tag 0x%04x", codec_id);
return NULL;
}
gst_riff_create_audio_template_caps (void)
{
static const guint16 tags[] = {
+ GST_RIFF_WAVE_FORMAT_GSM610,
GST_RIFF_WAVE_FORMAT_MPEGL3,
GST_RIFF_WAVE_FORMAT_MPEGL12,
GST_RIFF_WAVE_FORMAT_PCM,
#ifdef HAVE_XSHM
if (xvimagesink->xcontext->use_xshm) {
if (xvimage->SHMInfo.shmaddr != ((void *) -1)) {
- GST_DEBUG_OBJECT (xvimagesink, "XServer ShmDetaching from 0x%x id 0x%x\n",
+ GST_DEBUG_OBJECT (xvimagesink, "XServer ShmDetaching from 0x%x id 0x%x",
xvimage->SHMInfo.shmid, xvimage->SHMInfo.shmseg);
XShmDetach (xvimagesink->xcontext->disp, &xvimage->SHMInfo);
XSync (xvimagesink->xcontext->disp, FALSE);
/* Sync to ensure we see any errors we caused */
XSync (xcontext->disp, FALSE);
- GST_DEBUG ("XServer ShmAttached to 0x%x, id 0x%x\n", SHMInfo.shmid,
+ GST_DEBUG ("XServer ShmAttached to 0x%x, id 0x%x", SHMInfo.shmid,
SHMInfo.shmseg);
if (!error_caught) {
XSetErrorHandler (handler);
if (did_attach) {
- GST_DEBUG ("XServer ShmDetaching from 0x%x id 0x%x\n",
+ GST_DEBUG ("XServer ShmDetaching from 0x%x id 0x%x",
SHMInfo.shmid, SHMInfo.shmseg);
XShmDetach (xcontext->disp, &SHMInfo);
XSync (xcontext->disp, FALSE);
}
XSync (xvimagesink->xcontext->disp, FALSE);
- GST_DEBUG_OBJECT (xvimagesink, "XServer ShmAttached to 0x%x, id 0x%x\n",
+ GST_DEBUG_OBJECT (xvimagesink, "XServer ShmAttached to 0x%x, id 0x%x",
xvimage->SHMInfo.shmid, xvimage->SHMInfo.shmseg);
} else
#endif /* HAVE_XSHM */
g_return_val_if_fail (xcontext != NULL, NULL);
/* First let's check that XVideo extension is available */
- if (!XQueryExtension (xcontext->disp, "XVideo", &i, &i, &i)) {
- GST_ELEMENT_ERROR (xvimagesink, RESOURCE, SETTINGS,
- ("Could not initialise Xv output"),
- ("XVideo extension is not available"));
- return NULL;
- }
+ if (!XQueryExtension (xcontext->disp, "XVideo", &i, &i, &i))
+ goto no_extension;
/* Then we get adaptors list */
if (Success != XvQueryAdaptors (xcontext->disp, xcontext->root,
- &nb_adaptors, &adaptors)) {
- GST_ELEMENT_ERROR (xvimagesink, RESOURCE, SETTINGS,
- ("Could not initialise Xv output"),
- ("Failed getting XV adaptors list"));
- return NULL;
- }
+ &nb_adaptors, &adaptors))
+ goto no_adaptors;
xcontext->xv_port_id = 0;
GST_DEBUG ("XV Adaptor %s with %ld ports", adaptors[i].name,
adaptors[i].num_ports);
-
}
XvFreeAdaptorInfo (adaptors);
- if (!xcontext->xv_port_id) {
- GST_ELEMENT_ERROR (xvimagesink, RESOURCE, BUSY,
- ("Could not initialise Xv output"), ("No port available"));
- return NULL;
- }
+ if (!xcontext->xv_port_id)
+ goto no_port;
/* Set XV_AUTOPAINT_COLORKEY and XV_DOUBLE_BUFFER and XV_COLORKEY */
{
GST_DEBUG ("Generated the following caps: %" GST_PTR_FORMAT, caps);
- if (gst_caps_is_empty (caps)) {
+ if (gst_caps_is_empty (caps))
+ goto no_caps;
+
+ return caps;
+
+ /* ERRORS */
+no_extension:
+ {
+ GST_ELEMENT_ERROR (xvimagesink, RESOURCE, SETTINGS,
+ ("Could not initialise Xv output"),
+ ("XVideo extension is not available"));
+ return NULL;
+ }
+no_adaptors:
+ {
+ GST_ELEMENT_ERROR (xvimagesink, RESOURCE, SETTINGS,
+ ("Could not initialise Xv output"),
+ ("Failed getting XV adaptors list"));
+ return NULL;
+ }
+no_port:
+ {
+ GST_ELEMENT_ERROR (xvimagesink, RESOURCE, BUSY,
+ ("Could not initialise Xv output"), ("No port available"));
+ return NULL;
+ }
+no_caps:
+ {
gst_caps_unref (caps);
XvUngrabPort (xcontext->disp, xcontext->xv_port_id, 0);
GST_ELEMENT_ERROR (xvimagesink, STREAM, WRONG_TYPE, (NULL),
("No supported format found"));
return NULL;
}
-
- return caps;
}
static gpointer
GST_BUFFER_CAPS (buf));
if (!xvimagesink->xvimage)
- /* The create method should have posted an informative error */
goto no_image;
- if (xvimagesink->xvimage->size < GST_BUFFER_SIZE (buf)) {
- GST_ELEMENT_ERROR (xvimagesink, RESOURCE, WRITE,
- ("Failed to create output image buffer of %dx%d pixels",
- xvimagesink->xvimage->width, xvimagesink->xvimage->height),
- ("XServer allocated buffer size did not match input buffer"));
-
- gst_xvimage_buffer_destroy (xvimagesink->xvimage);
- xvimagesink->xvimage = NULL;
- goto no_image;
- }
+ if (xvimagesink->xvimage->size < GST_BUFFER_SIZE (buf))
+ goto wrong_size;
}
memcpy (xvimagesink->xvimage->xvimage->data,
gst_xvimagesink_xvimage_put (xvimagesink, xvimagesink->xvimage);
}
-
return GST_FLOW_OK;
/* ERRORS */
{
/* No image available. That's very bad ! */
GST_WARNING_OBJECT (xvimagesink, "could not create image");
+ /* The create method should have posted an informative error */
+ return GST_FLOW_ERROR;
+ }
+wrong_size:
+ {
+ /* we have a buffer but the size was not what we expected */
+ GST_ELEMENT_ERROR (xvimagesink, RESOURCE, WRITE,
+ ("Failed to create output image buffer of %dx%d pixels",
+ xvimagesink->xvimage->width, xvimagesink->xvimage->height),
+ ("XServer allocated buffer size did not match input buffer"));
+ gst_xvimage_buffer_destroy (xvimagesink->xvimage);
+ xvimagesink->xvimage = NULL;
return GST_FLOW_ERROR;
}
}