diff --git a/src/media/media_encoder.cpp b/src/media/media_encoder.cpp index a9f69a7b13f8b4d1c433ec44efbbb3ab50eea9cf..1f872708d4c044778571956ce4ad645dd54852f9 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 9cc952610265cab4d022b7bb7b3350f794f7144e..8b015d18b90b277786435dce521db4a3d992f6d2 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 } },