setPreviewWindow in camera hal

本文介绍了 Android Camera Hardware 中 mPreviewWindow 的定义及初始化过程。详细解析了 preview_stream_ops_t 结构体及其成员函数的作用,并展示了如何通过 set_buffers_geometry 设置预览窗口的尺寸和格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. mPreviewWindow  在hardware/intel/libcamera/CameraHardware.h 中定义

  1. <SPAN xmlns="http://www.w3.org/1999/xhtml">preview_stream_ops_t* mPreviewWindow;</SPAN>  
preview_stream_ops_t* mPreviewWindow;
preview_stream_ops_t 定义:

  1. <SPAN xmlns="http://www.w3.org/1999/xhtml"><SPAN xmlns="http://www.w3.org/1999/xhtml">   1. typedef struct preview_stream_ops {  
  2.    2.     int (*dequeue_buffer)(struct preview_stream_ops* w,  
  3.    3.                           buffer_handle_t** buffer, int *stride);  
  4.    4.     int (*enqueue_buffer)(struct preview_stream_ops* w,  
  5.    5.                 buffer_handle_t* buffer);  
  6.    6.     int (*cancel_buffer)(struct preview_stream_ops* w,  
  7.    7.                 buffer_handle_t* buffer);  
  8.    8.     int (*set_buffer_count)(struct preview_stream_ops* w, int count);  
  9.    9.     int (*set_buffers_geometry)(struct preview_stream_ops* pw,  
  10.   10.                 int w, int h, int format);  
  11.   11.     int (*set_crop)(struct preview_stream_ops *w,  
  12.   12.                 int left, int top, int right, int bottom);  
  13.   13.     int (*set_usage)(struct preview_stream_ops* w, int usage);  
  14.   14.     int (*set_swap_interval)(struct preview_stream_ops *w, int interval);  
  15.   15.     int (*get_min_undequeued_buffer_count)(const struct preview_stream_ops *w,  
  16.   16.                 int *count);  
  17.   17.     int (*lock_buffer)(struct preview_stream_ops* w,  
  18.   18.                 buffer_handle_t* buffer);  
  19.   19. } preview_stream_ops_t;</SPAN></SPAN>  
   1. typedef struct preview_stream_ops {
   2.     int (*dequeue_buffer)(struct preview_stream_ops* w,
   3.                           buffer_handle_t** buffer, int *stride);
   4.     int (*enqueue_buffer)(struct preview_stream_ops* w,
   5.                 buffer_handle_t* buffer);
   6.     int (*cancel_buffer)(struct preview_stream_ops* w,
   7.                 buffer_handle_t* buffer);
   8.     int (*set_buffer_count)(struct preview_stream_ops* w, int count);
   9.     int (*set_buffers_geometry)(struct preview_stream_ops* pw,
  10.                 int w, int h, int format);
  11.     int (*set_crop)(struct preview_stream_ops *w,
  12.                 int left, int top, int right, int bottom);
  13.     int (*set_usage)(struct preview_stream_ops* w, int usage);
  14.     int (*set_swap_interval)(struct preview_stream_ops *w, int interval);
  15.     int (*get_min_undequeued_buffer_count)(const struct preview_stream_ops *w,
  16.                 int *count);
  17.     int (*lock_buffer)(struct preview_stream_ops* w,
  18.                 buffer_handle_t* buffer);
  19. } preview_stream_ops_t;

2. 初始化:
  1. <SPAN xmlns="http://www.w3.org/1999/xhtml"># if (mPreviewWindow != 0) {  
  2. #         int preview_width, preview_height;   
  3. #         mParameters.getPreviewSize(&preview_width, &preview_height);   
  4. #         mPreviewWindow->set_buffers_geometry(   
  5. #             mPreviewWindow,   
  6. #             preview_width,   
  7. #             preview_height,   
  8. #             HAL_PIXEL_FORMAT_RGB_565);   
  9. #     } </SPAN>  
# if (mPreviewWindow != 0) {
#         int preview_width, preview_height;
#         mParameters.getPreviewSize(&preview_width, &preview_height);
#         mPreviewWindow->set_buffers_geometry(
#             mPreviewWindow,
#             preview_width,
#             preview_height,
#             HAL_PIXEL_FORMAT_RGB_565);
#     } 



