diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index 27644cb81..15ded9d1e 100644 --- a/libobs/obs-internal.h +++ b/libobs/obs-internal.h @@ -840,6 +840,7 @@ struct obs_weak_output { #define CAPTION_LINE_BYTES (4*CAPTION_LINE_CHARS) struct caption_text { char text[CAPTION_LINE_BYTES+1]; + double display_duration; struct caption_text *next; }; diff --git a/libobs/obs-output.c b/libobs/obs-output.c index ea7dbf648..2976f7325 100644 --- a/libobs/obs-output.c +++ b/libobs/obs-output.c @@ -1074,17 +1074,18 @@ static inline void send_interleaved(struct obs_output *output) double frame_timestamp = (out.pts * out.timebase_num) / (double)out.timebase_den; - /* TODO if output->caption_timestamp is more than 5 seconds - * old, send empty frame */ if (output->caption_head && output->caption_timestamp <= frame_timestamp) { - blog(LOG_INFO,"Sending caption: %f \"%s\"", + blog(LOG_DEBUG,"Sending caption: %f \"%s\"", frame_timestamp, &output->caption_head->text[0]); + double display_duration = + output->caption_head->display_duration; + if (add_caption(output, &out)) { output->caption_timestamp = - frame_timestamp + 2.0; + frame_timestamp + display_duration; } } @@ -2135,11 +2136,13 @@ const char *obs_output_get_id(const obs_output_t *output) #if BUILD_CAPTIONS static struct caption_text *caption_text_new(const char *text, size_t bytes, - struct caption_text *tail, struct caption_text **head) + struct caption_text *tail, struct caption_text **head, + double display_duration) { struct caption_text *next = bzalloc(sizeof(struct caption_text)); snprintf(&next->text[0], CAPTION_LINE_BYTES + 1, "%.*s", (int)bytes, text); + next->display_duration = display_duration; if (!*head) { *head = next; @@ -2154,6 +2157,14 @@ void obs_output_output_caption_text1(obs_output_t *output, const char *text) { if (!obs_output_valid(output, "obs_output_output_caption_text1")) return; + obs_output_output_caption_text2(output, text, 2.0f); +} + +void obs_output_output_caption_text2(obs_output_t *output, const char *text, + double display_duration) +{ + if (!obs_output_valid(output, "obs_output_output_caption_text2")) + return; if (!active(output)) return; @@ -2166,7 +2177,8 @@ void obs_output_output_caption_text1(obs_output_t *output, const char *text) output->caption_tail = caption_text_new( text, size, output->caption_tail, - &output->caption_head); + &output->caption_head, + display_duration); pthread_mutex_unlock(&output->caption_mutex); } diff --git a/libobs/obs.h b/libobs/obs.h index e60951afc..a0a933f7f 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -1717,6 +1717,8 @@ EXPORT const char *obs_output_get_id(const obs_output_t *output); #if BUILD_CAPTIONS EXPORT void obs_output_output_caption_text1(obs_output_t *output, const char *text); +EXPORT void obs_output_output_caption_text2(obs_output_t *output, + const char *text, double display_duration); #endif EXPORT float obs_output_get_congestion(obs_output_t *output);