diff options
| author | 2024-11-27 11:32:17 -0500 | |
|---|---|---|
| committer | 2024-11-27 11:32:17 -0500 | |
| commit | 28f56a9e1324fbde6854c72d6b234c2f00748d03 (patch) | |
| tree | 253272dcd76b50a155e0087ee5e70c8b6d4d0034 /src/render | |
| parent | 9918d2e947dda7ca470eafc811ddb4c8b632b5d3 (diff) | |
| download | camu-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.c | 61 | ||||
| -rw-r--r-- | src/render/queue_libplacebo.h | 10 | ||||
| -rw-r--r-- | src/render/renderer_libplacebo.c | 3 | ||||
| -rw-r--r-- | src/render/renderer_libplacebo.h | 3 |
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); |