xref: /aosp_15_r20/external/libdav1d/examples/dp_renderer.h (revision c09093415860a1c2373dacd84c4fde00c507cdfd)
1*c0909341SAndroid Build Coastguard Worker /*
2*c0909341SAndroid Build Coastguard Worker  * Copyright © 2020, VideoLAN and dav1d authors
3*c0909341SAndroid Build Coastguard Worker  * All rights reserved.
4*c0909341SAndroid Build Coastguard Worker  *
5*c0909341SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
6*c0909341SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions are met:
7*c0909341SAndroid Build Coastguard Worker  *
8*c0909341SAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright notice, this
9*c0909341SAndroid Build Coastguard Worker  *    list of conditions and the following disclaimer.
10*c0909341SAndroid Build Coastguard Worker  *
11*c0909341SAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright notice,
12*c0909341SAndroid Build Coastguard Worker  *    this list of conditions and the following disclaimer in the documentation
13*c0909341SAndroid Build Coastguard Worker  *    and/or other materials provided with the distribution.
14*c0909341SAndroid Build Coastguard Worker  *
15*c0909341SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16*c0909341SAndroid Build Coastguard Worker  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17*c0909341SAndroid Build Coastguard Worker  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18*c0909341SAndroid Build Coastguard Worker  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
19*c0909341SAndroid Build Coastguard Worker  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20*c0909341SAndroid Build Coastguard Worker  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21*c0909341SAndroid Build Coastguard Worker  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22*c0909341SAndroid Build Coastguard Worker  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23*c0909341SAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24*c0909341SAndroid Build Coastguard Worker  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25*c0909341SAndroid Build Coastguard Worker  */
26*c0909341SAndroid Build Coastguard Worker 
27*c0909341SAndroid Build Coastguard Worker #include <inttypes.h>
28*c0909341SAndroid Build Coastguard Worker #include <string.h>
29*c0909341SAndroid Build Coastguard Worker 
30*c0909341SAndroid Build Coastguard Worker #include "dav1d/dav1d.h"
31*c0909341SAndroid Build Coastguard Worker 
32*c0909341SAndroid Build Coastguard Worker #include <SDL.h>
33*c0909341SAndroid Build Coastguard Worker #if HAVE_PLACEBO
34*c0909341SAndroid Build Coastguard Worker # include <libplacebo/config.h>
35*c0909341SAndroid Build Coastguard Worker #endif
36*c0909341SAndroid Build Coastguard Worker 
37*c0909341SAndroid Build Coastguard Worker // Check libplacebo Vulkan rendering
38*c0909341SAndroid Build Coastguard Worker #if HAVE_VULKAN && defined(SDL_VIDEO_VULKAN)
39*c0909341SAndroid Build Coastguard Worker # if defined(PL_HAVE_VULKAN) && PL_HAVE_VULKAN
40*c0909341SAndroid Build Coastguard Worker #  define HAVE_RENDERER_PLACEBO 1
41*c0909341SAndroid Build Coastguard Worker #  define HAVE_PLACEBO_VULKAN 1
42*c0909341SAndroid Build Coastguard Worker # endif
43*c0909341SAndroid Build Coastguard Worker #endif
44*c0909341SAndroid Build Coastguard Worker 
45*c0909341SAndroid Build Coastguard Worker // Check libplacebo OpenGL rendering
46*c0909341SAndroid Build Coastguard Worker #if defined(PL_HAVE_OPENGL) && PL_HAVE_OPENGL
47*c0909341SAndroid Build Coastguard Worker # define HAVE_RENDERER_PLACEBO 1
48*c0909341SAndroid Build Coastguard Worker # define HAVE_PLACEBO_OPENGL 1
49*c0909341SAndroid Build Coastguard Worker #endif
50*c0909341SAndroid Build Coastguard Worker 
51*c0909341SAndroid Build Coastguard Worker #ifndef HAVE_RENDERER_PLACEBO
52*c0909341SAndroid Build Coastguard Worker #define HAVE_RENDERER_PLACEBO 0
53*c0909341SAndroid Build Coastguard Worker #endif
54*c0909341SAndroid Build Coastguard Worker #ifndef HAVE_PLACEBO_VULKAN
55*c0909341SAndroid Build Coastguard Worker #define HAVE_PLACEBO_VULKAN 0
56*c0909341SAndroid Build Coastguard Worker #endif
57*c0909341SAndroid Build Coastguard Worker #ifndef HAVE_PLACEBO_OPENGL
58*c0909341SAndroid Build Coastguard Worker #define HAVE_PLACEBO_OPENGL 0
59*c0909341SAndroid Build Coastguard Worker #endif
60*c0909341SAndroid Build Coastguard Worker 
61*c0909341SAndroid Build Coastguard Worker /**
62*c0909341SAndroid Build Coastguard Worker  * Settings structure
63*c0909341SAndroid Build Coastguard Worker  * Hold all settings available for the player,
64*c0909341SAndroid Build Coastguard Worker  * this is usually filled by parsing arguments
65*c0909341SAndroid Build Coastguard Worker  * from the console.
66*c0909341SAndroid Build Coastguard Worker  */
67*c0909341SAndroid Build Coastguard Worker typedef struct {
68*c0909341SAndroid Build Coastguard Worker     const char *inputfile;
69*c0909341SAndroid Build Coastguard Worker     const char *renderer_name;
70*c0909341SAndroid Build Coastguard Worker     int highquality;
71*c0909341SAndroid Build Coastguard Worker     int untimed;
72*c0909341SAndroid Build Coastguard Worker     int zerocopy;
73*c0909341SAndroid Build Coastguard Worker     int gpugrain;
74*c0909341SAndroid Build Coastguard Worker     int fullscreen;
75*c0909341SAndroid Build Coastguard Worker } Dav1dPlaySettings;
76*c0909341SAndroid Build Coastguard Worker 
77*c0909341SAndroid Build Coastguard Worker #define WINDOW_WIDTH  910
78*c0909341SAndroid Build Coastguard Worker #define WINDOW_HEIGHT 512
79*c0909341SAndroid Build Coastguard Worker 
80*c0909341SAndroid Build Coastguard Worker enum {
81*c0909341SAndroid Build Coastguard Worker     DAV1D_EVENT_NEW_FRAME,
82*c0909341SAndroid Build Coastguard Worker     DAV1D_EVENT_SEEK_FRAME,
83*c0909341SAndroid Build Coastguard Worker     DAV1D_EVENT_DEC_QUIT
84*c0909341SAndroid Build Coastguard Worker };
85*c0909341SAndroid Build Coastguard Worker 
86*c0909341SAndroid Build Coastguard Worker /**
87*c0909341SAndroid Build Coastguard Worker  * Renderer info
88*c0909341SAndroid Build Coastguard Worker  */
89*c0909341SAndroid Build Coastguard Worker typedef struct rdr_info
90*c0909341SAndroid Build Coastguard Worker {
91*c0909341SAndroid Build Coastguard Worker     // Renderer name
92*c0909341SAndroid Build Coastguard Worker     const char *name;
93*c0909341SAndroid Build Coastguard Worker     // Cookie passed to the renderer implementation callbacks
94*c0909341SAndroid Build Coastguard Worker     void *cookie;
95*c0909341SAndroid Build Coastguard Worker     // Callback to create the renderer
96*c0909341SAndroid Build Coastguard Worker     void* (*create_renderer)(const Dav1dPlaySettings *settings);
97*c0909341SAndroid Build Coastguard Worker     // Callback to destroy the renderer
98*c0909341SAndroid Build Coastguard Worker     void (*destroy_renderer)(void *cookie);
99*c0909341SAndroid Build Coastguard Worker     // Callback to the render function that renders a prevously sent frame
100*c0909341SAndroid Build Coastguard Worker     void (*render)(void *cookie, const Dav1dPlaySettings *settings);
101*c0909341SAndroid Build Coastguard Worker     // Callback to the send frame function, _may_ also unref dav1d_pic!
102*c0909341SAndroid Build Coastguard Worker     int (*update_frame)(void *cookie, Dav1dPicture *dav1d_pic,
103*c0909341SAndroid Build Coastguard Worker                         const Dav1dPlaySettings *settings);
104*c0909341SAndroid Build Coastguard Worker     // Callback for alloc/release pictures (optional)
105*c0909341SAndroid Build Coastguard Worker     int (*alloc_pic)(Dav1dPicture *pic, void *cookie);
106*c0909341SAndroid Build Coastguard Worker     void (*release_pic)(Dav1dPicture *pic, void *cookie);
107*c0909341SAndroid Build Coastguard Worker     // Whether or not this renderer can apply on-GPU film grain synthesis
108*c0909341SAndroid Build Coastguard Worker     int supports_gpu_grain;
109*c0909341SAndroid Build Coastguard Worker } Dav1dPlayRenderInfo;
110*c0909341SAndroid Build Coastguard Worker 
111*c0909341SAndroid Build Coastguard Worker extern const Dav1dPlayRenderInfo rdr_placebo_vk;
112*c0909341SAndroid Build Coastguard Worker extern const Dav1dPlayRenderInfo rdr_placebo_gl;
113*c0909341SAndroid Build Coastguard Worker extern const Dav1dPlayRenderInfo rdr_sdl;
114*c0909341SAndroid Build Coastguard Worker 
115*c0909341SAndroid Build Coastguard Worker // Available renderes ordered by priority
116*c0909341SAndroid Build Coastguard Worker static const Dav1dPlayRenderInfo* const dp_renderers[] = {
117*c0909341SAndroid Build Coastguard Worker     &rdr_placebo_vk,
118*c0909341SAndroid Build Coastguard Worker     &rdr_placebo_gl,
119*c0909341SAndroid Build Coastguard Worker     &rdr_sdl,
120*c0909341SAndroid Build Coastguard Worker };
121*c0909341SAndroid Build Coastguard Worker 
dp_get_renderer(const char * name)122*c0909341SAndroid Build Coastguard Worker static inline const Dav1dPlayRenderInfo *dp_get_renderer(const char *name)
123*c0909341SAndroid Build Coastguard Worker {
124*c0909341SAndroid Build Coastguard Worker     for (size_t i = 0; i < (sizeof(dp_renderers)/sizeof(*dp_renderers)); ++i)
125*c0909341SAndroid Build Coastguard Worker     {
126*c0909341SAndroid Build Coastguard Worker         if (dp_renderers[i]->name == NULL)
127*c0909341SAndroid Build Coastguard Worker             continue;
128*c0909341SAndroid Build Coastguard Worker 
129*c0909341SAndroid Build Coastguard Worker         if (name == NULL || strcmp(name, dp_renderers[i]->name) == 0) {
130*c0909341SAndroid Build Coastguard Worker             return dp_renderers[i];
131*c0909341SAndroid Build Coastguard Worker         }
132*c0909341SAndroid Build Coastguard Worker     }
133*c0909341SAndroid Build Coastguard Worker     return NULL;
134*c0909341SAndroid Build Coastguard Worker }
135*c0909341SAndroid Build Coastguard Worker 
dp_create_sdl_window(int window_flags)136*c0909341SAndroid Build Coastguard Worker static inline SDL_Window *dp_create_sdl_window(int window_flags)
137*c0909341SAndroid Build Coastguard Worker {
138*c0909341SAndroid Build Coastguard Worker     SDL_Window *win;
139*c0909341SAndroid Build Coastguard Worker     window_flags |= SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI;
140*c0909341SAndroid Build Coastguard Worker 
141*c0909341SAndroid Build Coastguard Worker     win = SDL_CreateWindow("Dav1dPlay", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
142*c0909341SAndroid Build Coastguard Worker         WINDOW_WIDTH, WINDOW_HEIGHT, window_flags);
143*c0909341SAndroid Build Coastguard Worker     SDL_SetWindowResizable(win, SDL_TRUE);
144*c0909341SAndroid Build Coastguard Worker 
145*c0909341SAndroid Build Coastguard Worker     return win;
146*c0909341SAndroid Build Coastguard Worker }
147