diff --git a/chromium-108-ffmpeg-revert-new-channel-layout-api.patch b/chromium-108-ffmpeg-revert-new-channel-layout-api.patch new file mode 100644 index 0000000..2d49f75 --- /dev/null +++ b/chromium-108-ffmpeg-revert-new-channel-layout-api.patch @@ -0,0 +1,294 @@ +diff -up chromium-108.0.5359.124/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc.revert-new-channel-layout-api chromium-108.0.5359.124/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc +--- chromium-108.0.5359.124/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc.revert-new-channel-layout-api 2022-12-14 01:39:52.000000000 +0100 ++++ chromium-108.0.5359.124/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc 2023-01-04 21:44:23.098276796 +0100 +@@ -74,7 +74,7 @@ void CdmAudioDecoderConfigToAVCodecConte + codec_context->sample_fmt = AV_SAMPLE_FMT_NONE; + } + +- codec_context->ch_layout.nb_channels = config.channel_count; ++ codec_context->channels = config.channel_count; + codec_context->sample_rate = config.samples_per_second; + + if (config.extra_data) { +@@ -124,8 +124,8 @@ void CopySamples(cdm::AudioFormat cdm_fo + case cdm::kAudioFormatPlanarS16: + case cdm::kAudioFormatPlanarF32: { + const int decoded_size_per_channel = +- decoded_audio_size / av_frame.ch_layout.nb_channels; +- for (int i = 0; i < av_frame.ch_layout.nb_channels; ++i) { ++ decoded_audio_size / av_frame.channels; ++ for (int i = 0; i < av_frame.channels; ++i) { + memcpy(output_buffer, av_frame.extended_data[i], + decoded_size_per_channel); + output_buffer += decoded_size_per_channel; +@@ -185,14 +185,13 @@ bool FFmpegCdmAudioDecoder::Initialize( + // Success! + decoding_loop_ = std::make_unique(codec_context_.get()); + samples_per_second_ = config.samples_per_second; +- bytes_per_frame_ = +- codec_context_->ch_layout.nb_channels * config.bits_per_channel / 8; ++ bytes_per_frame_ = codec_context_->channels * config.bits_per_channel / 8; + output_timestamp_helper_ = + std::make_unique(config.samples_per_second); + is_initialized_ = true; + + // Store initial values to guard against midstream configuration changes. +- channels_ = codec_context_->ch_layout.nb_channels; ++ channels_ = codec_context_->channels; + av_sample_format_ = codec_context_->sample_fmt; + + return true; +@@ -292,19 +291,17 @@ cdm::Status FFmpegCdmAudioDecoder::Decod + for (auto& frame : audio_frames) { + int decoded_audio_size = 0; + if (frame->sample_rate != samples_per_second_ || +- frame->ch_layout.nb_channels != channels_ || +- frame->format != av_sample_format_) { ++ frame->channels != channels_ || frame->format != av_sample_format_) { + DLOG(ERROR) << "Unsupported midstream configuration change!" + << " Sample Rate: " << frame->sample_rate << " vs " +- << samples_per_second_ +- << ", Channels: " << frame->ch_layout.nb_channels << " vs " +- << channels_ << ", Sample Format: " << frame->format << " vs " +- << av_sample_format_; ++ << samples_per_second_ << ", Channels: " << frame->channels ++ << " vs " << channels_ << ", Sample Format: " << frame->format ++ << " vs " << av_sample_format_; + return cdm::kDecodeError; + } + + decoded_audio_size = av_samples_get_buffer_size( +- nullptr, codec_context_->ch_layout.nb_channels, frame->nb_samples, ++ nullptr, codec_context_->channels, frame->nb_samples, + codec_context_->sample_fmt, 1); + if (!decoded_audio_size) + continue; +@@ -323,9 +320,9 @@ bool FFmpegCdmAudioDecoder::OnNewFrame( + size_t* total_size, + std::vector>* audio_frames, + AVFrame* frame) { +- *total_size += av_samples_get_buffer_size( +- nullptr, codec_context_->ch_layout.nb_channels, frame->nb_samples, +- codec_context_->sample_fmt, 1); ++ *total_size += av_samples_get_buffer_size(nullptr, codec_context_->channels, ++ frame->nb_samples, ++ codec_context_->sample_fmt, 1); + audio_frames->emplace_back(av_frame_clone(frame)); + return true; + } +diff -up chromium-108.0.5359.124/media/ffmpeg/ffmpeg_common.cc.revert-new-channel-layout-api chromium-108.0.5359.124/media/ffmpeg/ffmpeg_common.cc +--- chromium-108.0.5359.124/media/ffmpeg/ffmpeg_common.cc.revert-new-channel-layout-api 2022-12-14 01:39:52.000000000 +0100 ++++ chromium-108.0.5359.124/media/ffmpeg/ffmpeg_common.cc 2023-01-04 21:52:59.674165082 +0100 +@@ -353,11 +353,9 @@ bool AVCodecContextToAudioDecoderConfig( + codec_context->sample_fmt, codec_context->codec_id); + + ChannelLayout channel_layout = +- codec_context->ch_layout.nb_channels > 8 ++ codec_context->channels > 8 + ? CHANNEL_LAYOUT_DISCRETE +- : ChannelLayoutToChromeChannelLayout( +- codec_context->ch_layout.u.mask, +- codec_context->ch_layout.nb_channels); ++ : ChannelLayoutToChromeChannelLayout(codec_context->channel_layout, codec_context->channels); + + switch (codec) { + // For AC3/EAC3 we enable only demuxing, but not decoding, so FFmpeg does +@@ -409,7 +407,7 @@ bool AVCodecContextToAudioDecoderConfig( + extra_data, encryption_scheme, seek_preroll, + codec_context->delay); + if (channel_layout == CHANNEL_LAYOUT_DISCRETE) +- config->SetChannelsForDiscrete(codec_context->ch_layout.nb_channels); ++ config->SetChannelsForDiscrete(codec_context->channels); + + #if BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO) + // These are bitstream formats unknown to ffmpeg, so they don't have +@@ -478,7 +476,7 @@ void AudioDecoderConfigToAVCodecContext( + + // TODO(scherkus): should we set |channel_layout|? I'm not sure if FFmpeg uses + // said information to decode. +- codec_context->ch_layout.nb_channels = config.channels(); ++ codec_context->channels = config.channels(); + codec_context->sample_rate = config.samples_per_second(); + + if (config.extra_data().empty()) { +diff -up chromium-108.0.5359.124/media/filters/audio_file_reader.cc.revert-new-channel-layout-api chromium-108.0.5359.124/media/filters/audio_file_reader.cc +--- chromium-108.0.5359.124/media/filters/audio_file_reader.cc.revert-new-channel-layout-api 2023-01-04 21:44:23.095276762 +0100 ++++ chromium-108.0.5359.124/media/filters/audio_file_reader.cc 2023-01-04 21:44:23.098276796 +0100 +@@ -113,15 +113,14 @@ bool AudioFileReader::OpenDecoder() { + + // Verify the channel layout is supported by Chrome. Acts as a sanity check + // against invalid files. See http://crbug.com/171962 +- if (ChannelLayoutToChromeChannelLayout( +- codec_context_->ch_layout.u.mask, +- codec_context_->ch_layout.nb_channels) == ++ if (ChannelLayoutToChromeChannelLayout(codec_context_->channel_layout, ++ codec_context_->channels) == + CHANNEL_LAYOUT_UNSUPPORTED) { + return false; + } + + // Store initial values to guard against midstream configuration changes. +- channels_ = codec_context_->ch_layout.nb_channels; ++ channels_ = codec_context_->channels; + audio_codec_ = CodecIDToAudioCodec(codec_context_->codec_id); + sample_rate_ = codec_context_->sample_rate; + av_sample_format_ = codec_context_->sample_fmt; +@@ -224,7 +223,7 @@ bool AudioFileReader::OnNewFrame( + if (frames_read < 0) + return false; + +- const int channels = frame->ch_layout.nb_channels; ++ const int channels = frame->channels; + if (frame->sample_rate != sample_rate_ || channels != channels_ || + frame->format != av_sample_format_) { + DLOG(ERROR) << "Unsupported midstream configuration change!" +diff -up chromium-108.0.5359.124/media/filters/audio_file_reader_unittest.cc.revert-new-channel-layout-api chromium-108.0.5359.124/media/filters/audio_file_reader_unittest.cc +--- chromium-108.0.5359.124/media/filters/audio_file_reader_unittest.cc.revert-new-channel-layout-api 2022-12-14 01:39:52.000000000 +0100 ++++ chromium-108.0.5359.124/media/filters/audio_file_reader_unittest.cc 2023-01-04 21:44:23.098276796 +0100 +@@ -121,11 +121,11 @@ class AudioFileReaderTest : public testi + EXPECT_FALSE(reader_->Open()); + } + +- void RunTestFailingDecode(const char* fn, int expect_read = 0) { ++ void RunTestFailingDecode(const char* fn) { + Initialize(fn); + EXPECT_TRUE(reader_->Open()); + std::vector> decoded_audio_packets; +- EXPECT_EQ(reader_->Read(&decoded_audio_packets), expect_read); ++ EXPECT_EQ(reader_->Read(&decoded_audio_packets), 0); + } + + void RunTestPartialDecode(const char* fn) { +@@ -219,7 +219,7 @@ TEST_F(AudioFileReaderTest, AAC_ADTS) { + } + + TEST_F(AudioFileReaderTest, MidStreamConfigChangesFail) { +- RunTestFailingDecode("midstream_config_change.mp3", 42624); ++ RunTestFailingDecode("midstream_config_change.mp3"); + } + #endif + +diff -up chromium-108.0.5359.124/media/filters/audio_video_metadata_extractor.cc.revert-new-channel-layout-api chromium-108.0.5359.124/media/filters/audio_video_metadata_extractor.cc +--- chromium-108.0.5359.124/media/filters/audio_video_metadata_extractor.cc.revert-new-channel-layout-api 2022-12-14 01:39:52.000000000 +0100 ++++ chromium-108.0.5359.124/media/filters/audio_video_metadata_extractor.cc 2023-01-04 21:44:23.098276796 +0100 +@@ -113,15 +113,6 @@ bool AudioVideoMetadataExtractor::Extrac + if (!stream) + continue; + +- void* display_matrix = +- av_stream_get_side_data(stream, AV_PKT_DATA_DISPLAYMATRIX, nullptr); +- if (display_matrix) { +- rotation_ = VideoTransformation::FromFFmpegDisplayMatrix( +- static_cast(display_matrix)) +- .rotation; +- info.tags["rotate"] = base::NumberToString(rotation_); +- } +- + // Extract dictionary from streams also. Needed for containers that attach + // metadata to contained streams instead the container itself, like OGG. + ExtractDictionary(stream->metadata, &info.tags); +@@ -264,6 +255,8 @@ void AudioVideoMetadataExtractor::Extrac + if (raw_tags->find(tag->key) == raw_tags->end()) + (*raw_tags)[tag->key] = tag->value; + ++ if (ExtractInt(tag, "rotate", &rotation_)) ++ continue; + if (ExtractString(tag, "album", &album_)) + continue; + if (ExtractString(tag, "artist", &artist_)) +diff -up chromium-108.0.5359.124/media/filters/ffmpeg_aac_bitstream_converter.cc.revert-new-channel-layout-api chromium-108.0.5359.124/media/filters/ffmpeg_aac_bitstream_converter.cc +--- chromium-108.0.5359.124/media/filters/ffmpeg_aac_bitstream_converter.cc.revert-new-channel-layout-api 2022-12-14 01:39:52.000000000 +0100 ++++ chromium-108.0.5359.124/media/filters/ffmpeg_aac_bitstream_converter.cc 2023-01-04 21:44:23.099276807 +0100 +@@ -195,15 +195,14 @@ bool FFmpegAACBitstreamConverter::Conver + if (!header_generated_ || codec_ != stream_codec_parameters_->codec_id || + audio_profile_ != stream_codec_parameters_->profile || + sample_rate_index_ != sample_rate_index || +- channel_configuration_ != +- stream_codec_parameters_->ch_layout.nb_channels || ++ channel_configuration_ != stream_codec_parameters_->channels || + frame_length_ != header_plus_packet_size) { + header_generated_ = + GenerateAdtsHeader(stream_codec_parameters_->codec_id, + 0, // layer + stream_codec_parameters_->profile, sample_rate_index, + 0, // private stream +- stream_codec_parameters_->ch_layout.nb_channels, ++ stream_codec_parameters_->channels, + 0, // originality + 0, // home + 0, // copyrighted_stream +@@ -215,7 +214,7 @@ bool FFmpegAACBitstreamConverter::Conver + codec_ = stream_codec_parameters_->codec_id; + audio_profile_ = stream_codec_parameters_->profile; + sample_rate_index_ = sample_rate_index; +- channel_configuration_ = stream_codec_parameters_->ch_layout.nb_channels; ++ channel_configuration_ = stream_codec_parameters_->channels; + frame_length_ = header_plus_packet_size; + } + +diff -up chromium-108.0.5359.124/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc.revert-new-channel-layout-api chromium-108.0.5359.124/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc +--- chromium-108.0.5359.124/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc.revert-new-channel-layout-api 2022-12-14 01:39:52.000000000 +0100 ++++ chromium-108.0.5359.124/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc 2023-01-04 21:44:23.099276807 +0100 +@@ -34,7 +34,7 @@ class FFmpegAACBitstreamConverterTest : + memset(&test_parameters_, 0, sizeof(AVCodecParameters)); + test_parameters_.codec_id = AV_CODEC_ID_AAC; + test_parameters_.profile = FF_PROFILE_AAC_MAIN; +- test_parameters_.ch_layout.nb_channels = 2; ++ test_parameters_.channels = 2; + test_parameters_.extradata = extradata_header_; + test_parameters_.extradata_size = sizeof(extradata_header_); + } +diff -up chromium-108.0.5359.124/media/filters/ffmpeg_audio_decoder.cc.revert-new-channel-layout-api chromium-108.0.5359.124/media/filters/ffmpeg_audio_decoder.cc +--- chromium-108.0.5359.124/media/filters/ffmpeg_audio_decoder.cc.revert-new-channel-layout-api 2022-12-14 01:39:52.000000000 +0100 ++++ chromium-108.0.5359.124/media/filters/ffmpeg_audio_decoder.cc 2023-01-04 21:44:23.099276807 +0100 +@@ -28,7 +28,7 @@ namespace media { + + // Return the number of channels from the data in |frame|. + static inline int DetermineChannels(AVFrame* frame) { +- return frame->ch_layout.nb_channels; ++ return frame->channels; + } + + // Called by FFmpeg's allocation routine to allocate a buffer. Uses +@@ -233,7 +233,7 @@ bool FFmpegAudioDecoder::OnNewFrame(cons + // Translate unsupported into discrete layouts for discrete configurations; + // ffmpeg does not have a labeled discrete configuration internally. + ChannelLayout channel_layout = ChannelLayoutToChromeChannelLayout( +- codec_context_->ch_layout.u.mask, codec_context_->ch_layout.nb_channels); ++ codec_context_->channel_layout, codec_context_->channels); + if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED && + config_.channel_layout() == CHANNEL_LAYOUT_DISCRETE) { + channel_layout = CHANNEL_LAYOUT_DISCRETE; +@@ -350,11 +350,11 @@ bool FFmpegAudioDecoder::ConfigureDecode + // Success! + av_sample_format_ = codec_context_->sample_fmt; + +- if (codec_context_->ch_layout.nb_channels != config.channels()) { ++ if (codec_context_->channels != config.channels()) { + MEDIA_LOG(ERROR, media_log_) + << "Audio configuration specified " << config.channels() + << " channels, but FFmpeg thinks the file contains " +- << codec_context_->ch_layout.nb_channels << " channels"; ++ << codec_context_->channels << " channels"; + ReleaseFFmpegResources(); + state_ = DecoderState::kUninitialized; + return false; +@@ -405,7 +405,7 @@ int FFmpegAudioDecoder::GetAudioBuffer(s + if (frame->nb_samples <= 0) + return AVERROR(EINVAL); + +- if (s->ch_layout.nb_channels != channels) { ++ if (s->channels != channels) { + DLOG(ERROR) << "AVCodecContext and AVFrame disagree on channel count."; + return AVERROR(EINVAL); + } +@@ -438,8 +438,7 @@ int FFmpegAudioDecoder::GetAudioBuffer(s + ChannelLayout channel_layout = + config_.channel_layout() == CHANNEL_LAYOUT_DISCRETE + ? CHANNEL_LAYOUT_DISCRETE +- : ChannelLayoutToChromeChannelLayout(s->ch_layout.u.mask, +- s->ch_layout.nb_channels); ++ : ChannelLayoutToChromeChannelLayout(s->channel_layout, s->channels); + + if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED) { + DLOG(ERROR) << "Unsupported channel layout."; diff --git a/chromium.spec b/chromium.spec index d379f10..8773da5 100644 --- a/chromium.spec +++ b/chromium.spec @@ -1,5 +1,11 @@ %define _lto_cflags %{nil} +# disable the package notes info on f36 +# workaround for linking issue +%if 0%{?fedora} == 36 +%undefine _package_note_file +%endif + %global numjobs 10 %ifarch aarch64 i686 %global numjobs 8 @@ -170,8 +176,13 @@ BuildRequires: libicu-devel >= 5.4 %global bundlelibdrm 0 %global bundlefontconfig 0 %global bundleffmpegfree 0 +# f36 has old libaom +%if 0%{?fedora} == 36 +%global bundlelibaom 1 +%else %global bundlelibaom 0 %endif +%endif ### From 2013 until early 2021, Google permitted distribution builds of ### Chromium to access Google APIs that added significant features to @@ -359,10 +370,13 @@ Patch113: chromium-107.0.5304.110-cstring-memset.patch # system ffmpeg Patch114: chromium-107-ffmpeg-duration.patch Patch115: chromium-107-proprietary-codecs.patch +# drop av_stream_get_first_dts from internal ffmpeg Patch116: chromium-108-ffmpeg-first_dts.patch +# revert new-channel-layout-api on f36, old ffmpeg-free +Patch117: chromium-108-ffmpeg-revert-new-channel-layout-api.patch # clang =< 14 and C++20, linker errors std::u16string -# build failure on rhel +# build failure on rhel and fedora 36 Patch120: chromium-108-clang14-c++20-link-error.patch # VAAPI @@ -993,6 +1007,9 @@ udev. %patch114 -p1 -b .system-ffmppeg %patch115 -p1 -b .prop-codecs %patch116 -p1 -b .first_dts +%if 0%{fedora} == 36 +%patch117 -p1 -b .revert-new-channel-layout-api +%endif %endif # EPEL specific patches @@ -1010,7 +1027,7 @@ udev. %patch110 -p1 -b .el8-aarch64-libpng16-symbol-prefixes %endif -%if 0%{?rhel} +%if 0%{?rhel} || 0%{?fedora} == 36 %patch120 -p1 -b .link-error-clang14 %endif