void-packages/srcpkgs/ffms2/patches/ffmpeg5.patch

425 lines
18 KiB
Diff

From 45673149e9a2f5586855ad472e3059084eaa36b1 Mon Sep 17 00:00:00 2001
From: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Date: Tue, 4 May 2021 14:41:21 +0100
Subject: [PATCH] Use auto for AVCodec
The geniuses over at FFmpeg decided to constify this API, so old
versions of the library will return AVCodec *, while new versions
of the libary will return const AVCodec *, which, in C++, are not
OK to convert between.
Rather than use some macro hell in ffmscompat.h, we can work around
this by using auto.
Gross.
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
---
src/core/audiosource.cpp | 2 +-
src/core/indexing.cpp | 6 +++---
src/core/videosource.cpp | 2 +-
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/core/audiosource.cpp b/src/core/audiosource.cpp
index e4ce97c..ac09666 100644
--- a/src/core/audiosource.cpp
+++ b/src/core/audiosource.cpp
@@ -469,7 +469,7 @@ void FFMS_AudioSource::OpenFile() {
LAVFOpenFile(SourceFile.c_str(), FormatContext, TrackNumber);
- AVCodec *Codec = avcodec_find_decoder(FormatContext->streams[TrackNumber]->codecpar->codec_id);
+ auto *Codec = avcodec_find_decoder(FormatContext->streams[TrackNumber]->codecpar->codec_id);
if (Codec == nullptr)
throw FFMS_Exception(FFMS_ERROR_DECODING, FFMS_ERROR_CODEC,
"Audio codec not found");
diff --git a/src/core/indexing.cpp b/src/core/indexing.cpp
index e547c5a..59fb4e8 100644
--- a/src/core/indexing.cpp
+++ b/src/core/indexing.cpp
@@ -384,7 +384,7 @@ FFMS_TrackType FFMS_Indexer::GetTrackType(int Track) {
}
const char *FFMS_Indexer::GetTrackCodec(int Track) {
- AVCodec *codec = avcodec_find_decoder(FormatContext->streams[Track]->codecpar->codec_id);
+ auto *codec = avcodec_find_decoder(FormatContext->streams[Track]->codecpar->codec_id);
return codec ? codec->name : nullptr;
}
@@ -402,7 +402,7 @@ FFMS_Index *FFMS_Indexer::DoIndexing() {
UseDTS);
if (IndexMask.count(i) && FormatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
- AVCodec *VideoCodec = avcodec_find_decoder(FormatContext->streams[i]->codecpar->codec_id);
+ auto *VideoCodec = avcodec_find_decoder(FormatContext->streams[i]->codecpar->codec_id);
if (!VideoCodec) {
FormatContext->streams[i]->discard = AVDISCARD_ALL;
IndexMask.erase(i);
@@ -433,7 +433,7 @@ FFMS_Index *FFMS_Indexer::DoIndexing() {
IndexMask.insert(i);
}
} else if (IndexMask.count(i) && FormatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
- AVCodec *AudioCodec = avcodec_find_decoder(FormatContext->streams[i]->codecpar->codec_id);
+ auto *AudioCodec = avcodec_find_decoder(FormatContext->streams[i]->codecpar->codec_id);
if (AudioCodec == nullptr)
throw FFMS_Exception(FFMS_ERROR_CODEC, FFMS_ERROR_UNSUPPORTED,
"Audio codec not found");
diff --git a/src/core/videosource.cpp b/src/core/videosource.cpp
index b889970..8956c22 100644
--- a/src/core/videosource.cpp
+++ b/src/core/videosource.cpp
@@ -171,7 +171,7 @@ FFMS_VideoSource::FFMS_VideoSource(const char *SourceFile, FFMS_Index &Index, in
LAVFOpenFile(SourceFile, FormatContext, VideoTrack);
- AVCodec *Codec = avcodec_find_decoder(FormatContext->streams[VideoTrack]->codecpar->codec_id);
+ auto *Codec = avcodec_find_decoder(FormatContext->streams[VideoTrack]->codecpar->codec_id);
if (Codec == nullptr)
throw FFMS_Exception(FFMS_ERROR_DECODING, FFMS_ERROR_CODEC,
"Video codec not found");
--
2.40.0
From 96cbf38ea9381829a1314f432a2c60495dcefaad Mon Sep 17 00:00:00 2001
From: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Date: Tue, 4 May 2021 14:12:41 +0100
Subject: [PATCH] all: Update AVPacket API usage
AVPackets must all be on the heap now, since it is no longer
part of the libav* ABI.
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
---
src/core/audiosource.cpp | 16 ++++++----
src/core/indexing.cpp | 63 ++++++++++++++++++++++------------------
src/core/indexing.h | 4 +--
src/core/utils.cpp | 6 ----
src/core/utils.h | 1 -
src/core/videosource.cpp | 30 ++++++++++---------
6 files changed, 64 insertions(+), 56 deletions(-)
diff --git a/src/core/audiosource.cpp b/src/core/audiosource.cpp
index 37cf9ae..e4ce97c 100644
--- a/src/core/audiosource.cpp
+++ b/src/core/audiosource.cpp
@@ -285,10 +285,15 @@ FFMS_AudioSource::AudioBlock *FFMS_AudioSource::CacheBlock(CacheIterator &pos) {
int FFMS_AudioSource::DecodeNextBlock(CacheIterator *pos) {
CurrentFrame = &Frames[PacketNumber];
- AVPacket Packet;
- if (!ReadPacket(&Packet))
+ AVPacket *Packet = av_packet_alloc();
+ if (!Packet)
+ throw FFMS_Exception(FFMS_ERROR_PARSER, FFMS_ERROR_ALLOCATION_FAILED,
+ "Could not allocate packet.");
+ if (!ReadPacket(Packet)) {
+ av_packet_free(&Packet);
throw FFMS_Exception(FFMS_ERROR_PARSER, FFMS_ERROR_UNKNOWN,
"ReadPacket unexpectedly failed to read a packet");
+ }
// ReadPacket may have changed the packet number
CurrentFrame = &Frames[PacketNumber];
@@ -297,8 +302,9 @@ int FFMS_AudioSource::DecodeNextBlock(CacheIterator *pos) {
int NumberOfSamples = 0;
AudioBlock *CachedBlock = nullptr;
- int Ret = avcodec_send_packet(CodecContext, &Packet);
- av_packet_unref(&Packet);
+ int Ret = avcodec_send_packet(CodecContext, Packet);
+ av_packet_unref(Packet);
+ av_packet_free(&Packet);
av_frame_unref(DecodeFrame);
Ret = avcodec_receive_frame(CodecContext, DecodeFrame);
@@ -513,8 +519,6 @@ void FFMS_AudioSource::Seek() {
}
bool FFMS_AudioSource::ReadPacket(AVPacket *Packet) {
- InitNullPacket(*Packet);
-
while (av_read_frame(FormatContext, Packet) >= 0) {
if (Packet->stream_index == TrackNumber) {
// Required because not all audio packets, especially in ogg, have a pts. Use the previous valid packet's pts instead.
diff --git a/src/core/indexing.cpp b/src/core/indexing.cpp
index 23fb95b..e547c5a 100644
--- a/src/core/indexing.cpp
+++ b/src/core/indexing.cpp
@@ -320,7 +320,7 @@ void FFMS_Indexer::CheckAudioProperties(int Track, AVCodecContext *Context) {
}
}
-void FFMS_Indexer::ParseVideoPacket(SharedAVContext &VideoContext, AVPacket &pkt, int *RepeatPict,
+void FFMS_Indexer::ParseVideoPacket(SharedAVContext &VideoContext, AVPacket *pkt, int *RepeatPict,
int *FrameType, bool *Invisible, enum AVPictureStructure *LastPicStruct) {
if (VideoContext.Parser) {
uint8_t *OB;
@@ -330,8 +330,8 @@ void FFMS_Indexer::ParseVideoPacket(SharedAVContext &VideoContext, AVPacket &pkt
av_parser_parse2(VideoContext.Parser,
VideoContext.CodecContext,
&OB, &OBSize,
- pkt.data, pkt.size,
- pkt.pts, pkt.dts, pkt.pos);
+ pkt->data, pkt->size,
+ pkt->pts, pkt->dts, pkt->pos);
// H.264 (PAFF) and HEVC may have one field per packet, so we need to track
// when we have a full or half frame available, and mark one of them as
@@ -351,15 +351,15 @@ void FFMS_Indexer::ParseVideoPacket(SharedAVContext &VideoContext, AVPacket &pkt
*RepeatPict = VideoContext.Parser->repeat_pict;
*FrameType = VideoContext.Parser->pict_type;
- *Invisible = (IncompleteFrame || VideoContext.Parser->repeat_pict < 0 || (pkt.flags & AV_PKT_FLAG_DISCARD));
+ *Invisible = (IncompleteFrame || VideoContext.Parser->repeat_pict < 0 || (pkt->flags & AV_PKT_FLAG_DISCARD));
} else {
- *Invisible = !!(pkt.flags & AV_PKT_FLAG_DISCARD);
+ *Invisible = !!(pkt->flags & AV_PKT_FLAG_DISCARD);
}
if (VideoContext.CodecContext->codec_id == AV_CODEC_ID_VP8)
- ParseVP8(pkt.data[0], Invisible, FrameType);
+ ParseVP8(pkt->data[0], Invisible, FrameType);
else if (VideoContext.CodecContext->codec_id == AV_CODEC_ID_VP9)
- ParseVP9(pkt.data[0], Invisible, FrameType);
+ ParseVP9(pkt->data[0], Invisible, FrameType);
}
void FFMS_Indexer::Free() {
@@ -458,32 +458,36 @@ FFMS_Index *FFMS_Indexer::DoIndexing() {
}
}
- AVPacket Packet;
- InitNullPacket(Packet);
+ AVPacket *Packet = av_packet_alloc();
+ if (!Packet)
+ throw FFMS_Exception(FFMS_ERROR_CODEC, FFMS_ERROR_ALLOCATION_FAILED,
+ "Could not allocate packet.");
std::vector<int64_t> LastValidTS(FormatContext->nb_streams, AV_NOPTS_VALUE);
int64_t filesize = avio_size(FormatContext->pb);
enum AVPictureStructure LastPicStruct = AV_PICTURE_STRUCTURE_UNKNOWN;
- while (av_read_frame(FormatContext, &Packet) >= 0) {
+ while (av_read_frame(FormatContext, Packet) >= 0) {
// Update progress
// FormatContext->pb can apparently be NULL when opening images.
if (IC && FormatContext->pb) {
- if ((*IC)(FormatContext->pb->pos, filesize, ICPrivate))
+ if ((*IC)(FormatContext->pb->pos, filesize, ICPrivate)) {
+ av_packet_free(&Packet);
throw FFMS_Exception(FFMS_ERROR_CANCELLED, FFMS_ERROR_USER,
"Cancelled by user");
+ }
}
- if (!IndexMask.count(Packet.stream_index)) {
- av_packet_unref(&Packet);
+ if (!IndexMask.count(Packet->stream_index)) {
+ av_packet_unref(Packet);
continue;
}
- int Track = Packet.stream_index;
+ int Track = Packet->stream_index;
FFMS_Track &TrackInfo = (*TrackIndices)[Track];
- bool KeyFrame = !!(Packet.flags & AV_PKT_FLAG_KEY);
+ bool KeyFrame = !!(Packet->flags & AV_PKT_FLAG_KEY);
ReadTS(Packet, LastValidTS[Track], (*TrackIndices)[Track].UseDTS);
if (FormatContext->streams[Track]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
- int64_t PTS = TrackInfo.UseDTS ? Packet.dts : Packet.pts;
+ int64_t PTS = TrackInfo.UseDTS ? Packet->dts : Packet->pts;
if (PTS == AV_NOPTS_VALUE) {
// VPx alt-refs are output as packets which lack timestmps or durations, since
// they are invisible. Currently, the timestamp mangling code in libavformat
@@ -495,9 +499,11 @@ FFMS_Index *FFMS_Indexer::DoIndexing() {
// FFMS2 currently sorts packets by PTS, which will break decoding, otherwise.
bool HasAltRefs = (FormatContext->streams[Track]->codecpar->codec_id == AV_CODEC_ID_VP8 ||
FormatContext->streams[Track]->codecpar->codec_id == AV_CODEC_ID_VP9);
- if (Packet.duration == 0 && !HasAltRefs)
+ if (Packet->duration == 0 && !HasAltRefs) {
+ av_packet_free(&Packet);
throw FFMS_Exception(FFMS_ERROR_INDEXING, FFMS_ERROR_PARSER,
"Invalid packet pts, dts, and duration");
+ }
if (TrackInfo.empty())
PTS = 0;
@@ -513,7 +519,7 @@ FFMS_Index *FFMS_Indexer::DoIndexing() {
ParseVideoPacket(AVContexts[Track], Packet, &RepeatPict, &FrameType, &Invisible, &LastPicStruct);
TrackInfo.AddVideoFrame(PTS, RepeatPict, KeyFrame,
- FrameType, Packet.pos, Invisible);
+ FrameType, Packet->pos, Invisible);
} else if (FormatContext->streams[Track]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
// For video seeking timestamps are used only if all packets have
// timestamps, while for audio they're used if any have timestamps,
@@ -522,28 +528,29 @@ FFMS_Index *FFMS_Indexer::DoIndexing() {
TrackInfo.HasTS = true;
int64_t StartSample = AVContexts[Track].CurrentSample;
- uint32_t SampleCount = IndexAudioPacket(Track, &Packet, AVContexts[Track], *TrackIndices);
+ uint32_t SampleCount = IndexAudioPacket(Track, Packet, AVContexts[Track], *TrackIndices);
TrackInfo.SampleRate = AVContexts[Track].CodecContext->sample_rate;
TrackInfo.AddAudioFrame(LastValidTS[Track],
- StartSample, SampleCount, KeyFrame, Packet.pos, Packet.flags & AV_PKT_FLAG_DISCARD);
+ StartSample, SampleCount, KeyFrame, Packet->pos, Packet->flags & AV_PKT_FLAG_DISCARD);
}
- if (!(Packet.flags & AV_PKT_FLAG_DISCARD))
- TrackInfo.LastDuration = Packet.duration;
+ if (!(Packet->flags & AV_PKT_FLAG_DISCARD))
+ TrackInfo.LastDuration = Packet->duration;
- av_packet_unref(&Packet);
+ av_packet_unref(Packet);
}
+ av_packet_free(&Packet);
TrackIndices->Finalize(AVContexts, FormatContext->iformat->name);
return TrackIndices.release();
}
-void FFMS_Indexer::ReadTS(const AVPacket &Packet, int64_t &TS, bool &UseDTS) {
- if (!UseDTS && Packet.pts != AV_NOPTS_VALUE)
- TS = Packet.pts;
+void FFMS_Indexer::ReadTS(const AVPacket *Packet, int64_t &TS, bool &UseDTS) {
+ if (!UseDTS && Packet->pts != AV_NOPTS_VALUE)
+ TS = Packet->pts;
if (TS == AV_NOPTS_VALUE)
UseDTS = true;
- if (UseDTS && Packet.dts != AV_NOPTS_VALUE)
- TS = Packet.dts;
+ if (UseDTS && Packet->dts != AV_NOPTS_VALUE)
+ TS = Packet->dts;
}
diff --git a/src/core/indexing.h b/src/core/indexing.h
index 3cfc3c3..5c06868 100644
--- a/src/core/indexing.h
+++ b/src/core/indexing.h
@@ -80,10 +80,10 @@ private:
int64_t Filesize;
uint8_t Digest[20];
- void ReadTS(const AVPacket &Packet, int64_t &TS, bool &UseDTS);
+ void ReadTS(const AVPacket *Packet, int64_t &TS, bool &UseDTS);
void CheckAudioProperties(int Track, AVCodecContext *Context);
uint32_t IndexAudioPacket(int Track, AVPacket *Packet, SharedAVContext &Context, FFMS_Index &TrackIndices);
- void ParseVideoPacket(SharedAVContext &VideoContext, AVPacket &pkt, int *RepeatPict, int *FrameType, bool *Invisible, enum AVPictureStructure *LastPicStruct);
+ void ParseVideoPacket(SharedAVContext &VideoContext, AVPacket *pkt, int *RepeatPict, int *FrameType, bool *Invisible, enum AVPictureStructure *LastPicStruct);
void Free();
public:
FFMS_Indexer(const char *Filename);
diff --git a/src/core/utils.cpp b/src/core/utils.cpp
index ce67533..8a2e997 100644
--- a/src/core/utils.cpp
+++ b/src/core/utils.cpp
@@ -62,12 +62,6 @@ void ClearErrorInfo(FFMS_ErrorInfo *ErrorInfo) {
}
}
-void InitNullPacket(AVPacket &pkt) {
- av_init_packet(&pkt);
- pkt.data = nullptr;
- pkt.size = 0;
-}
-
void FillAP(FFMS_AudioProperties &AP, AVCodecContext *CTX, FFMS_Track &Frames) {
AP.SampleFormat = static_cast<FFMS_SampleFormat>(av_get_packed_sample_fmt(CTX->sample_fmt));
AP.BitsPerSample = av_get_bytes_per_sample(CTX->sample_fmt) * 8;
diff --git a/src/core/utils.h b/src/core/utils.h
index 9819dc7..003ab79 100644
--- a/src/core/utils.h
+++ b/src/core/utils.h
@@ -58,7 +58,6 @@ std::unique_ptr<T> make_unique(Args&&... args) {
}
void ClearErrorInfo(FFMS_ErrorInfo *ErrorInfo);
-void InitNullPacket(AVPacket &pkt);
void FillAP(FFMS_AudioProperties &AP, AVCodecContext *CTX, FFMS_Track &Frames);
void LAVFOpenFile(const char *SourceFile, AVFormatContext *&FormatContext, int Track);
diff --git a/src/core/videosource.cpp b/src/core/videosource.cpp
index 06bd161..b889970 100644
--- a/src/core/videosource.cpp
+++ b/src/core/videosource.cpp
@@ -673,30 +673,34 @@ void FFMS_VideoSource::DecodeNextFrame(int64_t &AStartTime, int64_t &Pos) {
if (HasPendingDelayedFrames())
return;
- AVPacket Packet;
- InitNullPacket(Packet);
-
- while (ReadFrame(&Packet) >= 0) {
- if (Packet.stream_index != VideoTrack) {
- av_packet_unref(&Packet);
+ AVPacket *Packet = av_packet_alloc();
+ if (!Packet)
+ throw FFMS_Exception(FFMS_ERROR_DECODING, FFMS_ERROR_ALLOCATION_FAILED,
+ "Could not allocate packet.");
+
+ while (ReadFrame(Packet) >= 0) {
+ if (Packet->stream_index != VideoTrack) {
+ av_packet_unref(Packet);
continue;
}
if (AStartTime < 0)
- AStartTime = Frames.UseDTS ? Packet.dts : Packet.pts;
+ AStartTime = Frames.UseDTS ? Packet->dts : Packet->pts;
if (Pos < 0)
- Pos = Packet.pos;
+ Pos = Packet->pos;
- bool FrameFinished = DecodePacket(&Packet);
- av_packet_unref(&Packet);
- if (FrameFinished)
+ bool FrameFinished = DecodePacket(Packet);
+ av_packet_unref(Packet);
+ if (FrameFinished) {
+ av_packet_free(&Packet);
return;
+ }
}
// Flush final frames
- InitNullPacket(Packet);
- DecodePacket(&Packet);
+ DecodePacket(Packet);
+ av_packet_free(&Packet);
}
bool FFMS_VideoSource::SeekTo(int n, int SeekOffset) {
--
2.40.0
From bf9e03e9e08534c024e5a744a6437c4aac160201 Mon Sep 17 00:00:00 2001
From: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Date: Tue, 4 May 2021 14:20:47 +0100
Subject: [PATCH 2/3] configure: Remove deprecated API use
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
---
configure.ac | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/configure.ac b/configure.ac
index b35ef80bc..d19714d0f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -102,10 +102,10 @@ CFLAGS="$_CFLAGS $FFMPEG_CFLAGS"
AC_DEFUN([TEST_FFMPEG],
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
- #include <libavcodec/avcodec.h>
+ #include <libavformat/avformat.h>
#include <libswscale/swscale.h>
]],[[
- avcodec_register_all();
+ avformat_network_init();
swscale_version();
]])], [eval $1=yes], [eval $1=no])
])