comparison vaapi.c @ 9292:f0732d44f655 libavcodec

Improve VA API buffers allocation logic. This also reduces struct vaapi_context down to ~60 bytes vs. a few KBs before, and gets rid of explicit VA data types.
author gb
date Tue, 31 Mar 2009 08:33:02 +0000
parents 85c7a028316d
children 3f08c340020f
comparison
equal deleted inserted replaced
9291:6220870901f5 9292:f0732d44f655
43 static int render_picture(struct vaapi_context *vactx, VASurfaceID surface) 43 static int render_picture(struct vaapi_context *vactx, VASurfaceID surface)
44 { 44 {
45 VABufferID va_buffers[3]; 45 VABufferID va_buffers[3];
46 unsigned int n_va_buffers = 0; 46 unsigned int n_va_buffers = 0;
47 47
48 if (vaCreateBuffer(vactx->display, vactx->context_id, 48 vaUnmapBuffer(vactx->display, vactx->pic_param_buf_id);
49 VAPictureParameterBufferType,
50 vactx->pic_param_size,
51 1, &vactx->pic_param,
52 &vactx->pic_param_buf_id) != VA_STATUS_SUCCESS)
53 return -1;
54 va_buffers[n_va_buffers++] = vactx->pic_param_buf_id; 49 va_buffers[n_va_buffers++] = vactx->pic_param_buf_id;
55 50
56 if (vactx->iq_matrix_present) { 51 if (vactx->iq_matrix_buf_id) {
57 if (vaCreateBuffer(vactx->display, vactx->context_id, 52 vaUnmapBuffer(vactx->display, vactx->iq_matrix_buf_id);
58 VAIQMatrixBufferType,
59 vactx->iq_matrix_size,
60 1, &vactx->iq_matrix,
61 &vactx->iq_matrix_buf_id) != VA_STATUS_SUCCESS)
62 return -1;
63 va_buffers[n_va_buffers++] = vactx->iq_matrix_buf_id; 53 va_buffers[n_va_buffers++] = vactx->iq_matrix_buf_id;
64 } 54 }
65 55
66 if (vactx->bitplane_buffer) { 56 if (vactx->bitplane_buf_id) {
67 if (vaCreateBuffer(vactx->display, vactx->context_id, 57 vaUnmapBuffer(vactx->display, vactx->bitplane_buf_id);
68 VABitPlaneBufferType,
69 vactx->bitplane_buffer_size,
70 1, vactx->bitplane_buffer,
71 &vactx->bitplane_buf_id) != VA_STATUS_SUCCESS)
72 return -1;
73 va_buffers[n_va_buffers++] = vactx->bitplane_buf_id; 58 va_buffers[n_va_buffers++] = vactx->bitplane_buf_id;
74 } 59 }
75 60
76 if (vaBeginPicture(vactx->display, vactx->context_id, 61 if (vaBeginPicture(vactx->display, vactx->context_id,
77 surface) != VA_STATUS_SUCCESS) 62 surface) != VA_STATUS_SUCCESS)
128 vactx->slice_data_size = 0; 113 vactx->slice_data_size = 0;
129 114
130 slice_buf_ids[vactx->n_slice_buf_ids++] = slice_param_buf_id; 115 slice_buf_ids[vactx->n_slice_buf_ids++] = slice_param_buf_id;
131 slice_buf_ids[vactx->n_slice_buf_ids++] = slice_data_buf_id; 116 slice_buf_ids[vactx->n_slice_buf_ids++] = slice_data_buf_id;
132 return 0; 117 return 0;
118 }
119
120 static void *alloc_buffer(struct vaapi_context *vactx, int type, unsigned int size, uint32_t *buf_id)
121 {
122 void *data = NULL;
123
124 *buf_id = 0;
125 if (vaCreateBuffer(vactx->display, vactx->context_id,
126 type, size, 1, NULL, buf_id) == VA_STATUS_SUCCESS)
127 vaMapBuffer(vactx->display, *buf_id, &data);
128
129 return data;
130 }
131
132 void *ff_vaapi_alloc_picture(struct vaapi_context *vactx, unsigned int size)
133 {
134 return alloc_buffer(vactx, VAPictureParameterBufferType, size, &vactx->pic_param_buf_id);
135 }
136
137 void *ff_vaapi_alloc_iq_matrix(struct vaapi_context *vactx, unsigned int size)
138 {
139 return alloc_buffer(vactx, VAIQMatrixBufferType, size, &vactx->iq_matrix_buf_id);
140 }
141
142 uint8_t *ff_vaapi_alloc_bitplane(struct vaapi_context *vactx, uint32_t size)
143 {
144 return alloc_buffer(vactx, VABitPlaneBufferType, size, &vactx->bitplane_buf_id);
133 } 145 }
134 146
135 VASliceParameterBufferBase *ff_vaapi_alloc_slice(struct vaapi_context *vactx, const uint8_t *buffer, uint32_t size) 147 VASliceParameterBufferBase *ff_vaapi_alloc_slice(struct vaapi_context *vactx, const uint8_t *buffer, uint32_t size)
136 { 148 {
137 uint8_t *slice_params; 149 uint8_t *slice_params;
182 done: 194 done:
183 destroy_buffers(vactx->display, &vactx->pic_param_buf_id, 1); 195 destroy_buffers(vactx->display, &vactx->pic_param_buf_id, 1);
184 destroy_buffers(vactx->display, &vactx->iq_matrix_buf_id, 1); 196 destroy_buffers(vactx->display, &vactx->iq_matrix_buf_id, 1);
185 destroy_buffers(vactx->display, &vactx->bitplane_buf_id, 1); 197 destroy_buffers(vactx->display, &vactx->bitplane_buf_id, 1);
186 destroy_buffers(vactx->display, vactx->slice_buf_ids, vactx->n_slice_buf_ids); 198 destroy_buffers(vactx->display, vactx->slice_buf_ids, vactx->n_slice_buf_ids);
187 av_freep(&vactx->bitplane_buffer);
188 av_freep(&vactx->slice_buf_ids); 199 av_freep(&vactx->slice_buf_ids);
189 av_freep(&vactx->slice_params); 200 av_freep(&vactx->slice_params);
190 vactx->n_slice_buf_ids = 0; 201 vactx->n_slice_buf_ids = 0;
191 vactx->slice_buf_ids_alloc = 0; 202 vactx->slice_buf_ids_alloc = 0;
192 vactx->slice_count = 0; 203 vactx->slice_count = 0;