Force libvpx_vp9 decoder for VP9 videos.

Webm stickers depend on decoder support for alpha channel.
This commit is contained in:
John Preston 2022-01-25 10:22:33 +03:00
parent 545392f90f
commit 91c84d63de
3 changed files with 10 additions and 3 deletions

View file

@ -154,6 +154,13 @@ void FormatDeleter::operator()(AVFormatContext *value) {
}
}
AVCodec *FindDecoder(not_null<AVCodecContext*> 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<AVStream*> stream) {
auto error = AvErrorWrap();
@ -172,7 +179,7 @@ CodecPointer MakeCodecPointer(not_null<AVStream*> 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 {};

View file

@ -158,6 +158,7 @@ using SwscalePointer = std::unique_ptr<SwsContext, SwscaleDeleter>;
void LogError(QLatin1String method);
void LogError(QLatin1String method, FFmpeg::AvErrorWrap error);
[[nodiscard]] AVCodec *FindDecoder(not_null<AVCodecContext*> context);
[[nodiscard]] crl::time PtsToTime(int64_t pts, AVRational timeBase);
// Used for full duration conversion.
[[nodiscard]] crl::time PtsToTimeCeil(int64_t pts, AVRational timeBase);

View file

@ -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);