extern jobject jni_LockAndGetAndroidJavaSurface();
extern void jni_UnlockAndroidSurface();
extern void jni_SetAndroidSurfaceSizeEnv(JNIEnv *p_env, int width, int height, int visible_width, int visible_height, int sar_num, int sar_den);
+extern void jni_EventHardwareAccelerationError();
struct decoder_sys_t
{
bool started;
bool decoded;
+ bool error_state;
+ bool error_event_sent;
ArchitectureSpecificCopyData architecture_specific_data;
p_sys->buffer_info, (jlong) 0);
if ((*env)->ExceptionOccurred(env)) {
(*env)->ExceptionClear(env);
+ p_sys->error_state = true;
return;
}
msg_Err(p_dec, "Codec error (IllegalStateException) in MediaCodec.releaseOutputBuffer");
(*env)->ExceptionClear(env);
(*env)->DeleteLocalRef(env, illegalStateException);
+ p_sys->error_state = true;
}
}
(*env)->DeleteLocalRef(env, buf);
block_t *p_block = *pp_block;
+ if (p_sys->error_state) {
+ block_Release(p_block);
+ if (!p_sys->error_event_sent) {
+ /* Signal the error to the Java. */
+ jni_EventHardwareAccelerationError();
+ p_sys->error_event_sent = true;
+ }
+ return NULL;
+ }
+
(*myVm)->AttachCurrentThread(myVm, &env, NULL);
if (p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED)) {
if ((*env)->ExceptionOccurred(env)) {
msg_Warn(p_dec, "Exception occurred in MediaCodec.flush");
(*env)->ExceptionClear(env);
+ p_sys->error_state = true;
}
}
p_sys->decoded = false;
int index = (*env)->CallIntMethod(env, p_sys->codec, p_sys->dequeue_input_buffer, timeout);
if ((*env)->ExceptionOccurred(env)) {
(*env)->ExceptionClear(env);
+ p_sys->error_state = true;
break;
}
if (index < 0) {