zoukankan      html  css  js  c++  java
  • Android Opencv NativeCameraView error in 5.0 lollipop versions (Bug #4185)

    https://github.com/opencv/opencv/wiki

    http://code.opencv.org/issues/4185

    Hello,

    I finally get a ride of Android build from sources.
    This is built only for arm devices.

    you can found the libnative_camera_r5.0.0.so here : https://svn.scolring.org/trunk/dependencies/OpenCV/SDK/android/armeabi-v7a/sdk/native/libs/armeabi-v7a/libnative_camera_r5.0.0.so

    the modified camera wrapper :

     .../camera_wrapper/camera_wrapper.cpp              | 62 +++++++++++++++++++---
     1 file changed, 55 insertions(+), 7 deletions(-)
    
    diff --git a/modules/androidcamera/camera_wrapper/camera_wrapper.cpp b/modules/androidcamera/camera_wrapper/camera_wrapper.cpp
    index 202aa29..dafbe64 100644
    --- a/modules/androidcamera/camera_wrapper/camera_wrapper.cpp
    +++ b/modules/androidcamera/camera_wrapper/camera_wrapper.cpp
    @@ -1,6 +1,6 @@
     #if !defined(ANDROID_r2_2_0) && !defined(ANDROID_r2_3_3) && !defined(ANDROID_r3_0_1) && 
      !defined(ANDROID_r4_0_0) && !defined(ANDROID_r4_0_3) && !defined(ANDROID_r4_1_1) && 
    - !defined(ANDROID_r4_2_0) && !defined(ANDROID_r4_3_0) && !defined(ANDROID_r4_4_0)
    + !defined(ANDROID_r4_2_0) && !defined(ANDROID_r4_3_0) && !defined(ANDROID_r4_4_0) && !defined(ANDROID_r5_0_0)
     # error Building camera wrapper for your version of Android is not supported by OpenCV.
      You need to modify OpenCV sources in order to compile camera wrapper for your version of Android.
     #endif
    @@ -8,7 +8,7 @@
     #include <camera/Camera.h>
     #include <camera/CameraParameters.h>
    
    -#if defined(ANDROID_r4_0_0) || defined(ANDROID_r4_0_3)
    +#if defined(ANDROID_r4_0_0) || defined(ANDROID_r4_0_3) || defined(ANDROID_r5_0_0)
     # include <system/camera.h>
     #endif //defined(ANDROID_r4_0_0) || defined(ANDROID_r4_0_3)
    
    @@ -22,7 +22,7 @@
     #elif defined(ANDROID_r4_1_1) || defined(ANDROID_r4_2_0)
     # include <gui/ISurface.h>
     # include <gui/BufferQueue.h>
    -#elif defined(ANDROID_r4_3_0) || defined(ANDROID_r4_4_0)
    +#elif defined(ANDROID_r4_3_0) || defined(ANDROID_r4_4_0) || defined(ANDROID_r5_0_0)
     # include <gui/IGraphicBufferProducer.h>
     # include <gui/BufferQueue.h>
     # include <ui/GraphicBuffer.h>
    @@ -95,9 +95,25 @@ public:
         {
         }
     };
    +#elif defined(ANDROID_r5_0_0)
    +class ConsumerListenerStub: public android::BnConsumerListener
    +{
    +public:
    +    virtual void onFrameAvailable()
    +    {
    +    }
    +    virtual void onBuffersReleased()
    +    {
    +    }
    +    virtual void onSidebandStreamChanged()
    +    {
    +    }
    +    virtual ~ConsumerListenerStub()
    +    {
    +    }
    +};   
     #endif
    
    -
     std::string getProcessName()
     {
         std::string result;
    @@ -156,6 +172,9 @@ protected:
     #if defined(ANDROID_r4_1_1) || defined(ANDROID_r4_2_0) || defined(ANDROID_r4_3_0) || defined(ANDROID_r4_4_0)
         sp<BufferQueue> queue;
         sp<ConsumerListenerStub> listener;
    +#elif defined(ANDROID_r5_0_0)
    +    sp<IGraphicBufferProducer> queue;
    +    sp<ConsumerListenerStub> listener;
     #endif
         CameraParameters* params;
         CameraCallback cameraCallback;
    @@ -344,7 +363,7 @@ public:
    
         virtual void postData(int32_t msgType, const sp<IMemory>& dataPtr
     #if defined(ANDROID_r4_0_0) || defined(ANDROID_r4_0_3) || defined(ANDROID_r4_1_1) || defined(ANDROID_r4_2_0) 
    - || defined(ANDROID_r4_3_0) || defined(ANDROID_r4_4_0)
    + || defined(ANDROID_r4_3_0) || defined(ANDROID_r4_4_0) || defined(ANDROID_r5_0_0)
                               ,camera_frame_metadata_t*
     #endif
                               )
    @@ -689,6 +708,21 @@ CameraHandler* CameraHandler::initCameraConnect(const CameraCallback& callback,
         bufferStatus = handler->camera->setPreviewTarget(handler->queue);
         if (bufferStatus != 0)
             LOGE("applyProperties: failed setPreviewTexture call; camera might not work correctly");
    +# elif defined(ANDROID_r5_0_0)
    +    void* buffer_queue_obj = operator new(sizeof(BufferQueue) + MAGIC_TAIL);
    +
    +    sp<IGraphicBufferProducer> producer;
    +    sp<IGraphicBufferConsumer> consumer;
    +    BufferQueue::createBufferQueue(&producer, &consumer);
    +
    +    consumer->setConsumerUsageBits(GraphicBuffer::USAGE_HW_TEXTURE);
    +    void* consumer_listener_obj = operator new(sizeof(ConsumerListenerStub) + MAGIC_TAIL);
    +    handler->listener = new(consumer_listener_obj) ConsumerListenerStub();
    +    consumer->consumerConnect(handler->listener, true);
    +    handler->queue = producer;
    +    bufferStatus = handler->camera->setPreviewTarget(handler->queue);
    +    if (bufferStatus != 0)
    +        LOGE("applyProperties: failed setPreviewTexture call; camera might not work correctly");
     # endif
    
     #if (defined(ANDROID_r2_2_0) || defined(ANDROID_r2_3_3) || defined(ANDROID_r3_0_1))
    @@ -730,7 +764,7 @@ void CameraHandler::closeCameraConnect()
    
         camera->stopPreview();
     #if defined(ANDROID_r4_0_0) || defined(ANDROID_r4_0_3) || defined(ANDROID_r4_1_1) || defined(ANDROID_r4_2_0) 
    - || defined(ANDROID_r4_3_0) || defined(ANDROID_r4_4_0)
    + || defined(ANDROID_r4_3_0) || defined(ANDROID_r4_4_0) || defined(ANDROID_r5_0_0)
         camera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_NOOP);
     #endif
         camera->disconnect();
    @@ -1055,7 +1089,7 @@ void CameraHandler::applyProperties(CameraHandler** ppcameraHandler)
             (*ppcameraHandler)->params->setPreviewSize((*ppcameraHandler)->width, (*ppcameraHandler)->height);
    
     #if defined(ANDROID_r4_0_0) || defined(ANDROID_r4_0_3) || defined(ANDROID_r4_1_1) || defined(ANDROID_r4_2_0) 
    - || defined(ANDROID_r4_3_0) || defined(ANDROID_r4_4_0)
    + || defined(ANDROID_r4_3_0) || defined(ANDROID_r4_4_0) || defined(ANDROID_r5_0_0)
         CameraHandler* handler=*ppcameraHandler;
    
         handler->camera->stopPreview();
    @@ -1092,6 +1126,20 @@ void CameraHandler::applyProperties(CameraHandler** ppcameraHandler)
         bufferStatus = handler->camera->setPreviewTarget(handler->queue);
         if (bufferStatus != 0)
             LOGE("applyProperties: failed setPreviewTexture call; camera might not work correctly");
    +# elif defined(ANDROID_r5_0_0)
    +    void* buffer_queue_obj = operator new(sizeof(BufferQueue) + MAGIC_TAIL);
    +    sp<IGraphicBufferProducer> producer;
    +    sp<IGraphicBufferConsumer> consumer;
    +    BufferQueue::createBufferQueue(&producer, &consumer);
    +
    +    consumer->setConsumerUsageBits(GraphicBuffer::USAGE_HW_TEXTURE);
    +    void* consumer_listener_obj = operator new(sizeof(ConsumerListenerStub) + MAGIC_TAIL);
    +    handler->listener = new(consumer_listener_obj) ConsumerListenerStub();
    +    consumer->consumerConnect(handler->listener, true);
    +    handler->queue = producer;
    +    bufferStatus = handler->camera->setPreviewTarget(handler->queue);
    +    if (bufferStatus != 0)
    +        LOGE("applyProperties: failed setPreviewTexture call; camera might not work correctly");
     # endif
    
         handler->camera->setPreviewCallbackFlags( CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK | CAMERA_FRAME_CALLBACK_FLAG_COPY_OUT_MASK);//with copy
    
  • 相关阅读:
    MyBatis学习之输入输出类型
    MyBatis学习之多表查询
    javascript学习之this
    Elasticsearch学习之Java操作1
    CSS学习之定位
    CSS学习之浮动
    CSS学习之盒子模型
    java学习之导出Excel
    转载:手把手教你做iOS推送
    拳头公司聊天服务架构:服务器篇
  • 原文地址:https://www.cnblogs.com/jukan/p/6673898.html
Copyright © 2011-2022 走看看