/* * Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with * the License. A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ package com.amazonaws.services.kinesisvideo; import org.w3c.dom.*; import java.net.*; import java.util.*; import javax.annotation.Generated; import org.apache.commons.logging.*; import com.amazonaws.*; import com.amazonaws.annotation.SdkInternalApi; import com.amazonaws.auth.*; import com.amazonaws.handlers.*; import com.amazonaws.http.*; import com.amazonaws.internal.*; import com.amazonaws.internal.auth.*; import com.amazonaws.metrics.*; import com.amazonaws.regions.*; import com.amazonaws.transform.*; import com.amazonaws.util.*; import com.amazonaws.protocol.json.*; import com.amazonaws.util.AWSRequestMetrics.Field; import com.amazonaws.annotation.ThreadSafe; import com.amazonaws.client.AwsSyncClientParams; import com.amazonaws.client.builder.AdvancedConfig; import com.amazonaws.services.kinesisvideo.AmazonKinesisVideoArchivedMediaClientBuilder; import com.amazonaws.util.ServiceClientHolderInputStream; import com.amazonaws.AmazonServiceException; import com.amazonaws.services.kinesisvideo.model.*; import com.amazonaws.services.kinesisvideo.model.transform.*; /** * Client for accessing Kinesis Video Archived Media. All service calls made using this client are blocking, and will * not return until the service call completes. *

*

*/ @ThreadSafe @Generated("com.amazonaws:aws-java-sdk-code-generator") public class AmazonKinesisVideoArchivedMediaClient extends AmazonWebServiceClient implements AmazonKinesisVideoArchivedMedia { /** Provider for AWS credentials. */ private final AWSCredentialsProvider awsCredentialsProvider; private static final Log log = LogFactory.getLog(AmazonKinesisVideoArchivedMedia.class); /** Default signing name for the service. */ private static final String DEFAULT_SIGNING_NAME = "kinesisvideo"; /** Client configuration factory providing ClientConfigurations tailored to this client */ protected static final ClientConfigurationFactory configFactory = new ClientConfigurationFactory(); private final AdvancedConfig advancedConfig; private static final com.amazonaws.protocol.json.SdkJsonProtocolFactory protocolFactory = new com.amazonaws.protocol.json.SdkJsonProtocolFactory( new JsonClientMetadata() .withProtocolVersion("1.1") .withSupportsCbor(false) .withSupportsIon(false) .withContentTypeOverride("application/json") .addErrorMetadata( new JsonErrorShapeMetadata().withErrorCode("NotAuthorizedException").withExceptionUnmarshaller( com.amazonaws.services.kinesisvideo.model.transform.NotAuthorizedExceptionUnmarshaller.getInstance())) .addErrorMetadata( new JsonErrorShapeMetadata().withErrorCode("InvalidCodecPrivateDataException").withExceptionUnmarshaller( com.amazonaws.services.kinesisvideo.model.transform.InvalidCodecPrivateDataExceptionUnmarshaller.getInstance())) .addErrorMetadata( new JsonErrorShapeMetadata().withErrorCode("InvalidArgumentException").withExceptionUnmarshaller( com.amazonaws.services.kinesisvideo.model.transform.InvalidArgumentExceptionUnmarshaller.getInstance())) .addErrorMetadata( new JsonErrorShapeMetadata().withErrorCode("ClientLimitExceededException").withExceptionUnmarshaller( com.amazonaws.services.kinesisvideo.model.transform.ClientLimitExceededExceptionUnmarshaller.getInstance())) .addErrorMetadata( new JsonErrorShapeMetadata().withErrorCode("NoDataRetentionException").withExceptionUnmarshaller( com.amazonaws.services.kinesisvideo.model.transform.NoDataRetentionExceptionUnmarshaller.getInstance())) .addErrorMetadata( new JsonErrorShapeMetadata().withErrorCode("ResourceNotFoundException").withExceptionUnmarshaller( com.amazonaws.services.kinesisvideo.model.transform.ResourceNotFoundExceptionUnmarshaller.getInstance())) .addErrorMetadata( new JsonErrorShapeMetadata().withErrorCode("UnsupportedStreamMediaTypeException").withExceptionUnmarshaller( com.amazonaws.services.kinesisvideo.model.transform.UnsupportedStreamMediaTypeExceptionUnmarshaller.getInstance())) .addErrorMetadata( new JsonErrorShapeMetadata().withErrorCode("InvalidMediaFrameException").withExceptionUnmarshaller( com.amazonaws.services.kinesisvideo.model.transform.InvalidMediaFrameExceptionUnmarshaller.getInstance())) .addErrorMetadata( new JsonErrorShapeMetadata().withErrorCode("MissingCodecPrivateDataException").withExceptionUnmarshaller( com.amazonaws.services.kinesisvideo.model.transform.MissingCodecPrivateDataExceptionUnmarshaller.getInstance())) .withBaseServiceExceptionClass(com.amazonaws.services.kinesisvideo.model.AmazonKinesisVideoException.class)); public static AmazonKinesisVideoArchivedMediaClientBuilder builder() { return AmazonKinesisVideoArchivedMediaClientBuilder.standard(); } /** * Constructs a new client to invoke service methods on Kinesis Video Archived Media using the specified parameters. * *

* All service calls made using this new client object are blocking, and will not return until the service call * completes. * * @param clientParams * Object providing client parameters. */ AmazonKinesisVideoArchivedMediaClient(AwsSyncClientParams clientParams) { this(clientParams, false); } /** * Constructs a new client to invoke service methods on Kinesis Video Archived Media using the specified parameters. * *

* All service calls made using this new client object are blocking, and will not return until the service call * completes. * * @param clientParams * Object providing client parameters. */ AmazonKinesisVideoArchivedMediaClient(AwsSyncClientParams clientParams, boolean endpointDiscoveryEnabled) { super(clientParams); this.awsCredentialsProvider = clientParams.getCredentialsProvider(); this.advancedConfig = clientParams.getAdvancedConfig(); init(); } private void init() { setServiceNameIntern(DEFAULT_SIGNING_NAME); setEndpointPrefix(ENDPOINT_PREFIX); // calling this.setEndPoint(...) will also modify the signer accordingly setEndpoint("kinesisvideo.us-east-1.amazonaws.com"); HandlerChainFactory chainFactory = new HandlerChainFactory(); requestHandler2s.addAll(chainFactory.newRequestHandlerChain("/com/amazonaws/services/kinesisvideo/request.handlers")); requestHandler2s.addAll(chainFactory.newRequestHandler2Chain("/com/amazonaws/services/kinesisvideo/request.handler2s")); requestHandler2s.addAll(chainFactory.getGlobalHandlers()); } /** *

* Downloads an MP4 file (clip) containing the archived, on-demand media from the specified video stream over the * specified time range. *

*

* Both the StreamName and the StreamARN parameters are optional, but you must specify either the StreamName or the * StreamARN when invoking this API operation. *

*

* As a prerequisite to using GetCLip API, you must obtain an endpoint using GetDataEndpoint, * specifying GET_CLIP for the APIName parameter. *

*

* An Amazon Kinesis video stream has the following requirements for providing data through MP4: *

* *

* You can monitor the amount of outgoing data by monitoring the GetClip.OutgoingBytes Amazon * CloudWatch metric. For information about using CloudWatch to monitor Kinesis Video Streams, see Monitoring Kinesis Video * Streams. For pricing information, see Amazon * Kinesis Video Streams Pricing and AWS Pricing. Charges for * outgoing AWS data apply. *

* * @param getClipRequest * @return Result of the GetClip operation returned by the service. * @throws ResourceNotFoundException * GetMedia throws this error when Kinesis Video Streams can't find the stream that you * specified.

*

* GetHLSStreamingSessionURL and GetDASHStreamingSessionURL throw this error if a * session with a PlaybackMode of ON_DEMAND or LIVE_REPLAYis * requested for a stream that has no fragments within the requested time range, or if a session with a * PlaybackMode of LIVE is requested for a stream that has no fragments within the * last 30 seconds. * @throws InvalidArgumentException * A specified parameter exceeds its restrictions, is not supported, or can't be used. * @throws ClientLimitExceededException * Kinesis Video Streams has throttled the request because you have exceeded a limit. Try making the call * later. For information about limits, see Kinesis Video Streams * Limits. * @throws NotAuthorizedException * Status Code: 403, The caller is not authorized to perform an operation on the given stream, or the token * has expired. * @throws UnsupportedStreamMediaTypeException * The type of the media (for example, h.264 or h.265 video or ACC or G.711 audio) could not be determined * from the codec IDs of the tracks in the first fragment for a playback session. The codec ID for track 1 * should be V_MPEG/ISO/AVC and, optionally, the codec ID for track 2 should be * A_AAC. * @throws MissingCodecPrivateDataException * No codec private data was found in at least one of tracks of the video stream. * @throws InvalidCodecPrivateDataException * The codec private data in at least one of the tracks of the video stream is not valid for this operation. * @throws InvalidMediaFrameException * One or more frames in the requested clip could not be parsed based on the specified codec. * @throws NoDataRetentionException * A streaming session was requested for a stream that does not retain data (that is, has a * DataRetentionInHours of 0). * @sample AmazonKinesisVideoArchivedMedia.GetClip * @see AWS API Documentation */ @Override public GetClipResult getClip(GetClipRequest request) { request = beforeClientExecution(request); return executeGetClip(request); } @SdkInternalApi final GetClipResult executeGetClip(GetClipRequest getClipRequest) { ExecutionContext executionContext = createExecutionContext(getClipRequest); AWSRequestMetrics awsRequestMetrics = executionContext.getAwsRequestMetrics(); awsRequestMetrics.startEvent(Field.ClientExecuteTime); Request request = null; Response response = null; try { awsRequestMetrics.startEvent(Field.RequestMarshallTime); try { request = new GetClipRequestProtocolMarshaller(protocolFactory).marshall(super.beforeMarshalling(getClipRequest)); // Binds the request metrics to the current request. request.setAWSRequestMetrics(awsRequestMetrics); request.addHandlerContext(HandlerContextKey.CLIENT_ENDPOINT, endpoint); request.addHandlerContext(HandlerContextKey.ENDPOINT_OVERRIDDEN, isEndpointOverridden()); request.addHandlerContext(HandlerContextKey.SIGNING_REGION, getSigningRegion()); request.addHandlerContext(HandlerContextKey.SERVICE_ID, "Kinesis Video Archived Media"); request.addHandlerContext(HandlerContextKey.OPERATION_NAME, "GetClip"); request.addHandlerContext(HandlerContextKey.ADVANCED_CONFIG, advancedConfig); } finally { awsRequestMetrics.endEvent(Field.RequestMarshallTime); } HttpResponseHandler> responseHandler = protocolFactory.createResponseHandler(new JsonOperationMetadata() .withPayloadJson(false).withHasStreamingSuccessResponse(true), new GetClipResultJsonUnmarshaller()); response = invoke(request, responseHandler, executionContext); response.getAwsResponse().setPayload(new com.amazonaws.util.ServiceClientHolderInputStream(response.getAwsResponse().getPayload(), this)); request.addHandlerContext(HandlerContextKey.HAS_STREAMING_OUTPUT, Boolean.TRUE); return response.getAwsResponse(); } finally { endClientExecution(awsRequestMetrics, request, response); } } /** *

* Retrieves an MPEG Dynamic Adaptive Streaming over HTTP (DASH) URL for the stream. You can then open the URL in a * media player to view the stream contents. *

*

* Both the StreamName and the StreamARN parameters are optional, but you must specify * either the StreamName or the StreamARN when invoking this API operation. *

*

* An Amazon Kinesis video stream has the following requirements for providing data through MPEG-DASH: *

* *

* The following procedure shows how to use MPEG-DASH with Kinesis Video Streams: *

*
    *
  1. *

    * Get an endpoint using GetDataEndpoint, * specifying GET_DASH_STREAMING_SESSION_URL for the APIName parameter. *

    *
  2. *
  3. *

    * Retrieve the MPEG-DASH URL using GetDASHStreamingSessionURL. Kinesis Video Streams creates an * MPEG-DASH streaming session to be used for accessing content in a stream using the MPEG-DASH protocol. * GetDASHStreamingSessionURL returns an authenticated URL (that includes an encrypted session token) * for the session's MPEG-DASH manifest (the root resource needed for streaming with MPEG-DASH). *

    * *

    * Don't share or store this token where an unauthorized entity can access it. The token provides access to the * content of the stream. Safeguard the token with the same measures that you use with your AWS credentials. *

    *
    *

    * The media that is made available through the manifest consists only of the requested stream, time range, and * format. No other media data (such as frames outside the requested window or alternate bitrates) is made * available. *

    *
  4. *
  5. *

    * Provide the URL (containing the encrypted session token) for the MPEG-DASH manifest to a media player that * supports the MPEG-DASH protocol. Kinesis Video Streams makes the initialization fragment and media fragments * available through the manifest URL. The initialization fragment contains the codec private data for the stream, * and other data needed to set up the video or audio decoder and renderer. The media fragments contain encoded * video frames or encoded audio samples. *

    *
  6. *
  7. *

    * The media player receives the authenticated URL and requests stream metadata and media data normally. When the * media player requests data, it calls the following actions: *

    *
      *
    • *

      * GetDASHManifest: Retrieves an MPEG DASH manifest, which contains the metadata for the media that you want * to playback. *

      *
    • *
    • *

      * GetMP4InitFragment: Retrieves the MP4 initialization fragment. The media player typically loads the * initialization fragment before loading any media fragments. This fragment contains the "fytp" and " * moov" MP4 atoms, and the child atoms that are needed to initialize the media player decoder. *

      *

      * The initialization fragment does not correspond to a fragment in a Kinesis video stream. It contains only the * codec private data for the stream and respective track, which the media player needs to decode the media frames. *

      *
    • *
    • *

      * GetMP4MediaFragment: Retrieves MP4 media fragments. These fragments contain the "moof" and " * mdat" MP4 atoms and their child atoms, containing the encoded fragment's media frames and their * timestamps. *

      * *

      * After the first media fragment is made available in a streaming session, any fragments that don't contain the * same codec private data cause an error to be returned when those different media fragments are loaded. Therefore, * the codec private data should not change between fragments in a session. This also means that the session fails * if the fragments in a stream change from having only video to having both audio and video. *

      *
      *

      * Data retrieved with this action is billable. See Pricing for details. *

      *
    • *
    *
  8. *
* *

* For restrictions that apply to MPEG-DASH sessions, see Kinesis Video Streams Limits. *

*
*

* You can monitor the amount of data that the media player consumes by monitoring the * GetMP4MediaFragment.OutgoingBytes Amazon CloudWatch metric. For information about using CloudWatch * to monitor Kinesis Video Streams, see Monitoring Kinesis Video * Streams. For pricing information, see Amazon * Kinesis Video Streams Pricing and AWS Pricing. Charges for both * HLS sessions and outgoing AWS data apply. *

*

* For more information about HLS, see HTTP Live Streaming on * the Apple Developer site. *

* *

* If an error is thrown after invoking a Kinesis Video Streams archived media API, in addition to the HTTP status * code and the response body, it includes the following pieces of information: *

* *

* Both the HTTP status code and the ErrorType header can be utilized to make programmatic decisions about whether * errors are retry-able and under what conditions, as well as provide information on what actions the client * programmer might need to take in order to successfully try again. *

*

* For more information, see the Errors section at the bottom of this topic, as well as Common Errors. *

*
* * @param getDASHStreamingSessionURLRequest * @return Result of the GetDASHStreamingSessionURL operation returned by the service. * @throws ResourceNotFoundException * GetMedia throws this error when Kinesis Video Streams can't find the stream that you * specified.

*

* GetHLSStreamingSessionURL and GetDASHStreamingSessionURL throw this error if a * session with a PlaybackMode of ON_DEMAND or LIVE_REPLAYis * requested for a stream that has no fragments within the requested time range, or if a session with a * PlaybackMode of LIVE is requested for a stream that has no fragments within the * last 30 seconds. * @throws InvalidArgumentException * A specified parameter exceeds its restrictions, is not supported, or can't be used. * @throws ClientLimitExceededException * Kinesis Video Streams has throttled the request because you have exceeded a limit. Try making the call * later. For information about limits, see Kinesis Video Streams * Limits. * @throws NotAuthorizedException * Status Code: 403, The caller is not authorized to perform an operation on the given stream, or the token * has expired. * @throws UnsupportedStreamMediaTypeException * The type of the media (for example, h.264 or h.265 video or ACC or G.711 audio) could not be determined * from the codec IDs of the tracks in the first fragment for a playback session. The codec ID for track 1 * should be V_MPEG/ISO/AVC and, optionally, the codec ID for track 2 should be * A_AAC. * @throws NoDataRetentionException * A streaming session was requested for a stream that does not retain data (that is, has a * DataRetentionInHours of 0). * @throws MissingCodecPrivateDataException * No codec private data was found in at least one of tracks of the video stream. * @throws InvalidCodecPrivateDataException * The codec private data in at least one of the tracks of the video stream is not valid for this operation. * @sample AmazonKinesisVideoArchivedMedia.GetDASHStreamingSessionURL * @see AWS API Documentation */ @Override public GetDASHStreamingSessionURLResult getDASHStreamingSessionURL(GetDASHStreamingSessionURLRequest request) { request = beforeClientExecution(request); return executeGetDASHStreamingSessionURL(request); } @SdkInternalApi final GetDASHStreamingSessionURLResult executeGetDASHStreamingSessionURL(GetDASHStreamingSessionURLRequest getDASHStreamingSessionURLRequest) { ExecutionContext executionContext = createExecutionContext(getDASHStreamingSessionURLRequest); AWSRequestMetrics awsRequestMetrics = executionContext.getAwsRequestMetrics(); awsRequestMetrics.startEvent(Field.ClientExecuteTime); Request request = null; Response response = null; try { awsRequestMetrics.startEvent(Field.RequestMarshallTime); try { request = new GetDASHStreamingSessionURLRequestProtocolMarshaller(protocolFactory).marshall(super .beforeMarshalling(getDASHStreamingSessionURLRequest)); // Binds the request metrics to the current request. request.setAWSRequestMetrics(awsRequestMetrics); request.addHandlerContext(HandlerContextKey.CLIENT_ENDPOINT, endpoint); request.addHandlerContext(HandlerContextKey.ENDPOINT_OVERRIDDEN, isEndpointOverridden()); request.addHandlerContext(HandlerContextKey.SIGNING_REGION, getSigningRegion()); request.addHandlerContext(HandlerContextKey.SERVICE_ID, "Kinesis Video Archived Media"); request.addHandlerContext(HandlerContextKey.OPERATION_NAME, "GetDASHStreamingSessionURL"); request.addHandlerContext(HandlerContextKey.ADVANCED_CONFIG, advancedConfig); } finally { awsRequestMetrics.endEvent(Field.RequestMarshallTime); } HttpResponseHandler> responseHandler = protocolFactory.createResponseHandler( new JsonOperationMetadata().withPayloadJson(true).withHasStreamingSuccessResponse(false), new GetDASHStreamingSessionURLResultJsonUnmarshaller()); response = invoke(request, responseHandler, executionContext); return response.getAwsResponse(); } finally { endClientExecution(awsRequestMetrics, request, response); } } /** *

* Retrieves an HTTP Live Streaming (HLS) URL for the stream. You can then open the URL in a browser or media player * to view the stream contents. *

*

* Both the StreamName and the StreamARN parameters are optional, but you must specify * either the StreamName or the StreamARN when invoking this API operation. *

*

* An Amazon Kinesis video stream has the following requirements for providing data through HLS: *

* *

* Kinesis Video Streams HLS sessions contain fragments in the fragmented MPEG-4 form (also called fMP4 or CMAF) or * the MPEG-2 form (also called TS chunks, which the HLS specification also supports). For more information about * HLS fragment types, see the HLS * specification. *

*

* The following procedure shows how to use HLS with Kinesis Video Streams: *

*
    *
  1. *

    * Get an endpoint using GetDataEndpoint, * specifying GET_HLS_STREAMING_SESSION_URL for the APIName parameter. *

    *
  2. *
  3. *

    * Retrieve the HLS URL using GetHLSStreamingSessionURL. Kinesis Video Streams creates an HLS streaming * session to be used for accessing content in a stream using the HLS protocol. * GetHLSStreamingSessionURL returns an authenticated URL (that includes an encrypted session token) * for the session's HLS master playlist (the root resource needed for streaming with HLS). *

    * *

    * Don't share or store this token where an unauthorized entity could access it. The token provides access to the * content of the stream. Safeguard the token with the same measures that you would use with your AWS credentials. *

    *
    *

    * The media that is made available through the playlist consists only of the requested stream, time range, and * format. No other media data (such as frames outside the requested window or alternate bitrates) is made * available. *

    *
  4. *
  5. *

    * Provide the URL (containing the encrypted session token) for the HLS master playlist to a media player that * supports the HLS protocol. Kinesis Video Streams makes the HLS media playlist, initialization fragment, and media * fragments available through the master playlist URL. The initialization fragment contains the codec private data * for the stream, and other data needed to set up the video or audio decoder and renderer. The media fragments * contain H.264-encoded video frames or AAC-encoded audio samples. *

    *
  6. *
  7. *

    * The media player receives the authenticated URL and requests stream metadata and media data normally. When the * media player requests data, it calls the following actions: *

    *
      *
    • *

      * GetHLSMasterPlaylist: Retrieves an HLS master playlist, which contains a URL for the * GetHLSMediaPlaylist action for each track, and additional metadata for the media player, including * estimated bitrate and resolution. *

      *
    • *
    • *

      * GetHLSMediaPlaylist: Retrieves an HLS media playlist, which contains a URL to access the MP4 * initialization fragment with the GetMP4InitFragment action, and URLs to access the MP4 media * fragments with the GetMP4MediaFragment actions. The HLS media playlist also contains metadata about * the stream that the player needs to play it, such as whether the PlaybackMode is LIVE * or ON_DEMAND. The HLS media playlist is typically static for sessions with a * PlaybackType of ON_DEMAND. The HLS media playlist is continually updated with new * fragments for sessions with a PlaybackType of LIVE. There is a distinct HLS media * playlist for the video track and the audio track (if applicable) that contains MP4 media URLs for the specific * track. *

      *
    • *
    • *

      * GetMP4InitFragment: Retrieves the MP4 initialization fragment. The media player typically loads the * initialization fragment before loading any media fragments. This fragment contains the "fytp" and " * moov" MP4 atoms, and the child atoms that are needed to initialize the media player decoder. *

      *

      * The initialization fragment does not correspond to a fragment in a Kinesis video stream. It contains only the * codec private data for the stream and respective track, which the media player needs to decode the media frames. *

      *
    • *
    • *

      * GetMP4MediaFragment: Retrieves MP4 media fragments. These fragments contain the "moof" and " * mdat" MP4 atoms and their child atoms, containing the encoded fragment's media frames and their * timestamps. *

      * *

      * After the first media fragment is made available in a streaming session, any fragments that don't contain the * same codec private data cause an error to be returned when those different media fragments are loaded. Therefore, * the codec private data should not change between fragments in a session. This also means that the session fails * if the fragments in a stream change from having only video to having both audio and video. *

      *
      *

      * Data retrieved with this action is billable. See Pricing for details. *

      *
    • *
    • *

      * GetTSFragment: Retrieves MPEG TS fragments containing both initialization and media data for all tracks in * the stream. *

      * *

      * If the ContainerFormat is MPEG_TS, this API is used instead of * GetMP4InitFragment and GetMP4MediaFragment to retrieve stream media. *

      *
      *

      * Data retrieved with this action is billable. For more information, see Kinesis Video Streams pricing. *

      *
    • *
    *
  8. *
*

* A streaming session URL must not be shared between players. The service might throttle a session if multiple * media players are sharing it. For connection limits, see Kinesis Video Streams Limits. *

*

* You can monitor the amount of data that the media player consumes by monitoring the * GetMP4MediaFragment.OutgoingBytes Amazon CloudWatch metric. For information about using CloudWatch * to monitor Kinesis Video Streams, see Monitoring Kinesis Video * Streams. For pricing information, see Amazon * Kinesis Video Streams Pricing and AWS Pricing. Charges for both * HLS sessions and outgoing AWS data apply. *

*

* For more information about HLS, see HTTP Live Streaming on * the Apple Developer site. *

* *

* If an error is thrown after invoking a Kinesis Video Streams archived media API, in addition to the HTTP status * code and the response body, it includes the following pieces of information: *

* *

* Both the HTTP status code and the ErrorType header can be utilized to make programmatic decisions about whether * errors are retry-able and under what conditions, as well as provide information on what actions the client * programmer might need to take in order to successfully try again. *

*

* For more information, see the Errors section at the bottom of this topic, as well as Common Errors. *

*
* * @param getHLSStreamingSessionURLRequest * @return Result of the GetHLSStreamingSessionURL operation returned by the service. * @throws ResourceNotFoundException * GetMedia throws this error when Kinesis Video Streams can't find the stream that you * specified.

*

* GetHLSStreamingSessionURL and GetDASHStreamingSessionURL throw this error if a * session with a PlaybackMode of ON_DEMAND or LIVE_REPLAYis * requested for a stream that has no fragments within the requested time range, or if a session with a * PlaybackMode of LIVE is requested for a stream that has no fragments within the * last 30 seconds. * @throws InvalidArgumentException * A specified parameter exceeds its restrictions, is not supported, or can't be used. * @throws ClientLimitExceededException * Kinesis Video Streams has throttled the request because you have exceeded a limit. Try making the call * later. For information about limits, see Kinesis Video Streams * Limits. * @throws NotAuthorizedException * Status Code: 403, The caller is not authorized to perform an operation on the given stream, or the token * has expired. * @throws UnsupportedStreamMediaTypeException * The type of the media (for example, h.264 or h.265 video or ACC or G.711 audio) could not be determined * from the codec IDs of the tracks in the first fragment for a playback session. The codec ID for track 1 * should be V_MPEG/ISO/AVC and, optionally, the codec ID for track 2 should be * A_AAC. * @throws NoDataRetentionException * A streaming session was requested for a stream that does not retain data (that is, has a * DataRetentionInHours of 0). * @throws MissingCodecPrivateDataException * No codec private data was found in at least one of tracks of the video stream. * @throws InvalidCodecPrivateDataException * The codec private data in at least one of the tracks of the video stream is not valid for this operation. * @sample AmazonKinesisVideoArchivedMedia.GetHLSStreamingSessionURL * @see AWS API Documentation */ @Override public GetHLSStreamingSessionURLResult getHLSStreamingSessionURL(GetHLSStreamingSessionURLRequest request) { request = beforeClientExecution(request); return executeGetHLSStreamingSessionURL(request); } @SdkInternalApi final GetHLSStreamingSessionURLResult executeGetHLSStreamingSessionURL(GetHLSStreamingSessionURLRequest getHLSStreamingSessionURLRequest) { ExecutionContext executionContext = createExecutionContext(getHLSStreamingSessionURLRequest); AWSRequestMetrics awsRequestMetrics = executionContext.getAwsRequestMetrics(); awsRequestMetrics.startEvent(Field.ClientExecuteTime); Request request = null; Response response = null; try { awsRequestMetrics.startEvent(Field.RequestMarshallTime); try { request = new GetHLSStreamingSessionURLRequestProtocolMarshaller(protocolFactory).marshall(super .beforeMarshalling(getHLSStreamingSessionURLRequest)); // Binds the request metrics to the current request. request.setAWSRequestMetrics(awsRequestMetrics); request.addHandlerContext(HandlerContextKey.CLIENT_ENDPOINT, endpoint); request.addHandlerContext(HandlerContextKey.ENDPOINT_OVERRIDDEN, isEndpointOverridden()); request.addHandlerContext(HandlerContextKey.SIGNING_REGION, getSigningRegion()); request.addHandlerContext(HandlerContextKey.SERVICE_ID, "Kinesis Video Archived Media"); request.addHandlerContext(HandlerContextKey.OPERATION_NAME, "GetHLSStreamingSessionURL"); request.addHandlerContext(HandlerContextKey.ADVANCED_CONFIG, advancedConfig); } finally { awsRequestMetrics.endEvent(Field.RequestMarshallTime); } HttpResponseHandler> responseHandler = protocolFactory.createResponseHandler( new JsonOperationMetadata().withPayloadJson(true).withHasStreamingSuccessResponse(false), new GetHLSStreamingSessionURLResultJsonUnmarshaller()); response = invoke(request, responseHandler, executionContext); return response.getAwsResponse(); } finally { endClientExecution(awsRequestMetrics, request, response); } } /** *

* Retrieves a list of Images corresponding to each timestamp for a given time range, sampling interval, and image * format configuration. *

* * @param getImagesRequest * @return Result of the GetImages operation returned by the service. * @throws ResourceNotFoundException * GetMedia throws this error when Kinesis Video Streams can't find the stream that you * specified.

*

* GetHLSStreamingSessionURL and GetDASHStreamingSessionURL throw this error if a * session with a PlaybackMode of ON_DEMAND or LIVE_REPLAYis * requested for a stream that has no fragments within the requested time range, or if a session with a * PlaybackMode of LIVE is requested for a stream that has no fragments within the * last 30 seconds. * @throws InvalidArgumentException * A specified parameter exceeds its restrictions, is not supported, or can't be used. * @throws ClientLimitExceededException * Kinesis Video Streams has throttled the request because you have exceeded a limit. Try making the call * later. For information about limits, see Kinesis Video Streams * Limits. * @throws NotAuthorizedException * Status Code: 403, The caller is not authorized to perform an operation on the given stream, or the token * has expired. * @sample AmazonKinesisVideoArchivedMedia.GetImages * @see AWS API Documentation */ @Override public GetImagesResult getImages(GetImagesRequest request) { request = beforeClientExecution(request); return executeGetImages(request); } @SdkInternalApi final GetImagesResult executeGetImages(GetImagesRequest getImagesRequest) { ExecutionContext executionContext = createExecutionContext(getImagesRequest); AWSRequestMetrics awsRequestMetrics = executionContext.getAwsRequestMetrics(); awsRequestMetrics.startEvent(Field.ClientExecuteTime); Request request = null; Response response = null; try { awsRequestMetrics.startEvent(Field.RequestMarshallTime); try { request = new GetImagesRequestProtocolMarshaller(protocolFactory).marshall(super.beforeMarshalling(getImagesRequest)); // Binds the request metrics to the current request. request.setAWSRequestMetrics(awsRequestMetrics); request.addHandlerContext(HandlerContextKey.CLIENT_ENDPOINT, endpoint); request.addHandlerContext(HandlerContextKey.ENDPOINT_OVERRIDDEN, isEndpointOverridden()); request.addHandlerContext(HandlerContextKey.SIGNING_REGION, getSigningRegion()); request.addHandlerContext(HandlerContextKey.SERVICE_ID, "Kinesis Video Archived Media"); request.addHandlerContext(HandlerContextKey.OPERATION_NAME, "GetImages"); request.addHandlerContext(HandlerContextKey.ADVANCED_CONFIG, advancedConfig); } finally { awsRequestMetrics.endEvent(Field.RequestMarshallTime); } HttpResponseHandler> responseHandler = protocolFactory.createResponseHandler(new JsonOperationMetadata() .withPayloadJson(true).withHasStreamingSuccessResponse(false), new GetImagesResultJsonUnmarshaller()); response = invoke(request, responseHandler, executionContext); return response.getAwsResponse(); } finally { endClientExecution(awsRequestMetrics, request, response); } } /** *

* Gets media for a list of fragments (specified by fragment number) from the archived data in an Amazon Kinesis * video stream. *

* *

* You must first call the GetDataEndpoint API to get an endpoint. Then send the * GetMediaForFragmentList requests to this endpoint using the --endpoint-url parameter. *

*
*

* For limits, see Kinesis Video * Streams Limits. *

* *

* If an error is thrown after invoking a Kinesis Video Streams archived media API, in addition to the HTTP status * code and the response body, it includes the following pieces of information: *

* *

* Both the HTTP status code and the ErrorType header can be utilized to make programmatic decisions about whether * errors are retry-able and under what conditions, as well as provide information on what actions the client * programmer might need to take in order to successfully try again. *

*

* For more information, see the Errors section at the bottom of this topic, as well as Common Errors. *

*
* * @param getMediaForFragmentListRequest * @return Result of the GetMediaForFragmentList operation returned by the service. * @throws ResourceNotFoundException * GetMedia throws this error when Kinesis Video Streams can't find the stream that you * specified.

*

* GetHLSStreamingSessionURL and GetDASHStreamingSessionURL throw this error if a * session with a PlaybackMode of ON_DEMAND or LIVE_REPLAYis * requested for a stream that has no fragments within the requested time range, or if a session with a * PlaybackMode of LIVE is requested for a stream that has no fragments within the * last 30 seconds. * @throws InvalidArgumentException * A specified parameter exceeds its restrictions, is not supported, or can't be used. * @throws ClientLimitExceededException * Kinesis Video Streams has throttled the request because you have exceeded a limit. Try making the call * later. For information about limits, see Kinesis Video Streams * Limits. * @throws NotAuthorizedException * Status Code: 403, The caller is not authorized to perform an operation on the given stream, or the token * has expired. * @sample AmazonKinesisVideoArchivedMedia.GetMediaForFragmentList * @see AWS API Documentation */ @Override public GetMediaForFragmentListResult getMediaForFragmentList(GetMediaForFragmentListRequest request) { request = beforeClientExecution(request); return executeGetMediaForFragmentList(request); } @SdkInternalApi final GetMediaForFragmentListResult executeGetMediaForFragmentList(GetMediaForFragmentListRequest getMediaForFragmentListRequest) { ExecutionContext executionContext = createExecutionContext(getMediaForFragmentListRequest); AWSRequestMetrics awsRequestMetrics = executionContext.getAwsRequestMetrics(); awsRequestMetrics.startEvent(Field.ClientExecuteTime); Request request = null; Response response = null; try { awsRequestMetrics.startEvent(Field.RequestMarshallTime); try { request = new GetMediaForFragmentListRequestProtocolMarshaller(protocolFactory).marshall(super .beforeMarshalling(getMediaForFragmentListRequest)); // Binds the request metrics to the current request. request.setAWSRequestMetrics(awsRequestMetrics); request.addHandlerContext(HandlerContextKey.CLIENT_ENDPOINT, endpoint); request.addHandlerContext(HandlerContextKey.ENDPOINT_OVERRIDDEN, isEndpointOverridden()); request.addHandlerContext(HandlerContextKey.SIGNING_REGION, getSigningRegion()); request.addHandlerContext(HandlerContextKey.SERVICE_ID, "Kinesis Video Archived Media"); request.addHandlerContext(HandlerContextKey.OPERATION_NAME, "GetMediaForFragmentList"); request.addHandlerContext(HandlerContextKey.ADVANCED_CONFIG, advancedConfig); } finally { awsRequestMetrics.endEvent(Field.RequestMarshallTime); } HttpResponseHandler> responseHandler = protocolFactory.createResponseHandler( new JsonOperationMetadata().withPayloadJson(false).withHasStreamingSuccessResponse(true), new GetMediaForFragmentListResultJsonUnmarshaller()); response = invoke(request, responseHandler, executionContext); response.getAwsResponse().setPayload(new com.amazonaws.util.ServiceClientHolderInputStream(response.getAwsResponse().getPayload(), this)); request.addHandlerContext(HandlerContextKey.HAS_STREAMING_OUTPUT, Boolean.TRUE); return response.getAwsResponse(); } finally { endClientExecution(awsRequestMetrics, request, response); } } /** *

* Returns a list of Fragment objects from the specified stream and timestamp range within the archived data. *

*

* Listing fragments is eventually consistent. This means that even if the producer receives an acknowledgment that * a fragment is persisted, the result might not be returned immediately from a request to * ListFragments. However, results are typically available in less than one second. *

* *

* You must first call the GetDataEndpoint API to get an endpoint. Then send the * ListFragments requests to this endpoint using the --endpoint-url parameter. *

*
*

* If an error is thrown after invoking a Kinesis Video Streams archived media API, in addition to the HTTP status * code and the response body, it includes the following pieces of information: *

* *

* Both the HTTP status code and the ErrorType header can be utilized to make programmatic decisions about whether * errors are retry-able and under what conditions, as well as provide information on what actions the client * programmer might need to take in order to successfully try again. *

*

* For more information, see the Errors section at the bottom of this topic, as well as Common Errors. *

*
* * @param listFragmentsRequest * @return Result of the ListFragments operation returned by the service. * @throws ResourceNotFoundException * GetMedia throws this error when Kinesis Video Streams can't find the stream that you * specified.

*

* GetHLSStreamingSessionURL and GetDASHStreamingSessionURL throw this error if a * session with a PlaybackMode of ON_DEMAND or LIVE_REPLAYis * requested for a stream that has no fragments within the requested time range, or if a session with a * PlaybackMode of LIVE is requested for a stream that has no fragments within the * last 30 seconds. * @throws InvalidArgumentException * A specified parameter exceeds its restrictions, is not supported, or can't be used. * @throws ClientLimitExceededException * Kinesis Video Streams has throttled the request because you have exceeded a limit. Try making the call * later. For information about limits, see Kinesis Video Streams * Limits. * @throws NotAuthorizedException * Status Code: 403, The caller is not authorized to perform an operation on the given stream, or the token * has expired. * @sample AmazonKinesisVideoArchivedMedia.ListFragments * @see AWS API Documentation */ @Override public ListFragmentsResult listFragments(ListFragmentsRequest request) { request = beforeClientExecution(request); return executeListFragments(request); } @SdkInternalApi final ListFragmentsResult executeListFragments(ListFragmentsRequest listFragmentsRequest) { ExecutionContext executionContext = createExecutionContext(listFragmentsRequest); AWSRequestMetrics awsRequestMetrics = executionContext.getAwsRequestMetrics(); awsRequestMetrics.startEvent(Field.ClientExecuteTime); Request request = null; Response response = null; try { awsRequestMetrics.startEvent(Field.RequestMarshallTime); try { request = new ListFragmentsRequestProtocolMarshaller(protocolFactory).marshall(super.beforeMarshalling(listFragmentsRequest)); // Binds the request metrics to the current request. request.setAWSRequestMetrics(awsRequestMetrics); request.addHandlerContext(HandlerContextKey.CLIENT_ENDPOINT, endpoint); request.addHandlerContext(HandlerContextKey.ENDPOINT_OVERRIDDEN, isEndpointOverridden()); request.addHandlerContext(HandlerContextKey.SIGNING_REGION, getSigningRegion()); request.addHandlerContext(HandlerContextKey.SERVICE_ID, "Kinesis Video Archived Media"); request.addHandlerContext(HandlerContextKey.OPERATION_NAME, "ListFragments"); request.addHandlerContext(HandlerContextKey.ADVANCED_CONFIG, advancedConfig); } finally { awsRequestMetrics.endEvent(Field.RequestMarshallTime); } HttpResponseHandler> responseHandler = protocolFactory.createResponseHandler( new JsonOperationMetadata().withPayloadJson(true).withHasStreamingSuccessResponse(false), new ListFragmentsResultJsonUnmarshaller()); response = invoke(request, responseHandler, executionContext); return response.getAwsResponse(); } finally { endClientExecution(awsRequestMetrics, request, response); } } /** * Returns additional metadata for a previously executed successful, request, typically used for debugging issues * where a service isn't acting as expected. This data isn't considered part of the result data returned by an * operation, so it's available through this separate, diagnostic interface. *

* Response metadata is only cached for a limited period of time, so if you need to access this extra diagnostic * information for an executed request, you should use this method to retrieve it as soon as possible after * executing the request. * * @param request * The originally executed request * * @return The response metadata for the specified request, or null if none is available. */ public ResponseMetadata getCachedResponseMetadata(AmazonWebServiceRequest request) { return client.getResponseMetadataForRequest(request); } /** * Normal invoke with authentication. Credentials are required and may be overriden at the request level. **/ private Response invoke(Request request, HttpResponseHandler> responseHandler, ExecutionContext executionContext) { return invoke(request, responseHandler, executionContext, null, null); } /** * Normal invoke with authentication. Credentials are required and may be overriden at the request level. **/ private Response invoke(Request request, HttpResponseHandler> responseHandler, ExecutionContext executionContext, URI cachedEndpoint, URI uriFromEndpointTrait) { executionContext.setCredentialsProvider(CredentialUtils.getCredentialsProvider(request.getOriginalRequest(), awsCredentialsProvider)); return doInvoke(request, responseHandler, executionContext, cachedEndpoint, uriFromEndpointTrait); } /** * Invoke with no authentication. Credentials are not required and any credentials set on the client or request will * be ignored for this operation. **/ private Response anonymousInvoke(Request request, HttpResponseHandler> responseHandler, ExecutionContext executionContext) { return doInvoke(request, responseHandler, executionContext, null, null); } /** * Invoke the request using the http client. Assumes credentials (or lack thereof) have been configured in the * ExecutionContext beforehand. **/ private Response doInvoke(Request request, HttpResponseHandler> responseHandler, ExecutionContext executionContext, URI discoveredEndpoint, URI uriFromEndpointTrait) { if (discoveredEndpoint != null) { request.setEndpoint(discoveredEndpoint); request.getOriginalRequest().getRequestClientOptions().appendUserAgent("endpoint-discovery"); } else if (uriFromEndpointTrait != null) { request.setEndpoint(uriFromEndpointTrait); } else { request.setEndpoint(endpoint); } request.setTimeOffset(timeOffset); HttpResponseHandler errorResponseHandler = protocolFactory.createErrorResponseHandler(new JsonErrorResponseMetadata()); return client.execute(request, responseHandler, errorResponseHandler, executionContext); } @com.amazonaws.annotation.SdkInternalApi static com.amazonaws.protocol.json.SdkJsonProtocolFactory getProtocolFactory() { return protocolFactory; } @Override public void shutdown() { super.shutdown(); } }