1 /*
2 * MPEG-2 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 f_code */
28 {
31 }
32
33 /** Determine frame start: first field for field picture or frame picture */
35 {
37 }
38
40 {
43 VAPictureParameterBufferMPEG2 *pic_param;
44 VAIQMatrixBufferMPEG2 *iq_matrix;
45 int i;
46
47 av_dlog(avctx,
"vaapi_mpeg2_start_frame()\n");
48
50
51 /* Fill in VAPictureParameterBufferMPEG2 */
53 if (!pic_param)
54 return -1;
55 pic_param->horizontal_size = s->
width;
56 pic_param->vertical_size = s->
height;
57 pic_param->forward_reference_picture = VA_INVALID_ID;
58 pic_param->backward_reference_picture = VA_INVALID_ID;
59 pic_param->picture_coding_type = s->
pict_type;
61 pic_param->picture_coding_extension.value = 0; /* reset all bits */
63 pic_param->picture_coding_extension.bits.picture_structure = s->
picture_structure;
64 pic_param->picture_coding_extension.bits.top_field_first = s->
top_field_first;
67 pic_param->picture_coding_extension.bits.q_scale_type = s->
q_scale_type;
68 pic_param->picture_coding_extension.bits.intra_vlc_format = s->
intra_vlc_format;
69 pic_param->picture_coding_extension.bits.alternate_scan = s->
alternate_scan;
71 pic_param->picture_coding_extension.bits.progressive_frame = s->
progressive_frame;
73
77 // fall-through
80 break;
81 }
82
83 /* Fill in VAIQMatrixBufferMPEG2 */
85 if (!iq_matrix)
86 return -1;
87 iq_matrix->load_intra_quantiser_matrix = 1;
88 iq_matrix->load_non_intra_quantiser_matrix = 1;
89 iq_matrix->load_chroma_intra_quantiser_matrix = 1;
90 iq_matrix->load_chroma_non_intra_quantiser_matrix = 1;
91
92 for (i = 0; i < 64; i++) {
95 iq_matrix->non_intra_quantiser_matrix[i] = s->
inter_matrix[
n];
98 }
99 return 0;
100 }
101
103 {
105 VASliceParameterBufferMPEG2 *slice_param;
107 uint32_t quantiser_scale_code, intra_slice_flag, macroblock_offset;
108
109 av_dlog(avctx,
"vaapi_mpeg2_decode_slice(): buffer %p, size %d\n", buffer, size);
110
111 /* Determine macroblock_offset */
115 quantiser_scale_code =
get_bits(&gb, 5);
117 if (intra_slice_flag) {
121 }
123
124 /* Fill in VASliceParameterBufferMPEG2 */
126 if (!slice_param)
127 return -1;
128 slice_param->macroblock_offset = macroblock_offset;
129 slice_param->slice_horizontal_position = s->
mb_x;
131 slice_param->quantiser_scale_code = quantiser_scale_code;
132 slice_param->intra_slice_flag = intra_slice_flag;
133 return 0;
134 }
135
137 .
name =
"mpeg2_vaapi",
144 };