1
mirror of https://github.com/mpv-player/mpv synced 2024-11-14 22:48:35 +01:00
mpv/video/vdpau_mixer.h
wm4 e632e37ab8 vdpau: retrieve mixer parameters directly from the hw surface
Always configure the vdpau mixer based on the current surface sent to
it. Before this, we just hardcoded the chroma type, and the surface size
was essentially a guess.

Calling VdpVideoSurfaceGetParameters() on every surface is a bit
suspicious, but it appears it's a cheap function (just requiring some
locks and a table lookup). This way we avoid creating another
complicated mechanism to carry around the actual surface parameters
with a mp_image/AVFrame.
2015-05-28 21:54:02 +02:00

61 lines
1.5 KiB
C

#ifndef MP_VDPAU_MIXER_H_
#define MP_VDPAU_MIXER_H_
#include <stdbool.h>
#include "mp_image.h"
#include "vdpau.h"
struct mp_vdpau_mixer_opts {
int deint;
int chroma_deint;
int pullup;
float denoise;
float sharpen;
int hqscaling;
};
#define MP_VDP_HISTORY_FRAMES 2
struct mp_vdpau_mixer_frame {
// settings
struct mp_vdpau_mixer_opts opts;
// video data
VdpVideoMixerPictureStructure field;
VdpVideoSurface past[MP_VDP_HISTORY_FRAMES];
VdpVideoSurface current;
VdpVideoSurface future[MP_VDP_HISTORY_FRAMES];
};
struct mp_vdpau_mixer {
struct mp_log *log;
struct mp_vdpau_ctx *ctx;
bool initialized;
struct mp_image_params image_params;
struct mp_vdpau_mixer_opts opts;
VdpChromaType current_chroma_type;
int current_w, current_h;
// set initialized=false to force reinit when changed
struct mp_csp_equalizer video_eq;
VdpVideoMixer video_mixer;
};
struct mp_image *mp_vdpau_mixed_frame_create(struct mp_image *base);
struct mp_vdpau_mixer_frame *mp_vdpau_mixed_frame_get(struct mp_image *mpi);
struct mp_vdpau_mixer *mp_vdpau_mixer_create(struct mp_vdpau_ctx *vdp_ctx,
struct mp_log *log);
void mp_vdpau_mixer_destroy(struct mp_vdpau_mixer *mixer);
int mp_vdpau_mixer_render(struct mp_vdpau_mixer *mixer,
struct mp_vdpau_mixer_opts *opts,
VdpOutputSurface output, VdpRect *output_rect,
struct mp_image *video, VdpRect *video_rect);
#endif