annotate vaapi.c @ 9225:85c7a028316d libavcodec

Add common VA API data structures and helpers.
author gb
date Sun, 22 Mar 2009 01:32:27 +0000
parents
children f0732d44f655
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9225
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
1 /*
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
2 * Video Acceleration API (video decoding)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
3 * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
4 *
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
5 * Copyright (C) 2008-2009 Splitted-Desktop Systems
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
6 *
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
7 * This file is part of FFmpeg.
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
8 *
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
9 * FFmpeg is free software; you can redistribute it and/or
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
10 * modify it under the terms of the GNU Lesser General Public
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
11 * License as published by the Free Software Foundation; either
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
12 * version 2.1 of the License, or (at your option) any later version.
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
13 *
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
14 * FFmpeg is distributed in the hope that it will be useful,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
17 * Lesser General Public License for more details.
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
18 *
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
19 * You should have received a copy of the GNU Lesser General Public
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
20 * License along with FFmpeg; if not, write to the Free Software
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
22 */
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
23
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
24 #include "vaapi_internal.h"
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
25
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
26 /**
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
27 * \addtogroup VAAPI_Decoding
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
28 *
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
29 * @{
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
30 */
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
31
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
32 static void destroy_buffers(VADisplay display, VABufferID *buffers, unsigned int n_buffers)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
33 {
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
34 unsigned int i;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
35 for (i = 0; i < n_buffers; i++) {
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
36 if (buffers[i]) {
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
37 vaDestroyBuffer(display, buffers[i]);
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
38 buffers[i] = 0;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
39 }
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
40 }
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
41 }
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
42
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
43 static int render_picture(struct vaapi_context *vactx, VASurfaceID surface)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
44 {
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
45 VABufferID va_buffers[3];
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
46 unsigned int n_va_buffers = 0;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
47
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
48 if (vaCreateBuffer(vactx->display, vactx->context_id,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
49 VAPictureParameterBufferType,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
50 vactx->pic_param_size,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
51 1, &vactx->pic_param,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
52 &vactx->pic_param_buf_id) != VA_STATUS_SUCCESS)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
53 return -1;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
54 va_buffers[n_va_buffers++] = vactx->pic_param_buf_id;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
55
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
56 if (vactx->iq_matrix_present) {
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
57 if (vaCreateBuffer(vactx->display, vactx->context_id,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
58 VAIQMatrixBufferType,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
59 vactx->iq_matrix_size,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
60 1, &vactx->iq_matrix,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
61 &vactx->iq_matrix_buf_id) != VA_STATUS_SUCCESS)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
62 return -1;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
63 va_buffers[n_va_buffers++] = vactx->iq_matrix_buf_id;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
64 }
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
65
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
66 if (vactx->bitplane_buffer) {
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
67 if (vaCreateBuffer(vactx->display, vactx->context_id,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
68 VABitPlaneBufferType,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
69 vactx->bitplane_buffer_size,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
70 1, vactx->bitplane_buffer,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
71 &vactx->bitplane_buf_id) != VA_STATUS_SUCCESS)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
72 return -1;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
73 va_buffers[n_va_buffers++] = vactx->bitplane_buf_id;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
74 }
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
75
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
76 if (vaBeginPicture(vactx->display, vactx->context_id,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
77 surface) != VA_STATUS_SUCCESS)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
78 return -1;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
79
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
80 if (vaRenderPicture(vactx->display, vactx->context_id,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
81 va_buffers, n_va_buffers) != VA_STATUS_SUCCESS)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
82 return -1;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
83
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
84 if (vaRenderPicture(vactx->display, vactx->context_id,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
85 vactx->slice_buf_ids,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
86 vactx->n_slice_buf_ids) != VA_STATUS_SUCCESS)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
87 return -1;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
88
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
89 if (vaEndPicture(vactx->display, vactx->context_id) != VA_STATUS_SUCCESS)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
90 return -1;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
91
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
92 return 0;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
93 }
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
94
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
95 static int commit_slices(struct vaapi_context *vactx)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
96 {
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
97 VABufferID *slice_buf_ids;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
98 VABufferID slice_param_buf_id, slice_data_buf_id;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
99
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
100 if (vactx->slice_count == 0)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
101 return 0;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
102
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
103 slice_buf_ids =
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
104 av_fast_realloc(vactx->slice_buf_ids,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
105 &vactx->slice_buf_ids_alloc,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
106 (vactx->n_slice_buf_ids + 2) * sizeof(slice_buf_ids[0]));
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
107 if (!slice_buf_ids)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
108 return -1;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
109 vactx->slice_buf_ids = slice_buf_ids;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
110
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
111 slice_param_buf_id = 0;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
112 if (vaCreateBuffer(vactx->display, vactx->context_id,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
113 VASliceParameterBufferType,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
114 vactx->slice_param_size,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
115 vactx->slice_count, vactx->slice_params,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
116 &slice_param_buf_id) != VA_STATUS_SUCCESS)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
117 return -1;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
118 vactx->slice_count = 0;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
119
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
120 slice_data_buf_id = 0;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
121 if (vaCreateBuffer(vactx->display, vactx->context_id,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
122 VASliceDataBufferType,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
123 vactx->slice_data_size,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
124 1, (void *)vactx->slice_data,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
125 &slice_data_buf_id) != VA_STATUS_SUCCESS)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
126 return -1;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
127 vactx->slice_data = NULL;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
128 vactx->slice_data_size = 0;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
129
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
130 slice_buf_ids[vactx->n_slice_buf_ids++] = slice_param_buf_id;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
131 slice_buf_ids[vactx->n_slice_buf_ids++] = slice_data_buf_id;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
132 return 0;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
133 }
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
134
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
135 VASliceParameterBufferBase *ff_vaapi_alloc_slice(struct vaapi_context *vactx, const uint8_t *buffer, uint32_t size)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
136 {
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
137 uint8_t *slice_params;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
138 VASliceParameterBufferBase *slice_param;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
139
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
140 if (!vactx->slice_data)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
141 vactx->slice_data = buffer;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
142 if (vactx->slice_data + vactx->slice_data_size != buffer) {
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
143 if (commit_slices(vactx) < 0)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
144 return NULL;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
145 vactx->slice_data = buffer;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
146 }
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
147
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
148 slice_params =
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
149 av_fast_realloc(vactx->slice_params,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
150 &vactx->slice_params_alloc,
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
151 (vactx->slice_count + 1) * vactx->slice_param_size);
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
152 if (!slice_params)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
153 return NULL;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
154 vactx->slice_params = slice_params;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
155
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
156 slice_param = (VASliceParameterBufferBase *)(slice_params + vactx->slice_count * vactx->slice_param_size);
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
157 slice_param->slice_data_size = size;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
158 slice_param->slice_data_offset = vactx->slice_data_size;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
159 slice_param->slice_data_flag = VA_SLICE_DATA_FLAG_ALL;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
160
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
161 vactx->slice_count++;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
162 vactx->slice_data_size += size;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
163 return slice_param;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
164 }
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
165
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
166 int ff_vaapi_common_end_frame(MpegEncContext *s)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
167 {
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
168 struct vaapi_context * const vactx = s->avctx->hwaccel_context;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
169 int ret = -1;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
170
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
171 dprintf(s->avctx, "ff_vaapi_common_end_frame()\n");
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
172
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
173 if (commit_slices(vactx) < 0)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
174 goto done;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
175 if (vactx->n_slice_buf_ids > 0) {
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
176 if (render_picture(vactx, ff_vaapi_get_surface(s->current_picture_ptr)) < 0)
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
177 goto done;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
178 ff_draw_horiz_band(s, 0, s->avctx->height);
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
179 }
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
180 ret = 0;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
181
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
182 done:
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
183 destroy_buffers(vactx->display, &vactx->pic_param_buf_id, 1);
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
184 destroy_buffers(vactx->display, &vactx->iq_matrix_buf_id, 1);
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
185 destroy_buffers(vactx->display, &vactx->bitplane_buf_id, 1);
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
186 destroy_buffers(vactx->display, vactx->slice_buf_ids, vactx->n_slice_buf_ids);
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
187 av_freep(&vactx->bitplane_buffer);
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
188 av_freep(&vactx->slice_buf_ids);
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
189 av_freep(&vactx->slice_params);
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
190 vactx->n_slice_buf_ids = 0;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
191 vactx->slice_buf_ids_alloc = 0;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
192 vactx->slice_count = 0;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
193 vactx->slice_params_alloc = 0;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
194 return ret;
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
195 }
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
196
85c7a028316d Add common VA API data structures and helpers.
gb
parents:
diff changeset
197 /* @} */