aboutsummarylogtreecommitdiffstats
path: root/ffmpeg:7.patch
blob: 8a044876dc2396efc143a014cf0c6d85b4ca3f03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
From c72dbeafffa5b3262e90023e092bb1f9928d7079 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Robert-Andr=C3=A9=20Mauchin?= <zebob.m@gmail.com>
Date: Tue, 14 May 2024 11:03:49 +0200
Subject: [PATCH] Add compatibility with FFMPEG 7.0

key_frame was deprecated then remove, we should use AV_FRAME_FLAG_KEY
instead.

read_seek2 and read_seek were internalized and can't be used anymore, so
we check directly the return of av_seek_frame.
---
 intern/ffmpeg/ffmpeg_compat.h             |  9 +++++++++
 source/blender/imbuf/intern/anim_movie.cc | 11 +++++------
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/intern/ffmpeg/ffmpeg_compat.h b/intern/ffmpeg/ffmpeg_compat.h
index 91ea1701db6..78778482e8d 100644
--- a/intern/ffmpeg/ffmpeg_compat.h
+++ b/intern/ffmpeg/ffmpeg_compat.h
@@ -141,6 +141,15 @@ int64_t av_get_frame_duration_in_pts_units(const AVFrame *picture)
 #endif
 }
 
+FFMPEG_INLINE
+bool av_get_cur_key_frame_pts(const AVFrame *picture) {
+#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(58, 29, 100)
+  return (picture->flags & AV_FRAME_FLAG_KEY);
+#else
+  return (picture->key_frame);
+#endif
+}
+
 /* -------------------------------------------------------------------- */
 /** \name Deinterlace code block
  *
diff --git a/source/blender/imbuf/intern/anim_movie.cc b/source/blender/imbuf/intern/anim_movie.cc
index 3d51969dd46..bb07a8bb14c 100644
--- a/source/blender/imbuf/intern/anim_movie.cc
+++ b/source/blender/imbuf/intern/anim_movie.cc
@@ -653,7 +653,7 @@ static void ffmpeg_decode_store_frame_pts(ImBufAnim *anim)
 {
   anim->cur_pts = av_get_pts_from_frame(anim->pFrame);
 
-  if (anim->pFrame->key_frame) {
+  if (av_get_cur_key_frame_pts(anim->pFrame)) {
     anim->cur_key_frame_pts = anim->cur_pts;
   }
 
@@ -1032,11 +1032,10 @@ static int ffmpeg_seek_to_key_frame(ImBufAnim *anim,
 
     AVFormatContext *format_ctx = anim->pFormatCtx;
 
-    if (format_ctx->iformat->read_seek2 || format_ctx->iformat->read_seek) {
-      ret = av_seek_frame(anim->pFormatCtx, anim->videoStream, seek_pos, AVSEEK_FLAG_BACKWARD);
-    }
-    else {
-      ret = ffmpeg_generic_seek_workaround(anim, &seek_pos, pts_to_search);
+    int ret = av_seek_frame(anim->pFormatCtx, anim->videoStream, seek_pos, AVSEEK_FLAG_BACKWARD);
+
+    if (ret < 0) {
+      ret = ffmpeg_generic_seek_workaround(anim, &seek_pos, pts_to_search);\
       av_log(anim->pFormatCtx,
              AV_LOG_DEBUG,
              "Adjusted final seek seek_pos = %" PRId64 "\n",
-- 
2.30.2