{"record":{"id":"4630e2dddb66ef23","repo":"google/ExoPlayer","slug":"invalid-output-encoding-mode-s-for-s","errorCode":null,"errorMessage":"Invalid output encoding (mode=%s) for: %s","messagePattern":"Invalid output encoding \\(mode=(.+?)\\) for: (.+?)","errorType":"exception","errorClass":"AudioSink.ConfigurationException","httpStatus":null,"severity":"error","filePath":"library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java","lineNumber":727,"sourceCode":"      } else {\n        outputMode = OUTPUT_MODE_PASSTHROUGH;\n        @Nullable\n        Pair<Integer, Integer> encodingAndChannelConfig =\n            getAudioCapabilities().getEncodingAndChannelConfigForPassthrough(inputFormat);\n        if (encodingAndChannelConfig == null) {\n          throw new ConfigurationException(\n              \"Unable to configure passthrough for: \" + inputFormat, inputFormat);\n        }\n        outputEncoding = encodingAndChannelConfig.first;\n        outputChannelConfig = encodingAndChannelConfig.second;\n        // Passthrough only supports AudioTrack playback parameters, but we only enable it this was\n        // specifically requested by the app.\n        enableAudioTrackPlaybackParams = preferAudioTrackPlaybackParams;\n      }\n    }\n\n    if (outputEncoding == C.ENCODING_INVALID) {\n      throw new ConfigurationException(\n          \"Invalid output encoding (mode=\" + outputMode + \") for: \" + inputFormat, inputFormat);\n    }\n    if (outputChannelConfig == AudioFormat.CHANNEL_INVALID) {\n      throw new ConfigurationException(\n          \"Invalid output channel config (mode=\" + outputMode + \") for: \" + inputFormat,\n          inputFormat);\n    }\n    int bufferSize =\n        specifiedBufferSize != 0\n            ? specifiedBufferSize\n            : audioTrackBufferSizeProvider.getBufferSizeInBytes(\n                getAudioTrackMinBufferSize(outputSampleRate, outputChannelConfig, outputEncoding),\n                outputEncoding,\n                outputMode,\n                outputPcmFrameSize != C.LENGTH_UNSET ? outputPcmFrameSize : 1,\n                outputSampleRate,\n                inputFormat.bitrate,\n                enableAudioTrackPlaybackParams ? MAX_PLAYBACK_SPEED : DEFAULT_PLAYBACK_SPEED);","sourceCodeStart":709,"sourceCodeEnd":745,"githubUrl":"https://github.com/google/ExoPlayer/blob/dd430f7053a1a3958deea3ead6a0565150c06bfc/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java#L709-L745","documentation":"After selecting an output encoding for the AudioTrack (PCM, passthrough, or offload mode), DefaultAudioSink validates the resolved encoding. If outputEncoding equals C.ENCODING_INVALID — meaning mode computation produced no usable encoding at all, such as an unrecognized MIME type when deriving an offload encoding or an unset PCM encoding — it throws ConfigurationException('Invalid output encoding (mode=...) for: <format>') from AudioSink.configure.","triggerScenarios":"Configuring the sink with a Format whose sample MIME type maps to no audio encoding (MimeTypes.getEncoding returns ENCODING_INVALID) — e.g. enabling audio offload for a codec the platform does not recognize, or a custom/unknown sampleMimeType reaching the sink.","commonSituations":"setEnableAudioOffload(true) with container/codec combos outside the supported offload set; playlists mixing known and exotic codecs; custom MediaSource or Icy metadata wrappers that mangle Format.sampleMimeType; API-level differences in supported offload encodings.","solutions":["Disable audio offload for formats not in the platform offload list (DefaultAudioSink offload preferences or track-selector constraints).","Verify Format.sampleMimeType is a known audio type (MimeTypes.isAudio) before it reaches the sink; log the failing Format from the exception.","Catch ConfigurationException at playback start and retry with a sink built without offload enabled.","On API < 33 keep offload off unless the exact codec (e.g. MP3/AAC/FLAC/OPUS) is confirmed supported by the device's AudioManager.isOffloadedPlaybackSupported."],"exampleFix":"// before — offload for all audio\nDefaultAudioSink audioSink =\n    new DefaultAudioSink.Builder(ctx)\n        .setOffloadMode(DefaultAudioSink.OFFLOAD_MODE_ENABLED_ALWAYS)\n        .build();\n\n// after — offload only when the platform confirms support\nAudioManager am = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);\nboolean offload = am != null\n    && am.isOffloadedPlaybackSupported(new AudioAttributes.Builder()\n        .setUsage(AudioAttributes.USAGE_MEDIA).build(),\n        new AudioFormat.Builder().setEncoding(AudioFormat.ENCODING_AAC_LC)\n            .setSampleRate(44_100).setChannelMask(AudioFormat.CHANNEL_OUT_STEREO).build());\nDefaultAudioSink audioSink =\n    new DefaultAudioSink.Builder(ctx)\n        .setOffloadMode(offload\n            ? DefaultAudioSink.OFFLOAD_MODE_ENABLED_ALWAYS\n            : DefaultAudioSink.OFFLOAD_MODE_DISABLED)\n        .build();","handlingStrategy":"validation","validationCode":"int encoding = MimeTypes.getEncoding(format.sampleMimeType, format.codecs);\nif (encoding == C.ENCODING_INVALID) {\n  // this format cannot drive an AudioTrack: choose PCM decode / reject item\n}","typeGuard":null,"tryCatchPattern":"try {\n  player.setMediaItem(offloadItem);\n} catch (PlaybackException e) {\n  if (e.getErrorCode()\n      == PlaybackException.ERROR_CODE_AUDIO_TRACK_INIT_FAILED) {\n    rebuildSinkWithoutOffload(offloadItem);\n  }\n}","preventionTips":["Gate offload on AudioManager.isOffloadedPlaybackSupported per codec","Log Format.sampleMimeType for any item before enabling offload","Keep OFFLOAD_MODE_REQUIRED out of production builds","Re-verify offload support on OS upgrades — supported sets change per API level"],"tags":["exoplayer","audio","configuration","offload","encoding"],"backgroundTag":null,"analyzedSha":"dd430f7053a1a3958deea3ead6a0565150c06bfc","analyzedAt":"2026-08-14T12:22:02.982Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}