7d043c7e30153b38c597ed09459fe66489ae0085
[ffmpeg.git] / libavcodec / vda.h
1 /*
2  * VDA HW acceleration
3  *
4  * copyright (c) 2011 Sebastien Zwickert
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg 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  * FFmpeg 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 FFmpeg; 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 #include <pthread.h>
27 #include <stdint.h>
28
29 // emmintrin.h is unable to compile with -std=c99 -Werror=missing-prototypes
30 // http://openradar.appspot.com/8026390
31 #undef __GNUC_STDC_INLINE__
32
33 #define Picture QuickdrawPicture
34 #include <VideoDecodeAcceleration/VDADecoder.h>
35 #undef Picture
36
37 /**
38  *  This structure is used to store a decoded frame information and data.
39  */
40 typedef struct {
41     /**
42     * The PTS of the frame.
43     *
44     * - encoding: unused
45     * - decoding: Set/Unset by libavcodec.
46     */
47     int64_t             pts;
48
49     /**
50     * The CoreVideo buffer that contains the decoded data.
51     *
52     * - encoding: unused
53     * - decoding: Set/Unset by libavcodec.
54     */
55     CVPixelBufferRef    cv_buffer;
56
57     /**
58     * A pointer to the next frame.
59     *
60     * - encoding: unused
61     * - decoding: Set/Unset by libavcodec.
62     */
63     struct vda_frame    *next_frame;
64
65 } vda_frame;
66
67 /**
68  * This structure is used to provide the necessary configurations and data
69  * to the VDA FFmpeg HWAccel implementation.
70  *
71  * The application must make it available as AVCodecContext.hwaccel_context.
72  */
73 struct vda_context {
74     /**
75     * VDA decoder object.
76     *
77     * - encoding: unused
78     * - decoding: Set/Unset by libavcodec.
79     */
80     VDADecoder          decoder;
81
82     /**
83     * VDA frames queue ordered by presentation timestamp.
84     *
85     * - encoding: unused
86     * - decoding: Set/Unset by libavcodec.
87     */
88     vda_frame           *queue;
89
90     /**
91     * Mutex for locking queue operations.
92     *
93     * - encoding: unused
94     * - decoding: Set/Unset by libavcodec.
95     */
96     pthread_mutex_t     queue_mutex;
97
98     /**
99     * The frame width.
100     *
101     * - encoding: unused
102     * - decoding: Set/Unset by user.
103     */
104     int                 width;
105
106     /**
107     * The frame height.
108     *
109     * - encoding: unused
110     * - decoding: Set/Unset by user.
111     */
112     int                 height;
113
114     /**
115     * The frame format.
116     *
117     * - encoding: unused
118     * - decoding: Set/Unset by user.
119     */
120     int                 format;
121
122     /**
123     * The pixel format for output image buffers.
124     *
125     * - encoding: unused
126     * - decoding: Set/Unset by user.
127     */
128     OSType              cv_pix_fmt_type;
129
130     /**
131     * The current bitstream buffer.
132     *
133     * - encoding: unused
134     * - decoding: Set/Unset by libavcodec.
135     */
136     uint8_t             *bitstream;
137
138     /**
139     * The current size of the bitstream.
140     *
141     * - encoding: unused
142     * - decoding: Set/Unset by libavcodec.
143     */
144     int                 bitstream_size;
145
146     /**
147     * The reference size used for fast reallocation.
148     *
149     * - encoding: unused
150     * - decoding: Set/Unset by libavcodec.
151     */
152     int                 ref_size;
153 };
154
155 /** Creates the video decoder. */
156 int ff_vda_create_decoder(struct vda_context *vda_ctx,
157                           uint8_t *extradata,
158                           int extradata_size);
159
160 /** Destroys the video decoder. */
161 int ff_vda_destroy_decoder(struct vda_context *vda_ctx);
162
163 /** Returns the top frame of the queue. */
164 vda_frame *ff_vda_queue_pop(struct vda_context *vda_ctx);
165
166 /** Releases the given frame. */
167 void ff_vda_release_vda_frame(vda_frame *frame);
168
169 #endif /* AVCODEC_VDA_H */