Commit e29f8ecf authored by Thomas Guillem's avatar Thomas Guillem

android: add AWindowHandler and android_getEnv

android_getEnv: get a JNIEnv* from the Java VM passed via the "android-jvm"
option.

AWindowHandler: utility class that provide a way to get the Video / Subtitles
Java Surface or ANativeWindow.
parent 63dbabfd
......@@ -4,7 +4,8 @@ aout_LTLIBRARIES =
libopensles_android_plugin_la_SOURCES = audio_output/opensles_android.c
libopensles_android_plugin_la_LIBADD = $(LIBDL) $(LIBM)
libandroid_audiotrack_plugin_la_SOURCES = audio_output/audiotrack.c
libandroid_audiotrack_plugin_la_SOURCES = audio_output/audiotrack.c \
video_output/android/utils.c video_output/android/utils.h
libandroid_audiotrack_plugin_la_CFLAGS = $(AM_CFLAGS)
if HAVE_ANDROID
......
......@@ -33,6 +33,7 @@
#include <vlc_common.h>
#include <vlc_plugin.h>
#include <vlc_aout.h>
#include "../video_output/android/utils.h"
#define MIN_AUDIOTRACK_BUFFER_US INT64_C(250000) // 250ms
#define MAX_AUDIOTRACK_BUFFER_US INT64_C(1000000) // 1000ms
......@@ -131,7 +132,7 @@ vlc_module_begin ()
vlc_module_end ()
#define THREAD_NAME "android_audiotrack"
extern JNIEnv *jni_get_env(const char *name);
#define GET_ENV() android_getEnv( VLC_OBJECT(p_aout), THREAD_NAME )
static struct
{
......@@ -200,26 +201,19 @@ static struct
/* init all jni fields.
* Done only one time during the first initialisation */
static bool
InitJNIFields( audio_output_t *p_aout )
InitJNIFields( audio_output_t *p_aout, JNIEnv* env )
{
static vlc_mutex_t lock = VLC_STATIC_MUTEX;
static int i_init_state = -1;
bool ret;
jclass clazz;
jfieldID field;
JNIEnv* env = NULL;
vlc_mutex_lock( &lock );
if( i_init_state != -1 )
goto end;
if (!(env = jni_get_env(THREAD_NAME)))
{
i_init_state = 0;
goto end;
}
#define CHECK_EXCEPTION( what, critical ) do { \
if( (*env)->ExceptionOccurred( env ) ) \
{ \
......@@ -650,7 +644,7 @@ TimeGet( audio_output_t *p_aout, mtime_t *restrict p_delay )
mtime_t i_audiotrack_us;
JNIEnv *env;
if( p_sys->b_error || !( env = jni_get_env( THREAD_NAME ) ) )
if( p_sys->b_error || !( env = GET_ENV() ) )
return -1;
if( p_sys->b_spdif )
......@@ -848,7 +842,7 @@ Start( audio_output_t *p_aout, audio_sample_format_t *restrict p_fmt )
b_spdif = var_InheritBool( p_aout, "spdif" );
i_max_channels = var_InheritInteger( p_aout, "audiotrack-audio-channels" );
if( !( env = jni_get_env( THREAD_NAME ) ) )
if( !( env = GET_ENV() ) )
return VLC_EGENERIC;
p_sys->fmt = *p_fmt;
......@@ -1043,7 +1037,7 @@ Stop( audio_output_t *p_aout )
aout_sys_t *p_sys = p_aout->sys;
JNIEnv *env;
if( !( env = jni_get_env( THREAD_NAME ) ) )
if( !( env = GET_ENV() ) )
return;
if( p_sys->p_audiotrack )
......@@ -1326,7 +1320,7 @@ Play( audio_output_t *p_aout, block_t *p_buffer )
mtime_t i_play_wait = 0;
aout_sys_t *p_sys = p_aout->sys;
if( p_sys->b_error || !( env = jni_get_env( THREAD_NAME ) ) )
if( p_sys->b_error || !( env = GET_ENV() ) )
goto bailout;
p_sys->b_error = AudioTrack_PreparePlay( env, p_aout, p_buffer )
......@@ -1368,7 +1362,7 @@ Pause( audio_output_t *p_aout, bool b_pause, mtime_t i_date )
JNIEnv *env;
VLC_UNUSED( i_date );
if( p_sys->b_error || !( env = jni_get_env( THREAD_NAME ) ) )
if( p_sys->b_error || !( env = GET_ENV() ) )
return;
if( b_pause )
......@@ -1389,7 +1383,7 @@ Flush( audio_output_t *p_aout, bool b_wait )
aout_sys_t *p_sys = p_aout->sys;
JNIEnv *env;
if( p_sys->b_error || !( env = jni_get_env( THREAD_NAME ) ) )
if( p_sys->b_error || !( env = GET_ENV() ) )
return;
/* Android doc:
......@@ -1434,8 +1428,9 @@ Open( vlc_object_t *obj )
{
audio_output_t *p_aout = (audio_output_t *) obj;
aout_sys_t *p_sys;
JNIEnv *env = GET_ENV();
if( !InitJNIFields( p_aout ) )
if( !env || !InitJNIFields( p_aout, env ) )
return VLC_EGENERIC;
p_sys = calloc( 1, sizeof (aout_sys_t) );
......@@ -1463,7 +1458,7 @@ Close( vlc_object_t *obj )
aout_sys_t *p_sys = p_aout->sys;
JNIEnv *env;
if( ( env = jni_get_env( THREAD_NAME ) ) )
if( ( env = GET_ENV() ) )
{
if( p_sys->p_bytearray )
(*env)->DeleteGlobalRef( env, p_sys->p_bytearray );
......
......@@ -391,6 +391,9 @@ libomxil_plugin_la_SOURCES = \
codec/omxil/qcom.c codec/omxil/qcom.h \
codec/omxil/omxil.c codec/omxil/omxil.h codec/omxil/omxil_core.c codec/omxil/omxil_core.h \
video_chroma/copy.c
if HAVE_ANDROID
libomxil_plugin_la_SOURCES += video_output/android/utils.c video_output/android/utils.h
endif
libomxil_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/codec/omxil $(CFLAGS_omxil)
libomxil_plugin_la_LIBADD = $(LIBDL)
libomxil_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(codecdir)'
......@@ -408,6 +411,7 @@ libmediacodec_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/codec/omxil
libmediacodec_plugin_la_SOURCES = codec/omxil/mediacodec.c codec/omxil/mediacodec.h \
codec/omxil/mediacodec_jni.c codec/omxil/mediacodec_ndk.c codec/omxil/utils.c \
video_chroma/copy.c codec/omxil/android_opaque.c codec/omxil/android_opaque.h \
video_output/android/utils.c video_output/android/utils.h
packetizer/h264_nal.c packetizer/h264_nal.h
packetizer/hevc_nal.c packetizer/hevc_nal.h
......
......@@ -48,9 +48,7 @@
#include "../../video_output/android/android_window.h"
/* JNI functions to get/set an Android Surface object. */
extern jobject jni_LockAndGetAndroidJavaSurface();
extern void jni_UnlockAndroidSurface();
extern void jni_EventHardwareAccelerationError();
extern void jni_EventHardwareAccelerationError(); // TODO REMOVE
/* Implementation of a circular buffer of timestamps with overwriting
* of older values. MediaCodec has only one type of timestamp, if a
......@@ -136,6 +134,7 @@ struct csd
struct decoder_sys_t
{
mc_api *api;
AWindowHandler *p_awh;
char *psz_name;
uint32_t nal_size;
......@@ -341,7 +340,6 @@ static int StartMediaCodec(decoder_t *p_dec)
int i_angle = 0, i_ret;
size_t h264_profile = 0;
char *psz_name = NULL;
jobject jsurface = NULL;
if (p_dec->fmt_in.i_extra && !p_sys->p_csd)
{
......@@ -424,12 +422,10 @@ static int StartMediaCodec(decoder_t *p_dec)
if (!psz_name)
return VLC_EGENERIC;
if (var_InheritBool(p_dec, CFG_PREFIX "dr"))
jsurface = jni_LockAndGetAndroidJavaSurface();
i_ret = p_sys->api->start(p_sys->api, jsurface, psz_name, p_sys->mime,
if (!p_sys->p_awh && var_InheritBool(p_dec, CFG_PREFIX "dr"))
p_sys->p_awh = AWindowHandler_new(VLC_OBJECT(p_dec));
i_ret = p_sys->api->start(p_sys->api, p_sys->p_awh, psz_name, p_sys->mime,
p_sys->i_width, p_sys->i_height, i_angle);
if (jsurface)
jni_UnlockAndroidSurface();
if (i_ret == VLC_SUCCESS)
{
......@@ -462,6 +458,11 @@ static void StopMediaCodec(decoder_t *p_dec)
p_sys->psz_name = NULL;
p_sys->api->stop(p_sys->api);
if (p_sys->p_awh)
{
AWindowHandler_releaseANativeWindow(p_sys->p_awh, AWindow_Video);
AWindowHandler_releaseSurface(p_sys->p_awh, AWindow_Video);
}
}
/*****************************************************************************
......@@ -592,6 +593,8 @@ static void CloseDecoder(vlc_object_t *p_this)
timestamp_FifoRelease(p_sys->timestamp_fifo);
p_sys->api->clean(p_sys->api);
free(p_sys->api);
if (p_sys->p_awh)
AWindowHandler_destroy(p_sys->p_awh);
free(p_sys);
}
......
......@@ -22,6 +22,7 @@
#define VLC_MEDIACODEC_H
#include <vlc_common.h>
#include "../../video_output/android/utils.h"
typedef struct mc_api mc_api;
typedef struct mc_api_sys mc_api_sys;
......@@ -74,7 +75,7 @@ struct mc_api
bool b_support_interlaced;
void (*clean)(mc_api *);
int (*start)(mc_api *, jobject jsurface, const char *psz_name,
int (*start)(mc_api *, AWindowHandler *p_awh, const char *psz_name,
const char *psz_mime, int i_width, int i_height, int i_angle);
int (*stop)(mc_api *);
int (*flush)(mc_api *);
......
......@@ -38,7 +38,6 @@
#include "mediacodec.h"
#define THREAD_NAME "mediacodec_jni"
extern JNIEnv *jni_get_env(const char *name);
#define BUFFER_FLAG_CODEC_CONFIG 2
#define INFO_OUTPUT_BUFFERS_CHANGED -3
......@@ -174,7 +173,7 @@ static inline bool check_exception(JNIEnv *env)
return false;
}
#define CHECK_EXCEPTION() check_exception( env )
#define GET_ENV() if (!(env = jni_get_env(THREAD_NAME))) return VLC_EGENERIC;
#define GET_ENV() if (!(env = android_getEnv(api->p_obj, THREAD_NAME))) return VLC_EGENERIC;
/* Initialize all jni fields.
* Done only one time during the first initialisation */
......@@ -283,7 +282,7 @@ char* MediaCodec_GetName(vlc_object_t *p_obj, const char *psz_mime,
jstring jmime;
char *psz_name = NULL;
if (!(env = jni_get_env(THREAD_NAME)))
if (!(env = android_getEnv(p_obj, THREAD_NAME)))
return NULL;
if (!InitJNIFields(p_obj, env))
......@@ -459,7 +458,7 @@ static int Stop(mc_api *api)
/*****************************************************************************
* Start
*****************************************************************************/
static int Start(mc_api *api, jobject jsurface, const char *psz_name,
static int Start(mc_api *api, AWindowHandler *p_awh, const char *psz_name,
const char *psz_mime, int i_width, int i_height, int i_angle)
{
mc_api_sys *p_sys = api->p_sys;
......@@ -474,6 +473,7 @@ static int Start(mc_api *api, jobject jsurface, const char *psz_name,
jobject jinput_buffers = NULL;
jobject joutput_buffers = NULL;
jobject jbuffer_info = NULL;
jobject jsurface = NULL;
GET_ENV();
......@@ -499,6 +499,8 @@ static int Start(mc_api *api, jobject jsurface, const char *psz_name,
jfields.create_video_format, jmime,
i_width, i_height);
if (p_awh)
jsurface = AWindowHandler_getSurface(p_awh, AWindow_Video);
b_direct_rendering = !!jsurface;
/* There is no way to rotate the video using direct rendering (and using a
......@@ -825,7 +827,7 @@ static void Clean(mc_api *api)
*****************************************************************************/
int MediaCodecJni_Init(mc_api *api)
{
JNIEnv* env = NULL;
JNIEnv *env;
GET_ENV();
......
......@@ -37,10 +37,8 @@
#include "omxil_utils.h"
#include "mediacodec.h"
#include "../../video_output/android/utils.h"
#define THREAD_NAME "mediacodec_ndk"
extern JNIEnv *jni_get_env(const char *name);
/* Not in NdkMedia API but we need it since we send config data via input
* buffers and not via "csd-*" buffers from AMediaFormat */
......@@ -180,7 +178,6 @@ struct syms
} AMediaFormat;
};
static struct syms syms;
static native_window_api_t anw_syms;
struct members
{
......@@ -246,12 +243,6 @@ InitSymbols(mc_api *api)
}
*(void **)((uint8_t*)&syms + members[i].offset) = sym;
}
void *anw_handle = LoadNativeWindowAPI(&anw_syms);
if (!anw_handle)
{
dlclose(ndk_handle);
goto end;
}
i_init_state = 1;
end:
......@@ -271,7 +262,6 @@ struct mc_api_sys
{
AMediaCodec* p_codec;
AMediaFormat* p_format;
ANativeWindow* p_anw;
};
/*****************************************************************************
......@@ -299,11 +289,6 @@ static int Stop(mc_api *api)
syms.AMediaFormat.delete(p_sys->p_format);
p_sys->p_format = NULL;
}
if (p_sys->p_anw)
{
anw_syms.winRelease(p_sys->p_anw);
p_sys->p_anw = NULL;
}
msg_Dbg(api->p_obj, "MediaCodec via NDK closed");
return VLC_SUCCESS;
......@@ -312,11 +297,12 @@ static int Stop(mc_api *api)
/*****************************************************************************
* Start
*****************************************************************************/
static int Start(mc_api *api, jobject jsurface, const char *psz_name,
static int Start(mc_api *api, AWindowHandler *p_awh, const char *psz_name,
const char *psz_mime, int i_width, int i_height, int i_angle)
{
mc_api_sys *p_sys = api->p_sys;
int i_ret = VLC_EGENERIC;
ANativeWindow *p_anw = NULL;
p_sys->p_codec = syms.AMediaCodec.createCodecByName(psz_name);
if (!p_sys->p_codec)
......@@ -338,17 +324,11 @@ static int Start(mc_api *api, jobject jsurface, const char *psz_name,
syms.AMediaFormat.setInt32(p_sys->p_format, "rotation-degrees", i_angle);
syms.AMediaFormat.setInt32(p_sys->p_format, "encoder", 0);
if (jsurface)
{
JNIEnv *env;
if (!(env = jni_get_env(THREAD_NAME)))
goto error;
p_sys->p_anw = anw_syms.winFromSurface(env, jsurface);
}
if (p_awh)
p_anw = AWindowHandler_getANativeWindow(p_awh, AWindow_Video);
if (syms.AMediaCodec.configure(p_sys->p_codec, p_sys->p_format,
p_sys->p_anw, NULL, 0) != AMEDIA_OK)
p_anw, NULL, 0) != AMEDIA_OK)
{
msg_Err(api->p_obj, "AMediaCodec.configure failed");
goto error;
......@@ -360,7 +340,7 @@ static int Start(mc_api *api, jobject jsurface, const char *psz_name,
}
api->b_started = true;
api->b_direct_rendering = !!p_sys->p_anw;
api->b_direct_rendering = !!p_anw;
api->b_support_interlaced = true;
i_ret = VLC_SUCCESS;
......
This diff is collapsed.
......@@ -74,11 +74,9 @@ typedef struct HwBuffer
unsigned int i_max_owned;
unsigned int i_owned;
void *p_library;
void *window;
#if defined(USE_IOMX)
native_window_api_t native_window;
native_window_priv_api_t anwpriv;
AWindowHandler *p_awh;
native_window_priv_api_t *anwpriv;
native_window_priv *window_priv;
#endif
......
......@@ -266,7 +266,8 @@ libegl_android_plugin_la_SOURCES = video_output/egl.c
libegl_android_plugin_la_CFLAGS = $(AM_CFLAGS) $(EGL_CFLAGS) -DUSE_PLATFORM_ANDROID=1
libegl_android_plugin_la_LIBADD = $(EGL_LIBS)
libandroid_native_window_plugin_la_SOURCES = video_output/android/nativewindow.c video_output/android/utils.c
libandroid_native_window_plugin_la_SOURCES = video_output/android/nativewindow.c \
video_output/android/utils.c video_output/android/utils.h
libandroid_native_window_plugin_la_CFLAGS = $(AM_CFLAGS)
libandroid_native_window_plugin_la_LIBADD = $(LIBDL)
......
......@@ -38,10 +38,6 @@
#include "utils.h"
#define THREAD_NAME "ANativeWindow"
extern JNIEnv *jni_get_env(const char *name);
extern jobject jni_LockAndGetAndroidJavaSurface();
extern void jni_UnlockAndroidSurface();
extern void jni_SetSurfaceLayout(int width, int height, int visible_width, int visible_height, int sar_num, int sar_den);
static int Open(vout_window_t *, const vout_window_cfg_t *);
static void Close(vout_window_t *);
......@@ -62,10 +58,7 @@ vlc_module_end()
struct vout_window_sys_t
{
void *p_library;
native_window_api_t native_window;
ANativeWindow *window;
AWindowHandler *p_awh;
};
/**
......@@ -73,6 +66,8 @@ struct vout_window_sys_t
*/
static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg)
{
ANativeWindow *p_anw;
if (cfg->type != VOUT_WINDOW_TYPE_INVALID
&& cfg->type != VOUT_WINDOW_TYPE_ANDROID_NATIVE)
return VLC_EGENERIC;
......@@ -81,40 +76,27 @@ static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg)
if (p_sys == NULL)
return VLC_ENOMEM;
p_sys->p_library = LoadNativeWindowAPI(&p_sys->native_window);
if (p_sys->p_library == NULL)
{
free(p_sys);
return VLC_EGENERIC;
}
// Create the native window by first getting the Java surface.
jobject javaSurface = jni_LockAndGetAndroidJavaSurface();
if (javaSurface == NULL)
goto error;
JNIEnv *p_env;
if (!(p_env = jni_get_env(THREAD_NAME)))
p_sys->p_awh = AWindowHandler_new(VLC_OBJECT(wnd));
if (!p_sys->p_awh)
goto error;
p_sys->window = p_sys->native_window.winFromSurface(p_env, javaSurface); // ANativeWindow_fromSurface call.
jni_UnlockAndroidSurface();
if (p_sys->window == NULL)
p_anw = AWindowHandler_getANativeWindow(p_sys->p_awh, AWindow_Video);
if (!p_anw)
goto error;
wnd->type = VOUT_WINDOW_TYPE_ANDROID_NATIVE;
wnd->handle.anativewindow = p_sys->window;
wnd->handle.anativewindow = p_anw;
wnd->control = Control;
wnd->sys = p_sys;
// Set the Java surface size.
jni_SetSurfaceLayout(cfg->width, cfg->height, cfg->width, cfg->height, 1, 1);
AWindowHandler_setWindowLayout(p_sys->p_awh, cfg->width, cfg->height,
cfg->width, cfg->height, 1, 1);
return VLC_SUCCESS;
error:
dlclose(p_sys->p_library);
if (p_sys->p_awh)
AWindowHandler_destroy(p_sys->p_awh);
free(p_sys);
return VLC_EGENERIC;
}
......@@ -126,8 +108,7 @@ error:
static void Close(vout_window_t *wnd)
{
vout_window_sys_t *p_sys = wnd->sys;
p_sys->native_window.winRelease(p_sys->window); // Release the native window.
dlclose(p_sys->p_library); // Close the library.
AWindowHandler_destroy(p_sys->p_awh);
free (p_sys);
}
......@@ -143,7 +124,8 @@ static int Control(vout_window_t *wnd, int cmd, va_list ap)
{
unsigned width = va_arg(ap, unsigned);
unsigned height = va_arg(ap, unsigned);
jni_SetSurfaceLayout(width, height, width, height, 1, 1);
AWindowHandler_setWindowLayout(wnd->sys->p_awh, width, height,
width, height, 1, 1);
break;
}
case VOUT_WINDOW_SET_STATE:
......
This diff is collapsed.
/*****************************************************************************
* utils.h: shared code between Android vout modules.
*****************************************************************************
* Copyright (C) 2014 VLC authors and VideoLAN
* Copyright (C) 2014-2015 VLC authors and VideoLAN
*
* Authors: Felix Abecassis <felix.abecassis@gmail.com>
* Thomas Guillem <thomas@gllm.fr>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
......@@ -24,38 +25,43 @@
# include "config.h"
#endif
#include <android/native_window.h>
#include <jni.h>
#include <android/native_window.h>
#include <android/native_window_jni.h>
#include <android/input.h>
#include <vlc_vout_display.h>
#include <vlc_common.h>
typedef struct AWindowHandler AWindowHandler;
enum AWindow_ID {
AWindow_Video,
AWindow_Subtitles,
AWindow_Max,
};
/**
* native_window_api_t. See android/native_window.h in NDK
*/
typedef ANativeWindow* (*ptr_ANativeWindow_fromSurface)(JNIEnv*, jobject);
typedef void (*ptr_ANativeWindow_release)(ANativeWindow*);
typedef int32_t (*ptr_ANativeWindow_lock)(ANativeWindow*, ANativeWindow_Buffer*, ARect*);
typedef void (*ptr_ANativeWindow_unlockAndPost)(ANativeWindow*);
typedef int32_t (*ptr_ANativeWindow_setBuffersGeometry)(ANativeWindow*, int32_t, int32_t, int32_t);
typedef struct
{
ptr_ANativeWindow_fromSurface winFromSurface;
ptr_ANativeWindow_release winRelease;
ptr_ANativeWindow_lock winLock;
ptr_ANativeWindow_unlockAndPost unlockAndPost;
ptr_ANativeWindow_setBuffersGeometry setBuffersGeometry; /* can be NULL */
} native_window_api_t;
/* Fill the structure passed as parameter and return a library handle
that should be destroyed with dlclose. */
void *LoadNativeWindowAPI(native_window_api_t *native);
/* Pre Android 2.3 NativeSurface, no need to free a handle,
* native->sys->anwp.setBuffersGeometry will be NULL. */
void LoadNativeSurfaceAPI(native_window_api_t *native);
/**
* native_window_priv_api_t. See system/core/include/system/window.h in AOSP.
*/
typedef struct native_window_priv native_window_priv;
typedef native_window_priv *(*ptr_ANativeWindowPriv_connect) (void *);
typedef native_window_priv *(*ptr_ANativeWindowPriv_connect) (ANativeWindow *);
typedef int (*ptr_ANativeWindowPriv_disconnect) (native_window_priv *);
typedef int (*ptr_ANativeWindowPriv_setUsage) (native_window_priv *, bool, int );
typedef int (*ptr_ANativeWindowPriv_setBuffersGeometry) (native_window_priv *, int, int, int );
......@@ -90,6 +96,77 @@ typedef struct
ptr_ANativeWindowPriv_setOrientation setOrientation;
} native_window_priv_api_t;
/* Fill the structure passed as parameter and return 0 if all symbols are
found. Don't need to call dlclose, the lib is already loaded. */
int LoadNativeWindowPrivAPI(native_window_priv_api_t *native);
/**
* This function returns a JNIEnv* created from the android JavaVM attached to
* the VLC object var. it doesn't need to be released.
*/
JNIEnv *android_getEnv(vlc_object_t *p_obj, const char *psz_thread_name);
/**
* This function return a new AWindowHandler created from a
* IAWindowNativeHandler jobject attached to the VLC object var. It must be
* released with AWindowHandler_destroy.
*/
AWindowHandler *AWindowHandler_new(vlc_object_t *p_obj);
void AWindowHandler_destroy(AWindowHandler *p_awh);
/**
* This functions returns a native_window_api_t that can be used to access the
* public ANativeWindow API. It can't be NULL and shouldn't be released
*/
native_window_api_t *AWindowHandler_getANativeWindowAPI(AWindowHandler *p_awh);
/**
* This function returns a native_window_priv_api_t that can be used to access
* the private ANativeWindow API. It can be NULL and shouldn't be released
*/
native_window_priv_api_t *AWindowHandler_getANativeWindowPrivAPI(AWindowHandler *p_awh);
/**
* This function retrieves the mouse coordinates sent by the Android
* MediaPlayer. It returns true if the coordinates are valid.
*/
bool AWindowHandler_getMouseCoordinates(AWindowHandler *p_awh,
int *p_action, int *p_button,
int *p_x, int *p_y);
/**
* This function retrieves the window size sent by the Android MediaPlayer. It
* returns true if the size is valid.
*/
bool AWindowHandler_getWindowSize(AWindowHandler *p_awh,
int *p_width, int *p_height);
/**
* This function returns the Video or the Subtitles Android Surface attached to
* the MediaPlayer. It can be released with AWindowHandler_releaseSurface or by
* AWindowHandler_destroy.
*/
jobject AWindowHandler_getSurface(AWindowHandler *p_awh, enum AWindow_ID id);
void AWindowHandler_releaseSurface(AWindowHandler *p_awh, enum AWindow_ID id);
/**
* This function returns the Video or the Subtitles ANativeWindow attached to
* the Android Surface. It can be released with
* AWindowHandler_releaseANativeWindow or by AWindowHandler_destroy.
*/
ANativeWindow *AWindowHandler_getANativeWindow(AWindowHandler *p_awh,
enum AWindow_ID id);
void AWindowHandler_releaseANativeWindow(AWindowHandler *p_awh,
enum AWindow_ID id);
/**
* This function is a fix up of ANativeWindow_setBuffersGeometry that doesn't
* work before Android ICS. It configures the Surface from the Android
* MainThread via a SurfaceHolder. It returns VLC_SUCCESS if the Surface was
* configured (it returns VLC_EGENERIC after Android ICS).
*/
int AWindowHandler_setBuffersGeometry(AWindowHandler *p_awh, enum AWindow_ID id,
int i_width, int i_height, int i_format);
/**
* This function set the window layout.
*/
int AWindowHandler_setWindowLayout(AWindowHandler *p_awh,
int i_width, int i_height,
int i_visible_width, int i_visible_height,
int i_sar_num, int i_sar_den);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment