Skip to content

Failed to initialize video/dolby-vision, error 0xfffffffe (NAME_NOT_FOUND)Β #211

Open
@soroa

Description

@soroa

Stacktrace

 Unexpected error while transcoding. (Ask Gemini)
                                                                                                    java.lang.IllegalArgumentException: Failed to initialize video/dolby-vision, error 0xfffffffe (NAME_NOT_FOUND)
                                                                                                    	at android.media.MediaCodec.native_setup(Native Method)
                                                                                                    	at android.media.MediaCodec.<init>(MediaCodec.java:2154)
                                                                                                    	at android.media.MediaCodec.<init>(MediaCodec.java:2132)
                                                                                                    	at android.media.MediaCodec.createDecoderByType(MediaCodec.java:2069)
                                                                                                    	at com.otaliastudios.transcoder.internal.codec.Decoder.<init>(Decoder.kt:43)
                                                                                                    	at com.otaliastudios.transcoder.internal.pipeline.PipelinesKt.VideoPipeline$lambda$1(pipelines.kt:62)
                                                                                                    	at com.otaliastudios.transcoder.internal.pipeline.PipelinesKt.$r8$lambda$m1rlbwqPaEygFy8BQNNSagwe4_w(Unknown Source:0)
                                                                                                    	at com.otaliastudios.transcoder.internal.pipeline.PipelinesKt$$ExternalSyntheticLambda1.invoke(Unknown Source:12)
                                                                                                    	at com.otaliastudios.transcoder.internal.pipeline.Pipeline$Companion.build$lib_release(Pipeline.kt:169)
                                                                                                    	at com.otaliastudios.transcoder.internal.pipeline.PipelinesKt.VideoPipeline(pipelines.kt:60)
                                                                                                    	at com.otaliastudios.transcoder.internal.pipeline.PipelinesKt.RegularPipeline(pipelines.kt:48)
                                                                                                    	at com.otaliastudios.transcoder.internal.transcode.DefaultTranscodeEngine.createPipeline(DefaultTranscodeEngine.kt:83)
                                                                                                    	at com.otaliastudios.transcoder.internal.transcode.DefaultTranscodeEngine.access$createPipeline(DefaultTranscodeEngine.kt:27)
                                                                                                    	at com.otaliastudios.transcoder.internal.transcode.DefaultTranscodeEngine$segments$1.invoke(DefaultTranscodeEngine.kt:42)
                                                                                                    	at com.otaliastudios.transcoder.internal.transcode.DefaultTranscodeEngine$segments$1.invoke(DefaultTranscodeEngine.kt:42)
                                                                                                    	at com.otaliastudios.transcoder.internal.Segments.tryCreateSegment(Segments.kt:87)
                                                                                                    	at com.otaliastudios.transcoder.internal.Segments.next(Segments.kt:46)
                                                                                                    	at com.otaliastudios.transcoder.internal.transcode.DefaultTranscodeEngine.transcode(DefaultTranscodeEngine.kt:114)
                                                                                                    	at com.otaliastudios.transcoder.internal.transcode.TranscodeEngine$Companion.transcode(TranscodeEngine.kt:48)
                                                                                                    	at com.otaliastudios.transcoder.internal.transcode.TranscodeEngine.transcode(Unknown Source:2)
                                                                                                    	at com.otaliastudios.transcoder.Transcoder$1.call(Transcoder.java:102)
                                                                                                    	at com.otaliastudios.transcoder.Transcoder$1.call(Transcoder.java:99)
                                                                                                    	at java.util.concurrent.FutureTask.run(FutureTask.java:264)
                                                                                                    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
                                                                                                    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
                                                                                                    	at java.lang.Thread.run(Thread.java:1012)
2025-02-07 10:52:48.486  9692-9692  <no-tag>                <package-name>              E  Transcoding for content://com.google.android.apps.docs.storage.legacy/enc%3Dencoded%3DW0Q7pRNUU33m6n98tAFuukNHbP3oKVm9OIHRCUrI2Cfll5wc9TDP3qlZgCGCoQ%3D%3D failed with exception: java.lang.IllegalArgumentException: Failed to initialize video/dolby-vision, error 0xfffffffe (NAME_NOT_FOUND)
2025-02-07 10:52:48.674  9692-12632 MediaMetad...trieverJNI <package-name>               E  getFrameAtTime: videoFrame is a NULL pointer
2025-02-07 10:52:48.675  9692-12632 MediaMetad...trieverJNI <package-name>               E  getFrameAtTime: videoFrame is a NULL pointer
2025-02-07 10:52:48.683  9692-12632 MediaMetad...trieverJNI <package-name>               E  getFrameAtTime: videoFrame is a NULL pointer

File

https://drive.google.com/file/d/1_LPev08GL2u41zPvKHYsviIJzjPlbVRG/view?usp=drive_link

Code

    /**
     * Sets the profile to AVCProfileBaseline for compatibility with older devices.
     * [DefaultVideoStrategy] does not allow to set the output profile, so we need to override
     * this method to set it manually.
     */
    override fun createOutputFormat(inputFormats: MutableList<MediaFormat>, outputFormat: MediaFormat): TrackStatus {
        val result = super.createOutputFormat(inputFormats, outputFormat)
        outputFormat.setInteger(MediaFormat.KEY_PROFILE, CodecProfileLevel.AVCProfileBaseline)
        val supportedLevel = getSupportedAVCLevel()
        if (supportedLevel != null) {
            outputFormat.setInteger(MediaFormat.KEY_LEVEL, supportedLevel)
        }
        return result
    }

    /**
     * Checks the highest supported AVC level.
     * AVC level 4.1 is a widely supported level.
     * @return AVC level 4.1 or `null` if no compatible level is found
     */
    private fun getSupportedAVCLevel(): Int? =
        MediaCodecList(MediaCodecList.ALL_CODECS).codecInfos
            .filter { it.isAVCVideoEncoder() }
            .flatMap { it.getAVCProfileLevels() }
            .firstOrNull { level ->
                level >= SUPPORTED_AVC_LEVEL
            }

    private fun MediaCodecInfo.isAVCVideoEncoder() =
        isEncoder &&
            supportedTypes.any { it.startsWith("video/") } &&
            supportedTypes.contains(MediaFormat.MIMETYPE_VIDEO_AVC)

    /**
     * Retrieves the list of supported AVC profile levels for a given codec.
     */
    private fun MediaCodecInfo.getAVCProfileLevels(): List<Int> {
        return getCapabilitiesForType(MediaFormat.MIMETYPE_VIDEO_AVC)
            .profileLevels
            .filter { it.profile == CodecProfileLevel.AVCProfileBaseline }
            .map { it.level }
    }

    companion object {
        private const val MAX_DIMENSION_ALLOWED = 1280
        private const val BIT_RATE = 3 * 1024 * 1024L // 3 Mbps
        private const val FRAME_RATE = 30
        private const val SUPPORTED_AVC_LEVEL = CodecProfileLevel.AVCLevel41
    }

What I've tried

  • I've tried forcing the mime type to be "videos/avc" but no luck
        for (format in inputFormats) {
            val mime = format.getString(MediaFormat.KEY_MIME)
            logDev("mime: $mime")
            if (mime == "video/dolby-vision") {
                logDev("Dolby Vision detected. Changing input format to H.264")
            // Force input format to H.264 (This prevents the Dolby Vision decoder from being used)
            format.setString(MediaFormat.KEY_MIME, "video/avc")
            }
        }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions