Example #1
0
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++;
}
Example #5
0
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;
}