-
Notifications
You must be signed in to change notification settings - Fork 11
Flow profiles #130
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Flow profiles #130
Changes from all commits
0b0ab0a
b1150d3
d8680fe
2a686d6
c7a9347
3bb8bd0
117b99e
1e71dbd
3f1ccb7
e89aa37
6770a5d
f741890
d3a8c22
17e44f3
3d4f1f7
b6fc547
f7899bb
4211448
d43ee0a
7b4a58e
e5655fe
49ee246
7b51eb8
929f7ed
64946ae
bb1dba0
dc4992d
7491aa4
4b159d0
01de27b
a270b49
dd53166
b1b873c
980dd16
233221a
7af38cd
ed1a948
c9f13cd
d3c4668
27b7924
5437988
2aea1c5
d2cfef1
1eb6cdb
98bbece
05d3ce0
431234a
70f124a
02421dc
5f02623
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -146,6 +146,184 @@ paths: | |||||
| $ref: schemas/storage-backends-list.json | ||||||
| example: | ||||||
| $ref: examples/storage-backends-get-200.json | ||||||
| /service/profiles: | ||||||
| head: | ||||||
| summary: Profile Backend Information | ||||||
| description: Return Profile headers | ||||||
| operationId: HEAD_profiles | ||||||
| tags: | ||||||
| - Profiles | ||||||
| parameters: | ||||||
| - name: format | ||||||
| in: query | ||||||
| description: Filter on Profile format. | ||||||
| schema: | ||||||
| $ref: 'schemas/content-format.json' | ||||||
| - name: codec | ||||||
| in: query | ||||||
| description: Filter on Profile codec. | ||||||
| schema: | ||||||
| $ref: 'schemas/mime-type.json' | ||||||
| - name: label | ||||||
| in: query | ||||||
| description: Filter on Profiles that have the given label. | ||||||
| schema: | ||||||
| type: string | ||||||
| - $ref: '#/components/parameters/trait_resource_paged_key' | ||||||
| - $ref: '#/components/parameters/trait_paged_limit' | ||||||
| responses: | ||||||
| "200": | ||||||
| description: "" | ||||||
| headers: | ||||||
| Link: | ||||||
| description: Provides references to cursors for paging. Only the 'rel' attribute with value 'next' and a link to the next page is currently supported. If 'next' is not present then it is the last page. | ||||||
| schema: | ||||||
| type: string | ||||||
| X-Paging-Limit: | ||||||
| description: Identifies the current limit being used for paging. This may not match the requested value if the requested value was too high for the implementation | ||||||
| schema: | ||||||
| type: integer | ||||||
| X-Paging-NextKey: | ||||||
| description: Opaque string that can be supplied to the `page` query parameter to get the next page of results. | ||||||
| schema: | ||||||
| type: string | ||||||
| content: | ||||||
| application/json: | ||||||
| schema: | ||||||
| type: string | ||||||
| "400": | ||||||
| description: Bad request. Invalid query options. | ||||||
| get: | ||||||
| summary: Profile Backend Information | ||||||
| description: List of Profiles supported by the store instance for use when creating flows. | ||||||
| operationId: GET_profiles | ||||||
| tags: | ||||||
| - Profiles | ||||||
| parameters: | ||||||
| - name: format | ||||||
| in: query | ||||||
| description: Filter on Profile format. | ||||||
| schema: | ||||||
| $ref: 'schemas/content-format.json' | ||||||
| - name: codec | ||||||
| in: query | ||||||
| description: Filter on Profile codec. | ||||||
| schema: | ||||||
| $ref: 'schemas/mime-type.json' | ||||||
| - name: label | ||||||
| in: query | ||||||
| description: Filter on Profiles that have the given label. | ||||||
| schema: | ||||||
| type: string | ||||||
| - $ref: '#/components/parameters/trait_resource_paged_key' | ||||||
| - $ref: '#/components/parameters/trait_paged_limit' | ||||||
| responses: | ||||||
| "200": | ||||||
| description: "" | ||||||
| headers: | ||||||
| Link: | ||||||
| description: Provides references to cursors for paging. Only the 'rel' attribute with value 'next' and a link to the next page is currently supported. If 'next' is not present then it is the last page. | ||||||
| schema: | ||||||
| type: string | ||||||
| X-Paging-Limit: | ||||||
| description: Identifies the current limit being used for paging. This may not match the requested value if the requested value was too high for the implementation | ||||||
| schema: | ||||||
| type: integer | ||||||
| X-Paging-NextKey: | ||||||
| description: Opaque string that can be supplied to the `page` query parameter to get the next page of results. | ||||||
| schema: | ||||||
| type: string | ||||||
| content: | ||||||
| application/json: | ||||||
| example: | ||||||
| $ref: examples/profiles-get-200.json | ||||||
| schema: | ||||||
| type: array | ||||||
| items: | ||||||
| $ref: "schemas/profile.json" | ||||||
| "400": | ||||||
| description: Bad request. Invalid query options. | ||||||
| /service/profiles/{profileId}: | ||||||
| parameters: | ||||||
| - name: profileId | ||||||
| in: path | ||||||
| required: true | ||||||
| schema: | ||||||
| $ref: 'schemas/uuid.json' | ||||||
| description: The Profile identifier. | ||||||
| head: | ||||||
| summary: Profile Details | ||||||
| description: Return Profile path headers | ||||||
| operationId: HEAD_profiles-profileId | ||||||
| tags: | ||||||
| - Profiles | ||||||
| responses: | ||||||
| "200": | ||||||
| $ref: '#/components/responses/trait_resource_info_head_200' | ||||||
| "404": | ||||||
| $ref: '#/components/responses/trait_resource_info_head_404' | ||||||
| get: | ||||||
| summary: Profile Details | ||||||
| description: Returns Profile metadata. | ||||||
| operationId: GET_profiles-profileId | ||||||
| tags: | ||||||
| - Profiles | ||||||
| responses: | ||||||
| "200": | ||||||
| description: "" | ||||||
| content: | ||||||
| application/json: | ||||||
| schema: | ||||||
| $ref: schemas/profile.json | ||||||
| examples: | ||||||
| video-h264: | ||||||
| summary: h264 TS Video Profile | ||||||
| externalValue: examples/profile-get-200-video-h264.json | ||||||
| video-h264-mxf: | ||||||
| summary: h264 MXF Video Profile | ||||||
| externalValue: examples/profile-get-200-video-h264-mxf.json | ||||||
| jpegimage: | ||||||
| summary: Image Profile | ||||||
| externalValue: examples/profile-get-200-image.json | ||||||
| "404": | ||||||
| description: The requested profile does not exist. | ||||||
| post: | ||||||
| summary: Create Profile | ||||||
| description: | | ||||||
| Create a new Profile to be used when creating flows with the matching metadata. | ||||||
|
|
||||||
| Services MUST reject requests that would update an existing Profile as this would mean it no longer matches flows that have already been created using it. | ||||||
| If a change to a Profile is required then a new Profile should be created with the updated information and new flows reference this new Profile. | ||||||
|
|
||||||
| Attempting to update an existing profiles should return a 400 error. | ||||||
|
|
||||||
| Tags can be created at the Profile level to hold information about the Profile itself. | ||||||
| These do not form part of the flow that is created. | ||||||
| These are tag/value format and could be used for tasks such as version tracking or holding encoding parameters. | ||||||
| operationId: POST_profiles-profileId | ||||||
| tags: | ||||||
| - Profiles | ||||||
| requestBody: | ||||||
| content: | ||||||
| application/json: | ||||||
| example: | ||||||
| $ref: examples/profile-put.json | ||||||
| schema: | ||||||
| $ref: schemas/profile.json | ||||||
| required: true | ||||||
| responses: | ||||||
| "201": | ||||||
| description: The flow has been created. | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| content: | ||||||
| application/json: | ||||||
| example: | ||||||
| $ref: examples/profile-post-201.json | ||||||
| schema: | ||||||
| $ref: schemas/profile.json | ||||||
| "400": | ||||||
| description: Bad request. Invalid Profile JSON or Profile already exists. | ||||||
| "404": | ||||||
| description: The requested Profile ID in the path is invalid. | ||||||
| /service/webhooks: | ||||||
| head: | ||||||
| summary: List Webhook URLs | ||||||
|
|
@@ -830,6 +1008,11 @@ paths: | |||||
| description: Filter on Flow codec. | ||||||
| schema: | ||||||
| $ref: 'schemas/mime-type.json' | ||||||
| - name: profile_id | ||||||
| in: query | ||||||
| description: Filter on Profile identifier. | ||||||
| schema: | ||||||
| $ref: 'schemas/uuid.json' | ||||||
| - name: label | ||||||
| in: query | ||||||
| description: Filter on Flows that have the given label. | ||||||
|
|
@@ -917,6 +1100,11 @@ paths: | |||||
| description: Filter on Flow codec. | ||||||
| schema: | ||||||
| $ref: 'schemas/mime-type.json' | ||||||
| - name: profile_id | ||||||
| in: query | ||||||
| description: Filter on Profile identifier. | ||||||
| schema: | ||||||
| $ref: 'schemas/uuid.json' | ||||||
| - name: label | ||||||
| in: query | ||||||
| description: Filter on Flows that have the given label. | ||||||
|
|
@@ -977,7 +1165,7 @@ paths: | |||||
| schema: | ||||||
| type: array | ||||||
| items: | ||||||
| $ref: "schemas/flow.json" | ||||||
| $ref: "schemas/flow-get.json" | ||||||
| "400": | ||||||
| description: Bad request. Invalid query options. | ||||||
| /flows/{flowId}: | ||||||
|
|
@@ -1039,7 +1227,7 @@ paths: | |||||
| content: | ||||||
| application/json: | ||||||
| schema: | ||||||
| $ref: schemas/flow.json | ||||||
| $ref: schemas/flow-get.json | ||||||
| examples: | ||||||
| video: | ||||||
| summary: Video Flow - H.264 Codec | ||||||
|
|
@@ -1094,6 +1282,7 @@ paths: | |||||
| put: | ||||||
| summary: Create or Replace Flow | ||||||
| description: | | ||||||
| | | ||||||
| Create or replace the Flow metadata. | ||||||
|
|
||||||
| Clients should aim to populate as many of the Flow metadata fields as possible and practical. The fewer parameters that are set, the higher the likelihood that reading clients will have to retrieve the media to determine technical metadata to e.g. configure decoders. | ||||||
|
|
@@ -1106,6 +1295,13 @@ paths: | |||||
| Examples of conflicting metadata include `format` not matching, or the `role` in `source_collection` and `flow_collection` not matching. | ||||||
| It may also be possible for service implementations to detect some instances where multiple Flows should not be considered of the same Source, such as audio Flows with different numbers of tracks. | ||||||
| Further guidance on when Flows/Sources may be considered the same/different may be found in the [Practical Guidance for Media](https://specs.amwa.tv/ms-04/releases/v1.0.0/docs/3.0._Practical_Guidance_for_Media.html) section of AMWA MS-04. | ||||||
|
|
||||||
| Flows can be created either by directly supplying all the required technical metadata or by referencing an existing Profile in the store. | ||||||
| When using a Profile, the store will use the technical details (format, codec, essence_parameters etc.) from that profile, along with the metadata provided. | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| It is up to the store implementation whether this is normalised on the flow creation or read-only. | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Tweaks based on convention for referring to TAMS entities. Slight tweak to |
||||||
|
|
||||||
| When creating a flow using a Profile it is not possible to override any specific fields as this would invalidate the link to the Profile. | ||||||
| Supplying a Profile ID and any technical metadata should result in a 400 validation error | ||||||
| operationId: PUT_flows-flowId | ||||||
| tags: | ||||||
| - Flows | ||||||
|
|
@@ -1119,8 +1315,11 @@ paths: | |||||
| multi: | ||||||
| summary: Multi-essence Flow | ||||||
| externalValue: examples/flow-put-multi.json | ||||||
| profile: | ||||||
| summary: Flow created using a Profile | ||||||
| externalValue: examples/flow-put-profile.json | ||||||
| schema: | ||||||
| $ref: schemas/flow.json | ||||||
| $ref: schemas/flow-put.json | ||||||
| required: true | ||||||
| responses: | ||||||
| "201": | ||||||
|
|
@@ -1130,7 +1329,7 @@ paths: | |||||
| example: | ||||||
| $ref: examples/flow-put-201.json | ||||||
| schema: | ||||||
| $ref: schemas/flow.json | ||||||
| $ref: schemas/flow-get.json | ||||||
| "204": | ||||||
| description: No content. The Flow has been updated. | ||||||
| "400": | ||||||
|
|
@@ -2533,7 +2732,7 @@ webhooks: | |||||
| - flow | ||||||
| properties: | ||||||
| flow: | ||||||
| $ref: "schemas/flow.json" | ||||||
| $ref: "schemas/flow-get.json" | ||||||
| responses: | ||||||
| "200": | ||||||
| description: Webhook received successfully | ||||||
|
|
@@ -2565,7 +2764,7 @@ webhooks: | |||||
| - flow | ||||||
| properties: | ||||||
| flow: | ||||||
| $ref: "schemas/flow.json" | ||||||
| $ref: "schemas/flow-get.json" | ||||||
| responses: | ||||||
| "200": | ||||||
| description: Webhook received successfully | ||||||
|
|
@@ -2844,6 +3043,8 @@ tags: | |||||
| - name: Flows | ||||||
| description: | | ||||||
| Sources which have been 'rendered' to a specific encoding/packaging format. | ||||||
| - name: Profiles | ||||||
| description: Centralised management of the technical characteristics of a flow | ||||||
| externalDocs: | ||||||
| url: 'https://specs.amwa.tv/ms-04/releases/v1.0.0/docs/2.3._Explanation_-_Flow.html' | ||||||
| - name: FlowSegments | ||||||
|
|
||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| { | ||
| "id": "6101df05-06bb-41b8-8af4-cf7cd33df209", | ||
| "source_id": "41d7f7eb-c48d-4513-9b37-17b418d26d7f", | ||
| "description": "audio capture web", | ||
| "label": "capture_1", | ||
| "tags": { | ||
| "input_quality": "web", | ||
| "_tams_segmentation_rate": "375/8" | ||
| }, | ||
| "profile_id": "329b98d6-adeb-418c-8eaf-eca14edc1706" | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| { | ||
| "id": "ecf7393a-f7ba-4253-9f1a-eebeace5b7b3", | ||
| "label": "HD JPG still image", | ||
| "description": "1920 x 1080 JPG image", | ||
| "created_by": "tams-dev", | ||
| "created": "2013-09-09T19:01:00Z", | ||
| "tags": { | ||
| "_external_id": "1234567890" | ||
| }, | ||
| "flow_metadata": { | ||
| "format": "urn:x-tam:format:image", | ||
| "codec": "image/jpeg", | ||
| "container": "image/jpeg", | ||
| "essence_parameters": { | ||
| "frame_width": 1920, | ||
| "frame_height": 1080, | ||
| "aspect_ratio": { | ||
| "numerator": 16, | ||
| "denominator": 9 | ||
| } | ||
| } | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,48 @@ | ||
| { | ||
| "id": "749155ed-570b-4777-8a8d-df0a06904b55", | ||
| "label": "VFX Render - Proxy Quality", | ||
| "description": "Video Flow in a MXF container, H264 codec", | ||
| "created_by": "tams-dev", | ||
| "created": "2026-06-24T18:51:00Z", | ||
| "tags": { | ||
| "_ffmpeg_command": "...." | ||
| }, | ||
| "flow_metadata": { | ||
| "format": "urn:x-nmos:format:video", | ||
| "codec": "video/h264", | ||
| "container": "application/mxf", | ||
| "avg_bit_rate": 2479, | ||
| "segment_duration": { | ||
| "numerator": 6, | ||
| "denominator": 1 | ||
| }, | ||
| "essence_parameters": { | ||
| "frame_rate": { | ||
| "numerator": 50, | ||
| "denominator": 1 | ||
| }, | ||
| "frame_width": 1920, | ||
| "frame_height": 1080, | ||
| "bit_depth": 8, | ||
| "interlace_mode": "progressive", | ||
| "colorspace": "BT709", | ||
| "transfer_characteristic": "SDR", | ||
| "aspect_ratio": { | ||
| "numerator": 16, | ||
| "denominator": 9 | ||
| }, | ||
| "pixel_aspect_ratio": { | ||
| "numerator": 1, | ||
| "denominator": 1 | ||
| }, | ||
| "component_type": "YCbCr", | ||
| "vert_chroma_subs": 2, | ||
| "horiz_chroma_subs": 2, | ||
| "avc_parameters": { | ||
| "profile": 100, | ||
| "level": 31, | ||
| "flags": 0 | ||
| } | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This includes multi, though multi-profiles aren't possible