From 6e80c0c355dfa299b58e2af62dff9333758ae0d6 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Sat, 16 Nov 2024 07:18:07 +0000 Subject: [PATCH 01/29] explainer image of contguous and non-contigous subframes --- sub frame slices.png | Bin 0 -> 22234 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 sub frame slices.png diff --git a/sub frame slices.png b/sub frame slices.png new file mode 100644 index 0000000000000000000000000000000000000000..96f52ef8ba44d52e93ebc177f2eff199dc947bf1 GIT binary patch literal 22234 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 R0FA^qYrIw$ef8ZB{}11KZma+R literal 0 HcmV?d00001 From 7017a3aff880b8ac1569af84d83a94bbbc23f858 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Sat, 16 Nov 2024 08:58:46 +0000 Subject: [PATCH 02/29] starting the changes needed to support buffers and slices --- gccg_transport_api.h | 98 +++++++++++++++++++------------------------- 1 file changed, 43 insertions(+), 55 deletions(-) diff --git a/gccg_transport_api.h b/gccg_transport_api.h index e2a2e08..0124c57 100644 --- a/gccg_transport_api.h +++ b/gccg_transport_api.h @@ -44,43 +44,21 @@ typedef struct GccgTimestamp { uint32_t nanoseconds; } GccgTimestamp; -/** - * @brief Type use to define a single media element which is used to represent data from one contiguous region of - * memory. - */ -typedef struct { - /// @brief Origination timestamp to associate with the payload. +/// @brief A structure for holding buffer information for TX, supports slices +typedef struct GccgBuffer { + /// Address of memory buffer to use + void *buffer; + /// length of buffer + uint32_t bytes; + /// set to 1 if the buffer is a slice of a buffer, 0 if its a contiguous element + uint32_t is_slice; + /// slice index, index of slice in a frame, 0 - 7, sub slices are only available in 1/8 chunk of a payload + uint32_t slice_index; + /// timestamp applied to buffer GccgTimestamp origination_timestamp; - - /// @brief The size of the data in bytes. - int size_in_bytes; - - /// @brief The starting address of the data. - void* address_ptr; - - /// @brief User defined parameter. This value is not modified by the API. - void* user_param_ptr; - - /// @brief Handle to internal data used within the SDK that relates to this payload. Do not use or modify this value. - void* internal_data_ptr; -} GccgMediaElement; - -/** - * @brief Type used to define a list of media elements. When transmitting media, this list is used as a parameter passed - * to the GccgTxPayload() API that defines the media elements to transmit. When receiving media, this list defines the - * media elements received as part of the GccgRxCallback() callback API. It is also used by the GccgRxFreeBuffer() API - * when the application is done with received media elements to free their associated resources. - */ -typedef struct { - /// @brief Number of media elements in media_array. - /// - /// Note: This value must match the number of media elements configured when the connection was created using one - /// of the ...ConnectionCreate() API functions and cannot change. However, to allow for dynamic changes, pointers - /// in payload_array may be set to NULL to indicate one or more media elements are not present for a given payload. - int count; - - GccgMediaElement** media_array; ///< Pointer to start of the array of media element pointers. -} GccgMediaElements; + /// handle of connection that the buffers relates to + GccgConnectionHandle connection_handle; +} GccgBuffer; /** * @brief Type used as the handle (pointer to an opaque structure) for a transmitter or receiver connection. Each handle @@ -137,7 +115,7 @@ typedef struct { /// @brief If no error occurred, a pointer to an array of MediaElements that contain the received payload data. /// Otherwise the value will be NULL. - const GccgMediaElements* media_array; + const GccgBuffer *buffer; /// @brief User defined callback parameter. This value is set as a parameter of the GccgRxConnectionCreate() /// API function. The value is not modified by the SDK. @@ -184,15 +162,14 @@ GCCG_INTERFACE GccgReturnStatus GccgInitialize(int maximum_thread_count, int max * and the ordering in media_array when using the GccgTxPayload() API function. * The remote target must use the same configuration data when calling the * GccgRxConnectionCreate() API function to create the receive side of the connection. - * @param tx_buffer_size_bytes The size in bytes of a memory region for holding transmit payload data. A pointer to the - * buffer is returned in ret_tx_buffer_ptr. The application manages how the buffer is - * partitioned and used. + * @param tx_buffer_size_bytes tx_buffer_size_bytes The size in bytes of a memory region for holding a single transmit payload data. + * @param tx_buffer_count Positive integer count of buffers requested by the application for sending * @param tx_cb_ptr Address of the user function to call whenever a payload has been transmitted. * @param ret_connection_json_buffer_size Size of ret_connection_json_str buffer. * @param ret_connection_json_str Pointer where to write returned json string. If size of buffer is not large enough, * then kGccgStatusBufferToSmall will be returned. - * @param ret_tx_buffer_ptr Pointer where to write returned start of allocated transmit payload buffer. Size is specified - * using tx_buffer_size_bytes. + * @param ret_tx_buffer_ptrs Pointer to an array of pointers to receive allocated transmit payload buffers of the size requested. + * using tx_buffer_size_bytes, must be karge enough to accomadate tx_buffer_count pointers. * @param ret_handle_ptr Pointer to returned connection handle. The handle is used as a parameter to other API functions * to identify this specific transmitter. * @@ -215,7 +192,7 @@ GCCG_INTERFACE GccgReturnStatus GccgTxConnectionCreate(const char* connection_js * and the ordering in media_array when the GccgRxCallback() callback API function is invoked. * The remote host must use the same configuration data when calling the * GccgTxConnectionCreate() API function to create the transmit side of the connection. - * @param rx_buffer_size_bytes The size in bytes of a memory region for holding received payload data. + * @param rx_buffer_size_bytes tx_buffer_size_bytes The size in bytes of a memory region for holding a single receive payload data. * @param rx_cb_ptr Address of the user function to call whenever a payload has been received. * @param user_cb_param_ptr User defined callback parameter. This value is set as part of the GccgRxCbData data * whenever the rx_cb_ptr callback function is invoked. The value is not modified by the SDK. @@ -245,16 +222,29 @@ GCCG_INTERFACE GccgReturnStatus GccgRxConnectionCreate(const char *connection_js GCCG_INTERFACE GccgReturnStatus GccgConnectionDestroy(GccgConnectionHandle handle); /** - * Transmit a payload of data to the receiver. The connection must have been created with GccgTxConnectionCreate(). - * This function is asynchronous and will immediately return. The user callback function GccgTxCallback() registered - * through GccgTxConnectionCreate() will be invoked when the payload has been acknowledged by the remote receiver or a - * transmission timeout occurred. This API is thread-safe. + * Request a buffer for the Transmit a payload of data to the receiver. + * The connection must have been created with GccgTxConnectionCreate(). + * If no buffer is free a NULL pointer is returned + * This API is thread-safe. + * + * @param handle Connection handle returned by the GccgTxConnectionCreate() API function. + * @param buffer Pointer to a GccgBufer to receiev te data for a transmit buffer + * @param slice_index set to -1 when slice based working is not requested, set to 0-7 to indicate the slice requested + * if working in slices of a buffer, only 8 slice configuration supported, + * + * @return A value from the GCCG_INTERFACE enumeration. + */ +GCCG_INTERFACE GccgReturnStatus GccgRequestTxBuffer(GccgConnectionHandle handle, GccgBuffer *buffer, int32_t slice_index); + +/** + * Request a buffer for the Transmit a payload of data to the receiver. + * The connection must have been created with GccgTxConnectionCreate(). + * If no buffer is free a NULL pointer is returned + * This API is thread-safe. * * @param handle Connection handle returned by the GccgTxConnectionCreate() API function. * @param payload_json_str Pointer to payload configuration json string. - * @param media_array Array of media elements that define the size and location of each media element to transmit in this - * payload. If a pointer within the array is NULL, then the payload does not contain an element for - * that media. + * @param buffer pointer to a GccgBuffer for thsi connection * @param user_cb_param_ptr User defined callback parameter. This value is set as part of the GccgTxCbData data * whenever the tx_cb_ptr callback function specified in the GccgTxConnectionCreate() API * is invoked. The value is not modified by the SDK. @@ -265,20 +255,18 @@ GCCG_INTERFACE GccgReturnStatus GccgConnectionDestroy(GccgConnectionHandle handl * @return A value from the GCCG_INTERFACE enumeration. */ GCCG_INTERFACE GccgReturnStatus GccgTxPayload(GccgConnectionHandle handle, - const char *payload_json_str, - GccgMediaElements media_array, + const GccgBuffer *buffer, void* user_cb_param_ptr, int timeout_microsecs); /** * Free an array of receive buffers that was used by the GccgRxCallback() callback API function. This API is thread-safe. * - * @param media_array Pointer to a structure that contains an array of media elements to free and the number of elements - * in the array. + * @param buffer Pointer to a GccgBuffer*buffer that is to be freed * * @return A value from the GCCG_INTERFACE enumeration. */ -GCCG_INTERFACE GccgReturnStatus GccgRxFreeBuffer(GccgMediaElements *media_array); +GCCG_INTERFACE GccgReturnStatus GccgRxFreeBuffer(const GccgBuffer *buffer); /** * @brief Only required when using a single-threaded, event loop to service the API. Must specify a value of zero for From 809d3c0d441bcd8999c93387cb93c6335be2b076 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Sun, 17 Nov 2024 08:59:48 +0000 Subject: [PATCH 03/29] fix order and include stdint --- gccg_transport_api.h | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/gccg_transport_api.h b/gccg_transport_api.h index 0124c57..cdfba47 100644 --- a/gccg_transport_api.h +++ b/gccg_transport_api.h @@ -7,6 +7,8 @@ #ifndef GCCG_TRANSPORT_API_H__ #define GCCG_TRANSPORT_API_H__ +#include + /** * @file * @brief @@ -44,6 +46,12 @@ typedef struct GccgTimestamp { uint32_t nanoseconds; } GccgTimestamp; +/** + * @brief Type used as the handle (pointer to an opaque structure) for a transmitter or receiver connection. Each handle + * represents a single data flow. + */ +typedef void* GccgConnectionHandle; + /// @brief A structure for holding buffer information for TX, supports slices typedef struct GccgBuffer { /// Address of memory buffer to use @@ -60,12 +68,6 @@ typedef struct GccgBuffer { GccgConnectionHandle connection_handle; } GccgBuffer; -/** - * @brief Type used as the handle (pointer to an opaque structure) for a transmitter or receiver connection. Each handle - * represents a single data flow. - */ -typedef void* GccgConnectionHandle; - /** * @brief A structure of this type is passed as the parameter to GccgTxCallback(). It contains data related to the * transmission of a single payload to a receiver and data related to the Tx connection. From c52dc160d982f94adef41532630233b8d61416aa Mon Sep 17 00:00:00 2001 From: David Atkins Date: Tue, 19 Nov 2024 07:22:20 +0000 Subject: [PATCH 04/29] fixed type of buffer --- gccg_transport_api.h | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/gccg_transport_api.h b/gccg_transport_api.h index cdfba47..e293967 100644 --- a/gccg_transport_api.h +++ b/gccg_transport_api.h @@ -107,15 +107,11 @@ typedef void (*GccgTxCallback)(const GccgTxCbData* data_ptr); typedef struct { GccgReturnStatus status_code; - /// @brief The handle of the instance which was created using a previous call to the GccgTxConnectionCreate() API - /// function. - GccgConnectionHandle connection_handle; - /// @brief If no error occurred, a pointer to the payload configuration json string received with the payload. /// Otherwise the value will be NULL. const char *payload_json_str; - /// @brief If no error occurred, a pointer to an array of MediaElements that contain the received payload data. + /// @brief If no error occurred, a pointer to a GccgBuffer that contains the received payload data. /// Otherwise the value will be NULL. const GccgBuffer *buffer; @@ -268,7 +264,7 @@ GCCG_INTERFACE GccgReturnStatus GccgTxPayload(GccgConnectionHandle handle, * * @return A value from the GCCG_INTERFACE enumeration. */ -GCCG_INTERFACE GccgReturnStatus GccgRxFreeBuffer(const GccgBuffer *buffer); +GCCG_INTERFACE GccgReturnStatus GccgRxFreeBuffer(const GccgRxCbData *buffer); /** * @brief Only required when using a single-threaded, event loop to service the API. Must specify a value of zero for From d869b6aa96793789b704578ab0d52c3116a80245 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Wed, 20 Nov 2024 07:14:38 +0000 Subject: [PATCH 05/29] schema fixes --- payload_schema.json | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/payload_schema.json b/payload_schema.json index a4f5088..b0cf323 100644 --- a/payload_schema.json +++ b/payload_schema.json @@ -155,11 +155,11 @@ }, "interlace": { "description": "If true video is interlaced, otherwise video is progressive.", - "type": "boolean", + "type": "boolean" }, "segmented": { "description": "If true video is segmented.", - "type": "boolean", + "type": "boolean" }, "TCS": { "description": "SMPTE 2110-20 Media type parameters for Transfer Characteristic System.", @@ -220,10 +220,10 @@ "type": "integer", "minimum": 0, "maximum": 4320 - }, - }, - }, - }, + } + } + } + } }, "audioAttributes": { "type": "object", @@ -282,7 +282,7 @@ }, "interlace": { "description": "If true video is interlaced, otherwise video is progressive.", - "type": "boolean", + "type": "boolean" }, "field": { "description": "Zero or one. For interlaced, zero= first field, one= second field. For progressive, shall be set to zero, except in the case of progressive segmented frame data where it indicates the segment.", @@ -314,3 +314,4 @@ } } } +} \ No newline at end of file From 329510ea4e194891dc17d38019c549d51fc142b9 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Wed, 20 Nov 2024 07:17:56 +0000 Subject: [PATCH 06/29] schema fixes --- connection_schema.json | 19 ++++++++++--------- ret_connection_schema.json | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/connection_schema.json b/connection_schema.json index cf45eb1..2ec5c09 100644 --- a/connection_schema.json +++ b/connection_schema.json @@ -52,7 +52,7 @@ "Level 3 UHD", "Level 3+ UHD", "Level 3C UHD", - "Level 4 UHD", + "Level 4 UHD" ] }, "timing": { @@ -174,11 +174,11 @@ }, "interlace": { "description": "If true video is interlaced, otherwise video is progressive.", - "type": "boolean", + "type": "boolean" }, "segmented": { "description": "If true video is segmented.", - "type": "boolean", + "type": "boolean" }, "TCS": { "description": "SMPTE 2110-20 Media type parameters for Transfer Characteristic System.", @@ -239,10 +239,10 @@ "type": "integer", "minimum": 0, "maximum": 4320 - }, - }, - }, - }, + } + } + } + } }, "audioAttributes": { "type": "object", @@ -286,7 +286,7 @@ "originalDepth": { "description": "Original bit depth of the audio samples.", "type": "integer", - "minimum": 0, + "minimum": 0 }, "sampleCount": { "description": "Number of audio samples included in each audio channel.", @@ -308,7 +308,7 @@ }, "interlace": { "description": "If true video is interlaced, otherwise video is progressive.", - "type": "boolean", + "type": "boolean" }, "field": { "description": "Zero or one. For interlaced, zero= first field, one= second field. For progressive, shall be set to zero, except in the case of progressive segmented frame data where it indicates the segment.", @@ -342,3 +342,4 @@ } } } +} diff --git a/ret_connection_schema.json b/ret_connection_schema.json index 495f287..47e062e 100644 --- a/ret_connection_schema.json +++ b/ret_connection_schema.json @@ -13,7 +13,7 @@ "timing": { "type": "object", "$ref": "#/$defs/timing" - }, + } }, "required": [ "gccgVersion", "timing" ], "$defs": { From 8d153ef711047ccbf74b433d6fde5db97d4276ce Mon Sep 17 00:00:00 2001 From: David Atkins Date: Wed, 20 Nov 2024 07:25:02 +0000 Subject: [PATCH 07/29] removed duplaicte type in level defintion --- connection_schema.json | 1 - 1 file changed, 1 deletion(-) diff --git a/connection_schema.json b/connection_schema.json index 2ec5c09..81d5b77 100644 --- a/connection_schema.json +++ b/connection_schema.json @@ -39,7 +39,6 @@ "required": [ "gccgVersion", "timing", "level", "mediaFlow" ], "$defs": { "level": { - "type": "object", "description": "Level capability", "type": "string", "enum": [ From b659fa1b67e6d85777848d8723555292ae74be9e Mon Sep 17 00:00:00 2001 From: David Atkins Date: Thu, 21 Nov 2024 14:42:07 +0000 Subject: [PATCH 08/29] schema updated --- payload_schema.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/payload_schema.json b/payload_schema.json index b0cf323..4ed681e 100644 --- a/payload_schema.json +++ b/payload_schema.json @@ -65,6 +65,10 @@ "ancillary-data" ] }, + "uri": { + "description": "URI to locate resource", + "type": "string" + }, "encodingName": { "description": "Encoding options are from the IANA registered media types. See https://www.iana.org/assignments/media-types/media-types.xhtml", "type": "string", @@ -111,6 +115,7 @@ "enum": [ "YCbCr-4:2:0", "YCbCr-4:2:2", + "YCbCrA-4:2:2:4", "YCbCr-4:4:4", "RGB" ] @@ -118,11 +123,7 @@ "depth": { "description": "Video pixel bit depth.", "type": "integer", - "enum": [ - 8, - 10, - 12 - ] + "const": 16 }, "width": { "description": "Video picture width in pixels.", From 9dfcd9f72efdebfb38fc3a00cc9b838fef491541 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Sun, 24 Nov 2024 17:35:42 +0000 Subject: [PATCH 09/29] added regex validation to timing --- payload_schema.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/payload_schema.json b/payload_schema.json index 4ed681e..d70b6ee 100644 --- a/payload_schema.json +++ b/payload_schema.json @@ -37,11 +37,14 @@ "properties": { "COT": { "description": "64-bit Content Origination Timestamp. Upper 32-bits is the number of seconds since the SMPTE Epoch. Lower 32-bits is the number of fractional seconds as measured in nanoseconds", - "type": "string" + "type": "string", + "pattern": "^\\d+:\\d{9}$" + }, "LAT": { "description": "64-bit Local Arrival Timestamp in same format as COT.", - "type": "string" + "type": "string", + "pattern": "^\\d+:\\d{9}$" }, "tMinAccumulated": { "description": "Accumulated minimum latency of the Workflow path up to this Workflow Step, in milliseconds. Can change but the change is disruptive to the Workflow timing while the Workflow adapts.", From 869ccebc77143d2c3fb776bad0d97531b6650850 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Sun, 24 Nov 2024 18:22:51 +0000 Subject: [PATCH 10/29] more valdiationa nd ;lanar as a type --- payload_schema.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/payload_schema.json b/payload_schema.json index d70b6ee..296fec3 100644 --- a/payload_schema.json +++ b/payload_schema.json @@ -82,7 +82,8 @@ "MP2T", "H264", "H265", - "jxsv" + "jxsv", + "planar" ] }, "clockRate": { @@ -142,7 +143,8 @@ }, "exactframerate": { "description": "Video frame-rate numerator/denominator.", - "type": "string" + "type": "string", + "pattern": "^\\d+:\\d+$" }, "colorimetry": { "description": "Video colorimetry.", @@ -191,7 +193,8 @@ }, "PAR": { "description": "Pixel Aspect Ratio (PAR) width:height.", - "type": "string" + "type": "string", + "pattern": "^\\d+:\\d+$" }, "alphaIncluded": { "description": "If true alpha channel is included.", From 199191a415f7e340158d806b8d75fc07b0806c0a Mon Sep 17 00:00:00 2001 From: David Atkins Date: Tue, 26 Nov 2024 07:15:54 +0000 Subject: [PATCH 11/29] added back user call back pointer, fixed spelling added a tx buffer slices structure --- gccg_transport_api.h | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/gccg_transport_api.h b/gccg_transport_api.h index e293967..0a8ca0d 100644 --- a/gccg_transport_api.h +++ b/gccg_transport_api.h @@ -68,6 +68,10 @@ typedef struct GccgBuffer { GccgConnectionHandle connection_handle; } GccgBuffer; +typedef struct GccgBufferSlices { + GccgBuffer *slices[8]; +} GccgBufferSlices; + /** * @brief A structure of this type is passed as the parameter to GccgTxCallback(). It contains data related to the * transmission of a single payload to a receiver and data related to the Tx connection. @@ -176,9 +180,9 @@ GCCG_INTERFACE GccgReturnStatus GccgInitialize(int maximum_thread_count, int max GCCG_INTERFACE GccgReturnStatus GccgTxConnectionCreate(const char* connection_json_str, uint64_t tx_buffer_size_bytes, GccgTxCallback tx_cb_ptr, + void* user_cb_param_ptr, int ret_connection_json_buffer_size, char* ret_connection_json_str, - void* ret_tx_buffer_ptr, GccgConnectionHandle* ret_handle_ptr); /** @@ -226,13 +230,24 @@ GCCG_INTERFACE GccgReturnStatus GccgConnectionDestroy(GccgConnectionHandle handl * This API is thread-safe. * * @param handle Connection handle returned by the GccgTxConnectionCreate() API function. - * @param buffer Pointer to a GccgBufer to receiev te data for a transmit buffer - * @param slice_index set to -1 when slice based working is not requested, set to 0-7 to indicate the slice requested - * if working in slices of a buffer, only 8 slice configuration supported, + * @param buffer Pointer to a GccgBuffer to receive the data for a transmit buffer + * + * @return A value from the GCCG_INTERFACE enumeration. + */ +GCCG_INTERFACE GccgReturnStatus GccgRequestTxBuffer(GccgConnectionHandle handle, GccgBuffer *buffer); + +/** + * Request a buffer for the Transmit a payload of data to the receiver. + * The connection must have been created with GccgTxConnectionCreate(). + * If no buffer is free a NULL pointer is returned + * This API is thread-safe. + * + * @param handle Connection handle returned by the GccgTxConnectionCreate() API function. + * @param buffer_slices Pointer array of GccgBuffers to receive the data for a transmit buffers * * @return A value from the GCCG_INTERFACE enumeration. */ -GCCG_INTERFACE GccgReturnStatus GccgRequestTxBuffer(GccgConnectionHandle handle, GccgBuffer *buffer, int32_t slice_index); +GCCG_INTERFACE GccgReturnStatus GccgRequestTxBufferSlices(GccgConnectionHandle handle, GccgBufferSlices *buffer_slices); /** * Request a buffer for the Transmit a payload of data to the receiver. From cf31f562ddb4da0c35ed6771c5cd8a8b0115738a Mon Sep 17 00:00:00 2001 From: David Atkins Date: Thu, 28 Nov 2024 11:09:41 +0000 Subject: [PATCH 12/29] removed comment no longer needed --- gccg_transport_api.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/gccg_transport_api.h b/gccg_transport_api.h index 0a8ca0d..0042ad9 100644 --- a/gccg_transport_api.h +++ b/gccg_transport_api.h @@ -170,8 +170,6 @@ GCCG_INTERFACE GccgReturnStatus GccgInitialize(int maximum_thread_count, int max * @param ret_connection_json_buffer_size Size of ret_connection_json_str buffer. * @param ret_connection_json_str Pointer where to write returned json string. If size of buffer is not large enough, * then kGccgStatusBufferToSmall will be returned. - * @param ret_tx_buffer_ptrs Pointer to an array of pointers to receive allocated transmit payload buffers of the size requested. - * using tx_buffer_size_bytes, must be karge enough to accomadate tx_buffer_count pointers. * @param ret_handle_ptr Pointer to returned connection handle. The handle is used as a parameter to other API functions * to identify this specific transmitter. * From 0082c52ca0c0b05470556b9e3b19541fc9a2ba08 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Thu, 28 Nov 2024 11:30:15 +0000 Subject: [PATCH 13/29] added traceId --- payload_schema.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/payload_schema.json b/payload_schema.json index 296fec3..804833d 100644 --- a/payload_schema.json +++ b/payload_schema.json @@ -95,6 +95,11 @@ 48000 ] }, + "traceId": { + "description": "Clock rate of the media. 90k for video and 48k for audio.", + "x-omitempty": true, + "type": "string" + }, "videoAttributes": { "x-omitempty": true, "$ref": "#/$defs/videoAttributes" From c49d634e8af556d4f58458c609729f3db4e71bac Mon Sep 17 00:00:00 2001 From: David Atkins Date: Thu, 28 Nov 2024 12:12:50 +0000 Subject: [PATCH 14/29] named the constant --- gccg_transport_api.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gccg_transport_api.h b/gccg_transport_api.h index 0042ad9..caab983 100644 --- a/gccg_transport_api.h +++ b/gccg_transport_api.h @@ -68,8 +68,10 @@ typedef struct GccgBuffer { GccgConnectionHandle connection_handle; } GccgBuffer; +#define GCCG_SLICES (8) + typedef struct GccgBufferSlices { - GccgBuffer *slices[8]; + GccgBuffer slices[GCCG_SLICES]; } GccgBufferSlices; /** From 854bc21563a8ece887810443b82204cc2d98c299 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Fri, 29 Nov 2024 06:52:58 +0000 Subject: [PATCH 15/29] user callback for tx only comes through calls to tx functio not the setup --- gccg_transport_api.h | 1 - 1 file changed, 1 deletion(-) diff --git a/gccg_transport_api.h b/gccg_transport_api.h index caab983..d9488c2 100644 --- a/gccg_transport_api.h +++ b/gccg_transport_api.h @@ -180,7 +180,6 @@ GCCG_INTERFACE GccgReturnStatus GccgInitialize(int maximum_thread_count, int max GCCG_INTERFACE GccgReturnStatus GccgTxConnectionCreate(const char* connection_json_str, uint64_t tx_buffer_size_bytes, GccgTxCallback tx_cb_ptr, - void* user_cb_param_ptr, int ret_connection_json_buffer_size, char* ret_connection_json_str, GccgConnectionHandle* ret_handle_ptr); From 254f42b519a316254855bac6cb613057a922278a Mon Sep 17 00:00:00 2001 From: David Atkins Date: Fri, 29 Nov 2024 07:07:50 +0000 Subject: [PATCH 16/29] Revert "user callback for tx only comes through calls to tx functio not the setup" This reverts commit 854bc21563a8ece887810443b82204cc2d98c299. --- gccg_transport_api.h | 1 + 1 file changed, 1 insertion(+) diff --git a/gccg_transport_api.h b/gccg_transport_api.h index d9488c2..caab983 100644 --- a/gccg_transport_api.h +++ b/gccg_transport_api.h @@ -180,6 +180,7 @@ GCCG_INTERFACE GccgReturnStatus GccgInitialize(int maximum_thread_count, int max GCCG_INTERFACE GccgReturnStatus GccgTxConnectionCreate(const char* connection_json_str, uint64_t tx_buffer_size_bytes, GccgTxCallback tx_cb_ptr, + void* user_cb_param_ptr, int ret_connection_json_buffer_size, char* ret_connection_json_str, GccgConnectionHandle* ret_handle_ptr); From 799af36d11388959ad277e345fd746ac0d8eebf8 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Fri, 29 Nov 2024 07:14:09 +0000 Subject: [PATCH 17/29] removed user callback param from tx again, fixed test app --- gccg_transport_api.h | 1 - 1 file changed, 1 deletion(-) diff --git a/gccg_transport_api.h b/gccg_transport_api.h index caab983..d9488c2 100644 --- a/gccg_transport_api.h +++ b/gccg_transport_api.h @@ -180,7 +180,6 @@ GCCG_INTERFACE GccgReturnStatus GccgInitialize(int maximum_thread_count, int max GCCG_INTERFACE GccgReturnStatus GccgTxConnectionCreate(const char* connection_json_str, uint64_t tx_buffer_size_bytes, GccgTxCallback tx_cb_ptr, - void* user_cb_param_ptr, int ret_connection_json_buffer_size, char* ret_connection_json_str, GccgConnectionHandle* ret_handle_ptr); From 7f2d3e4e3ccbc7f007dfed5b06c512c3d520e085 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Thu, 12 Dec 2024 07:13:27 +0000 Subject: [PATCH 18/29] support 8 and 16 video depth, clean un-used types --- payload_schema.json | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/payload_schema.json b/payload_schema.json index 804833d..1d8bae1 100644 --- a/payload_schema.json +++ b/payload_schema.json @@ -76,13 +76,7 @@ "description": "Encoding options are from the IANA registered media types. See https://www.iana.org/assignments/media-types/media-types.xhtml", "type": "string", "enum": [ - "raw", "pcm", - "smpte291", - "MP2T", - "H264", - "H265", - "jxsv", "planar" ] }, @@ -122,7 +116,6 @@ "description": "Video color sampling type.", "type": "string", "enum": [ - "YCbCr-4:2:0", "YCbCr-4:2:2", "YCbCrA-4:2:2:4", "YCbCr-4:4:4", @@ -132,7 +125,10 @@ "depth": { "description": "Video pixel bit depth.", "type": "integer", - "const": 16 + "enum": [ + 8, + 16 + ] }, "width": { "description": "Video picture width in pixels.", From f4e8ffd14f6f6bca0d91f92debd51c5e1bcbb6bf Mon Sep 17 00:00:00 2001 From: David Atkins Date: Fri, 13 Dec 2024 07:24:53 +0000 Subject: [PATCH 19/29] tweak audio params --- payload_schema.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/payload_schema.json b/payload_schema.json index 1d8bae1..8147df3 100644 --- a/payload_schema.json +++ b/payload_schema.json @@ -239,8 +239,8 @@ "activeChannels": { "description": "Total number of active audio channels. Can vary, but cannot exceed totalChannels.", "type": "integer", - "minimum": 0, - "maximum": 24 + "minimum": 1, + "maximum": 64 }, "channelOrder": { "description": "SMPTE 2110-30 Uncompressed audio channel groupings.", @@ -263,7 +263,9 @@ "depth": { "description": "Bit depth of the audio samples.", "type": "integer", - "minimum": 0 + "enum": [ + 32 + ] }, "originalDepth": { "description": "Original bit depth of the audio samples.", From c079b67300025ba71040669e919aaf9eb1858d38 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Fri, 13 Dec 2024 15:09:07 +0000 Subject: [PATCH 20/29] extend audio channel based on github discussion --- payload_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/payload_schema.json b/payload_schema.json index 8147df3..951f071 100644 --- a/payload_schema.json +++ b/payload_schema.json @@ -240,7 +240,7 @@ "description": "Total number of active audio channels. Can vary, but cannot exceed totalChannels.", "type": "integer", "minimum": 1, - "maximum": 64 + "maximum": 256 }, "channelOrder": { "description": "SMPTE 2110-30 Uncompressed audio channel groupings.", From bb551dd0565251eec1aef74bdd9167dfe47be1ae Mon Sep 17 00:00:00 2001 From: David Atkins Date: Thu, 9 Jan 2025 11:23:22 +0000 Subject: [PATCH 21/29] add handle for buffer to structure --- gccg_transport_api.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gccg_transport_api.h b/gccg_transport_api.h index d9488c2..5e29be8 100644 --- a/gccg_transport_api.h +++ b/gccg_transport_api.h @@ -52,6 +52,12 @@ typedef struct GccgTimestamp { */ typedef void* GccgConnectionHandle; +/** + * @brief Type used as the handle (index to an opaque structure) for a buffer allocated by the api. Each api can use + * this as required + */ +typedef uint32_t GccgBufferHandle; + /// @brief A structure for holding buffer information for TX, supports slices typedef struct GccgBuffer { /// Address of memory buffer to use @@ -66,6 +72,8 @@ typedef struct GccgBuffer { GccgTimestamp origination_timestamp; /// handle of connection that the buffers relates to GccgConnectionHandle connection_handle; + /// handle fo the buffer managed by the api + GccgBufferHandle buffer_handle; } GccgBuffer; #define GCCG_SLICES (8) From 978e88692f0e8c496e9214a83705333532e04880 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Mon, 3 Feb 2025 16:15:02 +0000 Subject: [PATCH 22/29] change time stamps to structures rather then string --- payload_schema.json | 577 +++++++++++++++++++++++--------------------- 1 file changed, 298 insertions(+), 279 deletions(-) diff --git a/payload_schema.json b/payload_schema.json index 951f071..84fdf42 100644 --- a/payload_schema.json +++ b/payload_schema.json @@ -14,6 +14,10 @@ "type": "object", "$ref": "#/$defs/timing" }, + "timestamp": { + "type": "object", + "$ref": "#/$defs/timestamp" + }, "transportParameters" : { "type": "object", "description": "Transport specific parameters" @@ -32,296 +36,311 @@ }, "required": [ "gccgVersion", "timing", "mediaFlow" ], "$defs": { - "timing": { - "type": "object", - "properties": { - "COT": { - "description": "64-bit Content Origination Timestamp. Upper 32-bits is the number of seconds since the SMPTE Epoch. Lower 32-bits is the number of fractional seconds as measured in nanoseconds", - "type": "string", - "pattern": "^\\d+:\\d{9}$" - - }, - "LAT": { - "description": "64-bit Local Arrival Timestamp in same format as COT.", - "type": "string", - "pattern": "^\\d+:\\d{9}$" - }, - "tMinAccumulated": { - "description": "Accumulated minimum latency of the Workflow path up to this Workflow Step, in milliseconds. Can change but the change is disruptive to the Workflow timing while the Workflow adapts.", - "type": "integer" - }, - "t99Accumulated": { - "description": "Accumulated maximum latency of the Workflow path up to this Workflow Step, in milliseconds. Can change but the change is disruptive to the Workflow timing while the Workflow adapts.", - "type": "integer" - } - } - }, - "mediaElement": { - "type": "object", - "properties": { - "type": { - "description": "Media type (video, audio or ancillary-data).", - "type": "string", - "enum": [ - "video", - "audio", - "ancillary-data" - ] - }, - "uri": { - "description": "URI to locate resource", - "type": "string" - }, - "encodingName": { - "description": "Encoding options are from the IANA registered media types. See https://www.iana.org/assignments/media-types/media-types.xhtml", - "type": "string", - "enum": [ - "pcm", - "planar" - ] - }, - "clockRate": { - "description": "Clock rate of the media. 90k for video and 48k for audio.", - "x-omitempty": true, - "type": "integer", - "enum": [ - 90000, - 48000 - ] - }, - "traceId": { - "description": "Clock rate of the media. 90k for video and 48k for audio.", - "x-omitempty": true, - "type": "string" - }, - "videoAttributes": { - "x-omitempty": true, - "$ref": "#/$defs/videoAttributes" - }, - "audioAttributes": { - "x-omitempty": true, - "$ref": "#/$defs/audioAttributes" + "timestamp": { + "type": "object", + "properties": { + "seconds": { + "type": "integer", + "minimum": 0 + }, + "nano_seconds": { + "type": "integer", + "minimum": 0, + "maximum": 999999999 + } }, - "ancillaryDataAttributes": { - "x-omitempty": true, - "$ref": "#/$defs/ancillaryDataAttributes" + "required": [ + "seconds", + "nano_seconds" + ] + }, + "timing": { + "type": "object", + "properties": { + "COT": { + "description": "64-bit Content Origination Timestamp. Upper 32-bits is the number of seconds since the SMPTE Epoch. Lower 32-bits is the number of fractional seconds as measured in nanoseconds", + "$ref": "#/$defs/timestamp" + }, + "LAT": { + "description": "64-bit Local Arrival Timestamp in same format as COT.", + "$ref": "#/$defs/timestamp" + }, + "tMinAccumulated": { + "description": "Accumulated minimum latency of the Workflow path up to this Workflow Step, in milliseconds. Can change but the change is disruptive to the Workflow timing while the Workflow adapts.", + "type": "integer" + }, + "t99Accumulated": { + "description": "Accumulated maximum latency of the Workflow path up to this Workflow Step, in milliseconds. Can change but the change is disruptive to the Workflow timing while the Workflow adapts.", + "type": "integer" + } } }, - "required": [ "type" ] - }, - "videoAttributes": { - "type": "object", - "properties": { - "sampling": { - "description": "Video color sampling type.", - "type": "string", - "enum": [ - "YCbCr-4:2:2", - "YCbCrA-4:2:2:4", - "YCbCr-4:4:4", - "RGB" - ] - }, - "depth": { - "description": "Video pixel bit depth.", - "type": "integer", - "enum": [ - 8, - 16 - ] - }, - "width": { - "description": "Video picture width in pixels.", - "type": "integer", - "minimum": 1, - "maximum": 7680 - }, - "height": { - "description": "Video picture height in pixels.", - "type": "integer", - "minimum": 1, - "maximum": 4320 - }, - "exactframerate": { - "description": "Video frame-rate numerator/denominator.", - "type": "string", - "pattern": "^\\d+:\\d+$" - }, - "colorimetry": { - "description": "Video colorimetry.", - "type": "string", - "enum": [ - "BT601", - "BT709", - "BT2020", - "BT2100", - "ST2065-1", - "ST2065-3", - "XYZ" - ] - }, - "interlace": { - "description": "If true video is interlaced, otherwise video is progressive.", - "type": "boolean" - }, - "segmented": { - "description": "If true video is segmented.", - "type": "boolean" - }, - "TCS": { - "description": "SMPTE 2110-20 Media type parameters for Transfer Characteristic System.", - "type": "string", - "enum": [ - "SDR", - "PQ", - "HLG", - "LINEAR", - "BT2100LINPQ", - "BT2100LINHLG", - "ST2065-1", - "ST428-1", - "DENSITY" - ] - }, - "RANGE": { - "description": "SMPTE 2110-20 Media type parameter for setting encoding range.", - "type": "string", + "mediaElement": { + "type": "object", + "properties": { + "type": { + "description": "Media type (video, audio or ancillary-data).", + "type": "string", "enum": [ - "NARROW", - "FULL", - "FULLPROTECT" - ] - }, - "PAR": { - "description": "Pixel Aspect Ratio (PAR) width:height.", - "type": "string", - "pattern": "^\\d+:\\d+$" - }, - "alphaIncluded": { - "description": "If true alpha channel is included.", - "type": "boolean" + "video", + "audio", + "ancillary-data" + ] + }, + "uri": { + "description": "URI to locate resource", + "type": "string" + }, + "encodingName": { + "description": "Encoding options are from the IANA registered media types. See https://www.iana.org/assignments/media-types/media-types.xhtml", + "type": "string", + "enum": [ + "pcm", + "planar" + ] + }, + "clockRate": { + "description": "Clock rate of the media. 90k for video and 48k for audio.", + "x-omitempty": true, + "type": "integer", + "enum": [ + 90000, + 48000 + ] + }, + "traceId": { + "description": "Clock rate of the media. 90k for video and 48k for audio.", + "x-omitempty": true, + "type": "string" + }, + "videoAttributes": { + "x-omitempty": true, + "$ref": "#/$defs/videoAttributes" + }, + "audioAttributes": { + "x-omitempty": true, + "$ref": "#/$defs/audioAttributes" + }, + "ancillaryDataAttributes": { + "x-omitempty": true, + "$ref": "#/$defs/ancillaryDataAttributes" + } }, - "partialFrame": { - "description": "Partial frame video size and offset.", - "type": "object", - "properties": { - "width": { - "description": "Partial frame video width in pixels.", - "type": "integer", - "minimum": 1, - "maximum": 7680 - }, - "height": { - "description": "Partial frame video height in pixels.", - "type": "integer", - "minimum": 1, - "maximum": 4320 - }, - "horizontalOffset": { - "description": "Partial frame video horizontal offset in pixels.", - "type": "integer", - "minimum": 0, - "maximum": 7680 - }, - "verticalOffset": { - "description": "Partial frame video vertical offset in pixels.", - "type": "integer", - "minimum": 0, - "maximum": 4320 + "required": [ "type" ] + }, + "videoAttributes": { + "type": "object", + "properties": { + "sampling": { + "description": "Video color sampling type.", + "type": "string", + "enum": [ + "YCbCr-4:2:2", + "YCbCrA-4:2:2:4", + "YCbCr-4:4:4", + "RGB" + ] + }, + "depth": { + "description": "Video pixel bit depth.", + "type": "integer", + "enum": [ + 8, + 16 + ] + }, + "width": { + "description": "Video picture width in pixels.", + "type": "integer", + "minimum": 1, + "maximum": 7680 + }, + "height": { + "description": "Video picture height in pixels.", + "type": "integer", + "minimum": 1, + "maximum": 4320 + }, + "exactframerate": { + "description": "Video frame-rate numerator/denominator.", + "type": "string", + "pattern": "^\\d+:\\d+$" + }, + "colorimetry": { + "description": "Video colorimetry.", + "type": "string", + "enum": [ + "BT601", + "BT709", + "BT2020", + "BT2100", + "ST2065-1", + "ST2065-3", + "XYZ" + ] + }, + "interlace": { + "description": "If true video is interlaced, otherwise video is progressive.", + "type": "boolean" + }, + "segmented": { + "description": "If true video is segmented.", + "type": "boolean" + }, + "TCS": { + "description": "SMPTE 2110-20 Media type parameters for Transfer Characteristic System.", + "type": "string", + "enum": [ + "SDR", + "PQ", + "HLG", + "LINEAR", + "BT2100LINPQ", + "BT2100LINHLG", + "ST2065-1", + "ST428-1", + "DENSITY" + ] + }, + "RANGE": { + "description": "SMPTE 2110-20 Media type parameter for setting encoding range.", + "type": "string", + "enum": [ + "NARROW", + "FULL", + "FULLPROTECT" + ] + }, + "PAR": { + "description": "Pixel Aspect Ratio (PAR) width:height.", + "type": "string", + "pattern": "^\\d+:\\d+$" + }, + "alphaIncluded": { + "description": "If true alpha channel is included.", + "type": "boolean" + }, + "partialFrame": { + "description": "Partial frame video size and offset.", + "type": "object", + "properties": { + "width": { + "description": "Partial frame video width in pixels.", + "type": "integer", + "minimum": 1, + "maximum": 7680 + }, + "height": { + "description": "Partial frame video height in pixels.", + "type": "integer", + "minimum": 1, + "maximum": 4320 + }, + "horizontalOffset": { + "description": "Partial frame video horizontal offset in pixels.", + "type": "integer", + "minimum": 0, + "maximum": 7680 + }, + "verticalOffset": { + "description": "Partial frame video vertical offset in pixels.", + "type": "integer", + "minimum": 0, + "maximum": 4320 + } } } } - } - }, - "audioAttributes": { - "type": "object", - "properties": { - "activeChannels": { - "description": "Total number of active audio channels. Can vary, but cannot exceed totalChannels.", - "type": "integer", - "minimum": 1, - "maximum": 256 - }, - "channelOrder": { - "description": "SMPTE 2110-30 Uncompressed audio channel groupings.", - "type": "string", - "enum": [ - "SMPTE2110.(M)", - "SMPTE2110.(DM)", - "SMPTE2110.(ST)", - "SMPTE2110.(LtRt)", - "SMPTE2110.(51)", - "SMPTE2110.(71)", - "SMPTE2110.(222)", - "SMPTE2110.(SGRP)" - ] - }, - "language": { - "description": "Two or three letter audio language code.", - "type": "string" - }, - "depth": { - "description": "Bit depth of the audio samples.", - "type": "integer", - "enum": [ - 32 - ] - }, - "originalDepth": { - "description": "Original bit depth of the audio samples.", - "type": "integer", - "minimum": 0 - }, - "sampleCount": { - "description": "Number of audio samples included in each audio channel.", - "type": "integer", - "minimum": 0 + }, + "audioAttributes": { + "type": "object", + "properties": { + "activeChannels": { + "description": "Total number of active audio channels. Can vary, but cannot exceed totalChannels.", + "type": "integer", + "minimum": 1, + "maximum": 256 + }, + "channelOrder": { + "description": "SMPTE 2110-30 Uncompressed audio channel groupings.", + "type": "string", + "enum": [ + "SMPTE2110.(M)", + "SMPTE2110.(DM)", + "SMPTE2110.(ST)", + "SMPTE2110.(LtRt)", + "SMPTE2110.(51)", + "SMPTE2110.(71)", + "SMPTE2110.(222)", + "SMPTE2110.(SGRP)" + ] + }, + "language": { + "description": "Two or three letter audio language code.", + "type": "string" + }, + "depth": { + "description": "Bit depth of the audio samples.", + "type": "integer", + "enum": [ + 32 + ] + }, + "originalDepth": { + "description": "Original bit depth of the audio samples.", + "type": "integer", + "minimum": 0 + }, + "sampleCount": { + "description": "Number of audio samples included in each audio channel.", + "type": "integer", + "minimum": 0 + } } - } - }, - "ancillaryDataAttributes": { - "type": "object", - "properties": { - "encodingName": { - "description": "The only ancillary-data option is rfc8331.", - "type": "string", - "const": "rfc8331", - "packetCount": { - "description": "Number of ANC packets being transported. If there is no ANC data to be transmitted in a given period, the header shall still be sent in a timely manner indicating a count of zero.", - "type": "integer" - }, - "interlace": { - "description": "If true video is interlaced, otherwise video is progressive.", - "type": "boolean" - }, - "field": { - "description": "Zero or one. For interlaced, zero= first field, one= second field. For progressive, shall be set to zero, except in the case of progressive segmented frame data where it indicates the segment.", - "type": "integer", - "minimum": 0, - "maximum": 1 - }, - "lumaChannel": { - "description": "Whether the ANC data corresponds to the luma (Y) channel or not.", - "type": "boolean" - }, - "lineNumber": { - "description": "Optional. The interface line number of the ANC data (in cases where legacy location is not required, users are encouraged to use the location-free indicators specified in RFC8331).", - "type": "integer" - }, - "DID": { - "description": "Optional. Data Identifier Word that indicates the type of ancillary data that the packet corresponds to.", - "type": "integer" - }, - "SDID": { - "description": "Optional. Secondary Data Identifier (8-bit value). Valid if DID is less than 128.", - "type": "integer" - }, - "dataWordCount": { - "description": "Number of data words for each ANC packet. Note: The horizontal offset and stream number, which are present in the RFC, are not used here.", - "type": "integer" + }, + "ancillaryDataAttributes": { + "type": "object", + "properties": { + "encodingName": { + "description": "The only ancillary-data option is rfc8331.", + "type": "string", + "const": "rfc8331", + "packetCount": { + "description": "Number of ANC packets being transported. If there is no ANC data to be transmitted in a given period, the header shall still be sent in a timely manner indicating a count of zero.", + "type": "integer" + }, + "interlace": { + "description": "If true video is interlaced, otherwise video is progressive.", + "type": "boolean" + }, + "field": { + "description": "Zero or one. For interlaced, zero= first field, one= second field. For progressive, shall be set to zero, except in the case of progressive segmented frame data where it indicates the segment.", + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "lumaChannel": { + "description": "Whether the ANC data corresponds to the luma (Y) channel or not.", + "type": "boolean" + }, + "lineNumber": { + "description": "Optional. The interface line number of the ANC data (in cases where legacy location is not required, users are encouraged to use the location-free indicators specified in RFC8331).", + "type": "integer" + }, + "DID": { + "description": "Optional. Data Identifier Word that indicates the type of ancillary data that the packet corresponds to.", + "type": "integer" + }, + "SDID": { + "description": "Optional. Secondary Data Identifier (8-bit value). Valid if DID is less than 128.", + "type": "integer" + }, + "dataWordCount": { + "description": "Number of data words for each ANC packet. Note: The horizontal offset and stream number, which are present in the RFC, are not used here.", + "type": "integer" + } } } } } } -} \ No newline at end of file From 4de81b47216529f20472ff0a616b576e35eef549 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Tue, 4 Feb 2025 16:18:56 +0000 Subject: [PATCH 23/29] added types for frame rate and aspect ratio --- payload_schema.json | 52 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/payload_schema.json b/payload_schema.json index 84fdf42..d38b289 100644 --- a/payload_schema.json +++ b/payload_schema.json @@ -18,6 +18,12 @@ "type": "object", "$ref": "#/$defs/timestamp" }, + "aspect_ratio": { + "$ref": "#/$defs/timestamp" + }, + "frame_rate": { + "$ref": "#/$defs/frame_rate" + }, "transportParameters" : { "type": "object", "description": "Transport specific parameters" @@ -36,7 +42,45 @@ }, "required": [ "gccgVersion", "timing", "mediaFlow" ], "$defs": { - "timestamp": { + "aspect_ratio": { + "type": "object", + "properties": { + "x": { + "type": "integer", + "minimum": 0, + "maximum": 1000 + }, + "y": { + "type": "integer", + "minimum": 0, + "maximum": 1000 + } + }, + "required": [ + "x", + "y" + ] + }, + "frame_rate": { + "type": "object", + "properties": { + "num": { + "type": "integer", + "minimum": 1, + "maximum": 1000 + }, + "denom": { + "type": "integer", + "minimum": 1, + "maximum": 1000 + } + }, + "required": [ + "num", + "denom" + ] + }, + "timestamp": { "type": "object", "properties": { "seconds": { @@ -163,8 +207,7 @@ }, "exactframerate": { "description": "Video frame-rate numerator/denominator.", - "type": "string", - "pattern": "^\\d+:\\d+$" + "$ref": "#/$defs/frame_rate" }, "colorimetry": { "description": "Video colorimetry.", @@ -213,8 +256,7 @@ }, "PAR": { "description": "Pixel Aspect Ratio (PAR) width:height.", - "type": "string", - "pattern": "^\\d+:\\d+$" + "$ref": "#/$defs/aspect_ratio" }, "alphaIncluded": { "description": "If true alpha channel is included.", From e1dd240c557856ecc76bacd668bc2358b5ed980f Mon Sep 17 00:00:00 2001 From: David Atkins Date: Wed, 5 Feb 2025 06:37:34 +0000 Subject: [PATCH 24/29] added planar mode, thsi maybe temporary while we get testing completed, --- payload_schema.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/payload_schema.json b/payload_schema.json index d38b289..72a0c60 100644 --- a/payload_schema.json +++ b/payload_schema.json @@ -137,10 +137,14 @@ }, "encodingName": { "description": "Encoding options are from the IANA registered media types. See https://www.iana.org/assignments/media-types/media-types.xhtml", + "type": "string" + }, + "planarMode": { + "description": "which planar mode is used, full frame where all Y is followed by All U etc, only if not segmented, or line where Y for lines is followed by U for line etc, required for segmented mode", "type": "string", "enum": [ - "pcm", - "planar" + "full", + "line" ] }, "clockRate": { From 20f402710cfa0ba248bb59cedc237740fd913833 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Wed, 5 Feb 2025 06:38:27 +0000 Subject: [PATCH 25/29] updated default state --- payload_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/payload_schema.json b/payload_schema.json index 72a0c60..39759fc 100644 --- a/payload_schema.json +++ b/payload_schema.json @@ -140,7 +140,7 @@ "type": "string" }, "planarMode": { - "description": "which planar mode is used, full frame where all Y is followed by All U etc, only if not segmented, or line where Y for lines is followed by U for line etc, required for segmented mode", + "description": "which planar mode is used, default is full frame where all Y is followed by All U etc, only if not segmented, or line where Y for lines is followed by U for line etc, required for segmented mode", "type": "string", "enum": [ "full", From 255dc677cdf71674cee4233b3899d43aa024dc24 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Thu, 6 Feb 2025 16:37:09 +0000 Subject: [PATCH 26/29] Added monotonic flag to the timing section, --- payload_schema.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/payload_schema.json b/payload_schema.json index 39759fc..2a8eeef 100644 --- a/payload_schema.json +++ b/payload_schema.json @@ -116,6 +116,10 @@ "t99Accumulated": { "description": "Accumulated maximum latency of the Workflow path up to this Workflow Step, in milliseconds. Can change but the change is disruptive to the Workflow timing while the Workflow adapts.", "type": "integer" + }, + "monotonic": { + "description": "Set to true indicates that the timestamps are increasing, when false payload buffers can arrive out of time order", + "type": "boolean" } } }, From ff5f20a56bf6b85d0a8ffb4ac8640f30ce166c4b Mon Sep 17 00:00:00 2001 From: David Atkins Date: Mon, 10 Feb 2025 06:50:32 +0000 Subject: [PATCH 27/29] notes on transmission order added --- README.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4edf900..213dec4 100644 --- a/README.md +++ b/README.md @@ -64,11 +64,11 @@ Raw (uncompressed) video data is stored in pgroup format as defined in ST2110-20 ``` 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | C’B (10 bits) | Y0’ (10 bits) | C’R (10 bits) | Y1’ (10 bits) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ``` - + The value "raw" must be used for the JSON configuration "encodingName" element as shown below: ``` "encodingName": "raw" @@ -77,7 +77,7 @@ The value "raw" must be used for the JSON configuration "encodingName" element a # Compressed Video Data Formats They shall be indentified by using the Internet Assigned Numbers Authority (IANA) video name strings, which can be found at https://www.iana.org/assignments/media-types/media-types.xhtml#video, for the JSON configuration "encodingName" element. - + An example for H.264 compressed video is shown below: ``` @@ -128,3 +128,10 @@ The section below is repeated once for each ancillary data packet, as specified | Checksum_Word |word_align | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ``` + +# Transmission Order +Payload buffers will be transmitted in the order in which the GccgTxPayload() function is called and then delivered to the recieve callback in the same order + +The API is not responsible for re-ordering of payload buffers using timestamps, this is the responsibility of the user of the API to trasnmit in the correct order or re-order on reciept. + + From 9087e1fd90b29445232ae70808c87a2f0c9553e9 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Thu, 13 Feb 2025 13:15:30 +0000 Subject: [PATCH 28/29] moved uri --- payload_schema.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/payload_schema.json b/payload_schema.json index 2a8eeef..04fc21e 100644 --- a/payload_schema.json +++ b/payload_schema.json @@ -26,7 +26,11 @@ }, "transportParameters" : { "type": "object", - "description": "Transport specific parameters" + "description": "Transport specific parameters", + "uri": { + "description": "URI to locate resource", + "type": "string" + } }, "mediaFlow": { "type": "object", @@ -135,10 +139,6 @@ "ancillary-data" ] }, - "uri": { - "description": "URI to locate resource", - "type": "string" - }, "encodingName": { "description": "Encoding options are from the IANA registered media types. See https://www.iana.org/assignments/media-types/media-types.xhtml", "type": "string" From 93c943484e9f45f7b1be484f3ce89deb722028d5 Mon Sep 17 00:00:00 2001 From: David Atkins Date: Tue, 18 Mar 2025 18:15:21 +0000 Subject: [PATCH 29/29] use den not denom --- payload_schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/payload_schema.json b/payload_schema.json index 04fc21e..8d61063 100644 --- a/payload_schema.json +++ b/payload_schema.json @@ -73,7 +73,7 @@ "minimum": 1, "maximum": 1000 }, - "denom": { + "den": { "type": "integer", "minimum": 1, "maximum": 1000 @@ -81,7 +81,7 @@ }, "required": [ "num", - "denom" + "den" ] }, "timestamp": {