nsresult MediaCodecDataDecoder::InitDecoder(Surface::Param aSurface) { mDecoder = CreateDecoder(mMimeType); if (!mDecoder) { INVOKE_CALLBACK(Error, MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__)); return NS_ERROR_FAILURE; } // Check if the video codec supports adaptive playback or not. if (aSurface && java::HardwareCodecCapabilityUtils::CheckSupportsAdaptivePlayback( mDecoder, nsCString(TranslateMimeType(mMimeType)))) { // TODO: may need to find a way to not use hard code to decide the max w/h. mFormat->SetInteger(MediaFormat::KEY_MAX_WIDTH, 1920); mFormat->SetInteger(MediaFormat::KEY_MAX_HEIGHT, 1080); } MediaCrypto::LocalRef crypto = MediaDrmProxy::GetMediaCrypto(mDrmStubId); bool hascrypto = !!crypto; LOG("Has(%d) MediaCrypto (%s)", hascrypto, NS_ConvertUTF16toUTF8(mDrmStubId).get()); nsresult rv; NS_ENSURE_SUCCESS(rv = mDecoder->Configure(mFormat, aSurface, crypto, 0), rv); NS_ENSURE_SUCCESS(rv = mDecoder->Start(), rv); NS_ENSURE_SUCCESS(rv = ResetInputBuffers(), rv); NS_ENSURE_SUCCESS(rv = ResetOutputBuffers(), rv); nsCOMPtr<nsIRunnable> r = NewRunnableMethod(this, &MediaCodecDataDecoder::DecoderLoop); rv = NS_NewNamedThread("MC Decoder", getter_AddRefs(mThread), r); return rv; }
nsresult MediaCodecDataDecoder::InitDecoder(Surface::Param aSurface) { mDecoder = CreateDecoder(mMimeType); if (!mDecoder) { ENVOKE_CALLBACK(Error); return NS_ERROR_FAILURE; } nsresult rv; NS_ENSURE_SUCCESS(rv = mDecoder->Configure(mFormat, aSurface, nullptr, 0), rv); NS_ENSURE_SUCCESS(rv = mDecoder->Start(), rv); NS_ENSURE_SUCCESS(rv = ResetInputBuffers(), rv); NS_ENSURE_SUCCESS(rv = ResetOutputBuffers(), rv); NS_NewNamedThread("MC Decoder", getter_AddRefs(mThread), NS_NewRunnableMethod(this, &MediaCodecDataDecoder::DecoderLoop)); return NS_OK; }
nsresult MediaCodecDataDecoder::GetInputBuffer(JNIEnv* env, int index, jni::Object::LocalRef* buffer) { bool retried = false; while (!*buffer) { *buffer = jni::Object::LocalRef::Adopt(env->GetObjectArrayElement(mInputBuffers.Get(), index)); if (!*buffer) { if (!retried) { // Reset the input buffers and then try again nsresult res = ResetInputBuffers(); if (NS_FAILED(res)) { return res; } retried = true; } else { // We already tried resetting the input buffers, return an error return NS_ERROR_FAILURE; } } } return NS_OK; }
nsresult MediaCodecDataDecoder::GetInputBuffer( JNIEnv* aEnv, int aIndex, jni::Object::LocalRef* aBuffer) { MOZ_ASSERT(aEnv); MOZ_ASSERT(!*aBuffer); int numTries = 2; while (numTries--) { *aBuffer = jni::Object::LocalRef::Adopt( aEnv->GetObjectArrayElement(mInputBuffers.Get(), aIndex)); if (*aBuffer) { return NS_OK; } nsresult res = ResetInputBuffers(); if (NS_FAILED(res)) { return res; } } return NS_ERROR_FAILURE; }