annotate vaapi_h264.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents fdafbcef52f5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10732
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
1 /*
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
2 * H.264 HW decode acceleration through VA API
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
3 *
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
4 * Copyright (C) 2008-2009 Splitted-Desktop Systems
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
5 *
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
6 * This file is part of FFmpeg.
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
7 *
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
12 *
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
16 * Lesser General Public License for more details.
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
17 *
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
21 */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
22
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
23 #include "vaapi_internal.h"
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
24 #include "h264.h"
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
25
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
26 /** @file
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
27 * This file implements the glue code between FFmpeg's and VA API's
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
28 * structures for H.264 decoding.
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
29 */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
30
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
31 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11624
diff changeset
32 * Initialize an empty VA API picture.
10732
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
33 *
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
34 * VA API requires a fixed-size reference picture array.
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
35 */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
36 static void init_vaapi_pic(VAPictureH264 *va_pic)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
37 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
38 va_pic->picture_id = VA_INVALID_ID;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
39 va_pic->flags = VA_PICTURE_H264_INVALID;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
40 va_pic->TopFieldOrderCnt = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
41 va_pic->BottomFieldOrderCnt = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
42 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
43
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
44 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11624
diff changeset
45 * Translate an FFmpeg Picture into its VA API form.
10732
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
46 *
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
47 * @param[out] va_pic A pointer to VA API's own picture struct
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
48 * @param[in] pic A pointer to the FFmpeg picture struct to convert
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
49 * @param[in] pic_structure The picture field type (as defined in mpegvideo.h),
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
50 * supersedes pic's field type if nonzero.
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
51 */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
52 static void fill_vaapi_pic(VAPictureH264 *va_pic,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
53 Picture *pic,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
54 int pic_structure)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
55 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
56 if (pic_structure == 0)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
57 pic_structure = pic->reference;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
58
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
59 va_pic->picture_id = ff_vaapi_get_surface_id(pic);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
60 va_pic->frame_idx = pic->long_ref ? pic->pic_id : pic->frame_num;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
61
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
62 va_pic->flags = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
63 if (pic_structure != PICT_FRAME)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
64 va_pic->flags |= (pic_structure & PICT_TOP_FIELD) ? VA_PICTURE_H264_TOP_FIELD : VA_PICTURE_H264_BOTTOM_FIELD;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
65 if (pic->reference)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
66 va_pic->flags |= pic->long_ref ? VA_PICTURE_H264_LONG_TERM_REFERENCE : VA_PICTURE_H264_SHORT_TERM_REFERENCE;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
67
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
68 va_pic->TopFieldOrderCnt = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
69 if (pic->field_poc[0] != INT_MAX)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
70 va_pic->TopFieldOrderCnt = pic->field_poc[0];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
71
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
72 va_pic->BottomFieldOrderCnt = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
73 if (pic->field_poc[1] != INT_MAX)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
74 va_pic->BottomFieldOrderCnt = pic->field_poc[1];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
75 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
76
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
77 /** Decoded Picture Buffer (DPB). */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
78 typedef struct DPB {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
79 int size; ///< Current number of reference frames in the DPB
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
80 int max_size; ///< Max number of reference frames. This is FF_ARRAY_ELEMS(VAPictureParameterBufferH264.ReferenceFrames)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
81 VAPictureH264 *va_pics; ///< Pointer to VAPictureParameterBufferH264.ReferenceFrames array
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
82 } DPB;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
83
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
84 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11624
diff changeset
85 * Append picture to the decoded picture buffer, in a VA API form that
10732
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
86 * merges the second field picture attributes with the first, if
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
87 * available. The decoded picture buffer's size must be large enough
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
88 * to receive the new VA API picture object.
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
89 */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
90 static int dpb_add(DPB *dpb, Picture *pic)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
91 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
92 int i;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
93
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
94 if (dpb->size >= dpb->max_size)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
95 return -1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
96
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
97 for (i = 0; i < dpb->size; i++) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
98 VAPictureH264 * const va_pic = &dpb->va_pics[i];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
99 if (va_pic->picture_id == ff_vaapi_get_surface_id(pic)) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
100 VAPictureH264 temp_va_pic;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
101 fill_vaapi_pic(&temp_va_pic, pic, 0);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
102
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
103 if ((temp_va_pic.flags ^ va_pic->flags) & (VA_PICTURE_H264_TOP_FIELD | VA_PICTURE_H264_BOTTOM_FIELD)) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
104 va_pic->flags |= temp_va_pic.flags & (VA_PICTURE_H264_TOP_FIELD | VA_PICTURE_H264_BOTTOM_FIELD);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
105 /* Merge second field */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
106 if (temp_va_pic.flags & VA_PICTURE_H264_TOP_FIELD) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
107 va_pic->TopFieldOrderCnt = temp_va_pic.TopFieldOrderCnt;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
108 } else {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
109 va_pic->BottomFieldOrderCnt = temp_va_pic.BottomFieldOrderCnt;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
110 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
111 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
112 return 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
113 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
114 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
115
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
116 fill_vaapi_pic(&dpb->va_pics[dpb->size++], pic, 0);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
117 return 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
118 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
119
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11624
diff changeset
120 /** Fill in VA API reference frames array. */
10732
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
121 static int fill_vaapi_ReferenceFrames(VAPictureParameterBufferH264 *pic_param,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
122 H264Context *h)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
123 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
124 DPB dpb;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
125 int i;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
126
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
127 dpb.size = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
128 dpb.max_size = FF_ARRAY_ELEMS(pic_param->ReferenceFrames);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
129 dpb.va_pics = pic_param->ReferenceFrames;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
130 for (i = 0; i < dpb.max_size; i++)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
131 init_vaapi_pic(&dpb.va_pics[i]);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
132
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
133 for (i = 0; i < h->short_ref_count; i++) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
134 Picture * const pic = h->short_ref[i];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
135 if (pic && pic->reference && dpb_add(&dpb, pic) < 0)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
136 return -1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
137 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
138
11624
a01c36c52702 [VA-API] Fix long-term reference frames addition to the DPB.
gb
parents: 11560
diff changeset
139 for (i = 0; i < 16; i++) {
10732
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
140 Picture * const pic = h->long_ref[i];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
141 if (pic && pic->reference && dpb_add(&dpb, pic) < 0)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
142 return -1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
143 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
144 return 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
145 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
146
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
147 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11624
diff changeset
148 * Fill in VA API reference picture lists from the FFmpeg reference
10732
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
149 * picture list.
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
150 *
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
151 * @param[out] RefPicList VA API internal reference picture list
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
152 * @param[in] ref_list A pointer to the FFmpeg reference list
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
153 * @param[in] ref_count The number of reference pictures in ref_list
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
154 */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
155 static void fill_vaapi_RefPicList(VAPictureH264 RefPicList[32],
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
156 Picture *ref_list,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
157 unsigned int ref_count)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
158 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
159 unsigned int i, n = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
160 for (i = 0; i < ref_count; i++)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
161 if (ref_list[i].reference)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
162 fill_vaapi_pic(&RefPicList[n++], &ref_list[i], 0);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
163
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
164 for (; n < 32; n++)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
165 init_vaapi_pic(&RefPicList[n]);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
166 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
167
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
168 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11624
diff changeset
169 * Fill in prediction weight table.
10732
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
170 *
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
171 * VA API requires a plain prediction weight table as it does not infer
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
172 * any value.
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
173 *
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
174 * @param[in] h A pointer to the current H.264 context
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
175 * @param[in] list The reference frame list index to use
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
176 * @param[out] luma_weight_flag VA API plain luma weight flag
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
177 * @param[out] luma_weight VA API plain luma weight table
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
178 * @param[out] luma_offset VA API plain luma offset table
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
179 * @param[out] chroma_weight_flag VA API plain chroma weight flag
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
180 * @param[out] chroma_weight VA API plain chroma weight table
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
181 * @param[out] chroma_offset VA API plain chroma offset table
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
182 */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
183 static void fill_vaapi_plain_pred_weight_table(H264Context *h,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
184 int list,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
185 unsigned char *luma_weight_flag,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
186 short luma_weight[32],
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
187 short luma_offset[32],
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
188 unsigned char *chroma_weight_flag,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
189 short chroma_weight[32][2],
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
190 short chroma_offset[32][2])
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
191 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
192 unsigned int i, j;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
193
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
194 *luma_weight_flag = h->luma_weight_flag[list];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
195 *chroma_weight_flag = h->chroma_weight_flag[list];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
196
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
197 for (i = 0; i < h->ref_count[list]; i++) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
198 /* VA API also wants the inferred (default) values, not
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
199 only what is available in the bitstream (7.4.3.2). */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
200 if (h->luma_weight_flag[list]) {
11359
471c370c6b05 Cope with rev 22183:
gb
parents: 11340
diff changeset
201 luma_weight[i] = h->luma_weight[i][list][0];
471c370c6b05 Cope with rev 22183:
gb
parents: 11340
diff changeset
202 luma_offset[i] = h->luma_weight[i][list][1];
10732
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
203 } else {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
204 luma_weight[i] = 1 << h->luma_log2_weight_denom;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
205 luma_offset[i] = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
206 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
207 for (j = 0; j < 2; j++) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
208 if (h->chroma_weight_flag[list]) {
11359
471c370c6b05 Cope with rev 22183:
gb
parents: 11340
diff changeset
209 chroma_weight[i][j] = h->chroma_weight[i][list][j][0];
471c370c6b05 Cope with rev 22183:
gb
parents: 11340
diff changeset
210 chroma_offset[i][j] = h->chroma_weight[i][list][j][1];
10732
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
211 } else {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
212 chroma_weight[i][j] = 1 << h->chroma_log2_weight_denom;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
213 chroma_offset[i][j] = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
214 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
215 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
216 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
217 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
218
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11624
diff changeset
219 /** Initialize and start decoding a frame with VA API. */
10732
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
220 static int start_frame(AVCodecContext *avctx,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
221 av_unused const uint8_t *buffer,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
222 av_unused uint32_t size)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
223 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
224 H264Context * const h = avctx->priv_data;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
225 MpegEncContext * const s = &h->s;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
226 struct vaapi_context * const vactx = avctx->hwaccel_context;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
227 VAPictureParameterBufferH264 *pic_param;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
228 VAIQMatrixBufferH264 *iq_matrix;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
229
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
230 dprintf(avctx, "start_frame()\n");
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
231
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
232 vactx->slice_param_size = sizeof(VASliceParameterBufferH264);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
233
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
234 /* Fill in VAPictureParameterBufferH264. */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
235 pic_param = ff_vaapi_alloc_pic_param(vactx, sizeof(VAPictureParameterBufferH264));
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
236 if (!pic_param)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
237 return -1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
238 fill_vaapi_pic(&pic_param->CurrPic, s->current_picture_ptr, s->picture_structure);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
239 if (fill_vaapi_ReferenceFrames(pic_param, h) < 0)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
240 return -1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
241 pic_param->picture_width_in_mbs_minus1 = s->mb_width - 1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
242 pic_param->picture_height_in_mbs_minus1 = s->mb_height - 1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
243 pic_param->bit_depth_luma_minus8 = h->sps.bit_depth_luma - 8;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
244 pic_param->bit_depth_chroma_minus8 = h->sps.bit_depth_chroma - 8;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
245 pic_param->num_ref_frames = h->sps.ref_frame_count;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
246 pic_param->seq_fields.value = 0; /* reset all bits */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
247 pic_param->seq_fields.bits.chroma_format_idc = h->sps.chroma_format_idc;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
248 pic_param->seq_fields.bits.residual_colour_transform_flag = h->sps.residual_color_transform_flag; /* XXX: only for 4:4:4 high profile? */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
249 pic_param->seq_fields.bits.gaps_in_frame_num_value_allowed_flag = h->sps.gaps_in_frame_num_allowed_flag;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
250 pic_param->seq_fields.bits.frame_mbs_only_flag = h->sps.frame_mbs_only_flag;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
251 pic_param->seq_fields.bits.mb_adaptive_frame_field_flag = h->sps.mb_aff;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
252 pic_param->seq_fields.bits.direct_8x8_inference_flag = h->sps.direct_8x8_inference_flag;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
253 pic_param->seq_fields.bits.MinLumaBiPredSize8x8 = h->sps.level_idc >= 31; /* A.3.3.2 */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
254 pic_param->seq_fields.bits.log2_max_frame_num_minus4 = h->sps.log2_max_frame_num - 4;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
255 pic_param->seq_fields.bits.pic_order_cnt_type = h->sps.poc_type;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
256 pic_param->seq_fields.bits.log2_max_pic_order_cnt_lsb_minus4 = h->sps.log2_max_poc_lsb - 4;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
257 pic_param->seq_fields.bits.delta_pic_order_always_zero_flag = h->sps.delta_pic_order_always_zero_flag;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
258 pic_param->num_slice_groups_minus1 = h->pps.slice_group_count - 1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
259 pic_param->slice_group_map_type = h->pps.mb_slice_group_map_type;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
260 pic_param->slice_group_change_rate_minus1 = 0; /* XXX: unimplemented in FFmpeg */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
261 pic_param->pic_init_qp_minus26 = h->pps.init_qp - 26;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
262 pic_param->pic_init_qs_minus26 = h->pps.init_qs - 26;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
263 pic_param->chroma_qp_index_offset = h->pps.chroma_qp_index_offset[0];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
264 pic_param->second_chroma_qp_index_offset = h->pps.chroma_qp_index_offset[1];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
265 pic_param->pic_fields.value = 0; /* reset all bits */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
266 pic_param->pic_fields.bits.entropy_coding_mode_flag = h->pps.cabac;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
267 pic_param->pic_fields.bits.weighted_pred_flag = h->pps.weighted_pred;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
268 pic_param->pic_fields.bits.weighted_bipred_idc = h->pps.weighted_bipred_idc;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
269 pic_param->pic_fields.bits.transform_8x8_mode_flag = h->pps.transform_8x8_mode;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
270 pic_param->pic_fields.bits.field_pic_flag = s->picture_structure != PICT_FRAME;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
271 pic_param->pic_fields.bits.constrained_intra_pred_flag = h->pps.constrained_intra_pred;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
272 pic_param->pic_fields.bits.pic_order_present_flag = h->pps.pic_order_present;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
273 pic_param->pic_fields.bits.deblocking_filter_control_present_flag = h->pps.deblocking_filter_parameters_present;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
274 pic_param->pic_fields.bits.redundant_pic_cnt_present_flag = h->pps.redundant_pic_cnt_present;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
275 pic_param->pic_fields.bits.reference_pic_flag = h->nal_ref_idc != 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
276 pic_param->frame_num = h->frame_num;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
277
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
278 /* Fill in VAIQMatrixBufferH264. */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
279 iq_matrix = ff_vaapi_alloc_iq_matrix(vactx, sizeof(VAIQMatrixBufferH264));
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
280 if (!iq_matrix)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
281 return -1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
282 memcpy(iq_matrix->ScalingList4x4, h->pps.scaling_matrix4, sizeof(iq_matrix->ScalingList4x4));
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
283 memcpy(iq_matrix->ScalingList8x8, h->pps.scaling_matrix8, sizeof(iq_matrix->ScalingList8x8));
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
284 return 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
285 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
286
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11624
diff changeset
287 /** End a hardware decoding based frame. */
10732
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
288 static int end_frame(AVCodecContext *avctx)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
289 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
290 H264Context * const h = avctx->priv_data;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
291
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
292 dprintf(avctx, "end_frame()\n");
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
293 return ff_vaapi_common_end_frame(&h->s);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
294 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
295
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11624
diff changeset
296 /** Decode the given H.264 slice with VA API. */
10732
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
297 static int decode_slice(AVCodecContext *avctx,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
298 const uint8_t *buffer,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
299 uint32_t size)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
300 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
301 H264Context * const h = avctx->priv_data;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
302 MpegEncContext * const s = &h->s;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
303 VASliceParameterBufferH264 *slice_param;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
304
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
305 dprintf(avctx, "decode_slice(): buffer %p, size %d\n", buffer, size);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
306
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
307 /* Fill in VASliceParameterBufferH264. */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
308 slice_param = (VASliceParameterBufferH264 *)ff_vaapi_alloc_slice(avctx->hwaccel_context, buffer, size);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
309 if (!slice_param)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
310 return -1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
311 slice_param->slice_data_bit_offset = get_bits_count(&h->s.gb) + 8; /* bit buffer started beyond nal_unit_type */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
312 slice_param->first_mb_in_slice = (s->mb_y >> FIELD_OR_MBAFF_PICTURE) * s->mb_width + s->mb_x;
10829
46a247e54d6e Export get_slice_type() as ff_h264_get_slice_type().
ramiro
parents: 10732
diff changeset
313 slice_param->slice_type = ff_h264_get_slice_type(h);
10732
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
314 slice_param->direct_spatial_mv_pred_flag = h->slice_type == FF_B_TYPE ? h->direct_spatial_mv_pred : 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
315 slice_param->num_ref_idx_l0_active_minus1 = h->list_count > 0 ? h->ref_count[0] - 1 : 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
316 slice_param->num_ref_idx_l1_active_minus1 = h->list_count > 1 ? h->ref_count[1] - 1 : 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
317 slice_param->cabac_init_idc = h->cabac_init_idc;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
318 slice_param->slice_qp_delta = s->qscale - h->pps.init_qp;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
319 slice_param->disable_deblocking_filter_idc = h->deblocking_filter < 2 ? !h->deblocking_filter : h->deblocking_filter;
10979
776dba50775c Move +52 from the loop filter to the alpha/beta offsets in the context.
michael
parents: 10829
diff changeset
320 slice_param->slice_alpha_c0_offset_div2 = h->slice_alpha_c0_offset / 2 - 26;
776dba50775c Move +52 from the loop filter to the alpha/beta offsets in the context.
michael
parents: 10829
diff changeset
321 slice_param->slice_beta_offset_div2 = h->slice_beta_offset / 2 - 26;
10732
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
322 slice_param->luma_log2_weight_denom = h->luma_log2_weight_denom;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
323 slice_param->chroma_log2_weight_denom = h->chroma_log2_weight_denom;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
324
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
325 fill_vaapi_RefPicList(slice_param->RefPicList0, h->ref_list[0], h->list_count > 0 ? h->ref_count[0] : 0);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
326 fill_vaapi_RefPicList(slice_param->RefPicList1, h->ref_list[1], h->list_count > 1 ? h->ref_count[1] : 0);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
327
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
328 fill_vaapi_plain_pred_weight_table(h, 0,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
329 &slice_param->luma_weight_l0_flag, slice_param->luma_weight_l0, slice_param->luma_offset_l0,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
330 &slice_param->chroma_weight_l0_flag, slice_param->chroma_weight_l0, slice_param->chroma_offset_l0);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
331 fill_vaapi_plain_pred_weight_table(h, 1,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
332 &slice_param->luma_weight_l1_flag, slice_param->luma_weight_l1, slice_param->luma_offset_l1,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
333 &slice_param->chroma_weight_l1_flag, slice_param->chroma_weight_l1, slice_param->chroma_offset_l1);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
334 return 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
335 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
336
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
337 AVHWAccel h264_vaapi_hwaccel = {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
338 .name = "h264_vaapi",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11359
diff changeset
339 .type = AVMEDIA_TYPE_VIDEO,
10732
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
340 .id = CODEC_ID_H264,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
341 .pix_fmt = PIX_FMT_VAAPI_VLD,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
342 .capabilities = 0,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
343 .start_frame = start_frame,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
344 .end_frame = end_frame,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
345 .decode_slice = decode_slice,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
346 .priv_data_size = 0,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
347 };