Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(592)

Unified Diff: third_party/WebKit/Source/modules/imagecapture/README.md

Issue 2866593002: Image Capture: Add README.md file to WebKit/ folder (Closed)
Patch Set: more mustard Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/modules/imagecapture/README.md
diff --git a/third_party/WebKit/Source/modules/imagecapture/README.md b/third_party/WebKit/Source/modules/imagecapture/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..f07b9f674e74c2cb82af367ddbd091850e7d55cd
--- /dev/null
+++ b/third_party/WebKit/Source/modules/imagecapture/README.md
@@ -0,0 +1,91 @@
+# Image Capture API
+
+This folder contains the implementation of the [W3C Image Capture API](https://w3c.github.io/mediacapture-image/). Image Capture was shipped in Chrome M59; please consult the [Implementation Status](https://github.com/w3c/mediacapture-image/blob/master/implementation-status.md) if you think a feature should be available and isn't.
+
+This API is structured around the [ImageCapture class](https://w3c.github.io/mediacapture-image/#imagecaptureapi) _and_ a number of [extensions](https://w3c.github.io/mediacapture-image/#extensions) to the `MediaStreamTrack` feeding it (let's call them `theImageCapturer` and `theTrack`, respectively).
+
+## API Mechanics
+
+### `takePhoto()` and `grabFrame()`
+
+- `takePhoto()` returns the result of a single photographic exposure as a `Blob` which can be downloaded, stored by the browser or displayed in an `img` element. This method uses the highest available photographic camera resolution.
+
+- `grabFrame()` returns a snapshot of the live video in `theTrack` as an `ImageBitmap` object which could (for example) be drawn on a `canvas` and then post-processed to selectively change color values. Note that the `ImageBitmap` will only have the resolution of the video track — which will generally be lower than the camera's still-image resolution.
+
+(_Adapted from the [Origin Trials Web Update post](https://developers.google.com/web/updates/2016/12/imagecapture)_)
+
+### Photo settings and capabilities
+
+The photo-specific options and settings are associated to `theImageCapturer` or `theTrack` depending on whether a given capability/setting has an immediately recognisable effect on `theTrack`, in other words if it's "live" or not. For example, changing the zoom level is instantly reflected on the `theTrack`, while connecting the Red Eye Reduction, if available, is not.
+
+ Object | type | retrieved by... |
+ :--| :-- | --: |
+[`PhotoCapabilities`](https://w3c.github.io/mediacapture-image/##photocapabilities-section) | non-live capabilities | `theImageCapturer.getPhotoCapabilities()` |
+[`MediaTrackCapabilities`](https://w3c.github.io/mediacapture-image/#mediatrackcapabilities-section) | live capabilities | `theTrack.getCapabilities()` |
+| | |
+[`PhotoSettings`](https://w3c.github.io/mediacapture-image/##photocapabilities-section) | non-live settings | |
+[`MediaTrackSettings`](https://w3c.github.io/mediacapture-image/#mediatracksettings-section) | live settings | `theTrack.getSettings()` |
+
+## Other topics
+
+### Are `takePhoto()` and `grabFrame()` the same?
+
+These methods would not produce the same results as explained in [this issue comment](https://bugs.chromium.org/p/chromium/issues/detail?id=655107#c8):
+
+
+> Let me reconstruct the conversion steps each image goes through in CrOs/Linux;
+> [...]
+>
+> a) Live video capture produces frames via `V4L2CaptureDelegate::DoCapture()` [1].
+> The original data (from the WebCam) comes in either YUY2 (a 4:2:2 format) or
+> MJPEG, depending if the capture is smaller than 1280x720p or not, respectively.
+
+> b) This `V4L2CaptureDelegate` sends the capture frame to a conversion stage to
+> I420 [2]. I420 is a 4:2:0 format, so it has lost some information
+> irretrievably. This I420 format is the one used for transporting video frames
+> to the rendered.
+
+> c) This I420 is the input to `grabFrame()`, which produces a JS ImageBitmap,
+> unencoded, after converting the I420 into RGBA [3] of the appropriate endian-ness.
+
+> What happens to `takePhoto()`? It takes the data from the Webcam in a) and
+> either returns a JPEG Blob [4] or converts the YUY2 [5] and encodes it to PNG
+> using the default compression value (6 in a 0-10 scale IIRC) [6].
+
+> IOW:
+
+```
+ - for smaller video resolutions:
+
+ OS -> YUY2 ---> I420 --> RGBA --> ImageBitmap grabFrame()
+ |
+ +--> RGBA --> PNG ---> Blob takePhoto()
+
+ - and for larger video resolutions:
+
+ OS -> MJPEG ---> I420 --> RGBA --> ImageBitmap grabFrame()
+ |
+ +--> JPG ------------> Blob takePhoto()
+```
+
+
+> Where every conversion to-I420 loses information and so does the encoding to
+> PNG. Even a conversion `RGBA --> I420 --> RGBA` would not produce the original
+> image. (Plus, when you show `ImageBitmap` and/or Blob on an `<img>` or `<canvas>`
+> there are more stages of decoding and even colour correction involved!)
+
+> With all that, I'm not surprised at all that the images are not pixel
+> accurate! :-)
+
+
+### Why are `PhotoCapabilities.fillLightMode` and `MediaTrackCapabilities.torch` separated?
+
+Because they are different things: `torch` means flash constantly on/off whereas `fillLightMode` means flash always-on/always-off/auto _when taking a photographic exposure_.
+
+`torch` lives in `theTrack` because the effect can be seen "live" on it, whereas `fillLightMode` lives in `theImageCapture` object because the effect of modifying it can only be seen after taking a picture.
+
+
+
+## Testing
+
+Sensors layout tests are located in [`LayoutTests/imagecapture`](https://chromium.googlesource.com/chromium/src/+/master/third_party/WebKit/LayoutTests/imagecapture/), [`LayoutTests/fast/imagecapture`](https://chromium.googlesource.com/chromium/src/+/master/third_party/WebKit/LayoutTests/fast/imagecapture/) and [`LayoutTests/external/mediacapture-image`](https://chromium.googlesource.com/chromium/src/+/master/third_party/WebKit/LayoutTests/external/wpt/mediacapture-image/).
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698