yanxuyao 1 mese fa
parent
commit
40f9325bca

+ 47 - 7
QGVAPlayer/QGVAPlayer/LNSwift/Bridges/LNLegacyMappings.swift

@@ -4,18 +4,58 @@ public enum LNLegacyMappings {
     public static let entries: [String: String] = [
         "UIView+VAP": "LNVAPPlayerView",
         "QGVAPWrapView": "LNVAPWrapView",
-        "QGMP4Parser": "LNMP4Parser",
+
+        "QGBaseDFileInfo": "LNBaseDFileInfo",
+        "QGBaseAnimatedImageFrame": "LNBaseAnimatedImageFrame",
+        "QGMP4AnimatedImageFrame": "LNMP4AnimatedImageFrame",
+        "QGMP4HWDFileInfo": "LNMP4HWDFileInfo",
+        "QGVAPConfigModel": "LNVAPConfigModel",
+        "QGVAPCommonInfo": "LNVAPCommonInfo",
+        "QGVAPSourceInfo": "LNVAPSourceInfo",
+        "QGVAPSourceDisplayItem": "LNVAPSourceDisplayItem",
+        "QGVAPMergedInfo": "LNVAPMergedInfo",
+        "QGVAPMaskInfo": "LNVAPMaskInfo",
+        "QGVAPTextureLoader": "LNVAPTextureLoader",
+
         "QGMP4Box": "LNMP4Box",
-        "QGAnimatedImageDecodeManager": "LNAnimatedImageDecodeManager",
-        "QGAnimatedImageBufferManager": "LNAnimatedImageBufferManager",
+        "QGMP4MdatBox": "LNMP4MdatBox",
+        "QGMP4AvccBox": "LNMP4AvccBox",
+        "QGMP4HvccBox": "LNMP4HvccBox",
+        "QGMP4MvhdBox": "LNMP4MvhdBox",
+        "QGMP4StsdBox": "LNMP4StsdBox",
+        "QGMP4StszBox": "LNMP4StszBox",
+        "QGStscEntry": "LNStscEntry",
+        "QGMP4StscBox": "LNMP4StscBox",
+        "QGMP4StcoBox": "LNMP4StcoBox",
+        "QGMP4StssBox": "LNMP4StssBox",
+        "QGCttsEntry": "LNCttsEntry",
+        "QGMP4CttsBox": "LNMP4CttsBox",
+        "QGSttsEntry": "LNSttsEntry",
+        "QGMP4SttsBox": "LNMP4SttsBox",
+        "QGMP4TrackBox": "LNMP4TrackBox",
+        "QGMP4HdlrBox": "LNMP4HdlrBox",
+        "QGMP4Sample": "LNMP4Sample",
+        "QGChunkOffsetEntry": "LNChunkOffsetEntry",
+        "QGMP4BoxFactory": "LNMP4BoxFactory",
+        "QGMP4Parser": "LNMP4Parser",
+        "QGMP4ParserProxy": "LNMP4ParserProxy",
+
+        "QGAnimatedImageDecodeConfig": "LNAnimatedImageDecodeConfig",
         "QGAnimatedImageDecodeThread": "LNAnimatedImageDecodeThread",
         "QGAnimatedImageDecodeThreadPool": "LNAnimatedImageDecodeThreadPool",
+        "QGAnimatedImageDecodeManager": "LNAnimatedImageDecodeManager",
+        "QGAnimatedImageBufferManager": "LNAnimatedImageBufferManager",
         "QGBaseDecoder": "LNBaseDecoder",
         "QGMP4FrameHWDecoder": "LNMP4FrameHWDecoder",
-        "QGVAPConfigModel": "LNVAPConfigModel",
-        "QGVAPSourceInfo": "LNVAPSourceInfo",
-        "QGVAPSourceDisplayItem": "LNVAPSourceDisplayItem",
-        "QGVAPMaskInfo": "LNVAPMaskInfo",
+        "QGVAPConfigManager": "LNVAPConfigManager",
+
+        "QGVAPLogger": "LNVAPLogger",
+        "QGVAPSafeMutableArray": "LNVAPSafeMutableArray",
+        "QGVAPSafeMutableDictionary": "LNVAPSafeMutableDictionary",
+        "QGVAPWeakProxy": "LNVAPWeakProxy",
+        "QGVAPMetalShaderFunctionLoader": "LNVAPMetalShaderFunctionLoader",
+        "QGVAPMetalUtil": "LNVAPMetalUtil",
+
         "QGHWDMetalRenderer": "LNHWDMetalRenderer",
         "QGHWDMetalView": "LNHWDMetalView",
         "QGVAPMetalRenderer": "LNVAPMetalRenderer",

+ 6 - 0
QGVAPlayer/QGVAPlayer/LNSwift/Utils/LNUtilities.swift

@@ -18,6 +18,12 @@ public final class LNVAPLogger: NSObject {
         lock.unlock()
     }
 
+    // Legacy ObjC parity: +[QGVAPLogger registerExternalLog:]
+    @objc(registerExternalLog:)
+    public static func registerExternalLog(_ handler: @escaping LNLogHandler) {
+        registerLogHandler(handler)
+    }
+
     @objc(clearLogHandler)
     public static func clearLogHandler() {
         lock.lock()

+ 13 - 11
QGVAPlayer/QGVAPlayer/LNSwift/View/LNVAPPlayerView.swift

@@ -209,10 +209,8 @@ public final class LNVAPPlayerView: UIView {
     }
 
     fileprivate func notifyStopIfNeeded(lastFrameIndex: Int) {
-        if didStart {
-            delegate?.lnPlayerDidStop?(self)
-            legacyDelegate?.viewDidStopPlayMP4?(lastFrameIndex, view: self)
-        }
+        delegate?.lnPlayerDidStop?(self)
+        legacyDelegate?.viewDidStopPlayMP4?(lastFrameIndex, view: self)
         didStart = false
     }
 
@@ -356,13 +354,15 @@ private final class LNPlayerCore: NSObject {
 
         stopInternal(triggerDelegate: false)
 
+        // Keep parity with OC: each new play resets background behavior to do-nothing.
+        enterBackgroundOperation = .doNothing
         isFinish = false
         onPause = false
         onSeek = false
         self.filePath = filePath
         self.repeatCount = repeatCount
 
-        if callbackQueue == nil, owner?.delegate != nil {
+        if callbackQueue == nil, (owner?.delegate != nil || owner?.legacyDelegate != nil) {
             let queue = OperationQueue()
             queue.maxConcurrentOperationCount = 1
             callbackQueue = queue
@@ -380,19 +380,19 @@ private final class LNPlayerCore: NSObject {
 
         if configManager.model.info?.version ?? 0 > lnMaxCompatibleVAPVersion {
             notifyFail(message: "not compatible vap version", code: LNMP4HWDErrorCode.invalidMP4File.rawValue)
-            stopInternal(triggerDelegate: false)
+            stopInternal(triggerDelegate: true)
             return
         }
 
         if !configManager.hasValidConfig && !enableOldVersion {
             notifyFail(message: "missing vapc box and oldVersion disabled", code: LNMP4HWDErrorCode.invalidMP4File.rawValue)
-            stopInternal(triggerDelegate: false)
+            stopInternal(triggerDelegate: true)
             return
         }
 
 #if targetEnvironment(simulator)
         notifyFail(message: "not allowed in simulator", code: LNMP4HWDErrorCode.invalidMP4File.rawValue)
-        stopInternal(triggerDelegate: false)
+        stopInternal(triggerDelegate: true)
         return
 #endif
 
@@ -584,7 +584,7 @@ private final class LNPlayerCore: NSObject {
         decodeManager?.tryToStopAudioPlay()
 
         if triggerDelegate {
-            let lastFrameIndex = currentFrame?.frameIndex ?? -1
+            let lastFrameIndex = currentFrame?.frameIndex ?? 0
             performCallback { [weak self] in
                 guard let self, let owner = self.owner else { return }
                 owner.notifyStopIfNeeded(lastFrameIndex: lastFrameIndex)
@@ -625,6 +625,8 @@ private final class LNPlayerCore: NSObject {
         switch enterBackgroundOperation {
         case .pauseAndResume:
             pause()
+        case .doNothing:
+            break
         default:
             stop()
         }
@@ -686,7 +688,7 @@ extension LNPlayerCore: LNAnimatedImageDecoderDelegate {
     }
 
     func decoderDidFailDecode(_ decoder: LNBaseDecoder?, error: NSError) {
-        stopInternal(triggerDelegate: false)
+        stopInternal(triggerDelegate: true)
         performCallback { [weak self] in
             self?.owner?.notifyFail(error)
         }
@@ -699,7 +701,7 @@ extension LNPlayerCore: LNHWDMP4OpenGLViewDelegate, LNHWDMetalViewDelegate, LNVA
     }
 
     func onMetalViewUnavailable() {
-        stopInternal(triggerDelegate: true)
+        // Keep parity with OC: metal unavailable callback does not force-stop by default.
     }
 }
 

+ 10 - 3
QGVAPlayer/QGVAPlayer/LNSwift/View/LNVAPWrapView.swift

@@ -47,6 +47,7 @@ public final class LNVAPWrapView: UIView {
 
     @objc(lnPlayWithFilePath:repeatCount:)
     public func lnPlay(filePath: String, repeatCount: Int) {
+        delegateBridge.lastPlayedFrameIndex = 0
         let player = initPlayerViewIfNeed()
         player.lnPlay(filePath: filePath, repeatCount: repeatCount)
     }
@@ -64,6 +65,7 @@ public final class LNVAPWrapView: UIView {
                                  delegate: LNVAPWrapPlaybackDelegate?) {
         _ = blendMode
         self.delegate = delegate
+        delegateBridge.lastPlayedFrameIndex = 0
         let player = initPlayerViewIfNeed()
         player.fps = fps
         player.lnPlay(filePath: filePath, repeatCount: repeatCount)
@@ -153,13 +155,16 @@ public final class LNVAPWrapView: UIView {
     }
 
     fileprivate func notifyFinish(_ totalFrameCount: Int) {
-        delegate?.lnWrapViewDidFinish?(self, totalFrameCount: totalFrameCount)
-        legacyDelegate?.vapWrap_viewDidFinishPlayMP4?(totalFrameCount, view: self)
+        let computedCount = max(totalFrameCount, delegateBridge.lastPlayedFrameIndex + 1)
+        delegate?.lnWrapViewDidFinish?(self, totalFrameCount: computedCount)
+        legacyDelegate?.vapWrap_viewDidFinishPlayMP4?(computedCount, view: self)
     }
 
     fileprivate func notifyStop() {
         delegate?.lnWrapViewDidStop?(self)
-        legacyDelegate?.vapWrap_viewDidStopPlayMP4?(0, view: self)
+        let lastFrameIndex = delegateBridge.lastPlayedFrameIndex
+        legacyDelegate?.vapWrap_viewDidStopPlayMP4?(lastFrameIndex, view: self)
+        delegateBridge.lastPlayedFrameIndex = 0
         DispatchQueue.main.async { [weak self] in
             guard let self else { return }
             if self.autoDestroyAfterFinish {
@@ -260,6 +265,7 @@ public final class LNVAPWrapView: UIView {
 private final class LNWrapDelegateBridge: NSObject, LNVAPPlaybackDelegate {
     weak var owner: LNVAPWrapView?
     var lastConfig: LNVAPConfigModel?
+    var lastPlayedFrameIndex: Int = 0
 
     func lnPlayerShouldStart(_ playerView: LNVAPPlayerView, config: LNVAPConfigModel) -> Bool {
         lastConfig = config
@@ -271,6 +277,7 @@ private final class LNWrapDelegateBridge: NSObject, LNVAPPlaybackDelegate {
     }
 
     func lnPlayerDidPlay(_ playerView: LNVAPPlayerView, frame: LNMP4AnimatedImageFrame) {
+        lastPlayedFrameIndex = frame.frameIndex
         owner?.notifyPlay(frame)
     }