Added missing files, updated to build2

This commit is contained in:
Martin Stransky 2022-03-04 11:59:22 +01:00
parent 34e2f4991c
commit 12e554d703
7 changed files with 14157 additions and 2 deletions

1
.gitignore vendored
View File

@ -497,3 +497,4 @@ firefox-3.6.4.source.tar.bz2
/firefox-langpacks-97.0.1-20220218.tar.xz
/firefox-98.0.source.tar.xz
/firefox-langpacks-98.0-20220301.tar.xz
/firefox-langpacks-98.0-20220304.tar.xz

13808
D139696.diff Normal file

File diff suppressed because it is too large Load Diff

27
D139697.diff Normal file
View File

@ -0,0 +1,27 @@
diff --git a/dom/media/platforms/ffmpeg/ffmpeg58/moz.build b/dom/media/platforms/ffmpeg/ffmpeg58/moz.build
--- a/dom/media/platforms/ffmpeg/ffmpeg58/moz.build
+++ b/dom/media/platforms/ffmpeg/ffmpeg58/moz.build
@@ -29,9 +29,6 @@
if CONFIG['MOZ_WAYLAND']:
CXXFLAGS += CONFIG['MOZ_GTK3_CFLAGS']
DEFINES['MOZ_WAYLAND_USE_VAAPI'] = 1
- UNIFIED_SOURCES += [
- '../FFmpegVideoFramePool.cpp',
- ]
USE_LIBS += ['mozva']
include("/ipc/chromium/chromium-config.mozbuild")
diff --git a/dom/media/platforms/ffmpeg/ffvpx/moz.build b/dom/media/platforms/ffmpeg/ffvpx/moz.build
--- a/dom/media/platforms/ffmpeg/ffvpx/moz.build
+++ b/dom/media/platforms/ffmpeg/ffvpx/moz.build
@@ -41,6 +41,9 @@
CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"]
DEFINES["MOZ_WAYLAND_USE_VAAPI"] = 1
USE_LIBS += ["mozva"]
+ UNIFIED_SOURCES += [
+ "../FFmpegVideoFramePool.cpp",
+ ]
include("/ipc/chromium/chromium-config.mozbuild")

191
D139698.diff Normal file
View File

