static android_window *AndroidWindow_New(vout_display_t *vd, video_format_t *p_fmt, enum AWindow_ID id, bool b_use_priv) { vout_display_sys_t *sys = vd->sys; android_window *p_window = NULL; p_window = calloc(1, sizeof(android_window)); if (!p_window) goto error; p_window->id = id; p_window->b_opaque = p_fmt->i_chroma == VLC_CODEC_ANDROID_OPAQUE; if (!p_window->b_opaque) { p_window->b_use_priv = sys->anwp && b_use_priv; p_window->i_android_hal = ChromaToAndroidHal(p_fmt->i_chroma); if (p_window->i_android_hal == -1) goto error; } switch (p_fmt->orientation) { case ORIENT_ROTATED_90: p_window->i_angle = 90; break; case ORIENT_ROTATED_180: p_window->i_angle = 180; break; case ORIENT_ROTATED_270: p_window->i_angle = 270; break; default: p_window->i_angle = 0; } if (p_window->b_use_priv) p_window->fmt = *p_fmt; else video_format_ApplyRotation(&p_window->fmt, p_fmt); p_window->i_pic_count = 1; if (AndroidWindow_ConnectSurface(sys, p_window) != 0) { if (id == AWindow_Video) msg_Err(vd, "can't get Video Surface"); else if (id == AWindow_Subtitles) msg_Err(vd, "can't get Subtitles Surface"); goto error; } return p_window; error: free(p_window); return NULL; }
static int AndroidWindow_ConfigureJavaSurface(vout_display_sys_t *sys, android_window *p_window, bool *p_java_configured) { /* setBuffersGeometry is broken before ics. Use * AJavaWindow_setBuffersGeometry to configure the surface on the java side * synchronously. AJavaWindow_setBuffersGeometry return en error when you * don't need to call it (ie, after ics). if this call succeed, you need to * get a new surface handle. That's why AndroidWindow_DisconnectSurface is * called here. */ if (AWindowHandler_setBuffersGeometry(sys->p_awh, p_window->id, p_window->fmt.i_width, p_window->fmt.i_height, p_window->i_android_hal) == VLC_SUCCESS) { *p_java_configured = true; AndroidWindow_DisconnectSurface(sys, p_window); if (AndroidWindow_ConnectSurface(sys, p_window) != 0) return -1; } else *p_java_configured = false; return 0; }