一、命令流程

1.APP

packages/apps/Camera/src/com/Android/camera/PhotoModule.Java

[java] view plaincopy
  1. private void startPreview() {
  2. mCameraDevice.setPreviewDisplayAsync(mCameraSurfaceHolder);
  3. mCameraDevice.startPreviewAsync();
  4. }

packages/apps/Camera/src/com/android/camera/CameraManager.java

[java] view plaincopy
  1. public void setPreviewDisplayAsync(final SurfaceHolder surfaceHolder) {
  2. mCameraHandler.obtainMessage(SET_PREVIEW_DISPLAY_ASYNC, surfaceHolder).sendToTarget();
  3. }
  4. public void startPreviewAsync() {
  5. mCameraHandler.sendEmptyMessage(START_PREVIEW_ASYNC);
  6. }
  7. public void handleMessage(final Message msg) {
  8. switch (msg.what) {
  9. case SET_PREVIEW_DISPLAY_ASYNC:
  10. try {
  11. mCamera.setPreviewDisplay((SurfaceHolder) msg.obj);
  12. } catch(IOException e) {
  13. throw new RuntimeException(e);
  14. }
  15. return;  // no need to call mSig.open()
  16. case START_PREVIEW_ASYNC:
  17. mCamera.startPreview();
  18. return;  // no need to call mSig.open()
  19. }
  20. }

2.frameworks

frameworks/base/core/java/android/hardware/Camera.java

[java] view plaincopy
  1. public final void setPreviewDisplay(SurfaceHolder holder) throws IOException {
  2. setPreviewDisplay(holder.getSurface());
  3. }
  4. public native final void startPreview();

frameworks/base/core/jni/android_hardware_Camera.cpp

[cpp] view plaincopy
  1. static void android_hardware_Camera_setPreviewDisplay(JNIEnv *env, jobject thiz, jobject jSurface){
  2. sp<Camera> camera = get_native_camera(env, thiz, NULL);
  3. if (camera->setPreviewDisplay(surface) != NO_ERROR) {
  4. jniThrowException(env, "java/io/IOException", "setPreviewDisplay failed");
  5. }
  6. }
  7. static void android_hardware_Camera_startPreview(JNIEnv *env, jobject thiz){
  8. sp<Camera> camera = get_native_camera(env, thiz, NULL);
  9. if (camera->startPreview() != NO_ERROR) {
  10. jniThrowRuntimeException(env, "startPreview failed");
  11. return;
  12. }
  13. }

frameworks/av/camera/Camera.cpp

[cpp] view plaincopy
  1. status_t Camera::setPreviewDisplay(const sp<Surface>& surface){
  2. sp <ICamera> c = mCamera;
  3. return c->setPreviewDisplay(surface);
  4. }
  5. status_t Camera::startPreview(){
  6. sp <ICamera> c = mCamera;
  7. return c->startPreview();
  8. }

Binder调用

frameworks/av/services/camera/libcameraservice/CameraClient.cpp

[cpp] view plaincopy
  1. status_t CameraClient::setPreviewDisplay(const sp<Surface>& surface) {
  2. return setPreviewWindow(binder, window);
  3. }
  4. status_t CameraClient::startPreview() {
  5. return startCameraMode(CAMERA_PREVIEW_MODE);
  6. }
  7. status_t CameraClient::startCameraMode(camera_mode mode) {
  8. switch(mode) {
  9. case CAMERA_PREVIEW_MODE:
  10. return startPreviewMode();
  11. }
  12. }
  13. status_t CameraClient::startPreviewMode() {
  14. mHardware->setPreviewWindow(mPreviewWindow);
  15. result = mHardware->startPreview();
  16. }

frameworks/av/services/camera/libcameraservice/CameraHardwareInterface.h

