/** * gst_audio_info_is_equal: * @info: a #GstAudioInfo * @other: a #GstAudioInfo * * Compares two #GstAudioInfo and returns whether they are equal or not * * Returns: %TRUE if @info and @other are equal, else %FALSE. * * Since: 1.2 * */ gboolean gst_audio_info_is_equal (const GstAudioInfo * info, const GstAudioInfo * other) { if (info == other) return TRUE; if (info->finfo == NULL || other->finfo == NULL) return FALSE; if (GST_AUDIO_INFO_FORMAT (info) != GST_AUDIO_INFO_FORMAT (other)) return FALSE; if (GST_AUDIO_INFO_FLAGS (info) != GST_AUDIO_INFO_FLAGS (other)) return FALSE; if (GST_AUDIO_INFO_LAYOUT (info) != GST_AUDIO_INFO_LAYOUT (other)) return FALSE; if (GST_AUDIO_INFO_RATE (info) != GST_AUDIO_INFO_RATE (other)) return FALSE; if (GST_AUDIO_INFO_CHANNELS (info) != GST_AUDIO_INFO_CHANNELS (other)) return FALSE; if (GST_AUDIO_INFO_CHANNELS (info) > 64) return TRUE; if (memcmp (info->position, other->position, GST_AUDIO_INFO_CHANNELS (info) * sizeof (GstAudioChannelPosition)) != 0) return FALSE; return TRUE; }
static gboolean gst_raw_audio_parse_caps_to_config (GstRawAudioParse * raw_audio_parse, GstCaps * caps, GstRawAudioParseConfig * config) { gboolean ret = FALSE; GstStructure *structure; /* Caps might get copied, and the copy needs to be unref'd. * Also, the caller retains ownership over the original caps. * So, to make this mechanism also work with cases where the * caps are *not* copied, ref the original caps here first. */ gst_caps_ref (caps); structure = gst_caps_get_structure (caps, 0); /* For unaligned raw data, the output caps stay the same, * except that audio/x-unaligned-raw becomes audio/x-raw, * since the parser aligns the sample data */ if (gst_structure_has_name (structure, "audio/x-unaligned-raw")) { /* Copy the caps to be able to modify them */ GstCaps *new_caps = gst_caps_copy (caps); gst_caps_unref (caps); caps = new_caps; /* Change the media type to audio/x-raw , otherwise * gst_audio_info_from_caps() won't work */ structure = gst_caps_get_structure (caps, 0); gst_structure_set_name (structure, "audio/x-raw"); } if (gst_structure_has_name (structure, "audio/x-raw")) { guint num_channels; GstAudioInfo info; if (!gst_audio_info_from_caps (&info, caps)) { GST_ERROR_OBJECT (raw_audio_parse, "failed to parse caps %" GST_PTR_FORMAT, (gpointer) caps); goto done; } num_channels = GST_AUDIO_INFO_CHANNELS (&info); config->format = GST_RAW_AUDIO_PARSE_FORMAT_PCM; config->pcm_format = GST_AUDIO_INFO_FORMAT (&info); config->bpf = GST_AUDIO_INFO_BPF (&info); config->sample_rate = GST_AUDIO_INFO_RATE (&info); config->interleaved = (GST_AUDIO_INFO_LAYOUT (&info) == GST_AUDIO_LAYOUT_INTERLEAVED); gst_raw_audio_parse_set_config_channels (config, num_channels, 0, FALSE); memcpy (config->channel_positions, &(GST_AUDIO_INFO_POSITION (&info, 0)), sizeof (GstAudioChannelPosition) * num_channels); } else if (gst_structure_has_name (structure, "audio/x-alaw") || gst_structure_has_name (structure, "audio/x-mulaw")) { gint i; guint64 channel_mask; guint num_channels; config->format = gst_structure_has_name (structure, "audio/x-alaw") ? GST_RAW_AUDIO_PARSE_FORMAT_ALAW : GST_RAW_AUDIO_PARSE_FORMAT_MULAW; if (!gst_structure_get_int (structure, "rate", &i)) { GST_ERROR_OBJECT (raw_audio_parse, "missing rate value in caps %" GST_PTR_FORMAT, (gpointer) caps); goto done; } config->sample_rate = i; if (!gst_structure_get_int (structure, "channels", &i)) { GST_ERROR_OBJECT (raw_audio_parse, "missing channels value in caps %" GST_PTR_FORMAT, (gpointer) caps); goto done; } num_channels = i; if (!gst_structure_get (structure, "channel-mask", GST_TYPE_BITMASK, &channel_mask, NULL)) { channel_mask = gst_audio_channel_get_fallback_mask (num_channels); GST_DEBUG_OBJECT (raw_audio_parse, "input caps have no channel mask - using fallback mask %#" G_GINT64_MODIFIER "x for %u channels", channel_mask, num_channels); } if (!gst_raw_audio_parse_set_config_channels (config, num_channels, channel_mask, TRUE)) { GST_ERROR_OBJECT (raw_audio_parse, "could not use channel mask %#" G_GINT64_MODIFIER "x for channel positions", channel_mask); goto done; } /* A-law and mu-law both use 1 byte per sample */ config->bpf = 1 * num_channels; } else { GST_ERROR_OBJECT (raw_audio_parse, "caps %" GST_PTR_FORMAT " have an unsupported media type", (gpointer) caps); goto done; } ret = TRUE; done: gst_caps_unref (caps); if (ret) config->ready = TRUE; return ret; }