mirror of https://github.com/mpv-player/mpv
lavfi: support hwdec filters for --lavfi-complex
Not so important by itself, but important for when we replace the vf libavfilter wrapper with the common implementation. (Which will hopefully happen, but not too soon.)
This commit is contained in:
parent
134c9d9df5
commit
e5df57c755
|
@ -40,6 +40,7 @@
|
|||
#include "video/mp_image.h"
|
||||
#include "audio/fmt-conversion.h"
|
||||
#include "video/fmt-conversion.h"
|
||||
#include "video/hwdec.h"
|
||||
|
||||
#include "lavfi.h"
|
||||
|
||||
|
@ -52,6 +53,8 @@ struct lavfi {
|
|||
struct mp_log *log;
|
||||
char *graph_string;
|
||||
|
||||
struct mp_hwdec_devices *hwdec_devs;
|
||||
|
||||
AVFilterGraph *graph;
|
||||
// Set to true once all inputs have been initialized, and the graph is
|
||||
// linked.
|
||||
|
@ -423,6 +426,7 @@ static bool init_pads(struct lavfi *c)
|
|||
params->height = pad->in_fmt_v->h;
|
||||
params->sample_aspect_ratio.num = pad->in_fmt_v->params.p_w;
|
||||
params->sample_aspect_ratio.den = pad->in_fmt_v->params.p_h;
|
||||
params->hw_frames_ctx = pad->in_fmt_v->hwctx;
|
||||
filter_name = "buffer";
|
||||
} else {
|
||||
assert(0);
|
||||
|
@ -471,6 +475,11 @@ static void dump_graph(struct lavfi *c)
|
|||
#endif
|
||||
}
|
||||
|
||||
void lavfi_set_hwdec_devs(struct lavfi *c, struct mp_hwdec_devices *hwdevs)
|
||||
{
|
||||
c->hwdec_devs = hwdevs;
|
||||
}
|
||||
|
||||
// Initialize the graph if all inputs have formats set. If it's already
|
||||
// initialized, or can't be initialized yet, do nothing.
|
||||
static void init_graph(struct lavfi *c)
|
||||
|
@ -478,6 +487,15 @@ static void init_graph(struct lavfi *c)
|
|||
assert(!c->initialized);
|
||||
|
||||
if (init_pads(c)) {
|
||||
if (c->hwdec_devs) {
|
||||
struct mp_hwdec_ctx *hwdec = hwdec_devices_get_first(c->hwdec_devs);
|
||||
for (int n = 0; n < c->graph->nb_filters; n++) {
|
||||
AVFilterContext *filter = c->graph->filters[n];
|
||||
if (hwdec && hwdec->av_device_ref)
|
||||
filter->hw_device_ctx = av_buffer_ref(hwdec->av_device_ref);
|
||||
}
|
||||
}
|
||||
|
||||
// And here the actual libavfilter initialization happens.
|
||||
if (avfilter_graph_config(c->graph, NULL) < 0) {
|
||||
MP_FATAL(c, "failed to configure the filter graph\n");
|
||||
|
|
|
@ -22,6 +22,7 @@ bool lavfi_get_connected(struct lavfi_pad *pad);
|
|||
bool lavfi_process(struct lavfi *c);
|
||||
bool lavfi_has_failed(struct lavfi *c);
|
||||
void lavfi_seek_reset(struct lavfi *c);
|
||||
void lavfi_set_hwdec_devs(struct lavfi *c, struct mp_hwdec_devices *hwdevs);
|
||||
int lavfi_request_frame_a(struct lavfi_pad *pad, struct mp_audio **out_aframe);
|
||||
int lavfi_request_frame_v(struct lavfi_pad *pad, struct mp_image **out_vframe);
|
||||
bool lavfi_needs_input(struct lavfi_pad *pad);
|
||||
|
|
|
@ -496,6 +496,9 @@ int reinit_video_chain_src(struct MPContext *mpctx, struct lavfi_pad *src)
|
|||
|
||||
vo_c->hwdec_devs = vo_c->vo->hwdec_devs;
|
||||
|
||||
if (mpctx->lavfi)
|
||||
lavfi_set_hwdec_devs(mpctx->lavfi, vo_c->hwdec_devs);
|
||||
|
||||
vo_c->filter_src = src;
|
||||
if (!vo_c->filter_src) {
|
||||
vo_c->track = track;
|
||||
|
|
Loading…
Reference in New Issue