|
1 /* |
|
2 * VDA HW acceleration |
|
3 * |
|
4 * copyright (c) 2011 Sebastien Zwickert |
|
5 * |
|
6 * This file is part of Libav. |
|
7 * |
|
8 * Libav is free software; you can redistribute it and/or |
|
9 * modify it under the terms of the GNU Lesser General Public |
|
10 * License as published by the Free Software Foundation; either |
|
11 * version 2.1 of the License, or (at your option) any later version. |
|
12 * |
|
13 * Libav is distributed in the hope that it will be useful, |
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
16 * Lesser General Public License for more details. |
|
17 * |
|
18 * You should have received a copy of the GNU Lesser General Public |
|
19 * License along with Libav; if not, write to the Free Software |
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
21 */ |
|
22 |
|
23 #ifndef AVCODEC_VDA_H |
|
24 #define AVCODEC_VDA_H |
|
25 |
|
26 /** |
|
27 * @file |
|
28 * @ingroup lavc_codec_hwaccel_vda |
|
29 * Public libavcodec VDA header. |
|
30 */ |
|
31 |
|
32 #include "libavcodec/version.h" |
|
33 |
|
34 #if FF_API_VDA_ASYNC |
|
35 #include <pthread.h> |
|
36 #endif |
|
37 |
|
38 #include <stdint.h> |
|
39 |
|
40 // emmintrin.h is unable to compile with -std=c99 -Werror=missing-prototypes |
|
41 // http://openradar.appspot.com/8026390 |
|
42 #undef __GNUC_STDC_INLINE__ |
|
43 |
|
44 #define Picture QuickdrawPicture |
|
45 #include <VideoDecodeAcceleration/VDADecoder.h> |
|
46 #undef Picture |
|
47 |
|
48 /** |
|
49 * @defgroup lavc_codec_hwaccel_vda VDA |
|
50 * @ingroup lavc_codec_hwaccel |
|
51 * |
|
52 * @{ |
|
53 */ |
|
54 |
|
55 #if FF_API_VDA_ASYNC |
|
56 /** |
|
57 * This structure is used to store decoded frame information and data. |
|
58 * |
|
59 * @deprecated Use synchronous decoding mode. |
|
60 */ |
|
61 typedef struct vda_frame { |
|
62 /** |
|
63 * The PTS of the frame. |
|
64 * |
|
65 * - encoding: unused |
|
66 * - decoding: Set/Unset by libavcodec. |
|
67 */ |
|
68 int64_t pts; |
|
69 |
|
70 /** |
|
71 * The CoreVideo buffer that contains the decoded data. |
|
72 * |
|
73 * - encoding: unused |
|
74 * - decoding: Set/Unset by libavcodec. |
|
75 */ |
|
76 CVPixelBufferRef cv_buffer; |
|
77 |
|
78 /** |
|
79 * A pointer to the next frame. |
|
80 * |
|
81 * - encoding: unused |
|
82 * - decoding: Set/Unset by libavcodec. |
|
83 */ |
|
84 struct vda_frame *next_frame; |
|
85 } vda_frame; |
|
86 #endif |
|
87 |
|
88 /** |
|
89 * This structure is used to provide the necessary configurations and data |
|
90 * to the VDA Libav HWAccel implementation. |
|
91 * |
|
92 * The application must make it available as AVCodecContext.hwaccel_context. |
|
93 */ |
|
94 struct vda_context { |
|
95 /** |
|
96 * VDA decoder object. |
|
97 * |
|
98 * - encoding: unused |
|
99 * - decoding: Set/Unset by libavcodec. |
|
100 */ |
|
101 VDADecoder decoder; |
|
102 |
|
103 /** |
|
104 * The Core Video pixel buffer that contains the current image data. |
|
105 * |
|
106 * encoding: unused |
|
107 * decoding: Set by libavcodec. Unset by user. |
|
108 */ |
|
109 CVPixelBufferRef cv_buffer; |
|
110 |
|
111 /** |
|
112 * Use the hardware decoder in synchronous mode. |
|
113 * |
|
114 * encoding: unused |
|
115 * decoding: Set by user. |
|
116 */ |
|
117 int use_sync_decoding; |
|
118 |
|
119 #if FF_API_VDA_ASYNC |
|
120 /** |
|
121 * VDA frames queue ordered by presentation timestamp. |
|
122 * |
|
123 * @deprecated Use synchronous decoding mode. |
|
124 * |
|
125 * - encoding: unused |
|
126 * - decoding: Set/Unset by libavcodec. |
|
127 */ |
|
128 vda_frame *queue; |
|
129 |
|
130 /** |
|
131 * Mutex for locking queue operations. |
|
132 * |
|
133 * @deprecated Use synchronous decoding mode. |
|
134 * |
|
135 * - encoding: unused |
|
136 * - decoding: Set/Unset by libavcodec. |
|
137 */ |
|
138 pthread_mutex_t queue_mutex; |
|
139 #endif |
|
140 |
|
141 /** |
|
142 * The frame width. |
|
143 * |
|
144 * - encoding: unused |
|
145 * - decoding: Set/Unset by user. |
|
146 */ |
|
147 int width; |
|
148 |
|
149 /** |
|
150 * The frame height. |
|
151 * |
|
152 * - encoding: unused |
|
153 * - decoding: Set/Unset by user. |
|
154 */ |
|
155 int height; |
|
156 |
|
157 /** |
|
158 * The frame format. |
|
159 * |
|
160 * - encoding: unused |
|
161 * - decoding: Set/Unset by user. |
|
162 */ |
|
163 int format; |
|
164 |
|
165 /** |
|
166 * The pixel format for output image buffers. |
|
167 * |
|
168 * - encoding: unused |
|
169 * - decoding: Set/Unset by user. |
|
170 */ |
|
171 OSType cv_pix_fmt_type; |
|
172 |
|
173 /** |
|
174 * The current bitstream buffer. |
|
175 */ |
|
176 uint8_t *priv_bitstream; |
|
177 |
|
178 /** |
|
179 * The current size of the bitstream. |
|
180 */ |
|
181 int priv_bitstream_size; |
|
182 |
|
183 /** |
|
184 * The reference size used for fast reallocation. |
|
185 */ |
|
186 int priv_allocated_size; |
|
187 }; |
|
188 |
|
189 /** Create the video decoder. */ |
|
190 int ff_vda_create_decoder(struct vda_context *vda_ctx, |
|
191 uint8_t *extradata, |
|
192 int extradata_size); |
|
193 |
|
194 /** Destroy the video decoder. */ |
|
195 int ff_vda_destroy_decoder(struct vda_context *vda_ctx); |
|
196 |
|
197 #if FF_API_VDA_ASYNC |
|
198 /** |
|
199 * Return the top frame of the queue. |
|
200 * |
|
201 * @deprecated Use synchronous decoding mode. |
|
202 */ |
|
203 vda_frame *ff_vda_queue_pop(struct vda_context *vda_ctx); |
|
204 |
|
205 /** |
|
206 * Release the given frame. |
|
207 * |
|
208 * @deprecated Use synchronous decoding mode. |
|
209 */ |
|
210 void ff_vda_release_vda_frame(vda_frame *frame); |
|
211 #endif |
|
212 |
|
213 /** |
|
214 * @} |
|
215 */ |
|
216 |
|
217 #endif /* AVCODEC_VDA_H */ |