[vlc-commits] iomx: add iomx_hwbuffer

Thomas Guillem git at videolan.org
Thu Jul 24 17:15:03 CEST 2014


vlc | branch: master | Thomas Guillem <guillem at archos.com> | Thu Jul 24 15:11:25 2014 +0200| [e77a89bc021c1e83b0d478d332d60dfef770d37a] | committer: Martin Storsjö

iomx: add iomx_hwbuffer

Wrapper to android native window api located in aosp system/window.h.
Allow to queue/dequeue hw buffers (ANativeWindowBuffer_t) allocated with a
speficied hal_format and hw_usage.

This requires changes to the android build project to include
iomx_hwbuffer.c when building libiomx-*.so.

Signed-off-by: Martin Storsjö <martin at martin.st>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e77a89bc021c1e83b0d478d332d60dfef770d37a
---

 modules/codec/omxil/iomx_hwbuffer.c |  230 +++++++++++++++++++++++++++++++++++
 modules/codec/omxil/omxil_core.c    |   17 +++
 modules/codec/omxil/omxil_core.h    |   10 ++
 3 files changed, 257 insertions(+)

diff --git a/modules/codec/omxil/iomx_hwbuffer.c b/modules/codec/omxil/iomx_hwbuffer.c
new file mode 100644
index 0000000..50cf322
--- /dev/null
+++ b/modules/codec/omxil/iomx_hwbuffer.c
@@ -0,0 +1,230 @@
+/*****************************************************************************
+ * iomx_hwbuffer.c: Wrapper to android native window api used for IOMX
+ *****************************************************************************
+ * Copyright (C) 2011 VLC authors and VideoLAN
+ *
+ * Authors: Thomas Guillem <guillem at archos.com>
+ *
+ * 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
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+
+#include <errno.h>
+#include <stdio.h>
+
+#if ANDROID_API == 10
+#include <ui/android_native_buffer.h>
+#include <ui/egl/android_natives.h>
+#else
+#include <system/window.h>
+#endif
+
+#include <hardware/gralloc.h>
+
+#include <android/log.h>
+
+#define NO_ERROR 0
+typedef int32_t status_t;
+
+#if ANDROID_API == 10
+typedef android_native_buffer_t ANativeWindowBuffer_t;
+#endif
+
+#define LOG_TAG "VLC/IOMX"
+
+#define LOGD(...) __android_log_print( ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__ )
+#define LOGE(...) __android_log_print( ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__ )
+
+#define CHECK_ERR() do {\
+    if( err != NO_ERROR ) {\
+        LOGE( "IOMXHWBuffer: error %d in %s  line %d\n", err, __FUNCTION__, __LINE__  );\
+        return err;\
+    }\
+} while (0)
+
+#define CHECK_ANW() do {\
+    if( anw->common.magic != ANDROID_NATIVE_WINDOW_MAGIC &&\
+            anw->common.version != sizeof(ANativeWindow) ) {\
+        LOGE( "IOMXHWBuffer: error, window not valid\n"  );\
+        return -EINVAL;\
+    }\
+} while (0)
+
+#define CHECK_ANB() do {\
+    if( anb->common.magic != ANDROID_NATIVE_BUFFER_MAGIC &&\
+            anb->common.version != sizeof(ANativeWindowBuffer_t) ) {\
+        LOGE( "IOMXHWBuffer: error, buffer not valid\n"  );\
+        return -EINVAL;\
+    }\
+} while (0)
+
+int IOMXHWBuffer_Connect( void *window )
+{
+    ANativeWindow *anw = (ANativeWindow *)window;
+    CHECK_ANW();
+
+#if ANDROID_API >= 11
+    if (native_window_api_connect( anw, NATIVE_WINDOW_API_MEDIA) != 0) {
+        LOGE( "native_window_api_connect FAIL"  );
+        return -EINVAL;
+    }
+#endif
+}
+
+int IOMXHWBuffer_Disconnect( void *window )
+{
+    ANativeWindow *anw = (ANativeWindow *)window;
+
+    CHECK_ANW();
+
+#if ANDROID_API >= 11
+    native_window_api_disconnect( anw, NATIVE_WINDOW_API_MEDIA );
+#endif
+
+    return 0;
+}
+
+
+int IOMXHWBuffer_Setup( void *window, int w, int h, int hal_format, int hw_usage,
+                        unsigned int *num_frames, unsigned int *min_undequeued )
+{
+    ANativeWindow *anw = (ANativeWindow *)window;
+    int usage = 0;
+    status_t err;
+
+    CHECK_ANW();
+
+    LOGD( "IOMXHWBuffer_setup: %p, %d, %d, %X, %X\n",
+          anw, w, h, hal_format, hw_usage );
+
+    usage |= hw_usage | GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
+#if ANDROID_API >= 11
+    usage |= GRALLOC_USAGE_EXTERNAL_DISP;
+#endif
+
+    err = native_window_set_usage( anw, usage );
+    CHECK_ERR();
+
+#if ANDROID_API == 10
+    err = native_window_set_buffers_geometry( anw, w, h, hal_format );
+    CHECK_ERR();
+#else
+    err = native_window_set_scaling_mode( anw, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW );
+    CHECK_ERR();
+
+    err = native_window_set_buffers_dimensions( anw, w, h );
+    CHECK_ERR();
+
+    err = native_window_set_buffers_format( anw, hal_format );
+    CHECK_ERR();
+
+    if( *min_undequeued == 0 )
+    {
+        anw->query( anw, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, min_undequeued );
+        CHECK_ERR();
+    }
+#endif
+    /* set a minimum value of min_undequeued in case query fails */
+    if( *min_undequeued == 0 )
+        *min_undequeued = 2;
+    *num_frames += *min_undequeued;
+
+    err = native_window_set_buffer_count( anw, *num_frames );
+    CHECK_ERR();
+
+    return 0;
+}
+
+int IOMXHWBuffer_Setcrop( void *window, int ofs_x, int ofs_y, int w, int h )
+{
+    ANativeWindow *anw = (ANativeWindow *)window;
+    android_native_rect_t crop;
+
+    CHECK_ANW();
+
+    crop.left = ofs_x;
+    crop.top = ofs_y;
+    crop.right = ofs_x + w;
+    crop.bottom = ofs_y + h;
+    return native_window_set_crop( anw, &crop );
+}
+
+int IOMXHWBuffer_Dequeue( void *window, void **pp_handle )
+{
+    ANativeWindow *anw = (ANativeWindow *)window;
+    ANativeWindowBuffer_t *anb;
+    status_t err = NO_ERROR;
+
+    CHECK_ANW();
+
+#if ANDROID_API >= 18
+    err = anw->dequeueBuffer_DEPRECATED( anw, &anb );
+#else
+    err = anw->dequeueBuffer( anw, &anb );
+#endif
+    CHECK_ERR();
+
+#if ANDROID_API >= 18
+    err = anw->lockBuffer_DEPRECATED( anw, anb );
+#else
+    err = anw->lockBuffer( anw, anb );
+#endif
+    CHECK_ERR();
+
+    *pp_handle = anb;
+
+    return 0;
+}
+
+int IOMXHWBuffer_Queue( void *window, void *p_handle )
+{
+    ANativeWindow *anw = (ANativeWindow *)window;
+    ANativeWindowBuffer_t *anb = (ANativeWindowBuffer_t *)p_handle;
+    status_t err = NO_ERROR;
+
+    CHECK_ANW();
+    CHECK_ANB();
+
+#if ANDROID_API >= 18
+    err = anw->queueBuffer_DEPRECATED( anw, anb );
+#else
+    err = anw->queueBuffer( anw, anb );
+#endif
+    CHECK_ERR();
+
+    return 0;
+}
+
+int IOMXHWBuffer_Cancel( void *window, void *p_handle )
+{
+    ANativeWindow *anw = (ANativeWindow *)window;
+    ANativeWindowBuffer_t *anb = (ANativeWindowBuffer_t *)p_handle;
+    status_t err = NO_ERROR;
+
+    CHECK_ANW();
+    CHECK_ANB();
+
+#if ANDROID_API >= 18
+    err = anw->cancelBuffer_DEPRECATED( anw, anb );
+#else
+    err = anw->cancelBuffer( anw, anb );
+#endif
+    CHECK_ERR();
+
+    return 0;
+}
diff --git a/modules/codec/omxil/omxil_core.c b/modules/codec/omxil/omxil_core.c
index 66ed161..5a934e6 100644
--- a/modules/codec/omxil/omxil_core.c
+++ b/modules/codec/omxil/omxil_core.c
@@ -87,6 +87,14 @@ OMX_ERRORTYPE (*pf_get_handle) (OMX_HANDLETYPE *, OMX_STRING,
 OMX_ERRORTYPE (*pf_free_handle) (OMX_HANDLETYPE);
 OMX_ERRORTYPE (*pf_component_enum)(OMX_STRING, OMX_U32, OMX_U32);
 OMX_ERRORTYPE (*pf_get_roles_of_component)(OMX_STRING, OMX_U32 *, OMX_U8 **);
+int (*pf_omx_hwbuffer_connect) (void *);
+int (*pf_omx_hwbuffer_disconnect) (void *);
+int (*pf_omx_hwbuffer_setup) (void *, int, int, int, int, unsigned int *,
+                              unsigned int *);
+int (*pf_omx_hwbuffer_setcrop) (void *, int, int, int, int);
+int (*pf_omx_hwbuffer_dequeue) (void *, void **);
+int (*pf_omx_hwbuffer_queue) (void *, void *);
+int (*pf_omx_hwbuffer_cancel) (void *, void *);
 
 #ifdef RPI_OMX
 static void *extra_dll_handle;
@@ -160,6 +168,15 @@ int InitOmxCore(vlc_object_t *p_this)
         vlc_mutex_unlock( &omx_core_mutex );
         return VLC_EGENERIC;
     }
