summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
Diffstat (limited to 'src/render')
-rw-r--r--src/render/queue_libplacebo.c52
-rw-r--r--src/render/queue_tiger.c2
-rw-r--r--src/render/renderer.h2
-rw-r--r--src/render/renderer_libplacebo.c10
-rw-r--r--src/render/renderer_tiger.c3
5 files changed, 42 insertions, 27 deletions
diff --git a/src/render/queue_libplacebo.c b/src/render/queue_libplacebo.c
index 07ce379..dfaa190 100644
--- a/src/render/queue_libplacebo.c
+++ b/src/render/queue_libplacebo.c
@@ -9,6 +9,31 @@
#include "queue_libplacebo.h"
+#ifdef CAMU_HAVE_FFMPEG
+static bool queue_lp_configure_subtitiles(struct camu_frame_queue *queue, s32 width, s32 height, AVCodecParameters *codecpar)
+{
+ struct camu_frame_queue_lp *lq = (struct camu_frame_queue_lp *)queue;
+ if (!lq->ass) return false;
+ lq->ass_renderer = ass_renderer_init(lq->ass);
+ if (!lq->ass_renderer) {
+ al_log_error("frame_queue_libplacebo", "Failed to initialize ass renderer.");
+ return false;
+ }
+ lq->ass_track = ass_new_track(lq->ass);
+ if (!lq->ass_track) {
+ al_log_error("frame_queue_libplacebo", "Failed to create ass track.");
+ return false;
+ }
+ ass_set_frame_size(lq->ass_renderer, width, height);
+ ass_set_storage_size(lq->ass_renderer, width, height);
+ ass_set_fonts(lq->ass_renderer, NULL, NULL, ASS_FONTPROVIDER_AUTODETECT, NULL, 0);
+ ass_process_codec_private(lq->ass_track, (const char *)codecpar->extradata,
+ codecpar->extradata_size);
+ lq->have_subtitles = true;
+ return true;
+}
+#endif
+
static bool map_frame(pl_gpu gpu, pl_tex *tex, const struct pl_source_frame *src,
struct pl_frame *out_frame)
{
@@ -264,29 +289,6 @@ static void queue_lp_push_av_frame(struct camu_frame_queue *queue, AVFrame *fram
});
}
-static bool queue_lp_configure_subtitiles(struct camu_frame_queue *queue, s32 width, s32 height, AVCodecParameters *codecpar)
-{
- struct camu_frame_queue_lp *lq = (struct camu_frame_queue_lp *)queue;
- if (!lq->ass) return false;
- lq->ass_renderer = ass_renderer_init(lq->ass);
- if (!lq->ass_renderer) {
- al_log_error("frame_queue_libplacebo", "Failed to initialize ass renderer.");
- return false;
- }
- lq->ass_track = ass_new_track(lq->ass);
- if (!lq->ass_track) {
- al_log_error("frame_queue_libplacebo", "Failed to create ass track.");
- return false;
- }
- ass_set_frame_size(lq->ass_renderer, width, height);
- ass_set_storage_size(lq->ass_renderer, width, height);
- ass_set_fonts(lq->ass_renderer, NULL, NULL, ASS_FONTPROVIDER_AUTODETECT, NULL, 0);
- ass_process_codec_private(lq->ass_track, (const char *)codecpar->extradata,
- codecpar->extradata_size);
- lq->have_subtitles = true;
- return true;
-}
-
static void queue_lp_push_subtitle(struct camu_frame_queue *queue, AVPacket *pkt)
{
struct camu_frame_queue_lp *lq = (struct camu_frame_queue_lp *)queue;
@@ -350,10 +352,12 @@ struct camu_frame_queue *camu_frame_queue_lp_create(void)
struct camu_frame_queue_lp *lq = al_alloc_object(struct camu_frame_queue_lp);
al_array_init(lq->overlays);
lq->have_subtitles = false;
+#ifdef CAMU_HAVE_FFMPEG
+ lq->q.configure_subtitles = queue_lp_configure_subtitiles;
+#endif
lq->q.push = queue_lp_push;
#ifdef CAMU_HAVE_FFMPEG
lq->q.push_av_frame = queue_lp_push_av_frame;
- lq->q.configure_subtitles = queue_lp_configure_subtitiles;
lq->q.push_subtitle = queue_lp_push_subtitle;
#endif
lq->q.flush = queue_lp_flush;
diff --git a/src/render/queue_tiger.c b/src/render/queue_tiger.c
index bbc2b6e..d21236d 100644
--- a/src/render/queue_tiger.c
+++ b/src/render/queue_tiger.c
@@ -3,6 +3,8 @@
#include "queue_tiger.h"
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+
static void upload_texture(struct camu_frame_queue_tiger *tq, u8 *data, s32 width, s32 height, s32 format, s32 linesize)
{
glGenTextures(1, &tq->texture_id);
diff --git a/src/render/renderer.h b/src/render/renderer.h
index b304fdf..7afd8de 100644
--- a/src/render/renderer.h
+++ b/src/render/renderer.h
@@ -33,7 +33,7 @@ struct camu_renderer {
struct camu_frame_queue *(*create_queue)(struct camu_renderer *);
u32 (*get_latency)(struct camu_renderer *);
void (*resize)(struct camu_renderer *, s32 *, s32 *);
- void (*render)(struct camu_renderer *, struct camu_screen *);
+ void (*render)(struct camu_renderer *, struct camu_screen *, bool);
#ifdef CAMU_HAVE_FFMPEG
s32 (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, s32 flags);
void *opaque;
diff --git a/src/render/renderer_libplacebo.c b/src/render/renderer_libplacebo.c
index 9fedc5f..8359798 100644
--- a/src/render/renderer_libplacebo.c
+++ b/src/render/renderer_libplacebo.c
@@ -6,6 +6,7 @@
#endif
#include "../screen/screen.h"
+#include "../libsink/common.h"
#include "../util/color_palette.h"
#include "renderer_libplacebo.h"
@@ -189,7 +190,7 @@ static u32 renderer_lp_get_latency(struct camu_renderer *renderer)
return (u32)pl_swapchain_latency(lr->swapchain);
}
-static void renderer_lp_render(struct camu_renderer *renderer, struct camu_screen *scr)
+static void renderer_lp_render(struct camu_renderer *renderer, struct camu_screen *scr, bool force)
{
struct camu_renderer_lp *lr = (struct camu_renderer_lp *)renderer;
@@ -243,6 +244,13 @@ static void renderer_lp_render(struct camu_renderer *renderer, struct camu_scree
}
pl_swapchain_submit_frame(lr->swapchain);
+
+#ifdef CAMU_SINK_SCUFFED_LOOP
+ if (scr->videos.size == 0 && !force) {
+ return;
+ }
+#endif
+
pl_swapchain_swap_buffers(lr->swapchain);
}
diff --git a/src/render/renderer_tiger.c b/src/render/renderer_tiger.c
index 74d9238..74db594 100644
--- a/src/render/renderer_tiger.c
+++ b/src/render/renderer_tiger.c
@@ -221,10 +221,11 @@ static mat4x4 model = { 0 };
static GLuint texture0 = 0;
#endif
-static void renderer_tiger_render(struct camu_renderer *renderer, struct camu_screen *scr)
+static void renderer_tiger_render(struct camu_renderer *renderer, struct camu_screen *scr, bool force)
{
#ifdef CAMU_RENDERER_OPENGL
struct camu_renderer_tiger *tr = (struct camu_renderer_tiger *)renderer;
+ (void)force;
tr->make_current(tr->priv);