Android Camer框架

Camera框架

图片.png

Camera拍照流程

拍照采用ImageReader来作为中介保存图片例子参考android-Camera2Basic
首先是创建ImageReader

static void ImageReader_init(JNIEnv* env, jobject thiz, jobject weakThiz,
                             jint width, jint height, jint format, jint maxImages)
{
    status_t res;
    int nativeFormat;
    android_dataspace nativeDataspace;

    sp<JNIImageReaderContext> ctx(new JNIImageReaderContext(env, weakThiz, clazz, maxImages));

    sp<IGraphicBufferProducer> gbProducer;
    sp<IGraphicBufferConsumer> gbConsumer;
    BufferQueue::createBufferQueue(&gbProducer, &gbConsumer);  // 创建BufferQueue作为相机与 ImageReader的buffer
    sp<BufferItemConsumer> bufferConsumer;
    String8 consumerName = String8::format("ImageReader-%dx%df%xm%d-%d-%d",
            width, height, format, maxImages, getpid(),
            createProcessUniqueId());
    uint32_t consumerUsage = GRALLOC_USAGE_SW_READ_OFTEN;

    bufferConsumer = new BufferItemConsumer(gbConsumer, consumerUsage, maxImages,
            /*controlledByApp*/true);

    ctx->setBufferConsumer(bufferConsumer);
    bufferConsumer->setName(consumerName);

    ctx->setProducer(gbProducer);
    bufferConsumer->setFrameAvailableListener(ctx);   // 消费者是ImageReader,有新图像到来时会通知onFrameAvailable,再--> postEventFromNative --> App注册的Listener
    ImageReader_setNativeContext(env, thiz, ctx);
    ctx->setBufferFormat(nativeFormat);
    ctx->setBufferDataspace(nativeDataspace);
    ctx->setBufferWidth(width);
    ctx->setBufferHeight(height);

    // Set the width/height/format/dataspace to the bufferConsumer.
    res = bufferConsumer->setDefaultBufferSize(width, height);
    res = bufferConsumer->setDefaultBufferFormat(nativeFormat);
    res = bufferConsumer->setDefaultBufferDataSpace(nativeDataspace);
}

图片.png

  • 从上图可以看出Surface仅仅是个接口壳,多有的操作都是针对BufferQueue的
  • BufferQueueCore中有个成员是mSlots,这个就是用来存放garlloc分配的buffer的handle,类型为

参考

猜你喜欢

转载自blog.csdn.net/xiabodan/article/details/80258798