static void seek_to (AppInfo * info, gdouble percent) { GstSeekFlags seek_flags; gint64 seek_pos, dur = -1; if (!gst_element_query_duration (info->pipe, GST_FORMAT_TIME, &dur) || dur <= 0) { g_printerr ("Could not query duration\n"); return; } seek_pos = gst_gdouble_to_guint64 (gst_guint64_to_gdouble (dur) * percent); g_print ("Seeking to %" GST_TIME_FORMAT ", accurate: %d\n", GST_TIME_ARGS (seek_pos), info->accurate); seek_flags = GST_SEEK_FLAG_FLUSH; if (info->accurate) seek_flags |= GST_SEEK_FLAG_ACCURATE; else seek_flags |= GST_SEEK_FLAG_KEY_UNIT; if (!gst_element_seek_simple (info->pipe, GST_FORMAT_TIME, seek_flags, seek_pos)) { g_printerr ("Seek failed.\n"); return; } }
void test_math_scale_random() { guint64 val, num, denom, res; GRand *rand; gint i; xmlfile = "gstutils_test_math_scale_random"; std_log(LOG_FILENAME_LINE, "Test Started gstutils_test_math_scale_random"); rand = g_rand_new (); i = 100000; while (i--) { guint64 check, diff; val = ((guint64) g_rand_int (rand)) << 32 | g_rand_int (rand); num = ((guint64) g_rand_int (rand)) << 32 | g_rand_int (rand); denom = ((guint64) g_rand_int (rand)) << 32 | g_rand_int (rand); res = gst_util_uint64_scale (val, num, denom); check = gst_gdouble_to_guint64 (gst_guint64_to_gdouble (val) * gst_guint64_to_gdouble (num) / gst_guint64_to_gdouble (denom)); if (res < G_MAXUINT64 && check < G_MAXUINT64) { if (res > check) diff = res - check; else diff = check - res; /* some arbitrary value, really.. someone do the proper math to get * the upper bound */ if (diff > 20000) fail_if (diff > 20000); } } g_rand_free (rand); std_log(LOG_FILENAME_LINE, "Test Successful"); create_xml(0); }
static void gst_mio_video_src_init (GstMIOVideoSrc * self, GstMIOVideoSrcClass * gclass) { GstBaseSrc *base_src = GST_BASE_SRC_CAST (self); guint64 host_freq; gst_base_src_set_live (base_src, TRUE); gst_base_src_set_format (base_src, GST_FORMAT_TIME); host_freq = gst_gdouble_to_guint64 (CVGetHostClockFrequency ()); if (host_freq <= GST_SECOND) { self->cv_ratio_n = GST_SECOND / host_freq; self->cv_ratio_d = 1; } else { self->cv_ratio_n = 1; self->cv_ratio_d = host_freq / GST_SECOND; } self->queue = g_queue_new (); self->qlock = g_mutex_new (); self->qcond = g_cond_new (); }
static GstFlowReturn gst_level_transform_ip (GstBaseTransform * trans, GstBuffer * in) { GstLevel *filter; GstMapInfo map; guint8 *in_data; gsize in_size; gdouble CS; guint i; guint num_frames; guint num_int_samples = 0; /* number of interleaved samples * ie. total count for all channels combined */ guint block_size, block_int_size; /* we subdivide buffers to not skip message * intervals */ GstClockTimeDiff falloff_time; gint channels, rate, bps; filter = GST_LEVEL (trans); channels = GST_AUDIO_INFO_CHANNELS (&filter->info); bps = GST_AUDIO_INFO_BPS (&filter->info); rate = GST_AUDIO_INFO_RATE (&filter->info); gst_buffer_map (in, &map, GST_MAP_READ); in_data = map.data; in_size = map.size; num_int_samples = in_size / bps; GST_LOG_OBJECT (filter, "analyzing %u sample frames at ts %" GST_TIME_FORMAT, num_int_samples, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (in))); g_return_val_if_fail (num_int_samples % channels == 0, GST_FLOW_ERROR); if (GST_BUFFER_FLAG_IS_SET (in, GST_BUFFER_FLAG_DISCONT)) { filter->message_ts = GST_BUFFER_TIMESTAMP (in); filter->num_frames = 0; } if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (filter->message_ts))) { filter->message_ts = GST_BUFFER_TIMESTAMP (in); } num_frames = num_int_samples / channels; while (num_frames > 0) { block_size = filter->interval_frames - filter->num_frames; block_size = MIN (block_size, num_frames); block_int_size = block_size * channels; for (i = 0; i < channels; ++i) { if (!GST_BUFFER_FLAG_IS_SET (in, GST_BUFFER_FLAG_GAP)) { filter->process (in_data + (bps * i), block_int_size, channels, &CS, &filter->peak[i]); GST_LOG_OBJECT (filter, "[%d]: cumulative squares %lf, over %d samples/%d channels", i, CS, block_int_size, channels); filter->CS[i] += CS; } else { filter->peak[i] = 0.0; } filter->decay_peak_age[i] += GST_FRAMES_TO_CLOCK_TIME (num_frames, rate); GST_LOG_OBJECT (filter, "[%d]: peak %f, last peak %f, decay peak %f, age %" GST_TIME_FORMAT, i, filter->peak[i], filter->last_peak[i], filter->decay_peak[i], GST_TIME_ARGS (filter->decay_peak_age[i])); /* update running peak */ if (filter->peak[i] > filter->last_peak[i]) filter->last_peak[i] = filter->peak[i]; /* make decay peak fall off if too old */ falloff_time = GST_CLOCK_DIFF (gst_gdouble_to_guint64 (filter->decay_peak_ttl), filter->decay_peak_age[i]); if (falloff_time > 0) { gdouble falloff_dB; gdouble falloff; gdouble length; /* length of falloff time in seconds */ length = (gdouble) falloff_time / (gdouble) GST_SECOND; falloff_dB = filter->decay_peak_falloff * length; falloff = pow (10, falloff_dB / -20.0); GST_LOG_OBJECT (filter, "falloff: current %f, base %f, interval %" GST_TIME_FORMAT ", dB falloff %f, factor %e", filter->decay_peak[i], filter->decay_peak_base[i], GST_TIME_ARGS (falloff_time), falloff_dB, falloff); filter->decay_peak[i] = filter->decay_peak_base[i] * falloff; GST_LOG_OBJECT (filter, "peak is %" GST_TIME_FORMAT " old, decayed with factor %e to %f", GST_TIME_ARGS (filter->decay_peak_age[i]), falloff, filter->decay_peak[i]); } else { GST_LOG_OBJECT (filter, "peak not old enough, not decaying"); } /* if the peak of this run is higher, the decay peak gets reset */ if (filter->peak[i] >= filter->decay_peak[i]) { GST_LOG_OBJECT (filter, "new peak, %f", filter->peak[i]); filter->decay_peak[i] = filter->peak[i]; filter->decay_peak_base[i] = filter->peak[i]; filter->decay_peak_age[i] = G_GINT64_CONSTANT (0); } } in_data += block_size * bps * channels; filter->num_frames += block_size; num_frames -= block_size; /* do we need to message ? */ if (filter->num_frames >= filter->interval_frames) { gst_level_post_message (filter); } } gst_buffer_unmap (in, &map); return GST_FLOW_OK; }