From 9e6b83c7377f962ac4149b987d4f680edb0404b3 Mon Sep 17 00:00:00 2001 From: Taner Sener Date: Mon, 18 Nov 2024 01:31:25 +0000 Subject: [PATCH] implement native deleteSession method, fixes #1066 --- .../arthenica/ffmpegkit/FFmpegKitConfig.java | 18 ++++++++++++++++-- apple/src/FFmpegKitConfig.h | 8 ++++++++ apple/src/FFmpegKitConfig.m | 12 ++++++++++++ linux/src/FFmpegKitConfig.cpp | 12 ++++++++++++ linux/src/FFmpegKitConfig.h | 8 ++++++++ 5 files changed, 56 insertions(+), 2 deletions(-) diff --git a/android/ffmpeg-kit-android-lib/src/main/java/com/arthenica/ffmpegkit/FFmpegKitConfig.java b/android/ffmpeg-kit-android-lib/src/main/java/com/arthenica/ffmpegkit/FFmpegKitConfig.java index adb83e2..7fa4263 100644 --- a/android/ffmpeg-kit-android-lib/src/main/java/com/arthenica/ffmpegkit/FFmpegKitConfig.java +++ b/android/ffmpeg-kit-android-lib/src/main/java/com/arthenica/ffmpegkit/FFmpegKitConfig.java @@ -117,7 +117,7 @@ public class FFmpegKitConfig { /* Session history variables */ private static int sessionHistorySize; private static final Map sessionHistoryMap; - private static final List sessionHistoryList; + private static final ArrayList sessionHistoryList; private static final Object sessionHistoryLock; private static int asyncConcurrencyLimit; @@ -165,7 +165,7 @@ public class FFmpegKitConfig { return (this.size() > sessionHistorySize); } }; - sessionHistoryList = new LinkedList<>(); + sessionHistoryList = new ArrayList<>(); sessionHistoryLock = new Object(); globalLogCallback = null; @@ -1180,6 +1180,20 @@ public class FFmpegKitConfig { } } + /** + * Deletes the session specified with sessionId from the session history. + * + * @param sessionId session identifier + */ + public static void deleteSession(final long sessionId) { + synchronized (sessionHistoryLock) { + Session removedSession = sessionHistoryMap.remove(sessionId); + if (removedSession != null) { + sessionHistoryList.remove(removedSession); + } + } + } + /** * Returns the last session created from the session history. * diff --git a/apple/src/FFmpegKitConfig.h b/apple/src/FFmpegKitConfig.h index c0d8779..74bb152 100644 --- a/apple/src/FFmpegKitConfig.h +++ b/apple/src/FFmpegKitConfig.h @@ -407,6 +407,14 @@ typedef NS_ENUM(NSUInteger, Signal) { */ + (id)getSession:(long)sessionId; +/** + * Deletes the session specified with sessionId from the session + * history. + * + * @param sessionId session identifier + */ ++ (void)deleteSession:(long)sessionId; + /** * Returns the last session created from the session history. * diff --git a/apple/src/FFmpegKitConfig.m b/apple/src/FFmpegKitConfig.m index 001ae94..06ab8d2 100644 --- a/apple/src/FFmpegKitConfig.m +++ b/apple/src/FFmpegKitConfig.m @@ -1353,6 +1353,18 @@ int executeFFprobe(long sessionId, NSArray *arguments) { return session; } ++ (void)deleteSession:(long)sessionId { + [sessionHistoryLock lock]; + + id session = [sessionHistoryMap objectForKey:[NSNumber numberWithLong:sessionId]]; + if (session != nil) { + [sessionHistoryMap removeObjectForKey:[NSNumber numberWithLong:sessionId]]; + [sessionHistoryList removeObject:session]; + } + + [sessionHistoryLock unlock]; +} + + (id)getLastSession { [sessionHistoryLock lock]; diff --git a/linux/src/FFmpegKitConfig.cpp b/linux/src/FFmpegKitConfig.cpp index 2435eb7..3966d71 100644 --- a/linux/src/FFmpegKitConfig.cpp +++ b/linux/src/FFmpegKitConfig.cpp @@ -1371,6 +1371,18 @@ ffmpegkit::FFmpegKitConfig::getSession(const long sessionId) { } } +void ffmpegkit::FFmpegKitConfig::deleteSession(const long sessionId) { + std::unique_lock lock(sessionMutex, std::defer_lock); + lock.lock(); + + sessionHistoryMap.erase(sessionId); + auto it = std::remove_if(sessionHistoryList.begin(), sessionHistoryList.end(), + [sessionId](std::shared_ptr session) { + return session->getSessionId() == sessionId; + }); + sessionHistoryList.erase(it, sessionHistoryList.end()); +} + std::shared_ptr ffmpegkit::FFmpegKitConfig::getLastSession() { std::unique_lock lock(sessionMutex, std::defer_lock); diff --git a/linux/src/FFmpegKitConfig.h b/linux/src/FFmpegKitConfig.h index 10a494b..2ec758f 100644 --- a/linux/src/FFmpegKitConfig.h +++ b/linux/src/FFmpegKitConfig.h @@ -371,6 +371,14 @@ class FFmpegKitConfig { */ static std::shared_ptr getSession(const long sessionId); + /** + * Deletes the session specified with sessionId from the session + * history. + * + * @param sessionId session identifier + */ + static void deleteSession(const long sessionId); + /** * Returns the last session created from the session history. *