1 /*
2 * MPEG-4 / H.263 HW decode acceleration through VA API
3 *
4 * Copyright (C) 2008-2009 Splitted-Desktop Systems
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
25
26 /** Reconstruct bitstream intra_dc_vlc_thr */
28 {
30 case 99: return 0;
31 case 13: return 1;
32 case 15: return 2;
33 case 17: return 3;
34 case 19: return 4;
35 case 21: return 5;
36 case 23: return 6;
37 case 0: return 7;
38 }
39 return 0;
40 }
41
43 {
46 VAPictureParameterBufferMPEG4 *pic_param;
47 VAIQMatrixBufferMPEG4 *iq_matrix;
48 int i;
49
50 av_dlog(avctx,
"vaapi_mpeg4_start_frame()\n");
51
53
54 /* Fill in VAPictureParameterBufferMPEG4 */
56 if (!pic_param)
57 return -1;
58 pic_param->vop_width = s->
width;
59 pic_param->vop_height = s->
height;
60 pic_param->forward_reference_picture = VA_INVALID_ID;
61 pic_param->backward_reference_picture = VA_INVALID_ID;
62 pic_param->vol_fields.value = 0; /* reset all bits */
64 pic_param->vol_fields.bits.chroma_format =
CHROMA_420;
66 pic_param->vol_fields.bits.obmc_disable = 1;
69 pic_param->vol_fields.bits.quant_type = s->
mpeg_quant;
72 pic_param->vol_fields.bits.reversible_vlc = s->
rvlc;
73 pic_param->vol_fields.bits.resync_marker_disable = !s->
resync_marker;
76 pic_param->sprite_trajectory_du[i] = s->
sprite_traj[i][0];
77 pic_param->sprite_trajectory_dv[i] = s->
sprite_traj[i][1];
78 }
80 pic_param->vop_fields.value = 0; /* reset all bits */
83 pic_param->vop_fields.bits.vop_rounding_type = s->
no_rounding;
86 pic_param->vop_fields.bits.alternate_vertical_scan_flag = s->
alternate_scan;
87 pic_param->vop_fcode_forward = s->
f_code;
88 pic_param->vop_fcode_backward = s->
b_code;
89 pic_param->vop_time_increment_resolution = avctx->
time_base.
den;
91 pic_param->num_gobs_in_vop = (s->
mb_width * s->
mb_height) / pic_param->num_macroblocks_in_gob;
94
99
100 /* Fill in VAIQMatrixBufferMPEG4 */
101 /* Only the first inverse quantisation method uses the weighting matrices */
102 if (pic_param->vol_fields.bits.quant_type) {
104 if (!iq_matrix)
105 return -1;
106 iq_matrix->load_intra_quant_mat = 1;
107 iq_matrix->load_non_intra_quant_mat = 1;
108
109 for (i = 0; i < 64; i++) {
113 }
114 }
115 return 0;
116 }
117
119 {
121 VASliceParameterBufferMPEG4 *slice_param;
122
123 av_dlog(avctx,
"vaapi_mpeg4_decode_slice(): buffer %p, size %d\n", buffer, size);
124
125 /* Fill in VASliceParameterBufferMPEG4 */
127 if (!slice_param)
128 return -1;
130 slice_param->macroblock_number = 0;
131 slice_param->quant_scale = s->
qscale;
132
133 return 0;
134 }
135
136 #if CONFIG_MPEG4_VAAPI_HWACCEL
138 .
name =
"mpeg4_vaapi",
145 };
146 #endif
147
148 #if CONFIG_H263_VAAPI_HWACCEL
150 .
name =
"h263_vaapi",
157 };
158 #endif