mPreviewWindow->set_buffers_geometry() 在/frameworks/base/services/camera/libcameraservice/CameraHardwareInterface.h 中定义

  1.    1. void initHalPreviewWindow()  
  2.    2.     {  
  3.    3.         mHalPreviewWindow.nw.cancel_buffer = __cancel_buffer;  
  4.    4.         mHalPreviewWindow.nw.lock_buffer = __lock_buffer;  
  5.    5.         mHalPreviewWindow.nw.dequeue_buffer = __dequeue_buffer;  
  6.    6.         mHalPreviewWindow.nw.enqueue_buffer = __enqueue_buffer;  
  7.    7.         mHalPreviewWindow.nw.set_buffer_count = __set_buffer_count;  
  8.    8.         mHalPreviewWindow.nw.set_buffers_geometry = __set_buffers_geometry;  
  9.    9.         mHalPreviewWindow.nw.set_crop = __set_crop;  
  10.   10.         mHalPreviewWindow.nw.set_usage = __set_usage;  
  11.   11.         mHalPreviewWindow.nw.set_swap_interval = __set_swap_interval;  
  12.   12.  
  13.   
  14.   13.         mHalPreviewWindow.nw.get_min_undequeued_buffer_count =  
  15.   14.                 __get_min_undequeued_buffer_count;  
  16.   15.     }  
  17.   16.  
  18.   
  19.   17.     sp<ANativeWindow> mPreviewWindow;  
  20.   18.  
  21.   
  22.   19.     struct camera_preview_window {  
  23.   20.         struct preview_stream_ops nw;  
  24.   21.         void *user;  
  25.   22.     };  
  26.   23.  
  27.   
  28.   24.     struct camera_preview_window mHalPreviewWindow;  
  29.   
  30. __set_buffers_geometry 封装了 native_window_set_buffers_geometry().  
  31.   
  32.    1. static int __set_buffers_geometry(struct preview_stream_ops* w,  
  33.    2.                       int width, int height, int format)  
  34.    3.     {  
  35.    4.         ANativeWindow *a = anw(w);  
  36.    5.         return native_window_set_buffers_geometry(a,  
  37.    6.                           width, height, format);  
  38.    7.     }  
   1. void initHalPreviewWindow()
   2.     {
   3.         mHalPreviewWindow.nw.cancel_buffer = __cancel_buffer;
   4.         mHalPreviewWindow.nw.lock_buffer = __lock_buffer;
   5.         mHalPreviewWindow.nw.dequeue_buffer = __dequeue_buffer;
   6.         mHalPreviewWindow.nw.enqueue_buffer = __enqueue_buffer;
   7.         mHalPreviewWindow.nw.set_buffer_count = __set_buffer_count;
   8.         mHalPreviewWindow.nw.set_buffers_geometry = __set_buffers_geometry;
   9.         mHalPreviewWindow.nw.set_crop = __set_crop;
  10.         mHalPreviewWindow.nw.set_usage = __set_usage;
  11.         mHalPreviewWindow.nw.set_swap_interval = __set_swap_interval;
  12.

  13.         mHalPreviewWindow.nw.get_min_undequeued_buffer_count =
  14.                 __get_min_undequeued_buffer_count;
  15.     }
  16.

  17.     sp<ANativeWindow> mPreviewWindow;
  18.

  19.     struct camera_preview_window {
  20.         struct preview_stream_ops nw;
  21.         void *user;
  22.     };
  23.

  24.     struct camera_preview_window mHalPreviewWindow;

__set_buffers_geometry 封装了 native_window_set_buffers_geometry().

   1. static int __set_buffers_geometry(struct preview_stream_ops* w,
   2.                       int width, int height, int format)
   3.     {
   4.         ANativeWindow *a = anw(w);
   5.         return native_window_set_buffers_geometry(a,
   6.                           width, height, format);
   7.     }

native_window_set_buffers_geometry().  在system/core/include/system/window.h 中定义:
  1. <SPAN xmlns="http://www.w3.org/1999/xhtml">   1. /* 
  2.    2.  * native_window_set_buffers_geometry(..., int w, int h, int format) 
  3.    3.  * All buffers dequeued after this call will have the dimensions and format 
  4.    4.  * specified. A successful call to this function has the same effect as calling 
  5.    5.  * native_window_set_buffers_size and native_window_set_buffers_format. 
  6.    6.  * 
  7.    7.  * XXX: This function is deprecated. The native_window_set_buffers_dimensions 
  8.    8.  * and native_window_set_buffers_format functions should be used instead. 
  9.    9.  */  
  10.   10. static inline int native_window_set_buffers_geometry(  
  11.   11.         struct ANativeWindow* window,  
  12.   12.         int w, int h, int format)  
  13.   13. {  
  14.   14.     return window->perform(window, NATIVE_WINDOW_SET_BUFFERS_GEOMETRY,  
  15.   15.             w, h, format);  
  16.   16. }</SPAN>  
   1. /*
   2.  * native_window_set_buffers_geometry(..., int w, int h, int format)
   3.  * All buffers dequeued after this call will have the dimensions and format
   4.  * specified. A successful call to this function has the same effect as calling
   5.  * native_window_set_buffers_size and native_window_set_buffers_format.
   6.  *
   7.  * XXX: This function is deprecated. The native_window_set_buffers_dimensions
   8.  * and native_window_set_buffers_format functions should be used instead.
   9.  */
  10. static inline int native_window_set_buffers_geometry(
  11.         struct ANativeWindow* window,
  12.         int w, int h, int format)
  13. {
  14.     return window->perform(window, NATIVE_WINDOW_SET_BUFFERS_GEOMETRY,
  15.             w, h, format);
  16. }


其他的函数也是类似的调用情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值