@@ -15,6 +15,8 @@ class AVAssetExtensions_Tests: XCTestCase {
1515 override func setUp( ) { }
1616 override func tearDown( ) { }
1717
18+ // MARK: - Start Elapsed Frames
19+
1820 func testReadStartElapsedFrames_23_976_A( ) throws {
1921 let url = try TestResource . timecodeTrack_23_976_Start_00_00_00_00. url ( )
2022 let asset = AVAsset ( url: url)
@@ -31,6 +33,8 @@ class AVAssetExtensions_Tests: XCTestCase {
3133 XCTAssertEqual ( startFrames, [ 84480 ] )
3234 }
3335
36+ // MARK: - Start/Duration/End Timecode
37+
3438 func testReadTimecodes_23_976fps( ) throws {
3539 let frameRate : TimecodeFrameRate = . _23_976
3640 let url = try TestResource . timecodeTrack_23_976_Start_00_58_40_00. url ( )
@@ -119,6 +123,8 @@ class AVAssetExtensions_Tests: XCTestCase {
119123 [ ] )
120124 }
121125
126+ // MARK: - TimecodeFrameRate
127+
122128 func testTimecodeFrameRate_23_976fps_A( ) throws {
123129 let url = try TestResource . timecodeTrack_23_976_Start_00_00_00_00. url ( )
124130 let asset = AVAsset ( url: url)
@@ -155,6 +161,62 @@ class AVAssetExtensions_Tests: XCTestCase {
155161 XCTAssertEqual ( asset. isTimecodeFrameRateDropFrame, false )
156162 XCTAssertEqual ( frameRate, . _29_97)
157163 }
164+
165+ func testTimecodeFrameRate_29_97fps_from2997i( ) throws {
166+ let url = try TestResource . videoAndTimecodeTrack_29_97i_Start_00_00_00_00. url ( )
167+ let asset = AVAsset ( url: url)
168+ let frameRate = try asset. timecodeFrameRate ( )
169+ XCTAssertEqual ( asset. isTimecodeFrameRateDropFrame, false )
170+ XCTAssertEqual ( frameRate, . _29_97)
171+ }
172+
173+ // MARK: - VideoFrameRate
174+
175+ /// Even though file has no video tracks, it infers video frame rate from the timecode track.
176+ func testVideoFrameRate_23_98p_A( ) throws {
177+ let url = try TestResource . timecodeTrack_23_976_Start_00_00_00_00. url ( )
178+ let asset = AVAsset ( url: url)
179+ let frameRate = try asset. videoFrameRate ( )
180+ XCTAssertEqual ( frameRate, . _23_98p)
181+ }
182+
183+ /// Even though file has no video tracks, it infers video frame rate from the timecode track.
184+ func testVideoFrameRate_23_98p_B( ) throws {
185+ let url = try TestResource . timecodeTrack_23_976_Start_00_58_40_00. url ( )
186+ let asset = AVAsset ( url: url)
187+ let frameRate = try asset. videoFrameRate ( )
188+ XCTAssertEqual ( frameRate, . _23_98p)
189+ }
190+
191+ /// Even though file has no video tracks, it infers video frame rate from the timecode track.
192+ func testVideoFrameRate_24p( ) throws {
193+ let url = try TestResource . timecodeTrack_24_Start_00_58_40_00. url ( )
194+ let asset = AVAsset ( url: url)
195+ let frameRate = try asset. videoFrameRate ( )
196+ XCTAssertEqual ( frameRate, . _24p)
197+ }
198+
199+ /// Even though file has no video tracks, it infers video frame rate from the timecode track.
200+ func testVideoFrameRate_29_97p_fromDrop( ) throws {
201+ let url = try TestResource . timecodeTrack_29_97d_Start_00_00_00_00. url ( )
202+ let asset = AVAsset ( url: url)
203+ let frameRate = try asset. videoFrameRate ( )
204+ XCTAssertEqual ( frameRate, . _29_97p)
205+ }
206+
207+ func testVideoFrameRate_29_97i( ) throws {
208+ let url = try TestResource . videoAndTimecodeTrack_29_97i_Start_00_00_00_00. url ( )
209+ let asset = AVAsset ( url: url)
210+ let frameRate = try asset. videoFrameRate ( )
211+ XCTAssertEqual ( frameRate, . _29_97i)
212+ }
213+
214+ func testVideoFrameRate_29_97p( ) throws {
215+ let url = try TestResource . videoTrack_29_97_Start_00_00_00_00. url ( )
216+ let asset = AVAsset ( url: url)
217+ let frameRate = try asset. videoFrameRate ( )
218+ XCTAssertEqual ( frameRate, . _29_97p)
219+ }
158220}
159221
160222#endif
0 commit comments