{
    "smithy": "1.0",
    "metadata": {
        "suppressions": [
            {
                "id": "HttpMethodSemantics",
                "namespace": "*"
            },
            {
                "id": "HttpResponseCodeSemantics",
                "namespace": "*"
            },
            {
                "id": "PaginatedTrait",
                "namespace": "*"
            },
            {
                "id": "HttpHeaderTrait",
                "namespace": "*"
            },
            {
                "id": "HttpUriConflict",
                "namespace": "*"
            },
            {
                "id": "Service",
                "namespace": "*"
            }
        ]
    },
    "shapes": {
        "com.amazonaws.kinesisvideomedia#AWSAcuityInletService": {
            "type": "service",
            "version": "2017-09-30",
            "operations": [
                {
                    "target": "com.amazonaws.kinesisvideomedia#GetMedia"
                }
            ],
            "traits": {
                "aws.api#service": {
                    "sdkId": "Kinesis Video Media",
                    "arnNamespace": "kinesisvideo",
                    "cloudFormationName": "KinesisVideoMedia",
                    "cloudTrailEventSource": "kinesisvideomedia.amazonaws.com",
                    "endpointPrefix": "kinesisvideo"
                },
                "aws.auth#sigv4": {
                    "name": "kinesisvideo"
                },
                "aws.protocols#restJson1": {},
                "smithy.api#documentation": "<p></p>",
                "smithy.api#title": "Amazon Kinesis Video Streams Media"
            }
        },
        "com.amazonaws.kinesisvideomedia#ClientLimitExceededException": {
            "type": "structure",
            "members": {
                "Message": {
                    "target": "com.amazonaws.kinesisvideomedia#ErrorMessage"
                }
            },
            "traits": {
                "smithy.api#documentation": "<p>Kinesis Video Streams has throttled the request because you have exceeded the limit of\n      allowed client calls. Try making the call later.</p>",
                "smithy.api#error": "client",
                "smithy.api#httpError": 400
            }
        },
        "com.amazonaws.kinesisvideomedia#ConnectionLimitExceededException": {
            "type": "structure",
            "members": {
                "Message": {
                    "target": "com.amazonaws.kinesisvideomedia#ErrorMessage"
                }
            },
            "traits": {
                "smithy.api#documentation": "<p>Kinesis Video Streams has throttled the request because you have exceeded the limit of\n      allowed client connections.</p>",
                "smithy.api#error": "client",
                "smithy.api#httpError": 400
            }
        },
        "com.amazonaws.kinesisvideomedia#ContentType": {
            "type": "string",
            "traits": {
                "smithy.api#length": {
                    "min": 1,
                    "max": 128
                },
                "smithy.api#pattern": "^[a-zA-Z0-9_\\.\\-]+$"
            }
        },
        "com.amazonaws.kinesisvideomedia#ContinuationToken": {
            "type": "string",
            "traits": {
                "smithy.api#length": {
                    "min": 1,
                    "max": 128
                },
                "smithy.api#pattern": "^[a-zA-Z0-9_\\.\\-]+$"
            }
        },
        "com.amazonaws.kinesisvideomedia#ErrorMessage": {
            "type": "string"
        },
        "com.amazonaws.kinesisvideomedia#FragmentNumberString": {
            "type": "string",
            "traits": {
                "smithy.api#length": {
                    "min": 1,
                    "max": 128
                },
                "smithy.api#pattern": "^[0-9]+$"
            }
        },
        "com.amazonaws.kinesisvideomedia#GetMedia": {
            "type": "operation",
            "input": {
                "target": "com.amazonaws.kinesisvideomedia#GetMediaInput"
            },
            "output": {
                "target": "com.amazonaws.kinesisvideomedia#GetMediaOutput"
            },
            "errors": [
                {
                    "target": "com.amazonaws.kinesisvideomedia#ClientLimitExceededException"
                },
                {
                    "target": "com.amazonaws.kinesisvideomedia#ConnectionLimitExceededException"
                },
                {
                    "target": "com.amazonaws.kinesisvideomedia#InvalidArgumentException"
                },
                {
                    "target": "com.amazonaws.kinesisvideomedia#InvalidEndpointException"
                },
                {
                    "target": "com.amazonaws.kinesisvideomedia#NotAuthorizedException"
                },
                {
                    "target": "com.amazonaws.kinesisvideomedia#ResourceNotFoundException"
                }
            ],
            "traits": {
                "smithy.api#documentation": "<p> Use this API to retrieve media content from a Kinesis video stream. In the request,\n      you identify the stream name or stream Amazon Resource Name (ARN), and the starting chunk.\n      Kinesis Video Streams then returns a stream of chunks in order by fragment number.</p>\n         <note>\n            <p>You must first call the <code>GetDataEndpoint</code> API to get an endpoint. Then\n        send the <code>GetMedia</code> requests to this endpoint using the <a href=\"https://docs.aws.amazon.com/cli/latest/reference/\">--endpoint-url parameter</a>.\n      </p>\n         </note>\n         <p>When you put media data (fragments) on a stream, Kinesis Video Streams stores each\n      incoming fragment and related metadata in what is called a \"chunk.\" For more information, see\n        <a href=\"https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_dataplane_PutMedia.html\">PutMedia</a>. The <code>GetMedia</code> API returns a stream of these chunks starting\n      from the chunk that you specify in the request. </p>\n         <p>The following limits apply when using the <code>GetMedia</code> API:</p>\n         <ul>\n            <li>\n               <p>A client can call <code>GetMedia</code> up to five times per second per stream.\n        </p>\n            </li>\n            <li>\n               <p>Kinesis Video Streams sends media data at a rate of up to 25 megabytes per second\n          (or 200 megabits per second) during a <code>GetMedia</code> session. </p>\n            </li>\n         </ul>\n\n         <note>\n            <p>If an error is thrown after invoking a Kinesis Video Streams media API, in addition to\n        the HTTP status code and the response body, it includes the following pieces of information: </p>\n            <ul>\n               <li>\n                  <p>\n                     <code>x-amz-ErrorType</code> HTTP header – contains a more specific error type in\n            addition to what the HTTP status code provides. </p>\n               </li>\n               <li>\n                  <p>\n                     <code>x-amz-RequestId</code> HTTP header – if you want to report an issue to AWS,\n            the support team can better diagnose the problem if given the Request Id.</p>\n               </li>\n            </ul>\n            <p>Both the HTTP status code and the ErrorType header can be utilized to make programmatic\n        decisions about whether errors are retry-able and under what conditions, as well as provide\n        information on what actions the client programmer might need to take in order to\n        successfully try again.</p>\n            <p>For more information, see the <b>Errors</b> section at the\n        bottom of this topic, as well as <a href=\"https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/CommonErrors.html\">Common Errors</a>. </p>\n         </note>",
                "smithy.api#http": {
                    "method": "POST",
                    "uri": "/getMedia",
                    "code": 200
                }
            }
        },
        "com.amazonaws.kinesisvideomedia#GetMediaInput": {
            "type": "structure",
            "members": {
                "StreamName": {
                    "target": "com.amazonaws.kinesisvideomedia#StreamName",
                    "traits": {
                        "smithy.api#documentation": "<p>The Kinesis video stream name from where you want to get the media content. If you\n      don't specify the <code>streamName</code>, you must specify the\n      <code>streamARN</code>.</p>"
                    }
                },
                "StreamARN": {
                    "target": "com.amazonaws.kinesisvideomedia#ResourceARN",
                    "traits": {
                        "smithy.api#documentation": "<p>The ARN of the stream from where you want to get the media content. If you don't\n      specify the <code>streamARN</code>, you must specify the <code>streamName</code>.</p>"
                    }
                },
                "StartSelector": {
                    "target": "com.amazonaws.kinesisvideomedia#StartSelector",
                    "traits": {
                        "smithy.api#documentation": "<p>Identifies the starting chunk to get from the specified stream. </p>",
                        "smithy.api#required": {}
                    }
                }
            }
        },
        "com.amazonaws.kinesisvideomedia#GetMediaOutput": {
            "type": "structure",
            "members": {
                "ContentType": {
                    "target": "com.amazonaws.kinesisvideomedia#ContentType",
                    "traits": {
                        "smithy.api#documentation": "<p>The content type of the requested media.</p>",
                        "smithy.api#httpHeader": "Content-Type"
                    }
                },
                "Payload": {
                    "target": "com.amazonaws.kinesisvideomedia#Payload",
                    "traits": {
                        "smithy.api#documentation": "<p> The payload Kinesis Video Streams returns is a sequence of chunks from the specified\n      stream. For information about the chunks, see . The\n      chunks that Kinesis Video Streams returns in the <code>GetMedia</code> call also include the\n      following additional Matroska (MKV) tags: </p>\n         <ul>\n            <li>\n               <p>AWS_KINESISVIDEO_CONTINUATION_TOKEN (UTF-8 string) - In the event your\n            <code>GetMedia</code> call terminates, you can use this continuation token in your next\n          request to get the next chunk where the last request terminated.</p>\n            </li>\n            <li>\n               <p>AWS_KINESISVIDEO_MILLIS_BEHIND_NOW (UTF-8 string) - Client applications can use\n          this tag value to determine how far behind the chunk returned in the response is from the\n          latest chunk on the stream. </p>\n            </li>\n            <li>\n               <p>AWS_KINESISVIDEO_FRAGMENT_NUMBER - Fragment number returned in the chunk.</p>\n            </li>\n            <li>\n               <p>AWS_KINESISVIDEO_SERVER_TIMESTAMP - Server timestamp of the fragment.</p>\n            </li>\n            <li>\n               <p>AWS_KINESISVIDEO_PRODUCER_TIMESTAMP - Producer timestamp of the fragment.</p>\n            </li>\n         </ul>\n         <p>The following tags will be present if an error occurs:</p>\n         <ul>\n            <li>\n               <p>AWS_KINESISVIDEO_ERROR_CODE - String description of an error that caused GetMedia\n          to stop.</p>\n            </li>\n            <li>\n               <p>AWS_KINESISVIDEO_ERROR_ID: Integer code of the error.</p>\n            </li>\n         </ul>\n         <p>The error codes are as follows:</p>\n         <ul>\n            <li>\n               <p>3002 - Error writing to the stream</p>\n            </li>\n            <li>\n               <p>4000 - Requested fragment is not found</p>\n            </li>\n            <li>\n               <p>4500 - Access denied for the stream's KMS key</p>\n            </li>\n            <li>\n               <p>4501 - Stream's KMS key is disabled</p>\n            </li>\n            <li>\n               <p>4502 - Validation error on the stream's KMS key</p>\n            </li>\n            <li>\n               <p>4503 - KMS key specified in the stream is unavailable</p>\n            </li>\n            <li>\n               <p>4504 - Invalid usage of the KMS key specified in the stream</p>\n            </li>\n            <li>\n               <p>4505 - Invalid state of the KMS key specified in the stream</p>\n            </li>\n            <li>\n               <p>4506 - Unable to find the KMS key specified in the stream</p>\n            </li>\n            <li>\n               <p>5000 - Internal error</p>\n            </li>\n         </ul>",
                        "smithy.api#httpPayload": {}
                    }
                }
            }
        },
        "com.amazonaws.kinesisvideomedia#InvalidArgumentException": {
            "type": "structure",
            "members": {
                "Message": {
                    "target": "com.amazonaws.kinesisvideomedia#ErrorMessage"
                }
            },
            "traits": {
                "smithy.api#documentation": "<p>The value for this input parameter is invalid.</p>",
                "smithy.api#error": "client",
                "smithy.api#httpError": 400
            }
        },
        "com.amazonaws.kinesisvideomedia#InvalidEndpointException": {
            "type": "structure",
            "members": {
                "Message": {
                    "target": "com.amazonaws.kinesisvideomedia#ErrorMessage"
                }
            },
            "traits": {
                "smithy.api#documentation": "<p> Status Code: 400, Caller used wrong endpoint to write data to a stream. On receiving\n      such an exception, the user must call <code>GetDataEndpoint</code> with\n        <code>AccessMode</code> set to \"READ\" and use the endpoint Kinesis Video returns in the next\n        <code>GetMedia</code> call. </p>",
                "smithy.api#error": "client",
                "smithy.api#httpError": 400
            }
        },
        "com.amazonaws.kinesisvideomedia#NotAuthorizedException": {
            "type": "structure",
            "members": {
                "Message": {
                    "target": "com.amazonaws.kinesisvideomedia#ErrorMessage"
                }
            },
            "traits": {
                "smithy.api#documentation": "<p>Status Code: 403, The caller is not authorized to perform an operation on the given\n      stream, or the token has expired.</p>",
                "smithy.api#error": "client",
                "smithy.api#httpError": 401
            }
        },
        "com.amazonaws.kinesisvideomedia#Payload": {
            "type": "blob",
            "traits": {
                "smithy.api#streaming": {}
            }
        },
        "com.amazonaws.kinesisvideomedia#ResourceARN": {
            "type": "string",
            "traits": {
                "smithy.api#length": {
                    "min": 1,
                    "max": 1024
                },
                "smithy.api#pattern": "arn:aws:kinesisvideo:[a-z0-9-]+:[0-9]+:[a-z]+/[a-zA-Z0-9_.-]+/[0-9]+"
            }
        },
        "com.amazonaws.kinesisvideomedia#ResourceNotFoundException": {
            "type": "structure",
            "members": {
                "Message": {
                    "target": "com.amazonaws.kinesisvideomedia#ErrorMessage"
                }
            },
            "traits": {
                "smithy.api#documentation": "<p>Status Code: 404, The stream with the given name does not exist.</p>",
                "smithy.api#error": "client",
                "smithy.api#httpError": 404
            }
        },
        "com.amazonaws.kinesisvideomedia#StartSelector": {
            "type": "structure",
            "members": {
                "StartSelectorType": {
                    "target": "com.amazonaws.kinesisvideomedia#StartSelectorType",
                    "traits": {
                        "smithy.api#documentation": "<p>Identifies the fragment on the Kinesis video stream where you want to start getting the\n      data from.</p>\n         <ul>\n            <li>\n               <p>NOW - Start with the latest chunk on the stream.</p>\n            </li>\n            <li>\n               <p>EARLIEST - Start with earliest available chunk on the stream.</p>\n            </li>\n            <li>\n               <p>FRAGMENT_NUMBER - Start with the chunk after a specific fragment. You must also\n          specify the <code>AfterFragmentNumber</code> parameter.</p>\n            </li>\n            <li>\n               <p>PRODUCER_TIMESTAMP or SERVER_TIMESTAMP - Start with the chunk containing a fragment\n          with the specified producer or server timestamp. You specify the timestamp by adding\n            <code>StartTimestamp</code>.</p>\n            </li>\n            <li>\n               <p> CONTINUATION_TOKEN - Read using the specified continuation token. </p>\n            </li>\n         </ul>\n         <note>\n            <p>If you choose the NOW, EARLIEST, or CONTINUATION_TOKEN as the\n          <code>startSelectorType</code>, you don't provide any additional information in the\n          <code>startSelector</code>.</p>\n         </note>",
                        "smithy.api#required": {}
                    }
                },
                "AfterFragmentNumber": {
                    "target": "com.amazonaws.kinesisvideomedia#FragmentNumberString",
                    "traits": {
                        "smithy.api#documentation": "<p>Specifies the fragment number from where you want the <code>GetMedia</code> API to\n      start returning the fragments. </p>"
                    }
                },
                "StartTimestamp": {
                    "target": "com.amazonaws.kinesisvideomedia#Timestamp",
                    "traits": {
                        "smithy.api#documentation": "<p>A timestamp value. This value is required if you choose the PRODUCER_TIMESTAMP or the\n      SERVER_TIMESTAMP as the <code>startSelectorType</code>. The <code>GetMedia</code> API then\n      starts with the chunk containing the fragment that has the specified timestamp.</p>"
                    }
                },
                "ContinuationToken": {
                    "target": "com.amazonaws.kinesisvideomedia#ContinuationToken",
                    "traits": {
                        "smithy.api#documentation": "<p>Continuation token that Kinesis Video Streams returned in the previous\n        <code>GetMedia</code> response. The <code>GetMedia</code> API then starts with the chunk\n      identified by the continuation token.</p>"
                    }
                }
            },
            "traits": {
                "smithy.api#documentation": "<p>Identifies the chunk on the Kinesis video stream where you want the\n        <code>GetMedia</code> API to start returning media data. You have the following options to\n      identify the starting chunk: </p>\n         <ul>\n            <li>\n               <p>Choose the latest (or oldest) chunk.</p>\n            </li>\n            <li>\n               <p>Identify a specific chunk. You can identify a specific chunk either by providing a\n          fragment number or timestamp (server or producer). </p>\n            </li>\n            <li>\n               <p>Each chunk's metadata includes a continuation token as a Matroska (MKV) tag\n            (<code>AWS_KINESISVIDEO_CONTINUATION_TOKEN</code>). If your previous\n            <code>GetMedia</code> request terminated, you can use this tag value in your next\n            <code>GetMedia</code> request. The API then starts returning chunks starting where the\n          last API ended.</p>\n            </li>\n         </ul>"
            }
        },
        "com.amazonaws.kinesisvideomedia#StartSelectorType": {
            "type": "string",
            "traits": {
                "smithy.api#enum": [
                    {
                        "value": "FRAGMENT_NUMBER",
                        "name": "FRAGMENT_NUMBER"
                    },
                    {
                        "value": "SERVER_TIMESTAMP",
                        "name": "SERVER_TIMESTAMP"
                    },
                    {
                        "value": "PRODUCER_TIMESTAMP",
                        "name": "PRODUCER_TIMESTAMP"
                    },
                    {
                        "value": "NOW",
                        "name": "NOW"
                    },
                    {
                        "value": "EARLIEST",
                        "name": "EARLIEST"
                    },
                    {
                        "value": "CONTINUATION_TOKEN",
                        "name": "CONTINUATION_TOKEN"
                    }
                ]
            }
        },
        "com.amazonaws.kinesisvideomedia#StreamName": {
            "type": "string",
            "traits": {
                "smithy.api#length": {
                    "min": 1,
                    "max": 256
                },
                "smithy.api#pattern": "[a-zA-Z0-9_.-]+"
            }
        },
        "com.amazonaws.kinesisvideomedia#Timestamp": {
            "type": "timestamp"
        }
    }
}
