summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2024-11-27 11:32:17 -0500
committerAndrew Opalach <andrew@akon.city> 2024-11-27 11:32:17 -0500
commit28f56a9e1324fbde6854c72d6b234c2f00748d03 (patch)
tree253272dcd76b50a155e0087ee5e70c8b6d4d0034 /src/render
parent9918d2e947dda7ca470eafc811ddb4c8b632b5d3 (diff)
downloadcamu-28f56a9e1324fbde6854c72d6b234c2f00748d03.tar.gz
camu-28f56a9e1324fbde6854c72d6b234c2f00748d03.tar.bz2
camu-28f56a9e1324fbde6854c72d6b234c2f00748d03.zip
Sink fixes, update for dependency changes
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/render')
-rw-r--r--src/render/queue_libplacebo.c61
-rw-r--r--src/render/queue_libplacebo.h10
-rw-r--r--src/render/renderer_libplacebo.c3
-rw-r--r--src/render/renderer_libplacebo.h3
4 files changed, 48 insertions, 29 deletions
diff --git a/src/render/queue_libplacebo.c b/src/render/queue_libplacebo.c
index a95afc4..b830bb2 100644
--- a/src/render/queue_libplacebo.c
+++ b/src/render/queue_libplacebo.c
@@ -186,25 +186,27 @@ static bool map_av_frame(pl_gpu gpu, pl_tex *tex, const struct pl_source_frame *
.map_dovi = false
));
- s64 now = av_rescale_q(frame->best_effort_timestamp, stream->time_base, (AVRational){ 1, 1000 });
- s32 change;
- ASS_Image *ass_frame = ass_render_frame(lq->ass_renderer, lq->ass_track, now, &change);
- if (ass_frame) {
- struct camu_overlay_lp *overlay = NULL;
- if (lq->overlays.size > 0) {
- overlay = al_array_last(lq->overlays);
- }
- if (!overlay || change > 0) {
- overlay = create_subtitle_overlay(gpu, ass_frame);
- overlay->lq = lq;
- al_array_push(lq->overlays, overlay);
+ ((struct pl_source_frame *)src)->frame_data = NULL;
+
+ if (lq->has_subtitles) {
+ s64 now = av_rescale_q(frame->best_effort_timestamp, stream->time_base, (AVRational){ 1, 1000 });
+ s32 change;
+ ASS_Image *ass_frame = ass_render_frame(lq->ass_renderer, lq->ass_track, now, &change);
+ if (ass_frame) {
+ struct camu_overlay_lp *overlay = NULL;
+ if (lq->overlays.size > 0) {
+ overlay = al_array_last(lq->overlays);
+ }
+ if (!overlay || change > 0) {
+ overlay = create_subtitle_overlay(gpu, ass_frame);
+ overlay->lq = lq;
+ al_array_push(lq->overlays, overlay);
+ }
+ overlay->ref++;
+ out_frame->overlays = overlay->overlays;
+ out_frame->num_overlays = overlay->num;
+ ((struct pl_source_frame *)src)->frame_data = overlay;
}
- overlay->ref++;
- out_frame->overlays = overlay->overlays;
- out_frame->num_overlays = overlay->num;
- ((struct pl_source_frame *)src)->frame_data = overlay;
- } else {
- ((struct pl_source_frame *)src)->frame_data = NULL;
}
av_frame_free(&frame);
@@ -267,19 +269,33 @@ static void queue_lp_push_av_frame(struct camu_frame_queue *queue, AVFrame *fram
});
}
-static void 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, 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->has_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;
+ al_assert(lq->ass_track && lq->ass_renderer);
ass_process_chunk(lq->ass_track, (const char *)pkt->data, pkt->size, pkt->pts, pkt->duration);
}
#endif
@@ -325,8 +341,10 @@ static void queue_lp_reset(struct camu_frame_queue *queue)
static void queue_lp_free(struct camu_frame_queue **queue)
{
struct camu_frame_queue_lp *lq = (struct camu_frame_queue_lp *)*queue;
- ass_free_track(lq->ass_track);
- ass_renderer_done(lq->ass_renderer);
+ if (lq->has_subtitles) {
+ ass_free_track(lq->ass_track);
+ ass_renderer_done(lq->ass_renderer);
+ }
pl_queue_destroy(&lq->queue);
al_free(lq);
*queue = NULL;
@@ -336,6 +354,7 @@ 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->has_subtitles = false;
lq->q.push = queue_lp_push;
#ifdef CAMU_HAVE_FFMPEG
lq->q.push_av_frame = queue_lp_push_av_frame;
diff --git a/src/render/queue_libplacebo.h b/src/render/queue_libplacebo.h
index 3b403e5..4879cdd 100644
--- a/src/render/queue_libplacebo.h
+++ b/src/render/queue_libplacebo.h
@@ -1,10 +1,10 @@
#pragma once
-#include "../buffer/frame_queue.h"
-
#include <libplacebo/utils/frame_queue.h>
#include <libplacebo/utils/upload.h>
-#include <libass/ass.h>
+#include <ass/ass.h>
+
+#include "../buffer/frame_queue.h"
struct camu_overlay_lp {
struct pl_overlay *overlays;
@@ -18,9 +18,11 @@ struct camu_frame_queue_lp {
struct camu_frame_queue q;
pl_queue queue;
struct pl_queue_params params;
+ array(struct camu_overlay_lp *) overlays;
+ ASS_Library *ass;
ASS_Renderer *ass_renderer;
ASS_Track *ass_track;
- array(struct camu_overlay_lp *) overlays;
+ bool has_subtitles;
};
struct camu_frame_queue *camu_frame_queue_lp_create(void);
diff --git a/src/render/renderer_libplacebo.c b/src/render/renderer_libplacebo.c
index 480da0b..797dbd0 100644
--- a/src/render/renderer_libplacebo.c
+++ b/src/render/renderer_libplacebo.c
@@ -179,8 +179,7 @@ static struct camu_frame_queue *renderer_lp_create_queue(struct camu_renderer *r
lq->params.interpolation_threshold = 0.01f;
lq->params.radius = pl_frame_mix_radius(&lr->params);
lq->params.timeout = 0uL; // vsync
- lq->ass_renderer = ass_renderer_init(lr->ass);
- lq->ass_track = ass_new_track(lr->ass);
+ lq->ass = lr->ass;
return queue;
}
diff --git a/src/render/renderer_libplacebo.h b/src/render/renderer_libplacebo.h
index 5b206c6..eff7a34 100644
--- a/src/render/renderer_libplacebo.h
+++ b/src/render/renderer_libplacebo.h
@@ -4,7 +4,7 @@
#include <libplacebo/renderer.h>
#include <libplacebo/shaders/lut.h>
#include <libplacebo/colorspace.h>
-#include <libass/ass.h>
+#include <ass/ass.h>
#include "renderer.h"
@@ -29,7 +29,6 @@ struct camu_renderer_lp {
pl_renderer renderer;
struct pl_render_params params;
ASS_Library *ass;
- ASS_Renderer *ass_renderer;
};
struct camu_renderer *camu_renderer_lp_create(void);