summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
Diffstat (limited to 'src/render')
-rw-r--r--src/render/queue_libplacebo.c19
-rw-r--r--src/render/renderer_libplacebo.c1
2 files changed, 11 insertions, 9 deletions
diff --git a/src/render/queue_libplacebo.c b/src/render/queue_libplacebo.c
index b6a7477..d078cbc 100644
--- a/src/render/queue_libplacebo.c
+++ b/src/render/queue_libplacebo.c
@@ -215,26 +215,27 @@ static bool map_av_frame(pl_gpu gpu, pl_tex *tex, const struct pl_source_frame *
));
}
- if (!ok) {
+ if (!ok && frame->hw_frames_ctx) {
if (!lq->copy_frame_fallback) {
al_log_warn("frame_queue_libplacebo", "Falling back to software copy.");
lq->copy_frame_fallback = true;
lq->swframe = av_frame_alloc();
+ enum AVPixelFormat *fmts;
+ av_hwframe_transfer_get_formats(frame->hw_frames_ctx, AV_HWFRAME_TRANSFER_DIRECTION_FROM, &fmts, 0);
+ lq->swframe->format = fmts[0];
+ av_free(fmts);
}
ok = av_hwframe_transfer_data(lq->swframe, frame, 0) == 0;
if (ok) {
av_frame_copy_props(lq->swframe, frame);
+ ok = pl_map_avframe_ex(gpu, out_frame, pl_avframe_params(
+ .frame = lq->swframe,
+ .tex = tex
+ ));
+ av_frame_unref(lq->swframe);
}
}
- if (lq->copy_frame_fallback) {
- ok = pl_map_avframe_ex(gpu, out_frame, pl_avframe_params(
- .frame = lq->swframe,
- .tex = tex
- ));
- av_frame_unref(lq->swframe);
- }
-
((struct pl_source_frame *)src)->frame_data = NULL;
if (ok && lq->have_subtitles) {
diff --git a/src/render/renderer_libplacebo.c b/src/render/renderer_libplacebo.c
index 0dcff45..8ff718e 100644
--- a/src/render/renderer_libplacebo.c
+++ b/src/render/renderer_libplacebo.c
@@ -233,6 +233,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->copy_frame_fallback = false;
lq->ass = lr->ass;
return queue;
}