]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
transcoder: vaapi - add support for vp8 encoder (tested) and vp9 decoder (untested)
authorJaroslav Kysela <perex@perex.cz>
Sun, 3 Sep 2017 18:03:20 +0000 (20:03 +0200)
committerJaroslav Kysela <perex@perex.cz>
Sun, 3 Sep 2017 18:03:20 +0000 (20:03 +0200)
Makefile.ffmpeg
src/transcoding/codec/codec.c
src/transcoding/codec/codecs/libs/vaapi.c
src/transcoding/transcode/hwaccels/vaapi.c

index d94ce6e6b62e99f1deda2d63974a74d6122b1d0a..450014d5e23e362e01e57d0b0fe0a9dd9a978835 100644 (file)
@@ -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
 
index 6102424efc15adc87b86b8553b1de271e24b156c..bcf58c424894694f8440f8c6275547e9b12b5e64 100644 (file)
@@ -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
index 3d4fc022b83767c82a0fee90d5a39fad53e7bf5a..5858c49b644342e9818a9adcb7902bf0d85c2090 100644 (file)
@@ -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,
+};
index b5c896c560cb9fb895816a7bc280ebb2f86727a5..b316c268118dbeb2d5c7c44e47371fbc59328808 100644 (file)
@@ -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;
     }