{"record":{"id":"17e6076f9c4c2a69","repo":"google/ExoPlayer","slug":"unsupported-stream-format-format","errorCode":null,"errorMessage":"Unsupported stream format:${format}","messagePattern":"Unsupported stream format:(.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionUriBuilder.java","lineNumber":357,"sourceCode":"    // Required params.\n    @Nullable String assetKey = uri.getQueryParameter(ASSET_KEY);\n    @Nullable String apiKey = uri.getQueryParameter(API_KEY);\n    @Nullable String contentSourceId = uri.getQueryParameter(CONTENT_SOURCE_ID);\n    @Nullable String videoId = uri.getQueryParameter(VIDEO_ID);\n    if (!TextUtils.isEmpty(assetKey)) {\n      streamRequest = ImaSdkFactory.getInstance().createLiveStreamRequest(assetKey, apiKey);\n    } else {\n      streamRequest =\n          ImaSdkFactory.getInstance()\n              .createVodStreamRequest(checkNotNull(contentSourceId), checkNotNull(videoId), apiKey);\n    }\n    int format = Integer.parseInt(uri.getQueryParameter(FORMAT));\n    if (format == C.CONTENT_TYPE_DASH) {\n      streamRequest.setFormat(StreamFormat.DASH);\n    } else if (format == C.CONTENT_TYPE_HLS) {\n      streamRequest.setFormat(StreamFormat.HLS);\n    } else {\n      throw new IllegalArgumentException(\"Unsupported stream format:\" + format);\n    }\n    // Optional params.\n    @Nullable String adTagParametersValue = uri.getQueryParameter(AD_TAG_PARAMETERS);\n    if (!TextUtils.isEmpty(adTagParametersValue)) {\n      Map<String, String> adTagParameters = new HashMap<>();\n      Uri adTagParametersUri = Uri.parse(adTagParametersValue);\n      for (String paramName : adTagParametersUri.getQueryParameterNames()) {\n        String singleAdTagParameterValue = adTagParametersUri.getQueryParameter(paramName);\n        if (!TextUtils.isEmpty(singleAdTagParameterValue)) {\n          adTagParameters.put(paramName, singleAdTagParameterValue);\n        }\n      }\n      streamRequest.setAdTagParameters(adTagParameters);\n    }\n    @Nullable String manifestSuffix = uri.getQueryParameter(MANIFEST_SUFFIX);\n    if (manifestSuffix != null) {\n      streamRequest.setManifestSuffix(manifestSuffix);\n    }","sourceCodeStart":339,"sourceCodeEnd":375,"githubUrl":"https://github.com/google/ExoPlayer/blob/dd430f7053a1a3958deea3ead6a0565150c06bfc/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionUriBuilder.java#L339-L375","documentation":"Thrown by ImaServerSideAdInsertionUriBuilder.createStreamRequest when the FORMAT query parameter, parsed as an integer, is neither C.CONTENT_TYPE_DASH nor C.CONTENT_TYPE_HLS. The IMA DAI SDK only serves those two stream formats, so any other value cannot be mapped to a StreamRequest.","triggerScenarios":"A URI with format=2 (CONTENT_TYPE_OTHER), format=1, a missing-but-defaulted value, or a typo like format=dash (Integer.parseInt throws NumberFormatException before this check) reaching createStreamRequest. Usually results from manual URI construction or a stale/cached URI built against different constants.","commonSituations":"Hand-writing the imasky:// URI and guessing the format code; copying example URIs with format=1; a backend delivering deep links with an unset or unsupported format parameter; format constant changes between ExoPlayer versions.","solutions":["Build the URI with ImaServerSideAdInsertionUriBuilder and pass setFormat(C.CONTENT_TYPE_DASH) or setFormat(C.CONTENT_TYPE_HLS).","If URIs come from a server/deep link, validate the format parameter at ingestion and reject/normalize values outside {DASH, HLS} before playback.","Ensure the URI retains the FORMAT query parameter after any URL encoding/rewriting step."],"exampleFix":"// before\nUri uri = Uri.parse(\"imasky://ima?asset_key=...&format=1\"); // IllegalArgumentException: Unsupported stream format:1\n\n// after\nUri uri = new ImaServerSideAdInsertionUriBuilder()\n    .setAssetKey(\"...\")\n    .setFormat(C.CONTENT_TYPE_DASH) // or C.CONTENT_TYPE_HLS\n    .build();","handlingStrategy":"validation","validationCode":"@Nullable String f = uri.getQueryParameter(\"format\");\nboolean supported = false;\ntry { int fmt = Integer.parseInt(f); supported = fmt == C.CONTENT_TYPE_DASH || fmt == C.CONTENT_TYPE_HLS; }\ncatch (NumberFormatException ignored) {}\nif (!supported) throw new IllegalArgumentException(\"Bad format\");","typeGuard":null,"tryCatchPattern":"catch (IllegalArgumentException e) { if (e.getMessage() != null && e.getMessage().startsWith(\"Unsupported stream format\")) normalizeFormatAndRebuild(); }","preventionTips":["Use setFormat(C.CONTENT_TYPE_DASH/HLS) on the builder instead of embedding format codes by hand.","Validate deep-link-supplied SSAI URIs (including format) at ingestion."],"tags":["ima","ssai","uri","stream-format"],"backgroundTag":null,"analyzedSha":"dd430f7053a1a3958deea3ead6a0565150c06bfc","analyzedAt":"2026-08-14T12:22:02.982Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}