diff --git a/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp b/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp index b55c73e5ae8..38310d0ae86 100644 --- a/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp +++ b/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp @@ -27,9 +27,14 @@ extern "C" { AUD_NAMESPACE_BEGIN +/* FFmpeg < 4.0 */ #if LIBAVCODEC_VERSION_MAJOR < 58 #define FFMPEG_OLD_CODE #endif +/* FFmpeg < 5.0 */ +#if LIBAVCODEC_VERSION_MAJOR < 59 +#define FFMPEG_OLD_CH_LAYOUT +#endif SampleFormat FFMPEGReader::convertSampleFormat(AVSampleFormat format) { @@ -112,7 +117,13 @@ int FFMPEGReader::decode(AVPacket& packet, Buffer& buffer) if(ret != 0) break; - int data_size = av_samples_get_buffer_size(nullptr, m_codecCtx->channels, m_frame->nb_samples, m_codecCtx->sample_fmt, 1); + #ifdef FFMPEG_OLD_CH_LAYOUT + int channels = m_codecCtx->channels; + #else + int channels = m_codecCtx->ch_layout.nb_channels; + #endif + + int data_size = av_samples_get_buffer_size(nullptr, channels, m_frame->nb_samples, m_codecCtx->sample_fmt, 1); if(buf_size - buf_pos < data_size) { @@ -122,12 +133,12 @@ int FFMPEGReader::decode(AVPacket& packet, Buffer& buffer) if(m_tointerleave) { - int single_size = data_size / m_codecCtx->channels / m_frame->nb_samples; - for(int channel = 0; channel < m_codecCtx->channels; channel++) + int single_size = data_size / channels / m_frame->nb_samples; + for(int channel = 0; channel < channels; channel++) { for(int i = 0; i < m_frame->nb_samples; i++) { - std::memcpy(((data_t*)buffer.getBuffer()) + buf_pos + ((m_codecCtx->channels * i) + channel) * single_size, + std::memcpy(((data_t*)buffer.getBuffer()) + buf_pos + ((channels * i) + channel) * single_size, m_frame->data[channel] + i * single_size, single_size); } } @@ -207,7 +218,12 @@ void FFMPEGReader::init(int stream) if(avcodec_open2(m_codecCtx, aCodec, nullptr) < 0) AUD_THROW(FileException, "File couldn't be read, ffmpeg codec couldn't be opened."); - m_specs.channels = (Channels) m_codecCtx->channels; + #ifdef FFMPEG_OLD_CH_LAYOUT + int channels = m_codecCtx->channels; + #else + int channels = m_codecCtx->ch_layout.nb_channels; + #endif + m_specs.channels = (Channels) channels; m_tointerleave = av_sample_fmt_is_planar(m_codecCtx->sample_fmt); switch(av_get_packed_sample_fmt(m_codecCtx->sample_fmt)) @@ -345,7 +361,12 @@ std::vector FFMPEGReader::queryStreams() info.specs.rate = m_formatCtx->streams[i]->codec->sample_rate; info.specs.format = convertSampleFormat(m_formatCtx->streams[i]->codec->sample_fmt); #else - info.specs.channels = Channels(m_formatCtx->streams[i]->codecpar->channels); + #ifdef FFMPEG_OLD_CH_LAYOUT + int channels = m_formatCtx->streams[i]->codecpar->channels; + #else + int channels = m_formatCtx->streams[i]->codecpar->ch_layout.nb_channels; + #endif + info.specs.channels = Channels(channels); info.specs.rate = m_formatCtx->streams[i]->codecpar->sample_rate; info.specs.format = convertSampleFormat(AVSampleFormat(m_formatCtx->streams[i]->codecpar->format)); #endif diff --git a/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp b/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp index 9cadfe9c092..df3cab46756 100644 --- a/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp +++ b/extern/audaspace/plugins/ffmpeg/FFMPEGWriter.cpp @@ -30,9 +30,14 @@ extern "C" { AUD_NAMESPACE_BEGIN +/* FFmpeg < 4.0 */ #if LIBAVCODEC_VERSION_MAJOR < 58 #define FFMPEG_OLD_CODE #endif +/* FFmpeg < 5.0 */ +#if LIBAVCODEC_VERSION_MAJOR < 59 +#define FFMPEG_OLD_CH_LAYOUT +#endif void FFMPEGWriter::encode() { @@ -77,8 +82,13 @@ void FFMPEGWriter::encode() m_frame->nb_samples = m_input_samples; m_frame->format = m_codecCtx->sample_fmt; +#ifdef FFMPEG_OLD_CH_LAYOUT m_frame->channel_layout = m_codecCtx->channel_layout; m_frame->channels = m_specs.channels; +#else + if(av_channel_layout_copy(&m_frame->ch_layout, &m_codecCtx->ch_layout) < 0) + AUD_THROW(FileException, "File couldn't be written, couldn't copy audio channel layout."); +#endif if(avcodec_fill_audio_frame(m_frame, m_specs.channels, m_codecCtx->sample_fmt, reinterpret_cast(data), m_input_buffer.getSize(), 0) < 0) AUD_THROW(FileException, "File couldn't be written, filling the audio frame failed with ffmpeg."); @@ -405,8 +415,13 @@ FFMPEGWriter::FFMPEGWriter(const std::string &filename, DeviceSpecs specs, Conta m_codecCtx->codec_type = AVMEDIA_TYPE_AUDIO; m_codecCtx->bit_rate = bitrate; +#ifdef FFMPEG_OLD_CH_LAYOUT m_codecCtx->channel_layout = channel_layout; m_codecCtx->channels = m_specs.channels; +#else + av_channel_layout_uninit(&m_codecCtx->ch_layout); + av_channel_layout_from_mask(&m_codecCtx->ch_layout, channel_layout); +#endif m_stream->time_base.num = m_codecCtx->time_base.num = 1; m_stream->time_base.den = m_codecCtx->time_base.den = m_codecCtx->sample_rate; diff --git a/intern/ffmpeg/ffmpeg_compat.h b/intern/ffmpeg/ffmpeg_compat.h index 39eb91defd6..482ec1e6a3d 100644 --- a/intern/ffmpeg/ffmpeg_compat.h +++ b/intern/ffmpeg/ffmpeg_compat.h @@ -40,6 +40,13 @@ # define FFMPEG_INLINE static inline #endif +#if LIBAVUTIL_VERSION_INT < AV_VERSION_INT(58, 29, 100) +/* In ffmpeg 6.1 usage of the "key_frame" variable from "AVFrame" has been deprecated. + * used the new method to query for the "AV_FRAME_FLAG_KEY" flag instead. + */ +# define FFMPEG_OLD_KEY_FRAME_QUERY_METHOD +#endif + #if (LIBAVFORMAT_VERSION_MAJOR < 59) /* For versions older than ffmpeg 5.0, use the old channel layout variables. * We intend to only keep this workaround for around two releases (3.5, 3.6). diff --git a/source/blender/imbuf/intern/anim_movie.cc b/source/blender/imbuf/intern/anim_movie.cc index a9044c2aba2..52788b8c69c 100644 --- a/source/blender/imbuf/intern/anim_movie.cc +++ b/source/blender/imbuf/intern/anim_movie.cc @@ -704,7 +704,11 @@ static void ffmpeg_decode_store_frame_pts(ImBufAnim *anim) { anim->cur_pts = av_get_pts_from_frame(anim->pFrame); +# ifdef FFMPEG_OLD_KEY_FRAME_QUERY_METHOD if (anim->pFrame->key_frame) { +# else + if (anim->pFrame->flags & AV_FRAME_FLAG_KEY) { +# endif anim->cur_key_frame_pts = anim->cur_pts; }