summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-02-04 21:05:18 -0500
committerAndrew Opalach <andrew@akon.city> 2025-02-04 21:05:18 -0500
commit0060d4f3df9b264e4a4adb77da67336709b41b6b (patch)
treea59d4e2f218cec89af56bdb2036d0a2ecd488349 /src/render
parentcdd1f574312722ab305cba6771d9bcc5da0b0c38 (diff)
downloadcamu-0060d4f3df9b264e4a4adb77da67336709b41b6b.tar.gz
camu-0060d4f3df9b264e4a4adb77da67336709b41b6b.tar.bz2
camu-0060d4f3df9b264e4a4adb77da67336709b41b6b.zip
Audio buffer and sink fixes, unsigned width/height
- Screen feature testing - Older FFmpeg support - Build configuration fixes Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/render')
-rw-r--r--src/render/meson.build75
-rw-r--r--src/render/queue_libplacebo.c9
-rw-r--r--src/render/queue_tiger.c6
-rw-r--r--src/render/renderer.h6
-rw-r--r--src/render/renderer_libplacebo.c49
-rw-r--r--src/render/renderer_libplacebo.h1
-rw-r--r--src/render/renderer_tiger.c39
7 files changed, 101 insertions, 84 deletions
diff --git a/src/render/meson.build b/src/render/meson.build
index 668c3d4..75cde7c 100644
--- a/src/render/meson.build
+++ b/src/render/meson.build
@@ -59,46 +59,49 @@ elif get_option('renderer') == 'libplacebo'
render_args += ['-DCAMU_RENDERER_LIBPLACEBO']
endif
-libass_opts = []
-if not is_windows
- libass_opts += ['fontconfig=enabled']
- # libass(e46aede):meson.build:126
- fontconfig = dependency('fontconfig',
- version: '>=2.10.92',
+libass = dependency('libass', required: false, allow_fallback: false)
+if not libass.found()
+ libass_opts = []
+ if not is_windows
+ libass_opts += ['fontconfig=enabled']
+ # libass(e46aede):meson.build:126
+ fontconfig = dependency('fontconfig',
+ version: '>=2.10.92',
+ default_options: [
+ 'doc=disabled',
+ 'nls=disabled',
+ 'tests=disabled',
+ 'tools=disabled',
+ 'cache-build=disabled'
+ ])
+ endif
+ # libass(e46aede):meson.build:90
+ fribidi = dependency('fribidi',
+ version: '>=0.19.1',
+ default_options: [
+ 'docs=false',
+ 'tests=false',
+ 'bin=false'
+ ])
+ # libass(e46aede):meson.build:84
+ # fontconfig(72b9a48):meson.build:28
+ freetype = dependency('freetype2',
+ version: '>=9.17.3',
+ default_options: [
+ 'harfbuzz=disabled'
+ ])
+ # freetype2(42608f7):meson.build:346
+ harfbuz = dependency('harfbuzz',
+ version: '>=2.0.0',
default_options: [
- 'doc=disabled',
- 'nls=disabled',
+ 'freetype=disabled',
'tests=disabled',
- 'tools=disabled',
- 'cache-build=disabled'
+ 'introspection=disabled',
+ 'docs=disabled',
+ 'utilities=disabled'
])
+ libass = dependency('libass', default_options: libass_opts)
endif
-# libass(e46aede):meson.build:90
-fribidi = dependency('fribidi',
- version: '>=0.19.1',
- default_options: [
- 'docs=false',
- 'tests=false',
- 'bin=false'
- ])
-# libass(e46aede):meson.build:84
-# fontconfig(72b9a48):meson.build:28
-freetype = dependency('freetype2',
- version: '>=9.17.3',
- default_options: [
- 'harfbuzz=disabled'
- ])
-# freetype2(42608f7):meson.build:346
-harfbuz = dependency('harfbuzz',
- version: '>=2.0.0',
- default_options: [
- 'freetype=disabled',
- 'tests=disabled',
- 'introspection=disabled',
- 'docs=disabled',
- 'utilities=disabled'
- ])
-libass = dependency('libass', default_options: libass_opts)
render_deps += [libass]
render = declare_dependency(sources: render_src, dependencies: render_deps, compile_args: render_args)
diff --git a/src/render/queue_libplacebo.c b/src/render/queue_libplacebo.c
index 22df3dc..165fc4b 100644
--- a/src/render/queue_libplacebo.c
+++ b/src/render/queue_libplacebo.c
@@ -3,6 +3,7 @@
#ifdef CAMU_HAVE_FFMPEG
#define PL_LIBAV_IMPLEMENTATION 1
#include <libplacebo/utils/libav.h>
+#include "../codec/ffmpeg/common.h"
#endif
#include "../buffer/video.h"
@@ -10,7 +11,7 @@
#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)
+static bool queue_lp_configure_subtitiles(struct camu_frame_queue *queue, u32 width, u32 height, AVCodecParameters *codecpar)
{
struct camu_frame_queue_lp *lq = (struct camu_frame_queue_lp *)queue;
if (!lq->ass) return false;
@@ -86,7 +87,7 @@ static bool map_frame(pl_gpu gpu, pl_tex *tex, const struct pl_source_frame *src
out_frame->planes[0] = plane;
out_frame->repr = pl_color_repr_unknown;
out_frame->color = pl_color_space_monitor;
- out_frame->crop = (pl_rect2df){ 0, 0, frame->video.width, frame->video.height };
+ out_frame->crop = (pl_rect2df){ 0.f, 0.f, frame->video.width, frame->video.height };
//out_frame->profile =
camu_codec_frame_discard(frame);
@@ -168,7 +169,7 @@ static struct camu_overlay_lp *create_subtitle_overlay(pl_gpu gpu, ASS_Image *as
// https://github.com/mpv-player/mpv/blob/70aaba71d6e3071a732069a1d222d1eb4293faf2/sub/ass_mp.c#L195
current = (struct pl_overlay *)&overlay->overlays[overlay->num++];
struct pl_overlay_part *part = (struct pl_overlay_part *)&current->parts[0];
- part->src = (pl_rect2df){ 0, 0, ass_frame->w, ass_frame->h };
+ part->src = (pl_rect2df){ 0.f, 0.f, ass_frame->w, ass_frame->h };
part->dst = (pl_rect2df){
ass_frame->dst_x,
ass_frame->dst_y,
@@ -280,7 +281,7 @@ static void queue_lp_push_av_frame(struct camu_frame_queue *queue, AVFrame *fram
frame->opaque = lq;
pl_queue_push(lq->queue, &(struct pl_source_frame){
.pts = pts,
- .duration = frame->duration * av_q2d(stream->time_base),
+ .duration = camu_ff_frame_duration(frame) * av_q2d(stream->time_base),
.map = map_av_frame,
.unmap = unmap_av_frame,
.discard = discard_av_frame,
diff --git a/src/render/queue_tiger.c b/src/render/queue_tiger.c
index d21236d..df072d2 100644
--- a/src/render/queue_tiger.c
+++ b/src/render/queue_tiger.c
@@ -5,7 +5,7 @@
#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)
+static void upload_texture(struct camu_frame_queue_tiger *tq, u8 *data, u32 width, u32 height, s32 format, s32 linesize)
{
glGenTextures(1, &tq->texture_id);
glActiveTexture(GL_TEXTURE0);
@@ -13,7 +13,7 @@ static void upload_texture(struct camu_frame_queue_tiger *tq, u8 *data, s32 widt
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
//if (frame->flags & CAMU_FRAME_DEVICE_ALLOCATED) {
// glBindBuffer(GL_PIXEL_UNPACK_BUFFER, tq->tr->texture_buffer);
//}
@@ -31,7 +31,7 @@ static void upload_texture(struct camu_frame_queue_tiger *tq, u8 *data, s32 widt
default:
al_assert(false);
}
- glGenerateMipmap(GL_TEXTURE_2D);
+ //glGenerateMipmap(GL_TEXTURE_2D);
}
static void queue_tiger_push(struct camu_frame_queue *queue, struct camu_codec_frame *frame, f64 pts)
diff --git a/src/render/renderer.h b/src/render/renderer.h
index c78e1c1..101dda0 100644
--- a/src/render/renderer.h
+++ b/src/render/renderer.h
@@ -19,7 +19,7 @@ struct camu_frame_queue;
struct camu_screen;
struct camu_renderer {
bool (*create_renderer)(
- struct camu_renderer *, s32 *, s32 *,
+ struct camu_renderer *, u32 *, u32 *,
#if defined CAMU_RENDERER_VULKAN
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL (*get_vk_proc_address)(VkInstance, const char *),
VkResult (*vk_create_surface)(void *, VkInstance, VkSurfaceKHR *),
@@ -39,13 +39,11 @@ struct camu_renderer {
void *priv);
struct camu_frame_queue *(*create_queue)(struct camu_renderer *);
u32 (*get_latency)(struct camu_renderer *);
- void (*resize)(struct camu_renderer *, s32 *, s32 *, bool);
+ void (*resize)(struct camu_renderer *, u32 *, u32 *);
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;
#endif
- void *(*get_device_ptr)(struct camu_renderer *, size_t);
- void (*commit_device_ptr)(struct camu_renderer *);
void (*free)(struct camu_renderer **);
};
diff --git a/src/render/renderer_libplacebo.c b/src/render/renderer_libplacebo.c
index 0ff0326..2c632ee 100644
--- a/src/render/renderer_libplacebo.c
+++ b/src/render/renderer_libplacebo.c
@@ -13,7 +13,17 @@
static f32 clear_color[4] = { 0.f, 0.f, 0.f, 1.f };
-static void renderer_lp_resize(struct camu_renderer *renderer, s32 *width, s32 *height, bool double_swap)
+static inline void pl_swapchain_resize_compat(pl_swapchain swapchain, u32 *width, u32 *height)
+{
+ s32 req_width = (s32)*width;
+ s32 req_height = (s32)*height;
+ pl_swapchain_resize(swapchain, &req_width, &req_height);
+ al_assert(req_width > 0 && req_height > 0);
+ *width = (u32)req_width;
+ *height = (u32)req_height;
+}
+
+static void renderer_lp_resize(struct camu_renderer *renderer, u32 *width, u32 *height)
{
struct camu_renderer_lp *lr = (struct camu_renderer_lp *)renderer;
if (lr->swapchain) {
@@ -21,8 +31,7 @@ static void renderer_lp_resize(struct camu_renderer *renderer, s32 *width, s32 *
pl_swapchain_submit_frame(lr->swapchain);
lr->have_frame = false;
}
- pl_swapchain_resize(lr->swapchain, width, height);
- lr->double_swap = double_swap;
+ pl_swapchain_resize_compat(lr->swapchain, width, height);
}
}
@@ -36,7 +45,7 @@ static void log_callback(void *userdata, enum pl_log_level level, const char *me
}
}
-static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *width, s32 *height,
+static bool renderer_lp_create_renderer(struct camu_renderer *renderer, u32 *width, u32 *height,
#if defined CAMU_RENDERER_VULKAN
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL (*get_vk_proc_address)(VkInstance, const char *),
VkResult (*vk_create_surface)(void *, VkInstance, VkSurfaceKHR *),
@@ -144,9 +153,7 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *wid
lr->renderer = pl_renderer_create(lr->logger, lr->gpu);
- pl_swapchain_resize(lr->swapchain, width, height);
- lr->double_swap = false;
-
+ pl_swapchain_resize_compat(lr->swapchain, width, height);
lr->have_frame = false;
al_memset(&lr->params, 0, sizeof(struct pl_render_params));
@@ -220,11 +227,6 @@ static void renderer_lp_render(struct camu_renderer *renderer, struct camu_scree
}
#endif
- if (lr->double_swap) {
- pl_swapchain_swap_buffers(lr->swapchain);
- lr->double_swap = false;
- }
-
if (!lr->have_frame) {
struct pl_swapchain_frame frame;
pl_swapchain_start_frame(lr->swapchain, &frame);
@@ -250,7 +252,10 @@ static void renderer_lp_render(struct camu_renderer *renderer, struct camu_scree
do_gpu_finish |= weighted;
// Terrible hack. Let's us distinguish single frames with the same dimensions.
// Tied to a libplacebo patch to consider info_priv in the hash.
- lr->params.info_priv = video->buf;
+ // Add in last_pts to account for buffer resets. This is a completely
+ // broken "hash" of the f64 pts value but hopefully works for now.
+ // https://www.virtualdub.org/blog2/entry_259.html
+ lr->params.info_priv = video->buf + (intptr_t)*((u64 *)&video->buf->last_pts);
target->crop = mix.frames[0]->crop;
target->crop.x1 *= video->view.zoom / video->view.stretch;
target->crop.y1 *= video->view.zoom * video->view.stretch;
@@ -281,25 +286,29 @@ static void renderer_lp_render(struct camu_renderer *renderer, struct camu_scree
if (!scr->videos.count && !force) {
// Don't spin too hard on a potential error state.
- nn_thread_sleep(NNWT_TS_FROM_USEC(26));
+ //al_log_warn("render_libplacebo", "Spinning in renderer.");
+ nn_thread_sleep(NNWT_TS_FROM_USEC(128));
return;
}
pl_swapchain_submit_frame(lr->swapchain);
- pl_swapchain_swap_buffers(lr->swapchain);
lr->have_frame = false;
+ pl_swapchain_swap_buffers(lr->swapchain);
+
if (do_gpu_finish) {
// Block until render completes.
pl_gpu_finish(lr->gpu);
}
- f64 tick = nn_get_tick();
- f64 frame_time = tick - lr->last_render_tick;
- if (frame_time > (1.0 / 24.0)) {
- al_log_info("render_libplacebo", "FRAME_TIME: %fs", frame_time);
+ if (!force) {
+ f64 tick = nn_get_tick();
+ f64 frame_time = tick - lr->last_render_tick;
+ if (frame_time > (1.0 / 24.0)) {
+ al_log_info("render_libplacebo", "FRAME_TIME: %fs", frame_time);
+ }
+ lr->last_render_tick = tick;
}
- lr->last_render_tick = tick;
}
void renderer_lp_free(struct camu_renderer **renderer)
diff --git a/src/render/renderer_libplacebo.h b/src/render/renderer_libplacebo.h
index a4bd40e..38407bb 100644
--- a/src/render/renderer_libplacebo.h
+++ b/src/render/renderer_libplacebo.h
@@ -26,7 +26,6 @@ struct camu_renderer_lp {
pl_gpu gpu;
pl_log logger;
pl_swapchain swapchain;
- bool double_swap;
struct pl_frame target;
bool have_frame;
pl_renderer renderer;
diff --git a/src/render/renderer_tiger.c b/src/render/renderer_tiger.c
index 74db594..ab6e85b 100644
--- a/src/render/renderer_tiger.c
+++ b/src/render/renderer_tiger.c
@@ -19,7 +19,7 @@ static const GLfloat default_vertices[] = {
1.f, 1.f, 0.f, 1.f, 1.f
};
-static f32 clear_color[4] = { 0.0f, 0.0f, 0.0f, 1.f };
+static GLfloat clear_color[4] = { 0.f, 0.f, 0.f, 1.f };
static const GLchar *default_vs = \
"#version 100\n" \
@@ -86,7 +86,7 @@ static bool compile_shaders(struct camu_renderer_tiger *tr)
}
#endif
-static void renderer_tiger_resize(struct camu_renderer *renderer, s32 *width, s32 *height)
+static void renderer_tiger_resize(struct camu_renderer *renderer, u32 *width, u32 *height)
{
struct camu_renderer_tiger *tr = (struct camu_renderer_tiger *)renderer;
(void)tr;
@@ -94,12 +94,16 @@ static void renderer_tiger_resize(struct camu_renderer *renderer, s32 *width, s3
(void)height;
}
-static bool renderer_tiger_create_renderer(struct camu_renderer *renderer, s32 *width, s32 *height,
+static bool renderer_tiger_create_renderer(struct camu_renderer *renderer, u32 *width, u32 *height,
#if defined CAMU_RENDERER_VULKAN
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL (*get_vk_proc_address)(VkInstance, const char *),
void (*vk_create_surface)(void *, VkInstance, VkSurfaceKHR *),
const char *const *(*vk_get_extensions)(u32 *),
#elif defined CAMU_RENDERER_OPENGL
+#ifdef STELA_USE_EGL
+ EGLDisplay display,
+ EGLContext context,
+#endif
void (*get_gl_proc_address(char const *procname))(void),
bool (*gl_load_loader)(void *),
bool (*gl_make_current)(void *),
@@ -109,7 +113,11 @@ static bool renderer_tiger_create_renderer(struct camu_renderer *renderer, s32 *
void *priv)
{
struct camu_renderer_tiger *tr = (struct camu_renderer_tiger *)renderer;
+ (void)width;
+ (void)height;
#ifdef CAMU_RENDERER_OPENGL
+ (void)display;
+ (void)context;
(void)get_gl_proc_address;
tr->load_loader = gl_load_loader;
@@ -120,9 +128,9 @@ static bool renderer_tiger_create_renderer(struct camu_renderer *renderer, s32 *
tr->make_current(tr->priv);
- if (!tr->load_loader(tr->priv)) return false;
-
- tr->r.resize(&tr->r, width, height);
+ if (!tr->load_loader(tr->priv)) {
+ return false;
+ }
clear_color[0] = ((global_color_palette.colors[0] >> 16) & 0xff) / 255.f;
clear_color[1] = ((global_color_palette.colors[0] >> 8) & 0xff) / 255.f;
@@ -145,7 +153,7 @@ static bool renderer_tiger_create_renderer(struct camu_renderer *renderer, s32 *
glVertexAttribPointer(pos, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (void *)0);
if (stl_gl_check_error()) {
al_log_error("render_tiger", "glVertexAttribPointer returned error, use GLES context.");
- al_assert(false);
+ al_assert_and_return(false);
}
glEnableVertexAttribArray(pos);
GLint texcoord = glGetAttribLocation(tr->program, "a_TexCoord");
@@ -216,11 +224,6 @@ static void set_uniform(struct camu_renderer_tiger *tr, const GLchar *name,
#endif
}
-#ifdef CAMU_RENDERER_OPENGL
-static mat4x4 model = { 0 };
-static GLuint texture0 = 0;
-#endif
-
static void renderer_tiger_render(struct camu_renderer *renderer, struct camu_screen *scr, bool force)
{
#ifdef CAMU_RENDERER_OPENGL
@@ -241,19 +244,23 @@ static void renderer_tiger_render(struct camu_renderer *renderer, struct camu_sc
}
#endif
- if (scr->videos.size > 0) {
+ if (scr->videos.count > 0) {
struct camu_screen_video *video = &al_array_last(scr->videos);
GLuint texture_id;
- if (camu_video_buffer_read(video->buf, &texture_id)) {
+ bool weighted;
+ if (camu_video_buffer_read(video->buf, &texture_id, &weighted)) {
glBindTexture(GL_TEXTURE_2D, texture_id);
+ mat4x4 model;
mat4x4_identity(model);
mat4x4_ortho(model, 0.f, (f32)scr->width, (f32)scr->height, 0.f, -1.f, 1.f);
mat4x4_translate_in_place(model, (f32)video->view.x_offset, (f32)video->view.y_offset, 0.f);
mat4x4_scale_aniso(model, model, (f32)video->view.zoom, (f32)video->view.zoom, 1.f);
mat4x4_scale_aniso(model, model, (f32)video->view.width, (f32)video->view.height, 1.f);
set_uniform(tr, "g_ModelViewProjectionMatrix", TYPE_MAT4, model);
+
+ GLuint texture0 = 0;
set_uniform(tr, "g_Texture0", TYPE_SAMPLER2D, &texture0);
glViewport(0, 0, scr->width, scr->height);
@@ -267,6 +274,7 @@ static void renderer_tiger_render(struct camu_renderer *renderer, struct camu_sc
tr->release_current(tr->priv);
}
+/*
static void *renderer_tiger_get_device_ptr(struct camu_renderer *renderer, size_t length)
{
(void)renderer;
@@ -289,6 +297,7 @@ static void renderer_tiger_commit_device_ptr(struct camu_renderer *renderer)
//glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
#endif
}
+*/
static void renderer_tiger_free(struct camu_renderer **renderer)
{
@@ -307,8 +316,6 @@ struct camu_renderer *camu_renderer_tiger_create(void)
tr->r.get_latency = renderer_tiger_get_latency;
tr->r.resize = renderer_tiger_resize;
tr->r.render = renderer_tiger_render;
- tr->r.get_device_ptr = renderer_tiger_get_device_ptr;
- tr->r.commit_device_ptr = renderer_tiger_commit_device_ptr;
tr->r.free = renderer_tiger_free;
return (struct camu_renderer *)tr;
}