libobs: Add minimum display duration to caption data

Adds display_duration declaring the minimum duration a caption text
is not going to be overwritten by a new one. To keep the functions
backwards-compatible obs_output_output_caption_text2 was added while
obs_output_output_caption_text1 continues having a 2 second default.
master
derrod 2019-02-20 05:33:33 +01:00
parent 4722b764ca
commit b8b2b7e2e3
3 changed files with 21 additions and 6 deletions

View File

@ -843,6 +843,7 @@ struct obs_weak_output {
#define CAPTION_LINE_BYTES (4*CAPTION_LINE_CHARS) #define CAPTION_LINE_BYTES (4*CAPTION_LINE_CHARS)
struct caption_text { struct caption_text {
char text[CAPTION_LINE_BYTES+1]; char text[CAPTION_LINE_BYTES+1];
double display_duration;
struct caption_text *next; struct caption_text *next;
}; };

View File

@ -1070,17 +1070,18 @@ static inline void send_interleaved(struct obs_output *output)
double frame_timestamp = (out.pts * out.timebase_num) / double frame_timestamp = (out.pts * out.timebase_num) /
(double)out.timebase_den; (double)out.timebase_den;
/* TODO if output->caption_timestamp is more than 5 seconds
* old, send empty frame */
if (output->caption_head && if (output->caption_head &&
output->caption_timestamp <= frame_timestamp) { output->caption_timestamp <= frame_timestamp) {
blog(LOG_INFO,"Sending caption: %f \"%s\"", blog(LOG_DEBUG,"Sending caption: %f \"%s\"",
frame_timestamp, frame_timestamp,
&output->caption_head->text[0]); &output->caption_head->text[0]);
double display_duration =
output->caption_head->display_duration;
if (add_caption(output, &out)) { if (add_caption(output, &out)) {
output->caption_timestamp = output->caption_timestamp =
frame_timestamp + 2.0; frame_timestamp + display_duration;
} }
} }
@ -2133,11 +2134,13 @@ const char *obs_output_get_id(const obs_output_t *output)
#if BUILD_CAPTIONS #if BUILD_CAPTIONS
static struct caption_text *caption_text_new(const char *text, size_t bytes, 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)); struct caption_text *next = bzalloc(sizeof(struct caption_text));
snprintf(&next->text[0], CAPTION_LINE_BYTES + 1, "%.*s", snprintf(&next->text[0], CAPTION_LINE_BYTES + 1, "%.*s",
(int)bytes, text); (int)bytes, text);
next->display_duration = display_duration;
if (!*head) { if (!*head) {
*head = next; *head = next;
@ -2152,6 +2155,14 @@ void obs_output_output_caption_text1(obs_output_t *output, const char *text)
{ {
if (!obs_output_valid(output, "obs_output_output_caption_text1")) if (!obs_output_valid(output, "obs_output_output_caption_text1"))
return; 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)) if (!active(output))
return; return;
@ -2164,7 +2175,8 @@ void obs_output_output_caption_text1(obs_output_t *output, const char *text)
output->caption_tail = caption_text_new( output->caption_tail = caption_text_new(
text, size, text, size,
output->caption_tail, output->caption_tail,
&output->caption_head); &output->caption_head,
display_duration);
pthread_mutex_unlock(&output->caption_mutex); pthread_mutex_unlock(&output->caption_mutex);
} }

View File

@ -1714,6 +1714,8 @@ EXPORT const char *obs_output_get_id(const obs_output_t *output);
#if BUILD_CAPTIONS #if BUILD_CAPTIONS
EXPORT void obs_output_output_caption_text1(obs_output_t *output, EXPORT void obs_output_output_caption_text1(obs_output_t *output,
const char *text); const char *text);
EXPORT void obs_output_output_caption_text2(obs_output_t *output,
const char *text, double display_duration);
#endif #endif
EXPORT float obs_output_get_congestion(obs_output_t *output); EXPORT float obs_output_get_congestion(obs_output_t *output);