static GstFlowReturn interleave_chain_func (GstPad * pad, GstBuffer * buffer) { gfloat *outdata; gint i; fail_unless (GST_IS_BUFFER (buffer)); fail_unless_equals_int (GST_BUFFER_SIZE (buffer), 48000 * 2 * sizeof (gfloat)); fail_unless (GST_BUFFER_DATA (buffer) != NULL); outdata = (gfloat *) GST_BUFFER_DATA (buffer); for (i = 0; i < 48000 * 2; i += 2) { fail_unless_equals_float (outdata[i], input[0]); fail_unless_equals_float (outdata[i + 1], input[1]); } have_data++; gst_buffer_unref (buffer); return GST_FLOW_OK; }
static GstFlowReturn interleave_chain_func (GstPad * pad, GstObject * parent, GstBuffer * buffer) { GstMapInfo map; gfloat *outdata; gint i; fail_unless (GST_IS_BUFFER (buffer)); fail_unless (!GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_GAP)); gst_buffer_map (buffer, &map, GST_MAP_READ); outdata = (gfloat *) map.data; fail_unless (outdata != NULL); #ifdef HAVE_VALGRIND if (!(RUNNING_ON_VALGRIND)) #endif for (i = 0; i < map.size / sizeof (float); i += 2) { fail_unless_equals_float (outdata[i], input[0]); fail_unless_equals_float (outdata[i + 1], input[1]); } g_mutex_lock (&data_mutex); have_data += map.size; g_cond_signal (&data_cond); g_mutex_unlock (&data_mutex); gst_buffer_unmap (buffer, &map); gst_buffer_unref (buffer); return GST_FLOW_OK; }
static GstFlowReturn interleave_chain_func (GstPad * pad, GstObject * parent, GstBuffer * buffer) { GstMapInfo map; gfloat *outdata; gint i; fail_unless (GST_IS_BUFFER (buffer)); gst_buffer_map (buffer, &map, GST_MAP_READ); outdata = (gfloat *) map.data; fail_unless_equals_int (map.size, 48000 * 2 * sizeof (gfloat)); fail_unless (outdata != NULL); #ifdef HAVE_VALGRIND if (!(RUNNING_ON_VALGRIND)) #endif for (i = 0; i < 48000 * 2; i += 2) { fail_unless_equals_float (outdata[i], input[0]); fail_unless_equals_float (outdata[i + 1], input[1]); } gst_buffer_unmap (buffer, &map); gst_buffer_unref (buffer); have_data++; return GST_FLOW_OK; }
static void sink_handoff_float32 (GstElement * element, GstBuffer * buffer, GstPad * pad, gpointer user_data) { gint i; GstMapInfo map; gfloat *data; GstCaps *caps, *ccaps; gint n = GPOINTER_TO_INT (user_data); guint64 mask; fail_unless (GST_IS_BUFFER (buffer)); gst_buffer_map (buffer, &map, GST_MAP_READ); data = (gfloat *) map.data; fail_unless_equals_int (map.size, 48000 * 2 * sizeof (gfloat)); fail_unless_equals_int (GST_BUFFER_DURATION (buffer), GST_SECOND); if (n == 0) { GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE }; gst_audio_channel_positions_to_mask (pos, 2, FALSE, &mask); } else if (n == 1) { GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT }; gst_audio_channel_positions_to_mask (pos, 2, FALSE, &mask); } else if (n == 2) { GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_REAR_CENTER }; gst_audio_channel_positions_to_mask (pos, 2, FALSE, &mask); } else { g_assert_not_reached (); } caps = gst_caps_new_simple ("audio/x-raw", "format", G_TYPE_STRING, GST_AUDIO_NE (F32), "channels", G_TYPE_INT, 2, "rate", G_TYPE_INT, 48000, "layout", G_TYPE_STRING, "interleaved", "channel-mask", GST_TYPE_BITMASK, mask, NULL); ccaps = gst_pad_get_current_caps (pad); fail_unless (gst_caps_is_equal (caps, ccaps)); gst_caps_unref (ccaps); gst_caps_unref (caps); #ifdef HAVE_VALGRIND if (!(RUNNING_ON_VALGRIND)) #endif for (i = 0; i < 48000 * 2; i += 2) { fail_unless_equals_float (data[i], -1.0); fail_unless_equals_float (data[i + 1], 1.0); } gst_buffer_unmap (buffer, &map); have_data++; }
static void sink_handoff_float32 (GstElement * element, GstBuffer * buffer, GstPad * pad, gpointer user_data) { gint i; gfloat *data; GstCaps *caps; gint n = GPOINTER_TO_INT (user_data); fail_unless (GST_IS_BUFFER (buffer)); fail_unless_equals_int (GST_BUFFER_SIZE (buffer), 48000 * 2 * sizeof (gfloat)); fail_unless_equals_int (GST_BUFFER_DURATION (buffer), GST_SECOND); caps = gst_caps_new_simple ("audio/x-raw-float", "width", G_TYPE_INT, 32, "channels", G_TYPE_INT, 2, "rate", G_TYPE_INT, 48000, "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL); if (n == 0) { GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_NONE, GST_AUDIO_CHANNEL_POSITION_NONE }; gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos); } else if (n == 1) { GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT }; gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos); } else if (n == 2) { GstAudioChannelPosition pos[2] = { GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_REAR_CENTER }; gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos); } fail_unless (gst_caps_is_equal (caps, GST_BUFFER_CAPS (buffer))); gst_caps_unref (caps); data = (gfloat *) GST_BUFFER_DATA (buffer); for (i = 0; i < 48000 * 2; i += 2) { fail_unless_equals_float (data[i], -1.0); fail_unless_equals_float (data[i + 1], 1.0); } have_data++; }
static GstBusSyncReply on_message (GstBus * bus, GstMessage * message, gpointer user_data) { const GstStructure *s = gst_message_get_structure (message); const gchar *name = gst_structure_get_name (s); GValueArray *rms_arr; const GValue *array_val; const GValue *value; gdouble rms; gint channels2; guint i; GstClockTime *rtime; if (message->type != GST_MESSAGE_ELEMENT || strcmp (name, "videoframe-audiolevel") != 0) goto done; num_msgs++; rtime = g_new (GstClockTime, 1); if (!gst_structure_get_clock_time (s, "running-time", rtime)) { g_warning ("Could not parse running time"); g_free (rtime); } else { g_queue_push_tail (&msg_timestamp_q, rtime); } /* the values are packed into GValueArrays with the value per channel */ array_val = gst_structure_get_value (s, "rms"); rms_arr = (GValueArray *) g_value_get_boxed (array_val); channels2 = rms_arr->n_values; fail_unless_equals_int (channels2, channels); for (i = 0; i < channels; ++i) { value = g_value_array_get_nth (rms_arr, i); rms = g_value_get_double (value); if (per_channel) { fail_unless_equals_float (rms, expected_rms_per_channel[i]); } else if (early_video && *rtime <= 50 * GST_MSECOND) { fail_unless_equals_float (rms, 0); } else { fail_unless_equals_float (rms, expected_rms); } } done: return GST_BUS_PASS; }