Mohammad Elsayed
Mohammad Elsayed

Reputation: 2066

Phone crashes when calling mediaCodec.configure with error MediaCodec$CodecException: Error 0x80001001

The app I am working on gets the video from the camera through Surface and encodes it to video/avc (H264) I am doing that successfully and it is working great on phones like galaxy Note 10+ but on phones like Xiaomi note 10s which is a new phone I am having this issue. Here is what I am doing:

  1. create format:
    format = MediaFormat.createVideoFormat(
        H264, videoWidth, videoHeight
        ).apply {

        setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0)
        setInteger(MediaFormat.KEY_BIT_RATE, bitrate)
        setInteger(MediaFormat.KEY_FRAME_RATE, videoFrameRate)
        setInteger(
            MediaFormat.KEY_COLOR_FORMAT,
            CodecCapabilities.COLOR_FormatSurface
        )
        setFloat(MediaFormat.KEY_I_FRAME_INTERVAL, 1f)
    }```

  1. Then create encoderName:
    val encoderName = MediaCodecList(
        MediaCodecList.ALL_CODECS
    ).findEncoderForFormat(format) //using the format I shared in the first step
  1. Then create:

codec = MediaCodec.createByCodecName(encoderName)

Then .setCallback(callback) //not important since we won't make it till this point, it will crash before that.

4. And this is the line where it crashes. codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE) //CRASH => MediaCodec$CodecException: Error 0x80001001

  1. The rest
codec.setInputSurface(surface)
codec.start()

I am suspecting the

    setInteger(
        MediaFormat.KEY_COLOR_FORMAT,
        CodecCapabilities.COLOR_FormatSurface
    ) //I tried changing the value and completely removing this setInteger, no luck :/

Upvotes: 0

Views: 1815

Answers (1)

dev.bmax
dev.bmax

Reputation: 10591

Error 0x80001001 also known as OMX_ErrorUndefined says: "There was an error, but the cause of the error could not be determined".

Most likely cause for this error is insufficient resources. This can happen for example if you try to configure a hardware codec but there is not enough graphics memory available at the moment.

Suggestion 1: Make sure you release the codecs when you are done using them. You need to check all code paths.

Suggestion 2: Knowing that this can happen, you can filter the MediaCodecList keeping all the encoders that support the given format. Then wrap the configure() call in a try/catch block. And, if the call fails, try the next option from the list of codecs.

Note that on most devices there are at least two codecs for H264: a hardware codec and a software codec. The former one having better performance, the latter one being more resilient.

Upvotes: 2

Related Questions