diff options
Diffstat (limited to 'src/buffer')
| -rw-r--r-- | src/buffer/video.c | 19 | ||||
| -rw-r--r-- | src/buffer/video.h | 4 |
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; |