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