static void log_md5_sum (const char *file, struct sound_params sound_params, const struct decoder *f, uint8_t *md5, long md5_len) { unsigned int ix, bps; char md5sum[MD5_DIGEST_SIZE * 2 + 1], format; const char *fn, *endian; for (ix = 0; ix < MD5_DIGEST_SIZE; ix += 1) sprintf (&md5sum[ix * 2], "%02x", md5[ix]); md5sum[MD5_DIGEST_SIZE * 2] = 0x00; switch (sound_params.fmt & SFMT_MASK_FORMAT) { case SFMT_S8: case SFMT_S16: case SFMT_S32: format = 's'; break; case SFMT_U8: case SFMT_U16: case SFMT_U32: format = 'u'; break; case SFMT_FLOAT: format = 'f'; break; default: debug ("Unknown sound format: 0x%04lx", sound_params.fmt); return; } bps = sfmt_Bps (sound_params.fmt) * 8; endian = ""; if (format != 'f' && bps != 8) { if (sound_params.fmt & SFMT_LE) endian = "le"; else if (sound_params.fmt & SFMT_BE) endian = "be"; } fn = strrchr (file, '/'); fn = fn ? fn + 1 : file; debug ("MD5(%s) = %s %ld %s %c%u%s %d %d", fn, md5sum, md5_len, get_decoder_name (f), format, bps, endian, sound_params.channels, sound_params.rate); }
static void kms_webrtc_data_session_bin_init (KmsWebRtcDataSessionBin * self) { GstPadTemplate *pad_template; GstPad *pad, *target; gchar *name; self->priv = KMS_WEBRTC_DATA_SESSION_BIN_GET_PRIVATE (self); g_rec_mutex_init (&self->priv->mutex); self->priv->data_channels = g_hash_table_new (g_direct_hash, g_direct_equal); self->priv->channels = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_object_unref); self->priv->assoc_id = get_sctp_association_id (); self->priv->session_established = FALSE; self->priv->even_id = 0; self->priv->odd_id = 1; self->priv->pool = g_thread_pool_new (reset_stream_async, self, -1, FALSE, NULL); name = get_decoder_name (self->priv->assoc_id); self->priv->sctpdec = gst_element_factory_make ("sctpdec", name); g_free (name); name = get_encoder_name (self->priv->assoc_id); self->priv->sctpenc = gst_element_factory_make ("sctpenc", name); g_free (name); g_object_set (self->priv->sctpdec, "sctp-association-id", self->priv->assoc_id, NULL); g_object_set (self->priv->sctpenc, "sctp-association-id", self->priv->assoc_id, "use-sock-stream", TRUE, NULL); g_object_bind_property (self, "sctp-local-port", self->priv->sctpdec, "local-sctp-port", G_BINDING_SYNC_CREATE); g_object_bind_property (self, "sctp-remote-port", self->priv->sctpenc, "remote-sctp-port", G_BINDING_SYNC_CREATE); g_signal_connect (self->priv->sctpdec, "pad-added", G_CALLBACK (kms_webrtc_data_session_bin_pad_added), self); g_signal_connect (self->priv->sctpdec, "pad-removed", G_CALLBACK (kms_webrtc_data_session_bin_pad_removed), self); g_signal_connect (self->priv->sctpenc, "sctp-association-established", G_CALLBACK (kms_webrtc_data_session_bin_association_established), self); gst_bin_add_many (GST_BIN (self), self->priv->sctpdec, self->priv->sctpenc, NULL); target = gst_element_get_static_pad (self->priv->sctpdec, "sink"); pad_template = gst_static_pad_template_get (&sink_template); pad = gst_ghost_pad_new_from_template ("sink", target, pad_template); g_object_unref (pad_template); g_object_unref (target); gst_element_add_pad (GST_ELEMENT (self), pad); target = gst_element_get_static_pad (self->priv->sctpenc, "src"); pad_template = gst_static_pad_template_get (&src_template); pad = gst_ghost_pad_new_from_template ("src", target, pad_template); g_object_unref (pad_template); g_object_unref (target); gst_element_add_pad (GST_ELEMENT (self), pad); gst_element_sync_state_with_parent (self->priv->sctpdec); gst_element_sync_state_with_parent (self->priv->sctpenc); }