设为首页 加入收藏

TOP

Android Camera HAL3中预览preview模式下的数据流(四)
2016-01-29 16:31:55 】 浏览:6702
Tags:Android Camera HAL3 预览 preview 模式 数据流
定的,高通平台下定义的camera3_stream::max_buffer数为7个,而maxConsumerBuffers指的是在所有buffer被dequeue时还应该保留的处于queue操作的buffer个数,即全dequeue时至少有maxConsumerBuffers个buffer是处于queue状态在被Consumer使用的。通过query NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS来完成,一般默认是1个,即每个stream可以认为需要由8个buffer缓存块组成,实际可dequeue的为8个。

比如native_window_set_buffers_transform一般是指定buffer的Consumer,即当前buffer显示的90/180/270°角度。

该过程本质是结合HAL3的底层buffer配置需求,反过来请求Buffer的Consumer端BufferQueueConsumer来设置相关的buffer属性。

registerBuffersLocked是一个比较重要的处理过程:

status_t Camera3Stream::registerBuffersLocked(camera3_device *hal3Device) {
    ATRACE_CALL();

    /**
     * >= CAMERA_DEVICE_API_VERSION_3_2:
     *
     * camera3_device_t->ops->register_stream_buffers() is not called and must
     * be NULL.
     */
    if (hal3Device->common.version >= CAMERA_DEVICE_API_VERSION_3_2) {
        ALOGV(%s: register_stream_buffers unused as of HAL3.2, __FUNCTION__);

        if (hal3Device->ops->register_stream_buffers != NULL) {
            ALOGE(%s: register_stream_buffers is deprecated in HAL3.2; 
                    must be set to NULL in camera3_device::ops, __FUNCTION__);
            return INVALID_OPERATION;
        } else {
            ALOGD(%s: Skipping NULL check for deprecated register_stream_buffers, __FUNCTION__);
        }

        return OK;
    } else {
        ALOGV(%s: register_stream_buffers using deprecated code path, __FUNCTION__);
    }

    status_t res;

    size_t bufferCount = getBufferCountLocked();//获取buffer的数量,mTotalBufferCount,最少2个buffer

    Vector
  
    buffers;
    buffers.insertAt(/*prototype_item*/NULL, /*index*/0, bufferCount);

    camera3_stream_buffer_set bufferSet = camera3_stream_buffer_set();
    bufferSet.stream = this;//新的bufferset指向camera3_stream_t
    bufferSet.num_buffers = bufferCount;//当前stream下的buffer数
    bufferSet.buffers = buffers.editArray();

    Vector
   
     streamBuffers; streamBuffers.insertAt(camera3_stream_buffer_t(), /*index*/0, bufferCount); // Register all buffers with the HAL. This means getting all the buffers // from the stream, providing them to the HAL with the // register_stream_buffers() method, and then returning them back to the // stream in the error state, since they won't have valid data. // // Only registered buffers can be sent to the HAL. uint32_t bufferIdx = 0; for (; bufferIdx < bufferCount; bufferIdx++) { res = getBufferLocked( &streamBuffers.editItemAt(bufferIdx) );//返回dequeue buffer出来的所有buffer if (res != OK) { ALOGE(%s: Unable to get buffer %d for registration with HAL, __FUNCTION__, bufferIdx); // Skip registering, go straight to cleanup break; } sp
    
      fence = new Fence(streamBuffers[bufferIdx].acquire_fence); fence->waitForever(Camera3Stream::registerBuffers);//等待可写 buffers.editItemAt(bufferIdx) = streamBuffers[bufferIdx].buffer;//dequeue buffer出来的buffer handle } if (bufferIdx == bufferCount) { // Got all buffers, register with HAL ALOGV(%s: Registering %zu buffers with camera HAL, __FUNCTION__, bufferCount); ATRACE_BEGIN(camera3->register_stream_buffers); res = hal3Device->ops->register_stream_buffers(hal3Device, &bufferSet);//buffer绑定并register到hal层 ATRACE_END(); } // Return all valid buffers to stream, in ERROR state to indicate // they weren't filled. for (size_t i = 0; i < bufferIdx; i++) { streamBuffers.editItemAt(i).release_fence = -1; streamBuffers.editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR; returnBufferLocked(streamBuffers[i], 0);//register后进行queue buffer } return res; } 
    
   
  

a 可以明确看到CAMERA_DEVICE_API_VERSION_3_2的版本才支持这个Device ops接口

b getBufferCountLocked

获取当前stream下的允许的buffer总数

c camera3_stream_buffer_t、camera3_stream_buffer_set和buffer_handle_t

首先需要关注的结构是camera3_stream_buffer_t,用于描述每一个stream下的buffer自身的特性值,其中关键结构是buffer_handle_t值是每一个buffer在不同进程间共享的handle,此外acquire_fence和release_fence用来不同硬件模块对buffer读写时的同步。

camera3_stream_buffer_set是封装了当前stream下所有的buffer的信息:

typedef struct camera3_stream
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 4/8/8
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇LeetCode -- Edit Distance 下一篇LeetCode 10 Regular Expression ..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目