1/*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19#ifndef AVCODEC_VAAPI_DECODE_H
20#define AVCODEC_VAAPI_DECODE_H
21
22#include <va/va.h>
23
24#include "libavutil/frame.h"
25#include "libavutil/hwcontext.h"
26#include "libavutil/hwcontext_vaapi.h"
27
28#include "avcodec.h"
29
30static inline VASurfaceID ff_vaapi_get_surface_id(AVFrame *pic)
31{
32    return (uintptr_t)pic->data[3];
33}
34
35enum {
36    MAX_PARAM_BUFFERS = 16,
37};
38
39typedef struct VAAPIDecodePicture {
40    VASurfaceID           output_surface;
41
42    int                nb_param_buffers;
43    VABufferID            param_buffers[MAX_PARAM_BUFFERS];
44
45    int                nb_slices;
46    VABufferID           *slice_buffers;
47    int                   slices_allocated;
48} VAAPIDecodePicture;
49
50typedef struct VAAPIDecodeContext {
51    VAConfigID            va_config;
52    VAContextID           va_context;
53
54    AVHWDeviceContext    *device;
55    AVVAAPIDeviceContext *hwctx;
56
57    AVHWFramesContext    *frames;
58    AVVAAPIFramesContext *hwfc;
59
60    enum AVPixelFormat    surface_format;
61    int                   surface_count;
62
63    VASurfaceAttrib       pixel_format_attribute;
64} VAAPIDecodeContext;
65
66
67int ff_vaapi_decode_make_param_buffer(AVCodecContext *avctx,
68                                      VAAPIDecodePicture *pic,
69                                      int type,
70                                      const void *data,
71                                      size_t size);
72
73int ff_vaapi_decode_make_slice_buffer(AVCodecContext *avctx,
74                                      VAAPIDecodePicture *pic,
75                                      const void *params_data,
76                                      size_t params_size,
77                                      const void *slice_data,
78                                      size_t slice_size);
79
80int ff_vaapi_decode_issue(AVCodecContext *avctx,
81                          VAAPIDecodePicture *pic);
82int ff_vaapi_decode_cancel(AVCodecContext *avctx,
83                           VAAPIDecodePicture *pic);
84
85int ff_vaapi_decode_init(AVCodecContext *avctx);
86int ff_vaapi_decode_uninit(AVCodecContext *avctx);
87
88int ff_vaapi_common_frame_params(AVCodecContext *avctx,
89                                 AVBufferRef *hw_frames_ctx);
90
91#endif /* AVCODEC_VAAPI_DECODE_H */
92