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
40b75a94
Commit
40b75a94
authored
Nov 18, 2017
by
Mark Thompson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
vaapi: Add VP8 decode hwaccel
parent
9f00fa53
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
248 additions
and
0 deletions
+248
-0
configure
configure
+3
-0
Makefile
libavcodec/Makefile
+1
-0
hwaccels.h
libavcodec/hwaccels.h
+1
-0
vaapi_vp8.c
libavcodec/vaapi_vp8.c
+237
-0
vp8.c
libavcodec/vp8.c
+6
-0
No files found.
configure
View file @
40b75a94
...
...
@@ -2746,6 +2746,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"
vp9_d3d11va_hwaccel_deps
=
"d3d11va DXVA_PicParams_VP9"
vp9_d3d11va_hwaccel_select
=
"vp9_decoder"
vp9_d3d11va2_hwaccel_deps
=
"d3d11va DXVA_PicParams_VP9"
...
...
@@ -5719,6 +5721,7 @@ check_type "windows.h d3d11.h" "ID3D11VideoContext"
check_type
"d3d9.h dxva2api.h"
DXVA2_ConfigPictureDecode
-D_WIN32_WINNT
=
0x0602
check_type
"va/va.h va/va_dec_hevc.h"
"VAPictureParameterBufferHEVC"
check_type
"va/va.h va/va_dec_vp8.h"
"VAPictureParameterBufferVP8"
check_struct
"va/va.h"
"VADecPictureParameterBufferVP9"
bit_depth
check_type
"va/va.h va/va_vpp.h"
"VAProcPipelineParameterBuffer"
check_type
"va/va.h va/va_enc_h264.h"
"VAEncPictureParameterBufferH264"
...
...
libavcodec/Makefile
View file @
40b75a94
...
...
@@ -871,6 +871,7 @@ OBJS-$(CONFIG_VC1_NVDEC_HWACCEL) += nvdec_vc1.o
OBJS-$(CONFIG_VC1_QSV_HWACCEL)
+=
qsvdec_other.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
OBJS-$(CONFIG_VP9_D3D11VA_HWACCEL)
+=
dxva2_vp9.o
OBJS-$(CONFIG_VP9_DXVA2_HWACCEL)
+=
dxva2_vp9.o
OBJS-$(CONFIG_VP9_NVDEC_HWACCEL)
+=
nvdec_vp9.o
...
...
libavcodec/hwaccels.h
View file @
40b75a94
...
...
@@ -59,6 +59,7 @@ extern const AVHWAccel ff_vc1_dxva2_hwaccel;
extern
const
AVHWAccel
ff_vc1_nvdec_hwaccel
;
extern
const
AVHWAccel
ff_vc1_vaapi_hwaccel
;
extern
const
AVHWAccel
ff_vc1_vdpau_hwaccel
;
extern
const
AVHWAccel
ff_vp8_vaapi_hwaccel
;
extern
const
AVHWAccel
ff_vp9_d3d11va_hwaccel
;
extern
const
AVHWAccel
ff_vp9_d3d11va2_hwaccel
;
extern
const
AVHWAccel
ff_vp9_dxva2_hwaccel
;
...
...
libavcodec/vaapi_vp8.c
0 → 100644
View file @
40b75a94
/*
* This file is part of FFmpeg.
*
* FFmpeg 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.
*
* FFmpeg 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 FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <va/va.h>
#include <va/va_dec_vp8.h>
#include "hwaccel.h"
#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
;
}
const
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
,
.
frame_params
=
&
ff_vaapi_common_frame_params
,
.
priv_data_size
=
sizeof
(
VAAPIDecodeContext
),
.
caps_internal
=
HWACCEL_CAP_ASYNC_SAFE
,
};
libavcodec/vp8.c
View file @
40b75a94
...
...
@@ -2599,6 +2599,9 @@ int vp78_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
// avctx->pix_fmt already set in caller.
}
else
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
,
};
...
...
@@ -2944,6 +2947,9 @@ AVCodec ff_vp8_decoder = {
.
init_thread_copy
=
ONLY_IF_THREADS_ENABLED
(
vp8_decode_init_thread_copy
),
.
update_thread_context
=
ONLY_IF_THREADS_ENABLED
(
vp8_decode_update_thread_context
),
.
hw_configs
=
(
const
AVCodecHWConfigInternal
*
[])
{
#if CONFIG_VP8_VAAPI_HWACCEL
HWACCEL_VAAPI
(
vp8
),
#endif
NULL
},
};
...
...
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