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
parent
4722b764ca
commit
b8b2b7e2e3
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue