annotate vaapi_h264.c @ 10817:d1fe22d92a65 libavcodec

Rename mpeg4 intra vlc tables so they contain "mpeg4", this improves readability of msmpeg4 code (one now knows where that table comes from).
author michael
date Fri, 08 Jan 2010 17:41:14 +0000
parents a3af696f8499
children 46a247e54d6e
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 /** Reconstructs bitstream slice_type. */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
32 static int get_slice_type(H264Context *h)
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 switch (h->slice_type) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
35 case FF_P_TYPE: return 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
36 case FF_B_TYPE: return 1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
37 case FF_I_TYPE: return 2;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
38 case FF_SP_TYPE: return 3;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
39 case FF_SI_TYPE: return 4;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
40 default: return -1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
41 }
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 /**
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
45 * Initializes an empty VA API picture.
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 * VA API requires a fixed-size reference picture array.
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
48 */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
49 static void init_vaapi_pic(VAPictureH264 *va_pic)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
50 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
51 va_pic->picture_id = VA_INVALID_ID;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
52 va_pic->flags = VA_PICTURE_H264_INVALID;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
53 va_pic->TopFieldOrderCnt = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
54 va_pic->BottomFieldOrderCnt = 0;
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
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
57 /**
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
58 * Translates an FFmpeg Picture into its VA API form.
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
59 *
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
60 * @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
61 * @param[in] pic A pointer to the FFmpeg picture struct to convert
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
62 * @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
63 * supersedes pic's field type if nonzero.
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
64 */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
65 static void fill_vaapi_pic(VAPictureH264 *va_pic,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
66 Picture *pic,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
67 int pic_structure)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
68 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
69 if (pic_structure == 0)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
70 pic_structure = pic->reference;
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->picture_id = ff_vaapi_get_surface_id(pic);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
73 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
74
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
75 va_pic->flags = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
76 if (pic_structure != PICT_FRAME)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
77 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
78 if (pic->reference)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
79 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
80
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
81 va_pic->TopFieldOrderCnt = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
82 if (pic->field_poc[0] != INT_MAX)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
83 va_pic->TopFieldOrderCnt = pic->field_poc[0];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
84
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
85 va_pic->BottomFieldOrderCnt = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
86 if (pic->field_poc[1] != INT_MAX)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
87 va_pic->BottomFieldOrderCnt = pic->field_poc[1];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
88 }
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 /** Decoded Picture Buffer (DPB). */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
91 typedef struct DPB {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
92 int size; ///< Current number of reference frames in the DPB
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
93 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
94 VAPictureH264 *va_pics; ///< Pointer to VAPictureParameterBufferH264.ReferenceFrames array
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
95 } DPB;
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 /**
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
98 * Appends picture to the decoded picture buffer, in a VA API form that
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
99 * merges the second field picture attributes with the first, if
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
100 * available. The decoded picture buffer's size must be large enough
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
101 * to receive the new VA API picture object.
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 static int dpb_add(DPB *dpb, Picture *pic)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
104 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
105 int i;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
106
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
107 if (dpb->size >= dpb->max_size)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
108 return -1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
109
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
110 for (i = 0; i < dpb->size; i++) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
111 VAPictureH264 * const va_pic = &dpb->va_pics[i];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
112 if (va_pic->picture_id == ff_vaapi_get_surface_id(pic)) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
113 VAPictureH264 temp_va_pic;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
114 fill_vaapi_pic(&temp_va_pic, pic, 0);
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 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
117 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
118 /* Merge second field */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
119 if (temp_va_pic.flags & VA_PICTURE_H264_TOP_FIELD) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
120 va_pic->TopFieldOrderCnt = temp_va_pic.TopFieldOrderCnt;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
121 } else {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
122 va_pic->BottomFieldOrderCnt = temp_va_pic.BottomFieldOrderCnt;
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 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
125 return 0;
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 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
128
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
129 fill_vaapi_pic(&dpb->va_pics[dpb->size++], pic, 0);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
130 return 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
131 }
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 /** Fills in VA API reference frames array. */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
134 static int fill_vaapi_ReferenceFrames(VAPictureParameterBufferH264 *pic_param,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
135 H264Context *h)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
136 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
137 DPB dpb;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
138 int i;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
139
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
140 dpb.size = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
141 dpb.max_size = FF_ARRAY_ELEMS(pic_param->ReferenceFrames);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
142 dpb.va_pics = pic_param->ReferenceFrames;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
143 for (i = 0; i < dpb.max_size; i++)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
144 init_vaapi_pic(&dpb.va_pics[i]);
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 for (i = 0; i < h->short_ref_count; i++) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
147 Picture * const pic = h->short_ref[i];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
148 if (pic && pic->reference && dpb_add(&dpb, pic) < 0)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
149 return -1;
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
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
152 for (i = 0; i < h->long_ref_count; i++) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
153 Picture * const pic = h->long_ref[i];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
154 if (pic && pic->reference && dpb_add(&dpb, pic) < 0)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
155 return -1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
156 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
157 return 0;
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
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
160 /**
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
161 * Fills in VA API reference picture lists from the FFmpeg reference
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
162 * picture list.
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 * @param[out] RefPicList VA API internal reference picture list
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
165 * @param[in] ref_list A pointer to the FFmpeg reference list
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
166 * @param[in] ref_count The number of reference pictures in ref_list
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 static void fill_vaapi_RefPicList(VAPictureH264 RefPicList[32],
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
169 Picture *ref_list,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
170 unsigned int ref_count)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
171 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
172 unsigned int i, n = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
173 for (i = 0; i < ref_count; i++)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
174 if (ref_list[i].reference)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
175 fill_vaapi_pic(&RefPicList[n++], &ref_list[i], 0);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
176
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
177 for (; n < 32; n++)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
178 init_vaapi_pic(&RefPicList[n]);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
179 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
180
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
181 /**
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
182 * Fills in prediction weight table.
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
183 *
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
184 * 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
185 * any value.
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
186 *
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
187 * @param[in] h A pointer to the current H.264 context
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
188 * @param[in] list The reference frame list index to use
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
189 * @param[out] luma_weight_flag VA API plain luma weight flag
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
190 * @param[out] luma_weight VA API plain luma weight table
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
191 * @param[out] luma_offset VA API plain luma offset table
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
192 * @param[out] chroma_weight_flag VA API plain chroma weight flag
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
193 * @param[out] chroma_weight VA API plain chroma weight table
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
194 * @param[out] chroma_offset VA API plain chroma offset table
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
195 */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
196 static void fill_vaapi_plain_pred_weight_table(H264Context *h,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
197 int list,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
198 unsigned char *luma_weight_flag,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
199 short luma_weight[32],
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
200 short luma_offset[32],
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
201 unsigned char *chroma_weight_flag,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
202 short chroma_weight[32][2],
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
203 short chroma_offset[32][2])
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
204 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
205 unsigned int i, j;
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 *luma_weight_flag = h->luma_weight_flag[list];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
208 *chroma_weight_flag = h->chroma_weight_flag[list];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
209
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
210 for (i = 0; i < h->ref_count[list]; i++) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
211 /* VA API also wants the inferred (default) values, not
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
212 only what is available in the bitstream (7.4.3.2). */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
213 if (h->luma_weight_flag[list]) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
214 luma_weight[i] = h->luma_weight[list][i];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
215 luma_offset[i] = h->luma_offset[list][i];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
216 } else {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
217 luma_weight[i] = 1 << h->luma_log2_weight_denom;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
218 luma_offset[i] = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
219 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
220 for (j = 0; j < 2; j++) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
221 if (h->chroma_weight_flag[list]) {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
222 chroma_weight[i][j] = h->chroma_weight[list][i][j];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
223 chroma_offset[i][j] = h->chroma_offset[list][i][j];
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
224 } else {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
225 chroma_weight[i][j] = 1 << h->chroma_log2_weight_denom;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
226 chroma_offset[i][j] = 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
227 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
228 }
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 }
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 /** Initializes and starts decoding a frame with VA API. */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
233 static int start_frame(AVCodecContext *avctx,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
234 av_unused const uint8_t *buffer,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
235 av_unused uint32_t size)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
236 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
237 H264Context * const h = avctx->priv_data;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
238 MpegEncContext * const s = &h->s;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
239 struct vaapi_context * const vactx = avctx->hwaccel_context;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
240 VAPictureParameterBufferH264 *pic_param;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
241 VAIQMatrixBufferH264 *iq_matrix;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
242
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
243 dprintf(avctx, "start_frame()\n");
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
244
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
245 vactx->slice_param_size = sizeof(VASliceParameterBufferH264);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
246
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
247 /* Fill in VAPictureParameterBufferH264. */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
248 pic_param = ff_vaapi_alloc_pic_param(vactx, sizeof(VAPictureParameterBufferH264));
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
249 if (!pic_param)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
250 return -1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
251 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
252 if (fill_vaapi_ReferenceFrames(pic_param, h) < 0)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
253 return -1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
254 pic_param->picture_width_in_mbs_minus1 = s->mb_width - 1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
255 pic_param->picture_height_in_mbs_minus1 = s->mb_height - 1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
256 pic_param->bit_depth_luma_minus8 = h->sps.bit_depth_luma - 8;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
257 pic_param->bit_depth_chroma_minus8 = h->sps.bit_depth_chroma - 8;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
258 pic_param->num_ref_frames = h->sps.ref_frame_count;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
259 pic_param->seq_fields.value = 0; /* reset all bits */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
260 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
261 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
262 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
263 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
264 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
265 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
266 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
267 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
268 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
269 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
270 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
271 pic_param->num_slice_groups_minus1 = h->pps.slice_group_count - 1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
272 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
273 pic_param->slice_group_change_rate_minus1 = 0; /* XXX: unimplemented in FFmpeg */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
274 pic_param->pic_init_qp_minus26 = h->pps.init_qp - 26;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
275 pic_param->pic_init_qs_minus26 = h->pps.init_qs - 26;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
276 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
277 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
278 pic_param->pic_fields.value = 0; /* reset all bits */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
279 pic_param->pic_fields.bits.entropy_coding_mode_flag = h->pps.cabac;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
280 pic_param->pic_fields.bits.weighted_pred_flag = h->pps.weighted_pred;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
281 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
282 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
283 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
284 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
285 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
286 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
287 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
288 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
289 pic_param->frame_num = h->frame_num;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
290
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
291 /* Fill in VAIQMatrixBufferH264. */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
292 iq_matrix = ff_vaapi_alloc_iq_matrix(vactx, sizeof(VAIQMatrixBufferH264));
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
293 if (!iq_matrix)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
294 return -1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
295 memcpy(iq_matrix->ScalingList4x4, h->pps.scaling_matrix4, sizeof(iq_matrix->ScalingList4x4));
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
296 memcpy(iq_matrix->ScalingList8x8, h->pps.scaling_matrix8, sizeof(iq_matrix->ScalingList8x8));
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
297 return 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
298 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
299
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
300 /** Ends a hardware decoding based frame. */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
301 static int end_frame(AVCodecContext *avctx)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
302 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
303 H264Context * const h = avctx->priv_data;
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, "end_frame()\n");
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
306 return ff_vaapi_common_end_frame(&h->s);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
307 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
308
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
309 /** Decodes the given H.264 slice with VA API. */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
310 static int decode_slice(AVCodecContext *avctx,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
311 const uint8_t *buffer,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
312 uint32_t size)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
313 {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
314 H264Context * const h = avctx->priv_data;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
315 MpegEncContext * const s = &h->s;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
316 VASliceParameterBufferH264 *slice_param;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
317
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
318 dprintf(avctx, "decode_slice(): buffer %p, size %d\n", buffer, size);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
319
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
320 /* Fill in VASliceParameterBufferH264. */
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
321 slice_param = (VASliceParameterBufferH264 *)ff_vaapi_alloc_slice(avctx->hwaccel_context, buffer, size);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
322 if (!slice_param)
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
323 return -1;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
324 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
325 slice_param->first_mb_in_slice = (s->mb_y >> FIELD_OR_MBAFF_PICTURE) * s->mb_width + s->mb_x;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
326 slice_param->slice_type = get_slice_type(h);
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
327 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
328 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
329 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
330 slice_param->cabac_init_idc = h->cabac_init_idc;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
331 slice_param->slice_qp_delta = s->qscale - h->pps.init_qp;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
332 slice_param->disable_deblocking_filter_idc = h->deblocking_filter < 2 ? !h->deblocking_filter : h->deblocking_filter;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
333 slice_param->slice_alpha_c0_offset_div2 = h->slice_alpha_c0_offset / 2;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
334 slice_param->slice_beta_offset_div2 = h->slice_beta_offset / 2;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
335 slice_param->luma_log2_weight_denom = h->luma_log2_weight_denom;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
336 slice_param->chroma_log2_weight_denom = h->chroma_log2_weight_denom;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
337
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
338 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
339 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
340
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
341 fill_vaapi_plain_pred_weight_table(h, 0,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
342 &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
343 &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
344 fill_vaapi_plain_pred_weight_table(h, 1,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
345 &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
346 &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
347 return 0;
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
348 }
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
349
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
350 AVHWAccel h264_vaapi_hwaccel = {
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
351 .name = "h264_vaapi",
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
352 .type = CODEC_TYPE_VIDEO,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
353 .id = CODEC_ID_H264,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
354 .pix_fmt = PIX_FMT_VAAPI_VLD,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
355 .capabilities = 0,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
356 .start_frame = start_frame,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
357 .end_frame = end_frame,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
358 .decode_slice = decode_slice,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
359 .priv_data_size = 0,
a3af696f8499 Add H.264 bitstream decoding through VAAPI.
gb
parents:
diff changeset
360 };