Refactoring

This commit is contained in:
shogo4405 2017-03-20 00:56:31 +09:00
parent 43d7e7fd32
commit 8446dbe35c
7 changed files with 72 additions and 33 deletions

View File

@ -0,0 +1,12 @@
import Foundation
import CoreMedia
extension CMFormatDescription {
var extensions:[String: AnyObject]? {
return CMFormatDescriptionGetExtensions(self) as? [String : AnyObject]
}
func getExtension(by key:String) -> [String: AnyObject]? {
return CMFormatDescriptionGetExtension(self, key as CFString) as? [String : AnyObject]
}
}

View File

@ -9,7 +9,7 @@ protocol VideoDecoderDelegate: class {
}
// MARK: -
final class AVCDecoder {
final class H264Decoder {
#if os(iOS)
static let defaultAttributes:[NSString: AnyObject] = [
kCVPixelBufferPixelFormatTypeKey: Int(kCVPixelFormatType_32BGRA) as AnyObject,
@ -26,15 +26,22 @@ final class AVCDecoder {
var formatDescription:CMFormatDescription? = nil {
didSet {
if let atoms:[String: AnyObject] = formatDescription?.getExtension(by: "SampleDescriptionExtensionAtoms"), let avcC:Data = atoms["avcC"] as? Data {
let config:AVCConfigurationRecord = AVCConfigurationRecord(data: avcC)
isBaseline = config.AVCProfileIndication == 66
}
invalidateSession = true
}
}
weak var delegate:VideoDecoderDelegate?
private var isBaseline:Bool = true
private var buffers:[CMSampleBuffer] = []
private var attributes:[NSString:AnyObject] {
return AVCDecoder.defaultAttributes
return H264Decoder.defaultAttributes
}
private var minimumGroupOfPictures:Int = 12
private(set) var status:OSStatus = noErr {
didSet {
if (status != noErr) {
@ -51,7 +58,7 @@ final class AVCDecoder {
imageBuffer:CVBuffer?,
presentationTimeStamp:CMTime,
duration:CMTime) in
let decoder:AVCDecoder = unsafeBitCast(decompressionOutputRefCon, to: AVCDecoder.self)
let decoder:H264Decoder = unsafeBitCast(decompressionOutputRefCon, to: H264Decoder.self)
decoder.didOutputForSession(status, infoFlags: infoFlags, imageBuffer: imageBuffer, presentationTimeStamp: presentationTimeStamp, duration: duration)
}
@ -129,8 +136,20 @@ final class AVCDecoder {
&sampleBuffer
)
if let buffer:CMSampleBuffer = sampleBuffer {
guard let buffer:CMSampleBuffer = sampleBuffer else {
return
}
if (isBaseline) {
delegate?.sampleOutput(video: buffer)
} else {
buffers.append(buffer)
buffers.sort(by: { (lhs: CMSampleBuffer, rhs: CMSampleBuffer) -> Bool in
return lhs.presentationTimeStamp < rhs.presentationTimeStamp
})
if (minimumGroupOfPictures <= buffers.count) {
delegate?.sampleOutput(video: buffers.removeFirst())
}
}
}

View File

@ -9,7 +9,7 @@ protocol VideoEncoderDelegate: class {
}
// MARK: -
final class AVCEncoder: NSObject {
final class H264Encoder: NSObject {
static let supportedSettingsKeys:[String] = [
"muted",
@ -42,7 +42,7 @@ final class AVCEncoder: NSObject {
static let defaultDataRateLimits:[Int] = [0, 0]
var muted:Bool = false
var scalingMode:String = AVCEncoder.defaultScalingMode {
var scalingMode:String = H264Encoder.defaultScalingMode {
didSet {
guard scalingMode != oldValue else {
return
@ -51,7 +51,7 @@ final class AVCEncoder: NSObject {
}
}
var width:Int32 = AVCEncoder.defaultWidth {
var width:Int32 = H264Encoder.defaultWidth {
didSet {
guard width != oldValue else {
return
@ -59,7 +59,7 @@ final class AVCEncoder: NSObject {
invalidateSession = true
}
}
var height:Int32 = AVCEncoder.defaultHeight {
var height:Int32 = H264Encoder.defaultHeight {
didSet {
guard height != oldValue else {
return
@ -75,7 +75,7 @@ final class AVCEncoder: NSObject {
invalidateSession = true
}
}
var bitrate:UInt32 = AVCEncoder.defaultBitrate {
var bitrate:UInt32 = H264Encoder.defaultBitrate {
didSet {
guard bitrate != oldValue else {
return
@ -111,12 +111,12 @@ final class AVCEncoder: NSObject {
}
}
}
var dataRateLimits:[Int] = AVCEncoder.defaultDataRateLimits {
var dataRateLimits:[Int] = H264Encoder.defaultDataRateLimits {
didSet {
guard dataRateLimits != oldValue else {
return
}
if (dataRateLimits == AVCEncoder.defaultDataRateLimits) {
if (dataRateLimits == H264Encoder.defaultDataRateLimits) {
invalidateSession = true
return
}
@ -169,7 +169,7 @@ final class AVCEncoder: NSObject {
internal(set) var running:Bool = false
fileprivate(set) var status:OSStatus = noErr
fileprivate var attributes:[NSString: AnyObject] {
var attributes:[NSString: AnyObject] = AVCEncoder.defaultAttributes
var attributes:[NSString: AnyObject] = H264Encoder.defaultAttributes
attributes[kCVPixelBufferWidthKey] = NSNumber(value: width)
attributes[kCVPixelBufferHeightKey] = NSNumber(value: height)
return attributes
@ -200,7 +200,7 @@ final class AVCEncoder: NSObject {
}
#endif
if (dataRateLimits != AVCEncoder.defaultDataRateLimits) {
if (dataRateLimits != H264Encoder.defaultDataRateLimits) {
properties[kVTCompressionPropertyKey_DataRateLimits] = dataRateLimits as NSObject
}
if (!isBaseline) {
@ -218,7 +218,7 @@ final class AVCEncoder: NSObject {
guard let sampleBuffer:CMSampleBuffer = sampleBuffer , status == noErr else {
return
}
let encoder:AVCEncoder = unsafeBitCast(outputCallbackRefCon, to: AVCEncoder.self)
let encoder:H264Encoder = unsafeBitCast(outputCallbackRefCon, to: H264Encoder.self)
encoder.formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer)
encoder.delegate?.sampleOutput(video: sampleBuffer)
}
@ -303,7 +303,7 @@ final class AVCEncoder: NSObject {
#endif
}
extension AVCEncoder: Runnable {
extension H264Encoder: Runnable {
// MARK: Runnable
func startRunning() {
lockQueue.async {

View File

@ -10,8 +10,8 @@ final class VideoIOComponent: IOComponent {
decoder.formatDescription = formatDescription
}
}
lazy var encoder:AVCEncoder = AVCEncoder()
lazy var decoder:AVCDecoder = AVCDecoder()
lazy var encoder:H264Encoder = H264Encoder()
lazy var decoder:H264Decoder = H264Decoder()
lazy var queue:ClockedQueue = {
let queue:ClockedQueue = ClockedQueue()
queue.delegate = self

View File

@ -83,7 +83,7 @@ open class NetStream: NSObject {
get {
var videoSettings:[String:Any]!
lockQueue.sync {
videoSettings = self.mixer.videoIO.encoder.dictionaryWithValues(forKeys: AVCEncoder.supportedSettingsKeys)
videoSettings = self.mixer.videoIO.encoder.dictionaryWithValues(forKeys: H264Encoder.supportedSettingsKeys)
}
return videoSettings
}

View File

@ -218,7 +218,7 @@ open class RTMPStream: NetStream {
static let defaultID:UInt32 = 0
open static let defaultAudioBitrate:UInt32 = AACEncoder.defaultBitrate
open static let defaultVideoBitrate:UInt32 = AVCEncoder.defaultBitrate
open static let defaultVideoBitrate:UInt32 = H264Encoder.defaultBitrate
open var qosStrategy:RTMPStreamQoSStrategy = NoneRTMPStreamQoSStrategy()
open internal(set) var info:RTMPStreamInfo = RTMPStreamInfo()
open fileprivate(set) var objectEncoding:UInt8 = RTMPConnection.defaultObjectEncoding

View File

@ -49,6 +49,9 @@
2926A9EF1DE6B83F0074E3D2 /* MachUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2926A9EB1DE6B71D0074E3D2 /* MachUtil.swift */; };
2926A9F21DE6F08E0074E3D2 /* TimerDriver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2926A9F01DE6EAEB0074E3D2 /* TimerDriver.swift */; };
2926A9F31DE6F08F0074E3D2 /* TimerDriver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2926A9F01DE6EAEB0074E3D2 /* TimerDriver.swift */; };
2927A29A1E7ED2D70044AF91 /* LICENSE.md in Sources */ = {isa = PBXBuildFile; fileRef = 2927A2991E7ED2D70044AF91 /* LICENSE.md */; };
2927A29C1E7EE50B0044AF91 /* CMFormatDescription+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2927A29B1E7EE50B0044AF91 /* CMFormatDescription+Extension.swift */; };
2927A29D1E7EE6CA0044AF91 /* CMFormatDescription+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2927A29B1E7EE50B0044AF91 /* CMFormatDescription+Extension.swift */; };
292AC17C1CF4C871004F5730 /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2942424C1CF4C01300D65DCB /* MD5.swift */; };
292D8A331D8B293300DBECE2 /* MP4Sampler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292D8A321D8B293300DBECE2 /* MP4Sampler.swift */; };
292D8A341D8B294900DBECE2 /* MP4Sampler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292D8A321D8B293300DBECE2 /* MP4Sampler.swift */; };
@ -111,8 +114,8 @@
29AF3FCF1D7C744C00E41212 /* NetStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29AF3FCE1D7C744C00E41212 /* NetStream.swift */; };
29AF3FD01D7C745200E41212 /* NetStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29AF3FCE1D7C744C00E41212 /* NetStream.swift */; };
29B8765B1CD70A7900FC07DA /* AACEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876571CD70A7900FC07DA /* AACEncoder.swift */; };
29B8765C1CD70A7900FC07DA /* AVCDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876581CD70A7900FC07DA /* AVCDecoder.swift */; };
29B8765D1CD70A7900FC07DA /* AVCEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876591CD70A7900FC07DA /* AVCEncoder.swift */; };
29B8765C1CD70A7900FC07DA /* H264Decoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876581CD70A7900FC07DA /* H264Decoder.swift */; };
29B8765D1CD70A7900FC07DA /* H264Encoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876591CD70A7900FC07DA /* H264Encoder.swift */; };
29B876691CD70AB300FC07DA /* Constant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876631CD70AB300FC07DA /* Constant.swift */; };
29B8766D1CD70AB300FC07DA /* Protocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876671CD70AB300FC07DA /* Protocol.swift */; };
29B876761CD70ACE00FC07DA /* HTTPRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B8766F1CD70ACE00FC07DA /* HTTPRequest.swift */; };
@ -151,8 +154,8 @@
29B876BD1CD70B3900FC07DA /* CRC32.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876B91CD70B3900FC07DA /* CRC32.swift */; };
29B876BE1CD70B3900FC07DA /* EventDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876BA1CD70B3900FC07DA /* EventDispatcher.swift */; };
29B876EC1CD70D5900FC07DA /* AACEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876571CD70A7900FC07DA /* AACEncoder.swift */; };
29B876ED1CD70D5900FC07DA /* AVCDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876581CD70A7900FC07DA /* AVCDecoder.swift */; };
29B876EE1CD70D5900FC07DA /* AVCEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876591CD70A7900FC07DA /* AVCEncoder.swift */; };
29B876ED1CD70D5900FC07DA /* H264Decoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876581CD70A7900FC07DA /* H264Decoder.swift */; };
29B876EE1CD70D5900FC07DA /* H264Encoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876591CD70A7900FC07DA /* H264Encoder.swift */; };
29B876F01CD70D5900FC07DA /* Constant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876631CD70AB300FC07DA /* Constant.swift */; };
29B876F41CD70D5900FC07DA /* Protocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876671CD70AB300FC07DA /* Protocol.swift */; };
29B876F61CD70D5900FC07DA /* HTTPRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B8766F1CD70ACE00FC07DA /* HTTPRequest.swift */; };
@ -362,6 +365,8 @@
29245AEC1D3233EB00AFFB9A /* VideoGravityUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = VideoGravityUtil.swift; path = Sources/Util/VideoGravityUtil.swift; sourceTree = SOURCE_ROOT; };
2926A9EB1DE6B71D0074E3D2 /* MachUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MachUtil.swift; path = Sources/Util/MachUtil.swift; sourceTree = SOURCE_ROOT; };
2926A9F01DE6EAEB0074E3D2 /* TimerDriver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TimerDriver.swift; path = Sources/Util/TimerDriver.swift; sourceTree = SOURCE_ROOT; };
2927A2991E7ED2D70044AF91 /* LICENSE.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = LICENSE.md; sourceTree = "<group>"; };
2927A29B1E7EE50B0044AF91 /* CMFormatDescription+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CMFormatDescription+Extension.swift"; sourceTree = SOURCE_ROOT; };
292D8A301D8B233C00DBECE2 /* MovieClipHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MovieClipHandler.swift; path = Examples/iOS/Screencast/MovieClipHandler.swift; sourceTree = "<group>"; };
292D8A321D8B293300DBECE2 /* MP4Sampler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MP4Sampler.swift; path = Sources/ISO/MP4Sampler.swift; sourceTree = SOURCE_ROOT; };
2930D03D1E12D12100DA2DC5 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = Examples/iOS/Screencast/README.md; sourceTree = "<group>"; };
@ -405,7 +410,6 @@
2981E1301D646E3F00E8F7CA /* Cartfile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Cartfile; sourceTree = "<group>"; };
298BCF321DD4C44A007FF86A /* AnyUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AnyUtil.swift; path = Sources/Util/AnyUtil.swift; sourceTree = SOURCE_ROOT; };
2997BDD31D50D31B000AF900 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
2997BDD51D50D3D5000AF900 /* LICENSE.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE.txt; sourceTree = "<group>"; };
299AE0E21D44E6EE00D26A49 /* RTSPConnection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RTSPConnection.swift; path = Sources/RTSP/RTSPConnection.swift; sourceTree = SOURCE_ROOT; };
299AE0E41D44EC7800D26A49 /* RTSPSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RTSPSocket.swift; path = Sources/RTSP/RTSPSocket.swift; sourceTree = SOURCE_ROOT; };
299B131C1D35272D00A1E8F5 /* ScreenCaptureSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ScreenCaptureSession.swift; path = Platforms/iOS/ScreenCaptureSession.swift; sourceTree = "<group>"; };
@ -418,8 +422,8 @@
29AF3FCE1D7C744C00E41212 /* NetStream.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NetStream.swift; path = Sources/Net/NetStream.swift; sourceTree = SOURCE_ROOT; };
29B8761B1CD701F900FC07DA /* lf.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = lf.framework; sourceTree = BUILT_PRODUCTS_DIR; };
29B876571CD70A7900FC07DA /* AACEncoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AACEncoder.swift; path = Sources/Codec/AACEncoder.swift; sourceTree = SOURCE_ROOT; };
29B876581CD70A7900FC07DA /* AVCDecoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AVCDecoder.swift; path = Sources/Codec/AVCDecoder.swift; sourceTree = SOURCE_ROOT; };
29B876591CD70A7900FC07DA /* AVCEncoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AVCEncoder.swift; path = Sources/Codec/AVCEncoder.swift; sourceTree = SOURCE_ROOT; };
29B876581CD70A7900FC07DA /* H264Decoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = H264Decoder.swift; path = Sources/Codec/H264Decoder.swift; sourceTree = SOURCE_ROOT; };
29B876591CD70A7900FC07DA /* H264Encoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = H264Encoder.swift; path = Sources/Codec/H264Encoder.swift; sourceTree = SOURCE_ROOT; };
29B876631CD70AB300FC07DA /* Constant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Constant.swift; path = Sources/Core/Constant.swift; sourceTree = SOURCE_ROOT; };
29B876671CD70AB300FC07DA /* Protocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Protocol.swift; path = Sources/Core/Protocol.swift; sourceTree = SOURCE_ROOT; };
29B8766F1CD70ACE00FC07DA /* HTTPRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = HTTPRequest.swift; path = Sources/HTTP/HTTPRequest.swift; sourceTree = SOURCE_ROOT; };
@ -563,8 +567,8 @@
isa = PBXGroup;
children = (
29B876571CD70A7900FC07DA /* AACEncoder.swift */,
29B876581CD70A7900FC07DA /* AVCDecoder.swift */,
29B876591CD70A7900FC07DA /* AVCEncoder.swift */,
29B876581CD70A7900FC07DA /* H264Decoder.swift */,
29B876591CD70A7900FC07DA /* H264Encoder.swift */,
);
name = Codec;
sourceTree = "<group>";
@ -662,9 +666,9 @@
isa = PBXGroup;
children = (
2981E1301D646E3F00E8F7CA /* Cartfile */,
2927A2991E7ED2D70044AF91 /* LICENSE.md */,
2997BDD31D50D31B000AF900 /* README.md */,
29E258361D7C249B0070DC07 /* lf.podspec */,
2997BDD51D50D3D5000AF900 /* LICENSE.txt */,
2968973E1CDB01920074D5F0 /* Examples */,
0ACC00B98D6DB33B5BE87B87 /* Frameworks */,
299F7E371CD71A76001E7272 /* Platforms */,
@ -935,6 +939,7 @@
children = (
29EA87E51E79A2780043A5F8 /* CMAudioFormatDescription+Extension.swift */,
29EA87E91E79A3B70043A5F8 /* CMBlockBuffer+Extension.swift */,
2927A29B1E7EE50B0044AF91 /* CMFormatDescription+Extension.swift */,
29EA87DE1E79A0810043A5F8 /* CMSampleBuffer+Extension.swift */,
29EA87EF1E79A4120043A5F8 /* CMSampleTimingInfo+Extension.swift */,
29EA87E11E79A1E90043A5F8 /* CMVideoFormatDescription+Extension.swift */,
@ -1338,7 +1343,7 @@
296242611D8DB86500C451A3 /* TSReader.swift in Sources */,
2981B7F41D7345D5002FA821 /* SessionDescription.swift in Sources */,
2931204E1D4522E400B14211 /* RTSPResponse.swift in Sources */,
29B8765D1CD70A7900FC07DA /* AVCEncoder.swift in Sources */,
29B8765D1CD70A7900FC07DA /* H264Encoder.swift in Sources */,
29B876B31CD70B2800FC07DA /* FLVTag.swift in Sources */,
29AF3FCF1D7C744C00E41212 /* NetStream.swift in Sources */,
29DD70E41D68CACA0021904A /* RTSPStream.swift in Sources */,
@ -1390,6 +1395,7 @@
29798E521CE5DF1A00F5CBD0 /* MP4Reader.swift in Sources */,
295747911E37AC1000EF056E /* RTMPStreamQoSStrategy.swift in Sources */,
29B876AC1CD70B2800FC07DA /* AMF3Serializer.swift in Sources */,
2927A29C1E7EE50B0044AF91 /* CMFormatDescription+Extension.swift in Sources */,
29B876921CD70AFE00FC07DA /* AVMixer.swift in Sources */,
29B876911CD70AFE00FC07DA /* AudioStreamPlayback.swift in Sources */,
2975EF6F1D6096FB00DABA5A /* Mutex.swift in Sources */,
@ -1400,7 +1406,8 @@
29245AEF1D32348400AFFB9A /* VideoGravityUtil.swift in Sources */,
29B876901CD70AFE00FC07DA /* AudioIOComponent.swift in Sources */,
29B876771CD70ACE00FC07DA /* HTTPResponse.swift in Sources */,
29B8765C1CD70A7900FC07DA /* AVCDecoder.swift in Sources */,
2927A29A1E7ED2D70044AF91 /* LICENSE.md in Sources */,
29B8765C1CD70A7900FC07DA /* H264Decoder.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1434,8 +1441,8 @@
files = (
296543601D62FE6A00734698 /* AudioUtil.swift in Sources */,
29B876EC1CD70D5900FC07DA /* AACEncoder.swift in Sources */,
29B876ED1CD70D5900FC07DA /* AVCDecoder.swift in Sources */,
29B876EE1CD70D5900FC07DA /* AVCEncoder.swift in Sources */,
29B876ED1CD70D5900FC07DA /* H264Decoder.swift in Sources */,
29B876EE1CD70D5900FC07DA /* H264Encoder.swift in Sources */,
293120501D4529FB00B14211 /* RTSPResponse.swift in Sources */,
29EA87EB1E79A3B70043A5F8 /* CMBlockBuffer+Extension.swift in Sources */,
29B876F01CD70D5900FC07DA /* Constant.swift in Sources */,
@ -1443,6 +1450,7 @@
292AC17C1CF4C871004F5730 /* MD5.swift in Sources */,
295747921E3A30A400EF056E /* RTMPStreamQoSStrategy.swift in Sources */,
29B876F41CD70D5900FC07DA /* Protocol.swift in Sources */,
2927A29D1E7EE6CA0044AF91 /* CMFormatDescription+Extension.swift in Sources */,
2976A4821D4902CE00B53EF2 /* IOComponent.swift in Sources */,
29EA87E71E79A2780043A5F8 /* CMAudioFormatDescription+Extension.swift in Sources */,
29B876F61CD70D5900FC07DA /* HTTPRequest.swift in Sources */,