diff --git a/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.cpp b/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.cpp index 9de7265af..866926a9e 100644 --- a/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.cpp +++ b/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.cpp @@ -154,6 +154,13 @@ void FormatDeleter::operator()(AVFormatContext *value) { } } +AVCodec *FindDecoder(not_null context) { + // Force libvpx-vp9, because we need alpha channel support. + return (context->codec_id == AV_CODEC_ID_VP9) + ? avcodec_find_decoder_by_name("libvpx-vp9") + : avcodec_find_decoder(context->codec_id); +} + CodecPointer MakeCodecPointer(not_null stream) { auto error = AvErrorWrap(); @@ -172,7 +179,7 @@ CodecPointer MakeCodecPointer(not_null stream) { av_opt_set(context, "threads", "auto", 0); av_opt_set_int(context, "refcounted_frames", 1, 0); - const auto codec = avcodec_find_decoder(context->codec_id); + const auto codec = FindDecoder(context); if (!codec) { LogError(qstr("avcodec_find_decoder"), context->codec_id); return {}; diff --git a/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.h b/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.h index dd4675b25..401d65dc6 100644 --- a/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.h +++ b/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.h @@ -158,6 +158,7 @@ using SwscalePointer = std::unique_ptr; void LogError(QLatin1String method); void LogError(QLatin1String method, FFmpeg::AvErrorWrap error); +[[nodiscard]] AVCodec *FindDecoder(not_null context); [[nodiscard]] crl::time PtsToTime(int64_t pts, AVRational timeBase); // Used for full duration conversion. [[nodiscard]] crl::time PtsToTimeCeil(int64_t pts, AVRational timeBase); diff --git a/Telegram/SourceFiles/media/clip/media_clip_ffmpeg.cpp b/Telegram/SourceFiles/media/clip/media_clip_ffmpeg.cpp index 2cfb6f4d0..76167428a 100644 --- a/Telegram/SourceFiles/media/clip/media_clip_ffmpeg.cpp +++ b/Telegram/SourceFiles/media/clip/media_clip_ffmpeg.cpp @@ -327,8 +327,7 @@ bool FFMpegReaderImplementation::start(Mode mode, crl::time &positionMs) { _codecContext->pkt_timebase = _fmtContext->streams[_streamId]->time_base; av_opt_set_int(_codecContext, "refcounted_frames", 1, 0); - const auto codec = avcodec_find_decoder(_codecContext->codec_id); - + const auto codec = FFmpeg::FindDecoder(_codecContext); if (_mode == Mode::Inspecting) { const auto audioStreamId = av_find_best_stream(_fmtContext, AVMEDIA_TYPE_AUDIO, -1, -1, nullptr, 0); _hasAudioStream = (audioStreamId >= 0);