[cpp] view plaincopy
  1. status_t setPreviewWindow(const sp<ANativeWindow>& buf){
  2. mPreviewWindow = buf;
  3. /*
  4. #define anw(n) __to_anw(((struct camera_preview_window *)n)->user)
  5. static ANativeWindow *__to_anw(void *user){
  6. CameraHardwareInterface *__this =
  7. reinterpret_cast<CameraHardwareInterface *>(user);
  8. return __this->mPreviewWindow.get();
  9. }
  10. */
  11. return mDevice->ops->set_preview_window(mDevice,
  12. buf.get() ? &mHalPreviewWindow.nw : 0);
  13. /*
  14. void initHalPreviewWindow(){
  15. mHalPreviewWindow.nw.cancel_buffer = __cancel_buffer;
  16. mHalPreviewWindow.nw.lock_buffer = __lock_buffer;
  17. mHalPreviewWindow.nw.dequeue_buffer = __dequeue_buffer;
  18. mHalPreviewWindow.nw.enqueue_buffer = __enqueue_buffer;
  19. mHalPreviewWindow.nw.set_buffer_count = __set_buffer_count;
  20. mHalPreviewWindow.nw.set_buffers_geometry = __set_buffers_geometry;
  21. mHalPreviewWindow.nw.set_crop = __set_crop;
  22. mHalPreviewWindow.nw.set_timestamp = __set_timestamp;
  23. mHalPreviewWindow.nw.set_usage = __set_usage;
  24. mHalPreviewWindow.nw.set_swap_interval = __set_swap_interval;
  25. mHalPreviewWindow.nw.get_min_undequeued_buffer_count =
  26. __get_min_undequeued_buffer_count;
  27. }
  28. */
  29. }
  30. status_t startPreview(){
  31. return mDevice->ops->start_preview(mDevice);
  32. }

3.HAL

hardware/amlogic/camera/CameraHal_Module.cpp

[cpp] view plaincopy
  1. int camera_set_preview_window(struct camera_device * device,
  2. struct preview_stream_ops *window){
  3. rv = gCameraHals[aml_dev->cameraid]->setPreviewWindow(window);
  4. }
  5. int camera_start_preview(struct camera_device * device){
  6. rv = gCameraHals[aml_dev->cameraid]->startPreview();
  7. }

hardware/amlogic/camera/CameraHal.cpp

[cpp] view plaincopy
  1. status_t CameraHal::setPreviewWindow(struct preview_stream_ops *window){
  2. mDisplayAdapter = new ANativeWindowDisplayAdapter();
  3. mDisplayAdapter->setFrameProvider(mCameraAdapter); //将frameCallbackRelay设置为BaseCameraAdapter的回调函数
  4. mDisplayAdapter->setErrorHandler(mAppCallbackNotifier.get()); //设置BaseCameraAdapter错误处理函数
  5. ret  = mDisplayAdapter->setPreviewWindow(window);//设置post的Surface
  6. /*
  7. hardware/amlogic/camera/ANativeWindowDisplayAdapter.cpp
  8. int ANativeWindowDisplayAdapter::setPreviewWindow(preview_stream_ops_t* window){
  9. mANativeWindow = window;
  10. }
  11. */
  12. }
  13. status_t CameraHal::startPreview(){
  14. //hardware/amlogic/camera/inc/V4LCameraAdapter/V4LCameraAdapter.h
  15. //#define DEFAULT_PREVIEW_PIXEL_FORMAT        V4L2_PIX_FMT_NV21
  16. ret = allocPreviewBufs(mPreviewWidth, mPreviewHeight, mParameters.getPreviewFormat(), required_buffer_count, max_queueble_buffers);
  17. /*
  18. status_t CameraHal::allocPreviewBufs(int width, int height, const char* previewFormat,
  19. unsigned int buffercount, unsigned int &max_queueable){
  20. mPreviewBufs = (int32_t *) mDisplayAdapter->allocateBuffer(width, height,
  21. previewFormat,
  22. mPreviewLength,
  23. buffercount);
  24. }
  25. hardware/amlogic/camera/ANativeWindowDisplayAdapter.cpp
  26. void* ANativeWindowDisplayAdapter::allocateBuffer(int width, int height, const char* format, int &bytes, int numBufs){
  27. err = mANativeWindow->set_buffers_geometry(
  28. mANativeWindow,
  29. width,
  30. height,
  31. mNativeWindowPixelFormat); //NV21
  32. }
  33. frameworks/av/services/camera/libcameraservice/CameraHardwareInterface.h
  34. static int __set_buffers_geometry(struct preview_stream_ops* w,
  35. int width, int height, int format){
  36. ANativeWindow *a = anw(w);
  37. //#define anw(n) __to_anw(((struct camera_preview_window *)n)->user)
  38. //__this->mPreviewWindow.get();
  39. return native_window_set_buffers_geometry(a,
  40. width, height, format);
  41. }
  42. */
  43. }

