diff --git a/decoder-errata.txt b/decoder-errata.txt index 24c37a21..ad0dee85 100644 --- a/decoder-errata.txt +++ b/decoder-errata.txt @@ -1,10 +1,13 @@ This file serves to document some of the decoder errata when using MediaCodec hardware decoders on certain devices. 1. num_ref_frames is set to 16 by NVENC which causes decoders to allocate 16+ buffers. This can cause an OOM error on some devices. - - Affected decoders: TI OMAP4, possibly some Qualcomm chips too (Galaxy S3 on 4.3+) + - Affected decoders: TI OMAP4 2. Some decoders have a huge per-frame latency with the unmodified SPS sent from NVENC. Setting max_dec_frame_buffering fixes this latency issue. - Affected decoders: NVIDIA Tegra 3 and 4 3. Some decoders strictly require that you pass BUFFER_FLAG_CODEC_CONFIG and crash upon the IDR frame if you don't - - Affected decoders: TI OMAP4 \ No newline at end of file + - Affected decoders: TI OMAP4 + +4. Some decoders require num_ref_frames=1 and max_dec_frame_buffering=1 to avoid crashing on SPS or first I-frame + - Affected decoders: Qualcomm in GS3 on 4.3+, Exynos 4 \ No newline at end of file diff --git a/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java b/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java index 7f0cada3..2a813aaa 100644 --- a/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/src/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -36,7 +36,7 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { private final static byte[] BITSTREAM_RESTRICTIONS = new byte[] {(byte) 0xF1, (byte) 0x83, 0x2A, 0x00}; public static final List blacklistedDecoderPrefixes; - public static final List spsFixupBitsreamFixupDecoderPrefixes; + public static final List spsFixupBitstreamFixupDecoderPrefixes; public static final List spsFixupNumRefFixupDecoderPrefixes; static { @@ -46,13 +46,15 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { } static { - spsFixupBitsreamFixupDecoderPrefixes = new LinkedList(); - spsFixupBitsreamFixupDecoderPrefixes.add("omx.nvidia"); - spsFixupBitsreamFixupDecoderPrefixes.add("omx.qcom"); + spsFixupBitstreamFixupDecoderPrefixes = new LinkedList(); + spsFixupBitstreamFixupDecoderPrefixes.add("omx.nvidia"); + spsFixupBitstreamFixupDecoderPrefixes.add("omx.qcom"); + spsFixupBitstreamFixupDecoderPrefixes.add("omx.sec"); spsFixupNumRefFixupDecoderPrefixes = new LinkedList(); spsFixupNumRefFixupDecoderPrefixes.add("omx.TI"); spsFixupNumRefFixupDecoderPrefixes.add("omx.qcom"); + spsFixupNumRefFixupDecoderPrefixes.add("omx.sec"); } private static boolean isDecoderInList(List decoderList, String decoderName) { @@ -137,7 +139,7 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer { MediaCodecInfo safeDecoder = findSafeDecoder(); if (safeDecoder != null) { videoDecoder = MediaCodec.createByCodecName(safeDecoder.getName()); - needsSpsBitstreamFixup = isDecoderInList(spsFixupBitsreamFixupDecoderPrefixes, safeDecoder.getName()); + needsSpsBitstreamFixup = isDecoderInList(spsFixupBitstreamFixupDecoderPrefixes, safeDecoder.getName()); needsSpsNumRefFixup = isDecoderInList(spsFixupNumRefFixupDecoderPrefixes, safeDecoder.getName()); if (needsSpsBitstreamFixup) { LimeLog.info("Decoder "+safeDecoder.getName()+" needs SPS bitstream restrictions fixup");