avfvideosrc: sort caps with the highest resolution first
authorAndoni Morales Alastruey <ylatuya@gmail.com>
Wed, 6 Nov 2013 17:49:35 +0000 (18:49 +0100)
committerAndoni Morales Alastruey <ylatuya@gmail.com>
Thu, 7 Nov 2013 14:24:28 +0000 (15:24 +0100)
When started without any caps filter we prefer the highest
supported resolution.

sys/applemedia/avfvideosrc.m

index 7f7e705..8671f4f 100644 (file)
@@ -345,7 +345,7 @@ didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
   NSArray *formats = [device valueForKey:@"formats"];
   NSArray *pixel_formats = output.availableVideoCVPixelFormatTypes;
 
-  for (AVCaptureDeviceFormat *f in formats) {
+  for (AVCaptureDeviceFormat *f in [formats reverseObjectEnumerator]) {
     CMFormatDescriptionRef formatDescription = f.formatDescription;
     CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(formatDescription);
 
@@ -422,20 +422,20 @@ didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
     if (gst_format == GST_VIDEO_FORMAT_UNKNOWN)
       continue;
 
-    if ([session canSetSessionPreset:AVCaptureSessionPresetLow])
-      gst_caps_append (result, GST_AVF_CAPS_NEW (gst_format, 192, 144, DEVICE_FPS_N, DEVICE_FPS_D));
-    if ([session canSetSessionPreset:AVCaptureSessionPreset352x288])
-      gst_caps_append (result, GST_AVF_CAPS_NEW (gst_format, 352, 288, DEVICE_FPS_N, DEVICE_FPS_D));
-    if ([session canSetSessionPreset:AVCaptureSessionPresetMedium])
-      gst_caps_append (result, GST_AVF_CAPS_NEW (gst_format, 480, 360, DEVICE_FPS_N, DEVICE_FPS_D));
-    if ([session canSetSessionPreset:AVCaptureSessionPreset640x480])
-      gst_caps_append (result, GST_AVF_CAPS_NEW (gst_format, 640, 480, DEVICE_FPS_N, DEVICE_FPS_D));
-    if ([session canSetSessionPreset:AVCaptureSessionPreset1280x720])
-      gst_caps_append (result, GST_AVF_CAPS_NEW (gst_format, 1280, 720, DEVICE_FPS_N, DEVICE_FPS_D));
 #if HAVE_IOS
     if ([session canSetSessionPreset:AVCaptureSessionPreset1920x1080])
       gst_caps_append (result, GST_AVF_CAPS_NEW (gst_format, 1920, 1080, DEVICE_FPS_N, DEVICE_FPS_D));
 #endif
+    if ([session canSetSessionPreset:AVCaptureSessionPreset1280x720])
+      gst_caps_append (result, GST_AVF_CAPS_NEW (gst_format, 1280, 720, DEVICE_FPS_N, DEVICE_FPS_D));
+    if ([session canSetSessionPreset:AVCaptureSessionPreset640x480])
+      gst_caps_append (result, GST_AVF_CAPS_NEW (gst_format, 640, 480, DEVICE_FPS_N, DEVICE_FPS_D));
+    if ([session canSetSessionPreset:AVCaptureSessionPresetMedium])
+      gst_caps_append (result, GST_AVF_CAPS_NEW (gst_format, 480, 360, DEVICE_FPS_N, DEVICE_FPS_D));
+    if ([session canSetSessionPreset:AVCaptureSessionPreset352x288])
+      gst_caps_append (result, GST_AVF_CAPS_NEW (gst_format, 352, 288, DEVICE_FPS_N, DEVICE_FPS_D));
+    if ([session canSetSessionPreset:AVCaptureSessionPresetLow])
+      gst_caps_append (result, GST_AVF_CAPS_NEW (gst_format, 192, 144, DEVICE_FPS_N, DEVICE_FPS_D));
   }
   return YES;
 }