Package: libopenshot Version: 0.3.2+dfsg1-2.1
The source code of libopenshot incompatible with the current version of FFmpeg 7, leading to a crash when trying to compile against it. The attached patch fixes the issues, allowing successful compilation. I am using Ubuntu 24.04 and Debian Unstable.
diff -Nru libopenshot-0.3.2.orig/src/FFmpegReader.cpp libopenshot-0.3.2/src/FFmpegReader.cpp --- libopenshot-0.3.2.orig/src/FFmpegReader.cpp 2023-04-19 18:01:02 +++ libopenshot-0.3.2/src/FFmpegReader.cpp 2024-09-05 14:14:42 @@ -671,8 +671,8 @@ void FFmpegReader::UpdateAudioInfo() { // Set default audio channel layout (if needed) - if (AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->channel_layout == 0) - AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->channel_layout = av_get_default_channel_layout(AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->channels); + if (!av_channel_layout_check(&(AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->ch_layout))) + AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->ch_layout = (AVChannelLayout) AV_CHANNEL_LAYOUT_STEREO; if (info.sample_rate > 0) { // Skip init - if info struct already populated @@ -683,8 +683,10 @@ info.has_audio = true; info.file_size = pFormatCtx->pb ? avio_size(pFormatCtx->pb) : -1; info.acodec = aCodecCtx->codec->name; - info.channels = AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->channels; - info.channel_layout = (ChannelLayout) AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->channel_layout; + + info.channels = AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->ch_layout.nb_channels; + info.channel_layout = (ChannelLayout) AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->ch_layout.u.mask; + info.sample_rate = AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->sample_rate; info.audio_bit_rate = AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->bit_rate; if (info.audio_bit_rate <= 0) { @@ -1593,13 +1595,15 @@ // determine how many samples were decoded int plane_size = -1; - data_size = av_samples_get_buffer_size(&plane_size, - AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->channels, + int nb_channels = AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->ch_layout.nb_channels; + + data_size = av_samples_get_buffer_size(&plane_size, + nb_channels, audio_frame->nb_samples, (AVSampleFormat) (AV_GET_SAMPLE_FORMAT(aStream, aCodecCtx)), 1); // Calculate total number of samples - packet_samples = audio_frame->nb_samples * AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->channels; + packet_samples = audio_frame->nb_samples * nb_channels; } else { if (audio_frame) { // Free audio frame @@ -1662,14 +1666,12 @@ // setup resample context avr = SWR_ALLOC(); - av_opt_set_int(avr, "in_channel_layout", AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->channel_layout, 0); - av_opt_set_int(avr, "out_channel_layout", AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->channel_layout, 0); + av_opt_set_chlayout(avr, "in_chlayout", &AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->ch_layout, 0); + av_opt_set_chlayout(avr, "out_chlayout", &AV_GET_CODEC_ATTRIBUTES(aStream, aCodecCtx)->ch_layout, 0); av_opt_set_int(avr, "in_sample_fmt", AV_GET_SAMPLE_FORMAT(aStream, aCodecCtx), 0); av_opt_set_int(avr, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0); av_opt_set_int(avr, "in_sample_rate", info.sample_rate, 0); av_opt_set_int(avr, "out_sample_rate", info.sample_rate, 0); - av_opt_set_int(avr, "in_channels", info.channels, 0); - av_opt_set_int(avr, "out_channels", info.channels, 0); SWR_INIT(avr); // Convert audio samples diff -Nru libopenshot-0.3.2.orig/src/FFmpegWriter.cpp libopenshot-0.3.2/src/FFmpegWriter.cpp --- libopenshot-0.3.2.orig/src/FFmpegWriter.cpp 2023-04-19 18:01:02 +++ libopenshot-0.3.2/src/FFmpegWriter.cpp 2024-09-05 14:05:58 @@ -1113,7 +1113,6 @@ // Set the sample parameters c->bit_rate = info.audio_bit_rate; - c->channels = info.channels; // Set valid sample rate (or throw error) if (codec->supported_samplerates) { @@ -1132,20 +1131,23 @@ // Set a valid number of channels (or throw error) - const uint64_t channel_layout = info.channel_layout; - if (codec->channel_layouts) { - int i; - for (i = 0; codec->channel_layouts[i] != 0; i++) - if (channel_layout == codec->channel_layouts[i]) { - // Set valid channel layout - c->channel_layout = channel_layout; - break; - } - if (codec->channel_layouts[i] == 0) - throw InvalidChannels("An invalid channel layout was detected (i.e. MONO / STEREO).", path); - } else - // Set valid channel layout - c->channel_layout = channel_layout; + uint64_t channel_layout = info.channel_layout; + // Set a valid number of channels (or throw error) + AVChannelLayout ch_layout; + av_channel_layout_from_mask(&ch_layout, info.channel_layout); + if (codec->ch_layouts) { + int i; + for (i = 0; av_channel_layout_check(&codec->ch_layouts[i]); i++) + if (av_channel_layout_compare(&ch_layout, &codec->ch_layouts[i])) { + // Set valid channel layout + av_channel_layout_copy(&c->ch_layout, &ch_layout); + break; + } + if (!av_channel_layout_check(&codec->ch_layouts[i])) + throw InvalidChannels("An invalid channel layout was detected (i.e. MONO / STEREO).", path); + } else + // Set valid channel layout + av_channel_layout_copy(&c->ch_layout, &ch_layout); // Choose a valid sample_fmt if (codec->sample_fmts) { @@ -1171,13 +1173,22 @@ AV_COPY_PARAMS_FROM_CONTEXT(st, c); +int nb_channels; +const char* nb_channels_label; +const char* channel_layout_label; + +nb_channels = c->ch_layout.nb_channels; +channel_layout = c->ch_layout.u.mask; +nb_channels_label = "c->ch_layout.nb_channels"; +channel_layout_label = "c->ch_layout.u.mask"; + ZmqLogger::Instance()->AppendDebugMethod( "FFmpegWriter::add_audio_stream", "c->codec_id", c->codec_id, "c->bit_rate", c->bit_rate, - "c->channels", c->channels, + nb_channels_label, nb_channels, "c->sample_fmt", c->sample_fmt, - "c->channel_layout", c->channel_layout, + channel_layout_label, channel_layout, "c->sample_rate", c->sample_rate); return st; @@ -1878,9 +1889,7 @@ // Create output frame (and allocate arrays) frame_final->nb_samples = audio_input_frame_size; - frame_final->channels = info.channels; - frame_final->format = audio_codec_ctx->sample_fmt; - frame_final->channel_layout = info.channel_layout; + av_channel_layout_from_mask(&frame_final->ch_layout, info.channel_layout); av_samples_alloc(frame_final->data, frame_final->linesize, info.channels, frame_final->nb_samples, audio_codec_ctx->sample_fmt, 0); @@ -1929,7 +1938,8 @@ frame_final->nb_samples = audio_input_frame_size; // Fill the final_frame AVFrame with audio (non planar) - avcodec_fill_audio_frame(frame_final, audio_codec_ctx->channels, + int nb_channels = audio_codec_ctx->ch_layout.nb_channels; + avcodec_fill_audio_frame(frame_final, nb_channels, audio_codec_ctx->sample_fmt, (uint8_t *) final_samples, audio_encoder_buffer_size, 0); }