vout: android: move native_window_priv_api_t from AWindowHandler
authorThomas Guillem <thomas@gllm.fr>
Tue, 22 Nov 2016 17:16:11 +0000 (18:16 +0100)
committerThomas Guillem <thomas@gllm.fr>
Mon, 28 Nov 2016 15:36:44 +0000 (16:36 +0100)
modules/codec/omxil/omxil.c
modules/codec/omxil/omxil.h
modules/video_output/android/display.c
modules/video_output/android/utils.c
modules/video_output/android/utils.h

index 2ffaa6a..3e071a3 100644 (file)
@@ -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 );
index b744b24..74a3621 100644 (file)
@@ -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
 
index 970c36c..7d9f9f3 100644 (file)
@@ -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
 
index 141b2ed..08d9f46 100644 (file)
@@ -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)
index 6072ac7..cdde4e7 100644 (file)
@@ -96,6 +96,14 @@ typedef struct
     ptr_ANativeWindowPriv_setOrientation setOrientation;
 } 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.
@@ -116,12 +124,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.