# Model + Parser API Migration Table (OC -> LN Swift)

## Model

| OC Class | OC API | Swift Class | Swift API | Status |
|---|---|---|---|---|
| `QGBaseDFileInfo` | properties: `filePath`, `occupiedCount` | `LNBaseDFileInfo` | same semantic properties | Done |
| `QGBaseAnimatedImageFrame` | properties: `frameIndex`, `duration`, `pts` | `LNBaseAnimatedImageFrame` | same semantic properties | Done |
| `QGBaseAnimatedImageFrame+Displaying` | `-shouldFinishDisplaying` + `startDate`/`decodeTime` | `LNBaseAnimatedImageFrame` | `@objc(shouldFinishDisplaying) shouldFinishDisplaying()` + same properties | Done |
| `QGMP4AnimatedImageFrame` | properties: `pixelBuffer`, `defaultFps` | `LNMP4AnimatedImageFrame` | same semantic properties | Done |
| `QGMP4HWDFileInfo` | property: `mp4Parser` | `LNMP4HWDFileInfo` | property: `mp4Parser: LNMP4ParserProxy?` | Done |
| `QGVAPConfigModel` | properties: `info/resources/mergedConfig` | `LNVAPConfigModel` | same semantic properties | Done |
| `QGVAPCommonInfo` | common info properties | `LNVAPCommonInfo` | same semantic properties | Done |
| `QGVAPSourceInfo` | source properties | `LNVAPSourceInfo` | same semantic properties | Done |
| `QGVAPSourceDisplayItem` | `frame/sourceInfo` | `LNVAPSourceDisplayItem` | same semantic properties | Done |
| `QGVAPMergedInfo` | `-vertexBufferWithContainerSize:maskContianerSize:device:` | `LNVAPMergedInfo` | `@objc(vertexBufferWithContainerSize:maskContianerSize:device:) vertexBuffer(containerSize:maskContianerSize:device:)` | Done |
| `QGVAPMaskInfo` | computed readonly `texture` + mask properties | `LNVAPMaskInfo` | computed readonly `texture` + same semantic properties | Done |
| `QGVAPTextureLoader` | `+loadVapColorFillBufferWith:device:` | `LNVAPTextureLoader` | same ObjC selector exposed via `@objc` | Done |
| `QGVAPTextureLoader` | `+loadTextureWithImage:device:` | `LNVAPTextureLoader` | same ObjC selector exposed via `@objc` | Done |
| `QGVAPTextureLoader` | `+loadTextureWithData:device:width:height:` | `LNVAPTextureLoader` | same ObjC selector exposed via `@objc` | Done |
| `QGVAPTextureLoader` | `+drawingImageForText:color:size:bold:` | `LNVAPTextureLoader` | same ObjC selector exposed via `@objc` | Done |
| `QGVAPTextureLoader` | `+getAppropriateFontWith:rect:designedSize:bold:textSize:` | `LNVAPTextureLoader` | same ObjC selector exposed via `@objc` | Done |

## Parser

| OC Class | OC API | Swift Class | Swift API | Status |
|---|---|---|---|---|
| `QGMP4BoxFactory` | `+isTypeValueValid:` | `LNMP4BoxFactory` | `@objc(isTypeValueValid:) isTypeValueValid(_:)` | Done |
| `QGMP4BoxFactory` | `+boxClassForType:` | `LNMP4BoxFactory` | `@objc(boxClassForType:) boxClass(for:)` | Done |
| `QGMP4BoxFactory` | `+createBoxForType:startIndex:length:` | `LNMP4BoxFactory` | `@objc(createBoxForType:startIndex:length:) createBox(for:startIndex:length:)` | Done |
| `QGMP4Box` | `-initWithType:startIndex:length:` | `LNMP4Box` | `init(type:startIndex:length:)` | Done |
| `QGMP4Box` | `-subBoxOfType:` | `LNMP4Box` | `@objc(subBoxOfType:) subBox(ofType:)` | Done |
| `QGMP4Box` | `-superBoxOfType:` | `LNMP4Box` | `@objc(superBoxOfType:) superBox(ofType:)` | Done |
| `QGMP4Box` + subclasses | `-boxDidParsed:` | `LNMP4Box` + subclasses | `boxDidParsed(_:)` (override in parsed box subclasses) | Done |
| `QGMP4Parser` | `-initWithFilePath:` | `LNMP4Parser` | `init(filePath:)` | Done |
| `QGMP4Parser` | `-parse` | `LNMP4Parser` | `parse()` | Done |
| `QGMP4Parser` | `-readDataForBox:` | `LNMP4Parser` | `@objc(readDataForBox:) readData(for:)` | Done |
| `QGMP4Parser` | `-readValue:length:` | `LNMP4Parser` | `@objc(readValue:length:) readValue(_:length:)` | Done |
| `QGMP4ParserDelegate` | `-didParseMP4Box:parser:` | `LNMP4ParserDelegate` | `didParseMP4Box(_:parser:)` | Done |
| `QGMP4ParserDelegate` | `-MP4FileDidFinishParse:` | `LNMP4ParserDelegate` | `mp4FileDidFinishParse(_:)` | Done (Swift-style name) |
| `QGMP4ParserProxy` | `-initWithFilePath:` | `LNMP4ParserProxy` | `init(filePath:)` | Done |
| `QGMP4ParserProxy` | `-parse` | `LNMP4ParserProxy` | `parse()` | Done |
| `QGMP4ParserProxy` | `-readPacketOfSample:` | `LNMP4ParserProxy` | `@objc(readPacketOfSample:) readPacket(ofSample:)` | Done |
| `QGMP4ParserProxy` | `-readDataOfBox:length:offset:` | `LNMP4ParserProxy` | `@objc(readDataOfBox:length:offset:) readData(of:length:offset:)` | Done |

## Scope note

- 本表是 **Model + Parser API 层对照**。实现文件位于：
  - `/Users/yanxuyao/Vap/QGVAPlayer/QGVAPlayer/LNSwift/Model/LNModels.swift`
  - `/Users/yanxuyao/Vap/QGVAPlayer/QGVAPlayer/LNSwift/Parser/LNMP4Parser.swift`
- 已验证构建：`QGVAPlayer` / `QGVAPlayerDemo` / `QGVAPlayerDemoSwift` 全部通过。
