@@ -130,4 +130,72 @@ - (void)testDidOutputSampleBufferIgnoreAudioSamplesBeforeVideoSamples {
130130 CFRelease (audioSample);
131131}
132132
133+ - (void )testDidOutputSampleBufferSampleTimesMustBeNumericAfterPauseResume {
134+ FLTCam *cam = FLTCreateCamWithCaptureSessionQueue (dispatch_queue_create (" testing" , NULL ));
135+ CMSampleBufferRef videoSample = FLTCreateTestSampleBuffer ();
136+ CMSampleBufferRef audioSample = FLTCreateTestAudioSampleBuffer ();
137+
138+ id connectionMock = OCMClassMock ([AVCaptureConnection class ]);
139+
140+ id writerMock = OCMClassMock ([AVAssetWriter class ]);
141+ OCMStub ([writerMock alloc ]).andReturn (writerMock);
142+ OCMStub ([writerMock initWithURL: OCMOCK_ANY fileType: OCMOCK_ANY error: [OCMArg setTo: nil ]])
143+ .andReturn (writerMock);
144+ __block AVAssetWriterStatus status = AVAssetWriterStatusUnknown;
145+ OCMStub ([writerMock startWriting ]).andDo (^(NSInvocation *invocation) {
146+ status = AVAssetWriterStatusWriting;
147+ });
148+ OCMStub ([writerMock status ]).andDo (^(NSInvocation *invocation) {
149+ [invocation setReturnValue: &status];
150+ });
151+
152+ __block BOOL videoAppended = NO ;
153+ id adaptorMock = OCMClassMock ([AVAssetWriterInputPixelBufferAdaptor class ]);
154+ OCMStub ([adaptorMock assetWriterInputPixelBufferAdaptorWithAssetWriterInput: OCMOCK_ANY
155+ sourcePixelBufferAttributes: OCMOCK_ANY])
156+ .andReturn (adaptorMock);
157+ OCMStub ([adaptorMock appendPixelBuffer: [OCMArg anyPointer ] withPresentationTime: kCMTimeZero ])
158+ .ignoringNonObjectArgs ()
159+ .andDo (^(NSInvocation *invocation) {
160+ CMTime presentationTime;
161+ [invocation getArgument: &presentationTime atIndex: 3 ];
162+ XCTAssert (CMTIME_IS_NUMERIC (presentationTime));
163+ videoAppended = YES ;
164+ });
165+
166+ __block BOOL audioAppended = NO ;
167+ id inputMock = OCMClassMock ([AVAssetWriterInput class ]);
168+ OCMStub ([inputMock assetWriterInputWithMediaType: OCMOCK_ANY outputSettings: OCMOCK_ANY])
169+ .andReturn (inputMock);
170+ OCMStub ([inputMock isReadyForMoreMediaData ]).andReturn (YES );
171+ OCMStub ([inputMock appendSampleBuffer: [OCMArg anyPointer ]]).andDo (^(NSInvocation *invocation) {
172+ CMSampleBufferRef sampleBuffer;
173+ [invocation getArgument: &sampleBuffer atIndex: 2 ];
174+ CMTime sampleTime = CMSampleBufferGetPresentationTimeStamp (sampleBuffer);
175+ XCTAssert (CMTIME_IS_NUMERIC (sampleTime));
176+ audioAppended = YES ;
177+ });
178+
179+ [cam
180+ startVideoRecordingWithCompletion: ^(FlutterError *_Nullable error) {
181+ }
182+ messengerForStreaming: nil ];
183+
184+ [cam pauseVideoRecording ];
185+ [cam resumeVideoRecording ];
186+
187+ [cam captureOutput: cam.captureVideoOutput
188+ didOutputSampleBuffer: videoSample
189+ fromConnection: connectionMock];
190+ [cam captureOutput: nil didOutputSampleBuffer: audioSample fromConnection: connectionMock];
191+ [cam captureOutput: cam.captureVideoOutput
192+ didOutputSampleBuffer: videoSample
193+ fromConnection: connectionMock];
194+ [cam captureOutput: nil didOutputSampleBuffer: audioSample fromConnection: connectionMock];
195+ XCTAssert (videoAppended && audioAppended, @" Video or audio was not appended." );
196+
197+ CFRelease (videoSample);
198+ CFRelease (audioSample);
199+ }
200+
133201@end
0 commit comments