From: Jaroslav Kysela Date: Sun, 3 Sep 2017 18:03:20 +0000 (+0200) Subject: transcoder: vaapi - add support for vp8 encoder (tested) and vp9 decoder (untested) X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3aa76fa68fe2467db8db99c4b506a2a4b58ca1e1;p=thirdparty%2Ftvheadend.git transcoder: vaapi - add support for vp8 encoder (tested) and vp9 decoder (untested) --- diff --git a/Makefile.ffmpeg b/Makefile.ffmpeg index d94ce6e6b..450014d5e 100644 --- a/Makefile.ffmpeg +++ b/Makefile.ffmpeg @@ -554,8 +554,8 @@ endif ifeq (yes,$(CONFIG_VAAPI)) EXTLIBS += vaapi -ENCODERS += h264_vaapi hevc_vaapi -HWACCELS += mpeg2_vaapi h264_vaapi hevc_vaapi +ENCODERS += h264_vaapi hevc_vaapi vp8_vaapi +HWACCELS += mpeg2_vaapi h264_vaapi hevc_vaapi vp9_vaapi FILTERS += deinterlace_vaapi scale_vaapi FFMPEG_DIFFS += ffmpeg.vaapi_encode.diff diff --git a/src/transcoding/codec/codec.c b/src/transcoding/codec/codec.c index 6102424ef..bcf58c424 100644 --- a/src/transcoding/codec/codec.c +++ b/src/transcoding/codec/codec.c @@ -61,6 +61,7 @@ extern TVHCodec tvh_codec_libopus; #if ENABLE_VAAPI extern TVHCodec tvh_codec_vaapi_h264; extern TVHCodec tvh_codec_vaapi_hevc; +extern TVHCodec tvh_codec_vaapi_vp8; #endif #if ENABLE_OMX @@ -275,6 +276,7 @@ tvh_codecs_register() #if ENABLE_VAAPI tvh_codec_register(&tvh_codec_vaapi_h264); tvh_codec_register(&tvh_codec_vaapi_hevc); + tvh_codec_register(&tvh_codec_vaapi_vp8); #endif #if ENABLE_OMX diff --git a/src/transcoding/codec/codecs/libs/vaapi.c b/src/transcoding/codec/codecs/libs/vaapi.c index 3d4fc022b..5858c49b6 100644 --- a/src/transcoding/codec/codecs/libs/vaapi.c +++ b/src/transcoding/codec/codecs/libs/vaapi.c @@ -262,3 +262,45 @@ TVHVideoCodec tvh_codec_vaapi_hevc = { .profiles = vaapi_hevc_profiles, .profile_init = tvh_codec_profile_video_init, }; + + +/* vp8_vaapi =============================================================== */ + +static const AVProfile vaapi_vp8_profiles[] = { + { FF_PROFILE_UNKNOWN }, +}; + +static int +tvh_codec_profile_vaapi_vp8_open(tvh_codec_profile_vaapi_t *self, + AVDictionary **opts) +{ + // bit_rate or qp + if (self->bit_rate) { + AV_DICT_SET_BIT_RATE(opts, self->bit_rate); + } + else { + AV_DICT_SET_QP(opts, self->qp, 25); + } + // force zero here, until encoder is fixed + AV_DICT_SET_INT(opts, "bf", 0, 0); + return 0; +} + + +static const codec_profile_class_t codec_profile_vaapi_vp8_class = { + { + .ic_super = (idclass_t *)&codec_profile_vaapi_class, + .ic_class = "codec_profile_vaapi_vp8", + .ic_caption = N_("vaapi_vp8") + }, + .open = (codec_profile_open_meth)tvh_codec_profile_vaapi_vp8_open, +}; + + +TVHVideoCodec tvh_codec_vaapi_vp8 = { + .name = "vp8_vaapi", + .size = sizeof(tvh_codec_profile_vaapi_t), + .idclass = &codec_profile_vaapi_vp8_class, + .profiles = vaapi_vp8_profiles, + .profile_init = tvh_codec_profile_video_init, +}; diff --git a/src/transcoding/transcode/hwaccels/vaapi.c b/src/transcoding/transcode/hwaccels/vaapi.c index b5c896c56..b316c2681 100644 --- a/src/transcoding/transcode/hwaccels/vaapi.c +++ b/src/transcoding/transcode/hwaccels/vaapi.c @@ -196,6 +196,34 @@ tvhva_context_profile(TVHVAContext *self, AVCodecContext *avctx) break; } break; + case AV_CODEC_ID_VP8: + switch (avctx->profile) { + case FF_PROFILE_UNKNOWN: + check = VAProfileVP8Version0_3; + break; + default: + break; + } + break; + case AV_CODEC_ID_VP9: + switch (avctx->profile) { + case FF_PROFILE_UNKNOWN: + case FF_PROFILE_VP9_0: + check = VAProfileVP9Profile0; + break; + case FF_PROFILE_VP9_1: + check = VAProfileVP9Profile1; + break; + case FF_PROFILE_VP9_2: + check = VAProfileVP9Profile2; + break; + case FF_PROFILE_VP9_3: + check = VAProfileVP9Profile3; + break; + default: + break; + } + break; default: break; }