Android之Camera预览
1.APP
packages/apps/Camera/src/com/Android/camera/PhotoModule.Java
- private void startPreview() {
- mCameraDevice.setPreviewDisplayAsync(mCameraSurfaceHolder);
- mCameraDevice.startPreviewAsync();
- }
packages/apps/Camera/src/com/android/camera/CameraManager.java
- public void setPreviewDisplayAsync(final SurfaceHolder surfaceHolder) {
- mCameraHandler.obtainMessage(SET_PREVIEW_DISPLAY_ASYNC, surfaceHolder).sendToTarget();
- }
- public void startPreviewAsync() {
- mCameraHandler.sendEmptyMessage(START_PREVIEW_ASYNC);
- }
- public void handleMessage(final Message msg) {
- switch (msg.what) {
- case SET_PREVIEW_DISPLAY_ASYNC:
- try {
- mCamera.setPreviewDisplay((SurfaceHolder) msg.obj);
- } catch(IOException e) {
- throw new RuntimeException(e);
- }
- return; // no need to call mSig.open()
- case START_PREVIEW_ASYNC:
- mCamera.startPreview();
- return; // no need to call mSig.open()
- }
- }
2.frameworks
frameworks/base/core/java/android/hardware/Camera.java
- public final void setPreviewDisplay(SurfaceHolder holder) throws IOException {
- setPreviewDisplay(holder.getSurface());
- }
- public native final void startPreview();
frameworks/base/core/jni/android_hardware_Camera.cpp
- static void android_hardware_Camera_setPreviewDisplay(JNIEnv *env, jobject thiz, jobject jSurface){
- sp<Camera> camera = get_native_camera(env, thiz, NULL);
- if (camera->setPreviewDisplay(surface) != NO_ERROR) {
- jniThrowException(env, "java/io/IOException", "setPreviewDisplay failed");
- }
- }
- static void android_hardware_Camera_startPreview(JNIEnv *env, jobject thiz){
- sp<Camera> camera = get_native_camera(env, thiz, NULL);
- if (camera->startPreview() != NO_ERROR) {
- jniThrowRuntimeException(env, "startPreview failed");
- return;
- }
- }
frameworks/av/camera/Camera.cpp
- status_t Camera::setPreviewDisplay(const sp<Surface>& surface){
- sp <ICamera> c = mCamera;
- return c->setPreviewDisplay(surface);
- }
- status_t Camera::startPreview(){
- sp <ICamera> c = mCamera;
- return c->startPreview();
- }
Binder调用
frameworks/av/services/camera/libcameraservice/CameraClient.cpp
- status_t CameraClient::setPreviewDisplay(const sp<Surface>& surface) {
- return setPreviewWindow(binder, window);
- }
- status_t CameraClient::startPreview() {
- return startCameraMode(CAMERA_PREVIEW_MODE);
- }
- status_t CameraClient::startCameraMode(camera_mode mode) {
- switch(mode) {
- case CAMERA_PREVIEW_MODE:
- return startPreviewMode();
- }
- }
- status_t CameraClient::startPreviewMode() {
- mHardware->setPreviewWindow(mPreviewWindow);
- result = mHardware->startPreview();
- }
frameworks/av/services/camera/libcameraservice/CameraHardwareInterface.h
- status_t setPreviewWindow(const sp<ANativeWindow>& buf){
- mPreviewWindow = buf;
- /*
- #define anw(n) __to_anw(((struct camera_preview_window *)n)->user)
- static ANativeWindow *__to_anw(void *user){
- CameraHardwareInterface *__this =
- reinterpret_cast<CameraHardwareInterface *>(user);
- return __this->mPreviewWindow.get();
- }
- */
- return mDevice->ops->set_preview_window(mDevice,
- buf.get() ? &mHalPreviewWindow.nw : 0);
- /*
- void initHalPreviewWindow(){
- mHalPreviewWindow.nw.cancel_buffer = __cancel_buffer;
- mHalPreviewWindow.nw.lock_buffer = __lock_buffer;
- mHalPreviewWindow.nw.dequeue_buffer = __dequeue_buffer;
- mHalPreviewWindow.nw.enqueue_buffer = __enqueue_buffer;
- mHalPreviewWindow.nw.set_buffer_count = __set_buffer_count;
- mHalPreviewWindow.nw.set_buffers_geometry = __set_buffers_geometry;
- mHalPreviewWindow.nw.set_crop = __set_crop;
- mHalPreviewWindow.nw.set_timestamp = __set_timestamp;
- mHalPreviewWindow.nw.set_usage = __set_usage;
- mHalPreviewWindow.nw.set_swap_interval = __set_swap_interval;
- mHalPreviewWindow.nw.get_min_undequeued_buffer_count =
- __get_min_undequeued_buffer_count;
- }
- */
- }
- status_t startPreview(){
- return mDevice->ops->start_preview(mDevice);
- }
3.HAL
hardware/amlogic/camera/CameraHal_Module.cpp
- int camera_set_preview_window(struct camera_device * device,
- struct preview_stream_ops *window){
- rv = gCameraHals[aml_dev->cameraid]->setPreviewWindow(window);
- }
- int camera_start_preview(struct camera_device * device){
- rv = gCameraHals[aml_dev->cameraid]->startPreview();
- }
hardware/amlogic/camera/CameraHal.cpp
- status_t CameraHal::setPreviewWindow(struct preview_stream_ops *window){
- mDisplayAdapter = new ANativeWindowDisplayAdapter();
- mDisplayAdapter->setFrameProvider(mCameraAdapter); //将frameCallbackRelay设置为BaseCameraAdapter的回调函数
- mDisplayAdapter->setErrorHandler(mAppCallbackNotifier.get()); //设置BaseCameraAdapter错误处理函数
- ret = mDisplayAdapter->setPreviewWindow(window);//设置post的Surface
- /*
- hardware/amlogic/camera/ANativeWindowDisplayAdapter.cpp
- int ANativeWindowDisplayAdapter::setPreviewWindow(preview_stream_ops_t* window){
- mANativeWindow = window;
- }
- */
- }
- status_t CameraHal::startPreview(){
- //hardware/amlogic/camera/inc/V4LCameraAdapter/V4LCameraAdapter.h
- //#define DEFAULT_PREVIEW_PIXEL_FORMAT V4L2_PIX_FMT_NV21
- ret = allocPreviewBufs(mPreviewWidth, mPreviewHeight, mParameters.getPreviewFormat(), required_buffer_count, max_queueble_buffers);
- /*
- status_t CameraHal::allocPreviewBufs(int width, int height, const char* previewFormat,
- unsigned int buffercount, unsigned int &max_queueable){
- mPreviewBufs = (int32_t *) mDisplayAdapter->allocateBuffer(width, height,
- previewFormat,
- mPreviewLength,
- buffercount);
- }
- hardware/amlogic/camera/ANativeWindowDisplayAdapter.cpp
- void* ANativeWindowDisplayAdapter::allocateBuffer(int width, int height, const char* format, int &bytes, int numBufs){
- err = mANativeWindow->set_buffers_geometry(
- mANativeWindow,
- width,
- height,
- mNativeWindowPixelFormat); //NV21
- }
- frameworks/av/services/camera/libcameraservice/CameraHardwareInterface.h
- static int __set_buffers_geometry(struct preview_stream_ops* w,
- int width, int height, int format){
- ANativeWindow *a = anw(w);
- //#define anw(n) __to_anw(((struct camera_preview_window *)n)->user)
- //__this->mPreviewWindow.get();
- return native_window_set_buffers_geometry(a,
- width, height, format);
- }
- */
- }
二、数据流程
hardware/amlogic/camera/V4LCameraAdapter/V4LCameraAdapter.cpp
- int V4LCameraAdapter::previewThread(){
- yuyv422_to_nv21(src,dest,width,height);
- frame.mFrameMask |= CameraFrame::PREVIEW_FRAME_SYNC;
- frame.mPixelFmt = mPixelFormat;
- ret = sendFrameToSubscribers(&frame);
- }
hardware/amlogic/camera/BaseCameraAdapter.cpp
- status_t BaseCameraAdapter::sendFrameToSubscribers(CameraFrame *frame){
- ret = __sendFrameToSubscribers(frame, &mFrameSubscribers, CameraFrame::PREVIEW_FRAME_SYNC);
- }
- status_t BaseCameraAdapter::__sendFrameToSubscribers(CameraFrame* frame,
- KeyedVector<int, frame_callback> *subscribers,
- CameraFrame::FrameType frameType){
- callback = (frame_callback) subscribers->valueAt(k);
- callback(frame);
- }
hardware/amlogic/camera/ANativeWindowDisplayAdapter.cpp
- void ANativeWindowDisplayAdapter::frameCallbackRelay(CameraFrame* caFrame){
- ANativeWindowDisplayAdapter *da = (ANativeWindowDisplayAdapter*) caFrame->mCookie;
- da->frameCallback(caFrame);
- }
- void ANativeWindowDisplayAdapter::frameCallback(CameraFrame* caFrame){
- PostFrame(df);
- }
- status_t ANativeWindowDisplayAdapter::PostFrame(ANativeWindowDisplayAdapter::DisplayFrame &dispFrame){
- mANativeWindow->set_crop(mANativeWindow, xOff/bytesPerPixel, yOff,
- (xOff/bytesPerPixel)+mPreviewWidth, yOff+mPreviewHeight);
- ret = mANativeWindow->enqueue_buffer(mANativeWindow, mBufferHandleMap[i]);
- }
frameworks/av/services/camera/libcameraservice/CameraHardwareInterface.h
- static int __set_crop(struct preview_stream_ops *w,
- int left, int top, int right, int bottom){
- ANativeWindow *a = anw(w);
- return native_window_set_crop(a, &crop);
- }
- static int __enqueue_buffer(struct preview_stream_ops* w,
- buffer_handle_t* buffer){
- ANativeWindow *a = anw(w);
- return a->queueBuffer(a,
- container_of(buffer, ANativeWindowBuffer, handle), -1);
- }
Android之Camera预览相关推荐
- android预览界面显示不全,Android SurfaceView Camera 预览显示不全(画面拉伸)
释放双眼,带上耳机,听听看~! 项目当中遇到调整摄像头位置需要全屏显示摄像头预览界面,过程中发现预览界面存在无法显示全,画面被拉伸的问题.surfaceview的宽高比可能与camera设置的宽高比不 ...
- android自定义camera预览区域,android camera摄像surfaceview预览界面特定区域(该区域可移动)...
1.自定义一个imageview用来设定surfaceview上的特定区域. public class DrawImageView extends ImageView { private Paint ...
- 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绘 ...
- Android camera预览流程
前面已经简单介绍了,在Android系统中open camera的流程,但是,它又是怎么预览.怎么配置流,如何最终操作到camera HAL的呢.接下来以android原生相机应用,android9, ...
- android l camera no panorama,camera预览是闪退的有关问题
camera预览是闪退的问题 使用ov8825 sensor时,如果是摄像预览可以点亮,如果切换到拍照预览时,apk闪退.log如下: root@rk3288:/ # logcat logcat -- ...
- android camera移动方向_Android Camera开发系列:调整Camera预览方向
有时候我们想根据自己的需要调整下Camera的预览方向,那么是调用哪个API可以达到我们的目的呢? 我们看下下图拍的几张小可爱的照片,分别是正常方向.旋转180度.90度拍的照片. 正常方向 旋转 ...
- Android Camera预览角度和拍照保存图片角度学习
1 Camera预览角度处理 开发Camera过程中会遇到Camera拍照,获取照片后可以上传照片或者展示给用户. Camera的图像数据来源于摄像头硬件的图像传感器,这个图像传感器被固定到手机上后会 ...
- android camera surfaceview 变形,使用Camera预览显示变形问题
本人使用Camera显示预览图竖屏显示会有一些拉伸.感觉被拉长了. 本人已经选择了最接近的比例了,但是还是有拉伸. package com.example.zxing_android; import ...
- MT6575 平板模式 camera 预览拉伸的问题
MT6575 平台 android 4.0版本 改成1024x600的平板模式 进camera预览图像横向拉伸 解决方案: 1. 若 camera旋转了90°,修改 mediatek/custom/x ...
最新文章
- .net firamework 框架里面的控件的继承关系。
- MyBatis的一对和多对对和动态SQL
- mongodb分片介绍—— 基于范围(数值型)的分片 或者 基于哈希的分片
- python与excel表格-Python操作 Excel表格
- CSDN如何居中对齐
- 内容分发网络 CDN 体系中原始服务器 Original Server 的定义
- [css] 用CSS绘制一个三角形
- 使用etop查看系统中进程信息
- CSDN 代码不能语法高亮的原因
- zabbix安装 监控mysql
- 在Windows10上安装3Ds Max完整教程
- 解析信号与希尔伯特变换
- Java高并发编程实战6,通过AQS源码分析lock()锁机制
- 数据库课程设计:图书借阅管理系统(控制台交互)
- Dota2 AI 简易开发教程
- 什么是zone?如何做zone?如何做好zone?
- Python 实现微信自动通过好友添加请求!!!
- 同一网络俩台计算机连接,两台电脑如何连接在同一个局域网呢
- 南卡OE Pro上线!开放式耳机新里程碑!前所未有的音质舒适双冠
- 超级好用 VMWare14 安装Mac OS10.12系统(图解)
热门文章
- SQL Server 透视与逆透视转换解析
- filestream streamreader
- J2EE (十) Java中多种方式实现单例模式
- Apache Lucene Java 全文检索引擎架构
- 设计师和程序员-拓展知识关系网
- c++11 多线程编程(三)------ 竞争和互斥锁
- linux b权限开头的文件夹,linux文件权限与目录配置
- python两组数的差异 pca_python – scikit KernelPCA不稳定的结果
- python五类前景_如何在Python中实现这五类强大的概率分布【转】
- python工程师干什么的_Python就业前景和工资待遇分析,你学Python了吗?