e68b66ff7d5a2d8c0681e92782371ea396993047
[vlc.git] / modules / codec / omxil / mediacodec.h
1 /*****************************************************************************
2  * mediacodec.h: Video decoder module using the Android MediaCodec API
3  *****************************************************************************
4  * Copyright © 2015 VLC authors and VideoLAN, VideoLabs
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19  *****************************************************************************/
20
21 #ifndef VLC_MEDIACODEC_H
22 #define VLC_MEDIACODEC_H
23
24 #include <vlc_common.h>
25 #include "../../video_output/android/utils.h"
26
27 typedef struct mc_api mc_api;
28 typedef struct mc_api_sys mc_api_sys;
29 typedef struct mc_api_out mc_api_out;
30
31 typedef int (*pf_MediaCodecApi_init)(mc_api*);
32
33 int MediaCodecJni_Init(mc_api*);
34 int MediaCodecNdk_Init(mc_api*);
35
36 #define MC_API_ERROR (-1)
37 #define MC_API_INFO_TRYAGAIN (-11)
38 #define MC_API_INFO_OUTPUT_FORMAT_CHANGED (-12)
39 #define MC_API_INFO_OUTPUT_BUFFERS_CHANGED (-13)
40
41 /* in sync with OMXCODEC QUIRKS */
42 #define MC_API_NO_QUIRKS 0
43 #define MC_API_QUIRKS_NEED_CSD 0x1
44 #define MC_API_VIDEO_QUIRKS_IGNORE_PADDING 0x2
45 #define MC_API_AUDIO_QUIRKS_NEED_CHANNELS 0x4
46
47 struct mc_api_out
48 {
49     enum {
50         MC_OUT_TYPE_BUF,
51         MC_OUT_TYPE_CONF,
52     } type;
53     bool b_eos;
54     union
55     {
56         struct
57         {
58             int i_index;
59             mtime_t i_ts;
60             const uint8_t *p_ptr;
61             size_t i_size;
62         } buf;
63         union
64         {
65             struct
66             {
67                 unsigned int width, height;
68                 unsigned int stride;
69                 unsigned int slice_height;
70                 int pixel_format;
71                 int crop_left;
72                 int crop_top;
73                 int crop_right;
74                 int crop_bottom;
75             } video;
76             struct
77             {
78                 int channel_count;
79                 int channel_mask;
80                 int sample_rate;
81             } audio;
82         } conf;
83     } u;
84 };
85
86 union mc_api_args
87 {
88     struct
89     {
90         AWindowHandler *p_awh;
91         int i_width;
92         int i_height;
93         int i_angle;
94         bool b_tunneled_playback;
95     } video;
96     struct
97     {
98         int i_sample_rate;
99         int i_channel_count;
100     } audio;
101 };
102
103 struct mc_api
104 {
105     mc_api_sys *p_sys;
106
107     /* Set before init */
108     vlc_object_t *  p_obj;
109     const char *    psz_mime;
110     int             i_cat;
111     vlc_fourcc_t    i_codec;
112
113     /* Set after configure */
114     int  i_quirks;
115     char *psz_name;
116     bool b_support_interlaced;
117
118     bool b_started;
119     bool b_direct_rendering;
120
121     void (*clean)(mc_api *);
122     int (*configure)(mc_api *, size_t i_h264_profile);
123     int (*start)(mc_api *, union mc_api_args *p_args);
124     int (*stop)(mc_api *);
125     int (*flush)(mc_api *);
126
127     /* The Dequeue functions return:
128      * - The index of the input or output buffer if >= 0,
129      * - MC_API_INFO_TRYAGAIN if no buffers where dequeued during i_timeout,
130      * - MC_API_INFO_OUTPUT_FORMAT_CHANGED if output format changed
131      * - MC_API_INFO_OUTPUT_BUFFERS_CHANGED if buffers changed
132      * - MC_API_ERROR in case of error. */
133     int (*dequeue_in)(mc_api *, mtime_t i_timeout);
134     int (*dequeue_out)(mc_api *, mtime_t i_timeout);
135
136     /* i_index is the index returned by dequeue_in and should be >= 0
137      * Returns 0 if buffer is successfully queued, or MC_API_ERROR */
138     int (*queue_in)(mc_api *, int i_index, const void *p_buf, size_t i_size,
139                     mtime_t i_ts, bool b_config);
140
141     /* i_index is the index returned by dequeue_out and should be >= 0,
142      * MC_API_INFO_OUTPUT_FORMAT_CHANGED, or MC_API_INFO_OUTPUT_BUFFERS_CHANGED.
143      * Returns 1 if p_out if valid, 0 if p_out is unchanged or MC_API_ERROR */
144     int (*get_out)(mc_api *, int i_index, mc_api_out *p_out);
145
146     /* i_index is the index returned by dequeue_out and should be >= 0 */
147     int (*release_out)(mc_api *, int i_index, bool b_render);
148 };
149
150 #endif