Skip to content

Commit

Permalink
Add VideoFrameBufferInit.transfer
Browse files Browse the repository at this point in the history
  • Loading branch information
Djuffin committed May 18, 2023
1 parent 3a96dbd commit 050ec9d
Showing 1 changed file with 44 additions and 29 deletions.
73 changes: 44 additions & 29 deletions index.src.html
Original file line number Diff line number Diff line change
Expand Up @@ -3277,6 +3277,8 @@
[EnforceRange] unsigned long displayHeight;

VideoColorSpaceInit colorSpace;

sequence<ArrayBuffer> transfer = [];
};

dictionary VideoFrameMetadata {
Expand Down Expand Up @@ -3415,29 +3417,39 @@
VideoFrame(data, init)
</dfn>
1. If |init| is not a [=valid VideoFrameBufferInit=], throw a {{TypeError}}.
2. Let |defaultRect| be «[ "x:" → `0`, "y" → `0`,
1. Let |defaultRect| be «[ "x:" → `0`, "y" → `0`,
"width" → |init|.{{VideoFrameBufferInit/codedWidth}}, "height" →
|init|.{{VideoFrameBufferInit/codedWidth}} ]».
3. Let |overrideRect| be `undefined`.
4. If |init|.{{VideoFrameBufferInit/visibleRect}} [=map/exists=], assign its
1. Let |overrideRect| be `undefined`.
1. If |init|.{{VideoFrameBufferInit/visibleRect}} [=map/exists=], assign its
value to |overrideRect|.
4. Let |parsedRect| be the result of running the [=VideoFrame/Parse Visible
1. Let |parsedRect| be the result of running the [=VideoFrame/Parse Visible
Rect=] algorithm with |defaultRect|, |overrideRect|,
|init|.{{VideoFrameBufferInit/codedWidth}},
|init|.{{VideoFrameBufferInit/codedHeight}}, and
|init|.{{VideoFrameBufferInit/format}}.
5. If |parsedRect| is an exception, return |parsedRect|.
6. Let |optLayout| be `undefined`.
7. If |options|.{{VideoFrameBufferInit/layout}} [=map/exists=], assign its value
1. If |parsedRect| is an exception, return |parsedRect|.
1. Let |optLayout| be `undefined`.
1. If |options|.{{VideoFrameBufferInit/layout}} [=map/exists=], assign its value
to |optLayout|.
8. Let |combinedLayout| be the result of running the [=VideoFrame/Compute
1. Let |combinedLayout| be the result of running the [=VideoFrame/Compute
Layout and Allocation Size=] algorithm with |parsedRect|,
|init|.{{VideoFrameBufferInit/format}}, and |optLayout|.
9. If |combinedLayout| is an exception, throw |combinedLayout|.
10. If `data.byteLength` is less than |combinedLayout|’s
1. If |combinedLayout| is an exception, throw |combinedLayout|.
1. If `data.byteLength` is less than |combinedLayout|’s
[=combined buffer layout/allocationSize=], throw a {{TypeError}}.
11. Let |resource| be a new [=media resource=] containing a copy of |data|. Use
{{VideoFrameBufferInit/visibleRect}} and {{VideoFrameBufferInit/layout}}
1. For each |transferable| in |init|.{{VideoFrameBufferInit/transfer}}:
1. If {{platform object/[[Detached]]}} internal slot is `true`,
then throw a {{DataCloneError}} {{DOMException}}.
1. If |init|.{{VideoFrameBufferInit/transfer}} contains an ArrayBuffer referenced
by |data|:
1. Let |resource| be a new [=media resource=] referencing pixels in |data|
without a copy.
Use {{VideoFrameBufferInit/visibleRect}} and {{VideoFrameBufferInit/layout}}
to determine where in |data| the pixels for each plane reside.
1. Otherwise:
1. Let |resource| be a new [=media resource=] containing a copy of |data|.
Use {{VideoFrameBufferInit/visibleRect}} and {{VideoFrameBufferInit/layout}}
to determine where in |data| the pixels for each plane reside.

The User Agent <em class="rfc2119">MAY</em> choose to allocate
Expand All @@ -3449,55 +3461,58 @@
reposition the visible rectangle within |resource|. The final position
will be reflected by {{VideoFrame/visibleRect}}.

12. Let |resourceCodedWidth| be the coded width of |resource|.
13. Let |resourceCodedHeight| be the coded height of |resource|.
14. Let |resourceVisibleLeft| be the left offset for the visible rectangle of
1. For each |transferable| in |init|.{{VideoFrameBufferInit/transfer}}:
1. Perform [DetachArrayBuffer](https://tc39.es/ecma262/#sec-detacharraybuffer)
on |transferable|
1. Let |resourceCodedWidth| be the coded width of |resource|.
1. Let |resourceCodedHeight| be the coded height of |resource|.
1. Let |resourceVisibleLeft| be the left offset for the visible rectangle of
|resource|.
15. Let |resourceVisibleTop| be the top offset for the visible rectangle of
1. Let |resourceVisibleTop| be the top offset for the visible rectangle of
|resource|.

ISSUE: The spec <em class="rfc2119">SHOULD</em> provide definitions (and
possibly diagrams) for coded size, visible rectangle, and display size.
See [#166](https://github.com/w3c/webcodecs/issues/166).

16. Let |frame| be a new {{VideoFrame}} object initialized as follows:
1. Let |frame| be a new {{VideoFrame}} object initialized as follows:
1. Assign |resourceCodedWidth|, |resourceCodedHeight|,
|resourceVisibleLeft|, and |resourceVisibleTop| to
{{VideoFrame/[[coded width]]}}, {{VideoFrame/[[coded height]]}},
{{VideoFrame/[[visible left]]}}, and {{VideoFrame/[[visible top]]}}
respectively.
2. If |init|.{{VideoFrameBufferInit/visibleRect}} [=map/exists=]:
1. If |init|.{{VideoFrameBufferInit/visibleRect}} [=map/exists=]:
1. Let |truncatedVisibleWidth| be the value of
{{VideoFrameBufferInit/visibleRect}}.{{DOMRectInit/width}} after
truncating.
1. Assign |truncatedVisibleWidth| to {{VideoFrame/[[visible width]]}}.
3. Let |truncatedVisibleHeight| be the value of
1. Let |truncatedVisibleHeight| be the value of
{{VideoFrameBufferInit/visibleRect}}.{{DOMRectInit/height}} after
truncating.
2. Assign |truncatedVisibleHeight| to {{VideoFrame/[[visible height]]}}.
3. Otherwise:
1. Assign |truncatedVisibleHeight| to {{VideoFrame/[[visible height]]}}.
1. Otherwise:
1. Assign {{VideoFrame/[[coded width]]}} to
{{VideoFrame/[[visible width]]}}.
2. Assign {{VideoFrame/[[coded height]]}} to
{{VideoFrame/[[visible height]]}}.
4. If |init|.{{VideoFrameBufferInit/displayWidth}} [=map/exists=], assign
1. If |init|.{{VideoFrameBufferInit/displayWidth}} [=map/exists=], assign
it to {{VideoFrame/[[display width]]}}. Otherwise, assign
{{VideoFrame/[[visible width]]}} to {{VideoFrame/[[display width]]}}.
5. If |init|.{{VideoFrameBufferInit/displayHeight}} [=map/exists=], assign
1. If |init|.{{VideoFrameBufferInit/displayHeight}} [=map/exists=], assign
it to {{VideoFrame/[[display height]]}}. Otherwise, assign
{{VideoFrame/[[visible height]]}} to {{VideoFrame/[[display height]]}}.
6. Assign |init|'s {{VideoFrameBufferInit/timestamp}} and
1. Assign |init|'s {{VideoFrameBufferInit/timestamp}} and
{{VideoFrameBufferInit/duration}} to {{VideoFrame/[[timestamp]]}} and
{{VideoFrame/[[duration]]}} respectively.
7. Let |colorSpace| be `undefined`.
8. If |init|.{{VideoFrameBufferInit/colorSpace}} [=map/exists=], assign its
1. Let |colorSpace| be `undefined`.
1. If |init|.{{VideoFrameBufferInit/colorSpace}} [=map/exists=], assign its
value to |colorSpace|.
9. Assign the result of running the [=VideoFrame/Pick Color Space=]
1. Assign the result of running the [=VideoFrame/Pick Color Space=]
algorithm, with |colorSpace| and {{VideoFrame/[[format]]}}, to
{{VideoFrame/[[color space]]}}.
10. Assign the result of calling [=Copy VideoFrame metadata=]
1. Assign the result of calling [=Copy VideoFrame metadata=]
with |init|'s {{VideoFrameInit/metadata}} to |frame|.{{VideoFrame/[[metadata]]}}.
17. Return |frame|.
1. Return |frame|.

### Attributes ###{#videoframe-attributes}
: <dfn attribute for=VideoFrame>format</dfn>
Expand Down

0 comments on commit 050ec9d

Please sign in to comment.