@@ -130,4 +130,72 @@ - (void)testDidOutputSampleBufferIgnoreAudioSamplesBeforeVideoSamples {
130
130
CFRelease (audioSample);
131
131
}
132
132
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
+
133
201
@end
0 commit comments