O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

Android 5.0 Camera2 APIs

22.558 visualizações

Publicada em

Android Lollipop was released with new Camera2 APIs. This talk was delivered at the Samsung Developer's Conference 2014 showing how to use it and how it enables new use cases

Publicada em: Tecnologia
  • Entre para ver os comentários

Android 5.0 Camera2 APIs

  1. 1. Camera 2 APIs Computational Photography Enablers Balwinder Kaur Senior Member, Technical Staff ON Semiconductor © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  2. 2. Tools of the Trade 2 © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  3. 3. Agenda • The Basic Idea • Enabling New Experiences • Camera2 Architecture • Camera2 APIs – Ready. Set. Go! • The Other Use Cases • The Devil is in the Details • Play Store Filters • Summary 3 © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  4. 4. The Basic Idea Limitations of Existing Camera APIs © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  5. 5. Limitations of android.hardware.Camera 5 3 Primary Operating Modes • Preview, Capture & Video Recording New Features – hard to implement • Burst mode photography • Zero Shutter Lag, Multi-Shot HDR, Panoramic Stitch No Support for RAW • Most products returned null for the raw callback Minimal Metadata • Support for face detection dataa http://source.android.com/devices/camera/camera.html No Per-Frame Control • Not Possible Primitive Custom Settings • Through Camera.Parameters class but no guarantees when the settings would go into effect © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  6. 6. Enabling New Experiences © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  7. 7. Camera2 API Enables - 7 Point and Click Camera Professional Camera Professional Camera + Post Processing on-device Innovative Mobile Camera ++ © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  8. 8. Features and Requirements 8 Point and Click •Preview •Still •Video Recording Professional Camera •Fine Grained Control of Lens, Sensor, Flash •RAW Sensor Output with capture metadata Computational Photography •Individual Frame Control •Algorithms & Compute Power •HDR, Focus Stacking, Exposure Bracketing Innovative Mobile Cameras •Sensors •Location •Connectivity/Cloud Power •Compute Power © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  9. 9. android.hardware.camera2 • Enables Professional Quality Photography • Enables Access to RAW Images • Enables On-device processing of Camera Data • Enables New Use Cases combining Imaging with 9 – Think DSLR instead of Point-and-Shoot – High Dynamic Range, Focus Stacking – Rich Sensor input • Inertial sensors, altitude et. al. – Compute Power • Multi-core CPU & GPU – Connectivity • Power of the Cloud & Access to Proximity (BLE, NFC) – Context • Location & User History Major Limitation- Optics DSLR++ ? Computational Photography © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  10. 10. Professional Quality Photography • Fine grained control of the – Sensor – Flash – Lens – Image Signal Processing Pipeline • Control on a per-frame basis, and deterministic behavior • Processing Images at full resolution and full frame rate(30 fps) • Meta data 10 Professional Camera – Every frame is returned with the actual settings that it was taken with, and requested for. © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  11. 11. Computational Photography Definition Professional Camera + Post Processing on-device • Computational photography refers to computational image capture, processing, and manipulation techniques that enhance or extend the capabilities of digital photography. 11 Source: Wikipedia © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  12. 12. Multi Shot HDR Computational Photography • HDR = High Dynamic Range • Multiple shots at different exposures and then blended together 12 © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  13. 13. Panoramic Stitching 13 Multiple Images with orientation information and fixed Exposure Source: commons.wikimedia.org Computational Photography © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  14. 14. Flash No-Flash Photography Source: Microsoft Research 14 Computational Photography © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  15. 15. Flash No-Flash Photography Source: Microsoft Research 15 Computational Photography • Take 2 shots of the scene– one with flash on, the other with flash off • Computationally blend the 2 frames together © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  16. 16. Focus Stacking Focus Stacking for macro photography. Also known as – all-in-focus photography Source: Wikipedia 16 Computational Photography © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  17. 17. View Finder • Today’s smartphones enable features like • Computational Photography can take it to the next level 17 – Touch to Expose & Touch to Focus – Edit the frame in the view Computational Photography finder by selecting areas to sharpen, blur, brighten and maintain these during capture mode Source: SIGGRAPH 2012 Android L Sample HdrViewFinder demonstrates a similar concept © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  18. 18. Mobile Embedded Vision Applications • Gesture Recognition • Face Recognition, Object Tracking • Visual Search • 3D Mapping of the environment • Augmented Reality 18 Natural User Interface Companies are using the Front Facing Camera to provide gesture recognition solutions. © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  19. 19. Innovative Mobile Camera ++ 19 Cloud Computing On-Device Compute Power Sensors Fine Grained Control You Lens, Sensor, Flash Location User History User Preferences © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  20. 20. Camera2 Architecture © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  21. 21. Limitations of android.hardware.Camera 21 3 Primary Operating Modes New Features – hard to implement No Per-Frame Control No Support for RAW Minimal Metadata Custom Settings http://source.android.com/devices/camera/camera.html © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  22. 22. Camera2 Core Operation Model • Per Frame Settings • The Settings travel with individual requests and are no longer globally applied • Image buffer delivered to all configured and requested Surfaces • Metadata returned back to the application as requested separately • Multiple requests and results in queue simultaneously http://source.android.com/devices/camera/camera.html 22 © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  23. 23. Camera3 HAL Model 23 http://source.android.com/devices/camera/camera.html © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  24. 24. The Camera APIs © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  25. 25. Android Lollipop Camera related classes and interfaces from android.hardware deprecated 2 new packages 25 android.hardware.camera2 android.hardware.camera2.params 25+ classes, 1 Exception © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  26. 26. Camera Model From the Javadoc “This package models a camera device as a pipeline, which takes in input requests for capturing a single frame, captures the single image per the request, and then outputs one capture result metadata packet, plus a set of output image buffers for the request. The requests are processed in-order, and multiple requests can be in flight at once. Since the camera device is a pipeline with multiple stages, having multiple requests in flight is required to maintain full frame-rate on most Android devices.” 26 © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  27. 27. API walk through for primary use cases Live Preview 27 Still Capture (JPG) Still Capture (RAW/DNG) Still Capture (Burst) Video Recording © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  28. 28. Ready. Set. Go! Figure out what’s available © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  29. 29. Concepts and Terms from Camera 2 • Camera Device • Streams • Capture Session • Target Surfaces 29 It’s a paradigm s h i f t ! • Capture Request • Capture Result – Image Data – Metadata – Total Capture Result © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  30. 30. 1. How many Cameras do I have? Query the System for capabilities CameraManager provides information on the number of available cameras, or CameraDevices. CameraManager manager = String[] camids = manager.getCameraIdList(); 30 (CameraManager) getSystemService(Context.CAMERA_SERVICE); © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  31. 31. 2. What kind of a CameraDevice is it? CameraCharacteristics provide static metadata for a given CameraDevice. This information is immutable for a given camera. CameraCharacteristics characteristics = CameraCharacteristics Keys 3 Classes of Cameras are supported 31 manager.getCameraCharacteristics(camid); INFO_SUPPORTED_HARDWARE_LEVEL Additionally, RAW may be supported ① FULL + RAW ② LIMITED + RAW LEGACY LIMITED FULL © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  32. 32. 3. How many maximum streams does the system support? 3 Classes of Streams ①Processed & Non-Stalling ②Processed & Stalling ③RAW (Bayer Domain) The Maximum Number of Streams = REQUEST_MAX_NUM_OUTPUT_PROC1 + REQUEST_MAX_NUM_OUTPUT_PROC_STALLING1 + REQUEST_MAX_NUM_OUTPUT_RAW1 FULL >=3 >=1 >=0 LIMITED >=2 >=1 >=0 LEGACY >=2 >=1 0 32 PROCESSED & NON_STALLING (like YUV) PROCESSED & STALLING (like JPEG) RAW 1 CameraCharacteristics.Key © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  33. 33. Guaranteed Stream Configurations - LEGACY Type Max Size Type Max Size Type Max Size PRIV1 Maximum2 JPEG Maximum YUV Maximum PRIV Preview JPEG Maximum YUV Preview JPEG Maximum PRIV Preview PRIV Preview PRIV Preview YUV Preview PRIV Preview YUV Preview JPEG Maximum 33 Target 1 Target 2 Target 3 Still capture plus in-app processing. 1 Device Opaque Format, No Visibility into Format for Application 2 Device Maximum Sensor Output © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  34. 34. Guaranteed Stream Configurations - LIMITED 34 Target 1 Target 2 Target 3 Type Max Size Type Max Size Type Max Size PRIV Preview PRIV Record 1 PRIV Preview YUV Record YUV Preview YUV Record PRIV Preview PRIV Record JPEG Record PRIV Preview YUV Record JPEG Record YUV Preview YUV Preview JPEG Maximum 1 Maximum resolution supported by the device for media recording © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  35. 35. Guaranteed Stream Configurations - FULL 35 Target 1 Target 2 Target 3 Type Max Size Type Max Size Type Max Size PRIV Preview PRIV Maximum PRIV Preview YUV Maximum YUV Preview YUV Maximum PRIV Preview PRIV Preview JPEG Maximum YUV 640x480 PRIV Preview YUV Maximum YUV 640x480 YUV Preview YUV Maximum © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  36. 36. Guaranteed Stream Configurations - RAW 36 Target 1 Target 2 Target 3 Type Max Size Type Max Size Type Max Size RAW Maximum PRIV Preview RAW Maximum YUV Preview RAW Maximum PRIV Preview PRIV Preview RAW Maximum PRIV Preview YUV Preview RAW Maximum YUV In-Preview app processing YUV with simultaneous Preview JPEG RAW and DNG. Maximum PRIV Preview JPEG Maximum RAW Maximum YUV Preview JPEG Maximum RAW Maximum © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  37. 37. 4. How can these streams be configured? CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId); StreamConfigurationMap configs = characteristics.get( StreamConfigurationMap provides information on • Supported Stalling and Non-Stalling Image Formats • Supported Image Sizes for Supported Image Formats • Supported Video Sizes and fps(frames per Second) Speeds • Minimum Frame Duration and Stall Duration for supported formats and sizes • Determine whether a given Surface is supported by this CameraDevice or not 37 CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  38. 38. FULL Camera Devices sensor max resolution more than 20fps is required 38 30 FPS at Per Frame Control android.sync.maxLatency PER_FRAME_CONTROL Manual Sensor Control Manual Post Processing Control android.request.availableCapabilities Arbitrary Cropping Region android.scaler.croppingType == FREEFORM Minimum 3 Processed Non-Stalling Output Streams (think YUV) Stream Configurations Available as a Configuration Map © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  39. 39. LIMITED and LEGACY Camera Device LEGACY •NO Per- Frame Control •NO Manual Sensor Control •NO Manual Post Processing • NO Arbitrary Cropping Regions •No Stringent Performance Constraints •Not a candidate for a Superior Camera Experience 39 LIMITED • Query for individual capabilities! That’s a lot of checks! LEGACY LIMITED FULL ① FULL + RAW ② LIMITED + RAW © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  40. 40. Ready. Set. Go! Open the Camera © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  41. 41. 1. Open a Full Camera Device ① Use the instance of the CameraManager to open a Camera passing ② Get a handle to a CameraDevice via the 41 in its camera id. CameraDevice.StateCallback method when it is successfully opened. CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback () { …}; manager.openCamera(camid, mStateCallback, ..); © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  42. 42. 2. Create a Capture Session • Expensive Operation Minimize calls to createCaptureSession CameraCaptureSession.StateCallback mCaptureCallback= new CameraCaptureSession.StateCallback () {...}; List<Surface> outputs = new ArrayList<Surface>(...); createCaptureSession (outputs, mCaptureCallback, ...); // a handle to a capture session in mCaptureCallback method 42 – Involves allocation of buffers beneath the HAL –May take up to several hundred milliseconds •All modes cannot be supported concurrently –so Sessions may have to be torn down and setup again. Failure to create a capture session may result in exceptions being thrown © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  43. 43. Different Target Output Streams 43 © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  44. 44. 3. Create a Capture Request ① Pick the Capture Request Template CaptureRequest.Builder mPreviewBuilder = mCameraDevice .createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 44 o TEMPLATE_PREVIEW o TEMPLATE_STILL_CAPTURE o TEMPLATE_VIDEO_SNAPSHOT o TEMPLATE_RECORD o TEMPLATE_MANUAL © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  45. 45. 3. Create a Capture Request – contd. ② Pick an appropriate target output o e.g. TextureView for the correct width/height for Preview mPreviewBuilder.addTarget(mPreviewSurface); //where mPreviewSurface is a Surface initialized to the width and height of the Preview Desired ③ Pick the Frequency of the Capture Request o capture o captureBurst o setRepeatingRequest o setRepeatingBurst o stopRepeating o abortCaptures() 45 © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  46. 46. Ready. Set. Go! Get your pictures © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  47. 47. Receiving Image and Metadata mSession.setRepeatingRequest(mPreviewBuilder.build(), listener,backgroundHandler); • The Image data is typically received in a listener associated with the Output Surface. • The Metadata is received in the onCaptureCompleted callback method of CameraCaptureSession.CaptureCallback via the TotalCaptureResult object. 47 How does the metadata tie to the correct image data frame? Through the Time Stamp! CaptureResult.SENSOR_TIMESTAMP & image.getTimestamp() © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  48. 48. The Other Use Cases © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  49. 49. Still Capture - JPEG ①Use TEMPLATE_STILL_CAPTURE for the CaptureRequest ②Create an ImageReader object with format == ③Pick CameraCaptureSession.capture for the frequency of ④Image Data is received in the ⑤Metadata is received in the 49 ImageFormat.JPEG capture ImageReader.onImageAvailableListener CameraCaptureSession.CaptureCallback. onCaptureCompleted callback © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  50. 50. Still Capture - RAW ① Use TEMPLATE_STILL_CAPTURE for the CaptureRequest ② Create an ImageReader object with format == ImageFormat. ③ Pick CameraCaptureSession.capture for the frequency of capture ④ Image Data is received in the ImageReader.onImageAvailableListener ⑤ Metadata is received in the ⑥ Use an instance of DngCreator to convert RAW to DNG (Digital Negative) 50 ImageFormat.RAW_SENSOR CameraCaptureSession.CaptureCallback.onCaptureCompleted callback final File dngFile = new File(path, filename); outs = new FileOutputStream(dngFile); if (mRawTotalResult != null) { DngCreator d = new DngCreator(characteristics, mRawTotalResult); d.writeImage(outs, image); } © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  51. 51. Still Capture - BURST ① Use TEMPLATE_STILL_CAPTURE for the CaptureRequest ② Create an ImageReader object with format == ImageFormat. ③ Pick CameraCaptureSession.captureBurst for the frequency of capture ④ Image Data is received in the ImageReader.onImageAvailableListener ⑤ Metadata is received in the CameraCaptureSession.CaptureCallback. 51 ImageFormat.JPEG onCaptureCompleted callback © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  52. 52. Video Recording ①Use TEMPLATE_RECORD for the CaptureRequest ②Create a MediaRecorder Object and use its surface ③Pick CameraCaptureSession.setRepeatingRequest ④Image Data is recorded in the Image file set via ⑤Metadata is received in the 52 as the output stream for the frequency of capture MediaRecorder.setOutputFile call. CameraCaptureSession.CaptureCallback. onCaptureCompleted callback © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  53. 53. In-App Processing of Camera Data ① Use an appropriate Template for the CaptureRequest; including ② Create an object like Allocation Renderscript, ImageReader (with ③ Pick an appropriate frequency for capture ④ Image Data can be found in an appropriate callback for the surface ⑤ Metadata is received in the CameraCaptureSession.CaptureCallback. 53 TEMPLATE_MANUAL if the use case so demands Format YUV_420_888), SurfaceTexture, or GLSurfaceView that provides a Surface chosen onCaptureCompleted callback © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  54. 54. Some use cases for In-App Processing 54 • Use Cases – Filters – Computational Photography Use cases – Custom Post Processing of the Imaging Pipeline – Computer Vision Applications • Uses – Compute Framework • Renderscript, OpenCL – Low level Graphics APIs • OpenGL ES © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  55. 55. And then there was Metadata… 55 CameraMetadata Controls CaptureRequest Information Static Metadata Fixed for a given CameraDevice CameraCharacteristics Dynamic Metadata Settings associated with each frame CaptureResult Key Value Pairs for Hardware Control (Lens, Sensor, Flash), Image Processing Pipeline, Control Algorithms and Output Buffers © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  56. 56. Fine Grained Control a.k.a “The Devil is in the Details” © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  57. 57. Manual Sensor Control 57 Sensor Sensitivity (Gain/ISO) Sensor Exposure Time Sensor Frame Duration Flash (if present) Flash Mode Lens (if adjustable) Lens Aperture Lens Filter Density Lens Focal Length Lens Focus Distance Black Level Lock Black Level Lock On/Off © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  58. 58. Manual 3A Control • A Camera Request can override the 3A Algorithm Controls – Auto Exposure (AE) – Auto Focus(AF) – Auto White Balance (AWB) • There is an overall control for all Auto Algorithms 58 android.control.mode – When set to OFF, application has full control of the pipeline – When set to AUTO, the individual controls are in effect © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  59. 59. Application Controlled (Auto) Algorithms Auto Focus android.control.mode= AUTO android.control.a*mode = OFF Auto Exposure • Application uses android.sensor.exposureTime, android.sensor.sensitivity Auto White Balance 59 • Application uses android.lens.focusDistance to control the Lens and android.sensor.frameDuration + android.flash.* to control exposure • Application uses android.colorCorrection.transform & android.colorCorrection.gains to control the white balance © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  60. 60. Manual Post Processing 60 http://source.android.com/devices/camera/camera.html © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  61. 61. Image Processing Pipeline Shading Mode (lens shading) 61 Hot Pixel Mode Black Level Correction Demosaic Noise Reduction Mode Color Correction Mode Tone Curve Adjustment Edge Enhancement © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  62. 62. Manual Post Processing 62 Manual Tonemap control • android.tonemap.* Manual White Balance control • android.colorCorrection.* Manual Lens Shading map control • android.shading.* Manual aberration correction control (if supported) • android.colorCorrection.aberration.* © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  63. 63. The other camera2 package android.hardware.camera2.params • BlackLevelPattern • ColorSpaceTransform • Face • LensShadingMap • MeteringRectangle • RggbChannelVector • StreamConfigurationMap • TonemapCurve 63 © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  64. 64. Play Store Feature Filters Android Manifest <uses-feature> © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  65. 65. Play Store Feature Filters • android.hardware.camera.hardware_level.full • android.hardware.camera.capability.raw • android.hardware.camera.capability.manual_sensor • android.hardware.camera.capability.manual_post_processing 65 See Also: Versioning © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  66. 66. Summary © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  67. 67. Cloud Computing Lens, Sensor, Flash 67 Its all about you and your power tools! On-Device Compute Power Sensors Fine Grained Control You Location User History User Preferences © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com
  68. 68. 68 Q&A and THANK YOU for your time. Balwinder Kaur balwinder dot x dot kaur at gmail dot com http://www.slideshare.net/lbk003 https://github.com/lbk003 © 2014 Samsung Developer Conference. All rights reserved. www.samsungdevcon.com

×