xref: /aosp_15_r20/external/virglrenderer/src/virgl_video.h (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1*bbecb9d1SAndroid Build Coastguard Worker /**************************************************************************
2*bbecb9d1SAndroid Build Coastguard Worker  *
3*bbecb9d1SAndroid Build Coastguard Worker  * Copyright (C) 2022 Kylin Software Co., Ltd.
4*bbecb9d1SAndroid Build Coastguard Worker  *
5*bbecb9d1SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
6*bbecb9d1SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
7*bbecb9d1SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
8*bbecb9d1SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*bbecb9d1SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
10*bbecb9d1SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
11*bbecb9d1SAndroid Build Coastguard Worker  *
12*bbecb9d1SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included
13*bbecb9d1SAndroid Build Coastguard Worker  * in all copies or substantial portions of the Software.
14*bbecb9d1SAndroid Build Coastguard Worker  *
15*bbecb9d1SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16*bbecb9d1SAndroid Build Coastguard Worker  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*bbecb9d1SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*bbecb9d1SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19*bbecb9d1SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20*bbecb9d1SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21*bbecb9d1SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
22*bbecb9d1SAndroid Build Coastguard Worker  *
23*bbecb9d1SAndroid Build Coastguard Worker  **************************************************************************/
24*bbecb9d1SAndroid Build Coastguard Worker 
25*bbecb9d1SAndroid Build Coastguard Worker /**
26*bbecb9d1SAndroid Build Coastguard Worker  * @file
27*bbecb9d1SAndroid Build Coastguard Worker  * General video encoding and decoding interface.
28*bbecb9d1SAndroid Build Coastguard Worker  *
29*bbecb9d1SAndroid Build Coastguard Worker  * This file provides a general video interface, which mainly contains
30*bbecb9d1SAndroid Build Coastguard Worker  * two objects:
31*bbecb9d1SAndroid Build Coastguard Worker  *
32*bbecb9d1SAndroid Build Coastguard Worker  * virgl_video_buffer:
33*bbecb9d1SAndroid Build Coastguard Worker  *   Buffer for storing raw YUV formatted data. In VA-API based
34*bbecb9d1SAndroid Build Coastguard Worker  *   implementations, it is usually associated with a surface.
35*bbecb9d1SAndroid Build Coastguard Worker  *
36*bbecb9d1SAndroid Build Coastguard Worker  * virgl_video_codec:
37*bbecb9d1SAndroid Build Coastguard Worker  *   Represents an encoder or decoder. In VA-API based implementations, it
38*bbecb9d1SAndroid Build Coastguard Worker  *   usually corresponds to a context.
39*bbecb9d1SAndroid Build Coastguard Worker  *
40*bbecb9d1SAndroid Build Coastguard Worker  * @author Feng Jiang <[email protected]>
41*bbecb9d1SAndroid Build Coastguard Worker  */
42*bbecb9d1SAndroid Build Coastguard Worker 
43*bbecb9d1SAndroid Build Coastguard Worker #ifndef VIRGL_VIDEO_H
44*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_VIDEO_H
45*bbecb9d1SAndroid Build Coastguard Worker 
46*bbecb9d1SAndroid Build Coastguard Worker #include <stdint.h>
47*bbecb9d1SAndroid Build Coastguard Worker #include <stdbool.h>
48*bbecb9d1SAndroid Build Coastguard Worker 
49*bbecb9d1SAndroid Build Coastguard Worker #include "pipe/p_format.h"
50*bbecb9d1SAndroid Build Coastguard Worker #include "pipe/p_video_enums.h"
51*bbecb9d1SAndroid Build Coastguard Worker 
52*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec;
53*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer;
54*bbecb9d1SAndroid Build Coastguard Worker union virgl_caps;
55*bbecb9d1SAndroid Build Coastguard Worker union virgl_picture_desc;
56*bbecb9d1SAndroid Build Coastguard Worker 
57*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_create_codec_args {
58*bbecb9d1SAndroid Build Coastguard Worker     enum pipe_video_profile profile;
59*bbecb9d1SAndroid Build Coastguard Worker     enum pipe_video_entrypoint entrypoint;
60*bbecb9d1SAndroid Build Coastguard Worker     enum pipe_video_chroma_format chroma_format;
61*bbecb9d1SAndroid Build Coastguard Worker     uint32_t level;
62*bbecb9d1SAndroid Build Coastguard Worker     uint32_t width;
63*bbecb9d1SAndroid Build Coastguard Worker     uint32_t height;
64*bbecb9d1SAndroid Build Coastguard Worker     uint32_t max_references;
65*bbecb9d1SAndroid Build Coastguard Worker     uint32_t flags;
66*bbecb9d1SAndroid Build Coastguard Worker     void *opaque;
67*bbecb9d1SAndroid Build Coastguard Worker };
68*bbecb9d1SAndroid Build Coastguard Worker 
69*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_create_buffer_args {
70*bbecb9d1SAndroid Build Coastguard Worker     enum pipe_format format;
71*bbecb9d1SAndroid Build Coastguard Worker     uint32_t width;
72*bbecb9d1SAndroid Build Coastguard Worker     uint32_t height;
73*bbecb9d1SAndroid Build Coastguard Worker     bool interlaced;
74*bbecb9d1SAndroid Build Coastguard Worker     void *opaque;
75*bbecb9d1SAndroid Build Coastguard Worker };
76*bbecb9d1SAndroid Build Coastguard Worker 
77*bbecb9d1SAndroid Build Coastguard Worker /* flags for virgl_video_dma_buffers */
78*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_VIDEO_DMABUF_READ_ONLY        0x0001
79*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_VIDEO_DMABUF_WRITE_ONLY       0x0002
80*bbecb9d1SAndroid Build Coastguard Worker #define VIRGL_VIDEO_DMABUF_READ_WRITE       0x0003
81*bbecb9d1SAndroid Build Coastguard Worker 
82*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_dma_buf {
83*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_video_buffer *buf;
84*bbecb9d1SAndroid Build Coastguard Worker 
85*bbecb9d1SAndroid Build Coastguard Worker     uint32_t drm_format;
86*bbecb9d1SAndroid Build Coastguard Worker     uint32_t width;
87*bbecb9d1SAndroid Build Coastguard Worker     uint32_t height;
88*bbecb9d1SAndroid Build Coastguard Worker     uint32_t flags;
89*bbecb9d1SAndroid Build Coastguard Worker 
90*bbecb9d1SAndroid Build Coastguard Worker     uint32_t num_planes;
91*bbecb9d1SAndroid Build Coastguard Worker     struct virgl_video_dma_buf_plane {
92*bbecb9d1SAndroid Build Coastguard Worker         uint32_t drm_format;
93*bbecb9d1SAndroid Build Coastguard Worker         int fd;
94*bbecb9d1SAndroid Build Coastguard Worker         uint32_t size;
95*bbecb9d1SAndroid Build Coastguard Worker         int modifier;
96*bbecb9d1SAndroid Build Coastguard Worker         uint32_t offset;
97*bbecb9d1SAndroid Build Coastguard Worker         uint32_t pitch;
98*bbecb9d1SAndroid Build Coastguard Worker     } planes[4];
99*bbecb9d1SAndroid Build Coastguard Worker };
100*bbecb9d1SAndroid Build Coastguard Worker 
101*bbecb9d1SAndroid Build Coastguard Worker /*
102*bbecb9d1SAndroid Build Coastguard Worker  * Use callback functions instead of directly exporting the video buffer
103*bbecb9d1SAndroid Build Coastguard Worker  * through an interface like virgl_video_export_buffer() is because the
104*bbecb9d1SAndroid Build Coastguard Worker  * underlying implementation may not be VA-API. The callback function can
105*bbecb9d1SAndroid Build Coastguard Worker  * better shield the underlying logic differences.
106*bbecb9d1SAndroid Build Coastguard Worker  */
107*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_callbacks {
108*bbecb9d1SAndroid Build Coastguard Worker     /* Callback when decoding is complete, used to download the decoded picture
109*bbecb9d1SAndroid Build Coastguard Worker      * from the video buffer */
110*bbecb9d1SAndroid Build Coastguard Worker     void (*decode_completed)(struct virgl_video_codec *codec,
111*bbecb9d1SAndroid Build Coastguard Worker                              const struct virgl_video_dma_buf *dmabuf);
112*bbecb9d1SAndroid Build Coastguard Worker 
113*bbecb9d1SAndroid Build Coastguard Worker     /* Upload the picture data to be encoded to the video buffer */
114*bbecb9d1SAndroid Build Coastguard Worker     void (*encode_upload_picture)(struct virgl_video_codec *codec,
115*bbecb9d1SAndroid Build Coastguard Worker                                   const struct virgl_video_dma_buf *dmabuf);
116*bbecb9d1SAndroid Build Coastguard Worker 
117*bbecb9d1SAndroid Build Coastguard Worker     /* Callback when encoding is complete, used to download the encoded data
118*bbecb9d1SAndroid Build Coastguard Worker      * and reference picture */
119*bbecb9d1SAndroid Build Coastguard Worker     void (*encode_completed)(struct virgl_video_codec *codec,
120*bbecb9d1SAndroid Build Coastguard Worker                              const struct virgl_video_dma_buf *src_buf,
121*bbecb9d1SAndroid Build Coastguard Worker                              const struct virgl_video_dma_buf *ref_buf,
122*bbecb9d1SAndroid Build Coastguard Worker                              unsigned num_coded_bufs,
123*bbecb9d1SAndroid Build Coastguard Worker                              const void * const *coded_bufs,
124*bbecb9d1SAndroid Build Coastguard Worker                              const unsigned *coded_sizes);
125*bbecb9d1SAndroid Build Coastguard Worker };
126*bbecb9d1SAndroid Build Coastguard Worker 
127*bbecb9d1SAndroid Build Coastguard Worker int virgl_video_init(int drm_fd,
128*bbecb9d1SAndroid Build Coastguard Worker                      struct virgl_video_callbacks *cbs,
129*bbecb9d1SAndroid Build Coastguard Worker                      unsigned int flags);
130*bbecb9d1SAndroid Build Coastguard Worker void virgl_video_destroy(void);
131*bbecb9d1SAndroid Build Coastguard Worker 
132*bbecb9d1SAndroid Build Coastguard Worker int virgl_video_fill_caps(union virgl_caps *caps);
133*bbecb9d1SAndroid Build Coastguard Worker 
134*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *virgl_video_create_codec(
135*bbecb9d1SAndroid Build Coastguard Worker         const struct virgl_video_create_codec_args *args);
136*bbecb9d1SAndroid Build Coastguard Worker void virgl_video_destroy_codec(struct virgl_video_codec *codec);
137*bbecb9d1SAndroid Build Coastguard Worker uint32_t virgl_video_codec_profile(const struct virgl_video_codec *codec);
138*bbecb9d1SAndroid Build Coastguard Worker void *virgl_video_codec_opaque_data(struct virgl_video_codec *codec);
139*bbecb9d1SAndroid Build Coastguard Worker 
140*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *virgl_video_create_buffer(
141*bbecb9d1SAndroid Build Coastguard Worker         const struct virgl_video_create_buffer_args *args);
142*bbecb9d1SAndroid Build Coastguard Worker void virgl_video_destroy_buffer(struct virgl_video_buffer *buffer);
143*bbecb9d1SAndroid Build Coastguard Worker uint32_t virgl_video_buffer_id(const struct virgl_video_buffer *buffer);
144*bbecb9d1SAndroid Build Coastguard Worker void *virgl_video_buffer_opaque_data(struct virgl_video_buffer *buffer);
145*bbecb9d1SAndroid Build Coastguard Worker 
146*bbecb9d1SAndroid Build Coastguard Worker int virgl_video_begin_frame(struct virgl_video_codec *codec,
147*bbecb9d1SAndroid Build Coastguard Worker                             struct virgl_video_buffer *target);
148*bbecb9d1SAndroid Build Coastguard Worker int virgl_video_decode_bitstream(struct virgl_video_codec *codec,
149*bbecb9d1SAndroid Build Coastguard Worker                                  struct virgl_video_buffer *target,
150*bbecb9d1SAndroid Build Coastguard Worker                                  const union virgl_picture_desc *desc,
151*bbecb9d1SAndroid Build Coastguard Worker                                  unsigned num_buffers,
152*bbecb9d1SAndroid Build Coastguard Worker                                  const void * const *buffers,
153*bbecb9d1SAndroid Build Coastguard Worker                                  const unsigned *sizes);
154*bbecb9d1SAndroid Build Coastguard Worker int virgl_video_encode_bitstream(struct virgl_video_codec *codec,
155*bbecb9d1SAndroid Build Coastguard Worker                                  struct virgl_video_buffer *source,
156*bbecb9d1SAndroid Build Coastguard Worker                                  const union virgl_picture_desc *desc);
157*bbecb9d1SAndroid Build Coastguard Worker int virgl_video_end_frame(struct virgl_video_codec *codec,
158*bbecb9d1SAndroid Build Coastguard Worker                           struct virgl_video_buffer *target);
159*bbecb9d1SAndroid Build Coastguard Worker 
160*bbecb9d1SAndroid Build Coastguard Worker #endif /* VIRGL_VIDEO_H */
161*bbecb9d1SAndroid Build Coastguard Worker 
162