+#if defined(USE_IOMX)
+    pf_omx_hwbuffer_connect = dlsym( dll_handle, "OMXHWBuffer_Connect" );
+    pf_omx_hwbuffer_disconnect = dlsym( dll_handle, "OMXHWBuffer_Disconnect" );
+    pf_omx_hwbuffer_setup = dlsym( dll_handle, "OMXHWBuffer_Setup" );
+    pf_omx_hwbuffer_setcrop = dlsym( dll_handle, "OMXHWBuffer_Setcrop" );
+    pf_omx_hwbuffer_dequeue = dlsym( dll_handle, "OMXHWBuffer_Dequeue" );
+    pf_omx_hwbuffer_queue = dlsym( dll_handle, "OMXHWBuffer_Queue" );
+    pf_omx_hwbuffer_cancel = dlsym( dll_handle, "OMXHWBuffer_Cancel" );
+#endif
 
     /* Initialise the OMX core */
     OMX_ERRORTYPE omx_error = pf_init();
diff --git a/modules/codec/omxil/omxil_core.h b/modules/codec/omxil/omxil_core.h
index b223f6b..38faba2 100644
--- a/modules/codec/omxil/omxil_core.h
+++ b/modules/codec/omxil/omxil_core.h
@@ -33,6 +33,16 @@ OMX_ERRORTYPE (*pf_free_handle) (OMX_HANDLETYPE);
 OMX_ERRORTYPE (*pf_component_enum)(OMX_STRING, OMX_U32, OMX_U32);
 OMX_ERRORTYPE (*pf_get_roles_of_component)(OMX_STRING, OMX_U32 *, OMX_U8 **);
 
+/* OMXHWBuffer functions */
+int (*pf_omx_hwbuffer_connect) (void *);
+int (*pf_omx_hwbuffer_disconnect) (void *);
+int (*pf_omx_hwbuffer_setup) (void *, int, int, int, int, unsigned int *,
+                              unsigned int *);
+int (*pf_omx_hwbuffer_setcrop) (void *, int, int, int, int);
+int (*pf_omx_hwbuffer_dequeue) (void *, void **);
+int (*pf_omx_hwbuffer_queue) (void *, void *);
+int (*pf_omx_hwbuffer_cancel) (void *, void *);
+
 int InitOmxCore(vlc_object_t *p_this);
 void DeinitOmxCore(void);
 



More information about the vlc-commits mailing list