static void ffmpeg_source_update(void *data, obs_data_t *settings) { struct ffmpeg_source *s = data; bool is_local_file = obs_data_get_bool(settings, "is_local_file"); char *input; char *input_format; bfree(s->input); bfree(s->input_format); if (is_local_file) { input = (char *)obs_data_get_string(settings, "local_file"); input_format = NULL; s->is_looping = obs_data_get_bool(settings, "looping"); s->close_when_inactive = obs_data_get_bool(settings, "close_when_inactive"); obs_source_set_async_unbuffered(s->source, true); } else { input = (char *)obs_data_get_string(settings, "input"); input_format = (char *)obs_data_get_string(settings, "input_format"); s->is_looping = false; s->close_when_inactive = true; obs_source_set_async_unbuffered(s->source, false); } s->input = input ? bstrdup(input) : NULL; s->input_format = input_format ? bstrdup(input_format) : NULL; #ifndef __APPLE__ s->is_hw_decoding = obs_data_get_bool(settings, "hw_decode"); #endif s->is_clear_on_media_end = obs_data_get_bool(settings, "clear_on_media_end"); s->restart_on_activate = obs_data_get_bool(settings, "restart_on_activate"); s->range = (enum video_range_type)obs_data_get_int(settings, "color_range"); s->buffering_mb = (int)obs_data_get_int(settings, "buffering_mb"); s->is_local_file = is_local_file; if (s->media_valid) { mp_media_free(&s->media); s->media_valid = false; } bool active = obs_source_active(s->source); if (!s->close_when_inactive || active) ffmpeg_source_open(s); dump_source_info(s, input, input_format); if (!s->restart_on_activate || active) ffmpeg_source_start(s); }
static void ffmpeg_source_tick(void *data, float seconds) { UNUSED_PARAMETER(seconds); struct ffmpeg_source *s = data; if (s->destroy_media) { if (s->media_valid) { mp_media_free(&s->media); s->media_valid = false; } s->destroy_media = false; } }
static void ffmpeg_source_destroy(void *data) { struct ffmpeg_source *s = data; if (s->hotkey) obs_hotkey_unregister(s->hotkey); if (s->media_valid) mp_media_free(&s->media); if (s->sws_ctx != NULL) sws_freeContext(s->sws_ctx); bfree(s->sws_data); bfree(s->input); bfree(s->input_format); bfree(s); }
bool mp_media_init(mp_media_t *media, const struct mp_media_info *info) { memset(media, 0, sizeof(*media)); pthread_mutex_init_value(&media->mutex); media->opaque = info->opaque; media->v_cb = info->v_cb; media->a_cb = info->a_cb; media->stop_cb = info->stop_cb; media->v_preload_cb = info->v_preload_cb; media->force_range = info->force_range; media->buffering = info->buffering; media->speed = info->speed; media->is_local_file = info->is_local_file; if (!info->is_local_file || media->speed < 1 || media->speed > 200) media->speed = 100; static bool initialized = false; if (!initialized) { av_register_all(); avdevice_register_all(); avcodec_register_all(); avformat_network_init(); initialized = true; } if (!base_sys_ts) base_sys_ts = (int64_t)os_gettime_ns(); if (!mp_media_init_internal(media, info)) { mp_media_free(media); return false; } return true; }