static void stinger_transition_start(void *data) { struct stinger_info *s = data; if (s->media_source) { calldata_t cd = {0}; proc_handler_t *ph = obs_source_get_proc_handler(s->media_source); if (s->transitioning) { proc_handler_call(ph, "restart", &cd); return; } proc_handler_call(ph, "get_duration", &cd); proc_handler_call(ph, "get_nb_frames", &cd); s->duration_ns = (uint64_t)calldata_int(&cd, "duration"); s->duration_frames = (uint64_t)calldata_int(&cd, "num_frames"); if (s->transition_point_is_frame) s->transition_point = (float)( (long double)s->transition_point_frame / (long double)s->duration_frames); else s->transition_point = (float)( (long double)s->transition_point_ns / (long double)s->duration_ns); if (s->transition_point > 0.999f) s->transition_point = 0.999f; else if (s->transition_point < 0.001f) s->transition_point = 0.001f; s->transition_a_mul = (1.0f / s->transition_point); s->transition_b_mul = (1.0f / (1.0f - s->transition_point)); obs_transition_enable_fixed(s->source, true, (uint32_t)(s->duration_ns / 1000000)); calldata_free(&cd); obs_source_add_active_child(s->source, s->media_source); } s->transitioning = true; }
static void *ffmpeg_source_create(obs_data_t *settings, obs_source_t *source) { UNUSED_PARAMETER(settings); struct ffmpeg_source *s = bzalloc(sizeof(struct ffmpeg_source)); s->source = source; s->hotkey = obs_hotkey_register_source(source, "MediaSource.Restart", obs_module_text("RestartMedia"), restart_hotkey, s); proc_handler_t *ph = obs_source_get_proc_handler(source); proc_handler_add(ph, "void restart()", restart_proc, s); proc_handler_add(ph, "void get_duration(out int duration)", get_duration, s); proc_handler_add(ph, "void get_nb_frames(out int num_frames)", get_nb_frames, s); ffmpeg_source_update(s, settings); return s; }