aboutsummaryrefslogtreecommitdiffstats
path: root/testing/dsp/ffmpeg5.patch
diff options
context:
space:
mode:
Diffstat (limited to 'testing/dsp/ffmpeg5.patch')
-rw-r--r--testing/dsp/ffmpeg5.patch177
1 files changed, 0 insertions, 177 deletions
diff --git a/testing/dsp/ffmpeg5.patch b/testing/dsp/ffmpeg5.patch
deleted file mode 100644
index 3d4498770e2..00000000000
--- a/testing/dsp/ffmpeg5.patch
+++ /dev/null
@@ -1,177 +0,0 @@
-Patch-Source: https://github.com/bmc0/dsp/commit/f3ac94b546361260349edeea5f1ee0ce7fac322a
-From f3ac94b546361260349edeea5f1ee0ce7fac322a Mon Sep 17 00:00:00 2001
-From: Michael Barbour <barbour.michael.0@gmail.com>
-Date: Thu, 17 Feb 2022 21:50:55 -0500
-Subject: [PATCH] ffmpeg.c: FFmpeg 5.0 fixes.
-
-Turns out that I didn't read the documentation very carefully when writing
-the ffmpeg_seek() code. AVStream->cur_dts was never part of the public API.
-
-av_register_all() has been deprecated since FFmpeg 4.0 and was removed in
-FFmpeg 5.0.
----
- ffmpeg.c | 97 +++++++++++++++++++++++++++++++-------------------------
- 1 file changed, 53 insertions(+), 44 deletions(-)
-
-diff --git a/ffmpeg.c b/ffmpeg.c
-index 9ac5bef..42c5a66 100644
---- a/ffmpeg.c
-+++ b/ffmpeg.c
-@@ -1,5 +1,6 @@
- #include <stdlib.h>
- #include <stdio.h>
-+#include <stdint.h>
- #include <libavcodec/avcodec.h>
- #include <libavformat/avformat.h>
- #include <libavutil/mathematics.h>
-@@ -14,10 +15,11 @@ struct ffmpeg_state {
- void (*readp_func)(char **, sample_t *, int, ssize_t, ssize_t);
- int planar, bytes, stream_index, got_frame;
- ssize_t frame_pos;
-+ int64_t last_ts;
- };
-
- static const char codec_name[] = "ffmpeg";
--static int av_registered = 0;
-+static int av_initialized = 0;
-
- /* Planar sample conversion functions */
-
-@@ -81,45 +83,58 @@ static void read_buf_doublep(char **in, sample_t *out, int channels, ssize_t sta
- }
- }
-
-+static int get_new_frame(struct ffmpeg_state *state)
-+{
-+ AVPacket packet;
-+ int r;
-+ if (state->got_frame)
-+ av_frame_unref(state->frame);
-+ state->got_frame = 0;
-+ state->frame_pos = 0;
-+ retry:
-+ if ((r = avcodec_receive_frame(state->cc, state->frame)) < 0) {
-+ switch (r) {
-+ case AVERROR_EOF:
-+ return -1;
-+ case AVERROR(EAGAIN):
-+ skip_packet:
-+ if (av_read_frame(state->container, &packet) < 0) {
-+ avcodec_send_packet(state->cc, NULL); /* send flush packet */
-+ goto retry;
-+ }
-+ if (packet.stream_index != state->stream_index) {
-+ av_packet_unref(&packet);
-+ goto skip_packet;
-+ }
-+ state->last_ts = (packet.pts == AV_NOPTS_VALUE) ? packet.dts : packet.pts;
-+ if (avcodec_send_packet(state->cc, &packet) < 0)
-+ return 1; /* FIXME: handle decoding errors more intelligently */
-+ av_packet_unref(&packet);
-+ break;
-+ default:
-+ return 1; /* FIXME: handle decoding errors more intelligently */
-+ }
-+ }
-+ state->got_frame = 1;
-+ return 0;
-+}
-+
- ssize_t ffmpeg_read(struct codec *c, sample_t *buf, ssize_t frames)
- {
- struct ffmpeg_state *state = (struct ffmpeg_state *) c->data;
-- AVPacket packet;
- int r, done = 0; /* set to 1 at EOF */
- ssize_t buf_pos = 0, avail = 0;
- if (state->got_frame)
- avail = state->frame->nb_samples - state->frame_pos;
- while (buf_pos < frames && !(done && avail == 0)) {
- if (avail == 0) {
-- if (state->got_frame)
-- av_frame_unref(state->frame);
-- state->got_frame = 0;
-- state->frame_pos = 0;
-- retry:
-- if ((r = avcodec_receive_frame(state->cc, state->frame)) < 0) {
-- switch (r) {
-- case AVERROR_EOF:
-- done = 1;
-- continue;
-- case AVERROR(EAGAIN):
-- skip_packet:
-- if (av_read_frame(state->container, &packet) < 0) {
-- avcodec_send_packet(state->cc, NULL); /* send flush packet */
-- goto retry;
-- }
-- if (packet.stream_index != state->stream_index) {
-- av_packet_unref(&packet);
-- goto skip_packet;
-- }
-- if (avcodec_send_packet(state->cc, &packet) < 0)
-- return 0; /* FIXME: handle decoding errors more intelligently */
-- av_packet_unref(&packet);
-- break;
-- default:
-- return 0; /* FIXME: handle decoding errors more intelligently */
-- }
-+ r = get_new_frame(state);
-+ if (r < 0) {
-+ done = 1;
-+ continue;
- }
-- state->got_frame = 1;
-+ else if (r > 0)
-+ return 0;
- }
- if (state->got_frame) {
- avail = (avail > frames - buf_pos) ? frames - buf_pos : avail;
-@@ -145,8 +160,7 @@ ssize_t ffmpeg_write(struct codec *c, sample_t *buf, ssize_t frames)
- ssize_t ffmpeg_seek(struct codec *c, ssize_t pos)
- {
- AVStream *st;
-- int64_t timestamp;
-- int seek_flags = 0;
-+ int64_t seek_ts;
- struct ffmpeg_state *state = (struct ffmpeg_state *) c->data;
- if (c->frames == -1)
- return -1;
-@@ -155,16 +169,12 @@ ssize_t ffmpeg_seek(struct codec *c, ssize_t pos)
- else if (pos >= c->frames)
- pos = c->frames - 1;
- st = state->container->streams[state->stream_index];
-- timestamp = av_rescale(pos, st->time_base.den, st->time_base.num) / c->fs;
-- if (timestamp < st->cur_dts)
-- seek_flags |= AVSEEK_FLAG_BACKWARD;
-- if (av_seek_frame(state->container, state->stream_index, timestamp, seek_flags) < 0)
-+ seek_ts = av_rescale(pos, st->time_base.den, st->time_base.num) / c->fs;
-+ if (avformat_seek_file(state->container, state->stream_index, INT64_MIN, seek_ts, INT64_MAX, 0) < 0)
- return -1;
- avcodec_flush_buffers(state->cc);
-- if (state->got_frame)
-- av_frame_unref(state->frame);
-- state->got_frame = 0;
-- pos = av_rescale(st->cur_dts, st->time_base.num * c->fs, st->time_base.den);
-+ get_new_frame(state);
-+ pos = av_rescale(state->last_ts, st->time_base.num * c->fs, st->time_base.den);
- return pos;
- }
-
-@@ -199,15 +209,14 @@ struct codec * ffmpeg_codec_init(const char *path, const char *type, const char
- struct ffmpeg_state *state = NULL;
- struct codec *c = NULL;
- AVStream *st;
-- AVCodec *codec = NULL;
-+ const AVCodec *codec = NULL;
-
-- if (!av_registered) {
-+ if (!av_initialized) {
- if (LOGLEVEL(LL_VERBOSE))
- av_log_set_level(AV_LOG_VERBOSE);
- else if (LOGLEVEL(LL_SILENT))
- av_log_set_level(AV_LOG_QUIET);
-- av_register_all();
-- av_registered = 1;
-+ av_initialized = 1;
- }
-
- /* open input and find stream info */