static int AndroidWindow_ConfigureJavaSurface(vout_display_sys_t *sys, android_window *p_window, bool *p_java_configured) { int err; bool configured = false; /* setBuffersGeometry is broken before ics. Use jni_ConfigureSurface to * configure the surface on the java side synchronously. * jni_ConfigureSurface return -1 when you don't need to call it (ie, after * ics). if jni_ConfigureSurface succeed, you need to get a new surface * handle. That's why AndroidWindow_SetSurface is called again here. */ err = jni_ConfigureSurface(p_window->jsurf, p_window->fmt.i_width, p_window->fmt.i_height, p_window->i_android_hal, &configured); if (err == 0) { if (configured) { jobject jsurf = p_window->jsurf; p_window->jsurf = NULL; if (AndroidWindow_SetSurface(sys, p_window, jsurf) != 0) return -1; } else return -1; } *p_java_configured = configured; return 0; }
static int AndroidLockSurface(picture_t *picture) { picture_sys_t *picsys = picture->p_sys; vout_display_sys_t *sys = picsys->sys; SurfaceInfo *info = &picsys->info; uint32_t sw, sh; if (!sys->native_surface) { picsys->surf = jni_LockAndGetAndroidJavaSurface(); if (unlikely(!picsys->surf)) { jni_UnlockAndroidSurface(); return VLC_EGENERIC; } sys->native_surface = jni_AndroidJavaSurfaceToNativeSurface(picsys->surf); jni_UnlockAndroidSurface(); if (!sys->native_surface) return VLC_EGENERIC; } sw = sys->fmt.i_width; sh = sys->fmt.i_height; // For RGB (32 or 16) we need to align on 8 or 4 pixels, 16 pixels for YUV int align_pixels = (16 / picture->p[0].i_pixel_pitch) - 1; uint32_t aligned_width = (sw + align_pixels) & ~align_pixels; if (aligned_width != sys->i_alloc_width || sh != sys->i_alloc_height) { bool configured; if (jni_ConfigureSurface(picsys->surf, aligned_width, sh, sys->i_android_hal, &configured) == -1 || !configured) { return VLC_EGENERIC; } sys->i_alloc_width = aligned_width; sys->i_alloc_height = sh; sys->native_surface = jni_AndroidJavaSurfaceToNativeSurface(picsys->surf); UpdateLayout(sys); } if (sys->s_lock) sys->s_lock(sys->native_surface, info, 1); else sys->s_lock2(sys->native_surface, info, NULL); if (info->w != sys->i_alloc_width || info->h != sh) { sys->s_unlockAndPost(sys->native_surface); return VLC_EGENERIC; } picture->p[0].p_pixels = (uint8_t*)info->bits; picture->p[0].i_lines = info->h; picture->p[0].i_pitch = picture->p[0].i_pixel_pitch * info->s; return VLC_SUCCESS; }