From 7e16723cc4cea10bff83b4847e90626524c89155 Mon Sep 17 00:00:00 2001 From: Callum Moffat Date: Tue, 11 Jan 2022 13:42:42 -0500 Subject: [PATCH 1/6] Run callbacks on main queue --- .../ios/Classes/FFmpegKitFlutterPlugin.m | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/flutter/flutter/ios/Classes/FFmpegKitFlutterPlugin.m b/flutter/flutter/ios/Classes/FFmpegKitFlutterPlugin.m index c7b5f8a..22381a2 100644 --- a/flutter/flutter/ios/Classes/FFmpegKitFlutterPlugin.m +++ b/flutter/flutter/ios/Classes/FFmpegKitFlutterPlugin.m @@ -112,30 +112,40 @@ extern int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit; - (void)registerGlobalCallbacks { [FFmpegKitConfig enableFFmpegSessionCompleteCallback:^(FFmpegSession* session){ NSDictionary *dictionary = [FFmpegKitFlutterPlugin toSessionDictionary:session]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + }); }]; [FFmpegKitConfig enableFFprobeSessionCompleteCallback:^(FFprobeSession* session){ NSDictionary *dictionary = [FFmpegKitFlutterPlugin toSessionDictionary:session]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + }); }]; [FFmpegKitConfig enableMediaInformationSessionCompleteCallback:^(MediaInformationSession* session){ NSDictionary *dictionary = [FFmpegKitFlutterPlugin toSessionDictionary:session]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + }); }]; [FFmpegKitConfig enableLogCallback: ^(Log* log){ if (self->logsEnabled) { NSDictionary *dictionary = [FFmpegKitFlutterPlugin toLogDictionary:log]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_LOG_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_LOG_CALLBACK_EVENT withDictionary:dictionary]); + }); } }]; [FFmpegKitConfig enableStatisticsCallback:^(Statistics* statistics){ if (self->statisticsEnabled) { NSDictionary *dictionary = [FFmpegKitFlutterPlugin toStatisticsDictionary:statistics]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_STATISTICS_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_STATISTICS_CALLBACK_EVENT withDictionary:dictionary]); + }); } }]; } From 10ef18ab6b28790b7a7d31683f3ca3f529f999db Mon Sep 17 00:00:00 2001 From: Taner Sener Date: Fri, 20 May 2022 19:58:41 +0100 Subject: [PATCH 2/6] run flutter macos callbacks on main queue, applies pr 312 on macos --- .../macos/Classes/FFmpegKitFlutterPlugin.m | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/flutter/flutter/macos/Classes/FFmpegKitFlutterPlugin.m b/flutter/flutter/macos/Classes/FFmpegKitFlutterPlugin.m index f9f557e..edaf6e7 100644 --- a/flutter/flutter/macos/Classes/FFmpegKitFlutterPlugin.m +++ b/flutter/flutter/macos/Classes/FFmpegKitFlutterPlugin.m @@ -112,30 +112,40 @@ extern int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit; - (void)registerGlobalCallbacks { [FFmpegKitConfig enableFFmpegSessionCompleteCallback:^(FFmpegSession* session){ NSDictionary *dictionary = [FFmpegKitFlutterPlugin toSessionDictionary:session]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + }); }]; [FFmpegKitConfig enableFFprobeSessionCompleteCallback:^(FFprobeSession* session){ NSDictionary *dictionary = [FFmpegKitFlutterPlugin toSessionDictionary:session]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + }); }]; [FFmpegKitConfig enableMediaInformationSessionCompleteCallback:^(MediaInformationSession* session){ NSDictionary *dictionary = [FFmpegKitFlutterPlugin toSessionDictionary:session]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_COMPLETE_CALLBACK_EVENT withDictionary:dictionary]); + }); }]; [FFmpegKitConfig enableLogCallback: ^(Log* log){ if (self->logsEnabled) { NSDictionary *dictionary = [FFmpegKitFlutterPlugin toLogDictionary:log]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_LOG_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_LOG_CALLBACK_EVENT withDictionary:dictionary]); + }); } }]; [FFmpegKitConfig enableStatisticsCallback:^(Statistics* statistics){ if (self->statisticsEnabled) { NSDictionary *dictionary = [FFmpegKitFlutterPlugin toStatisticsDictionary:statistics]; - self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_STATISTICS_CALLBACK_EVENT withDictionary:dictionary]); + dispatch_async(dispatch_get_main_queue(), ^() { + self->_eventSink([FFmpegKitFlutterPlugin toStringDictionary:EVENT_STATISTICS_CALLBACK_EVENT withDictionary:dictionary]); + }); } }]; } From c3d1bff355702cb85bf0a04167c02533447c4ba6 Mon Sep 17 00:00:00 2001 From: Taner Sener Date: Fri, 20 May 2022 23:18:00 +0100 Subject: [PATCH 3/6] implement AbstractSession.cancel method on flutter --- flutter/flutter/lib/abstract_session.dart | 15 ++++++++++++++- flutter/flutter/lib/session.dart | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/flutter/flutter/lib/abstract_session.dart b/flutter/flutter/lib/abstract_session.dart index 4667569..36d717d 100644 --- a/flutter/flutter/lib/abstract_session.dart +++ b/flutter/flutter/lib/abstract_session.dart @@ -428,5 +428,18 @@ class AbstractSession extends Session { bool isMediaInformation() => false; /// Cancels running the session. - void cancel() {} + Future cancel() async { + try { + final int? sessionId = getSessionId(); + await FFmpegKitConfig.init(); + if (sessionId == null) { + return _platform.ffmpegKitCancel(); + } else { + return _platform.ffmpegKitCancelSession(sessionId); + } + } on PlatformException catch (e, stack) { + print("Plugin cancel error: ${e.message}"); + return Future.error("cancel failed.", stack); + } + } } diff --git a/flutter/flutter/lib/session.dart b/flutter/flutter/lib/session.dart index 7fe16ae..a4796d8 100644 --- a/flutter/flutter/lib/session.dart +++ b/flutter/flutter/lib/session.dart @@ -106,5 +106,5 @@ abstract class Session { bool isMediaInformation(); /// Cancels running the session. - void cancel(); + Future cancel(); } From fb8992a96ce5fad5658131f88bba42126f91f73b Mon Sep 17 00:00:00 2001 From: Taner Sener Date: Tue, 23 Aug 2022 23:47:48 +0100 Subject: [PATCH 4/6] refactor media information classes --- flutter/flutter/lib/chapter.dart | 8 ++-- flutter/flutter/lib/media_information.dart | 52 +++++++++++++-------- flutter/flutter/lib/stream_information.dart | 8 ++-- 3 files changed, 41 insertions(+), 27 deletions(-) diff --git a/flutter/flutter/lib/chapter.dart b/flutter/flutter/lib/chapter.dart index cbf7bfc..cdf6b87 100644 --- a/flutter/flutter/lib/chapter.dart +++ b/flutter/flutter/lib/chapter.dart @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Taner Sener + * Copyright (c) 2021-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -51,7 +51,7 @@ class Chapter { String? getEndTime() => this.getStringProperty(Chapter.keyEndTime); /// Returns all tags. - Map? getTags() => this.getProperties(Chapter.keyTags); + Map? getTags() => this.getProperty(Chapter.keyTags); /// Returns the chapter property associated with the key. String? getStringProperty(String key) => this._allProperties?[key]; @@ -59,8 +59,8 @@ class Chapter { /// Returns the chapter property associated with the key. num? getNumberProperty(String key) => this._allProperties?[key]; - /// Returns the chapter properties associated with the key. - dynamic getProperties(String key) => this._allProperties?[key]; + /// Returns the chapter property associated with the key. + dynamic getProperty(String key) => this._allProperties?[key]; /// Returns all properties found. Map? getAllProperties() => this._allProperties; diff --git a/flutter/flutter/lib/media_information.dart b/flutter/flutter/lib/media_information.dart index 83560f1..1abb89e 100644 --- a/flutter/flutter/lib/media_information.dart +++ b/flutter/flutter/lib/media_information.dart @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2021 Taner Sener + * Copyright (c) 2019-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -22,7 +22,7 @@ import 'stream_information.dart'; /// Media information class. class MediaInformation { - static const keyMediaProperties = "format"; + static const keyFormatProperties = "format"; static const keyFilename = "filename"; static const keyFormat = "format_name"; static const keyFormatLong = "format_long_name"; @@ -38,40 +38,54 @@ class MediaInformation { MediaInformation(this._allProperties); /// Returns file name. - String? getFilename() => this.getStringProperty(MediaInformation.keyFilename); + String? getFilename() => + this.getStringFormatProperty(MediaInformation.keyFilename); /// Returns format. - String? getFormat() => this.getStringProperty(MediaInformation.keyFormat); + String? getFormat() => + this.getStringFormatProperty(MediaInformation.keyFormat); /// Returns long format. String? getLongFormat() => - this.getStringProperty(MediaInformation.keyFormatLong); + this.getStringFormatProperty(MediaInformation.keyFormatLong); /// Returns duration. - String? getDuration() => this.getStringProperty(MediaInformation.keyDuration); + String? getDuration() => + this.getStringFormatProperty(MediaInformation.keyDuration); /// Returns start time. String? getStartTime() => - this.getStringProperty(MediaInformation.keyStartTime); + this.getStringFormatProperty(MediaInformation.keyStartTime); /// Returns size. - String? getSize() => this.getStringProperty(MediaInformation.keySize); + String? getSize() => this.getStringFormatProperty(MediaInformation.keySize); /// Returns bitrate. - String? getBitrate() => this.getStringProperty(MediaInformation.keyBitRate); + String? getBitrate() => + this.getStringFormatProperty(MediaInformation.keyBitRate); /// Returns all tags. Map? getTags() => - this.getProperties(StreamInformation.keyTags); + this.getFormatProperty(StreamInformation.keyTags); - /// Returns the media property associated with the key. - String? getStringProperty(String key) => this.getMediaProperties()?[key]; + /// Returns the property associated with the key. + String? getStringProperty(String key) => this.getAllProperties()?[key]; - /// Returns the media property associated with the key. - num? getNumberProperty(String key) => this.getMediaProperties()?[key]; + /// Returns the property associated with the key. + num? getNumberProperty(String key) => this.getAllProperties()?[key]; - /// Returns the media properties associated with the key. - dynamic getProperties(String key) => this.getMediaProperties()?[key]; + /// Returns the property associated with the key. + dynamic getProperty(String key) => this.getAllProperties()?[key]; + + /// Returns the format property associated with the key. + String? getStringFormatProperty(String key) => + this.getFormatProperties()?[key]; + + /// Returns the format property associated with the key. + num? getNumberFormatProperty(String key) => this.getFormatProperties()?[key]; + + /// Returns the format property associated with the key. + dynamic getFormatProperty(String key) => this.getFormatProperties()?[key]; /// Returns all streams found as a list. List getStreams() { @@ -102,9 +116,9 @@ class MediaInformation { return list; } - /// Returns all media properties. - Map? getMediaProperties() => - this._allProperties?[keyMediaProperties]; + /// Returns all format properties found. + Map? getFormatProperties() => + this._allProperties?[keyFormatProperties]; /// Returns all properties found, including stream properties. Map? getAllProperties() => this._allProperties; diff --git a/flutter/flutter/lib/stream_information.dart b/flutter/flutter/lib/stream_information.dart index eb546b6..0af0528 100644 --- a/flutter/flutter/lib/stream_information.dart +++ b/flutter/flutter/lib/stream_information.dart @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2021 Taner Sener + * Copyright (c) 2019-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -108,7 +108,7 @@ class StreamInformation { /// Returns all tags. Map? getTags() => - this.getProperties(StreamInformation.keyTags); + this.getProperty(StreamInformation.keyTags); /// Returns the stream property associated with the key. String? getStringProperty(String key) => this._allProperties?[key]; @@ -116,8 +116,8 @@ class StreamInformation { /// Returns the stream property associated with the key. num? getNumberProperty(String key) => this._allProperties?[key]; - /// Returns the stream properties associated with the key. - dynamic getProperties(String key) => this._allProperties?[key]; + /// Returns the stream property associated with the key. + dynamic getProperty(String key) => this._allProperties?[key]; /// Returns all properties found. Map? getAllProperties() => this._allProperties; From e0eab9ffa33b4422e42dadbe61999aeb96b8321a Mon Sep 17 00:00:00 2001 From: Taner Sener Date: Wed, 24 Aug 2022 00:12:07 +0100 Subject: [PATCH 5/6] refactor session create methods --- .../flutter/FFmpegKitFlutterPlugin.java | 8 ++++---- .../flutter/ios/Classes/FFmpegKitFlutterPlugin.m | 8 ++++---- flutter/flutter/lib/abstract_session.dart | 4 ++-- flutter/flutter/lib/ffmpeg_session.dart | 7 +------ flutter/flutter/lib/ffprobe_session.dart | 7 +------ .../flutter/lib/media_information_session.dart | 7 +------ flutter/flutter/lib/src/ffmpeg_kit_factory.dart | 16 +++++++--------- .../macos/Classes/FFmpegKitFlutterPlugin.m | 8 ++++---- 8 files changed, 24 insertions(+), 41 deletions(-) diff --git a/flutter/flutter/android/src/main/java/com/arthenica/ffmpegkit/flutter/FFmpegKitFlutterPlugin.java b/flutter/flutter/android/src/main/java/com/arthenica/ffmpegkit/flutter/FFmpegKitFlutterPlugin.java index 3d227bb..479ce82 100644 --- a/flutter/flutter/android/src/main/java/com/arthenica/ffmpegkit/flutter/FFmpegKitFlutterPlugin.java +++ b/flutter/flutter/android/src/main/java/com/arthenica/ffmpegkit/flutter/FFmpegKitFlutterPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2021 Taner Sener + * Copyright (c) 2018-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -831,7 +831,7 @@ public class FFmpegKitFlutterPlugin implements FlutterPlugin, ActivityAware, Met // FFmpegSession protected void ffmpegSession(@NonNull final List arguments, @NonNull final Result result) { - final FFmpegSession session = new FFmpegSession(arguments.toArray(new String[0]), null, null, null, LogRedirectionStrategy.NEVER_PRINT_LOGS); + final FFmpegSession session = FFmpegSession.create(arguments.toArray(new String[0]), null, null, null, LogRedirectionStrategy.NEVER_PRINT_LOGS); resultHandler.successAsync(result, toMap(session)); } @@ -872,14 +872,14 @@ public class FFmpegKitFlutterPlugin implements FlutterPlugin, ActivityAware, Met // FFprobeSession protected void ffprobeSession(@NonNull final List arguments, @NonNull final Result result) { - final FFprobeSession session = new FFprobeSession(arguments.toArray(new String[0]), null, null, LogRedirectionStrategy.NEVER_PRINT_LOGS); + final FFprobeSession session = FFprobeSession.create(arguments.toArray(new String[0]), null, null, LogRedirectionStrategy.NEVER_PRINT_LOGS); resultHandler.successAsync(result, toMap(session)); } // MediaInformationSession protected void mediaInformationSession(@NonNull final List arguments, @NonNull final Result result) { - final MediaInformationSession session = new MediaInformationSession(arguments.toArray(new String[0]), null, null); + final MediaInformationSession session = MediaInformationSession.create(arguments.toArray(new String[0]), null, null); resultHandler.successAsync(result, toMap(session)); } diff --git a/flutter/flutter/ios/Classes/FFmpegKitFlutterPlugin.m b/flutter/flutter/ios/Classes/FFmpegKitFlutterPlugin.m index 22381a2..d4bf896 100644 --- a/flutter/flutter/ios/Classes/FFmpegKitFlutterPlugin.m +++ b/flutter/flutter/ios/Classes/FFmpegKitFlutterPlugin.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2021 Taner Sener + * Copyright (c) 2018-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -573,7 +573,7 @@ extern int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit; // FFmpegSession - (void)ffmpegSession:(NSArray*)arguments result:(FlutterResult)result { - FFmpegSession* session = [[FFmpegSession alloc] init:arguments withCompleteCallback:nil withLogCallback:nil withStatisticsCallback:nil withLogRedirectionStrategy:LogRedirectionStrategyNeverPrintLogs]; + FFmpegSession* session = [FFmpegSession create:arguments withCompleteCallback:nil withLogCallback:nil withStatisticsCallback:nil withLogRedirectionStrategy:LogRedirectionStrategyNeverPrintLogs]; result([FFmpegKitFlutterPlugin toSessionDictionary:session]); } @@ -614,14 +614,14 @@ extern int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit; // FFprobeSession - (void)ffprobeSession:(NSArray*)arguments result:(FlutterResult)result { - FFprobeSession* session = [[FFprobeSession alloc] init:arguments withCompleteCallback:nil withLogCallback:nil withLogRedirectionStrategy:LogRedirectionStrategyNeverPrintLogs]; + FFprobeSession* session = [FFprobeSession create:arguments withCompleteCallback:nil withLogCallback:nil withLogRedirectionStrategy:LogRedirectionStrategyNeverPrintLogs]; result([FFmpegKitFlutterPlugin toSessionDictionary:session]); } // MediaInformationSession - (void)mediaInformationSession:(NSArray*)arguments result:(FlutterResult)result { - MediaInformationSession* session = [[MediaInformationSession alloc] init:arguments withCompleteCallback:nil withLogCallback:nil]; + MediaInformationSession* session = [MediaInformationSession create:arguments withCompleteCallback:nil withLogCallback:nil]; result([FFmpegKitFlutterPlugin toSessionDictionary:session]); } diff --git a/flutter/flutter/lib/abstract_session.dart b/flutter/flutter/lib/abstract_session.dart index 36d717d..4cbb521 100644 --- a/flutter/flutter/lib/abstract_session.dart +++ b/flutter/flutter/lib/abstract_session.dart @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2021 Taner Sener + * Copyright (c) 2019-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -35,7 +35,7 @@ import 'src/ffmpeg_kit_factory.dart'; /// Abstract session implementation which includes common features shared by /// "FFmpeg", "FFprobe" and "MediaInformation" sessions. -class AbstractSession extends Session { +abstract class AbstractSession extends Session { static FFmpegKitPlatform _platform = FFmpegKitPlatform.instance; /// Defines how long default "getAll" methods wait, in milliseconds. diff --git a/flutter/flutter/lib/ffmpeg_session.dart b/flutter/flutter/lib/ffmpeg_session.dart index 2cbc777..e3a655c 100644 --- a/flutter/flutter/lib/ffmpeg_session.dart +++ b/flutter/flutter/lib/ffmpeg_session.dart @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2021 Taner Sener + * Copyright (c) 2019-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -49,11 +49,6 @@ class FFmpegSession extends AbstractSession { return session; } - /// Creates a new FFmpeg session from [sessionMap], which includes session - /// fields as map keys. - static FFmpegSession fromMap(Map sessionMap) => - AbstractSession.createFFmpegSessionFromMap(sessionMap); - /// Returns the session specific statistics callback. StatisticsCallback? getStatisticsCallback() => FFmpegKitFactory.getStatisticsCallback(this.getSessionId()); diff --git a/flutter/flutter/lib/ffprobe_session.dart b/flutter/flutter/lib/ffprobe_session.dart index af35a38..42e826d 100644 --- a/flutter/flutter/lib/ffprobe_session.dart +++ b/flutter/flutter/lib/ffprobe_session.dart @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2021 Taner Sener + * Copyright (c) 2019-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -41,11 +41,6 @@ class FFprobeSession extends AbstractSession { return session; } - /// Creates a new FFprobe session from [sessionMap], which includes session - /// fields as map keys. - static FFprobeSession fromMap(Map sessionMap) => - AbstractSession.createFFprobeSessionFromMap(sessionMap); - /// Returns the session specific complete callback. FFprobeSessionCompleteCallback? getCompleteCallback() => FFmpegKitFactory.getFFprobeSessionCompleteCallback(this.getSessionId()); diff --git a/flutter/flutter/lib/media_information_session.dart b/flutter/flutter/lib/media_information_session.dart index c550ca8..472fa1b 100644 --- a/flutter/flutter/lib/media_information_session.dart +++ b/flutter/flutter/lib/media_information_session.dart @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2021 Taner Sener + * Copyright (c) 2019-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -43,11 +43,6 @@ class MediaInformationSession extends AbstractSession { return session; } - /// Creates a new MediaInformation session from [sessionMap], which includes - /// session fields as map keys. - static MediaInformationSession fromMap(Map sessionMap) => - AbstractSession.createMediaInformationSessionFromMap(sessionMap); - /// Returns the media information extracted in this session. MediaInformation? getMediaInformation() => this._mediaInformation; diff --git a/flutter/flutter/lib/src/ffmpeg_kit_factory.dart b/flutter/flutter/lib/src/ffmpeg_kit_factory.dart index bb4529d..9d7d26b 100644 --- a/flutter/flutter/lib/src/ffmpeg_kit_factory.dart +++ b/flutter/flutter/lib/src/ffmpeg_kit_factory.dart @@ -17,15 +17,13 @@ * along with FFmpegKit. If not, see . */ -import '../ffmpeg_session.dart'; +import '../abstract_session.dart'; import '../ffmpeg_session_complete_callback.dart'; -import '../ffprobe_session.dart'; import '../ffprobe_session_complete_callback.dart'; import '../log.dart'; import '../log_callback.dart'; import '../log_redirection_strategy.dart'; import '../media_information.dart'; -import '../media_information_session.dart'; import '../media_information_session_complete_callback.dart'; import '../session.dart'; import '../statistics.dart'; @@ -66,12 +64,12 @@ class FFmpegKitFactory { static Session mapToSession(Map sessionMap) { switch (sessionMap["type"]) { case 2: - return FFprobeSession.fromMap(sessionMap); + return AbstractSession.createFFprobeSessionFromMap(sessionMap); case 3: - return MediaInformationSession.fromMap(sessionMap); + return AbstractSession.createMediaInformationSessionFromMap(sessionMap); case 1: default: - return FFmpegSession.fromMap(sessionMap); + return AbstractSession.createFFmpegSessionFromMap(sessionMap); } } @@ -79,12 +77,12 @@ class FFmpegKitFactory { if (sessionMap != null) { switch (sessionMap["type"]) { case 2: - return FFprobeSession.fromMap(sessionMap); + return AbstractSession.createFFprobeSessionFromMap(sessionMap); case 3: - return MediaInformationSession.fromMap(sessionMap); + return AbstractSession.createMediaInformationSessionFromMap(sessionMap); case 1: default: - return FFmpegSession.fromMap(sessionMap); + return AbstractSession.createFFmpegSessionFromMap(sessionMap); } } else { return null; diff --git a/flutter/flutter/macos/Classes/FFmpegKitFlutterPlugin.m b/flutter/flutter/macos/Classes/FFmpegKitFlutterPlugin.m index edaf6e7..8a2100c 100644 --- a/flutter/flutter/macos/Classes/FFmpegKitFlutterPlugin.m +++ b/flutter/flutter/macos/Classes/FFmpegKitFlutterPlugin.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2021 Taner Sener + * Copyright (c) 2018-2022 Taner Sener * * This file is part of FFmpegKit. * @@ -573,7 +573,7 @@ extern int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit; // FFmpegSession - (void)ffmpegSession:(NSArray*)arguments result:(FlutterResult)result { - FFmpegSession* session = [[FFmpegSession alloc] init:arguments withCompleteCallback:nil withLogCallback:nil withStatisticsCallback:nil withLogRedirectionStrategy:LogRedirectionStrategyNeverPrintLogs]; + FFmpegSession* session = [FFmpegSession create:arguments withCompleteCallback:nil withLogCallback:nil withStatisticsCallback:nil withLogRedirectionStrategy:LogRedirectionStrategyNeverPrintLogs]; result([FFmpegKitFlutterPlugin toSessionDictionary:session]); } @@ -614,14 +614,14 @@ extern int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit; // FFprobeSession - (void)ffprobeSession:(NSArray*)arguments result:(FlutterResult)result { - FFprobeSession* session = [[FFprobeSession alloc] init:arguments withCompleteCallback:nil withLogCallback:nil withLogRedirectionStrategy:LogRedirectionStrategyNeverPrintLogs]; + FFprobeSession* session = [FFprobeSession create:arguments withCompleteCallback:nil withLogCallback:nil withLogRedirectionStrategy:LogRedirectionStrategyNeverPrintLogs]; result([FFmpegKitFlutterPlugin toSessionDictionary:session]); } // MediaInformationSession - (void)mediaInformationSession:(NSArray*)arguments result:(FlutterResult)result { - MediaInformationSession* session = [[MediaInformationSession alloc] init:arguments withCompleteCallback:nil withLogCallback:nil]; + MediaInformationSession* session = [MediaInformationSession create:arguments withCompleteCallback:nil withLogCallback:nil]; result([FFmpegKitFlutterPlugin toSessionDictionary:session]); } From c2a44c0b97125f541038223c25c059918f9471c0 Mon Sep 17 00:00:00 2001 From: Taner Sener Date: Sun, 2 Oct 2022 15:54:42 +0100 Subject: [PATCH 6/6] release flutter plugin v5.1.0 --- README.md | 3 +- docs/index.md | 9 ++-- flutter/flutter/CHANGELOG.md | 10 ++++ flutter/flutter/README.md | 48 +++++++++++-------- flutter/flutter/android/build.gradle | 28 +++++------ .../ios/Classes/FFmpegKitFlutterPlugin.m | 18 ++++--- .../flutter/ios/ffmpeg_kit_flutter.podspec | 34 ++++++------- .../flutter/lib/src/ffmpeg_kit_factory.dart | 5 +- .../macos/Classes/FFmpegKitFlutterPlugin.m | 18 ++++--- .../flutter/macos/ffmpeg_kit_flutter.podspec | 34 ++++++------- flutter/flutter/pubspec.yaml | 4 +- 11 files changed, 114 insertions(+), 97 deletions(-) diff --git a/README.md b/README.md index 2cdc9b9..46496a1 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ It includes scripts to build `FFmpeg` native libraries, a wrapper library to run - Supports hybrid platforms: Flutter, React Native - Based on FFmpeg `v4.5-dev` or later with optional system and external libraries - 8 prebuilt binary packages available at [Github](https://github.com/arthenica/ffmpeg-kit/releases), [Maven Central](https://search.maven.org), [CocoaPods](https://cocoapods.org), [pub](https://pub.dev) and [npm](https://www.npmjs.com) -- Licensed under `LGPL 3.0`, or `GPL v3.0` if GPL licensed libraries are enabled +- Licensed under `LGPL 3.0` by default, `GPL v3.0` if GPL licensed libraries are enabled ### 2. Android @@ -126,6 +126,7 @@ the exact version number of `FFmpeg` is obtained using the `git describe --tags` | Platforms | FFmpegKit Version | FFmpeg Version | Release Date | |:----------------:|:----------------------------------------------------------------------------------:|:--------------:|:------------:| +| Flutter | [5.1.0](https://github.com/arthenica/ffmpeg-kit/releases/tag/flutter.v5.1.0) | 5.1.2 | Oct 02, 2022 | | Android | [5.1](https://github.com/arthenica/ffmpeg-kit/releases/tag/v5.1) | 5.1.2 | Sep 29, 2022 | | Apple | [5.1](https://github.com/arthenica/ffmpeg-kit/releases/tag/v5.1) | 5.1.2 | Sep 29, 2022 | | React Native | [4.5.2](https://github.com/arthenica/ffmpeg-kit/releases/tag/react.native.v4.5.2) | 4.5-dev-3393 | May 25, 2022 | diff --git a/docs/index.md b/docs/index.md index 12d8eed..c60828a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -15,7 +15,7 @@ applications and 8 prebuilt binary packages available at [Github](https://github - Supports hybrid platforms: Flutter, React Native - Based on FFmpeg `v4.5-dev` or later with optional system and external libraries - 8 prebuilt binary packages available at [Github](https://github.com/arthenica/ffmpeg-kit/releases), [Maven Central](https://search.maven.org), [CocoaPods](https://cocoapods.org), [pub](https://pub.dev) and [npm](https://www.npmjs.com) -- Licensed under `LGPL 3.0`, or `GPL v3.0` if GPL licensed libraries are enabled +- Licensed under `LGPL 3.0` by default, some packages licensed by `GPL v3.0` effectively ### 2. Android @@ -112,10 +112,11 @@ the same `FFmpeg` release branch. `dev` part in the version string indicates that `FFmpeg` source code is cloned from the `FFmpeg` `master` branch and the exact version number of `FFmpeg` is obtained using the `git describe --tags` command. -| Platforms | FFmpegKit Version | FFmpeg Version | Release Date | -|:----------------:|:----------------------------------------------------------------------------------:|:--------------:|:------------:| +| Platforms | FFmpegKit Version | FFmpeg Version | Release Date | +|:----------------:|:---------------------------------------------------------------------------------:|:--------------:|:------------:| +| Flutter | [5.1.0](https://github.com/arthenica/ffmpeg-kit/releases/tag/flutter.v5.1.0) | 5.1.2 | Oct 02, 2022 | | Android | [5.1](https://github.com/arthenica/ffmpeg-kit/releases/tag/v5.1) | 5.1.2 | Sep 29, 2022 | -| Apple | [5.1](https://github.com/arthenica/ffmpeg-kit/releases/tag/v5.1) | 5.1.2 | Sep 29, 2022 | +| Apple | [5.1](https://github.com/arthenica/ffmpeg-kit/releases/tag/v5.1) | 5.1.2 | Sep 29, 2022 | | React Native | [4.5.2](https://github.com/arthenica/ffmpeg-kit/releases/tag/react.native.v4.5.2) | 4.5-dev-3393 | May 25, 2022 | | Flutter | [4.5.1](https://github.com/arthenica/ffmpeg-kit/releases/tag/flutter.v4.5.1) | 4.5-dev-3393 | Jan 02, 2022 | | React Native | [4.5.1](https://github.com/arthenica/ffmpeg-kit/releases/tag/react.native.v4.5.1) | 4.5-dev-3393 | Jan 02, 2022 | diff --git a/flutter/flutter/CHANGELOG.md b/flutter/flutter/CHANGELOG.md index 31f1289..38e6d3f 100644 --- a/flutter/flutter/CHANGELOG.md +++ b/flutter/flutter/CHANGELOG.md @@ -1,3 +1,13 @@ +## 5.1.0 +- Feature release based on native v5.1 +- Implements AbstractSession.cancel() method +- Runs iOS and macOS callbacks on main queue + +## 5.1.0-LTS +- Feature release based on native v5.1.LTS +- Implements AbstractSession.cancel() method +- Runs iOS and macOS callbacks on main queue + ## 4.5.1 - Feature release based on native v4.5.1 diff --git a/flutter/flutter/README.md b/flutter/flutter/README.md index 8e2f409..b5623bd 100644 --- a/flutter/flutter/README.md +++ b/flutter/flutter/README.md @@ -5,14 +5,17 @@ - Includes both `FFmpeg` and `FFprobe` - Supports - `Android`, `iOS` and `macOS` - - FFmpeg `v4.5-dev` releases + - FFmpeg `v5.1.2` - `arm-v7a`, `arm-v7a-neon`, `arm64-v8a`, `x86` and `x86_64` architectures on Android - - `Android API Level 16` or later + - `Android API Level 24` or later + - `API Level 16` on LTS releases - `armv7`, `armv7s`, `arm64`, `arm64-simulator`, `i386`, `x86_64`, `x86_64-mac-catalyst` and `arm64-mac-catalyst` architectures on iOS - - `iOS SDK 10` or later + - `iOS SDK 12.1` or later + - `iOS SDK 10` on LTS releases - `arm64` and `x86_64` architectures on macOS - - `macOS SDK 10.12+` or later + - `macOS SDK 10.15` or later + - `macOS SDK 10.12` on LTS releases - Can process Storage Access Framework (SAF) Uris on Android - 25 external libraries @@ -24,7 +27,7 @@ `vid.stab`, `x264`, `x265`, `xvidcore` -- Licensed under LGPL 3.0, can be customized to support GPL v3.0 +- Licensed under `LGPL 3.0` by default, some packages licensed by `GPL v3.0` effectively ### 2. Installation @@ -32,21 +35,21 @@ Add `ffmpeg_kit_flutter` as a dependency in your `pubspec.yaml file`. ```yaml dependencies: - ffmpeg_kit_flutter: 4.5.1 + ffmpeg_kit_flutter: 5.1.0 ``` #### 2.1 Packages -`ffmpeg` includes built-in encoders for some popular formats. However, there are certain external libraries that needs +`FFmpeg` includes built-in encoders for some popular formats. However, there are certain external libraries that needs to be enabled in order to encode specific formats/codecs. For example, to encode an `mp3` file you need `lame` or `shine` library enabled. You have to install a `ffmpeg_kit_flutter` package that has at least one of them inside. To encode an `h264` video, you need to install a package with `x264` inside. To encode `vp8` or `vp9` videos, you need a `ffmpeg_kit_flutter` package with `libvpx` inside. `ffmpeg-kit` provides eight packages that include different sets of external libraries. These packages are named -according to the external libraries included in them. Refer to -[Packages](https://github.com/arthenica/ffmpeg-kit#8-packages) section of the project README to see the names of those -packages and external libraries included in each of them. +according to the external libraries included. Refer to the +[Packages](https://github.com/arthenica/ffmpeg-kit/wiki/Packages) wiki page to see the names of those +packages and external libraries included in each one of them. #### 2.2 Installing Packages @@ -55,7 +58,7 @@ using the following dependency format. ```yaml dependencies: - ffmpeg_kit_flutter_: 4.5.1 + ffmpeg_kit_flutter_: 5.1.0 ``` Note that hyphens in the package name must be replaced with underscores. Additionally, do not forget to use the package @@ -67,39 +70,44 @@ In order to install the `LTS` variant, append `-LTS` to the version you have for ```yaml dependencies: - ffmpeg_kit_flutter: 4.5.1-LTS + ffmpeg_kit_flutter: 5.1.0-LTS ``` #### 2.4 LTS Releases -`ffmpeg_kit_flutter` is published in two different variants: `Main Release` and `LTS Release`. Both releases share the -same source code but is built with different settings (Architectures, API Level, iOS Min SDK, etc.). Refer to -[LTS Releases](https://github.com/arthenica/ffmpeg-kit#10-lts-releases) section of the project README to see how they -compare to each other. +`ffmpeg_kit_flutter` is published in two variants: `Main Release` and `LTS Release`. Both releases share the +same source code but is built with different settings (Architectures, API Level, iOS Min SDK, etc.). Refer to the +[LTS Releases](https://github.com/arthenica/ffmpeg-kit/wiki/LTS-Releases) wiki page to see how they differ from each +other. -#### 2.5 Android and iOS Support +#### 2.5 Platform Support -The following table shows the Android API level and iOS deployment target required in `ffmpeg_kit_flutter` releases. +The following table shows Android API level, iOS deployment target and macOS deployment target requirements in +`ffmpeg_kit_flutter` releases. - - + + + + + +
Main ReleaseLTS ReleaseMain ReleaseLTS Release
Android
API Level
iOS Minimum
Deployment Target
macOS Minimum
Deployment Target
Android
API Level
iOS Minimum
Deployment Target
macOS Minimum
Deployment Target
24 12.110.15 16 1010.12
diff --git a/flutter/flutter/android/build.gradle b/flutter/flutter/android/build.gradle index 0a033dc..7c6b559 100644 --- a/flutter/flutter/android/build.gradle +++ b/flutter/flutter/android/build.gradle @@ -1,24 +1,31 @@ buildscript { repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.2.2' + classpath 'com.android.tools.build:gradle:7.1.2' + } +} + +rootProject.allprojects { + repositories { + google() + mavenCentral() } } apply plugin: 'com.android.library' android { - compileSdkVersion 30 + compileSdkVersion 31 defaultConfig { minSdkVersion 24 - targetSdkVersion 30 - versionCode 451 - versionName "4.5.1" + targetSdkVersion 31 + versionCode 510 + versionName "5.1.0" } buildTypes { @@ -35,14 +42,7 @@ android { } } -repositories { - mavenCentral() - jcenter() - google() -} - dependencies { implementation 'androidx.annotation:annotation:1.2.0' - implementation 'com.arthenica:ffmpeg-kit-https:4.5.1-1' + implementation 'com.arthenica:ffmpeg-kit-https:5.1' } - diff --git a/flutter/flutter/ios/Classes/FFmpegKitFlutterPlugin.m b/flutter/flutter/ios/Classes/FFmpegKitFlutterPlugin.m index d4bf896..a2dac73 100644 --- a/flutter/flutter/ios/Classes/FFmpegKitFlutterPlugin.m +++ b/flutter/flutter/ios/Classes/FFmpegKitFlutterPlugin.m @@ -642,23 +642,21 @@ extern int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit; // MediaInformationJsonParser - (void)mediaInformationJsonParserFrom:(NSString*)ffprobeJsonOutput result:(FlutterResult)result { - NSError *error; - MediaInformation* mediaInformation = [MediaInformationJsonParser from:ffprobeJsonOutput with:error]; - if (error == nil) { + @try { + MediaInformation* mediaInformation = [MediaInformationJsonParser fromWithError:ffprobeJsonOutput]; result([FFmpegKitFlutterPlugin toMediaInformationDictionary:mediaInformation]); - } else { - NSLog(@"Parsing MediaInformation failed: %@.\n", error); + } @catch (NSException *exception) { + NSLog(@"Parsing MediaInformation failed: %@.\n", [NSString stringWithFormat:@"%@\n%@", [exception userInfo], [exception callStackSymbols]]); result(nil); } } - (void)mediaInformationJsonParserFromWithError:(NSString*)ffprobeJsonOutput result:(FlutterResult)result { - NSError *error; - MediaInformation* mediaInformation = [MediaInformationJsonParser from:ffprobeJsonOutput with:error]; - if (error == nil) { + @try { + MediaInformation* mediaInformation = [MediaInformationJsonParser fromWithError:ffprobeJsonOutput]; result([FFmpegKitFlutterPlugin toMediaInformationDictionary:mediaInformation]); - } else { - NSLog(@"Parsing MediaInformation failed: %@.\n", error); + } @catch (NSException *exception) { + NSLog(@"Parsing MediaInformation failed: %@.\n", [NSString stringWithFormat:@"%@\n%@", [exception userInfo], [exception callStackSymbols]]); result([FlutterError errorWithCode:@"PARSE_FAILED" message:@"Parsing MediaInformation failed with JSON error." details:nil]); } } diff --git a/flutter/flutter/ios/ffmpeg_kit_flutter.podspec b/flutter/flutter/ios/ffmpeg_kit_flutter.podspec index ba33a6e..afd9360 100644 --- a/flutter/flutter/ios/ffmpeg_kit_flutter.podspec +++ b/flutter/flutter/ios/ffmpeg_kit_flutter.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'ffmpeg_kit_flutter' - s.version = '4.5.1' + s.version = '5.1.0' s.summary = 'FFmpeg Kit for Flutter' s.description = 'A Flutter plugin for running FFmpeg and FFprobe commands.' s.homepage = 'https://github.com/arthenica/ffmpeg-kit' @@ -23,112 +23,112 @@ Pod::Spec.new do |s| s.subspec 'min' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-min', "4.5.1" + ss.dependency 'ffmpeg-kit-ios-min', "5.1" ss.ios.deployment_target = '12.1' end s.subspec 'min-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-min', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-ios-min', "5.1.LTS" ss.ios.deployment_target = '10' end s.subspec 'min-gpl' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-min-gpl', "4.5.1" + ss.dependency 'ffmpeg-kit-ios-min-gpl', "5.1" ss.ios.deployment_target = '12.1' end s.subspec 'min-gpl-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-min-gpl', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-ios-min-gpl', "5.1.LTS" ss.ios.deployment_target = '10' end s.subspec 'https' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-https', "4.5.1" + ss.dependency 'ffmpeg-kit-ios-https', "5.1" ss.ios.deployment_target = '12.1' end s.subspec 'https-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-https', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-ios-https', "5.1.LTS" ss.ios.deployment_target = '10' end s.subspec 'https-gpl' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-https-gpl', "4.5.1" + ss.dependency 'ffmpeg-kit-ios-https-gpl', "5.1" ss.ios.deployment_target = '12.1' end s.subspec 'https-gpl-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-https-gpl', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-ios-https-gpl', "5.1.LTS" ss.ios.deployment_target = '10' end s.subspec 'audio' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-audio', "4.5.1" + ss.dependency 'ffmpeg-kit-ios-audio', "5.1" ss.ios.deployment_target = '12.1' end s.subspec 'audio-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-audio', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-ios-audio', "5.1.LTS" ss.ios.deployment_target = '10' end s.subspec 'video' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-video', "4.5.1" + ss.dependency 'ffmpeg-kit-ios-video', "5.1" ss.ios.deployment_target = '12.1' end s.subspec 'video-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-video', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-ios-video', "5.1.LTS" ss.ios.deployment_target = '10' end s.subspec 'full' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-full', "4.5.1" + ss.dependency 'ffmpeg-kit-ios-full', "5.1" ss.ios.deployment_target = '12.1' end s.subspec 'full-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-full', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-ios-full', "5.1.LTS" ss.ios.deployment_target = '10' end s.subspec 'full-gpl' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-full-gpl', "4.5.1" + ss.dependency 'ffmpeg-kit-ios-full-gpl', "5.1" ss.ios.deployment_target = '12.1' end s.subspec 'full-gpl-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-ios-full-gpl', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-ios-full-gpl', "5.1.LTS" ss.ios.deployment_target = '10' end diff --git a/flutter/flutter/lib/src/ffmpeg_kit_factory.dart b/flutter/flutter/lib/src/ffmpeg_kit_factory.dart index 9d7d26b..d72fca1 100644 --- a/flutter/flutter/lib/src/ffmpeg_kit_factory.dart +++ b/flutter/flutter/lib/src/ffmpeg_kit_factory.dart @@ -79,7 +79,8 @@ class FFmpegKitFactory { case 2: return AbstractSession.createFFprobeSessionFromMap(sessionMap); case 3: - return AbstractSession.createMediaInformationSessionFromMap(sessionMap); + return AbstractSession.createMediaInformationSessionFromMap( + sessionMap); case 1: default: return AbstractSession.createFFmpegSessionFromMap(sessionMap); @@ -98,7 +99,7 @@ class FFmpegKitFactory { } } - static String getVersion() => "4.5.1"; + static String getVersion() => "5.1.0"; static LogRedirectionStrategy? getLogRedirectionStrategy(int? sessionId) => logRedirectionStrategyMap[sessionId]; diff --git a/flutter/flutter/macos/Classes/FFmpegKitFlutterPlugin.m b/flutter/flutter/macos/Classes/FFmpegKitFlutterPlugin.m index 8a2100c..b616988 100644 --- a/flutter/flutter/macos/Classes/FFmpegKitFlutterPlugin.m +++ b/flutter/flutter/macos/Classes/FFmpegKitFlutterPlugin.m @@ -642,23 +642,21 @@ extern int const AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit; // MediaInformationJsonParser - (void)mediaInformationJsonParserFrom:(NSString*)ffprobeJsonOutput result:(FlutterResult)result { - NSError *error; - MediaInformation* mediaInformation = [MediaInformationJsonParser from:ffprobeJsonOutput with:error]; - if (error == nil) { + @try { + MediaInformation* mediaInformation = [MediaInformationJsonParser fromWithError:ffprobeJsonOutput]; result([FFmpegKitFlutterPlugin toMediaInformationDictionary:mediaInformation]); - } else { - NSLog(@"Parsing MediaInformation failed: %@.\n", error); + } @catch (NSException *exception) { + NSLog(@"Parsing MediaInformation failed: %@.\n", [NSString stringWithFormat:@"%@\n%@", [exception userInfo], [exception callStackSymbols]]); result(nil); } } - (void)mediaInformationJsonParserFromWithError:(NSString*)ffprobeJsonOutput result:(FlutterResult)result { - NSError *error; - MediaInformation* mediaInformation = [MediaInformationJsonParser from:ffprobeJsonOutput with:error]; - if (error == nil) { + @try { + MediaInformation* mediaInformation = [MediaInformationJsonParser fromWithError:ffprobeJsonOutput]; result([FFmpegKitFlutterPlugin toMediaInformationDictionary:mediaInformation]); - } else { - NSLog(@"Parsing MediaInformation failed: %@.\n", error); + } @catch (NSException *exception) { + NSLog(@"Parsing MediaInformation failed: %@.\n", [NSString stringWithFormat:@"%@\n%@", [exception userInfo], [exception callStackSymbols]]); result([FlutterError errorWithCode:@"PARSE_FAILED" message:@"Parsing MediaInformation failed with JSON error." details:nil]); } } diff --git a/flutter/flutter/macos/ffmpeg_kit_flutter.podspec b/flutter/flutter/macos/ffmpeg_kit_flutter.podspec index 083244d..ee93a39 100644 --- a/flutter/flutter/macos/ffmpeg_kit_flutter.podspec +++ b/flutter/flutter/macos/ffmpeg_kit_flutter.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'ffmpeg_kit_flutter' - s.version = '4.5.1' + s.version = '5.1.0' s.summary = 'FFmpeg Kit for Flutter' s.description = 'A Flutter plugin for running FFmpeg and FFprobe commands.' s.homepage = 'https://github.com/arthenica/ffmpeg-kit' @@ -23,112 +23,112 @@ Pod::Spec.new do |s| s.subspec 'min' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-min', "4.5.1" + ss.dependency 'ffmpeg-kit-macos-min', "5.1" ss.osx.deployment_target = '10.15' end s.subspec 'min-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-min', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-macos-min', "5.1.LTS" ss.osx.deployment_target = '10.12' end s.subspec 'min-gpl' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-min-gpl', "4.5.1" + ss.dependency 'ffmpeg-kit-macos-min-gpl', "5.1" ss.osx.deployment_target = '10.15' end s.subspec 'min-gpl-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-min-gpl', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-macos-min-gpl', "5.1.LTS" ss.osx.deployment_target = '10.12' end s.subspec 'https' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-https', "4.5.1" + ss.dependency 'ffmpeg-kit-macos-https', "5.1" ss.osx.deployment_target = '10.15' end s.subspec 'https-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-https', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-macos-https', "5.1.LTS" ss.osx.deployment_target = '10.12' end s.subspec 'https-gpl' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-https-gpl', "4.5.1" + ss.dependency 'ffmpeg-kit-macos-https-gpl', "5.1" ss.osx.deployment_target = '10.15' end s.subspec 'https-gpl-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-https-gpl', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-macos-https-gpl', "5.1.LTS" ss.osx.deployment_target = '10.12' end s.subspec 'audio' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-audio', "4.5.1" + ss.dependency 'ffmpeg-kit-macos-audio', "5.1" ss.osx.deployment_target = '10.15' end s.subspec 'audio-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-audio', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-macos-audio', "5.1.LTS" ss.osx.deployment_target = '10.12' end s.subspec 'video' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-video', "4.5.1" + ss.dependency 'ffmpeg-kit-macos-video', "5.1" ss.osx.deployment_target = '10.15' end s.subspec 'video-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-video', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-macos-video', "5.1.LTS" ss.osx.deployment_target = '10.12' end s.subspec 'full' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-full', "4.5.1" + ss.dependency 'ffmpeg-kit-macos-full', "5.1" ss.osx.deployment_target = '10.15' end s.subspec 'full-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-full', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-macos-full', "5.1.LTS" ss.osx.deployment_target = '10.12' end s.subspec 'full-gpl' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-full-gpl', "4.5.1" + ss.dependency 'ffmpeg-kit-macos-full-gpl', "5.1" ss.osx.deployment_target = '10.15' end s.subspec 'full-gpl-lts' do |ss| ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.dependency 'ffmpeg-kit-macos-full-gpl', "4.5.1.LTS" + ss.dependency 'ffmpeg-kit-macos-full-gpl', "5.1.LTS" ss.osx.deployment_target = '10.12' end diff --git a/flutter/flutter/pubspec.yaml b/flutter/flutter/pubspec.yaml index 5af935f..c592e26 100644 --- a/flutter/flutter/pubspec.yaml +++ b/flutter/flutter/pubspec.yaml @@ -3,7 +3,7 @@ description: FFmpeg Kit for Flutter. Supports Android, iOS and macOS platforms. repository: https://github.com/arthenica/ffmpeg-kit issue_tracker: https://github.com/arthenica/ffmpeg-kit/issues homepage: https://github.com/arthenica/ffmpeg-kit -version: 4.5.1 +version: 5.1.0 environment: sdk: ">=2.12.0 <3.0.0" @@ -28,4 +28,4 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - plugin_platform_interface: ^2.0.2 + plugin_platform_interface: ^2.1.3