diff options
| author | 2024-12-27 11:02:38 -0500 | |
|---|---|---|
| committer | 2024-12-27 11:02:38 -0500 | |
| commit | 4af2d16c06a8a67ab225caa61ccd94df3c572bdc (patch) | |
| tree | 6f5b364ea409c93aa9f0b795f252ac78c7d833f9 /src/render | |
| parent | 9026e7f49f11e920eac666bd4159ec459b979623 (diff) | |
| download | camu-4af2d16c06a8a67ab225caa61ccd94df3c572bdc.tar.gz camu-4af2d16c06a8a67ab225caa61ccd94df3c572bdc.tar.bz2 camu-4af2d16c06a8a67ab225caa61ccd94df3c572bdc.zip | |
Fix some configurations, add sink loop mode
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/render')
| -rw-r--r-- | src/render/queue_libplacebo.c | 52 | ||||
| -rw-r--r-- | src/render/queue_tiger.c | 2 | ||||
| -rw-r--r-- | src/render/renderer.h | 2 | ||||
| -rw-r--r-- | src/render/renderer_libplacebo.c | 10 | ||||
| -rw-r--r-- | src/render/renderer_tiger.c | 3 |
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); |