20 VdpStatus st = vdp->funcs.videoSurfaceGetParameters(
frame->surface,
25 if(st != VDP_STATUS_OK){
29 if(vdp->surf_width != frame_w ||
30 vdp->surf_height != frame_h ||
32 !vdp->mixerInitialized)
34 vdp->initMixer(frame_w, frame_h, ct);
38void state_vdpau::loadFrame(hw_vdpau_frame *
frame){
41 glBindTexture(GL_TEXTURE_2D, 0);
46 glVDPAUGetSurfaceivNV(vdpgl_surf,
54 if(
state == GL_SURFACE_MAPPED_NV)
55 glVDPAUUnmapSurfacesNV(1, &vdpgl_surf);
57 checkInterop(
frame->hwctx.device,
frame->hwctx.get_proc_address);
60 mixerRender(
frame->surface);
62 glVDPAUMapSurfacesNV(1, &vdpgl_surf);
64 glBindTexture(GL_TEXTURE_2D, textures[0]);
73void state_vdpau::uninitMixer(){
76 if (mixer != VDP_INVALID_HANDLE){
77 st = funcs.videoMixerDestroy(mixer);
78 mixer = VDP_INVALID_HANDLE;
79 if(st != VDP_STATUS_OK){
84 if (out_surf != VDP_INVALID_HANDLE){
85 st = funcs.outputSurfaceDestroy(out_surf);
86 if(st != VDP_STATUS_OK){
89 out_surf = VDP_INVALID_HANDLE;
95 glVDPAUUnregisterSurfaceNV(vdpgl_surf);
96 mixerInitialized =
false;
102void state_vdpau::initMixer(uint32_t w, uint32_t h, VdpChromaType ct){
111 VdpRGBAFormat rgbaFormat = VDP_RGBA_FORMAT_B8G8R8A8;
113 st = funcs.outputSurfaceCreate(device,
119 if(st != VDP_STATUS_OK){
123 VdpVideoMixerParameter
params[] = {
124 VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE,
125 VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH,
126 VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT
129 void *param_vals[] = {
135 st = funcs.videoMixerCreate(device,
143 if(st != VDP_STATUS_OK){
147 vdpgl_surf = glVDPAURegisterOutputSurfaceNV(NV_CAST(out_surf),
152 glVDPAUSurfaceAccessNV(vdpgl_surf, GL_WRITE_DISCARD_NV);
154 mixerInitialized =
true;
160void state_vdpau::mixerRender(VdpVideoSurface f){
161 VdpStatus st = funcs.videoMixerRender(mixer,
164 VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME,
177 if(st != VDP_STATUS_OK){
186void state_vdpau::checkInterop(VdpDevice device, VdpGetProcAddress *get_proc_address){
187 if(this->device != device || this->get_proc_address != get_proc_address){
189 initInterop(device, get_proc_address);
196void state_vdpau::initInterop(VdpDevice device, VdpGetProcAddress *get_proc_address){
197 if(interopInitialized)
200 glVDPAUInitNV(NV_CAST(device), (
void *) get_proc_address);
201 this->device = device;
202 this->get_proc_address = get_proc_address;
205 interopInitialized =
true;
211void state_vdpau::uninitInterop(){
212 if(!interopInitialized)
217 get_proc_address =
nullptr;
218 interopInitialized =
false;
219 mixerInitialized =
false;
228bool state_vdpau::init(){
230 glGenTextures(4, textures);
239void state_vdpau::uninit(){
243 glDeleteTextures(4, textures);
244 for(
int i = 0; i < 4; i++){
struct video_frame * frame
void log_msg(int level, const char *format,...)
#define LOG_LEVEL_ERROR
general errors
static void check_mixer(struct state_vdpau *vdp, hw_vdpau_frame *frame)
Checks VdpMixer parameters and reinitializes it if they don't match the video parameters.
void hw_vdpau_frame_unref(hw_vdpau_frame *frame)
hw_vdpau_frame hw_vdpau_frame_copy(const hw_vdpau_frame *frame)
void vdp_funcs_load(vdp_funcs *f, VdpDevice device, VdpGetProcAddress *get_proc_address)
void hw_vdpau_frame_init(hw_vdpau_frame *frame)