diff --git a/renderers/video_renderer.c b/renderers/video_renderer.c index e722306..c0a8213 100644 --- a/renderers/video_renderer.c +++ b/renderers/video_renderer.c @@ -25,6 +25,7 @@ #include "video_renderer.h" #define SECOND_IN_NSECS 1000000000UL +#define SECOND_IN_MICROSECS 1000000 #ifdef X_DISPLAY_FIX #include #include "x_display_fix.h" @@ -45,6 +46,7 @@ static bool use_x11 = false; #endif static bool logger_debug = false; static bool video_terminate = false; +static gint64 start_position = 0; #define NCODECS 2 /* renderers for h264 and h265 */ @@ -239,7 +241,7 @@ void video_renderer_init(logger_t *render_logger, const char *server_name, vide renderer_type[i]->pipeline = gst_element_factory_make("playbin3", "hls-playbin3"); break; default: - logger_log(logger, LOGGER_ERR, "video_renderer_init: invalid playbin versiion %u", playbin_version); + logger_log(logger, LOGGER_ERR, "video_renderer_init: invalid playbin version %u", playbin_version); g_assert(0); } logger_log(logger, LOGGER_INFO, "Will use GStreamer playbin version %u to play HLS streamed video", playbin_version); @@ -761,10 +763,17 @@ bool video_get_playback_info(double *duration, double *position, float *rate) { return true; } +void video_renderer_set_start(float position) { + int pos_in_micros = (int) (position * SECOND_IN_MICROSECS); + start_position = (gint64) (pos_in_micros * GST_USECOND); + logger_log(logger, LOGGER_DEBUG, "register HLS video start position %f %lld", position, start_position); +} + void video_renderer_seek(float position) { - double pos = (double) position; - pos *= GST_SECOND; - gint64 seek_position = (gint64) pos; + int pos_in_micros = (int) (position * SECOND_IN_MICROSECS); + gint64 seek_position = (gint64) (pos_in_micros * GST_USECOND); + /* don't seek to within 1 microsecond of beginning or end of video */ + if (renderer->duration < 2000) return; seek_position = seek_position < 1000 ? 1000 : seek_position; seek_position = seek_position > renderer->duration - 1000 ? renderer->duration - 1000: seek_position; g_print("SCRUB: seek to %f secs = %" GST_TIME_FORMAT ", duration = %" GST_TIME_FORMAT "\n", position, diff --git a/renderers/video_renderer.h b/renderers/video_renderer.h index a19e192..f1500fb 100644 --- a/renderers/video_renderer.h +++ b/renderers/video_renderer.h @@ -54,6 +54,7 @@ void video_renderer_start (); void video_renderer_stop (); void video_renderer_pause (); void video_renderer_seek(float position); +void video_renderer_set_start(float position); void video_renderer_resume (); bool video_renderer_is_paused(); void video_renderer_render_buffer (unsigned char* data, int *data_len, int *nal_count, uint64_t *ntp_time); diff --git a/uxplay.cpp b/uxplay.cpp index 3d45fd9..2ff1bea 100644 --- a/uxplay.cpp +++ b/uxplay.cpp @@ -1910,6 +1910,7 @@ extern "C" bool check_register(void *cls, const char *client_pk) { extern "C" void on_video_play(void *cls, const char* location, const float start_position) { /* start_position needs to be implemented */ + video_renderer_set_start(start_position); url.erase(); url.append(location); reset_loop = true;