send hls start_position to video_renderer

This commit is contained in:
F. Duncanh
2025-02-03 08:15:58 -05:00
parent 14e6ba5543
commit 7b5d63f51e
3 changed files with 15 additions and 4 deletions

View File

@@ -25,6 +25,7 @@
#include "video_renderer.h" #include "video_renderer.h"
#define SECOND_IN_NSECS 1000000000UL #define SECOND_IN_NSECS 1000000000UL
#define SECOND_IN_MICROSECS 1000000
#ifdef X_DISPLAY_FIX #ifdef X_DISPLAY_FIX
#include <gst/video/navigation.h> #include <gst/video/navigation.h>
#include "x_display_fix.h" #include "x_display_fix.h"
@@ -45,6 +46,7 @@ static bool use_x11 = false;
#endif #endif
static bool logger_debug = false; static bool logger_debug = false;
static bool video_terminate = false; static bool video_terminate = false;
static gint64 start_position = 0;
#define NCODECS 2 /* renderers for h264 and h265 */ #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"); renderer_type[i]->pipeline = gst_element_factory_make("playbin3", "hls-playbin3");
break; break;
default: 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); g_assert(0);
} }
logger_log(logger, LOGGER_INFO, "Will use GStreamer playbin version %u to play HLS streamed video", playbin_version); 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; 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) { void video_renderer_seek(float position) {
double pos = (double) position; int pos_in_micros = (int) (position * SECOND_IN_MICROSECS);
pos *= GST_SECOND; gint64 seek_position = (gint64) (pos_in_micros * GST_USECOND);
gint64 seek_position = (gint64) pos; /* 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 < 1000 ? 1000 : seek_position;
seek_position = seek_position > renderer->duration - 1000 ? renderer->duration - 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, g_print("SCRUB: seek to %f secs = %" GST_TIME_FORMAT ", duration = %" GST_TIME_FORMAT "\n", position,

View File

@@ -54,6 +54,7 @@ void video_renderer_start ();
void video_renderer_stop (); void video_renderer_stop ();
void video_renderer_pause (); void video_renderer_pause ();
void video_renderer_seek(float position); void video_renderer_seek(float position);
void video_renderer_set_start(float position);
void video_renderer_resume (); void video_renderer_resume ();
bool video_renderer_is_paused(); bool video_renderer_is_paused();
void video_renderer_render_buffer (unsigned char* data, int *data_len, int *nal_count, uint64_t *ntp_time); void video_renderer_render_buffer (unsigned char* data, int *data_len, int *nal_count, uint64_t *ntp_time);

View File

@@ -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) { extern "C" void on_video_play(void *cls, const char* location, const float start_position) {
/* start_position needs to be implemented */ /* start_position needs to be implemented */
video_renderer_set_start(start_position);
url.erase(); url.erase();
url.append(location); url.append(location);
reset_loop = true; reset_loop = true;