summaryrefslogtreecommitdiff
path: root/src/buffer
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-06-02 11:56:54 -0400
committerAndrew Opalach <andrew@akon.city> 2025-06-02 11:56:54 -0400
commit0b13cf2a3bbd105fe4326e8e005536da43684df6 (patch)
tree3dab7f55179194d9efd280a3c3f869327e485b34 /src/buffer
parent2fa7ea95c891981684a55b41977172d040c2cc55 (diff)
downloadcamu-0b13cf2a3bbd105fe4326e8e005536da43684df6.tar.gz
camu-0b13cf2a3bbd105fe4326e8e005536da43684df6.tar.bz2
camu-0b13cf2a3bbd105fe4326e8e005536da43684df6.zip
Improve renderer api, misc cleanup
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/buffer')
-rw-r--r--src/buffer/video.c19
-rw-r--r--src/buffer/video.h4
2 files changed, 9 insertions, 14 deletions
diff --git a/src/buffer/video.c b/src/buffer/video.c
index c29f1b7..3eee026 100644
--- a/src/buffer/video.c
+++ b/src/buffer/video.c
@@ -9,9 +9,7 @@
#include "../codec/ffmpeg/common.h"
#endif
-#ifdef CAMU_VIDEO_BUFFER_FORCE_SCALER
#include "../codec/ffmpeg/scaler.h"
-#endif
#define BUFFER_MARK_LOW ((1.0 / 24.0) * 2)
#define BUFFER_MARK_BUFFERED ((1.0 / 24.0) * 4) // Must be >1.
@@ -71,16 +69,20 @@ bool camu_video_buffer_configure(struct camu_video_buffer *buf, struct camu_code
struct camu_video_format *in = &buf->fmt.in;
struct camu_video_format *req = &buf->fmt.req;
camu_video_format_copy(in, fmt);
-#ifndef CAMU_VIDEO_BUFFER_FORCE_SCALER
camu_video_format_copy(req, in);
-#else
if (fmt->width > 0 && fmt->height > 0 &&
- (fmt->format != CAMU_PIXEL_FORMAT_RGBA && fmt->format != CAMU_PIXEL_FORMAT_RGB)) {
+#ifdef CAMU_VIDEO_BUFFER_REQUIRE_RGB
+ (fmt->format != CAMU_PIXEL_FORMAT_RGBA && fmt->format != CAMU_PIXEL_FORMAT_RGB)
+#else
+ (fmt->format == CAMU_PIXEL_FORMAT_PAL8)
+#endif
+ ) {
buf->fmt.scaler_needed = true;
req->width = fmt->width;
req->height = fmt->height;
- req->format = CAMU_PIXEL_FORMAT_RGBA;
#ifdef CAMU_HAVE_FFMPEG
+ const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt->format);
+ req->format = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) ? CAMU_PIXEL_FORMAT_RGBA : CAMU_PIXEL_FORMAT_RGB;
buf->scaler = camu_ff_scaler_create();
if (!buf->scaler->init(buf->scaler, &buf->fmt)) {
// Scaler will be freed in video_buffer_free().
@@ -95,7 +97,6 @@ bool camu_video_buffer_configure(struct camu_video_buffer *buf, struct camu_code
buf->fmt.scaler_needed = false;
camu_video_format_copy(req, in);
}
-#endif
return true;
}
@@ -144,7 +145,6 @@ static bool push_av_frame_internal(struct camu_video_buffer *buf, AVFrame *frame
return false;
}
if (base_pts == -1.0) al_atomic_store(f64)(&buf->pts, pts, AL_ATOMIC_RELEASE);
-#ifdef CAMU_VIDEO_BUFFER_FORCE_SCALER
if (buf->fmt.scaler_needed) {
if (!buf->scaler->scale(buf->scaler, (const u8 **)frame->data, frame->linesize)) {
return false;
@@ -152,7 +152,6 @@ static bool push_av_frame_internal(struct camu_video_buffer *buf, AVFrame *frame
av_frame_free(&frame);
frame = av_frame_clone(buf->scaler->get_frame(buf->scaler)->av.frame);
}
-#endif
buf->queue->push_av_frame(buf->queue, frame, pts);
return true;
}
@@ -266,8 +265,6 @@ bool camu_video_buffer_read(struct camu_video_buffer *buf, void *out, bool *weig
void camu_video_buffer_free(struct camu_video_buffer *buf)
{
-#ifdef CAMU_VIDEO_BUFFER_FORCE_SCALER
if (buf->fmt.scaler_needed) buf->scaler->free(&buf->scaler);
-#endif
if (buf->queue) buf->queue->free(&buf->queue);
}
diff --git a/src/buffer/video.h b/src/buffer/video.h
index 834aaa4..d844d80 100644
--- a/src/buffer/video.h
+++ b/src/buffer/video.h
@@ -1,6 +1,6 @@
#pragma once
-//#define CAMU_VIDEO_BUFFER_FORCE_SCALER
+//#define CAMU_VIDEO_BUFFER_REQUIRE_RGB
#include <al/types.h>
@@ -23,9 +23,7 @@ struct camu_video_buffer {
f64 avg_frame_duration;
struct camu_scaler_format fmt;
-#ifdef CAMU_VIDEO_BUFFER_FORCE_SCALER
struct camu_scaler *scaler;
-#endif
struct camu_frame_queue *queue;
bool buffered;