Remove MP4 classes.
This commit is contained in:
parent
be347428a8
commit
cea6194b17
|
@ -39,8 +39,6 @@
|
|||
2923A1F71D63005F0019FBCD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 296543651D62FEB700734698 /* Assets.xcassets */; };
|
||||
2923A1F81D6300650019FBCD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296543641D62FEB700734698 /* AppDelegate.swift */; };
|
||||
292AC17C1CF4C871004F5730 /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2942424C1CF4C01300D65DCB /* MD5.swift */; };
|
||||
292D8A331D8B293300DBECE2 /* MP4Reader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292D8A321D8B293300DBECE2 /* MP4Reader.swift */; };
|
||||
292D8A341D8B294900DBECE2 /* MP4Reader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292D8A321D8B293300DBECE2 /* MP4Reader.swift */; };
|
||||
2930D0411E12D35400DA2DC5 /* SampleHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2930D03F1E12D17C00DA2DC5 /* SampleHandler.swift */; };
|
||||
29373DB6205524D700099860 /* HaishinKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D3D4DC1ED0509900DD4AA6 /* HaishinKit.framework */; };
|
||||
29373DB7205524D700099860 /* HaishinKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 29D3D4DC1ED0509900DD4AA6 /* HaishinKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
|
@ -265,7 +263,6 @@
|
|||
29EB3E021ED05858001CAE8B /* M3U.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876731CD70ACE00FC07DA /* M3U.swift */; };
|
||||
29EB3E031ED0585D001CAE8B /* AudioSpecificConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B8767D1CD70AE800FC07DA /* AudioSpecificConfig.swift */; };
|
||||
29EB3E041ED05860001CAE8B /* AVCConfigurationRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B8767E1CD70AE800FC07DA /* AVCConfigurationRecord.swift */; };
|
||||
29EB3E061ED05865001CAE8B /* MP4Reader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292D8A321D8B293300DBECE2 /* MP4Reader.swift */; };
|
||||
29EB3E071ED05867001CAE8B /* NALUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B8767F1CD70AE800FC07DA /* NALUnit.swift */; };
|
||||
29EB3E081ED05869001CAE8B /* PacketizedElementaryStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876801CD70AE800FC07DA /* PacketizedElementaryStream.swift */; };
|
||||
29EB3E091ED0586B001CAE8B /* ProgramSpecific.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B876811CD70AE800FC07DA /* ProgramSpecific.swift */; };
|
||||
|
@ -405,22 +402,6 @@
|
|||
BC83A4732403D83B006BDE06 /* VTCompressionSession+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC83A4722403D83B006BDE06 /* VTCompressionSession+Extension.swift */; };
|
||||
BC83A4742403D83B006BDE06 /* VTCompressionSession+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC83A4722403D83B006BDE06 /* VTCompressionSession+Extension.swift */; };
|
||||
BC83A4752403D83B006BDE06 /* VTCompressionSession+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC83A4722403D83B006BDE06 /* VTCompressionSession+Extension.swift */; };
|
||||
BC94E4FE263FE6B80094C169 /* MP4MovieFragmentHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC94E4FD263FE6B80094C169 /* MP4MovieFragmentHeaderBox.swift */; };
|
||||
BC94E4FF263FE6B80094C169 /* MP4MovieFragmentHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC94E4FD263FE6B80094C169 /* MP4MovieFragmentHeaderBox.swift */; };
|
||||
BC94E500263FE6B80094C169 /* MP4MovieFragmentHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC94E4FD263FE6B80094C169 /* MP4MovieFragmentHeaderBox.swift */; };
|
||||
BC94E502263FE8400094C169 /* MP4TrackFragmentHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC94E501263FE8400094C169 /* MP4TrackFragmentHeaderBox.swift */; };
|
||||
BC94E503263FE8400094C169 /* MP4TrackFragmentHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC94E501263FE8400094C169 /* MP4TrackFragmentHeaderBox.swift */; };
|
||||
BC94E504263FE8400094C169 /* MP4TrackFragmentHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC94E501263FE8400094C169 /* MP4TrackFragmentHeaderBox.swift */; };
|
||||
BC94E506263FEA7F0094C169 /* MP4TrackFragmentBaseMediaDecodeTimeBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC94E505263FEA7F0094C169 /* MP4TrackFragmentBaseMediaDecodeTimeBox.swift */; };
|
||||
BC94E507263FEA7F0094C169 /* MP4TrackFragmentBaseMediaDecodeTimeBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC94E505263FEA7F0094C169 /* MP4TrackFragmentBaseMediaDecodeTimeBox.swift */; };
|
||||
BC94E508263FEA7F0094C169 /* MP4TrackFragmentBaseMediaDecodeTimeBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC94E505263FEA7F0094C169 /* MP4TrackFragmentBaseMediaDecodeTimeBox.swift */; };
|
||||
BC94E50A263FEBB60094C169 /* MP4TrackRunBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC94E509263FEBB60094C169 /* MP4TrackRunBox.swift */; };
|
||||
BC94E50B263FEBB60094C169 /* MP4TrackRunBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC94E509263FEBB60094C169 /* MP4TrackRunBox.swift */; };
|
||||
BC94E50C263FEBB60094C169 /* MP4TrackRunBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC94E509263FEBB60094C169 /* MP4TrackRunBox.swift */; };
|
||||
BC94E52E264146530094C169 /* MP4ReaderConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC94E52C264146120094C169 /* MP4ReaderConvertible.swift */; };
|
||||
BC94E52F264146540094C169 /* MP4ReaderConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC94E52C264146120094C169 /* MP4ReaderConvertible.swift */; };
|
||||
BC94E530264146540094C169 /* MP4ReaderConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC94E52C264146120094C169 /* MP4ReaderConvertible.swift */; };
|
||||
BC94E53A264192B00094C169 /* MP4FileReaderTests2.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0C10263ED28500ADFB80 /* MP4FileReaderTests2.swift */; };
|
||||
BC959EEF296EE4190067BA97 /* ImageTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC959EEE296EE4190067BA97 /* ImageTransform.swift */; };
|
||||
BC959EF0296EE4190067BA97 /* ImageTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC959EEE296EE4190067BA97 /* ImageTransform.swift */; };
|
||||
BC959EF1296EE4190067BA97 /* ImageTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC959EEE296EE4190067BA97 /* ImageTransform.swift */; };
|
||||
|
@ -435,69 +416,11 @@
|
|||
BCA2252C293CC5B600DD7CB2 /* IOScreenCaptureUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA2252B293CC5B600DD7CB2 /* IOScreenCaptureUnit.swift */; };
|
||||
BCA2252D293CC5B600DD7CB2 /* IOScreenCaptureUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA2252B293CC5B600DD7CB2 /* IOScreenCaptureUnit.swift */; };
|
||||
BCA2252E293CC5B600DD7CB2 /* IOScreenCaptureUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA2252B293CC5B600DD7CB2 /* IOScreenCaptureUnit.swift */; };
|
||||
BCA97B86263AC0F30027213C /* MP4BoxConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B85263AC0F30027213C /* MP4BoxConvertible.swift */; };
|
||||
BCA97B87263AC0F30027213C /* MP4BoxConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B85263AC0F30027213C /* MP4BoxConvertible.swift */; };
|
||||
BCA97B88263AC0F30027213C /* MP4BoxConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B85263AC0F30027213C /* MP4BoxConvertible.swift */; };
|
||||
BCA97B8A263AC1830027213C /* MP4Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B89263AC1830027213C /* MP4Box.swift */; };
|
||||
BCA97B8B263AC1830027213C /* MP4Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B89263AC1830027213C /* MP4Box.swift */; };
|
||||
BCA97B8C263AC1830027213C /* MP4Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B89263AC1830027213C /* MP4Box.swift */; };
|
||||
BCA97BE2263C095B0027213C /* MP4TimeToSampleBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BA2263AC86D0027213C /* MP4TimeToSampleBox.swift */; };
|
||||
BCA97BE3263C095C0027213C /* MP4TimeToSampleBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BA2263AC86D0027213C /* MP4TimeToSampleBox.swift */; };
|
||||
BCA97BE4263C095C0027213C /* MP4TimeToSampleBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BA2263AC86D0027213C /* MP4TimeToSampleBox.swift */; };
|
||||
BCA97BE5263C0B8A0027213C /* MP4FileTypeBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BDE263BC7770027213C /* MP4FileTypeBox.swift */; };
|
||||
BCA97BE6263C0B8A0027213C /* MP4FileTypeBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BDE263BC7770027213C /* MP4FileTypeBox.swift */; };
|
||||
BCA97BE7263C0B8B0027213C /* MP4FileTypeBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BDE263BC7770027213C /* MP4FileTypeBox.swift */; };
|
||||
BCA97BE8263C27070027213C /* MP4SampleSizeBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BA6263AC9880027213C /* MP4SampleSizeBox.swift */; };
|
||||
BCA97BE9263C27080027213C /* MP4SampleSizeBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BA6263AC9880027213C /* MP4SampleSizeBox.swift */; };
|
||||
BCA97BEA263C27080027213C /* MP4SampleSizeBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BA6263AC9880027213C /* MP4SampleSizeBox.swift */; };
|
||||
BCA97BF0263C31020027213C /* MP4SampleDescriptionBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BBE263AD1920027213C /* MP4SampleDescriptionBox.swift */; };
|
||||
BCA97BF1263C31020027213C /* MP4SampleDescriptionBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BBE263AD1920027213C /* MP4SampleDescriptionBox.swift */; };
|
||||
BCA97BF2263C31020027213C /* MP4SampleDescriptionBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BBE263AD1920027213C /* MP4SampleDescriptionBox.swift */; };
|
||||
BCA97BF4263C390E0027213C /* CustomXmlStringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BF3263C390E0027213C /* CustomXmlStringConvertible.swift */; };
|
||||
BCA97BF5263C390E0027213C /* CustomXmlStringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BF3263C390E0027213C /* CustomXmlStringConvertible.swift */; };
|
||||
BCA97BF6263C390E0027213C /* CustomXmlStringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BF3263C390E0027213C /* CustomXmlStringConvertible.swift */; };
|
||||
BCA97BF7263C4B8E0027213C /* MP4ChunkOffsetBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B91263AC5FB0027213C /* MP4ChunkOffsetBox.swift */; };
|
||||
BCA97BF8263C4B8F0027213C /* MP4ChunkOffsetBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B91263AC5FB0027213C /* MP4ChunkOffsetBox.swift */; };
|
||||
BCA97BF9263C4B8F0027213C /* MP4ChunkOffsetBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B91263AC5FB0027213C /* MP4ChunkOffsetBox.swift */; };
|
||||
BCA97BFA263C4F980027213C /* MP4EditListBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B9A263AC7540027213C /* MP4EditListBox.swift */; };
|
||||
BCA97BFB263C4F980027213C /* MP4EditListBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B9A263AC7540027213C /* MP4EditListBox.swift */; };
|
||||
BCA97BFC263C4F990027213C /* MP4EditListBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B9A263AC7540027213C /* MP4EditListBox.swift */; };
|
||||
BCA97BFD263C54550027213C /* MP4SampleToChunkBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B9E263AC7D60027213C /* MP4SampleToChunkBox.swift */; };
|
||||
BCA97BFE263C54560027213C /* MP4SampleToChunkBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B9E263AC7D60027213C /* MP4SampleToChunkBox.swift */; };
|
||||
BCA97BFF263C54560027213C /* MP4SampleToChunkBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B9E263AC7D60027213C /* MP4SampleToChunkBox.swift */; };
|
||||
BCA97C00263C599C0027213C /* MP4SyncSampleBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B96263AC6980027213C /* MP4SyncSampleBox.swift */; };
|
||||
BCA97C01263C599C0027213C /* MP4SyncSampleBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B96263AC6980027213C /* MP4SyncSampleBox.swift */; };
|
||||
BCA97C02263C599D0027213C /* MP4SyncSampleBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B96263AC6980027213C /* MP4SyncSampleBox.swift */; };
|
||||
BCA97C03263C61930027213C /* MP4MediaHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B8D263AC49B0027213C /* MP4MediaHeaderBox.swift */; };
|
||||
BCA97C04263C61940027213C /* MP4MediaHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B8D263AC49B0027213C /* MP4MediaHeaderBox.swift */; };
|
||||
BCA97C05263C61940027213C /* MP4MediaHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97B8D263AC49B0027213C /* MP4MediaHeaderBox.swift */; };
|
||||
BCA97C0A263D80F40027213C /* MP4SampleEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97C09263D80F40027213C /* MP4SampleEntry.swift */; };
|
||||
BCA97C0B263D80F40027213C /* MP4SampleEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97C09263D80F40027213C /* MP4SampleEntry.swift */; };
|
||||
BCA97C0C263D80F40027213C /* MP4SampleEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97C09263D80F40027213C /* MP4SampleEntry.swift */; };
|
||||
BCA97C12263D8C850027213C /* MP4FullBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97C11263D8C850027213C /* MP4FullBox.swift */; };
|
||||
BCA97C13263D8C850027213C /* MP4FullBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97C11263D8C850027213C /* MP4FullBox.swift */; };
|
||||
BCA97C14263D8C850027213C /* MP4FullBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97C11263D8C850027213C /* MP4FullBox.swift */; };
|
||||
BCA97C15263D93DB0027213C /* MP4VisualSampleEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BC2263AD2280027213C /* MP4VisualSampleEntry.swift */; };
|
||||
BCA97C16263D93DC0027213C /* MP4VisualSampleEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BC2263AD2280027213C /* MP4VisualSampleEntry.swift */; };
|
||||
BCA97C17263D93DC0027213C /* MP4VisualSampleEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BC2263AD2280027213C /* MP4VisualSampleEntry.swift */; };
|
||||
BCA97C18263DA5060027213C /* MP4AudioSampleEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BBA263AD0520027213C /* MP4AudioSampleEntry.swift */; };
|
||||
BCA97C19263DA5070027213C /* MP4AudioSampleEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BBA263AD0520027213C /* MP4AudioSampleEntry.swift */; };
|
||||
BCA97C1A263DA5070027213C /* MP4AudioSampleEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BBA263AD0520027213C /* MP4AudioSampleEntry.swift */; };
|
||||
BCA97C1B263DAD070027213C /* MP4ElementaryStreamDescriptorBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BB6263ACFB30027213C /* MP4ElementaryStreamDescriptorBox.swift */; };
|
||||
BCA97C1C263DAD070027213C /* MP4ElementaryStreamDescriptorBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BB6263ACFB30027213C /* MP4ElementaryStreamDescriptorBox.swift */; };
|
||||
BCA97C1D263DAD080027213C /* MP4ElementaryStreamDescriptorBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA97BB6263ACFB30027213C /* MP4ElementaryStreamDescriptorBox.swift */; };
|
||||
BCAD0C00263E968400ADFB80 /* MP4FileReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0BFF263E968400ADFB80 /* MP4FileReader.swift */; };
|
||||
BCAD0C01263E968400ADFB80 /* MP4FileReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0BFF263E968400ADFB80 /* MP4FileReader.swift */; };
|
||||
BCAD0C02263E968400ADFB80 /* MP4FileReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0BFF263E968400ADFB80 /* MP4FileReader.swift */; };
|
||||
BCAD0C18263ED67F00ADFB80 /* SampleVideo_360x240_5mb@m4v.m3u8 in Resources */ = {isa = PBXBuildFile; fileRef = BCAD0C16263ED67F00ADFB80 /* SampleVideo_360x240_5mb@m4v.m3u8 */; };
|
||||
BCAD0C19263ED67F00ADFB80 /* SampleVideo_360x240_5mb@m4v in Resources */ = {isa = PBXBuildFile; fileRef = BCAD0C17263ED67F00ADFB80 /* SampleVideo_360x240_5mb@m4v */; };
|
||||
BCAD0C1B263EE1D000ADFB80 /* MP4Util.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0C1A263EE1D000ADFB80 /* MP4Util.swift */; };
|
||||
BCAD0C1C263EE1D000ADFB80 /* MP4Util.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0C1A263EE1D000ADFB80 /* MP4Util.swift */; };
|
||||
BCAD0C1D263EE1D000ADFB80 /* MP4Util.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0C1A263EE1D000ADFB80 /* MP4Util.swift */; };
|
||||
BCAD0C1F263EE53A00ADFB80 /* MP4UtilTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0C1E263EE53A00ADFB80 /* MP4UtilTests.swift */; };
|
||||
BCAD0C21263EFCEF00ADFB80 /* MP4SegmentIndexBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0C20263EFCEF00ADFB80 /* MP4SegmentIndexBox.swift */; };
|
||||
BCAD0C22263EFCEF00ADFB80 /* MP4SegmentIndexBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0C20263EFCEF00ADFB80 /* MP4SegmentIndexBox.swift */; };
|
||||
BCAD0C23263EFCEF00ADFB80 /* MP4SegmentIndexBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCAD0C20263EFCEF00ADFB80 /* MP4SegmentIndexBox.swift */; };
|
||||
BCB976D126107B1200C9A649 /* TSAdaptationExtensionField.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB976D026107B1200C9A649 /* TSAdaptationExtensionField.swift */; };
|
||||
BCB976D226107B1200C9A649 /* TSAdaptationExtensionField.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB976D026107B1200C9A649 /* TSAdaptationExtensionField.swift */; };
|
||||
BCB976D326107B1200C9A649 /* TSAdaptationExtensionField.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB976D026107B1200C9A649 /* TSAdaptationExtensionField.swift */; };
|
||||
|
@ -507,52 +430,6 @@
|
|||
BCB9773F2621812800C9A649 /* AVCFormatStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB9773E2621812800C9A649 /* AVCFormatStream.swift */; };
|
||||
BCB977402621812800C9A649 /* AVCFormatStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB9773E2621812800C9A649 /* AVCFormatStream.swift */; };
|
||||
BCB977412621812800C9A649 /* AVCFormatStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB9773E2621812800C9A649 /* AVCFormatStream.swift */; };
|
||||
BCC1A6B62643F41600661156 /* MP4WriterConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B02643F41600661156 /* MP4WriterConvertible.swift */; };
|
||||
BCC1A6B72643F41600661156 /* MP4WriterConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B02643F41600661156 /* MP4WriterConvertible.swift */; };
|
||||
BCC1A6B82643F41600661156 /* MP4WriterConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B02643F41600661156 /* MP4WriterConvertible.swift */; };
|
||||
BCC1A6B92643F41600661156 /* MP4File.Builder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B12643F41600661156 /* MP4File.Builder.swift */; };
|
||||
BCC1A6BA2643F41600661156 /* MP4File.Builder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B12643F41600661156 /* MP4File.Builder.swift */; };
|
||||
BCC1A6BB2643F41600661156 /* MP4File.Builder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B12643F41600661156 /* MP4File.Builder.swift */; };
|
||||
BCC1A6BC2643F41600661156 /* MP4SegmentFile.Builder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B22643F41600661156 /* MP4SegmentFile.Builder.swift */; };
|
||||
BCC1A6BD2643F41600661156 /* MP4SegmentFile.Builder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B22643F41600661156 /* MP4SegmentFile.Builder.swift */; };
|
||||
BCC1A6BE2643F41600661156 /* MP4SegmentFile.Builder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B22643F41600661156 /* MP4SegmentFile.Builder.swift */; };
|
||||
BCC1A6BF2643F41600661156 /* MP4TrackFragmentBox.Builder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B32643F41600661156 /* MP4TrackFragmentBox.Builder.swift */; };
|
||||
BCC1A6C02643F41600661156 /* MP4TrackFragmentBox.Builder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B32643F41600661156 /* MP4TrackFragmentBox.Builder.swift */; };
|
||||
BCC1A6C12643F41600661156 /* MP4TrackFragmentBox.Builder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B32643F41600661156 /* MP4TrackFragmentBox.Builder.swift */; };
|
||||
BCC1A6C22643F41600661156 /* MP4FragmentedWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B42643F41600661156 /* MP4FragmentedWriter.swift */; };
|
||||
BCC1A6C32643F41600661156 /* MP4FragmentedWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B42643F41600661156 /* MP4FragmentedWriter.swift */; };
|
||||
BCC1A6C42643F41600661156 /* MP4FragmentedWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B42643F41600661156 /* MP4FragmentedWriter.swift */; };
|
||||
BCC1A6C52643F41600661156 /* MP4MovieFragmentBox.Builder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B52643F41600661156 /* MP4MovieFragmentBox.Builder.swift */; };
|
||||
BCC1A6C62643F41600661156 /* MP4MovieFragmentBox.Builder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B52643F41600661156 /* MP4MovieFragmentBox.Builder.swift */; };
|
||||
BCC1A6C72643F41600661156 /* MP4MovieFragmentBox.Builder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6B52643F41600661156 /* MP4MovieFragmentBox.Builder.swift */; };
|
||||
BCC1A6C92643F44A00661156 /* MP4BoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6C82643F44A00661156 /* MP4BoxTests.swift */; };
|
||||
BCC1A6CF26445AF500661156 /* MP4TrackExtendsBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6CE26445AF500661156 /* MP4TrackExtendsBox.swift */; };
|
||||
BCC1A6D026445AF500661156 /* MP4TrackExtendsBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6CE26445AF500661156 /* MP4TrackExtendsBox.swift */; };
|
||||
BCC1A6D126445AF500661156 /* MP4TrackExtendsBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6CE26445AF500661156 /* MP4TrackExtendsBox.swift */; };
|
||||
BCC1A6D3264461FE00661156 /* MP4HandlerBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6D2264461FE00661156 /* MP4HandlerBox.swift */; };
|
||||
BCC1A6D4264461FE00661156 /* MP4HandlerBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6D2264461FE00661156 /* MP4HandlerBox.swift */; };
|
||||
BCC1A6D5264461FE00661156 /* MP4HandlerBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6D2264461FE00661156 /* MP4HandlerBox.swift */; };
|
||||
BCC1A6D726446B2D00661156 /* MP4SoundMediaHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6D626446B2D00661156 /* MP4SoundMediaHeaderBox.swift */; };
|
||||
BCC1A6D826446B2D00661156 /* MP4SoundMediaHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6D626446B2D00661156 /* MP4SoundMediaHeaderBox.swift */; };
|
||||
BCC1A6D926446B2D00661156 /* MP4SoundMediaHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6D626446B2D00661156 /* MP4SoundMediaHeaderBox.swift */; };
|
||||
BCC1A6DB26446EF600661156 /* MP4VideoMediaHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6DA26446EF600661156 /* MP4VideoMediaHeaderBox.swift */; };
|
||||
BCC1A6DC26446EF600661156 /* MP4VideoMediaHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6DA26446EF600661156 /* MP4VideoMediaHeaderBox.swift */; };
|
||||
BCC1A6DD26446EF600661156 /* MP4VideoMediaHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6DA26446EF600661156 /* MP4VideoMediaHeaderBox.swift */; };
|
||||
BCC1A6DF264470F900661156 /* MP4DataEntryUrlBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6DE264470F900661156 /* MP4DataEntryUrlBox.swift */; };
|
||||
BCC1A6E0264470F900661156 /* MP4DataEntryUrlBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6DE264470F900661156 /* MP4DataEntryUrlBox.swift */; };
|
||||
BCC1A6E1264470F900661156 /* MP4DataEntryUrlBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6DE264470F900661156 /* MP4DataEntryUrlBox.swift */; };
|
||||
BCC1A6E726447CCA00661156 /* MP4MovieHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6E626447CCA00661156 /* MP4MovieHeaderBox.swift */; };
|
||||
BCC1A6E826447CCA00661156 /* MP4MovieHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6E626447CCA00661156 /* MP4MovieHeaderBox.swift */; };
|
||||
BCC1A6E926447CCA00661156 /* MP4MovieHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6E626447CCA00661156 /* MP4MovieHeaderBox.swift */; };
|
||||
BCC1A6EB2644850F00661156 /* MP4TrackHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6EA2644850F00661156 /* MP4TrackHeaderBox.swift */; };
|
||||
BCC1A6EC2644850F00661156 /* MP4TrackHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6EA2644850F00661156 /* MP4TrackHeaderBox.swift */; };
|
||||
BCC1A6ED2644850F00661156 /* MP4TrackHeaderBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6EA2644850F00661156 /* MP4TrackHeaderBox.swift */; };
|
||||
BCC1A6EF2645B5F800661156 /* MP4PixelAspectRatioBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6EE2645B5F800661156 /* MP4PixelAspectRatioBox.swift */; };
|
||||
BCC1A6F02645B5F800661156 /* MP4PixelAspectRatioBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6EE2645B5F800661156 /* MP4PixelAspectRatioBox.swift */; };
|
||||
BCC1A6F12645B5F800661156 /* MP4PixelAspectRatioBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6EE2645B5F800661156 /* MP4PixelAspectRatioBox.swift */; };
|
||||
BCC1A6F72645BFBC00661156 /* MP4AVCConfigurationBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6F62645BFBC00661156 /* MP4AVCConfigurationBox.swift */; };
|
||||
BCC1A6F82645BFBC00661156 /* MP4AVCConfigurationBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6F62645BFBC00661156 /* MP4AVCConfigurationBox.swift */; };
|
||||
BCC1A6F92645BFBC00661156 /* MP4AVCConfigurationBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A6F62645BFBC00661156 /* MP4AVCConfigurationBox.swift */; };
|
||||
BCC1A7072647E89300661156 /* BaseDescriptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A7062647E89300661156 /* BaseDescriptor.swift */; };
|
||||
BCC1A7082647E89300661156 /* BaseDescriptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A7062647E89300661156 /* BaseDescriptor.swift */; };
|
||||
BCC1A7092647E89300661156 /* BaseDescriptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A7062647E89300661156 /* BaseDescriptor.swift */; };
|
||||
|
@ -569,7 +446,6 @@
|
|||
BCC1A7182647F3E000661156 /* DecoderSpecificInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A7162647F3E000661156 /* DecoderSpecificInfo.swift */; };
|
||||
BCC1A7192647F3E000661156 /* DecoderSpecificInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A7162647F3E000661156 /* DecoderSpecificInfo.swift */; };
|
||||
BCC1A7212648540800661156 /* RPReplay_Final1620580691.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = BCC1A7202648540800661156 /* RPReplay_Final1620580691.mp4 */; };
|
||||
BCC1A723264854FF00661156 /* MP4FileReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A722264854FF00661156 /* MP4FileReaderTests.swift */; };
|
||||
BCC1A7252648663600661156 /* BaseDescriptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A7242648663600661156 /* BaseDescriptorTests.swift */; };
|
||||
BCC1A727264FA1C100661156 /* ProfileLevelIndicationIndexDescriptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A726264FA1C100661156 /* ProfileLevelIndicationIndexDescriptor.swift */; };
|
||||
BCC1A728264FA1C100661156 /* ProfileLevelIndicationIndexDescriptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC1A726264FA1C100661156 /* ProfileLevelIndicationIndexDescriptor.swift */; };
|
||||
|
@ -737,7 +613,6 @@
|
|||
291F4E361CF206E200F59C51 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = "<group>"; };
|
||||
29205CBD1E461F4E009D3FFF /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
|
||||
2927A2991E7ED2D70044AF91 /* LICENSE.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = LICENSE.md; sourceTree = "<group>"; };
|
||||
292D8A321D8B293300DBECE2 /* MP4Reader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP4Reader.swift; sourceTree = "<group>"; };
|
||||
2930D03F1E12D17C00DA2DC5 /* SampleHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SampleHandler.swift; sourceTree = "<group>"; };
|
||||
293B42E82340B4840086F973 /* RTMPObjectEncoding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RTMPObjectEncoding.swift; sourceTree = "<group>"; };
|
||||
2940EF4E2380116500430456 /* RingBufferTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RingBufferTests.swift; sourceTree = "<group>"; };
|
||||
|
@ -903,67 +778,24 @@
|
|||
BC7C56882995082700C41A9B /* NetStreamTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetStreamTests.swift; sourceTree = "<group>"; };
|
||||
BC7C568A299526F800C41A9B /* H264Profile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = H264Profile.swift; sourceTree = "<group>"; };
|
||||
BC83A4722403D83B006BDE06 /* VTCompressionSession+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "VTCompressionSession+Extension.swift"; sourceTree = "<group>"; };
|
||||
BC94E4FD263FE6B80094C169 /* MP4MovieFragmentHeaderBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4MovieFragmentHeaderBox.swift; sourceTree = "<group>"; };
|
||||
BC94E501263FE8400094C169 /* MP4TrackFragmentHeaderBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4TrackFragmentHeaderBox.swift; sourceTree = "<group>"; };
|
||||
BC94E505263FEA7F0094C169 /* MP4TrackFragmentBaseMediaDecodeTimeBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4TrackFragmentBaseMediaDecodeTimeBox.swift; sourceTree = "<group>"; };
|
||||
BC94E509263FEBB60094C169 /* MP4TrackRunBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4TrackRunBox.swift; sourceTree = "<group>"; };
|
||||
BC94E52C264146120094C169 /* MP4ReaderConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4ReaderConvertible.swift; sourceTree = "<group>"; };
|
||||
BC959EEE296EE4190067BA97 /* ImageTransform.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageTransform.swift; sourceTree = "<group>"; };
|
||||
BC959F0D29705B1B0067BA97 /* SCStreamPublishViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SCStreamPublishViewController.swift; sourceTree = "<group>"; };
|
||||
BC959F1129717EDB0067BA97 /* PreferenceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferenceViewController.swift; sourceTree = "<group>"; };
|
||||
BC9CFA9223BDE8B700917EEF /* NetStreamDrawable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetStreamDrawable.swift; sourceTree = "<group>"; };
|
||||
BC9F9C7726F8C16600B01ED0 /* Choreographer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Choreographer.swift; sourceTree = "<group>"; };
|
||||
BCA2252B293CC5B600DD7CB2 /* IOScreenCaptureUnit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IOScreenCaptureUnit.swift; sourceTree = "<group>"; };
|
||||
BCA97B85263AC0F30027213C /* MP4BoxConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4BoxConvertible.swift; sourceTree = "<group>"; };
|
||||
BCA97B89263AC1830027213C /* MP4Box.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4Box.swift; sourceTree = "<group>"; };
|
||||
BCA97B8D263AC49B0027213C /* MP4MediaHeaderBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4MediaHeaderBox.swift; sourceTree = "<group>"; };
|
||||
BCA97B91263AC5FB0027213C /* MP4ChunkOffsetBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4ChunkOffsetBox.swift; sourceTree = "<group>"; };
|
||||
BCA97B96263AC6980027213C /* MP4SyncSampleBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4SyncSampleBox.swift; sourceTree = "<group>"; };
|
||||
BCA97B9A263AC7540027213C /* MP4EditListBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4EditListBox.swift; sourceTree = "<group>"; };
|
||||
BCA97B9E263AC7D60027213C /* MP4SampleToChunkBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4SampleToChunkBox.swift; sourceTree = "<group>"; };
|
||||
BCA97BA2263AC86D0027213C /* MP4TimeToSampleBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4TimeToSampleBox.swift; sourceTree = "<group>"; };
|
||||
BCA97BA6263AC9880027213C /* MP4SampleSizeBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4SampleSizeBox.swift; sourceTree = "<group>"; };
|
||||
BCA97BB6263ACFB30027213C /* MP4ElementaryStreamDescriptorBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4ElementaryStreamDescriptorBox.swift; sourceTree = "<group>"; };
|
||||
BCA97BBA263AD0520027213C /* MP4AudioSampleEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4AudioSampleEntry.swift; sourceTree = "<group>"; };
|
||||
BCA97BBE263AD1920027213C /* MP4SampleDescriptionBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4SampleDescriptionBox.swift; sourceTree = "<group>"; };
|
||||
BCA97BC2263AD2280027213C /* MP4VisualSampleEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4VisualSampleEntry.swift; sourceTree = "<group>"; };
|
||||
BCA97BDE263BC7770027213C /* MP4FileTypeBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4FileTypeBox.swift; sourceTree = "<group>"; };
|
||||
BCA97BF3263C390E0027213C /* CustomXmlStringConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomXmlStringConvertible.swift; sourceTree = "<group>"; };
|
||||
BCA97C09263D80F40027213C /* MP4SampleEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4SampleEntry.swift; sourceTree = "<group>"; };
|
||||
BCA97C11263D8C850027213C /* MP4FullBox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP4FullBox.swift; sourceTree = "<group>"; };
|
||||
BCAD0BFF263E968400ADFB80 /* MP4FileReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4FileReader.swift; sourceTree = "<group>"; };
|
||||
BCAD0C10263ED28500ADFB80 /* MP4FileReaderTests2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4FileReaderTests2.swift; sourceTree = "<group>"; };
|
||||
BCAD0C16263ED67F00ADFB80 /* SampleVideo_360x240_5mb@m4v.m3u8 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "SampleVideo_360x240_5mb@m4v.m3u8"; sourceTree = "<group>"; };
|
||||
BCAD0C17263ED67F00ADFB80 /* SampleVideo_360x240_5mb@m4v */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "SampleVideo_360x240_5mb@m4v"; sourceTree = "<group>"; };
|
||||
BCAD0C1A263EE1D000ADFB80 /* MP4Util.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4Util.swift; sourceTree = "<group>"; };
|
||||
BCAD0C1E263EE53A00ADFB80 /* MP4UtilTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4UtilTests.swift; sourceTree = "<group>"; };
|
||||
BCAD0C20263EFCEF00ADFB80 /* MP4SegmentIndexBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4SegmentIndexBox.swift; sourceTree = "<group>"; };
|
||||
BCB976D026107B1200C9A649 /* TSAdaptationExtensionField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAdaptationExtensionField.swift; sourceTree = "<group>"; };
|
||||
BCB976DE26107B5600C9A649 /* TSAdaptationField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAdaptationField.swift; sourceTree = "<group>"; };
|
||||
BCB9773E2621812800C9A649 /* AVCFormatStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AVCFormatStream.swift; sourceTree = "<group>"; };
|
||||
BCC1A6B02643F41600661156 /* MP4WriterConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP4WriterConvertible.swift; sourceTree = "<group>"; };
|
||||
BCC1A6B12643F41600661156 /* MP4File.Builder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP4File.Builder.swift; sourceTree = "<group>"; };
|
||||
BCC1A6B22643F41600661156 /* MP4SegmentFile.Builder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP4SegmentFile.Builder.swift; sourceTree = "<group>"; };
|
||||
BCC1A6B32643F41600661156 /* MP4TrackFragmentBox.Builder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP4TrackFragmentBox.Builder.swift; sourceTree = "<group>"; };
|
||||
BCC1A6B42643F41600661156 /* MP4FragmentedWriter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP4FragmentedWriter.swift; sourceTree = "<group>"; };
|
||||
BCC1A6B52643F41600661156 /* MP4MovieFragmentBox.Builder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP4MovieFragmentBox.Builder.swift; sourceTree = "<group>"; };
|
||||
BCC1A6C82643F44A00661156 /* MP4BoxTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4BoxTests.swift; sourceTree = "<group>"; };
|
||||
BCC1A6CE26445AF500661156 /* MP4TrackExtendsBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4TrackExtendsBox.swift; sourceTree = "<group>"; };
|
||||
BCC1A6D2264461FE00661156 /* MP4HandlerBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4HandlerBox.swift; sourceTree = "<group>"; };
|
||||
BCC1A6D626446B2D00661156 /* MP4SoundMediaHeaderBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4SoundMediaHeaderBox.swift; sourceTree = "<group>"; };
|
||||
BCC1A6DA26446EF600661156 /* MP4VideoMediaHeaderBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4VideoMediaHeaderBox.swift; sourceTree = "<group>"; };
|
||||
BCC1A6DE264470F900661156 /* MP4DataEntryUrlBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4DataEntryUrlBox.swift; sourceTree = "<group>"; };
|
||||
BCC1A6E626447CCA00661156 /* MP4MovieHeaderBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4MovieHeaderBox.swift; sourceTree = "<group>"; };
|
||||
BCC1A6EA2644850F00661156 /* MP4TrackHeaderBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4TrackHeaderBox.swift; sourceTree = "<group>"; };
|
||||
BCC1A6EE2645B5F800661156 /* MP4PixelAspectRatioBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4PixelAspectRatioBox.swift; sourceTree = "<group>"; };
|
||||
BCC1A6F62645BFBC00661156 /* MP4AVCConfigurationBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP4AVCConfigurationBox.swift; sourceTree = "<group>"; };
|
||||
BCC1A7062647E89300661156 /* BaseDescriptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseDescriptor.swift; sourceTree = "<group>"; };
|
||||
BCC1A70A2647F23200661156 /* ESDescriptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ESDescriptor.swift; sourceTree = "<group>"; };
|
||||
BCC1A70E2647F25A00661156 /* DecoderConfigDescriptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DecoderConfigDescriptor.swift; sourceTree = "<group>"; };
|
||||
BCC1A7122647F28F00661156 /* SLConfigDescriptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SLConfigDescriptor.swift; sourceTree = "<group>"; };
|
||||
BCC1A7162647F3E000661156 /* DecoderSpecificInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DecoderSpecificInfo.swift; sourceTree = "<group>"; };
|
||||
BCC1A7202648540800661156 /* RPReplay_Final1620580691.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = RPReplay_Final1620580691.mp4; sourceTree = "<group>"; };
|
||||
BCC1A722264854FF00661156 /* MP4FileReaderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP4FileReaderTests.swift; sourceTree = "<group>"; };
|
||||
BCC1A7242648663600661156 /* BaseDescriptorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseDescriptorTests.swift; sourceTree = "<group>"; };
|
||||
BCC1A726264FA1C100661156 /* ProfileLevelIndicationIndexDescriptor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProfileLevelIndicationIndexDescriptor.swift; sourceTree = "<group>"; };
|
||||
BCC1A72A264FAC1800661156 /* ElementaryStreamSpecificData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ElementaryStreamSpecificData.swift; sourceTree = "<group>"; };
|
||||
|
@ -1219,7 +1051,6 @@
|
|||
2960CD3E1CC0C7C900B4E877 /* HTTP */,
|
||||
295FEFA91C38236900271E90 /* ISO */,
|
||||
29BDE0BD1C65BC2400D6A768 /* Media */,
|
||||
BCA97B84263AC0A80027213C /* MP4 */,
|
||||
297C16881CC5382600117ADF /* Net */,
|
||||
29C0E0591C2EB00A009DD8E8 /* RTMP */,
|
||||
BCD1DCF62610751900A1C593 /* TS */,
|
||||
|
@ -1361,7 +1192,6 @@
|
|||
29798E5D1CE60E5300F5CBD0 /* Info.plist */,
|
||||
291C2ACF1CE9FF2B006F042B /* ISO */,
|
||||
BC0BF4F329866FB700D72CB4 /* Media */,
|
||||
BCA97BC6263AF3E20027213C /* MP4 */,
|
||||
291C2ACE1CE9FF25006F042B /* RTMP */,
|
||||
295018211FFA1C9D00358E10 /* SinWaveUtil.swift */,
|
||||
291C2AD01CE9FF33006F042B /* Util */,
|
||||
|
@ -1553,64 +1383,6 @@
|
|||
path = Extension;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
BCA97B84263AC0A80027213C /* MP4 */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
BCA97BBA263AD0520027213C /* MP4AudioSampleEntry.swift */,
|
||||
BCC1A6F62645BFBC00661156 /* MP4AVCConfigurationBox.swift */,
|
||||
BCA97B89263AC1830027213C /* MP4Box.swift */,
|
||||
BCA97B85263AC0F30027213C /* MP4BoxConvertible.swift */,
|
||||
BCA97B91263AC5FB0027213C /* MP4ChunkOffsetBox.swift */,
|
||||
BCC1A6DE264470F900661156 /* MP4DataEntryUrlBox.swift */,
|
||||
BCA97B9A263AC7540027213C /* MP4EditListBox.swift */,
|
||||
BCA97BB6263ACFB30027213C /* MP4ElementaryStreamDescriptorBox.swift */,
|
||||
BCC1A6B12643F41600661156 /* MP4File.Builder.swift */,
|
||||
BCAD0BFF263E968400ADFB80 /* MP4FileReader.swift */,
|
||||
BCA97BDE263BC7770027213C /* MP4FileTypeBox.swift */,
|
||||
BCC1A6B42643F41600661156 /* MP4FragmentedWriter.swift */,
|
||||
BCA97C11263D8C850027213C /* MP4FullBox.swift */,
|
||||
BCC1A6D2264461FE00661156 /* MP4HandlerBox.swift */,
|
||||
BCA97B8D263AC49B0027213C /* MP4MediaHeaderBox.swift */,
|
||||
BCC1A6B52643F41600661156 /* MP4MovieFragmentBox.Builder.swift */,
|
||||
BC94E4FD263FE6B80094C169 /* MP4MovieFragmentHeaderBox.swift */,
|
||||
BCC1A6E626447CCA00661156 /* MP4MovieHeaderBox.swift */,
|
||||
BCC1A6EE2645B5F800661156 /* MP4PixelAspectRatioBox.swift */,
|
||||
292D8A321D8B293300DBECE2 /* MP4Reader.swift */,
|
||||
BC94E52C264146120094C169 /* MP4ReaderConvertible.swift */,
|
||||
BCA97BBE263AD1920027213C /* MP4SampleDescriptionBox.swift */,
|
||||
BCA97C09263D80F40027213C /* MP4SampleEntry.swift */,
|
||||
BCA97BA6263AC9880027213C /* MP4SampleSizeBox.swift */,
|
||||
BCA97B9E263AC7D60027213C /* MP4SampleToChunkBox.swift */,
|
||||
BCC1A6B22643F41600661156 /* MP4SegmentFile.Builder.swift */,
|
||||
BCAD0C20263EFCEF00ADFB80 /* MP4SegmentIndexBox.swift */,
|
||||
BCC1A6D626446B2D00661156 /* MP4SoundMediaHeaderBox.swift */,
|
||||
BCA97B96263AC6980027213C /* MP4SyncSampleBox.swift */,
|
||||
BCA97BA2263AC86D0027213C /* MP4TimeToSampleBox.swift */,
|
||||
BCC1A6CE26445AF500661156 /* MP4TrackExtendsBox.swift */,
|
||||
BC94E505263FEA7F0094C169 /* MP4TrackFragmentBaseMediaDecodeTimeBox.swift */,
|
||||
BCC1A6B32643F41600661156 /* MP4TrackFragmentBox.Builder.swift */,
|
||||
BC94E501263FE8400094C169 /* MP4TrackFragmentHeaderBox.swift */,
|
||||
BCC1A6EA2644850F00661156 /* MP4TrackHeaderBox.swift */,
|
||||
BC94E509263FEBB60094C169 /* MP4TrackRunBox.swift */,
|
||||
BCAD0C1A263EE1D000ADFB80 /* MP4Util.swift */,
|
||||
BCC1A6DA26446EF600661156 /* MP4VideoMediaHeaderBox.swift */,
|
||||
BCA97BC2263AD2280027213C /* MP4VisualSampleEntry.swift */,
|
||||
BCC1A6B02643F41600661156 /* MP4WriterConvertible.swift */,
|
||||
);
|
||||
path = MP4;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
BCA97BC6263AF3E20027213C /* MP4 */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
BCC1A6C82643F44A00661156 /* MP4BoxTests.swift */,
|
||||
BCC1A722264854FF00661156 /* MP4FileReaderTests.swift */,
|
||||
BCAD0C10263ED28500ADFB80 /* MP4FileReaderTests2.swift */,
|
||||
BCAD0C1E263EE53A00ADFB80 /* MP4UtilTests.swift */,
|
||||
);
|
||||
path = MP4;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
BCD1DCF62610751900A1C593 /* TS */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -2115,24 +1887,17 @@
|
|||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
BCC1A6BC2643F41600661156 /* MP4SegmentFile.Builder.swift in Sources */,
|
||||
295891161EEB8DFC00CE51E1 /* FLVTagType.swift in Sources */,
|
||||
BCA97C0A263D80F40027213C /* MP4SampleEntry.swift in Sources */,
|
||||
BCC1A6D726446B2D00661156 /* MP4SoundMediaHeaderBox.swift in Sources */,
|
||||
BC4914AE28DDF445009E2DF6 /* VTDecompressionSession+Extension.swift in Sources */,
|
||||
29B876B11CD70B2800FC07DA /* RTMPMessage.swift in Sources */,
|
||||
2941746B22D069B300A2944F /* AudioEffect.swift in Sources */,
|
||||
BCB9773F2621812800C9A649 /* AVCFormatStream.swift in Sources */,
|
||||
295891011EEB7A8B00CE51E1 /* ScalingMode.swift in Sources */,
|
||||
BCA97BF0263C31020027213C /* MP4SampleDescriptionBox.swift in Sources */,
|
||||
BC83A4732403D83B006BDE06 /* VTCompressionSession+Extension.swift in Sources */,
|
||||
2943ED53232FCA7C00ED6301 /* Setting.swift in Sources */,
|
||||
BC4914A228DDD33D009E2DF6 /* VTSessionConvertible.swift in Sources */,
|
||||
BCAD0C00263E968400ADFB80 /* MP4FileReader.swift in Sources */,
|
||||
BCA97B8A263AC1830027213C /* MP4Box.swift in Sources */,
|
||||
2915EC4D1D85BB8C00621092 /* RTMPTSocket.swift in Sources */,
|
||||
BC11023E2917C35B00D48035 /* CVPixelBufferPool+Extension.swift in Sources */,
|
||||
BCC1A6C22643F41600661156 /* MP4FragmentedWriter.swift in Sources */,
|
||||
2958910A1EEB8D1800CE51E1 /* FLVReader.swift in Sources */,
|
||||
29C2631C1D0083B50098D4EF /* IOVideoUnit.swift in Sources */,
|
||||
29B876B41CD70B2800FC07DA /* RTMPSharedObject.swift in Sources */,
|
||||
|
@ -2150,10 +1915,7 @@
|
|||
29AF3FCF1D7C744C00E41212 /* NetStream.swift in Sources */,
|
||||
294B2D3223785E3800CE7BDC /* RingBuffer.swift in Sources */,
|
||||
2958910E1EEB8D3C00CE51E1 /* FLVVideoCodec.swift in Sources */,
|
||||
BCA97BFC263C4F990027213C /* MP4EditListBox.swift in Sources */,
|
||||
BCC1A6D3264461FE00661156 /* MP4HandlerBox.swift in Sources */,
|
||||
BC6FC9222961B3D800A746EE /* vImage_CGImageFormat+Extension.swift in Sources */,
|
||||
BCA97C02263C599D0027213C /* MP4SyncSampleBox.swift in Sources */,
|
||||
299B13271D3B751400A1E8F5 /* HKView.swift in Sources */,
|
||||
BC44A1A923D31E92002D4297 /* AudioCodecBuffer.swift in Sources */,
|
||||
BC20DF38250377A3007BC608 /* IOUIScreenCaptureUnit.swift in Sources */,
|
||||
|
@ -2164,42 +1926,30 @@
|
|||
29B8769B1CD70B1100FC07DA /* MIME.swift in Sources */,
|
||||
BCC1A727264FA1C100661156 /* ProfileLevelIndicationIndexDescriptor.swift in Sources */,
|
||||
29B8769C1CD70B1100FC07DA /* NetClient.swift in Sources */,
|
||||
BC94E530264146540094C169 /* MP4ReaderConvertible.swift in Sources */,
|
||||
29B876871CD70AE800FC07DA /* ProgramSpecific.swift in Sources */,
|
||||
BC4C9EAF23F2E736004A14F2 /* AudioStreamBasicDescription+Extension.swift in Sources */,
|
||||
BC558268240BB40E00011AC0 /* RTMPStreamInfo.swift in Sources */,
|
||||
BCC1A6B92643F41600661156 /* MP4File.Builder.swift in Sources */,
|
||||
298BCF331DD4C44A007FF86A /* AnyUtil.swift in Sources */,
|
||||
29B876B01CD70B2800FC07DA /* RTMPConnection.swift in Sources */,
|
||||
BCC1A72B264FAC1800661156 /* ElementaryStreamSpecificData.swift in Sources */,
|
||||
295891221EEB8EC500CE51E1 /* FLVAVCPacketType.swift in Sources */,
|
||||
29B876B61CD70B2800FC07DA /* RTMPStream.swift in Sources */,
|
||||
BCC1A6EB2644850F00661156 /* MP4TrackHeaderBox.swift in Sources */,
|
||||
BC566F6E25D2ECC500573C4C /* HLSService.swift in Sources */,
|
||||
BCC1A6EF2645B5F800661156 /* MP4PixelAspectRatioBox.swift in Sources */,
|
||||
29EA87EA1E79A3B70043A5F8 /* CMBlockBuffer+Extension.swift in Sources */,
|
||||
BC3004CE296B0A1700119932 /* Shape.swift in Sources */,
|
||||
BC34FA0B286CB90A00EFAF27 /* PiPHKView.swift in Sources */,
|
||||
BCA97C12263D8C850027213C /* MP4FullBox.swift in Sources */,
|
||||
293B42E92340B4840086F973 /* RTMPObjectEncoding.swift in Sources */,
|
||||
2976A47E1D48C5C700B53EF2 /* IORecorder.swift in Sources */,
|
||||
BCC1A6C52643F41600661156 /* MP4MovieFragmentBox.Builder.swift in Sources */,
|
||||
BC94E4FE263FE6B80094C169 /* MP4MovieFragmentHeaderBox.swift in Sources */,
|
||||
BC110257292E661E00D48035 /* MultiCamCaptureSetting.swift in Sources */,
|
||||
29B876B21CD70B2800FC07DA /* RTMPMuxer.swift in Sources */,
|
||||
2958912E1EEB8F4100CE51E1 /* FLVSoundType.swift in Sources */,
|
||||
BC0D236D26331BAB001DDA0C /* DataBuffer.swift in Sources */,
|
||||
BCC1A6BF2643F41600661156 /* MP4TrackFragmentBox.Builder.swift in Sources */,
|
||||
29D3D4D61ED04EAE00DD4AA6 /* DeviceUtil+Extenstion.swift in Sources */,
|
||||
BCC1A6F72645BFBC00661156 /* MP4AVCConfigurationBox.swift in Sources */,
|
||||
BCC1A6E726447CCA00661156 /* MP4MovieHeaderBox.swift in Sources */,
|
||||
29B876851CD70AE800FC07DA /* NALUnit.swift in Sources */,
|
||||
29EA87ED1E79A3E30043A5F8 /* CVPixelBuffer+Extension.swift in Sources */,
|
||||
2958912A1EEB8F1D00CE51E1 /* FLVSoundSize.swift in Sources */,
|
||||
BCA97BF4263C390E0027213C /* CustomXmlStringConvertible.swift in Sources */,
|
||||
29EA87DC1E79A0460043A5F8 /* Data+Extension.swift in Sources */,
|
||||
BCA97C1B263DAD070027213C /* MP4ElementaryStreamDescriptorBox.swift in Sources */,
|
||||
BC94E502263FE8400094C169 /* MP4TrackFragmentHeaderBox.swift in Sources */,
|
||||
BCC1A7132647F28F00661156 /* SLConfigDescriptor.swift in Sources */,
|
||||
29DF20622312A3DD004057C3 /* RTMPNWSocket.swift in Sources */,
|
||||
29B876BD1CD70B3900FC07DA /* CRC32.swift in Sources */,
|
||||
|
@ -2207,7 +1957,6 @@
|
|||
BC4914A628DDD367009E2DF6 /* VTSessionOption.swift in Sources */,
|
||||
BC4914B228DDFE31009E2DF6 /* VTSessionOptionKey.swift in Sources */,
|
||||
29EA87E61E79A2780043A5F8 /* CMAudioFormatDescription+Extension.swift in Sources */,
|
||||
BC94E506263FEA7F0094C169 /* MP4TrackFragmentBaseMediaDecodeTimeBox.swift in Sources */,
|
||||
BC562DCB29576D220048D89A /* AVCaptureSession.Preset+Extension.swift in Sources */,
|
||||
29B876B51CD70B2800FC07DA /* RTMPSocket.swift in Sources */,
|
||||
29B876AB1CD70B2800FC07DA /* AMF0Serializer.swift in Sources */,
|
||||
|
@ -2219,21 +1968,13 @@
|
|||
2942A4F821A9418A004E1BEE /* Running.swift in Sources */,
|
||||
BCC1A72F264FAC4E00661156 /* ElementaryStreamType.swift in Sources */,
|
||||
29F6F4851DFB83E200920A3A /* RTMPHandshake.swift in Sources */,
|
||||
BCA97BF9263C4B8F0027213C /* MP4ChunkOffsetBox.swift in Sources */,
|
||||
BCA97BFD263C54550027213C /* MP4SampleToChunkBox.swift in Sources */,
|
||||
29EA87DF1E79A0810043A5F8 /* CMSampleBuffer+Extension.swift in Sources */,
|
||||
BC562DC7295767860048D89A /* AVCaptureDevice+Extension.swift in Sources */,
|
||||
29EA87E21E79A1E90043A5F8 /* CMVideoFormatDescription+Extension.swift in Sources */,
|
||||
BCA97BE4263C095C0027213C /* MP4TimeToSampleBox.swift in Sources */,
|
||||
BCC1A6B62643F41600661156 /* MP4WriterConvertible.swift in Sources */,
|
||||
BCAD0C21263EFCEF00ADFB80 /* MP4SegmentIndexBox.swift in Sources */,
|
||||
BC110253292DD6E900D48035 /* vImage_Buffer+Extension.swift in Sources */,
|
||||
BCAD0C1B263EE1D000ADFB80 /* MP4Util.swift in Sources */,
|
||||
29EA87D81E79A0090043A5F8 /* URL+Extension.swift in Sources */,
|
||||
BC9F9C7826F8C16600B01ED0 /* Choreographer.swift in Sources */,
|
||||
BCA97B86263AC0F30027213C /* MP4BoxConvertible.swift in Sources */,
|
||||
29B876BC1CD70B3900FC07DA /* ByteArray.swift in Sources */,
|
||||
BCC1A6CF26445AF500661156 /* MP4TrackExtendsBox.swift in Sources */,
|
||||
29B876831CD70AE800FC07DA /* AudioSpecificConfig.swift in Sources */,
|
||||
295891121EEB8D7200CE51E1 /* FLVFrameType.swift in Sources */,
|
||||
29B876961CD70AFE00FC07DA /* VideoEffect.swift in Sources */,
|
||||
|
@ -2244,8 +1985,6 @@
|
|||
2976A4861D4903C300B53EF2 /* DeviceUtil.swift in Sources */,
|
||||
BCC1A7072647E89300661156 /* BaseDescriptor.swift in Sources */,
|
||||
29B876881CD70AE800FC07DA /* TSPacket.swift in Sources */,
|
||||
BCA97BE8263C27070027213C /* MP4SampleSizeBox.swift in Sources */,
|
||||
BCA97C18263DA5060027213C /* MP4AudioSampleEntry.swift in Sources */,
|
||||
29B876BE1CD70B3900FC07DA /* EventDispatcher.swift in Sources */,
|
||||
29B8769D1CD70B1100FC07DA /* NetService.swift in Sources */,
|
||||
29B8769E1CD70B1100FC07DA /* NetSocket.swift in Sources */,
|
||||
|
@ -2253,11 +1992,7 @@
|
|||
BC4914B628DEC2FE009E2DF6 /* VTSessionMode.swift in Sources */,
|
||||
295891261EEB8EF300CE51E1 /* FLVAACPacket.swift in Sources */,
|
||||
29B876791CD70ACE00FC07DA /* HTTPStream.swift in Sources */,
|
||||
BCA97C15263D93DB0027213C /* MP4VisualSampleEntry.swift in Sources */,
|
||||
BCC1A6DB26446EF600661156 /* MP4VideoMediaHeaderBox.swift in Sources */,
|
||||
292D8A331D8B293300DBECE2 /* MP4Reader.swift in Sources */,
|
||||
BC6FC91E29609A6800A746EE /* ShapeFactory.swift in Sources */,
|
||||
BCA97BE5263C0B8A0027213C /* MP4FileTypeBox.swift in Sources */,
|
||||
29B876AC1CD70B2800FC07DA /* AMF3Serializer.swift in Sources */,
|
||||
2916196C1E7F0768009FB344 /* CMFormatDescription+Extension.swift in Sources */,
|
||||
BCB976DF26107B5600C9A649 /* TSAdaptationField.swift in Sources */,
|
||||
|
@ -2265,15 +2000,12 @@
|
|||
29B876921CD70AFE00FC07DA /* IOMixer.swift in Sources */,
|
||||
29DC17B321D0CC0600E26CED /* Atomic.swift in Sources */,
|
||||
BC959EEF296EE4190067BA97 /* ImageTransform.swift in Sources */,
|
||||
BCC1A6DF264470F900661156 /* MP4DataEntryUrlBox.swift in Sources */,
|
||||
2942424D1CF4C01300D65DCB /* MD5.swift in Sources */,
|
||||
29EA87D31E799F360043A5F8 /* ExpressibleByIntegerLiteral+Extension.swift in Sources */,
|
||||
BCC1A70F2647F25A00661156 /* DecoderConfigDescriptor.swift in Sources */,
|
||||
29B8767A1CD70ACE00FC07DA /* M3U.swift in Sources */,
|
||||
29B876901CD70AFE00FC07DA /* IOAudioUnit.swift in Sources */,
|
||||
BC94E50A263FEBB60094C169 /* MP4TrackRunBox.swift in Sources */,
|
||||
BCB976D126107B1200C9A649 /* TSAdaptationExtensionField.swift in Sources */,
|
||||
BCA97C05263C61940027213C /* MP4MediaHeaderBox.swift in Sources */,
|
||||
29B876771CD70ACE00FC07DA /* HTTPResponse.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
|
@ -2291,19 +2023,15 @@
|
|||
290EA8AC1DFB61E700053022 /* MD5Tests.swift in Sources */,
|
||||
290EA8A01DFB61B100053022 /* AMFFoundationTests.swift in Sources */,
|
||||
BC7C56892995082700C41A9B /* NetStreamTests.swift in Sources */,
|
||||
BC94E53A264192B00094C169 /* MP4FileReaderTests2.swift in Sources */,
|
||||
2917CB662104CA2800F6823A /* AudioSpecificConfigTests.swift in Sources */,
|
||||
290EA8AB1DFB61E700053022 /* EventDispatcherTests.swift in Sources */,
|
||||
BCC1A723264854FF00661156 /* MP4FileReaderTests.swift in Sources */,
|
||||
290EA8901DFB616000053022 /* Foundation+ExtensionTests.swift in Sources */,
|
||||
BCAD0C1F263EE53A00ADFB80 /* MP4UtilTests.swift in Sources */,
|
||||
290EA8991DFB619600053022 /* PacketizedElementaryStreamTests.swift in Sources */,
|
||||
290EA8911DFB616000053022 /* SwiftCore+ExtensionTests.swift in Sources */,
|
||||
BC0BF4F529866FDE00D72CB4 /* IOMixerTests.swift in Sources */,
|
||||
BCC1A7252648663600661156 /* BaseDescriptorTests.swift in Sources */,
|
||||
290EA89A1DFB619600053022 /* ProgramSpecificTests.swift in Sources */,
|
||||
BC0BF4F72986CE8700D72CB4 /* VideoCodecTests.swift in Sources */,
|
||||
BCC1A6C92643F44A00661156 /* MP4BoxTests.swift in Sources */,
|
||||
290EA8931DFB617800053022 /* HTTPRequestTests.swift in Sources */,
|
||||
2976077F20A89FBB00DCF24F /* RTMPMessageTests.swift in Sources */,
|
||||
290EA8A11DFB61B100053022 /* RTMPChunkTests.swift in Sources */,
|
||||
|
@ -2320,23 +2048,16 @@
|
|||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
BCC1A6BD2643F41600661156 /* MP4SegmentFile.Builder.swift in Sources */,
|
||||
29B876EC1CD70D5900FC07DA /* AudioCodec.swift in Sources */,
|
||||
BCA97C0B263D80F40027213C /* MP4SampleEntry.swift in Sources */,
|
||||
BCC1A6D826446B2D00661156 /* MP4SoundMediaHeaderBox.swift in Sources */,
|
||||
BC7C568D299538D000C41A9B /* H264Profile.swift in Sources */,
|
||||
BCB977402621812800C9A649 /* AVCFormatStream.swift in Sources */,
|
||||
29B876EE1CD70D5900FC07DA /* VideoCodec.swift in Sources */,
|
||||
BCA97BF1263C31020027213C /* MP4SampleDescriptionBox.swift in Sources */,
|
||||
BCA2252D293CC5B600DD7CB2 /* IOScreenCaptureUnit.swift in Sources */,
|
||||
29EA87EB1E79A3B70043A5F8 /* CMBlockBuffer+Extension.swift in Sources */,
|
||||
29B876F01CD70D5900FC07DA /* Constants.swift in Sources */,
|
||||
29EA87D91E79A0090043A5F8 /* URL+Extension.swift in Sources */,
|
||||
BCAD0C01263E968400ADFB80 /* MP4FileReader.swift in Sources */,
|
||||
BCA97B8B263AC1830027213C /* MP4Box.swift in Sources */,
|
||||
2943ED54232FCA7C00ED6301 /* Setting.swift in Sources */,
|
||||
292AC17C1CF4C871004F5730 /* MD5.swift in Sources */,
|
||||
BCC1A6C32643F41600661156 /* MP4FragmentedWriter.swift in Sources */,
|
||||
2958910B1EEB8D1800CE51E1 /* FLVReader.swift in Sources */,
|
||||
29B876F41CD70D5900FC07DA /* DataConvertible.swift in Sources */,
|
||||
2916196D1E7F0777009FB344 /* CMFormatDescription+Extension.swift in Sources */,
|
||||
|
@ -2351,65 +2072,48 @@
|
|||
29EA87D61E799F6A0043A5F8 /* Mirror+Extension.swift in Sources */,
|
||||
BC7A23F525171C8F0089F77C /* MTHKView.swift in Sources */,
|
||||
297E69132324E38800D418AB /* AudioCodecFormat.swift in Sources */,
|
||||
BCA97BFB263C4F980027213C /* MP4EditListBox.swift in Sources */,
|
||||
BCC1A6D4264461FE00661156 /* MP4HandlerBox.swift in Sources */,
|
||||
BCA97C01263C599C0027213C /* MP4SyncSampleBox.swift in Sources */,
|
||||
29B876F81CD70D5900FC07DA /* HTTPService.swift in Sources */,
|
||||
29B876F91CD70D5900FC07DA /* HTTPStream.swift in Sources */,
|
||||
296543631D62FE9000734698 /* HKView-macOS.swift in Sources */,
|
||||
BC11024B2925147300D48035 /* IOCaptureUnit.swift in Sources */,
|
||||
29B876FA1CD70D5900FC07DA /* M3U.swift in Sources */,
|
||||
292D8A341D8B294900DBECE2 /* MP4Reader.swift in Sources */,
|
||||
29B876FD1CD70D5A00FC07DA /* AudioSpecificConfig.swift in Sources */,
|
||||
2958911F1EEB8E9600CE51E1 /* FLVSoundRate.swift in Sources */,
|
||||
2941746C22D069B300A2944F /* AudioEffect.swift in Sources */,
|
||||
BC9CFA9423BDE8B700917EEF /* NetStreamDrawable.swift in Sources */,
|
||||
BCC1A728264FA1C100661156 /* ProfileLevelIndicationIndexDescriptor.swift in Sources */,
|
||||
296242631D8DBA8C00C451A3 /* TSReader.swift in Sources */,
|
||||
BC94E52F264146540094C169 /* MP4ReaderConvertible.swift in Sources */,
|
||||
29B876FE1CD70D5A00FC07DA /* AVCConfigurationRecord.swift in Sources */,
|
||||
295891171EEB8DFC00CE51E1 /* FLVTagType.swift in Sources */,
|
||||
BCC1A6BA2643F41600661156 /* MP4File.Builder.swift in Sources */,
|
||||
294852571D852499002DE492 /* RTMPTSocket.swift in Sources */,
|
||||
BC83A4742403D83B006BDE06 /* VTCompressionSession+Extension.swift in Sources */,
|
||||
BCC1A72C264FAC1800661156 /* ElementaryStreamSpecificData.swift in Sources */,
|
||||
29B876FF1CD70D5A00FC07DA /* NALUnit.swift in Sources */,
|
||||
BC110258292E661E00D48035 /* MultiCamCaptureSetting.swift in Sources */,
|
||||
29B877001CD70D5A00FC07DA /* PacketizedElementaryStream.swift in Sources */,
|
||||
BCC1A6EC2644850F00661156 /* MP4TrackHeaderBox.swift in Sources */,
|
||||
BC570B4928E9ACC10098A12C /* IOUnit.swift in Sources */,
|
||||
BC566F6F25D2ECC500573C4C /* HLSService.swift in Sources */,
|
||||
BCC1A6F02645B5F800661156 /* MP4PixelAspectRatioBox.swift in Sources */,
|
||||
295891131EEB8D7200CE51E1 /* FLVFrameType.swift in Sources */,
|
||||
29B877011CD70D5A00FC07DA /* ProgramSpecific.swift in Sources */,
|
||||
BCA97C13263D8C850027213C /* MP4FullBox.swift in Sources */,
|
||||
295891271EEB8EF300CE51E1 /* FLVAACPacket.swift in Sources */,
|
||||
29B877021CD70D5A00FC07DA /* TSPacket.swift in Sources */,
|
||||
BCC1A6C62643F41600661156 /* MP4MovieFragmentBox.Builder.swift in Sources */,
|
||||
296242641D8DBA9000C451A3 /* TSWriter.swift in Sources */,
|
||||
2958912F1EEB8F4100CE51E1 /* FLVSoundType.swift in Sources */,
|
||||
BC4914B728DEC2FE009E2DF6 /* VTSessionMode.swift in Sources */,
|
||||
BC562DC8295767860048D89A /* AVCaptureDevice+Extension.swift in Sources */,
|
||||
BC6FC91F29609A6800A746EE /* ShapeFactory.swift in Sources */,
|
||||
BC94E4FF263FE6B80094C169 /* MP4MovieFragmentHeaderBox.swift in Sources */,
|
||||
29B877031CD70D5A00FC07DA /* IOAudioUnit.swift in Sources */,
|
||||
BCC1A6C02643F41600661156 /* MP4TrackFragmentBox.Builder.swift in Sources */,
|
||||
BC0D236E26331BAB001DDA0C /* DataBuffer.swift in Sources */,
|
||||
BCC1A6F82645BFBC00661156 /* MP4AVCConfigurationBox.swift in Sources */,
|
||||
BCC1A6E826447CCA00661156 /* MP4MovieHeaderBox.swift in Sources */,
|
||||
29B877051CD70D5A00FC07DA /* IOMixer.swift in Sources */,
|
||||
294B2D3323785E3800CE7BDC /* RingBuffer.swift in Sources */,
|
||||
2976A47F1D48FD6900B53EF2 /* IORecorder.swift in Sources */,
|
||||
BCA97BF5263C390E0027213C /* CustomXmlStringConvertible.swift in Sources */,
|
||||
BC44A1AA23D31E92002D4297 /* AudioCodecBuffer.swift in Sources */,
|
||||
BCA97C1C263DAD070027213C /* MP4ElementaryStreamDescriptorBox.swift in Sources */,
|
||||
BCC1A7142647F28F00661156 /* SLConfigDescriptor.swift in Sources */,
|
||||
BC94E503263FE8400094C169 /* MP4TrackFragmentHeaderBox.swift in Sources */,
|
||||
29B877071CD70D5A00FC07DA /* SoundTransform.swift in Sources */,
|
||||
BC11023F2917C35B00D48035 /* CVPixelBufferPool+Extension.swift in Sources */,
|
||||
29B877081CD70D5A00FC07DA /* IOVideoUnit.swift in Sources */,
|
||||
294CC9B422D9BEC000F9DD5C /* DisplayLink-macOS.swift in Sources */,
|
||||
BC94E507263FEA7F0094C169 /* MP4TrackFragmentBaseMediaDecodeTimeBox.swift in Sources */,
|
||||
BCC1A7182647F3E000661156 /* DecoderSpecificInfo.swift in Sources */,
|
||||
29B877091CD70D5A00FC07DA /* VideoEffect.swift in Sources */,
|
||||
29B8770A1CD70D5A00FC07DA /* MIME.swift in Sources */,
|
||||
|
@ -2418,20 +2122,12 @@
|
|||
BCC1A730264FAC4E00661156 /* ElementaryStreamType.swift in Sources */,
|
||||
29B8770C1CD70D5A00FC07DA /* NetService.swift in Sources */,
|
||||
2958911B1EEB8E3F00CE51E1 /* FLVAudioCodec.swift in Sources */,
|
||||
BCA97BF8263C4B8F0027213C /* MP4ChunkOffsetBox.swift in Sources */,
|
||||
BC4914A328DDD33D009E2DF6 /* VTSessionConvertible.swift in Sources */,
|
||||
BCA97BFE263C54560027213C /* MP4SampleToChunkBox.swift in Sources */,
|
||||
293B42EA2340B4840086F973 /* RTMPObjectEncoding.swift in Sources */,
|
||||
29DC17B421D0CC0600E26CED /* Atomic.swift in Sources */,
|
||||
BC959EF0296EE4190067BA97 /* ImageTransform.swift in Sources */,
|
||||
BCC1A6B72643F41600661156 /* MP4WriterConvertible.swift in Sources */,
|
||||
BCA97BE3263C095C0027213C /* MP4TimeToSampleBox.swift in Sources */,
|
||||
BCAD0C22263EFCEF00ADFB80 /* MP4SegmentIndexBox.swift in Sources */,
|
||||
BCAD0C1C263EE1D000ADFB80 /* MP4Util.swift in Sources */,
|
||||
BCA97B87263AC0F30027213C /* MP4BoxConvertible.swift in Sources */,
|
||||
BC9F9C7926F8C16600B01ED0 /* Choreographer.swift in Sources */,
|
||||
BC558269240BB40E00011AC0 /* RTMPStreamInfo.swift in Sources */,
|
||||
BCC1A6D026445AF500661156 /* MP4TrackExtendsBox.swift in Sources */,
|
||||
29EA87E01E79A0810043A5F8 /* CMSampleBuffer+Extension.swift in Sources */,
|
||||
29B8770D1CD70D5A00FC07DA /* NetSocket.swift in Sources */,
|
||||
29B8770E1CD70D5A00FC07DA /* AMF0Serializer.swift in Sources */,
|
||||
|
@ -2447,24 +2143,18 @@
|
|||
BC4914A728DDD367009E2DF6 /* VTSessionOption.swift in Sources */,
|
||||
29AF3FD01D7C745200E41212 /* NetStream.swift in Sources */,
|
||||
29F6F4861DFB862400920A3A /* RTMPHandshake.swift in Sources */,
|
||||
BCA97BE9263C27080027213C /* MP4SampleSizeBox.swift in Sources */,
|
||||
BC6FC9232961B3D800A746EE /* vImage_CGImageFormat+Extension.swift in Sources */,
|
||||
BCA97C19263DA5070027213C /* MP4AudioSampleEntry.swift in Sources */,
|
||||
29B877131CD70D5A00FC07DA /* RTMPConnection.swift in Sources */,
|
||||
2958910F1EEB8D3C00CE51E1 /* FLVVideoCodec.swift in Sources */,
|
||||
295891021EEB7AFC00CE51E1 /* ScalingMode.swift in Sources */,
|
||||
29B877141CD70D5A00FC07DA /* RTMPMessage.swift in Sources */,
|
||||
29B877151CD70D5A00FC07DA /* RTMPMuxer.swift in Sources */,
|
||||
29EA87E31E79A1E90043A5F8 /* CMVideoFormatDescription+Extension.swift in Sources */,
|
||||
BCC1A6DC26446EF600661156 /* MP4VideoMediaHeaderBox.swift in Sources */,
|
||||
BCA97C16263D93DC0027213C /* MP4VisualSampleEntry.swift in Sources */,
|
||||
29B877171CD70D5A00FC07DA /* RTMPSharedObject.swift in Sources */,
|
||||
BCA97BE6263C0B8A0027213C /* MP4FileTypeBox.swift in Sources */,
|
||||
29B877181CD70D5A00FC07DA /* RTMPSocket.swift in Sources */,
|
||||
29EA87DD1E79A0460043A5F8 /* Data+Extension.swift in Sources */,
|
||||
BCB976E026107B5600C9A649 /* TSAdaptationField.swift in Sources */,
|
||||
29B877191CD70D5A00FC07DA /* RTMPStream.swift in Sources */,
|
||||
BCC1A6E0264470F900661156 /* MP4DataEntryUrlBox.swift in Sources */,
|
||||
29B8771B1CD70D5A00FC07DA /* ByteArray.swift in Sources */,
|
||||
295891231EEB8EC500CE51E1 /* FLVAVCPacketType.swift in Sources */,
|
||||
BCC1A7102647F25A00661156 /* DecoderConfigDescriptor.swift in Sources */,
|
||||
|
@ -2472,10 +2162,8 @@
|
|||
29D0E3681DD4CE3700863B3B /* AnyUtil.swift in Sources */,
|
||||
29B8771C1CD70D5A00FC07DA /* CRC32.swift in Sources */,
|
||||
2958912B1EEB8F1D00CE51E1 /* FLVSoundSize.swift in Sources */,
|
||||
BC94E50B263FEBB60094C169 /* MP4TrackRunBox.swift in Sources */,
|
||||
BC4914B328DDFE31009E2DF6 /* VTSessionOptionKey.swift in Sources */,
|
||||
BCB976D226107B1200C9A649 /* TSAdaptationExtensionField.swift in Sources */,
|
||||
BCA97C04263C61940027213C /* MP4MediaHeaderBox.swift in Sources */,
|
||||
29B8771D1CD70D5A00FC07DA /* EventDispatcher.swift in Sources */,
|
||||
BC4914AF28DDF445009E2DF6 /* VTDecompressionSession+Extension.swift in Sources */,
|
||||
2901A4EF1D437662002BBD23 /* MediaLink.swift in Sources */,
|
||||
|
@ -2522,8 +2210,6 @@
|
|||
files = (
|
||||
BC55826A240BB40E00011AC0 /* RTMPStreamInfo.swift in Sources */,
|
||||
294B2D3423785E3800CE7BDC /* RingBuffer.swift in Sources */,
|
||||
BC94E504263FE8400094C169 /* MP4TrackFragmentHeaderBox.swift in Sources */,
|
||||
BCA97BE7263C0B8B0027213C /* MP4FileTypeBox.swift in Sources */,
|
||||
29EB3E1F1ED059F7001CAE8B /* RTMPChunk.swift in Sources */,
|
||||
29EB3DFA1ED057A1001CAE8B /* CMVideoFormatDescription+Extension.swift in Sources */,
|
||||
29EB3E071ED05867001CAE8B /* NALUnit.swift in Sources */,
|
||||
|
@ -2531,80 +2217,55 @@
|
|||
29EB3E091ED0586B001CAE8B /* ProgramSpecific.swift in Sources */,
|
||||
BCC1A731264FAC4E00661156 /* ElementaryStreamType.swift in Sources */,
|
||||
29EB3E081ED05869001CAE8B /* PacketizedElementaryStream.swift in Sources */,
|
||||
BCC1A6F12645B5F800661156 /* MP4PixelAspectRatioBox.swift in Sources */,
|
||||
BCC1A6C12643F41600661156 /* MP4TrackFragmentBox.Builder.swift in Sources */,
|
||||
29EB3E0A1ED0586F001CAE8B /* TSPacket.swift in Sources */,
|
||||
29EB3DFE1ED05849001CAE8B /* Data+Extension.swift in Sources */,
|
||||
29EB3E321ED05A2C001CAE8B /* ByteArray.swift in Sources */,
|
||||
29EB3E191ED05898001CAE8B /* NetSocket.swift in Sources */,
|
||||
29EB3E101ED0587F001CAE8B /* IORecorder.swift in Sources */,
|
||||
BCA97C17263D93DC0027213C /* MP4VisualSampleEntry.swift in Sources */,
|
||||
BCC1A6C72643F41600661156 /* MP4MovieFragmentBox.Builder.swift in Sources */,
|
||||
2958910C1EEB8D1800CE51E1 /* FLVReader.swift in Sources */,
|
||||
BCC1A6E1264470F900661156 /* MP4DataEntryUrlBox.swift in Sources */,
|
||||
29EB3E0F1ED0587C001CAE8B /* IOMixer.swift in Sources */,
|
||||
BC34FA0F286CBD6F00EFAF27 /* PiPHKView.swift in Sources */,
|
||||
BC94E50C263FEBB60094C169 /* MP4TrackRunBox.swift in Sources */,
|
||||
BC94E508263FEA7F0094C169 /* MP4TrackFragmentBaseMediaDecodeTimeBox.swift in Sources */,
|
||||
BC7A23F625171C8F0089F77C /* MTHKView.swift in Sources */,
|
||||
BC9F9C7A26F8C16600B01ED0 /* Choreographer.swift in Sources */,
|
||||
29EB3E1A1ED0589B001CAE8B /* NetStream.swift in Sources */,
|
||||
29EB3E211ED059FB001CAE8B /* RTMPHandshake.swift in Sources */,
|
||||
BCC1A6ED2644850F00661156 /* MP4TrackHeaderBox.swift in Sources */,
|
||||
29EB3DF41ED05776001CAE8B /* CMBlockBuffer+Extension.swift in Sources */,
|
||||
29EB3DF01ED05768001CAE8B /* VideoCodec.swift in Sources */,
|
||||
BCC1A7192647F3E000661156 /* DecoderSpecificInfo.swift in Sources */,
|
||||
29EB3E351ED05A33001CAE8B /* DeviceUtil.swift in Sources */,
|
||||
29DC17B521D0CC0600E26CED /* Atomic.swift in Sources */,
|
||||
BCA97BFF263C54560027213C /* MP4SampleToChunkBox.swift in Sources */,
|
||||
BCC1A6BE2643F41600661156 /* MP4SegmentFile.Builder.swift in Sources */,
|
||||
BCA97B8C263AC1830027213C /* MP4Box.swift in Sources */,
|
||||
BC44A1AB23D31E92002D4297 /* AudioCodecBuffer.swift in Sources */,
|
||||
BCC1A7092647E89300661156 /* BaseDescriptor.swift in Sources */,
|
||||
29EB3E261ED05A07001CAE8B /* RTMPStream.swift in Sources */,
|
||||
BCA97BE2263C095B0027213C /* MP4TimeToSampleBox.swift in Sources */,
|
||||
29DF20642312A3DD004057C3 /* RTMPNWSocket.swift in Sources */,
|
||||
BCA97BF2263C31020027213C /* MP4SampleDescriptionBox.swift in Sources */,
|
||||
29EB3E131ED05887001CAE8B /* SoundTransform.swift in Sources */,
|
||||
29EB3DF81ED05799001CAE8B /* Mirror+Extension.swift in Sources */,
|
||||
BCA97C1A263DA5070027213C /* MP4AudioSampleEntry.swift in Sources */,
|
||||
BCA2252E293CC5B600DD7CB2 /* IOScreenCaptureUnit.swift in Sources */,
|
||||
BC562DCD29576D220048D89A /* AVCaptureSession.Preset+Extension.swift in Sources */,
|
||||
BC83A4752403D83B006BDE06 /* VTCompressionSession+Extension.swift in Sources */,
|
||||
BC9CFA9523BDE8B700917EEF /* NetStreamDrawable.swift in Sources */,
|
||||
BCC1A6E926447CCA00661156 /* MP4MovieHeaderBox.swift in Sources */,
|
||||
29EB3E031ED0585D001CAE8B /* AudioSpecificConfig.swift in Sources */,
|
||||
29EB3E141ED05889001CAE8B /* IOVideoUnit.swift in Sources */,
|
||||
29EB3E221ED059FD001CAE8B /* RTMPMessage.swift in Sources */,
|
||||
29EB3E001ED05854001CAE8B /* HTTPService.swift in Sources */,
|
||||
BCC1A6DD26446EF600661156 /* MP4VideoMediaHeaderBox.swift in Sources */,
|
||||
29EB3DFF1ED05852001CAE8B /* HTTPResponse.swift in Sources */,
|
||||
29EB3E021ED05858001CAE8B /* M3U.swift in Sources */,
|
||||
29EB3E0D1ED05877001CAE8B /* IOAudioUnit.swift in Sources */,
|
||||
2942A4FA21A9418A004E1BEE /* Running.swift in Sources */,
|
||||
BCC1A6C42643F41600661156 /* MP4FragmentedWriter.swift in Sources */,
|
||||
295891101EEB8D3C00CE51E1 /* FLVVideoCodec.swift in Sources */,
|
||||
295891031EEB7AFC00CE51E1 /* ScalingMode.swift in Sources */,
|
||||
29EB3DFD1ED05847001CAE8B /* CVPixelBuffer+Extension.swift in Sources */,
|
||||
BCA97BF6263C390E0027213C /* CustomXmlStringConvertible.swift in Sources */,
|
||||
BCC1A6BB2643F41600661156 /* MP4File.Builder.swift in Sources */,
|
||||
BC94E52E264146530094C169 /* MP4ReaderConvertible.swift in Sources */,
|
||||
BCC1A72D264FAC1800661156 /* ElementaryStreamSpecificData.swift in Sources */,
|
||||
BCB976E126107B5600C9A649 /* TSAdaptationField.swift in Sources */,
|
||||
BC4914B028DDF445009E2DF6 /* VTDecompressionSession+Extension.swift in Sources */,
|
||||
BCC1A6D5264461FE00661156 /* MP4HandlerBox.swift in Sources */,
|
||||
BCC1A7112647F25A00661156 /* DecoderConfigDescriptor.swift in Sources */,
|
||||
BCC1A6D126445AF500661156 /* MP4TrackExtendsBox.swift in Sources */,
|
||||
BC7C568C299538CF00C41A9B /* H264Profile.swift in Sources */,
|
||||
BC4914A828DDD367009E2DF6 /* VTSessionOption.swift in Sources */,
|
||||
BC110259292E661E00D48035 /* MultiCamCaptureSetting.swift in Sources */,
|
||||
BC4914A428DDD33D009E2DF6 /* VTSessionConvertible.swift in Sources */,
|
||||
BCAD0C02263E968400ADFB80 /* MP4FileReader.swift in Sources */,
|
||||
BCA97C00263C599C0027213C /* MP4SyncSampleBox.swift in Sources */,
|
||||
2941746D22D069B300A2944F /* AudioEffect.swift in Sources */,
|
||||
BCC1A6B82643F41600661156 /* MP4WriterConvertible.swift in Sources */,
|
||||
29EB3E151ED0588C001CAE8B /* VideoEffect.swift in Sources */,
|
||||
29EB3E061ED05865001CAE8B /* MP4Reader.swift in Sources */,
|
||||
29EB3E041ED05860001CAE8B /* AVCConfigurationRecord.swift in Sources */,
|
||||
29EB3DF71ED05797001CAE8B /* URL+Extension.swift in Sources */,
|
||||
29DF20682312A436004057C3 /* RTMPSocketCompatible.swift in Sources */,
|
||||
|
@ -2613,41 +2274,31 @@
|
|||
29EB3DF51ED05779001CAE8B /* CMFormatDescription+Extension.swift in Sources */,
|
||||
BC110255292DD6E900D48035 /* vImage_Buffer+Extension.swift in Sources */,
|
||||
BC570B4A28E9ACC10098A12C /* IOUnit.swift in Sources */,
|
||||
BCA97C0C263D80F40027213C /* MP4SampleEntry.swift in Sources */,
|
||||
29EB3E381ED05A41001CAE8B /* MD5.swift in Sources */,
|
||||
295891141EEB8D7200CE51E1 /* FLVFrameType.swift in Sources */,
|
||||
29EB3E1B1ED0589F001CAE8B /* AMF0Serializer.swift in Sources */,
|
||||
BCC1A70D2647F23200661156 /* ESDescriptor.swift in Sources */,
|
||||
BC6FC92029609A6800A746EE /* ShapeFactory.swift in Sources */,
|
||||
BCA97C03263C61930027213C /* MP4MediaHeaderBox.swift in Sources */,
|
||||
29EB3E0C1ED05874001CAE8B /* TSWriter.swift in Sources */,
|
||||
295891181EEB8DFC00CE51E1 /* FLVTagType.swift in Sources */,
|
||||
BC4914B428DDFE31009E2DF6 /* VTSessionOptionKey.swift in Sources */,
|
||||
BCA97BFA263C4F980027213C /* MP4EditListBox.swift in Sources */,
|
||||
29EB3DF91ED0579C001CAE8B /* ExpressibleByIntegerLiteral+Extension.swift in Sources */,
|
||||
29EB3E201ED059F9001CAE8B /* RTMPConnection.swift in Sources */,
|
||||
29EB3E331ED05A2E001CAE8B /* MediaLink.swift in Sources */,
|
||||
BCA97BEA263C27080027213C /* MP4SampleSizeBox.swift in Sources */,
|
||||
29EB3E1D1ED058A5001CAE8B /* AMFFoundation.swift in Sources */,
|
||||
29EB3E251ED05A04001CAE8B /* RTMPSocket.swift in Sources */,
|
||||
BCC1A6D926446B2D00661156 /* MP4SoundMediaHeaderBox.swift in Sources */,
|
||||
29EB3E311ED05A29001CAE8B /* AnyUtil.swift in Sources */,
|
||||
29EB3E1C1ED058A2001CAE8B /* AMF3Serializer.swift in Sources */,
|
||||
29EB3DEE1ED05763001CAE8B /* AudioCodec.swift in Sources */,
|
||||
29EB3E241ED05A02001CAE8B /* RTMPSharedObject.swift in Sources */,
|
||||
BCA97C14263D8C850027213C /* MP4FullBox.swift in Sources */,
|
||||
BCA97BF7263C4B8E0027213C /* MP4ChunkOffsetBox.swift in Sources */,
|
||||
29EB3E231ED059FF001CAE8B /* RTMPMuxer.swift in Sources */,
|
||||
29EB3DF11ED0576C001CAE8B /* Constants.swift in Sources */,
|
||||
29EB3E011ED05856001CAE8B /* HTTPStream.swift in Sources */,
|
||||
29EB3E171ED05893001CAE8B /* NetClient.swift in Sources */,
|
||||
BC0D236F26331BAB001DDA0C /* DataBuffer.swift in Sources */,
|
||||
BCC1A6F92645BFBC00661156 /* MP4AVCConfigurationBox.swift in Sources */,
|
||||
BCB976D326107B1200C9A649 /* TSAdaptationExtensionField.swift in Sources */,
|
||||
BCA97C1D263DAD080027213C /* MP4ElementaryStreamDescriptorBox.swift in Sources */,
|
||||
BCB977412621812800C9A649 /* AVCFormatStream.swift in Sources */,
|
||||
BC4C9EB123F2E736004A14F2 /* AudioStreamBasicDescription+Extension.swift in Sources */,
|
||||
BCAD0C23263EFCEF00ADFB80 /* MP4SegmentIndexBox.swift in Sources */,
|
||||
2958912C1EEB8F1D00CE51E1 /* FLVSoundSize.swift in Sources */,
|
||||
295891241EEB8EC500CE51E1 /* FLVAVCPacketType.swift in Sources */,
|
||||
2943ED55232FCA7C00ED6301 /* Setting.swift in Sources */,
|
||||
|
@ -2665,14 +2316,11 @@
|
|||
29EB3E341ED05A30001CAE8B /* CRC32.swift in Sources */,
|
||||
BC562DC9295767860048D89A /* AVCaptureDevice+Extension.swift in Sources */,
|
||||
BC566F7025D2ECC500573C4C /* HLSService.swift in Sources */,
|
||||
BCAD0C1D263EE1D000ADFB80 /* MP4Util.swift in Sources */,
|
||||
29EB3E181ED05896001CAE8B /* NetService.swift in Sources */,
|
||||
295891281EEB8EF300CE51E1 /* FLVAACPacket.swift in Sources */,
|
||||
BCC1A7152647F28F00661156 /* SLConfigDescriptor.swift in Sources */,
|
||||
BC4914B828DEC2FE009E2DF6 /* VTSessionMode.swift in Sources */,
|
||||
BCA97B88263AC0F30027213C /* MP4BoxConvertible.swift in Sources */,
|
||||
2958911C1EEB8E3F00CE51E1 /* FLVAudioCodec.swift in Sources */,
|
||||
BC94E500263FE6B80094C169 /* MP4MovieFragmentHeaderBox.swift in Sources */,
|
||||
29EB3DF61ED0577C001CAE8B /* CMSampleBuffer+Extension.swift in Sources */,
|
||||
BCC1A729264FA1C100661156 /* ProfileLevelIndicationIndexDescriptor.swift in Sources */,
|
||||
29EB3E281ED05A0C001CAE8B /* RTMPTSocket.swift in Sources */,
|
||||
|
|
|
@ -1,41 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// ISO/IEC 14496-15 5.3.4.1.2
|
||||
struct MP4AVCConfigurationBox: MP4BoxConvertible {
|
||||
// MARK: MP4BoxConvertible
|
||||
var size: UInt32 = 0
|
||||
let type: String = "avcC"
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
// MARK: MP4AVCConfigurationBox
|
||||
var config = AVCConfigurationRecord()
|
||||
}
|
||||
|
||||
extension MP4AVCConfigurationBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeBytes(config.data)
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
config = AVCConfigurationRecord(data: try buffer.readBytes(buffer.bytesAvailable))
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let avcC = MP4Box.Name<MP4PixelAspectRatioBox>(rawValue: "avcC")
|
||||
}
|
|
@ -1,72 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
struct MP4AudioSampleEntry: MP4SampleEntry {
|
||||
static let channelCount: UInt16 = 2
|
||||
static let sampleSize: UInt16 = 16
|
||||
// MARK: MP4SampleEntry
|
||||
var size: UInt32 = 0
|
||||
var type: String = ""
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
var dataReferenceIndex: UInt16 = 0
|
||||
// MARK: MP4AudioSampleEntry
|
||||
var channelCount: UInt16 = Self.channelCount
|
||||
var sampleSize: UInt16 = Self.sampleSize
|
||||
var sampleRate: UInt32 = 0
|
||||
}
|
||||
|
||||
extension MP4AudioSampleEntry: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeBytes(.init(repeating: 0, count: 6)) // const unsigned int(8)[6] reserved = 0
|
||||
.writeUInt16(dataReferenceIndex)
|
||||
.writeUInt32(0)
|
||||
.writeUInt32(0) // const unsigned int(32)[2] reserved = 0
|
||||
.writeUInt16(channelCount)
|
||||
.writeUInt16(sampleSize)
|
||||
.writeUInt16(0) // unsigned int(16) pre_defined = 0
|
||||
.writeUInt16(0) // const unsigned int(16) reserved = 0
|
||||
.writeUInt32(sampleRate << 16)
|
||||
for child in children {
|
||||
buffer.writeBytes(child.data)
|
||||
}
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
type = try buffer.readUTF8Bytes(4)
|
||||
buffer.position += 6
|
||||
dataReferenceIndex = try buffer.readUInt16()
|
||||
buffer.position += 8
|
||||
channelCount = try buffer.readUInt16()
|
||||
sampleSize = try buffer.readUInt16()
|
||||
buffer.position += 4
|
||||
sampleRate = try buffer.readUInt32() >> 16
|
||||
children.removeAll()
|
||||
while 0 < buffer.bytesAvailable {
|
||||
let size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
buffer.position -= 8
|
||||
var entry = MP4Box()
|
||||
entry.data = try buffer.readBytes(Int(size))
|
||||
children.append(entry)
|
||||
}
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let mp4a = MP4Box.Name<MP4AudioSampleEntry>(rawValue: "mp4a")
|
||||
static let mlpa = MP4Box.Name<MP4AudioSampleEntry>(rawValue: "mlpa")
|
||||
}
|
|
@ -1,84 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
struct MP4Box: MP4BoxConvertible {
|
||||
static let containers: Set<String> = [
|
||||
"cmov",
|
||||
"ctts",
|
||||
"edts",
|
||||
"iods",
|
||||
"junk",
|
||||
"mdia",
|
||||
"minf",
|
||||
"moov",
|
||||
"pict",
|
||||
"pnot",
|
||||
"rmda",
|
||||
"rmra",
|
||||
"skip",
|
||||
"stbl",
|
||||
"trak",
|
||||
"uuid",
|
||||
"wide",
|
||||
"moof",
|
||||
"traf"
|
||||
]
|
||||
|
||||
class Names {
|
||||
}
|
||||
|
||||
final class Name<T: MP4BoxConvertible>: Names, Hashable, RawRepresentable {
|
||||
let rawValue: String
|
||||
// swiftlint:disable nesting
|
||||
typealias RawValue = String
|
||||
|
||||
init(rawValue: String) {
|
||||
self.rawValue = rawValue
|
||||
}
|
||||
}
|
||||
|
||||
var size: UInt32 = 0
|
||||
var type: String = ""
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
private var _data = Data()
|
||||
}
|
||||
|
||||
extension MP4Box: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
_data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
_data = newValue
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
type = try buffer.readUTF8Bytes(4)
|
||||
if Self.containers.contains(type) {
|
||||
children.removeAll()
|
||||
while 0 < buffer.bytesAvailable {
|
||||
let size = try buffer.readInt32()
|
||||
_ = try buffer.readBytes(4)
|
||||
buffer.position -= 8
|
||||
var child = MP4Box()
|
||||
child.data = try buffer.readBytes(Int(size))
|
||||
children.append(child)
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let trak = MP4Box.Name<MP4Box>(rawValue: "trak")
|
||||
}
|
||||
|
||||
extension MP4Box: CustomDebugStringConvertible {
|
||||
// MARK: CustomDebugStringConvertible
|
||||
var debugDescription: String {
|
||||
Mirror(reflecting: self).debugDescription
|
||||
}
|
||||
}
|
|
@ -1,43 +0,0 @@
|
|||
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
|
||||
}
|
||||
}
|
|
@ -1,56 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
struct MP4ChunkOffsetBox: MP4FullBox {
|
||||
static let version: UInt8 = 0
|
||||
static let flags: UInt32 = 0
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "stco"
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
var version: UInt8 = Self.version
|
||||
var flags: UInt32 = Self.flags
|
||||
// MARK: MP4ChunkOffsetBox
|
||||
var entries: [UInt32] = []
|
||||
}
|
||||
|
||||
extension MP4ChunkOffsetBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeUInt32(UInt32(entries.count))
|
||||
for entry in entries {
|
||||
buffer
|
||||
.writeUInt32(entry)
|
||||
}
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
flags = try buffer.readUInt24()
|
||||
let numberOfEntries = try buffer.readUInt32()
|
||||
entries.removeAll()
|
||||
for _ in 0..<numberOfEntries {
|
||||
entries.append(try buffer.readUInt32())
|
||||
}
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let stco = MP4Box.Name<MP4ChunkOffsetBox>(rawValue: "stco")
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// ISO/IEC 14496-12 5th 8.7.2.2
|
||||
struct MP4DataEntryUrlBox: MP4FullBox {
|
||||
static let version: UInt8 = 0
|
||||
static let flags: UInt32 = 0
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "url "
|
||||
var offset: UInt64 = 0
|
||||
var version: UInt8 = Self.version
|
||||
var flags: UInt32 = Self.flags
|
||||
var children: [MP4BoxConvertible] = []
|
||||
// MARK: MP4DataEntryUrlBox
|
||||
var location: String = ""
|
||||
}
|
||||
|
||||
extension MP4DataEntryUrlBox: DataConvertible {
|
||||
// MARK: DataConvertible
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeUTF8Bytes(location)
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
flags = try buffer.readUInt24()
|
||||
location = try buffer.readUTF8Bytes(buffer.bytesAvailable)
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let url = MP4Box.Name<MP4DataEntryUrlBox>(rawValue: "url ")
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
struct MP4EditListBox: MP4FullBox {
|
||||
static let flags: UInt32 = 0
|
||||
|
||||
struct Entry: Equatable, CustomDebugStringConvertible {
|
||||
let segmentDuration: UInt64
|
||||
let mediaTime: UInt64
|
||||
let mediaRateInteger: Int16
|
||||
let mediaRateFraction: Int16
|
||||
|
||||
var debugDescription: String {
|
||||
Mirror(reflecting: self).debugDescription
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "elst"
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
var version: UInt8 = 0
|
||||
var flags: UInt32 = Self.flags
|
||||
// MARK: MP4EditListBox
|
||||
var entries: [Entry] = []
|
||||
}
|
||||
|
||||
extension MP4EditListBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeUInt32(UInt32(entries.count))
|
||||
for entry in entries {
|
||||
if version == 0 {
|
||||
buffer
|
||||
.writeUInt32(UInt32(entry.segmentDuration))
|
||||
.writeUInt32(UInt32(entry.mediaTime))
|
||||
.writeInt16(entry.mediaRateInteger)
|
||||
.writeInt16(entry.mediaRateFraction)
|
||||
} else {
|
||||
buffer
|
||||
.writeUInt64(entry.segmentDuration)
|
||||
.writeUInt64(entry.mediaTime)
|
||||
.writeInt16(entry.mediaRateInteger)
|
||||
.writeInt16(entry.mediaRateFraction)
|
||||
}
|
||||
}
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
flags = try buffer.readUInt24()
|
||||
let numberOfEntries = try buffer.readUInt32()
|
||||
entries.removeAll()
|
||||
for _ in 0..<numberOfEntries {
|
||||
if version == 0 {
|
||||
entries.append(Entry(
|
||||
segmentDuration: UInt64(try buffer.readUInt32()),
|
||||
mediaTime: UInt64(try buffer.readUInt32()),
|
||||
mediaRateInteger: try buffer.readInt16(),
|
||||
mediaRateFraction: try buffer.readInt16()
|
||||
))
|
||||
} else {
|
||||
entries.append(Entry(
|
||||
segmentDuration: try buffer.readUInt64(),
|
||||
mediaTime: try buffer.readUInt64(),
|
||||
mediaRateInteger: try buffer.readInt16(),
|
||||
mediaRateFraction: try buffer.readInt16()
|
||||
))
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let elst = MP4Box.Name<MP4EditListBox>(rawValue: "elst")
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/**
|
||||
- seealso: https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-124774
|
||||
*/
|
||||
struct MP4ElementaryStreamDescriptorBox: MP4FullBox {
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "esds"
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
var version: UInt8 = 0
|
||||
var flags: UInt32 = 0
|
||||
// MARK: MP4FullBox
|
||||
var descriptor = ESDescriptor()
|
||||
}
|
||||
|
||||
extension MP4ElementaryStreamDescriptorBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeBytes(descriptor.data)
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
flags = try buffer.readUInt24()
|
||||
descriptor.data = try buffer.readBytes(buffer.bytesAvailable)
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let esds = MP4Box.Name<MP4ElementaryStreamDescriptorBox>(rawValue: "esds")
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
enum MP4File {
|
||||
struct Builder {
|
||||
private var ftyp: MP4FileTypeBox?
|
||||
private var moov: MP4Box?
|
||||
|
||||
mutating func setFileTypeBox(_ ftyp: MP4FileTypeBox?) -> Self {
|
||||
self.ftyp = ftyp
|
||||
return self
|
||||
}
|
||||
|
||||
mutating func setMoovieBox(_ moov: MP4Box?) -> Self {
|
||||
self.moov = moov
|
||||
return self
|
||||
}
|
||||
|
||||
func build() -> MP4Box {
|
||||
var box = MP4Box()
|
||||
if let ftyp = ftyp {
|
||||
box.children.append(ftyp)
|
||||
}
|
||||
if let moov = moov {
|
||||
box.children.append(moov)
|
||||
}
|
||||
return box
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,53 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
final class MP4FileReader: MP4ReaderConvertible {
|
||||
var fileType: MP4FileTypeBox {
|
||||
root.getBoxes(by: .ftyp).first ?? MP4FileTypeBox()
|
||||
}
|
||||
var tracks: [MP4TrackReader] = []
|
||||
|
||||
private var root = MP4Box()
|
||||
private let fileHandle: FileHandle
|
||||
|
||||
init(forReadingFrom url: URL) throws {
|
||||
fileHandle = try FileHandle(forReadingFrom: url)
|
||||
}
|
||||
|
||||
func execute() -> Self {
|
||||
do {
|
||||
var currentOffset = root.offset
|
||||
let length = fileHandle.seekToEndOfFile()
|
||||
root.children.removeAll()
|
||||
repeat {
|
||||
fileHandle.seek(toFileOffset: currentOffset)
|
||||
let buffer = ByteArray(data: fileHandle.readData(ofLength: 8))
|
||||
let size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
fileHandle.seek(toFileOffset: currentOffset)
|
||||
var child = MP4Box()
|
||||
child.data = fileHandle.readData(ofLength: Int(size))
|
||||
root.children.append(child)
|
||||
currentOffset += UInt64(size)
|
||||
} while currentOffset < length
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
return self
|
||||
}
|
||||
|
||||
func getBoxes<T: MP4BoxConvertible>(by name: MP4Box.Name<T>) -> [T] {
|
||||
return root.getBoxes(by: name)
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4FileReader: CustomDebugStringConvertible {
|
||||
var debugDescription: String {
|
||||
return root.debugDescription
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4FileReader: CustomXmlStringConvertible {
|
||||
var xmlString: String {
|
||||
return root.xmlString
|
||||
}
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
struct MP4FileTypeBox: MP4BoxConvertible {
|
||||
// MARK: MP4BoxConvertible
|
||||
var size: UInt32 = 0
|
||||
var type: String = ""
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
// MARK: MP4MediaHeaderBox
|
||||
var majorBrand: UInt32 = 0
|
||||
var minorVersion: UInt32 = 0
|
||||
var compatibleBrands: [UInt32] = []
|
||||
}
|
||||
|
||||
extension MP4FileTypeBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt32(majorBrand)
|
||||
.writeUInt32(minorVersion)
|
||||
for brand in compatibleBrands {
|
||||
buffer.writeUInt32(brand)
|
||||
}
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
type = try buffer.readUTF8Bytes(4)
|
||||
majorBrand = try buffer.readUInt32()
|
||||
minorVersion = try buffer.readUInt32()
|
||||
compatibleBrands.removeAll()
|
||||
while 0 < buffer.bytesAvailable {
|
||||
compatibleBrands.append(try buffer.readUInt32())
|
||||
}
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let styp = MP4Box.Name<MP4FileTypeBox>(rawValue: "styp")
|
||||
static let ftyp = MP4Box.Name<MP4FileTypeBox>(rawValue: "ftyp")
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
import AVFoundation
|
||||
import Foundation
|
||||
|
||||
protocol MP4FragmentedWriterDelegate: AnyObject {
|
||||
func writer(_ writer: MP4FragmentedWriter, didSegmentChanged segment: MP4Box)
|
||||
}
|
||||
|
||||
final class MP4FragmentedWriter: MP4WriterConvertible {
|
||||
private var segment = MP4Box()
|
||||
private(set) var mapping = MP4Box()
|
||||
|
||||
private var audio = MP4FragmentedTrafWriter()
|
||||
private var video = MP4FragmentedTrafWriter()
|
||||
|
||||
weak var delegate: MP4FragmentedWriterDelegate?
|
||||
}
|
||||
|
||||
extension MP4FragmentedWriter: AudioCodecDelegate {
|
||||
// MARK: AudioCodecDelegate
|
||||
func audioCodec(_ codec: AudioCodec, didSet formatDescription: CMFormatDescription?) {
|
||||
}
|
||||
|
||||
func audioCodec(_ codec: AudioCodec, didOutput sample: UnsafeMutableAudioBufferListPointer, presentationTimeStamp: CMTime) {
|
||||
}
|
||||
}
|
||||
|
||||
final class MP4FragmentedTrafWriter {
|
||||
private var tkhd = MP4TrackFragmentHeaderBox()
|
||||
private var trun = MP4TrackRunBox()
|
||||
private var tfdt = MP4TrackRunBox()
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
protocol MP4FullBox: MP4BoxConvertible {
|
||||
var version: UInt8 { get }
|
||||
var flags: UInt32 { get }
|
||||
}
|
|
@ -1,62 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// ISO/IEC 14496-12 5th 8.4.3.2
|
||||
struct MP4HandlerBox: MP4FullBox {
|
||||
static let version: UInt8 = 0
|
||||
static let flags: UInt32 = 0
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "hdlr"
|
||||
var offset: UInt64 = 0
|
||||
var version: UInt8 = Self.version
|
||||
var flags: UInt32 = Self.flags
|
||||
var children: [MP4BoxConvertible] = []
|
||||
// MARK: MP4HandlerBox
|
||||
var handlerType: UInt32 = 0
|
||||
var name: String = ""
|
||||
}
|
||||
|
||||
extension MP4HandlerBox: DataConvertible {
|
||||
// MARK: DataConvertible
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeUInt32(0) // pre_defined
|
||||
.writeUInt32(handlerType)
|
||||
.writeUInt32(0) // reserved
|
||||
.writeUInt32(0) // reserved
|
||||
.writeUInt32(0) // reserved
|
||||
.writeUTF8Bytes(name)
|
||||
.writeUTF8Bytes("\0")
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
flags = try buffer.readUInt24()
|
||||
buffer.position += 4 // pre_defined
|
||||
handlerType = try buffer.readUInt32()
|
||||
buffer.position += 4 // reserved
|
||||
buffer.position += 4 // reserved
|
||||
buffer.position += 4 // reserved
|
||||
name = try buffer.readUTF8Bytes(buffer.bytesAvailable - 1)
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let hdlr = MP4Box.Name<MP4HandlerBox>(rawValue: "hdlr")
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
struct MP4MediaHeaderBox: MP4FullBox {
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "mdhd"
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
var version: UInt8 = 0
|
||||
var flags: UInt32 = 0
|
||||
// MARK: MP4MediaHeaderBox
|
||||
var creationTime: UInt64 = 0
|
||||
var modificationTime: UInt64 = 0
|
||||
var timeScale: UInt32 = 0
|
||||
var duration: UInt64 = 0
|
||||
var language: [UInt8] = [0, 0, 0]
|
||||
}
|
||||
|
||||
extension MP4MediaHeaderBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
if version == 0 {
|
||||
buffer
|
||||
.writeUInt32(UInt32(creationTime))
|
||||
.writeUInt32(UInt32(modificationTime))
|
||||
.writeUInt32(timeScale)
|
||||
.writeUInt32(UInt32(duration))
|
||||
} else {
|
||||
buffer
|
||||
.writeUInt64(creationTime)
|
||||
.writeUInt64(modificationTime)
|
||||
.writeUInt32(timeScale)
|
||||
.writeUInt64(duration)
|
||||
}
|
||||
buffer
|
||||
.writeUInt16(
|
||||
UInt16(language[0]) << 10 |
|
||||
UInt16(language[1]) << 5 |
|
||||
UInt16(language[2])
|
||||
)
|
||||
.writeUInt16(0) // pre_defined = 0
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
flags = try buffer.readUInt24()
|
||||
if version == 0 {
|
||||
creationTime = UInt64(try buffer.readUInt32())
|
||||
modificationTime = UInt64(try buffer.readUInt32())
|
||||
timeScale = try buffer.readUInt32()
|
||||
duration = UInt64(try buffer.readUInt32())
|
||||
} else {
|
||||
creationTime = try buffer.readUInt64()
|
||||
modificationTime = try buffer.readUInt64()
|
||||
timeScale = try buffer.readUInt32()
|
||||
duration = try buffer.readUInt64()
|
||||
}
|
||||
let lang = try buffer.readUInt16()
|
||||
language = [
|
||||
UInt8((lang & 0x7C00) >> 10),
|
||||
UInt8((lang & 0x3E0) >> 5),
|
||||
UInt8(lang & 0x1F)
|
||||
]
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let mdhd = MP4Box.Name<MP4MediaHeaderBox>(rawValue: "mdhd")
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
enum MP4MovieFragmentBox {
|
||||
struct Builder {
|
||||
private var mfhd: MP4MovieFragmentHeaderBox?
|
||||
private var traf: [MP4Box] = []
|
||||
|
||||
mutating func setMovieFragmentHeaderBox(_ mfhd: MP4MovieFragmentHeaderBox?) -> Self {
|
||||
self.mfhd = mfhd
|
||||
return self
|
||||
}
|
||||
|
||||
mutating func addTrackFragmentBox(_ traf: MP4Box?) -> Self {
|
||||
guard let traf = traf else {
|
||||
return self
|
||||
}
|
||||
self.traf.append(traf)
|
||||
return self
|
||||
}
|
||||
|
||||
func build() -> MP4Box {
|
||||
var box = MP4Box()
|
||||
if let mfhd = mfhd {
|
||||
box.children.append(mfhd)
|
||||
}
|
||||
for t in traf {
|
||||
box.children.append(t)
|
||||
}
|
||||
return box
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,47 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
struct MP4MovieFragmentHeaderBox: MP4FullBox {
|
||||
static let version: UInt8 = 0
|
||||
static let flags: UInt32 = 0
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "mfhd"
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
let version: UInt8 = Self.version
|
||||
let flags: UInt32 = Self.flags
|
||||
// MARK: MP4MovieFragmentHeaderBox
|
||||
var sequenceNumber: UInt32 = 0
|
||||
}
|
||||
|
||||
extension MP4MovieFragmentHeaderBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeUInt32(sequenceNumber)
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
buffer.position += 4
|
||||
sequenceNumber = try buffer.readUInt32()
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let mfhd = MP4Box.Name<MP4MovieFragmentHeaderBox>(rawValue: "mfhd")
|
||||
}
|
|
@ -1,104 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
struct MP4MovieHeaderBox: MP4FullBox {
|
||||
static let rate: Int32 = 0x00010000
|
||||
static let volume: Int16 = 0x0100
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "mvhd"
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
var version: UInt8 = 0
|
||||
var flags: UInt32 = 0
|
||||
// MARK: MP4MediaHeaderBox
|
||||
var creationTime: UInt64 = 0
|
||||
var modificationTime: UInt64 = 0
|
||||
var timeScale: UInt32 = 0
|
||||
var duration: UInt64 = 0
|
||||
var rate: Int32 = Self.rate
|
||||
var volume: Int16 = Self.volume
|
||||
var matrix: [Int32] = []
|
||||
var nextTrackID: UInt32 = 0
|
||||
}
|
||||
|
||||
extension MP4MovieHeaderBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
if version == 0 {
|
||||
buffer
|
||||
.writeUInt32(UInt32(creationTime))
|
||||
.writeUInt32(UInt32(modificationTime))
|
||||
.writeUInt32(timeScale)
|
||||
.writeUInt32(UInt32(duration))
|
||||
} else {
|
||||
buffer
|
||||
.writeUInt64(creationTime)
|
||||
.writeUInt64(modificationTime)
|
||||
.writeUInt32(timeScale)
|
||||
.writeUInt64(duration)
|
||||
}
|
||||
buffer
|
||||
.writeInt32(rate)
|
||||
.writeInt16(volume)
|
||||
.writeInt16(0)
|
||||
.writeUInt32(0)
|
||||
.writeUInt32(0)
|
||||
for m in matrix {
|
||||
buffer.writeInt32(m)
|
||||
}
|
||||
buffer
|
||||
.writeInt32(0)
|
||||
.writeInt32(0)
|
||||
.writeInt32(0)
|
||||
.writeInt32(0)
|
||||
.writeInt32(0)
|
||||
.writeInt32(0)
|
||||
.writeUInt32(nextTrackID)
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
flags = try buffer.readUInt24()
|
||||
if version == 0 {
|
||||
creationTime = UInt64(try buffer.readUInt32())
|
||||
modificationTime = UInt64(try buffer.readUInt32())
|
||||
timeScale = try buffer.readUInt32()
|
||||
duration = UInt64(try buffer.readUInt32())
|
||||
} else {
|
||||
creationTime = try buffer.readUInt64()
|
||||
modificationTime = try buffer.readUInt64()
|
||||
timeScale = try buffer.readUInt32()
|
||||
duration = try buffer.readUInt64()
|
||||
}
|
||||
rate = try buffer.readInt32()
|
||||
volume = try buffer.readInt16()
|
||||
buffer.position += 2 // const bit(16) reserved
|
||||
buffer.position += 8 // const unsigned int(32)[2] reserved
|
||||
matrix.removeAll()
|
||||
for _ in 0..<9 {
|
||||
matrix.append(try buffer.readInt32())
|
||||
}
|
||||
buffer.position += 24 // bit(32)[6] pre_defined = 0
|
||||
nextTrackID = try buffer.readUInt32()
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let mvhd = MP4Box.Name<MP4MovieHeaderBox>(rawValue: "mvhd")
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// ISO/IEC 14496-12 5th 12.1.4.2
|
||||
struct MP4PixelAspectRatioBox: MP4BoxConvertible {
|
||||
// MARK: MP4BoxConvertible
|
||||
var size: UInt32 = 0
|
||||
let type: String = "pasp"
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
// MARK: MP4PixelAspectRatioBox
|
||||
var hSpacing: UInt32 = 0
|
||||
var vSpacing: UInt32 = 0
|
||||
}
|
||||
|
||||
extension MP4PixelAspectRatioBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt32(hSpacing)
|
||||
.writeUInt32(vSpacing)
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
hSpacing = try buffer.readUInt32()
|
||||
vSpacing = try buffer.readUInt32()
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let pasp = MP4Box.Name<MP4PixelAspectRatioBox>(rawValue: "pasp")
|
||||
}
|
|
@ -1,33 +0,0 @@
|
|||
import AVFoundation
|
||||
|
||||
final class MP4Reader: MP4ReaderConvertible {
|
||||
let fileType: MP4FileTypeBox
|
||||
let tracks: [MP4TrackReader]
|
||||
|
||||
init(fileType: MP4FileTypeBox, tracks: [MP4TrackReader]) {
|
||||
self.fileType = fileType
|
||||
self.tracks = tracks
|
||||
}
|
||||
}
|
||||
|
||||
final class MP4TrackReader {
|
||||
struct MP4SampleIterator: IteratorProtocol {
|
||||
// swiftlint:disable nesting
|
||||
typealias Element = UInt8
|
||||
|
||||
private var cursor: Int = 0
|
||||
private let reader: MP4TrackReader
|
||||
|
||||
init(reader: MP4TrackReader) {
|
||||
self.reader = reader
|
||||
}
|
||||
|
||||
mutating func next() -> Element? {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func makeIterator() -> MP4SampleIterator {
|
||||
return MP4SampleIterator(reader: self)
|
||||
}
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
protocol MP4ReaderConvertible: AnyObject {
|
||||
var fileType: MP4FileTypeBox { get }
|
||||
var tracks: [MP4TrackReader] { get }
|
||||
|
||||
func execute() -> Self
|
||||
}
|
||||
|
||||
extension MP4ReaderConvertible {
|
||||
func execute() -> Self {
|
||||
return self
|
||||
}
|
||||
}
|
|
@ -1,74 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
struct MP4SampleDescriptionBox: MP4FullBox {
|
||||
static let audio: Set<String> = ["mp4a"]
|
||||
static let video: Set<String> = ["mp4v", "s263", "avc1"]
|
||||
|
||||
static func makeEntry(by type: String) -> MP4SampleEntry? {
|
||||
switch true {
|
||||
case video.contains(type):
|
||||
return MP4VisualSampleEntry()
|
||||
case audio.contains(type):
|
||||
return MP4AudioSampleEntry()
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
static let flags: UInt32 = 0
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "stsd"
|
||||
var offset: UInt64 = 0
|
||||
var version: UInt8 = 0
|
||||
var flags: UInt32 = Self.flags
|
||||
// MARK: MP4SampleDescriptionBox
|
||||
var children: [MP4BoxConvertible] = []
|
||||
}
|
||||
|
||||
extension MP4SampleDescriptionBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeUInt32(UInt32(children.count))
|
||||
for child in children {
|
||||
buffer.writeBytes(child.data)
|
||||
}
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
flags = try buffer.readUInt24()
|
||||
let numberOfEntries = try buffer.readUInt32()
|
||||
children.removeAll()
|
||||
for _ in 0..<numberOfEntries {
|
||||
let size = try buffer.readUInt32()
|
||||
let type = try buffer.readUTF8Bytes(4)
|
||||
buffer.position -= 8
|
||||
var entry = Self.makeEntry(by: type)
|
||||
entry?.data = try buffer.readBytes(Int(size))
|
||||
if let entry = entry {
|
||||
children.append(entry)
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let stsd = MP4Box.Name<MP4SampleDescriptionBox>(rawValue: "stsd")
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
protocol MP4SampleEntry: MP4BoxConvertible {
|
||||
var dataReferenceIndex: UInt16 { get }
|
||||
}
|
|
@ -1,62 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// ISO/IEC 14496-12 5th 8.7.3.2.1
|
||||
struct MP4SampleSizeBox: MP4FullBox {
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "stsz"
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
var version: UInt8 = 0
|
||||
var flags: UInt32 = 0
|
||||
// MARK: MP4SampleSizeBox
|
||||
var sampleSize: UInt32 = 0
|
||||
var entries: [UInt32] = []
|
||||
}
|
||||
|
||||
extension MP4SampleSizeBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeUInt32(sampleSize)
|
||||
.writeUInt32(UInt32(entries.count))
|
||||
for entry in entries {
|
||||
buffer
|
||||
.writeUInt32(entry)
|
||||
}
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
flags = try buffer.readUInt24()
|
||||
sampleSize = try buffer.readUInt32()
|
||||
entries.removeAll()
|
||||
let numberOfEntries = try buffer.readUInt32()
|
||||
if sampleSize == 0 {
|
||||
for _ in 0..<numberOfEntries {
|
||||
entries.append(try buffer.readUInt32())
|
||||
}
|
||||
} else {
|
||||
entries.append(sampleSize)
|
||||
}
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let stsz = MP4Box.Name<MP4SampleSizeBox>(rawValue: "stsz")
|
||||
}
|
|
@ -1,69 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// ISO/IEC 14496-12 5th 8.7.4.2
|
||||
struct MP4SampleToChunkBox: MP4FullBox {
|
||||
struct Entry: Equatable, CustomDebugStringConvertible {
|
||||
let firstChunk: UInt32
|
||||
let samplesPerChunk: UInt32
|
||||
let sampleDescriptionIndex: UInt32
|
||||
|
||||
var debugDescription: String {
|
||||
Mirror(reflecting: self).debugDescription
|
||||
}
|
||||
}
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "stsc"
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
var version: UInt8 = 0
|
||||
var flags: UInt32 = 0
|
||||
// MARK: MP4SampleToChunkBox
|
||||
var entries: [Entry] = []
|
||||
}
|
||||
|
||||
extension MP4SampleToChunkBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeUInt32(UInt32(entries.count))
|
||||
for entry in entries {
|
||||
buffer
|
||||
.writeUInt32(entry.firstChunk)
|
||||
.writeUInt32(entry.samplesPerChunk)
|
||||
.writeUInt32(entry.sampleDescriptionIndex)
|
||||
}
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
buffer.position += 4
|
||||
let numberOfEntries: UInt32 = try buffer.readUInt32()
|
||||
entries.removeAll()
|
||||
for _ in 0..<numberOfEntries {
|
||||
entries.append(Entry(
|
||||
firstChunk: try buffer.readUInt32(),
|
||||
samplesPerChunk: try buffer.readUInt32(),
|
||||
sampleDescriptionIndex: try buffer.readUInt32()
|
||||
))
|
||||
}
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let stsc = MP4Box.Name<MP4SampleToChunkBox>(rawValue: "stsc")
|
||||
}
|
|
@ -1,56 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
enum MP4SegmentFile {
|
||||
struct Builder {
|
||||
private var styp: MP4FileTypeBox?
|
||||
private var sidx: [MP4Box] = []
|
||||
private var moof: MP4Box?
|
||||
private var mdat: [MP4Box] = []
|
||||
|
||||
mutating func setSegmentTypeBox(_ styp: MP4FileTypeBox?) -> Self {
|
||||
self.styp = styp
|
||||
return self
|
||||
}
|
||||
|
||||
mutating func addSegmentIndexBox(_ sidx: MP4Box?) -> Self {
|
||||
guard let sidx = sidx else {
|
||||
return self
|
||||
}
|
||||
self.sidx.append(sidx)
|
||||
return self
|
||||
}
|
||||
|
||||
mutating func setMovieFragmentBox(_ moof: MP4Box?) -> Self {
|
||||
guard let moof = moof else {
|
||||
return self
|
||||
}
|
||||
self.moof = moof
|
||||
return self
|
||||
}
|
||||
|
||||
mutating func addMediaDataContainer(_ mdat: MP4Box?) -> Self {
|
||||
guard let mdat = mdat else {
|
||||
return self
|
||||
}
|
||||
self.mdat.append(mdat)
|
||||
return self
|
||||
}
|
||||
|
||||
func build() -> MP4Box {
|
||||
var box = MP4Box()
|
||||
if let styp = styp {
|
||||
box.children.append(styp)
|
||||
}
|
||||
for s in sidx {
|
||||
box.children.append(s)
|
||||
}
|
||||
if let moof = moof {
|
||||
box.children.append(moof)
|
||||
}
|
||||
for m in mdat {
|
||||
box.children.append(m)
|
||||
}
|
||||
return box
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,117 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
struct MP4SegmentIndexBox: MP4FullBox {
|
||||
static let flags: UInt32 = 0
|
||||
|
||||
struct Reference: Equatable {
|
||||
var type = false
|
||||
var size: UInt32 = 0
|
||||
var subsegmentDuration: UInt32 = 0
|
||||
var startsWithSap = false
|
||||
var sapType: UInt8 = 0
|
||||
var sapDeltaTime: UInt32 = 0
|
||||
}
|
||||
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "sidx"
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
var version: UInt8 = 0
|
||||
let flags: UInt32 = Self.flags
|
||||
// MARK: MP4SegmentIndexBox
|
||||
var referenceID: UInt32 = 0
|
||||
var timescale: UInt32 = 0
|
||||
var earliestPresentationTime: UInt64 = 0
|
||||
var firstOffset: UInt64 = 0
|
||||
var references: [Reference] = []
|
||||
}
|
||||
|
||||
extension MP4SegmentIndexBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeUInt32(referenceID)
|
||||
.writeUInt32(timescale)
|
||||
if version == 0 {
|
||||
buffer
|
||||
.writeUInt32(UInt32(earliestPresentationTime))
|
||||
.writeUInt32(UInt32(firstOffset))
|
||||
} else {
|
||||
buffer
|
||||
.writeUInt64(earliestPresentationTime)
|
||||
.writeUInt64(firstOffset)
|
||||
}
|
||||
buffer
|
||||
.writeUInt16(0)
|
||||
.writeUInt16(UInt16(references.count))
|
||||
for reference in references {
|
||||
var first: UInt32 = 0
|
||||
let second = reference.subsegmentDuration
|
||||
var third: UInt32 = 0
|
||||
if reference.type {
|
||||
first |= 1 << 31
|
||||
}
|
||||
first |= reference.size
|
||||
|
||||
if reference.startsWithSap {
|
||||
third |= 1 << 31
|
||||
}
|
||||
third |= UInt32(reference.sapType) << 28
|
||||
third |= reference.sapDeltaTime
|
||||
buffer
|
||||
.writeUInt32(first)
|
||||
.writeUInt32(second)
|
||||
.writeUInt32(third)
|
||||
}
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
buffer.position += 3
|
||||
referenceID = try buffer.readUInt32()
|
||||
timescale = try buffer.readUInt32()
|
||||
if version == 0 {
|
||||
earliestPresentationTime = UInt64(try buffer.readUInt32())
|
||||
firstOffset = UInt64(try buffer.readUInt32())
|
||||
} else {
|
||||
earliestPresentationTime = try buffer.readUInt64()
|
||||
firstOffset = try buffer.readUInt64()
|
||||
}
|
||||
buffer.position += 2
|
||||
let referenceCount: UInt16 = try buffer.readUInt16()
|
||||
references.removeAll()
|
||||
for _ in 0..<referenceCount {
|
||||
let first = try buffer.readUInt32()
|
||||
let second = try buffer.readUInt32()
|
||||
let third = try buffer.readUInt32()
|
||||
references.append(Reference(
|
||||
type: (first >> 31) == 1,
|
||||
size: first & 0x7FFFFFFF,
|
||||
subsegmentDuration: second,
|
||||
startsWithSap: (third >> 31) == 1,
|
||||
sapType: UInt8(third & 0x70000000 >> 28),
|
||||
sapDeltaTime: third & 0xFFFFFFF
|
||||
))
|
||||
}
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let sidx = MP4Box.Name<MP4SegmentIndexBox>(rawValue: "sidx")
|
||||
}
|
|
@ -1,51 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// ISO/IEC 14496-12 5th 12.2.2.2
|
||||
struct MP4SoundMediaHeaderBox: MP4FullBox {
|
||||
static let version: UInt8 = 0
|
||||
static let flags: UInt32 = 0
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "smhd"
|
||||
var offset: UInt64 = 0
|
||||
var version: UInt8 = Self.version
|
||||
var flags: UInt32 = Self.flags
|
||||
var children: [MP4BoxConvertible] = []
|
||||
// MARK: MP4MovieExtendsBox
|
||||
var balance: Int16 = 0
|
||||
}
|
||||
|
||||
extension MP4SoundMediaHeaderBox: DataConvertible {
|
||||
// MARK: DataConvertible
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeInt16(balance)
|
||||
.writeUInt16(0) // reserved
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
flags = try buffer.readUInt24()
|
||||
balance = try buffer.readInt16()
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let smhd = MP4Box.Name<MP4SoundMediaHeaderBox>(rawValue: "smhd")
|
||||
}
|
|
@ -1,54 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// ISO/IEC 14496-12 5th 8.6.2.2
|
||||
struct MP4SyncSampleBox: MP4FullBox {
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "stss"
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
var version: UInt8 = 0
|
||||
var flags: UInt32 = 0
|
||||
// MARK: MP4SyncSampleBox
|
||||
var entries: [UInt32] = []
|
||||
}
|
||||
|
||||
extension MP4SyncSampleBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeUInt32(UInt32(entries.count))
|
||||
for entry in entries {
|
||||
buffer
|
||||
.writeUInt32(entry)
|
||||
}
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
buffer.position += 4
|
||||
let numberOfEntries: UInt32 = try buffer.readUInt32()
|
||||
entries.removeAll()
|
||||
for _ in 0..<numberOfEntries {
|
||||
entries.append(try buffer.readUInt32())
|
||||
}
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let stss = MP4Box.Name<MP4SyncSampleBox>(rawValue: "stss")
|
||||
}
|
|
@ -1,70 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// ISO/IEC 14496-12 5th 8.6.1.2.2
|
||||
struct MP4TimeToSampleBox: MP4FullBox {
|
||||
static let version: UInt8 = 0
|
||||
static let flags: UInt32 = 0
|
||||
|
||||
struct Entry: Equatable, CustomDebugStringConvertible {
|
||||
let sampleCount: UInt32
|
||||
let sampleDelta: UInt32
|
||||
|
||||
var debugDescription: String {
|
||||
Mirror(reflecting: self).debugDescription
|
||||
}
|
||||
}
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "stts"
|
||||
var offset: UInt64 = 0
|
||||
var version: UInt8 = Self.version
|
||||
var flags: UInt32 = Self.flags
|
||||
var children: [MP4BoxConvertible] = []
|
||||
// MARK: MP4TimeToSampleBox
|
||||
var entries: [Entry] = []
|
||||
}
|
||||
|
||||
extension MP4TimeToSampleBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeUInt32(UInt32(entries.count))
|
||||
for entry in entries {
|
||||
buffer
|
||||
.writeUInt32(entry.sampleCount)
|
||||
.writeUInt32(entry.sampleDelta)
|
||||
}
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
flags = try buffer.readUInt24()
|
||||
entries.removeAll()
|
||||
let numberOfEntries: UInt32 = try buffer.readUInt32()
|
||||
for _ in 0..<numberOfEntries {
|
||||
entries.append(Entry(
|
||||
sampleCount: try buffer.readUInt32(),
|
||||
sampleDelta: try buffer.readUInt32()
|
||||
))
|
||||
}
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let stts = MP4Box.Name<MP4TimeToSampleBox>(rawValue: "stts")
|
||||
}
|
|
@ -1,62 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// ISO/IEC 14496-12 5th 8.8.3.2
|
||||
struct MP4TrackExtendsBox: MP4FullBox {
|
||||
static let version: UInt8 = 0
|
||||
static let flags: UInt32 = 0
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "trex"
|
||||
var offset: UInt64 = 0
|
||||
var version: UInt8 = Self.version
|
||||
var flags: UInt32 = Self.flags
|
||||
var children: [MP4BoxConvertible] = []
|
||||
// MARK: MP4MovieExtendsBox
|
||||
var trackID: UInt32 = 0
|
||||
var defaultSampleDescriptionIndex: UInt32 = 0
|
||||
var defaultSampleDuration: UInt32 = 0
|
||||
var defaultSampleSize: UInt32 = 0
|
||||
var defaultSampleFlags: UInt32 = 0
|
||||
}
|
||||
|
||||
extension MP4TrackExtendsBox: DataConvertible {
|
||||
// MARK: DataConvertible
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeUInt32(trackID)
|
||||
.writeUInt32(defaultSampleDescriptionIndex)
|
||||
.writeUInt32(defaultSampleDuration)
|
||||
.writeUInt32(defaultSampleSize)
|
||||
.writeUInt32(defaultSampleFlags)
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
flags = try buffer.readUInt24()
|
||||
trackID = try buffer.readUInt32()
|
||||
defaultSampleDescriptionIndex = try buffer.readUInt32()
|
||||
defaultSampleDuration = try buffer.readUInt32()
|
||||
defaultSampleSize = try buffer.readUInt32()
|
||||
defaultSampleFlags = try buffer.readUInt32()
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let trex = MP4Box.Name<MP4TrackExtendsBox>(rawValue: "trex")
|
||||
}
|
|
@ -1,54 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
struct MP4TrackFragmentBaseMediaDecodeTimeBox: MP4BoxConvertible {
|
||||
static let flags: UInt32 = 0
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "tfdt"
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
var version: UInt8 = 0
|
||||
let flags: UInt32 = Self.flags
|
||||
// MARK: MP4TrackFragmentBaseMediaDecodeTimeBox
|
||||
var baseMediaDecodeTime: UInt64 = 0
|
||||
}
|
||||
|
||||
extension MP4TrackFragmentBaseMediaDecodeTimeBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
if version == 0 {
|
||||
buffer.writeUInt32(UInt32(baseMediaDecodeTime))
|
||||
} else {
|
||||
buffer.writeUInt64(baseMediaDecodeTime)
|
||||
}
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
if version == 0 {
|
||||
baseMediaDecodeTime = UInt64(try buffer.readUInt32())
|
||||
} else {
|
||||
baseMediaDecodeTime = try buffer.readUInt64()
|
||||
}
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let tfdt = MP4Box.Name<MP4TrackFragmentBaseMediaDecodeTimeBox>(rawValue: "tfdt")
|
||||
}
|
|
@ -1,28 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
enum MP4TrackFragmentBox {
|
||||
struct Builder {
|
||||
private var tkhd: MP4TrackFragmentHeaderBox?
|
||||
private var trun: MP4TrackRunBox?
|
||||
private var tfdt: MP4TrackFragmentBaseMediaDecodeTimeBox?
|
||||
|
||||
mutating func setTrackFragmentHeaderBox(_ tkhd: MP4TrackFragmentHeaderBox?) -> Self {
|
||||
self.tkhd = tkhd
|
||||
return self
|
||||
}
|
||||
|
||||
mutating func setTrackRunBox(_ trun: MP4TrackRunBox?) -> Self {
|
||||
self.trun = trun
|
||||
return self
|
||||
}
|
||||
|
||||
mutating func setTrackFragmentBaseMediaDecodeTimeBox(_ tfdt: MP4TrackFragmentBaseMediaDecodeTimeBox?) -> Self {
|
||||
self.tfdt = tfdt
|
||||
return self
|
||||
}
|
||||
|
||||
func build() -> MP4Box {
|
||||
return MP4Box()
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,105 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// ISO/IEC 14496-12 5th 8.8.7.2
|
||||
struct MP4TrackFragmentHeaderBox: MP4FullBox {
|
||||
static let version: UInt8 = 0
|
||||
|
||||
enum Field: UInt32 {
|
||||
case baseDataOffset = 0x000001
|
||||
case sampleDescriptionIndex = 0x000002
|
||||
case defaultSampleDuration = 0x000008
|
||||
case defaultSampleSize = 0x000010
|
||||
case defaultSampleFlags = 0x000020
|
||||
case durationIsEmpty = 0x010000
|
||||
case defaultBaseIsMoof = 0x020000
|
||||
}
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "tfhd"
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
let version: UInt8 = Self.version
|
||||
var flags: UInt32 = 0
|
||||
// MARK: MP4TrackFragmentHeaderBox
|
||||
var trackId: UInt32 = 0
|
||||
var baseDataOffset: UInt64?
|
||||
var sampleDescriptionIndex: UInt32?
|
||||
var defaultSampleDuration: UInt32?
|
||||
var defaultSampleSize: UInt32?
|
||||
var defaultSampleFlags: UInt32?
|
||||
|
||||
private func contains(_ value: Field) -> Bool {
|
||||
return (flags & value.rawValue) != 0
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4TrackFragmentHeaderBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeUInt32(trackId)
|
||||
var flags: UInt32 = 0
|
||||
if let baseDataOffset = baseDataOffset {
|
||||
buffer.writeUInt64(baseDataOffset)
|
||||
flags |= Field.baseDataOffset.rawValue
|
||||
}
|
||||
if let sampleDescriptionIndex = sampleDescriptionIndex {
|
||||
buffer.writeUInt32(sampleDescriptionIndex)
|
||||
flags |= Field.sampleDescriptionIndex.rawValue
|
||||
}
|
||||
if let defaultSampleDuration = defaultSampleDuration {
|
||||
buffer.writeUInt32(defaultSampleDuration)
|
||||
flags |= Field.defaultSampleDuration.rawValue
|
||||
}
|
||||
if let defaultSampleSize = defaultSampleSize {
|
||||
buffer.writeUInt32(defaultSampleSize)
|
||||
flags |= Field.defaultSampleSize.rawValue
|
||||
}
|
||||
if let defaultSampleFlags = defaultSampleFlags {
|
||||
buffer.writeUInt32(defaultSampleFlags)
|
||||
flags |= Field.defaultSampleFlags.rawValue
|
||||
}
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
buffer.position = 9
|
||||
buffer.writeUInt24(flags)
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
buffer.position += 1
|
||||
flags = UInt32(try buffer.readUInt24())
|
||||
trackId = try buffer.readUInt32()
|
||||
if contains(.baseDataOffset) {
|
||||
baseDataOffset = try buffer.readUInt64()
|
||||
}
|
||||
if contains(.sampleDescriptionIndex) {
|
||||
sampleDescriptionIndex = try buffer.readUInt32()
|
||||
}
|
||||
if contains(.defaultSampleDuration) {
|
||||
defaultSampleDuration = try buffer.readUInt32()
|
||||
}
|
||||
if contains(.defaultSampleSize) {
|
||||
defaultSampleSize = try buffer.readUInt32()
|
||||
}
|
||||
if contains(.defaultSampleFlags) {
|
||||
defaultSampleFlags = try buffer.readUInt32()
|
||||
}
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let tfhd = MP4Box.Name<MP4TrackFragmentHeaderBox>(rawValue: "tfhd")
|
||||
}
|
|
@ -1,108 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
struct MP4TrackHeaderBox: MP4FullBox {
|
||||
static let layer: Int16 = 0
|
||||
static let volume: Int16 = 0x0100
|
||||
static let matrix: [Int32] = .init(repeating: 0, count: 9)
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "tkhd"
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
var version: UInt8 = 0
|
||||
var flags: UInt32 = 0
|
||||
// MARK: MP4MediaHeaderBox
|
||||
var creationTime: UInt64 = 0
|
||||
var modificationTime: UInt64 = 0
|
||||
var trackID: UInt32 = 0
|
||||
var duration: UInt64 = 0
|
||||
var layer: Int16 = 0
|
||||
var alternateGroup: Int16 = 0
|
||||
var volume: Int16 = Self.volume
|
||||
var matrix: [Int32] = Self.matrix
|
||||
var width: UInt32 = 0
|
||||
var height: UInt32 = 0
|
||||
}
|
||||
|
||||
extension MP4TrackHeaderBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
if version == 0 {
|
||||
buffer
|
||||
.writeUInt32(UInt32(creationTime))
|
||||
.writeUInt32(UInt32(modificationTime))
|
||||
.writeUInt32(trackID)
|
||||
.writeUInt32(0) // const unsigned int(32) reserved = 0
|
||||
.writeUInt32(UInt32(duration))
|
||||
} else {
|
||||
buffer
|
||||
.writeUInt64(creationTime)
|
||||
.writeUInt64(modificationTime)
|
||||
.writeUInt32(trackID)
|
||||
.writeUInt32(0) // const unsigned int(32) reserved = 0
|
||||
.writeUInt64(duration)
|
||||
}
|
||||
buffer
|
||||
.writeUInt32(0)
|
||||
.writeUInt32(0) // const unsigned int(32)[2] reserved = 0
|
||||
.writeInt16(layer)
|
||||
.writeInt16(alternateGroup)
|
||||
.writeInt16(volume)
|
||||
.writeInt16(0)
|
||||
for m in matrix {
|
||||
buffer.writeInt32(m)
|
||||
}
|
||||
buffer
|
||||
.writeUInt32(width)
|
||||
.writeUInt32(height)
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
flags = try buffer.readUInt24()
|
||||
if version == 0 {
|
||||
creationTime = UInt64(try buffer.readUInt32())
|
||||
modificationTime = UInt64(try buffer.readUInt32())
|
||||
trackID = try buffer.readUInt32()
|
||||
buffer.position += 4
|
||||
duration = UInt64(try buffer.readUInt32())
|
||||
} else {
|
||||
creationTime = try buffer.readUInt64()
|
||||
modificationTime = try buffer.readUInt64()
|
||||
trackID = try buffer.readUInt32()
|
||||
buffer.position += 4
|
||||
duration = try buffer.readUInt64()
|
||||
}
|
||||
buffer.position += 8
|
||||
layer = try buffer.readInt16()
|
||||
alternateGroup = try buffer.readInt16()
|
||||
volume = try buffer.readInt16()
|
||||
buffer.position += 2 // const unsigned int(16) reserved = 0
|
||||
matrix.removeAll()
|
||||
for _ in 0..<9 {
|
||||
matrix.append(try buffer.readInt32())
|
||||
}
|
||||
width = try buffer.readUInt32()
|
||||
height = try buffer.readUInt32()
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let tkhd = MP4Box.Name<MP4TrackHeaderBox>(rawValue: "tkhd")
|
||||
}
|
|
@ -1,111 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// ISO/IEC 14496-12 5th 8.8.8.2
|
||||
struct MP4TrackRunBox: MP4FullBox {
|
||||
struct Sample: Equatable {
|
||||
var duration: UInt32?
|
||||
var size: UInt32?
|
||||
var flags: UInt32?
|
||||
var compositionTimeOffset: Int32?
|
||||
}
|
||||
enum Field: UInt32 {
|
||||
case dataOffset = 0x000001
|
||||
case firstSampleFlags = 0x000004
|
||||
case sampleDuration = 0x000100
|
||||
case sampleSize = 0x000200
|
||||
case sampleFlags = 0x000400
|
||||
case sampleCompositionTimeOffset = 0x000800
|
||||
}
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "trun"
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
var version: UInt8 = 0
|
||||
var flags: UInt32 = 0
|
||||
// MARK: MP4TrackRunBox
|
||||
var dataOffset: Int32?
|
||||
var firstSampleFlags: UInt32?
|
||||
var samples: [Sample] = []
|
||||
|
||||
private func contains(_ value: Field) -> Bool {
|
||||
return (flags & value.rawValue) != 0
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4TrackRunBox: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeUInt32(UInt32(samples.count))
|
||||
var flags: UInt32 = 0
|
||||
if let dataOffset = dataOffset {
|
||||
buffer.writeInt32(dataOffset)
|
||||
flags |= Field.dataOffset.rawValue
|
||||
}
|
||||
if let firstSampleFlags = firstSampleFlags {
|
||||
buffer.writeUInt32(firstSampleFlags)
|
||||
flags |= Field.firstSampleFlags.rawValue
|
||||
}
|
||||
for sample in samples {
|
||||
if let duration = sample.duration {
|
||||
buffer.writeUInt32(duration)
|
||||
flags |= Field.sampleDuration.rawValue
|
||||
}
|
||||
if let size = sample.size {
|
||||
buffer.writeUInt32(size)
|
||||
flags |= Field.sampleSize.rawValue
|
||||
}
|
||||
if let sampleFlags = sample.flags {
|
||||
buffer.writeUInt32(sampleFlags)
|
||||
flags |= Field.sampleFlags.rawValue
|
||||
}
|
||||
if let compositionTimeOffset = sample.compositionTimeOffset {
|
||||
buffer.writeInt32(compositionTimeOffset)
|
||||
flags |= Field.sampleCompositionTimeOffset.rawValue
|
||||
}
|
||||
}
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
buffer.position = 9
|
||||
buffer.writeUInt24(flags)
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readBytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
flags = try buffer.readUInt24()
|
||||
let sampleCount: UInt32 = try buffer.readUInt32()
|
||||
if contains(.dataOffset) {
|
||||
dataOffset = try buffer.readInt32()
|
||||
}
|
||||
if contains(.firstSampleFlags) {
|
||||
firstSampleFlags = try buffer.readUInt32()
|
||||
}
|
||||
samples.removeAll()
|
||||
for _ in 0..<sampleCount {
|
||||
samples.append(Sample(
|
||||
duration: contains(.sampleDuration) ? try buffer.readUInt32() : nil,
|
||||
size: contains(.sampleSize) ? try buffer.readUInt32() : nil,
|
||||
flags: contains(.sampleFlags) ? try buffer.readUInt32() : nil,
|
||||
compositionTimeOffset: contains(.sampleCompositionTimeOffset) ? try buffer.readInt32() : nil
|
||||
))
|
||||
}
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let trun = MP4Box.Name<MP4TrackRunBox>(rawValue: "trun")
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
enum MP4Util {
|
||||
static func string(_ value: UInt32) -> String? {
|
||||
return String(data: value.bigEndian.data, encoding: .ascii)
|
||||
}
|
||||
|
||||
static func uint32(_ value: String) -> UInt32 {
|
||||
var loop = 0
|
||||
var result: UInt32 = 0
|
||||
for scalar in value.unicodeScalars {
|
||||
result |= scalar.value << (8 * loop)
|
||||
loop += 1
|
||||
}
|
||||
return result.bigEndian
|
||||
}
|
||||
}
|
|
@ -1,59 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// ISO/IEC 14496-12 5th 12.2.2.2
|
||||
struct MP4VideoMediaHeaderBox: MP4FullBox {
|
||||
static let version: UInt8 = 0
|
||||
static let flags: UInt32 = 0
|
||||
// MARK: MP4FullBox
|
||||
var size: UInt32 = 0
|
||||
let type: String = "vmhd"
|
||||
var offset: UInt64 = 0
|
||||
var version: UInt8 = Self.version
|
||||
var flags: UInt32 = Self.flags
|
||||
var children: [MP4BoxConvertible] = []
|
||||
// MARK: MP4VideoMediaHeaderBox
|
||||
var graphicsMode: UInt16 = 0
|
||||
var opcolor: [UInt16] = [0, 0, 0]
|
||||
}
|
||||
|
||||
extension MP4VideoMediaHeaderBox: DataConvertible {
|
||||
// MARK: DataConvertible
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeUInt8(version)
|
||||
.writeUInt24(flags)
|
||||
.writeUInt16(graphicsMode)
|
||||
.writeUInt16(opcolor[0])
|
||||
.writeUInt16(opcolor[1])
|
||||
.writeUInt16(opcolor[2])
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
version = try buffer.readUInt8()
|
||||
flags = try buffer.readUInt24()
|
||||
graphicsMode = try buffer.readUInt16()
|
||||
opcolor = [
|
||||
try buffer.readUInt16(),
|
||||
try buffer.readUInt16(),
|
||||
try buffer.readUInt16()
|
||||
]
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension MP4Box.Names {
|
||||
static let vmhd = MP4Box.Name<MP4VideoMediaHeaderBox>(rawValue: "vmhd")
|
||||
}
|
|
@ -1,84 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// ISO/IEC 14496-12 5th 12.1.3.2
|
||||
struct MP4VisualSampleEntry: MP4SampleEntry {
|
||||
static let hSolution: UInt32 = 0x00480000
|
||||
static let vSolution: UInt32 = 0x00480000
|
||||
static let depth: UInt16 = 0x0018
|
||||
// MARK: MP4SampleEntry
|
||||
var size: UInt32 = 0
|
||||
var type: String = ""
|
||||
var offset: UInt64 = 0
|
||||
var children: [MP4BoxConvertible] = []
|
||||
var dataReferenceIndex: UInt16 = 0
|
||||
// MARK: MP4VisualSampleEntryBox
|
||||
var width: UInt16 = 0
|
||||
var height: UInt16 = 0
|
||||
var hSolution: UInt32 = Self.hSolution
|
||||
var vSolution: UInt32 = Self.vSolution
|
||||
var frameCount: UInt16 = 1
|
||||
var compressorname: String = ""
|
||||
var depth: UInt16 = Self.depth
|
||||
}
|
||||
|
||||
extension MP4VisualSampleEntry: DataConvertible {
|
||||
var data: Data {
|
||||
get {
|
||||
let buffer = ByteArray()
|
||||
.writeUInt32(size)
|
||||
.writeUTF8Bytes(type)
|
||||
.writeBytes(.init(repeating: 0, count: 6)) // const unsigned int(8)[6] reserved = 0
|
||||
.writeUInt16(dataReferenceIndex)
|
||||
.writeUInt16(0) // unsigned int(16) pre_defined = 0
|
||||
.writeUInt16(0) // const unsigned int(16) reserved = 0
|
||||
.writeInt32(0)
|
||||
.writeInt32(0)
|
||||
.writeInt32(0) // unsigned int(32)[3] pre_defined = 0
|
||||
.writeUInt16(width)
|
||||
.writeUInt16(height)
|
||||
.writeUInt32(hSolution)
|
||||
.writeUInt32(vSolution)
|
||||
.writeUInt32(0) // const unsigned int(32) reserved = 0
|
||||
.writeUInt16(frameCount)
|
||||
.writeUTF8Bytes(compressorname)
|
||||
.writeUInt16(depth)
|
||||
.writeInt16(-1) // int(16) pre_defined = -1
|
||||
for child in children {
|
||||
buffer.writeBytes(child.data)
|
||||
}
|
||||
let size = buffer.position
|
||||
buffer.position = 0
|
||||
buffer.writeUInt32(UInt32(size))
|
||||
return buffer.data
|
||||
}
|
||||
set {
|
||||
do {
|
||||
let buffer = ByteArray(data: newValue)
|
||||
size = try buffer.readUInt32()
|
||||
type = try buffer.readUTF8Bytes(4)
|
||||
buffer.position += 6
|
||||
dataReferenceIndex = try buffer.readUInt16()
|
||||
buffer.position += 16
|
||||
width = try buffer.readUInt16()
|
||||
height = try buffer.readUInt16()
|
||||
hSolution = try buffer.readUInt32()
|
||||
vSolution = try buffer.readUInt32()
|
||||
buffer.position += 4
|
||||
frameCount = try buffer.readUInt16()
|
||||
compressorname = try buffer.readUTF8Bytes(32)
|
||||
depth = try buffer.readUInt16()
|
||||
_ = try buffer.readUInt16()
|
||||
while 0 < buffer.bytesAvailable {
|
||||
let size = try buffer.readUInt32()
|
||||
_ = try buffer.readUTF8Bytes(4)
|
||||
buffer.position -= 8
|
||||
var entry = MP4Box()
|
||||
entry.data = try buffer.readBytes(Int(size))
|
||||
children.append(entry)
|
||||
}
|
||||
} catch {
|
||||
logger.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
protocol MP4WriterConvertible {
|
||||
}
|
File diff suppressed because one or more lines are too long
|
@ -1,119 +0,0 @@
|
|||
import Foundation
|
||||
import XCTest
|
||||
|
||||
@testable import HaishinKit
|
||||
|
||||
final class MP4FileReaderTests: XCTestCase {
|
||||
func testMP4FileTypeBox() {
|
||||
let file = makeMP4File()
|
||||
let ftyp: MP4FileTypeBox? = file.getBoxes(by: .ftyp).first
|
||||
XCTAssertEqual(ftyp?.minorVersion, 512)
|
||||
}
|
||||
|
||||
func testMP4MovieHeaderBox() {
|
||||
let file = makeMP4File()
|
||||
let mvhd = file.getBoxes(by: .mvhd).first
|
||||
XCTAssertEqual(mvhd?.creationTime, 2082844800)
|
||||
XCTAssertEqual(mvhd?.modificationTime, 3488636519)
|
||||
XCTAssertEqual(mvhd?.timeScale, 1000)
|
||||
XCTAssertEqual(mvhd?.duration, 64896)
|
||||
XCTAssertEqual(mvhd?.rate, 65536)
|
||||
XCTAssertEqual(mvhd?.volume, MP4MovieHeaderBox.volume)
|
||||
XCTAssertEqual(mvhd?.matrix, [65536, 0, 0, 0, 65536, 0, 0, 0, 1073741824])
|
||||
XCTAssertEqual(mvhd?.nextTrackID, 3)
|
||||
}
|
||||
|
||||
func testMP4SampleSizeBox() {
|
||||
let file = makeMP4File()
|
||||
let stsz: [MP4SampleSizeBox]? = file.getBoxes(by: .stsz)
|
||||
XCTAssertEqual(stsz?.first?.entries[0], 22696)
|
||||
XCTAssertEqual(stsz?.first?.entries[1], 807)
|
||||
XCTAssertEqual(stsz?.first?.entries[2], 660)
|
||||
XCTAssertEqual(stsz?.last?.entries[0], 1011)
|
||||
XCTAssertEqual(stsz?.last?.entries[1], 1026)
|
||||
XCTAssertEqual(stsz?.last?.entries[2], 1030)
|
||||
}
|
||||
|
||||
func testMP4ChunkOffsetBox() {
|
||||
let file = makeMP4File()
|
||||
let stco = file.getBoxes(by: .stco).first
|
||||
XCTAssertEqual(stco?.entries[0], 1059)
|
||||
XCTAssertEqual(stco?.entries[1], 26801)
|
||||
}
|
||||
|
||||
func testMP4EditListBox() {
|
||||
let file = makeMP4File()
|
||||
let elst = file.getBoxes(by: .elst).first
|
||||
XCTAssertEqual(elst?.entries[0].mediaRateFraction, 0)
|
||||
XCTAssertEqual(elst?.entries[0].mediaRateInteger, 1)
|
||||
XCTAssertEqual(elst?.entries[0].mediaTime, 0)
|
||||
XCTAssertEqual(elst?.entries[0].segmentDuration, 64867)
|
||||
}
|
||||
|
||||
func testMP4SampleToChunkBox() {
|
||||
let file = makeMP4File()
|
||||
let stsc = file.getBoxes(by: .stsc).first
|
||||
XCTAssertEqual(stsc?.entries[0].firstChunk, 1)
|
||||
XCTAssertEqual(stsc?.entries[0].samplesPerChunk, 1)
|
||||
XCTAssertEqual(stsc?.entries[0].sampleDescriptionIndex, 1)
|
||||
}
|
||||
|
||||
func testMP4SyncSampleBox() {
|
||||
let file = makeMP4File()
|
||||
let stss = file.getBoxes(by: .stss).first
|
||||
XCTAssertEqual(stss?.entries[0], 1)
|
||||
XCTAssertEqual(stss?.entries[1], 127)
|
||||
XCTAssertEqual(stss?.entries[2], 196)
|
||||
}
|
||||
|
||||
func testMP4MediaHeaderBox() {
|
||||
let file = makeMP4File()
|
||||
let mdhd = file.getBoxes(by: .mdhd).first
|
||||
XCTAssertEqual(mdhd?.creationTime, 2082844800)
|
||||
XCTAssertEqual(mdhd?.modificationTime, 2082844800)
|
||||
XCTAssertEqual(mdhd?.timeScale, 15360)
|
||||
XCTAssertEqual(mdhd?.duration, 996352)
|
||||
XCTAssertEqual(mdhd?.language, [21, 14, 4])
|
||||
}
|
||||
|
||||
func testMP4AudioSampleEntryBox() {
|
||||
let file = makeMP4File()
|
||||
let mp4a = file.getBoxes(by: .stsd).last?.getBoxes(by: .mp4a).first
|
||||
|
||||
XCTAssertEqual(mp4a?.dataReferenceIndex, 1)
|
||||
XCTAssertEqual(mp4a?.channelCount, 2)
|
||||
XCTAssertEqual(mp4a?.sampleSize, 16)
|
||||
XCTAssertEqual(mp4a?.sampleRate, 48000)
|
||||
|
||||
let esds = mp4a?.getBoxes(by: .esds).first
|
||||
XCTAssertEqual(esds?.flags, 0)
|
||||
XCTAssertEqual(esds?.version, 0)
|
||||
|
||||
// ESDescriptor
|
||||
XCTAssertEqual(esds?.descriptor.tag, 3)
|
||||
XCTAssertEqual(esds?.descriptor.ES_ID, 2)
|
||||
|
||||
// DecoderConfigDescriptor
|
||||
XCTAssertEqual(esds?.descriptor.decConfigDescr.tag, DecoderConfigDescriptor.tag)
|
||||
XCTAssertEqual(esds?.descriptor.decConfigDescr.objectTypeIndication, 64)
|
||||
XCTAssertEqual(esds?.descriptor.decConfigDescr.streamType, 5)
|
||||
XCTAssertEqual(esds?.descriptor.decConfigDescr.avgBitrate, 383586)
|
||||
XCTAssertEqual(esds?.descriptor.decConfigDescr.maxBitrate, 449032)
|
||||
|
||||
XCTAssertEqual(esds?.descriptor.decConfigDescr.decSpecificInfo.tag, DecoderSpecificInfo.tag)
|
||||
XCTAssertEqual(esds?.descriptor.decConfigDescr.decSpecificInfo.size, 2)
|
||||
|
||||
XCTAssertEqual(esds?.descriptor.decConfigDescr.profileLevelIndicationIndexDescriptor.tag, ProfileLevelIndicationIndexDescriptor.tag)
|
||||
XCTAssertEqual(esds?.descriptor.decConfigDescr.profileLevelIndicationIndexDescriptor.profileLevelIndicationIndex, 2)
|
||||
|
||||
XCTAssertEqual(esds?.descriptor.slConfigDescr.tag, 6)
|
||||
XCTAssertEqual(esds?.descriptor.slConfigDescr.predefined, 2)
|
||||
}
|
||||
|
||||
private func makeMP4File() -> MP4FileReader {
|
||||
let bundle = Bundle(for: type(of: self))
|
||||
let url = URL(fileURLWithPath: bundle.path(forResource: "SampleVideo_360x240_5mb", ofType: "mp4")!)
|
||||
return try! MP4FileReader(forReadingFrom: url).execute()
|
||||
}
|
||||
}
|
||||
|
|
@ -1,64 +0,0 @@
|
|||
import Foundation
|
||||
import XCTest
|
||||
|
||||
@testable import HaishinKit
|
||||
|
||||
final class MP4FileReaderTests2: XCTestCase {
|
||||
func testMP4FileTypeBox() {
|
||||
let file = makeFMP4File()
|
||||
let styp = file.getBoxes(by: .styp).first
|
||||
XCTAssertEqual(styp?.majorBrand, MP4Util.uint32("msdh"))
|
||||
XCTAssertEqual(styp?.minorVersion, 0)
|
||||
XCTAssertEqual(styp?.compatibleBrands[0], MP4Util.uint32("msdh"))
|
||||
XCTAssertEqual(styp?.compatibleBrands[1], MP4Util.uint32("msix"))
|
||||
|
||||
let sidx = file.getBoxes(by: .sidx)
|
||||
XCTAssertEqual(sidx[0].referenceID, 1)
|
||||
XCTAssertEqual(sidx[0].timescale, 15360)
|
||||
XCTAssertEqual(sidx[0].earliestPresentationTime, 0)
|
||||
XCTAssertEqual(sidx[0].firstOffset, 52)
|
||||
XCTAssertEqual(sidx[0].references[0].type, false)
|
||||
XCTAssertEqual(sidx[0].references[0].size, 530176)
|
||||
XCTAssertEqual(sidx[0].references[0].subsegmentDuration, 92160)
|
||||
XCTAssertEqual(sidx[0].references[0].startsWithSap, true)
|
||||
XCTAssertEqual(sidx[0].references[0].sapType, 0)
|
||||
XCTAssertEqual(sidx[0].references[0].sapDeltaTime, 0)
|
||||
XCTAssertEqual(sidx[1].referenceID, 2)
|
||||
XCTAssertEqual(sidx[1].timescale, 48000)
|
||||
XCTAssertEqual(sidx[1].earliestPresentationTime, 0)
|
||||
XCTAssertEqual(sidx[1].firstOffset, 0)
|
||||
|
||||
let mfhd = file.getBoxes(by: .mfhd)
|
||||
XCTAssertEqual(mfhd[0].sequenceNumber, 1)
|
||||
|
||||
let tfhd = file.getBoxes(by: .tfhd)
|
||||
XCTAssertEqual(tfhd[0].flags, 131128)
|
||||
XCTAssertEqual(tfhd[0].trackId, 1)
|
||||
XCTAssertEqual(tfhd[0].baseDataOffset, nil)
|
||||
XCTAssertEqual(tfhd[0].sampleDescriptionIndex, nil)
|
||||
XCTAssertEqual(tfhd[0].defaultSampleDuration, 1024)
|
||||
XCTAssertEqual(tfhd[0].defaultSampleSize, 22696)
|
||||
XCTAssertEqual(tfhd[0].defaultSampleFlags, 16842752)
|
||||
|
||||
let tfdt = file.getBoxes(by: .tfdt)
|
||||
XCTAssertEqual(tfdt[0].version, 1)
|
||||
XCTAssertEqual(tfdt[0].baseMediaDecodeTime, 0)
|
||||
XCTAssertEqual(tfdt[1].version, 1)
|
||||
XCTAssertEqual(tfdt[1].baseMediaDecodeTime, 0)
|
||||
|
||||
let _ = file.getBoxes(by: .trun)
|
||||
}
|
||||
|
||||
private func makeInitMP4File() -> MP4FileReader {
|
||||
let bundle = Bundle(for: type(of: self))
|
||||
let url = URL(fileURLWithPath: bundle.path(forResource: "SampleVideo_360x240_5mb@m4v/init", ofType: "mp4")!)
|
||||
return try! MP4FileReader(forReadingFrom: url).execute()
|
||||
}
|
||||
|
||||
private func makeFMP4File() -> MP4FileReader {
|
||||
let bundle = Bundle(for: type(of: self))
|
||||
let url = URL(fileURLWithPath: bundle.path(forResource: "SampleVideo_360x240_5mb@m4v/0", ofType: "m4s")!)
|
||||
return try! MP4FileReader(forReadingFrom: url).execute()
|
||||
}
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
import Foundation
|
||||
import XCTest
|
||||
|
||||
@testable import HaishinKit
|
||||
|
||||
final class MP4UtilTests: XCTestCase {
|
||||
func testString() {
|
||||
XCTAssertEqual("msdh", MP4Util.string(1836278888))
|
||||
}
|
||||
|
||||
func testUInt32() {
|
||||
XCTAssertEqual(1836278888, MP4Util.uint32("msdh"))
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue