obs-ffmpeg: Fix potential seek issues with media source
(This commit also modifies deps/media-playback) Before, the media-playback library would detect whether something was seekable by checking the filename for "://", which is unideal because there are other cases where targets may not be seekable. So instead, an explicit "seekable" property (off by default) is now in place in the media source when not in "local file" mode. Seeking will only be enabled if local file mode is on, or if "seekable" is explicitly checked by the user. Closes jp9000/obs-studio#1022
This commit is contained in:
@@ -58,6 +58,7 @@ struct ffmpeg_source {
|
||||
bool is_clear_on_media_end;
|
||||
bool restart_on_activate;
|
||||
bool close_when_inactive;
|
||||
bool seekable;
|
||||
};
|
||||
|
||||
static bool is_local_file_modified(obs_properties_t *props,
|
||||
@@ -73,12 +74,14 @@ static bool is_local_file_modified(obs_properties_t *props,
|
||||
obs_property_t *looping = obs_properties_get(props, "looping");
|
||||
obs_property_t *buffering = obs_properties_get(props, "buffering_mb");
|
||||
obs_property_t *close = obs_properties_get(props, "close_when_inactive");
|
||||
obs_property_t *seekable = obs_properties_get(props, "seekable");
|
||||
obs_property_set_visible(input, !enabled);
|
||||
obs_property_set_visible(input_format, !enabled);
|
||||
obs_property_set_visible(buffering, !enabled);
|
||||
obs_property_set_visible(close, enabled);
|
||||
obs_property_set_visible(local_file, enabled);
|
||||
obs_property_set_visible(looping, enabled);
|
||||
obs_property_set_visible(seekable, !enabled);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -181,6 +184,8 @@ static obs_properties_t *ffmpeg_source_getproperties(void *data)
|
||||
obs_property_list_add_int(prop, obs_module_text("ColorRange.Full"),
|
||||
VIDEO_RANGE_FULL);
|
||||
|
||||
obs_properties_add_bool(props, "seekable", obs_module_text("Seekable"));
|
||||
|
||||
return props;
|
||||
}
|
||||
|
||||
@@ -244,7 +249,10 @@ static void ffmpeg_source_open(struct ffmpeg_source *s)
|
||||
s->input, s->input_format,
|
||||
s->buffering_mb * 1024 * 1024,
|
||||
s, get_frame, get_audio, media_stopped,
|
||||
preload_frame, s->is_hw_decoding, s->range);
|
||||
preload_frame,
|
||||
s->is_hw_decoding,
|
||||
s->is_local_file || s->seekable,
|
||||
s->range);
|
||||
}
|
||||
|
||||
static void ffmpeg_source_tick(void *data, float seconds)
|
||||
@@ -316,6 +324,7 @@ static void ffmpeg_source_update(void *data, obs_data_t *settings)
|
||||
"color_range");
|
||||
s->buffering_mb = (int)obs_data_get_int(settings, "buffering_mb");
|
||||
s->is_local_file = is_local_file;
|
||||
s->seekable = obs_data_get_bool(settings, "seekable");
|
||||
|
||||
if (s->media_valid) {
|
||||
mp_media_free(&s->media);
|
||||
|
Reference in New Issue
Block a user