Mercurial > libavcodec.hg
comparison vdpauvideo.c @ 8601:8b80f8285b1b libavcodec
Add VDPAU hardware accelerated decoding for MPEG1 and MPEG2 which can
be used by video players.
Original patch by NVIDIA corporation.
author | cehoyos |
---|---|
date | Fri, 16 Jan 2009 02:14:07 +0000 |
parents | 6687083ec76a |
children | 04423b2f6e0b |
comparison
equal
deleted
inserted
replaced
8600:5b5ac656cb50 | 8601:8b80f8285b1b |
---|---|
175 | 175 |
176 ff_draw_horiz_band(s, 0, s->avctx->height); | 176 ff_draw_horiz_band(s, 0, s->avctx->height); |
177 render->bitstream_buffers_used = 0; | 177 render->bitstream_buffers_used = 0; |
178 } | 178 } |
179 | 179 |
180 void ff_vdpau_mpeg_picture_complete(MpegEncContext *s, const uint8_t *buf, | |
181 int buf_size, int slice_count) | |
182 { | |
183 struct vdpau_render_state * render, * last, * next; | |
184 int i; | |
185 | |
186 render = (struct vdpau_render_state*)s->current_picture_ptr->data[0]; | |
187 assert(render); | |
188 | |
189 /* fill VdpPictureInfoMPEG1Or2 struct */ | |
190 render->info.mpeg.picture_structure = s->picture_structure; | |
191 render->info.mpeg.picture_coding_type = s->pict_type; | |
192 render->info.mpeg.intra_dc_precision = s->intra_dc_precision; | |
193 render->info.mpeg.frame_pred_frame_dct = s->frame_pred_frame_dct; | |
194 render->info.mpeg.concealment_motion_vectors = s->concealment_motion_vectors; | |
195 render->info.mpeg.intra_vlc_format = s->intra_vlc_format; | |
196 render->info.mpeg.alternate_scan = s->alternate_scan; | |
197 render->info.mpeg.q_scale_type = s->q_scale_type; | |
198 render->info.mpeg.top_field_first = s->top_field_first; | |
199 render->info.mpeg.full_pel_forward_vector = s->full_pel[0]; // MPEG-1 only. Set 0 for MPEG-2 | |
200 render->info.mpeg.full_pel_backward_vector = s->full_pel[1]; // MPEG-1 only. Set 0 for MPEG-2 | |
201 render->info.mpeg.f_code[0][0] = s->mpeg_f_code[0][0]; // For MPEG-1 fill both horiz. & vert. | |
202 render->info.mpeg.f_code[0][1] = s->mpeg_f_code[0][1]; | |
203 render->info.mpeg.f_code[1][0] = s->mpeg_f_code[1][0]; | |
204 render->info.mpeg.f_code[1][1] = s->mpeg_f_code[1][1]; | |
205 for (i = 0; i < 64; ++i) { | |
206 render->info.mpeg.intra_quantizer_matrix[i] = s->intra_matrix[i]; | |
207 render->info.mpeg.non_intra_quantizer_matrix[i] = s->inter_matrix[i]; | |
208 } | |
209 | |
210 render->info.mpeg.forward_reference = VDP_INVALID_HANDLE; | |
211 render->info.mpeg.backward_reference = VDP_INVALID_HANDLE; | |
212 | |
213 switch(s->pict_type){ | |
214 case FF_B_TYPE: | |
215 next = (struct vdpau_render_state*)s->next_picture.data[0]; | |
216 assert(next); | |
217 render->info.mpeg.backward_reference = next->surface; | |
218 // no return here, going to set forward prediction | |
219 case FF_P_TYPE: | |
220 last = (struct vdpau_render_state*)s->last_picture.data[0]; | |
221 if (!last) // FIXME: Does this test make sense? | |
222 last = render; // predict second field from the first | |
223 render->info.mpeg.forward_reference = last->surface; | |
224 } | |
225 | |
226 ff_vdpau_add_data_chunk(s, buf, buf_size); | |
227 | |
228 render->info.mpeg.slice_count = slice_count; | |
229 | |
230 if (slice_count) | |
231 ff_draw_horiz_band(s, 0, s->avctx->height); | |
232 render->bitstream_buffers_used = 0; | |
233 } | |
234 | |
180 /* @}*/ | 235 /* @}*/ |