Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
a9fb1347
Commit
a9fb1347
authored
Sep 04, 2016
by
Mark Thompson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavc/vaapi: Add VP8 decode hwaccel
parent
4e528206
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
239 additions
and
0 deletions
+239
-0
configure
configure
+3
-0
Makefile
libavcodec/Makefile
+1
-0
allcodecs.c
libavcodec/allcodecs.c
+1
-0
vaapi_vp8.c
libavcodec/vaapi_vp8.c
+231
-0
vp8.c
libavcodec/vp8.c
+3
-0
No files found.
configure
View file @
a9fb1347
...
...
@@ -2185,6 +2185,8 @@ vc1_vaapi_hwaccel_deps="vaapi"
vc1_vaapi_hwaccel_select
=
"vc1_decoder"
vc1_vdpau_hwaccel_deps
=
"vdpau"
vc1_vdpau_hwaccel_select
=
"vc1_decoder"
vp8_vaapi_hwaccel_deps
=
"vaapi VAPictureParameterBufferVP8"
vp8_vaapi_hwaccel_select
=
"vp8_decoder"
wmv3_d3d11va_hwaccel_select
=
"vc1_d3d11va_hwaccel"
wmv3_dxva2_hwaccel_select
=
"vc1_dxva2_hwaccel"
wmv3_vaapi_hwaccel_select
=
"vc1_vaapi_hwaccel"
...
...
@@ -4544,6 +4546,7 @@ check_type "windows.h dxva.h" "DXVA_PicParams_HEVC" -DWINAPI_FAMILY=WINAPI_FAMIL
check_type
"windows.h d3d11.h"
"ID3D11VideoDecoder"
check_type
"d3d9.h dxva2api.h"
DXVA2_ConfigPictureDecode
-D_WIN32_WINNT
=
0x0602
check_type
"va/va.h va/va_dec_vp8.h"
"VAPictureParameterBufferVP8"
check_type
"va/va.h va/va_vpp.h"
"VAProcPipelineParameterBuffer"
check_type
"va/va.h va/va_enc_h264.h"
"VAEncPictureParameterBufferH264"
check_type
"va/va.h va/va_enc_hevc.h"
"VAEncPictureParameterBufferHEVC"
...
...
libavcodec/Makefile
View file @
a9fb1347
...
...
@@ -634,6 +634,7 @@ OBJS-$(CONFIG_VC1_D3D11VA_HWACCEL) += dxva2_vc1.o
OBJS-$(CONFIG_VC1_DXVA2_HWACCEL)
+=
dxva2_vc1.o
OBJS-$(CONFIG_VC1_VAAPI_HWACCEL)
+=
vaapi_vc1.o
OBJS-$(CONFIG_VC1_VDPAU_HWACCEL)
+=
vdpau_vc1.o
OBJS-$(CONFIG_VP8_VAAPI_HWACCEL)
+=
vaapi_vp8.o
# libavformat dependencies
OBJS-$(CONFIG_ISO_MEDIA)
+=
mpeg4audio.o
mpegaudiodata.o
...
...
libavcodec/allcodecs.c
View file @
a9fb1347
...
...
@@ -94,6 +94,7 @@ void avcodec_register_all(void)
REGISTER_HWACCEL
(
VC1_VAAPI
,
vc1_vaapi
);
REGISTER_HWACCEL
(
VC1_VDPAU
,
vc1_vdpau
);
REGISTER_HWACCEL
(
VC1_MMAL
,
vc1_mmal
);
REGISTER_HWACCEL
(
VP8_VAAPI
,
vp8_vaapi
);
REGISTER_HWACCEL
(
WMV3_D3D11VA
,
wmv3_d3d11va
);
REGISTER_HWACCEL
(
WMV3_DXVA2
,
wmv3_dxva2
);
REGISTER_HWACCEL
(
WMV3_VAAPI
,
wmv3_vaapi
);
...
...
libavcodec/vaapi_vp8.c
0 → 100644
View file @
a9fb1347
/*
* This file is part of Libav.
*
* Libav is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* Libav is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "vaapi_decode.h"
#include "vp8.h"
static
VASurfaceID
vaapi_vp8_surface_id
(
VP8Frame
*
vf
)
{
if
(
vf
)
return
ff_vaapi_get_surface_id
(
vf
->
tf
.
f
);
else
return
VA_INVALID_SURFACE
;
}
static
int
vaapi_vp8_start_frame
(
AVCodecContext
*
avctx
,
av_unused
const
uint8_t
*
buffer
,
av_unused
uint32_t
size
)
{
const
VP8Context
*
s
=
avctx
->
priv_data
;
VAAPIDecodePicture
*
pic
=
s
->
framep
[
VP56_FRAME_CURRENT
]
->
hwaccel_picture_private
;
VAPictureParameterBufferVP8
pp
;
VAProbabilityDataBufferVP8
prob
;
VAIQMatrixBufferVP8
quant
;
int
err
,
i
,
j
,
k
;
pic
->
output_surface
=
vaapi_vp8_surface_id
(
s
->
framep
[
VP56_FRAME_CURRENT
]);
pp
=
(
VAPictureParameterBufferVP8
)
{
.
frame_width
=
avctx
->
width
,
.
frame_height
=
avctx
->
height
,
.
last_ref_frame
=
vaapi_vp8_surface_id
(
s
->
framep
[
VP56_FRAME_PREVIOUS
]),
.
golden_ref_frame
=
vaapi_vp8_surface_id
(
s
->
framep
[
VP56_FRAME_GOLDEN
]),
.
alt_ref_frame
=
vaapi_vp8_surface_id
(
s
->
framep
[
VP56_FRAME_GOLDEN2
]),
.
out_of_loop_frame
=
VA_INVALID_SURFACE
,
.
pic_fields
.
bits
=
{
.
key_frame
=
!
s
->
keyframe
,
.
version
=
s
->
profile
,
.
segmentation_enabled
=
s
->
segmentation
.
enabled
,
.
update_mb_segmentation_map
=
s
->
segmentation
.
update_map
,
.
update_segment_feature_data
=
s
->
segmentation
.
update_feature_data
,
.
filter_type
=
s
->
filter
.
simple
,
.
sharpness_level
=
s
->
filter
.
sharpness
,
.
loop_filter_adj_enable
=
s
->
lf_delta
.
enabled
,
.
mode_ref_lf_delta_update
=
s
->
lf_delta
.
update
,
.
sign_bias_golden
=
s
->
sign_bias
[
VP56_FRAME_GOLDEN
],
.
sign_bias_alternate
=
s
->
sign_bias
[
VP56_FRAME_GOLDEN2
],
.
mb_no_coeff_skip
=
s
->
mbskip_enabled
,
.
loop_filter_disable
=
s
->
filter
.
level
==
0
,
},
.
prob_skip_false
=
s
->
prob
->
mbskip
,
.
prob_intra
=
s
->
prob
->
intra
,
.
prob_last
=
s
->
prob
->
last
,
.
prob_gf
=
s
->
prob
->
golden
,
};
for
(
i
=
0
;
i
<
3
;
i
++
)
pp
.
mb_segment_tree_probs
[
i
]
=
s
->
prob
->
segmentid
[
i
];
for
(
i
=
0
;
i
<
4
;
i
++
)
{
if
(
s
->
segmentation
.
enabled
)
{
pp
.
loop_filter_level
[
i
]
=
s
->
segmentation
.
filter_level
[
i
];
if
(
!
s
->
segmentation
.
absolute_vals
)
pp
.
loop_filter_level
[
i
]
+=
s
->
filter
.
level
;
}
else
{
pp
.
loop_filter_level
[
i
]
=
s
->
filter
.
level
;
}
pp
.
loop_filter_level
[
i
]
=
av_clip_uintp2
(
pp
.
loop_filter_level
[
i
],
6
);
}
for
(
i
=
0
;
i
<
4
;
i
++
)
{
pp
.
loop_filter_deltas_ref_frame
[
i
]
=
s
->
lf_delta
.
ref
[
i
];
pp
.
loop_filter_deltas_mode
[
i
]
=
s
->
lf_delta
.
mode
[
i
+
4
];
}
if
(
s
->
keyframe
)
{
static
const
uint8_t
keyframe_y_mode_probs
[
4
]
=
{
145
,
156
,
163
,
128
};
static
const
uint8_t
keyframe_uv_mode_probs
[
3
]
=
{
142
,
114
,
183
};
memcpy
(
pp
.
y_mode_probs
,
keyframe_y_mode_probs
,
4
);
memcpy
(
pp
.
uv_mode_probs
,
keyframe_uv_mode_probs
,
3
);
}
else
{
for
(
i
=
0
;
i
<
4
;
i
++
)
pp
.
y_mode_probs
[
i
]
=
s
->
prob
->
pred16x16
[
i
];
for
(
i
=
0
;
i
<
3
;
i
++
)
pp
.
uv_mode_probs
[
i
]
=
s
->
prob
->
pred8x8c
[
i
];
}
for
(
i
=
0
;
i
<
2
;
i
++
)
for
(
j
=
0
;
j
<
19
;
j
++
)
pp
.
mv_probs
[
i
][
j
]
=
s
->
prob
->
mvc
[
i
][
j
];
pp
.
bool_coder_ctx
.
range
=
s
->
coder_state_at_header_end
.
range
;
pp
.
bool_coder_ctx
.
value
=
s
->
coder_state_at_header_end
.
value
;
pp
.
bool_coder_ctx
.
count
=
s
->
coder_state_at_header_end
.
bit_count
;
err
=
ff_vaapi_decode_make_param_buffer
(
avctx
,
pic
,
VAPictureParameterBufferType
,
&
pp
,
sizeof
(
pp
));
if
(
err
<
0
)
goto
fail
;
for
(
i
=
0
;
i
<
4
;
i
++
)
{
for
(
j
=
0
;
j
<
8
;
j
++
)
{
static
const
int
coeff_bands_inverse
[
8
]
=
{
0
,
1
,
2
,
3
,
5
,
6
,
4
,
15
};
int
coeff_pos
=
coeff_bands_inverse
[
j
];
for
(
k
=
0
;
k
<
3
;
k
++
)
{
memcpy
(
prob
.
dct_coeff_probs
[
i
][
j
][
k
],
s
->
prob
->
token
[
i
][
coeff_pos
][
k
],
11
);
}
}
}
err
=
ff_vaapi_decode_make_param_buffer
(
avctx
,
pic
,
VAProbabilityBufferType
,
&
prob
,
sizeof
(
prob
));
if
(
err
<
0
)
goto
fail
;
for
(
i
=
0
;
i
<
4
;
i
++
)
{
int
base_qi
=
s
->
segmentation
.
base_quant
[
i
];
if
(
!
s
->
segmentation
.
absolute_vals
)
base_qi
+=
s
->
quant
.
yac_qi
;
quant
.
quantization_index
[
i
][
0
]
=
av_clip_uintp2
(
base_qi
,
7
);
quant
.
quantization_index
[
i
][
1
]
=
av_clip_uintp2
(
base_qi
+
s
->
quant
.
ydc_delta
,
7
);
quant
.
quantization_index
[
i
][
2
]
=
av_clip_uintp2
(
base_qi
+
s
->
quant
.
y2dc_delta
,
7
);
quant
.
quantization_index
[
i
][
3
]
=
av_clip_uintp2
(
base_qi
+
s
->
quant
.
y2ac_delta
,
7
);
quant
.
quantization_index
[
i
][
4
]
=
av_clip_uintp2
(
base_qi
+
s
->
quant
.
uvdc_delta
,
7
);
quant
.
quantization_index
[
i
][
5
]
=
av_clip_uintp2
(
base_qi
+
s
->
quant
.
uvac_delta
,
7
);
}
err
=
ff_vaapi_decode_make_param_buffer
(
avctx
,
pic
,
VAIQMatrixBufferType
,
&
quant
,
sizeof
(
quant
));
if
(
err
<
0
)
goto
fail
;
return
0
;
fail:
ff_vaapi_decode_cancel
(
avctx
,
pic
);
return
err
;
}
static
int
vaapi_vp8_end_frame
(
AVCodecContext
*
avctx
)
{
const
VP8Context
*
s
=
avctx
->
priv_data
;
VAAPIDecodePicture
*
pic
=
s
->
framep
[
VP56_FRAME_CURRENT
]
->
hwaccel_picture_private
;
return
ff_vaapi_decode_issue
(
avctx
,
pic
);
}
static
int
vaapi_vp8_decode_slice
(
AVCodecContext
*
avctx
,
const
uint8_t
*
buffer
,
uint32_t
size
)
{
const
VP8Context
*
s
=
avctx
->
priv_data
;
VAAPIDecodePicture
*
pic
=
s
->
framep
[
VP56_FRAME_CURRENT
]
->
hwaccel_picture_private
;
VASliceParameterBufferVP8
sp
;
int
err
,
i
;
unsigned
int
header_size
=
3
+
7
*
s
->
keyframe
;
const
uint8_t
*
data
=
buffer
+
header_size
;
unsigned
int
data_size
=
size
-
header_size
;
sp
=
(
VASliceParameterBufferVP8
)
{
.
slice_data_size
=
data_size
,
.
slice_data_offset
=
0
,
.
slice_data_flag
=
VA_SLICE_DATA_FLAG_ALL
,
.
macroblock_offset
=
(
8
*
(
s
->
coder_state_at_header_end
.
input
-
data
)
-
s
->
coder_state_at_header_end
.
bit_count
-
8
),
.
num_of_partitions
=
s
->
num_coeff_partitions
+
1
,
};
sp
.
partition_size
[
0
]
=
s
->
header_partition_size
-
((
sp
.
macroblock_offset
+
7
)
/
8
);
for
(
i
=
0
;
i
<
8
;
i
++
)
sp
.
partition_size
[
i
+
1
]
=
s
->
coeff_partition_size
[
i
];
err
=
ff_vaapi_decode_make_slice_buffer
(
avctx
,
pic
,
&
sp
,
sizeof
(
sp
),
data
,
data_size
);
if
(
err
)
goto
fail
;
return
0
;
fail:
ff_vaapi_decode_cancel
(
avctx
,
pic
);
return
err
;
}
AVHWAccel
ff_vp8_vaapi_hwaccel
=
{
.
name
=
"vp8_vaapi"
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
id
=
AV_CODEC_ID_VP8
,
.
pix_fmt
=
AV_PIX_FMT_VAAPI
,
.
start_frame
=
&
vaapi_vp8_start_frame
,
.
end_frame
=
&
vaapi_vp8_end_frame
,
.
decode_slice
=
&
vaapi_vp8_decode_slice
,
.
frame_priv_data_size
=
sizeof
(
VAAPIDecodePicture
),
.
init
=
&
ff_vaapi_decode_init
,
.
uninit
=
&
ff_vaapi_decode_uninit
,
.
priv_data_size
=
sizeof
(
VAAPIDecodeContext
),
};
libavcodec/vp8.c
View file @
a9fb1347
...
...
@@ -2516,6 +2516,9 @@ int vp78_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
if
(
!
is_vp7
&&
s
->
pix_fmt
==
AV_PIX_FMT_NONE
)
{
enum
AVPixelFormat
pix_fmts
[]
=
{
#if CONFIG_VP8_VAAPI_HWACCEL
AV_PIX_FMT_VAAPI
,
#endif
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_NONE
,
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment