{"record":{"id":"d89bf0643983b973","repo":"google/ExoPlayer","slug":"failed-to-initialize-decoder-d89bf0","errorCode":null,"errorMessage":"Failed to initialize decoder","messagePattern":"Failed to initialize decoder","errorType":"exception","errorClass":"VpxDecoderException","httpStatus":null,"severity":"error","filePath":"extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java","lineNumber":89,"sourceCode":"  public VpxDecoder(\n      int numInputBuffers,\n      int numOutputBuffers,\n      int initialInputBufferSize,\n      @Nullable CryptoConfig cryptoConfig,\n      int threads)\n      throws VpxDecoderException {\n    super(new DecoderInputBuffer[numInputBuffers], new VideoDecoderOutputBuffer[numOutputBuffers]);\n    if (!VpxLibrary.isAvailable()) {\n      throw new VpxDecoderException(\"Failed to load decoder native libraries.\");\n    }\n    this.cryptoConfig = cryptoConfig;\n    if (cryptoConfig != null && !VpxLibrary.vpxIsSecureDecodeSupported()) {\n      throw new VpxDecoderException(\"Vpx decoder does not support secure decode.\");\n    }\n    vpxDecContext =\n        vpxInit(/* disableLoopFilter= */ false, /* enableRowMultiThreadMode= */ false, threads);\n    if (vpxDecContext == 0) {\n      throw new VpxDecoderException(\"Failed to initialize decoder\");\n    }\n    setInitialInputBufferSize(initialInputBufferSize);\n  }\n\n  @Override\n  public String getName() {\n    return \"libvpx\" + VpxLibrary.getVersion();\n  }\n\n  @Override\n  protected DecoderInputBuffer createInputBuffer() {\n    return new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT);\n  }\n\n  @Override\n  protected VideoDecoderOutputBuffer createOutputBuffer() {\n    return new VideoDecoderOutputBuffer(this::releaseOutputBuffer);\n  }","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/google/ExoPlayer/blob/dd430f7053a1a3958deea3ead6a0565150c06bfc/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java#L71-L107","documentation":"The native vpxInit(...) call returned 0, meaning libvpx could not allocate a decoder context. The native libraries loaded fine, but context creation failed — most commonly a threading/memory issue (threads count invalid or out of memory) or an incompatible libvpx build.","triggerScenarios":"vpxInit(false, false, threads) == 0 in the VpxDecoder constructor. Seen with invalid thread counts, low-memory conditions on entry-level devices, or a mismatched JNI wrapper/libvpx pairing in custom builds.","commonSituations":"Custom builds of the extension where the JNI signature changed; devices under memory pressure during codec initialization; passing an extreme number of decode threads from LibvpxVideoRenderer's constructor argument.","solutions":["Retry playback with fewer decode threads (LibvpxVideoRenderer constructor parameter) or leave the default.","Free memory / release other decoders before initializing; catch VpxDecoderException and fall back to MediaCodec VP9.","If building from source, ensure the JNI vpxInit wrapper matches the Java signature and libvpx version.","Enable decoder fallback (DefaultRenderersFactory.setEnableDecoderFallback(true)) so playback continues with another decoder."],"exampleFix":"// before\nLibvpxVideoRenderer renderer = new LibvpxVideoRenderer(0, handler, listener, 16, threads); // threads too high\n\n// after\nint threads = Math.min(4, Runtime.getRuntime().availableProcessors());\nLibvpxVideoRenderer renderer = new LibvpxVideoRenderer(0, handler, listener, 16, threads);","handlingStrategy":"retry","validationCode":"int threads = Math.min(4, Runtime.getRuntime().availableProcessors()); // sane value before constructing the renderer","typeGuard":null,"tryCatchPattern":"catch (VpxDecoderException e) on init -> optionally retry once with fewer threads, else fall back to MediaCodec.","preventionTips":["Pass a modest thread count to LibvpxVideoRenderer.","Release unused codecs before initializing new ones on low-memory devices.","Enable decoder fallback in DefaultRenderersFactory so MediaCodec takes over."],"tags":["vp9","native","decoder-init","memory","exoplayer-extension"],"backgroundTag":null,"analyzedSha":"dd430f7053a1a3958deea3ead6a0565150c06bfc","analyzedAt":"2026-08-14T12:22:02.982Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}