Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
Archivo: surface.c Proyecto: Kubink/vlc
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;
}