HaishinKit.swift/Sources/MP4/MP4BoxConvertible.swift

44 lines
1.2 KiB
Swift

import Foundation
protocol MP4BoxConvertible: DataConvertible, CustomXmlStringConvertible {
var size: UInt32 { get }
var type: String { get }
var offset: UInt64 { get set }
var children: [MP4BoxConvertible] { get }
init()
func getBoxes<T>(by name: MP4Box.Name<T>) -> [T]
}
extension MP4BoxConvertible {
var xmlString: String {
guard !children.isEmpty else {
return "<\(type) size=\"\(size)\" offset=\"\(offset)\" />"
}
var tags: [String] = []
for child in children {
tags.append(child.xmlString)
}
return "<\(type) size=\"\(size)\" offset=\"\(offset)\">\(tags.joined())</\(type)>"
}
func getBoxes<T>(by name: MP4Box.Name<T>) -> [T] {
var list: [T] = []
for child in children {
if name.rawValue == child.type {
if let box = child as? T {
list.append(box)
} else {
var box = T()
box.data = child.data
list.append(box)
}
}
if !child.children.isEmpty {
list += child.getBoxes(by: name)
}
}
return list
}
}