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 /* @}*/