vlc | branch: master | Thomas Guillem <[email protected]> | Tue Nov 22 18:16:11 2016 +0100| [ee1c41694436c7ef812ace205fb8adee3860f8db] | committer: Thomas Guillem
vout: android: move native_window_priv_api_t from AWindowHandler > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ee1c41694436c7ef812ace205fb8adee3860f8db --- modules/codec/omxil/omxil.c | 41 ++++++++++++------------ modules/codec/omxil/omxil.h | 2 +- modules/video_output/android/display.c | 57 +++++++++++++++++----------------- modules/video_output/android/utils.c | 15 ++------- modules/video_output/android/utils.h | 14 +++++---- 5 files changed, 61 insertions(+), 68 deletions(-) diff --git a/modules/codec/omxil/omxil.c b/modules/codec/omxil/omxil.c index 2ffaa6a..3e071a3 100644 --- a/modules/codec/omxil/omxil.c +++ b/modules/codec/omxil/omxil.c @@ -2083,10 +2083,9 @@ static void HwBuffer_Init( decoder_t *p_dec, OmxPort *p_port ) msg_Warn( p_dec, "AWindowHandler_new failed" ); goto error; } - p_port->p_hwbuf->anwpriv = AWindowHandler_getANativeWindowPrivAPI( p_port->p_hwbuf->p_awh ); - if( !p_port->p_hwbuf->anwpriv ) + if( android_loadNativeWindowPrivApi( &p_port->p_hwbuf->anwpriv ) ) { - msg_Warn( p_dec, "AWindowHandler_getANativeWindowPrivAPI failed" ); + msg_Warn( p_dec, "android_loadNativeWindowPrivApi failed" ); goto error; } p_anw = AWindowHandler_getANativeWindow( p_port->p_hwbuf->p_awh, @@ -2097,7 +2096,7 @@ static void HwBuffer_Init( decoder_t *p_dec, OmxPort *p_port ) goto error; } - p_port->p_hwbuf->window_priv = p_port->p_hwbuf->anwpriv->connect( p_anw ); + p_port->p_hwbuf->window_priv = p_port->p_hwbuf->anwpriv.connect( p_anw ); if( !p_port->p_hwbuf->window_priv ) { msg_Warn( p_dec, "connect failed" ); goto error; @@ -2134,7 +2133,7 @@ static void HwBuffer_Destroy( decoder_t *p_dec, OmxPort *p_port ) HwBuffer_Stop( p_dec, p_port ); HwBuffer_FreeBuffers( p_dec, p_port ); HwBuffer_Join( p_dec, p_port ); - p_port->p_hwbuf->anwpriv->disconnect( p_port->p_hwbuf->window_priv ); + p_port->p_hwbuf->anwpriv.disconnect( p_port->p_hwbuf->window_priv ); pf_enable_graphic_buffers( p_port->omx_handle, p_port->i_port_index, OMX_FALSE ); } @@ -2201,17 +2200,17 @@ static int HwBuffer_AllocateBuffers( decoder_t *p_dec, OmxPort *p_port ) default: i_angle = 0; } - p_port->p_hwbuf->anwpriv->setOrientation( p_port->p_hwbuf->window_priv, + p_port->p_hwbuf->anwpriv.setOrientation( p_port->p_hwbuf->window_priv, i_angle ); } - if( p_port->p_hwbuf->anwpriv->setUsage( p_port->p_hwbuf->window_priv, + if( p_port->p_hwbuf->anwpriv.setUsage( p_port->p_hwbuf->window_priv, true, (int) i_hw_usage ) != 0 ) { msg_Err( p_dec, "can't set usage" ); goto error; } - if( p_port->p_hwbuf->anwpriv->setBuffersGeometry( p_port->p_hwbuf->window_priv, + if( p_port->p_hwbuf->anwpriv.setBuffersGeometry( p_port->p_hwbuf->window_priv, def->format.video.nFrameWidth, def->format.video.nFrameHeight, colorFormat ) != 0 ) @@ -2220,7 +2219,7 @@ static int HwBuffer_AllocateBuffers( decoder_t *p_dec, OmxPort *p_port ) goto error; } - if( p_port->p_hwbuf->anwpriv->getMinUndequeued( p_port->p_hwbuf->window_priv, + if( p_port->p_hwbuf->anwpriv.getMinUndequeued( p_port->p_hwbuf->window_priv, &min_undequeued ) != 0 ) { msg_Err( p_dec, "can't get min_undequeued" ); @@ -2242,7 +2241,7 @@ static int HwBuffer_AllocateBuffers( decoder_t *p_dec, OmxPort *p_port ) omx_error, ErrorToString(omx_error) ); } - if( p_port->p_hwbuf->anwpriv->setBufferCount( p_port->p_hwbuf->window_priv, + if( p_port->p_hwbuf->anwpriv.setBufferCount( p_port->p_hwbuf->window_priv, def->nBufferCountActual ) != 0 ) { msg_Err( p_dec, "can't set buffer_count" ); @@ -2270,7 +2269,7 @@ static int HwBuffer_AllocateBuffers( decoder_t *p_dec, OmxPort *p_port ) { void *p_handle = NULL; - if( p_port->p_hwbuf->anwpriv->dequeue( p_port->p_hwbuf->window_priv, + if( p_port->p_hwbuf->anwpriv.dequeue( p_port->p_hwbuf->window_priv, &p_handle ) != 0 ) { msg_Err( p_dec, "OMXHWBuffer_dequeue Fail" ); @@ -2283,7 +2282,7 @@ static int HwBuffer_AllocateBuffers( decoder_t *p_dec, OmxPort *p_port ) for(; i < p_port->p_hwbuf->i_buffers; i++) { OMX_DBG( "canceling buffer(%d)", i ); - p_port->p_hwbuf->anwpriv->cancel( p_port->p_hwbuf->window_priv, + p_port->p_hwbuf->anwpriv.cancel( p_port->p_hwbuf->window_priv, p_port->p_hwbuf->pp_handles[i] ); } @@ -2314,7 +2313,7 @@ static int HwBuffer_FreeBuffers( decoder_t *p_dec, OmxPort *p_port ) if( p_handle && p_port->p_hwbuf->i_states[i] == BUF_STATE_OWNED ) { - p_port->p_hwbuf->anwpriv->cancel( p_port->p_hwbuf->window_priv, p_handle ); + p_port->p_hwbuf->anwpriv.cancel( p_port->p_hwbuf->window_priv, p_handle ); HwBuffer_ChangeState( p_dec, p_port, i, BUF_STATE_NOT_OWNED ); } } @@ -2354,7 +2353,7 @@ static int HwBuffer_Start( decoder_t *p_dec, OmxPort *p_port ) if( p_header && p_port->p_hwbuf->i_states[i] == BUF_STATE_OWNED ) { - if( p_port->p_hwbuf->anwpriv->lock( p_port->p_hwbuf->window_priv, + if( p_port->p_hwbuf->anwpriv.lock( p_port->p_hwbuf->window_priv, p_header->pBuffer ) != 0 ) { msg_Err( p_dec, "lock failed" ); @@ -2487,7 +2486,7 @@ static void HwBuffer_SetCrop( decoder_t *p_dec, OmxPort *p_port, { VLC_UNUSED( p_dec ); - p_port->p_hwbuf->anwpriv->setCrop( p_port->p_hwbuf->window_priv, + p_port->p_hwbuf->anwpriv.setCrop( p_port->p_hwbuf->window_priv, p_rect->nLeft, p_rect->nTop, p_rect->nWidth, p_rect->nHeight ); } @@ -2522,9 +2521,9 @@ static void *DequeueThread( void *data ) /* The thread can be stuck here. It shouldn't happen since we make sure * we call the dequeue function if there is at least one buffer * available. */ - err = p_port->p_hwbuf->anwpriv->dequeue( p_port->p_hwbuf->window_priv, &p_handle ); + err = p_port->p_hwbuf->anwpriv.dequeue( p_port->p_hwbuf->window_priv, &p_handle ); if( err == 0 ) - err = p_port->p_hwbuf->anwpriv->lock( p_port->p_hwbuf->window_priv, p_handle ); + err = p_port->p_hwbuf->anwpriv.lock( p_port->p_hwbuf->window_priv, p_handle ); HWBUFFER_LOCK( p_port ); @@ -2536,7 +2535,7 @@ static void *DequeueThread( void *data ) if( !p_port->p_hwbuf->b_run ) { - p_port->p_hwbuf->anwpriv->cancel( p_port->p_hwbuf->window_priv, p_handle ); + p_port->p_hwbuf->anwpriv.cancel( p_port->p_hwbuf->window_priv, p_handle ); continue; } @@ -2551,7 +2550,7 @@ static void *DequeueThread( void *data ) } if( i_index == -1 ) { - msg_Err( p_dec, "p_port->p_hwbuf->anwpriv->dequeue returned unknown handle" ); + msg_Err( p_dec, "p_port->p_hwbuf->anwpriv.dequeue returned unknown handle" ); continue; } @@ -2591,9 +2590,9 @@ static void ReleasePicture( decoder_t *p_dec, unsigned int i_index, } if( b_render ) - p_port->p_hwbuf->anwpriv->queue( p_port->p_hwbuf->window_priv, p_handle ); + p_port->p_hwbuf->anwpriv.queue( p_port->p_hwbuf->window_priv, p_handle ); else - p_port->p_hwbuf->anwpriv->cancel( p_port->p_hwbuf->window_priv, p_handle ); + p_port->p_hwbuf->anwpriv.cancel( p_port->p_hwbuf->window_priv, p_handle ); HwBuffer_ChangeState( p_dec, p_port, i_index, BUF_STATE_NOT_OWNED ); HWBUFFER_BROADCAST( p_port ); diff --git a/modules/codec/omxil/omxil.h b/modules/codec/omxil/omxil.h index b744b24..74a3621 100644 --- a/modules/codec/omxil/omxil.h +++ b/modules/codec/omxil/omxil.h @@ -77,7 +77,7 @@ typedef struct HwBuffer #if defined(USE_IOMX) AWindowHandler *p_awh; - native_window_priv_api_t *anwpriv; + native_window_priv_api_t anwpriv; native_window_priv *window_priv; #endif diff --git a/modules/video_output/android/display.c b/modules/video_output/android/display.c index 970c36c..7d9f9f3 100644 --- a/modules/video_output/android/display.c +++ b/modules/video_output/android/display.c @@ -113,7 +113,8 @@ struct vout_display_sys_t AWindowHandler *p_awh; native_window_api_t *anw; - native_window_priv_api_t *anwp; + native_window_priv_api_t anwp; + bool b_has_anwp; android_window *p_window; android_window *p_sub_window; @@ -332,7 +333,7 @@ static void AndroidWindow_DisconnectSurface(vout_display_sys_t *sys, bool b_clear) { if (p_window->p_surface_priv) { - sys->anwp->disconnect(p_window->p_surface_priv); + sys->anwp.disconnect(p_window->p_surface_priv); p_window->p_surface_priv = NULL; } if (p_window->p_surface) { @@ -369,7 +370,7 @@ static android_window *AndroidWindow_New(vout_display_t *vd, 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->b_use_priv = sys->b_has_anwp && b_use_priv; p_window->i_android_hal = ChromaToAndroidHal(p_fmt->i_chroma); if (p_window->i_android_hal == -1) @@ -424,11 +425,11 @@ static int AndroidWindow_UpdateCrop(vout_display_sys_t *sys, if (!p_window->p_surface_priv) return -1; - return sys->anwp->setCrop(p_window->p_surface_priv, - p_window->fmt.i_x_offset, - p_window->fmt.i_y_offset, - p_window->fmt.i_visible_width, - p_window->fmt.i_visible_height); + return sys->anwp.setCrop(p_window->p_surface_priv, + p_window->fmt.i_x_offset, + p_window->fmt.i_y_offset, + p_window->fmt.i_visible_width, + p_window->fmt.i_visible_height); } static int AndroidWindow_SetupANWP(vout_display_sys_t *sys, @@ -438,37 +439,37 @@ static int AndroidWindow_SetupANWP(vout_display_sys_t *sys, unsigned int i_max_buffer_count = 0; if (!p_window->p_surface_priv) - p_window->p_surface_priv = sys->anwp->connect(p_window->p_surface); + p_window->p_surface_priv = sys->anwp.connect(p_window->p_surface); if (!p_window->p_surface_priv) goto error; - if (sys->anwp->setUsage(p_window->p_surface_priv, false, 0) != 0) + if (sys->anwp.setUsage(p_window->p_surface_priv, false, 0) != 0) goto error; if (!b_java_configured - && sys->anwp->setBuffersGeometry(p_window->p_surface_priv, - p_window->fmt.i_width, - p_window->fmt.i_height, - p_window->i_android_hal) != 0) + && sys->anwp.setBuffersGeometry(p_window->p_surface_priv, + p_window->fmt.i_width, + p_window->fmt.i_height, + p_window->i_android_hal) != 0) goto error; - sys->anwp->getMinUndequeued(p_window->p_surface_priv, - &p_window->i_min_undequeued); + sys->anwp.getMinUndequeued(p_window->p_surface_priv, + &p_window->i_min_undequeued); - sys->anwp->getMaxBufferCount(p_window->p_surface_priv, &i_max_buffer_count); + sys->anwp.getMaxBufferCount(p_window->p_surface_priv, &i_max_buffer_count); if ((p_window->i_min_undequeued + p_window->i_pic_count) > i_max_buffer_count) p_window->i_pic_count = i_max_buffer_count - p_window->i_min_undequeued; - if (sys->anwp->setBufferCount(p_window->p_surface_priv, - p_window->i_pic_count + - p_window->i_min_undequeued) != 0) + if (sys->anwp.setBufferCount(p_window->p_surface_priv, + p_window->i_pic_count + + p_window->i_min_undequeued) != 0) goto error; - if (sys->anwp->setOrientation(p_window->p_surface_priv, - p_window->i_angle) != 0) + if (sys->anwp.setOrientation(p_window->p_surface_priv, + p_window->i_angle) != 0) goto error; AndroidWindow_UpdateCrop(sys, p_window); @@ -476,7 +477,7 @@ static int AndroidWindow_SetupANWP(vout_display_sys_t *sys, return 0; error: if (p_window->p_surface_priv) { - sys->anwp->disconnect(p_window->p_surface_priv); + sys->anwp.disconnect(p_window->p_surface_priv); p_window->p_surface_priv = NULL; } p_window->b_use_priv = false; @@ -575,7 +576,7 @@ static void AndroidWindow_UnlockPicture(vout_display_sys_t *sys, if (p_handle == NULL) return; - sys->anwp->unlockData(p_window->p_surface_priv, p_handle, b_render); + sys->anwp.unlockData(p_window->p_surface_priv, p_handle, b_render); } else sys->anw->unlockAndPost(p_window->p_surface); } @@ -590,8 +591,8 @@ static int AndroidWindow_LockPicture(vout_display_sys_t *sys, void *p_handle; int err; - err = sys->anwp->lockData(p_window->p_surface_priv, - &p_handle, &p_picsys->priv.sw.buf); + err = sys->anwp.lockData(p_window->p_surface_priv, + &p_handle, &p_picsys->priv.sw.buf); if (err != 0) return -1; p_picsys->priv.sw.p_handle = p_handle; @@ -675,8 +676,8 @@ static int Open(vlc_object_t *p_this) sys->anw = AWindowHandler_getANativeWindowAPI(sys->p_awh); #ifdef USE_ANWP - sys->anwp = AWindowHandler_getANativeWindowPrivAPI(sys->p_awh); - if (!sys->anwp) + sys->b_has_anwp = android_loadNativeWindowPrivApi(&sys->anwp) == 0; + if (!sys->b_has_anwp) msg_Warn(vd, "Could not initialize NativeWindow Priv API."); #endif diff --git a/modules/video_output/android/utils.c b/modules/video_output/android/utils.c index 141b2ed..08d9f46 100644 --- a/modules/video_output/android/utils.c +++ b/modules/video_output/android/utils.c @@ -283,8 +283,8 @@ LoadNativeWindowAPI(AWindowHandler *p_awh) * Android private NativeWindow (post android 2.3) */ -static int -LoadNativeWindowPrivAPI(native_window_priv_api_t *native) +int +android_loadNativeWindowPrivApi(native_window_priv_api_t *native) { #define LOAD(symbol) do { \ if ((native->symbol = dlsym(RTLD_DEFAULT, "ANativeWindowPriv_" #symbol)) == NULL) \ @@ -514,7 +514,7 @@ AWindowHandler_releaseANativeWindowEnv(AWindowHandler *p_awh, JNIEnv *p_env, * Don't do it earlier because MediaCodec may not be able to connect to * the surface anymore. */ if (b_clear && p_awh->anw_api.setBuffersGeometry - && AWindowHandler_getANativeWindowPrivAPI(p_awh) == NULL) + && dlsym(RTLD_DEFAULT, "ANativeWindowPriv_connect") == NULL) { /* Clear the surface by displaying a 1x1 black RGB buffer */ ANativeWindow *p_anw = p_awh->views[id].p_anw; @@ -569,15 +569,6 @@ AWindowHandler_getANativeWindowAPI(AWindowHandler *p_awh) return &p_awh->anw_api; } -native_window_priv_api_t * -AWindowHandler_getANativeWindowPrivAPI(AWindowHandler *p_awh) -{ - if (LoadNativeWindowPrivAPI(&p_awh->anwpriv_api) != 0) - return NULL; - else - return &p_awh->anwpriv_api; -} - static int WindowHandler_NewSurfaceEnv(AWindowHandler *p_awh, JNIEnv *p_env, enum AWindow_ID id) diff --git a/modules/video_output/android/utils.h b/modules/video_output/android/utils.h index 6072ac7..cdde4e7 100644 --- a/modules/video_output/android/utils.h +++ b/modules/video_output/android/utils.h @@ -97,6 +97,14 @@ typedef struct } native_window_priv_api_t; /** + * This function load a native_window_priv_api_t that can be used to access + * the private ANativeWindow API. + * \param api doesn't need to be released + * \return 0 on success, -1 on error. + */ +int android_loadNativeWindowPrivApi(native_window_priv_api_t *api); + +/** * This function returns a JNIEnv* created from the android JavaVM attached to * the VLC object var. it doesn't need to be released. */ @@ -117,12 +125,6 @@ void AWindowHandler_destroy(AWindowHandler *p_awh); 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. */ _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
