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#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 */
40typedef struct vda_frame {
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} vda_frame;
65
66/**
67 * This structure is used to provide the necessary configurations and data
68 * to the VDA Libav HWAccel implementation.
69 *
70 * The application must make it available as AVCodecContext.hwaccel_context.
71 */
72struct vda_context {
73    /**
74    * VDA decoder object.
75    *
76    * - encoding: unused
77    * - decoding: Set/Unset by libavcodec.
78    */
79    VDADecoder          decoder;
80
81    /**
82    * VDA frames queue ordered by presentation timestamp.
83    *
84    * - encoding: unused
85    * - decoding: Set/Unset by libavcodec.
86    */
87    vda_frame           *queue;
88
89    /**
90    * Mutex for locking queue operations.
91    *
92    * - encoding: unused
93    * - decoding: Set/Unset by libavcodec.
94    */
95    pthread_mutex_t     queue_mutex;
96
97    /**
98    * The frame width.
99    *
100    * - encoding: unused
101    * - decoding: Set/Unset by user.
102    */
103    int                 width;
104
105    /**
106    * The frame height.
107    *
108    * - encoding: unused
109    * - decoding: Set/Unset by user.
110    */
111    int                 height;
112
113    /**
114    * The frame format.
115    *
116    * - encoding: unused
117    * - decoding: Set/Unset by user.
118    */
119    int                 format;
120
121    /**
122    * The pixel format for output image buffers.
123    *
124    * - encoding: unused
125    * - decoding: Set/Unset by user.
126    */
127    OSType              cv_pix_fmt_type;
128};
129
130/** Create the video decoder. */
131int ff_vda_create_decoder(struct vda_context *vda_ctx,
132                          uint8_t *extradata,
133                          int extradata_size);
134
135/** Destroy the video decoder. */
136int ff_vda_destroy_decoder(struct vda_context *vda_ctx);
137
138/** Return the top frame of the queue. */
139vda_frame *ff_vda_queue_pop(struct vda_context *vda_ctx);
140
141/** Release the given frame. */
142void ff_vda_release_vda_frame(vda_frame *frame);
143
144#endif /* AVCODEC_VDA_H */
145