From 83bf28a595b14b9078de3edfffae0dbbc82b9d14 Mon Sep 17 00:00:00 2001
From: philippegorley <philippe.gorley@savoirfairelinux.com>
Date: Mon, 12 Aug 2019 11:51:06 -0400
Subject: [PATCH] encoder: fix and re-enable nvdec

Hardware decoders output nv12, but Jami's software encoders want
yuv420p. If using a hardware decoder, make sure the input frames are
yuv420p. If using a hardware encoder, keep the frames as nv12.

Change-Id: I5b20238786104da4ddf25bee061899be18fa0d59
---
 src/media/media_encoder.cpp | 7 +++++--
 src/media/video/accel.cpp   | 3 +--
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/media/media_encoder.cpp b/src/media/media_encoder.cpp
index a9f69a7b13..1f872708d4 100644
--- a/src/media/media_encoder.cpp
+++ b/src/media/media_encoder.cpp
@@ -427,9 +427,12 @@ MediaEncoder::encode(VideoFrame& input, bool is_keyframe, int64_t frame_number)
     } else if (isHardware) {
         // Hardware decoded frame, transfer back to main memory
         // Transfer to GPU if we have a hardware encoder
-        AVPixelFormat pix = (accel_ ? accel_->getSoftwareFormat() : AV_PIX_FMT_YUV420P);
+        // Hardware decoders decode to NV12, but Jami's supported software encoders want YUV420P
+        AVPixelFormat pix = (accel_ ? accel_->getSoftwareFormat() : AV_PIX_FMT_NV12);
         framePtr = video::HardwareAccel::transferToMainMemory(input, pix);
-        if (accel_)
+        if (!accel_)
+            framePtr = scaler_.convertFormat(*framePtr, AV_PIX_FMT_YUV420P);
+        else
             framePtr = accel_->transfer(*framePtr);
         frame = framePtr->pointer();
     } else if (accel_) {
diff --git a/src/media/video/accel.cpp b/src/media/video/accel.cpp
index 9cc9526102..8b015d18b9 100644
--- a/src/media/video/accel.cpp
+++ b/src/media/video/accel.cpp
@@ -261,8 +261,7 @@ std::unique_ptr<HardwareAccel>
 HardwareAccel::setupDecoder(AVCodecID id, int width, int height)
 {
     static const HardwareAPI apiList[] = {
-        // TODO Find out why nvdec decoding doesn't quite work
-        //{ "nvdec", AV_PIX_FMT_CUDA, AV_PIX_FMT_NV12, { AV_CODEC_ID_H264, AV_CODEC_ID_H265, AV_CODEC_ID_VP8, AV_CODEC_ID_MJPEG } },
+        { "nvdec", AV_PIX_FMT_CUDA, AV_PIX_FMT_NV12, { AV_CODEC_ID_H264, AV_CODEC_ID_H265, AV_CODEC_ID_VP8, AV_CODEC_ID_MJPEG } },
         { "vaapi", AV_PIX_FMT_VAAPI, AV_PIX_FMT_NV12, { AV_CODEC_ID_H264, AV_CODEC_ID_MPEG4, AV_CODEC_ID_VP8, AV_CODEC_ID_MJPEG } },
         { "vdpau", AV_PIX_FMT_VDPAU, AV_PIX_FMT_NV12, { AV_CODEC_ID_H264, AV_CODEC_ID_MPEG4 } },
         { "videotoolbox", AV_PIX_FMT_VIDEOTOOLBOX, AV_PIX_FMT_NV12, { AV_CODEC_ID_H264, AV_CODEC_ID_MPEG4 } },
-- 
GitLab