diff options
| author | 2024-10-28 13:08:13 -0400 | |
|---|---|---|
| committer | 2024-10-28 13:23:02 -0400 | |
| commit | 846e17728f2ed2af3672987ef61853f0bc96c224 (patch) | |
| tree | e8e81fc8a2a7de208bd9ba397ef3928d33110824 /src/render | |
| parent | d6735566cebf82a5d22a3ade22b9acd52fbe11a5 (diff) | |
| download | camu-846e17728f2ed2af3672987ef61853f0bc96c224.tar.gz camu-846e17728f2ed2af3672987ef61853f0bc96c224.tar.bz2 camu-846e17728f2ed2af3672987ef61853f0bc96c224.zip | |
Refactor video buffer and scaler, better A/V sync
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/render')
| -rw-r--r-- | src/render/queue_tiger.c | 43 | ||||
| -rw-r--r-- | src/render/queue_tiger.h | 3 | ||||
| -rw-r--r-- | src/render/renderer.h | 1 | ||||
| -rw-r--r-- | src/render/renderer_libplacebo.c | 8 | ||||
| -rw-r--r-- | src/render/renderer_tiger.c | 9 |
5 files changed, 51 insertions, 13 deletions
diff --git a/src/render/queue_tiger.c b/src/render/queue_tiger.c index b1c34ca..bbc2b6e 100644 --- a/src/render/queue_tiger.c +++ b/src/render/queue_tiger.c @@ -3,7 +3,7 @@ #include "queue_tiger.h" -static void upload_texture(struct camu_frame_queue_tiger *tq, struct camu_codec_frame *frame) +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); glActiveTexture(GL_TEXTURE0); @@ -15,19 +15,16 @@ static void upload_texture(struct camu_frame_queue_tiger *tq, struct camu_codec_ //if (frame->flags & CAMU_FRAME_DEVICE_ALLOCATED) { // glBindBuffer(GL_PIXEL_UNPACK_BUFFER, tq->tr->texture_buffer); //} - //if (linesize) { - // glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize); - //} - //glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - switch (frame->format) { + glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize); + glPixelStorei(GL_UNPACK_ALIGNMENT, 0); + switch (format) { case CAMU_PIXEL_FORMAT_RGBA: - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, frame->width, frame->height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, frame->data); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, + 0, GL_RGBA, GL_UNSIGNED_BYTE, data); break; case CAMU_PIXEL_FORMAT_RGB: - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, frame->width, frame->height, 0, - GL_RGB, GL_UNSIGNED_BYTE, frame->data); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, + 0, GL_RGB, GL_UNSIGNED_BYTE, data); break; default: al_assert(false); @@ -47,6 +44,7 @@ static void queue_tiger_push_av_frame(struct camu_frame_queue *queue, AVFrame *f { struct camu_frame_queue_tiger *tq = (struct camu_frame_queue_tiger *)queue; (void)pts; + tq->queued_av_frame = frame; } #endif @@ -68,10 +66,30 @@ static u8 queue_tiger_read(struct camu_frame_queue *queue, f64 pts, void *out) (void)pts; if (tq->queued_frame) { struct camu_codec_frame *frame = tq->queued_frame; - upload_texture(tq, frame); + s32 linesize = frame->video.width; + upload_texture(tq, frame->data, frame->video.width, frame->video.height, frame->format, linesize); + camu_codec_frame_discard(frame); tq->queued_frame = NULL; tq->uploaded = true; } +#ifdef CAMU_HAVE_FFMPEG + if (tq->queued_av_frame) { + AVFrame *frame = tq->queued_av_frame; + s32 linesize = frame->linesize[0]; + switch (frame->format) { + case CAMU_PIXEL_FORMAT_RGBA: + linesize /= 4; + break; + case CAMU_PIXEL_FORMAT_RGB: + linesize /= 3; + break; + } + upload_texture(tq, frame->data[0], frame->width, frame->height, frame->format, linesize); + av_frame_free(&frame); + tq->queued_av_frame = NULL; + tq->uploaded = true; + } +#endif if (!tq->uploaded) return CAMU_QUEUE_MORE; *((GLuint *)out) = tq->texture_id; return CAMU_QUEUE_OK; @@ -95,6 +113,7 @@ struct camu_frame_queue *camu_frame_queue_tiger_create(void) { struct camu_frame_queue_tiger *tq = al_alloc_object(struct camu_frame_queue_tiger); tq->queued_frame = NULL; + tq->queued_av_frame = NULL; tq->uploaded = false; tq->q.push = queue_tiger_push; #ifdef CAMU_HAVE_FFMPEG diff --git a/src/render/queue_tiger.h b/src/render/queue_tiger.h index a90d8c7..af0e229 100644 --- a/src/render/queue_tiger.h +++ b/src/render/queue_tiger.h @@ -9,6 +9,9 @@ struct camu_frame_queue_tiger { GLuint texture_id; struct camu_renderer_tiger *tr; struct camu_codec_frame *queued_frame; +#ifdef CAMU_HAVE_FFMPEG + struct AVFrame *queued_av_frame; +#endif bool uploaded; }; diff --git a/src/render/renderer.h b/src/render/renderer.h index 5b1d342..dcd74c1 100644 --- a/src/render/renderer.h +++ b/src/render/renderer.h @@ -31,6 +31,7 @@ struct camu_renderer { #endif void *priv); 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 *); #ifdef CAMU_HAVE_FFMPEG diff --git a/src/render/renderer_libplacebo.c b/src/render/renderer_libplacebo.c index 8dde7f5..4f64fc2 100644 --- a/src/render/renderer_libplacebo.c +++ b/src/render/renderer_libplacebo.c @@ -116,6 +116,7 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *wid } lr->swapchain = pl_opengl_create_swapchain(lr->gl, pl_opengl_swapchain_params( + .max_swapchain_depth = 2, .swap_buffers = gl_swap_buffers, .priv = priv )); @@ -184,6 +185,12 @@ static struct camu_frame_queue *renderer_lp_create_queue(struct camu_renderer *r return queue; } +static u32 renderer_lp_get_latency(struct camu_renderer *renderer) +{ + struct camu_renderer_lp *lr = (struct camu_renderer_lp *)renderer; + return (u32)pl_swapchain_latency(lr->swapchain); +} + static void renderer_lp_render(struct camu_renderer *renderer, struct camu_screen *scr) { struct camu_renderer_lp *lr = (struct camu_renderer_lp *)renderer; @@ -257,6 +264,7 @@ struct camu_renderer *camu_renderer_lp_create(void) struct camu_renderer_lp *lr = al_alloc_object(struct camu_renderer_lp); lr->r.create_renderer = renderer_lp_create_renderer; lr->r.create_queue = renderer_lp_create_queue; + lr->r.get_latency = renderer_lp_get_latency; lr->r.resize = renderer_lp_resize; lr->r.render = renderer_lp_render; lr->r.free = renderer_lp_free; diff --git a/src/render/renderer_tiger.c b/src/render/renderer_tiger.c index 7127891..74d9238 100644 --- a/src/render/renderer_tiger.c +++ b/src/render/renderer_tiger.c @@ -174,6 +174,12 @@ static struct camu_frame_queue *renderer_tiger_create_queue(struct camu_renderer #endif } +static u32 renderer_tiger_get_latency(struct camu_renderer *renderer) +{ + (void)renderer; + return 0; +} + static void set_uniform(struct camu_renderer_tiger *tr, const GLchar *name, u8 type, void *value) { @@ -229,7 +235,7 @@ static void renderer_tiger_render(struct camu_renderer *renderer, struct camu_sc glActiveTexture(GL_TEXTURE0); #ifdef CAMU_SCREEN_THREADED - if (al_atomic_bool_load(&scr->queued, AL_ATOMIC_RELAXED)) { + if (al_atomic_load(u8)(&scr->queued, AL_ATOMIC_RELAXED)) { camu_screen_run_queue(scr); } #endif @@ -297,6 +303,7 @@ struct camu_renderer *camu_renderer_tiger_create(void) struct camu_renderer_tiger *tr = al_alloc_object(struct camu_renderer_tiger); tr->r.create_renderer = renderer_tiger_create_renderer; tr->r.create_queue = renderer_tiger_create_queue; + 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; |