@ -0,0 +1,191 @@
diff --git a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
--- a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
@@ -64,14 +64,16 @@
AV_FUNC_56 = 1 << 3,
AV_FUNC_57 = 1 << 4,
AV_FUNC_58 = 1 << 5,
+ AV_FUNC_59 = 1 << 6,
AV_FUNC_AVUTIL_53 = AV_FUNC_53 | AV_FUNC_AVUTIL_MASK,
AV_FUNC_AVUTIL_54 = AV_FUNC_54 | AV_FUNC_AVUTIL_MASK,
AV_FUNC_AVUTIL_55 = AV_FUNC_55 | AV_FUNC_AVUTIL_MASK,
AV_FUNC_AVUTIL_56 = AV_FUNC_56 | AV_FUNC_AVUTIL_MASK,
AV_FUNC_AVUTIL_57 = AV_FUNC_57 | AV_FUNC_AVUTIL_MASK,
AV_FUNC_AVUTIL_58 = AV_FUNC_58 | AV_FUNC_AVUTIL_MASK,
+ AV_FUNC_AVUTIL_59 = AV_FUNC_59 | AV_FUNC_AVUTIL_MASK,
AV_FUNC_AVCODEC_ALL = AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 | AV_FUNC_56 |
- AV_FUNC_57 | AV_FUNC_58,
+ AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59,
AV_FUNC_AVUTIL_ALL = AV_FUNC_AVCODEC_ALL | AV_FUNC_AVUTIL_MASK
};
@@ -94,6 +96,9 @@
case 58:
version = AV_FUNC_58;
break;
+ case 59:
+ version = AV_FUNC_59;
+ break;
default:
FFMPEG_LOG("Unknown avcodec version");
Unlink();
@@ -128,15 +133,19 @@
: LinkResult::MissingLibAVFunction; \
}
- AV_FUNC(av_lockmgr_register, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC(av_lockmgr_register, AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 |
+ AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58)
AV_FUNC(avcodec_alloc_context3, AV_FUNC_AVCODEC_ALL)
AV_FUNC(avcodec_close, AV_FUNC_AVCODEC_ALL)
- AV_FUNC(avcodec_decode_audio4, AV_FUNC_AVCODEC_ALL)
- AV_FUNC(avcodec_decode_video2, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC(avcodec_decode_audio4, AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 |
+ AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58)
+ AV_FUNC(avcodec_decode_video2, AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 |
+ AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58)
AV_FUNC(avcodec_find_decoder, AV_FUNC_AVCODEC_ALL)
AV_FUNC(avcodec_flush_buffers, AV_FUNC_AVCODEC_ALL)
AV_FUNC(avcodec_open2, AV_FUNC_AVCODEC_ALL)
- AV_FUNC(avcodec_register_all, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC(avcodec_register_all, AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 |
+ AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58)
AV_FUNC(av_init_packet, AV_FUNC_AVCODEC_ALL)
AV_FUNC(av_parser_init, AV_FUNC_AVCODEC_ALL)
AV_FUNC(av_parser_close, AV_FUNC_AVCODEC_ALL)
@@ -145,49 +154,56 @@
AV_FUNC(avcodec_alloc_frame, (AV_FUNC_53 | AV_FUNC_54))
AV_FUNC(avcodec_get_frame_defaults, (AV_FUNC_53 | AV_FUNC_54))
AV_FUNC(avcodec_free_frame, AV_FUNC_54)
- AV_FUNC(avcodec_send_packet, AV_FUNC_58)
- AV_FUNC(avcodec_receive_frame, AV_FUNC_58)
+ AV_FUNC(avcodec_send_packet, AV_FUNC_58 | AV_FUNC_59)
+ AV_FUNC(avcodec_receive_frame, AV_FUNC_58 | AV_FUNC_59)
AV_FUNC(avcodec_default_get_buffer2,
- (AV_FUNC_55 | AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58))
+ (AV_FUNC_55 | AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59))
AV_FUNC_OPTION(av_rdft_init, AV_FUNC_AVCODEC_ALL)
AV_FUNC_OPTION(av_rdft_calc, AV_FUNC_AVCODEC_ALL)
AV_FUNC_OPTION(av_rdft_end, AV_FUNC_AVCODEC_ALL)
AV_FUNC(av_log_set_level, AV_FUNC_AVUTIL_ALL)
AV_FUNC(av_malloc, AV_FUNC_AVUTIL_ALL)
AV_FUNC(av_freep, AV_FUNC_AVUTIL_ALL)
- AV_FUNC(av_frame_alloc, (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 |
- AV_FUNC_AVUTIL_57 | AV_FUNC_AVUTIL_58))
- AV_FUNC(av_frame_free, (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 |
- AV_FUNC_AVUTIL_57 | AV_FUNC_AVUTIL_58))
- AV_FUNC(av_frame_unref, (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 |
- AV_FUNC_AVUTIL_57 | AV_FUNC_AVUTIL_58))
+ AV_FUNC(av_frame_alloc,
+ (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 |
+ AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59))
+ AV_FUNC(av_frame_free,
+ (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 |
+ AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59))
+ AV_FUNC(av_frame_unref,
+ (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 |
+ AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59))
AV_FUNC(av_image_check_size, AV_FUNC_AVUTIL_ALL)
AV_FUNC(av_image_get_buffer_size, AV_FUNC_AVUTIL_ALL)
- AV_FUNC_OPTION(av_buffer_get_opaque,
- (AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 | AV_FUNC_AVUTIL_58))
- AV_FUNC(av_buffer_create, (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 |
- AV_FUNC_AVUTIL_57 | AV_FUNC_AVUTIL_58))
+ AV_FUNC_OPTION(av_buffer_get_opaque, (AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 |
+ AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59))
+ AV_FUNC(av_buffer_create,
+ (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 |
+ AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59))
AV_FUNC_OPTION(av_frame_get_colorspace, AV_FUNC_AVUTIL_ALL)
AV_FUNC_OPTION(av_frame_get_color_range, AV_FUNC_AVUTIL_ALL)
#ifdef MOZ_WAYLAND
- AV_FUNC_OPTION_SILENT(avcodec_get_hw_config, AV_FUNC_58)
- AV_FUNC_OPTION_SILENT(av_codec_iterate, AV_FUNC_58)
- AV_FUNC_OPTION_SILENT(av_codec_is_decoder, AV_FUNC_58)
- AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_init, AV_FUNC_58)
- AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_alloc, AV_FUNC_58)
- AV_FUNC_OPTION_SILENT(av_hwdevice_hwconfig_alloc, AV_FUNC_58)
- AV_FUNC_OPTION_SILENT(av_hwdevice_get_hwframe_constraints, AV_FUNC_58)
- AV_FUNC_OPTION_SILENT(av_hwframe_constraints_free, AV_FUNC_58)
- AV_FUNC_OPTION_SILENT(av_buffer_ref, AV_FUNC_AVUTIL_58)
- AV_FUNC_OPTION_SILENT(av_buffer_unref, AV_FUNC_AVUTIL_58)
- AV_FUNC_OPTION_SILENT(av_hwframe_transfer_get_formats, AV_FUNC_58)
- AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_create_derived, AV_FUNC_58)
- AV_FUNC_OPTION_SILENT(av_hwframe_ctx_alloc, AV_FUNC_58)
- AV_FUNC_OPTION_SILENT(av_dict_set, AV_FUNC_58)
- AV_FUNC_OPTION_SILENT(av_dict_free, AV_FUNC_58)
- AV_FUNC_OPTION_SILENT(avcodec_get_name, AV_FUNC_58)
- AV_FUNC_OPTION_SILENT(av_get_pix_fmt_string, AV_FUNC_AVUTIL_58)
+ AV_FUNC_OPTION_SILENT(avcodec_get_hw_config, AV_FUNC_58 | AV_FUNC_59)
+ AV_FUNC_OPTION_SILENT(av_codec_iterate, AV_FUNC_58 | AV_FUNC_59)
+ AV_FUNC_OPTION_SILENT(av_codec_is_decoder, AV_FUNC_58 | AV_FUNC_59)
+ AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_init, AV_FUNC_58 | AV_FUNC_59)
+ AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_alloc, AV_FUNC_58 | AV_FUNC_59)
+ AV_FUNC_OPTION_SILENT(av_hwdevice_hwconfig_alloc, AV_FUNC_58 | AV_FUNC_59)
+ AV_FUNC_OPTION_SILENT(av_hwdevice_get_hwframe_constraints,
+ AV_FUNC_58 | AV_FUNC_59)
+ AV_FUNC_OPTION_SILENT(av_hwframe_constraints_free, AV_FUNC_58 | AV_FUNC_59)
+ AV_FUNC_OPTION_SILENT(av_buffer_ref, AV_FUNC_AVUTIL_58 | AV_FUNC_59)
+ AV_FUNC_OPTION_SILENT(av_buffer_unref, AV_FUNC_AVUTIL_58 | AV_FUNC_59)
+ AV_FUNC_OPTION_SILENT(av_hwframe_transfer_get_formats,
+ AV_FUNC_58 | AV_FUNC_59)
+ AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_create_derived, AV_FUNC_58 | AV_FUNC_59)
+ AV_FUNC_OPTION_SILENT(av_hwframe_ctx_alloc, AV_FUNC_58 | AV_FUNC_59)
+ AV_FUNC_OPTION_SILENT(av_dict_set, AV_FUNC_58 | AV_FUNC_59)
+ AV_FUNC_OPTION_SILENT(av_dict_free, AV_FUNC_58 | AV_FUNC_59)
+ AV_FUNC_OPTION_SILENT(avcodec_get_name, AV_FUNC_58 | AV_FUNC_59)
+ AV_FUNC_OPTION_SILENT(av_get_pix_fmt_string,
+ AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59)
#endif
#undef AV_FUNC
#undef AV_FUNC_OPTION
@@ -219,7 +235,9 @@
# undef VAD_FUNC_OPTION_SILENT
#endif
- avcodec_register_all();
+ if (avcodec_register_all) {
+ avcodec_register_all();
+ }
if (MOZ_LOG_TEST(sPDMLog, LogLevel::Debug)) {
av_log_set_level(AV_LOG_DEBUG);
} else if (MOZ_LOG_TEST(sPDMLog, LogLevel::Info)) {
diff --git a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
--- a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
@@ -27,6 +27,7 @@
static const char* sLibs[] = {
// clang-format off
#if defined(XP_DARWIN)
+ "libavcodec.59.dylib",
"libavcodec.58.dylib",
"libavcodec.57.dylib",
"libavcodec.56.dylib",
@@ -34,6 +35,7 @@
"libavcodec.54.dylib",
"libavcodec.53.dylib",
#else
+ "libavcodec.so.59",
"libavcodec.so.58",
"libavcodec-ffmpeg.so.58",
"libavcodec-ffmpeg.so.57",
@@ -76,7 +78,6 @@
sLinkStatusLibraryName = lib;
return true;
case FFmpegLibWrapper::LinkResult::NoProvidedLib:
- MOZ_ASSERT_UNREACHABLE("Incorrectly-setup sLibAV");
break;
case FFmpegLibWrapper::LinkResult::NoAVCodecVersion:
if (sLinkStatus > LinkStatus_INVALID_CANDIDATE) {
@@ -152,6 +153,9 @@
case 58:
module = FFmpegDecoderModule<58>::Create(&sLibAV);
break;
+ case 59:
+ module = FFmpegDecoderModule<59>::Create(&sLibAV);
+ break;
default:
module = nullptr;
}

127
D139699.diff Normal file
View File

@ -0,0 +1,127 @@
diff --git a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
--- a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
@@ -206,15 +206,49 @@
media::TimeUnit pts = aSample->mTime;
while (packet.size > 0) {
- int decoded;
- int bytesConsumed =
+ int decoded = false;
+ int bytesConsumed = -1;
+#if LIBAVCODEC_VERSION_MAJOR < 59
+ bytesConsumed =
mLib->avcodec_decode_audio4(mCodecContext, mFrame, &decoded, &packet);
-
if (bytesConsumed < 0) {
NS_WARNING("FFmpeg audio decoder error.");
return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
RESULT_DETAIL("FFmpeg audio error:%d", bytesConsumed));
}
+#else
+# define AVERROR_OK 0
+
+ int ret = mLib->avcodec_receive_frame(mCodecContext, mFrame);
+ switch (ret) {
+ case AVERROR_OK:
+ decoded = true;
+ break;
+ case AVERROR(EAGAIN):
+ break;
+ case int(AVERROR_EOF): {
+ FFMPEG_LOG(" End of stream.");
+ return MediaResult(NS_ERROR_DOM_MEDIA_END_OF_STREAM,
+ RESULT_DETAIL("End of stream"));
+ }
+ }
+ ret = mLib->avcodec_send_packet(mCodecContext, &packet);
+ switch (ret) {
+ case AVERROR_OK:
+ bytesConsumed = packet.size;
+ break;
+ case AVERROR(EAGAIN):
+ break;
+ case int(AVERROR_EOF):
+ FFMPEG_LOG(" End of stream.");
+ return MediaResult(NS_ERROR_DOM_MEDIA_END_OF_STREAM,
+ RESULT_DETAIL("End of stream"));
+ default:
+ NS_WARNING("FFmpeg audio decoder error.");
+ return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
+ RESULT_DETAIL("FFmpeg audio error"));
+ }
+#endif
if (decoded) {
if (mFrame->format != AV_SAMPLE_FMT_FLT &&
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
@@ -39,6 +39,9 @@
# define AV_PIX_FMT_YUV444P10LE PIX_FMT_YUV444P10LE
# define AV_PIX_FMT_NONE PIX_FMT_NONE
#endif
+#if LIBAVCODEC_VERSION_MAJOR > 58
+# define AV_PIX_FMT_VAAPI_VLD AV_PIX_FMT_VAAPI
+#endif
#include "mozilla/PodOperations.h"
#include "mozilla/StaticPrefs_media.h"
#include "mozilla/TaskQueue.h"
@@ -766,6 +769,14 @@
}
#endif
+static int64_t GetFramePts(AVFrame* aFrame) {
+#if LIBAVCODEC_VERSION_MAJOR > 58
+ return aFrame->pts;
+#else
+ return aFrame->pkt_pts;
+#endif
+}
+
MediaResult FFmpegVideoDecoder<LIBAV_VER>::DoDecode(
MediaRawData* aSample, uint8_t* aData, int aSize, bool* aGotFrame,
MediaDataDecoder::DecodedData& aResults) {
@@ -831,7 +842,7 @@
MediaResult rv;
# ifdef MOZ_WAYLAND_USE_VAAPI
if (IsHardwareAccelerated()) {
- rv = CreateImageVAAPI(mFrame->pkt_pos, mFrame->pkt_pts,
+ rv = CreateImageVAAPI(mFrame->pkt_pos, GetFramePts(mFrame),
mFrame->pkt_duration, aResults);
// If VA-API playback failed, just quit. Decoder is going to be restarted
// without VA-API.
@@ -844,8 +855,8 @@
} else
# endif
{
- rv = CreateImage(mFrame->pkt_pos, mFrame->pkt_pts, mFrame->pkt_duration,
- aResults);
+ rv = CreateImage(mFrame->pkt_pos, GetFramePts(mFrame),
+ mFrame->pkt_duration, aResults);
}
if (NS_FAILED(rv)) {
return rv;
@@ -879,9 +890,9 @@
"DoDecodeFrame:decode_video: rv=%d decoded=%d "
"(Input: pts(%" PRId64 ") dts(%" PRId64 ") Output: pts(%" PRId64
") "
- "opaque(%" PRId64 ") pkt_pts(%" PRId64 ") pkt_dts(%" PRId64 "))",
+ "opaque(%" PRId64 ") pts(%" PRId64 ") pkt_dts(%" PRId64 "))",
bytesConsumed, decoded, packet.pts, packet.dts, mFrame->pts,
- mFrame->reordered_opaque, mFrame->pkt_pts, mFrame->pkt_dts);
+ mFrame->reordered_opaque, mFrame->pts, mFrame->pkt_dts);
if (bytesConsumed < 0) {
return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
@@ -896,7 +907,8 @@
}
// If we've decoded a frame then we need to output it
- int64_t pts = mPtsContext.GuessCorrectPts(mFrame->pkt_pts, mFrame->pkt_dts);
+ int64_t pts =
+ mPtsContext.GuessCorrectPts(GetFramePts(mFrame), mFrame->pkt_dts);
// Retrieve duration from dts.
// We use the first entry found matching this dts (this is done to
// handle damaged file with multiple frames with the same dts)

View File

@ -1074,6 +1074,7 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
* Wed Mar 2 2022 Martin Stransky <stransky@redhat.com> - 98.0-2
- Added support for ffmpeg 5.0
- Spec tweaks
- Updated to Build 2
* Tue Mar 1 2022 Martin Stransky <stransky@redhat.com> - 98.0-1
- Updated to 98.0

View File

@ -1,4 +1,4 @@
SHA512 (cbindgen-vendor.tar.xz) = b9ab1498be90ecf60822df7021f8812f124550d97f8cd687c69d3ab56fc5fb714bfe88c78c978a1794d211724909a9a5cad6a4b483fa05f762909c45d5075520
SHA512 (mochitest-python.tar.gz) = 18e1aeb475df5fbf1fe3838897d5ac2f3114aa349030713fc2be27af087b1b12f57642621b87bd052f324a7cb7fbae5f36b21502191d85692f62c8cdd69c8bf2
SHA512 (firefox-98.0.source.tar.xz) = e4728316d919cad2c7b9bfc08cd6fa651c0706e14dba1629382ef1e8d723ebf22c6a892f23928ee05d98b9eadfa1c3e3fd803077c64919786c176c5e8d87863a
SHA512 (firefox-langpacks-98.0-20220301.tar.xz) = 54cc19003903da31bdc485eaf208e35759a390c71bb96a10757cbe10fbc65a1524a8d33c071589ee3f949508df66ced7115c0e4203e17bd672672fe303b4a5ee
SHA512 (firefox-98.0.source.tar.xz) = 119005c92b579897c4a9c5b2b9f88ab1e77ad41d05fc8058d3378865f8538870789e5a9bd1066bcbe1662bde1501d9fe8c97c277e2985506f6d5586b6cea4ff2
SHA512 (firefox-langpacks-98.0-20220304.tar.xz) = d736ebdf11848b812073e342906aae86368cf2aa248ad34af98c11bb47cec6820ed805d9ffac81d195dba9e93a348ece50cc54740b4750b7ff32392cdcac028a