二、数据流程

hardware/amlogic/camera/V4LCameraAdapter/V4LCameraAdapter.cpp

[cpp] view plaincopy
  1. int V4LCameraAdapter::previewThread(){
  2. yuyv422_to_nv21(src,dest,width,height);
  3. frame.mFrameMask |= CameraFrame::PREVIEW_FRAME_SYNC;
  4. frame.mPixelFmt = mPixelFormat;
  5. ret = sendFrameToSubscribers(&frame);
  6. }

hardware/amlogic/camera/BaseCameraAdapter.cpp

[cpp] view plaincopy
  1. status_t BaseCameraAdapter::sendFrameToSubscribers(CameraFrame *frame){
  2. ret = __sendFrameToSubscribers(frame, &mFrameSubscribers, CameraFrame::PREVIEW_FRAME_SYNC);
  3. }
  4. status_t BaseCameraAdapter::__sendFrameToSubscribers(CameraFrame* frame,
  5. KeyedVector<int, frame_callback> *subscribers,
  6. CameraFrame::FrameType frameType){
  7. callback = (frame_callback) subscribers->valueAt(k);
  8. callback(frame);
  9. }

hardware/amlogic/camera/ANativeWindowDisplayAdapter.cpp

[cpp] view plaincopy
  1. void ANativeWindowDisplayAdapter::frameCallbackRelay(CameraFrame* caFrame){
  2. ANativeWindowDisplayAdapter *da = (ANativeWindowDisplayAdapter*) caFrame->mCookie;
  3. da->frameCallback(caFrame);
  4. }
  5. void ANativeWindowDisplayAdapter::frameCallback(CameraFrame* caFrame){
  6. PostFrame(df);
  7. }
  8. status_t ANativeWindowDisplayAdapter::PostFrame(ANativeWindowDisplayAdapter::DisplayFrame &dispFrame){
  9. mANativeWindow->set_crop(mANativeWindow, xOff/bytesPerPixel, yOff,
  10. (xOff/bytesPerPixel)+mPreviewWidth, yOff+mPreviewHeight);
  11. ret = mANativeWindow->enqueue_buffer(mANativeWindow, mBufferHandleMap[i]);
  12. }

frameworks/av/services/camera/libcameraservice/CameraHardwareInterface.h

[cpp] view plaincopy
  1. static int __set_crop(struct preview_stream_ops *w,
  2. int left, int top, int right, int bottom){
  3. ANativeWindow *a = anw(w);
  4. return native_window_set_crop(a, &crop);
  5. }
  6. static int __enqueue_buffer(struct preview_stream_ops* w,
  7. buffer_handle_t* buffer){
  8. ANativeWindow *a = anw(w);
  9. return a->queueBuffer(a,
  10. container_of(buffer, ANativeWindowBuffer, handle), -1);
  11. }

