高通camera架构 (三)

原创 2012年03月28日 11:26:36

四 android_hardware_Camera_setPreviewDisplay(JNI)

这个接口函数的作用是为Preview分配内存。

static void android_hardware_Camera_setPreviewDisplay(JNIEnv *env, jobject thiz, jobject jSurface)
{
    LOGV("setPreviewDisplay");
    sp<Camera> camera = get_native_camera(env, thiz, NULL);
    if (camera == 0) return;

    sp<Surface> surface = NULL;
    if (jSurface != NULL) {
        surface = reinterpret_cast<Surface*>(env->GetIntField(jSurface, fields.surface));
    }
    if (camera->setPreviewDisplay(surface) != NO_ERROR) {
        jniThrowException(env, "java/io/IOException", "setPreviewDisplay failed");
    }
}

 

在camera.cpp中;

status_t Camera::setPreviewDisplay(const sp<Surface>& surface)
{
    LOGV("setPreviewDisplay");
    sp <ICamera> c = mCamera;
    if (c == 0) return NO_INIT;
    if (surface != 0) {
        return c->setPreviewDisplay(surface->getISurface());
    } else {
        LOGD("app passed NULL surface");
        return c->setPreviewDisplay(0);
    }
}

这里跳到cameraservice.cpp 中。

status_t CameraService::Client::setPreviewDisplay(const sp<ISurface>& surface) {
    LOG1("setPreviewDisplay(%p) (pid %d)", surface.get(), getCallingPid());
    Mutex::Autolock lock(mLock);
    status_t result = checkPidAndHardware();
    if (result != NO_ERROR) return result;

    result = NO_ERROR;

    // return if no change in surface.
    // asBinder() is safe on NULL (returns NULL)
    if (surface->asBinder() == mSurface->asBinder()) {
        return result;
    }

    if (mSurface != 0) {
        LOG1("clearing old preview surface %p", mSurface.get());
        if (mUseOverlay) {
            // Force the destruction of any previous overlay
            sp<Overlay> dummy;
            mHardware->setOverlay(dummy);
            mOverlayRef = 0;
        } else {
            mSurface->unregisterBuffers();
        }
    }
    mSurface = surface;
    mOverlayRef = 0;
    // If preview has been already started, set overlay or register preview
    // buffers now.
    if (mHardware->previewEnabled() || mUseOverlay) {
        if (mUseOverlay) {
            if( mSurface != NULL)
                result = setOverlay(); //创建、初始化overlay

//在实际中对这些Surface 进行merge 可以采用两种方式,一种就是采用软件的形式来merge ,还一种就是采用硬件的方式,软件的方式就是我们的SurfaceFlinger ,而硬件的方式就是Overlay
        } else if (mSurface != 0) {
            result = registerPreviewBuffers();  //注册preview buffer
        }
    }

    return result;
}


相关文章推荐

高通camera框架_流程浅析(1)

该文档主要浅析camera框架,后续会增加机制相关内容: 1.    Introduction 本文档主要讲解高通Camera整体框架。 部分内容或参考资料可参考个人博客Androi...

高通CAMERA架构(二)

2、android_hardware_Camera_getCameraInfo(JNI) static void android_hardware_Camera_getCameraInfo(JNIE...

Android Camera架构分层及代码结构(MTK version)

Android的Camera包含取景器(viewfinder)和拍摄照片(takepicture)的功能。目前MTKAndroid Camera程序的架构分成客户端和服务器两个部分,它们建立在Andr...

高通camera流程

JNI : frameworks/base/core/jni/android_hardware_camera.cpp 定义了数组static JNINativeMethod camMethods[]...

高通CAMERA架构(一)

从JNI往下看 JNI : frameworks/base/core/jni/android_hardware_camera.cpp static JNINativeMethod camM...

高通camera架构讲解

转自:http://www.cnblogs.com/thjfk/p/4086001.html   Camera原理:外部光线穿过lens后,经过color filter滤波后照射到sensor面上,s...

高通820(msm8996)camera hal源码分析

之前阅读过高通的camera的v4l2的driver,和video codec的driver,还没有分享出源码架构图。现在首先先分享出camera hal的源码架构图吧,高通的hal可以使用hal1和...

Camera服务之--架构浅析

一.应用层 Camera 的应用层在Android 上表现为直接调用SDK API 开发的一个Camera 应用APK 包。代码在/android/packages/apps/Camera 下。主要...
  • ljsbuct
  • ljsbuct
  • 2011年12月22日 11:17
  • 13085

camera基本代码架构

camera基本代码架构 转自:http://www.cnblogs.com/thjfk/p/4086001.html    Camera原理:外部光线穿过lens后,经过color fi...

高通camera架构 (二)

2、android_hardware_Camera_getCameraInfo(JNI) static void android_hardware_Camera_getCameraInfo(JNIE...
  • lbmygf
  • lbmygf
  • 2012年03月28日 11:23
  • 6486
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:高通camera架构 (三)
举报原因:
原因补充:

(最多只允许输入30个字)