private IEnumerator initDecoderAsync(string path) { print(LOG_TAG + " init Decoder."); decoderState = NativeClass.DecoderState.INITIALIZING; mediaPath = path; decoderID = -1; NativeClass.nativeCreateDecoderAsync(mediaPath, ref decoderID); var result = 0; do { yield return(null); result = NativeClass.nativeGetDecoderState(decoderID); } while (!(result == 1 || result == -1)); // Init success. if (result == 1) { print(LOG_TAG + " Init success."); isVideoEnabled = NativeClass.nativeIsVideoEnabled(decoderID); if (isVideoEnabled) { var duration = 0.0f; NativeClass.nativeGetVideoFormat(decoderID, ref videoWidth, ref videoHeight, ref duration); videoTotalTime = duration > 0 ? duration : -1.0f; print(LOG_TAG + " Video format: (" + videoWidth + ", " + videoHeight + ")"); if (videoTotalTime > 0) { print(LOG_TAG + " Total time: " + videoTotalTime); } setTextures(null, null, null); useDefault = true; } // Initialize audio. isAudioEnabled = NativeClass.nativeIsAudioEnabled(decoderID); print(LOG_TAG + " isAudioEnabled = " + isAudioEnabled); if (isAudioEnabled) { if (isAllAudioChEnabled) { NativeClass.nativeSetAudioAllChDataEnable(decoderID, isAllAudioChEnabled); getAudioFormat(); } else { getAudioFormat(); initAudioSource(); } } decoderState = NativeClass.DecoderState.INITIALIZED; if (onInitComplete != null) { onInitComplete.Invoke(); } } else { print(LOG_TAG + " Init fail."); decoderState = NativeClass.DecoderState.INIT_FAIL; } }