Android之Camera预览相关推荐

  1. android预览界面显示不全,Android SurfaceView Camera 预览显示不全(画面拉伸)

    释放双眼,带上耳机,听听看~! 项目当中遇到调整摄像头位置需要全屏显示摄像头预览界面,过程中发现预览界面存在无法显示全,画面被拉伸的问题.surfaceview的宽高比可能与camera设置的宽高比不 ...

  2. android自定义camera预览区域,android camera摄像surfaceview预览界面特定区域(该区域可移动)...

    1.自定义一个imageview用来设定surfaceview上的特定区域. public class DrawImageView extends ImageView { private Paint ...

  3. android平台下OpenGL ES 3.0使用GLSurfaceView对相机Camera预览实时处理

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

  4. Android camera预览流程

    前面已经简单介绍了,在Android系统中open camera的流程,但是,它又是怎么预览.怎么配置流,如何最终操作到camera HAL的呢.接下来以android原生相机应用,android9, ...

  5. android l camera no panorama,camera预览是闪退的有关问题

    camera预览是闪退的问题 使用ov8825 sensor时,如果是摄像预览可以点亮,如果切换到拍照预览时,apk闪退.log如下: root@rk3288:/ # logcat logcat -- ...

  6. android camera移动方向_Android Camera开发系列:调整Camera预览方向

    有时候我们想根据自己的需要调整下Camera的预览方向,那么是调用哪个API可以达到我们的目的呢? 我们看下下图拍的几张小可爱的照片,分别是正常方向.旋转180度.90度拍的照片. ​ 正常方向 旋转 ...

  7. Android Camera预览角度和拍照保存图片角度学习

    1 Camera预览角度处理 开发Camera过程中会遇到Camera拍照,获取照片后可以上传照片或者展示给用户. Camera的图像数据来源于摄像头硬件的图像传感器,这个图像传感器被固定到手机上后会 ...

  8. android camera surfaceview 变形,使用Camera预览显示变形问题

    本人使用Camera显示预览图竖屏显示会有一些拉伸.感觉被拉长了. 本人已经选择了最接近的比例了,但是还是有拉伸. package com.example.zxing_android; import  ...

  9. MT6575 平板模式 camera 预览拉伸的问题

    MT6575 平台 android 4.0版本 改成1024x600的平板模式 进camera预览图像横向拉伸 解决方案: 1. 若 camera旋转了90°,修改 mediatek/custom/x ...

最新文章

  1. .net firamework 框架里面的控件的继承关系。
  2. MyBatis的一对和多对对和动态SQL
  3. mongodb分片介绍—— 基于范围(数值型)的分片 或者 基于哈希的分片
  4. python与excel表格-Python操作 Excel表格
  5. CSDN如何居中对齐
  6. 内容分发网络 CDN 体系中原始服务器 Original Server 的定义
  7. [css] 用CSS绘制一个三角形
  8. 使用etop查看系统中进程信息
  9. CSDN 代码不能语法高亮的原因
  10. zabbix安装 监控mysql
  11. 在Windows10上安装3Ds Max完整教程
  12. 解析信号与希尔伯特变换
  13. Java高并发编程实战6,通过AQS源码分析lock()锁机制
  14. 数据库课程设计:图书借阅管理系统(控制台交互)
  15. Dota2 AI 简易开发教程
  16. 什么是zone?如何做zone?如何做好zone?
  17. Python 实现微信自动通过好友添加请求!!!
  18. 同一网络俩台计算机连接,两台电脑如何连接在同一个局域网呢
  19. 南卡OE Pro上线!开放式耳机新里程碑!前所未有的音质舒适双冠
  20. 超级好用 VMWare14 安装Mac OS10.12系统(图解)

热门文章

  1. SQL Server 透视与逆透视转换解析
  2. filestream streamreader
  3. J2EE (十) Java中多种方式实现单例模式
  4. Apache Lucene Java 全文检索引擎架构
  5. 设计师和程序员-拓展知识关系网
  6. c++11 多线程编程(三)------ 竞争和互斥锁
  7. linux b权限开头的文件夹,linux文件权限与目录配置
  8. python两组数的差异 pca_python – scikit KernelPCA不稳定的结果
  9. python五类前景_如何在Python中实现这五类强大的概率分布【转】
  10. python工程师干什么的_Python就业前景和工资待遇分析,你学Python了吗?