在 void CameraHardware::initPreviewBuffer(int size) 中, ICS 用了 mGetMemory()来申请previewbuffer.
1. mPreviewBuffer.mem = mGetMemory(-1, size_aligned, kBufferCount, NULL);
2. LogDetail("mPreviewBuffer mem: %p (%dB)", mPreviewBuffer.mem->data, mPreviewBuffer.mem->size);
3. mPreviewBuffer.baseSize = size_aligned;
4. mRawMem = mGetMemory(-1, postview_size, 1, NULL);
5. LogDetail("mRawMem mem: %p (%dB)", mRawMem->data, mRawMem->size);
6. mRawIdMem = mGetMemory(-1, sizeof(int), 1, NULL);
7. LogDetail("mRawIdMem mem: %p (%dB)", mRawIdMem->data, mRawIdMem->size);
8. mPreviewConvertMem = mGetMemory(-1, size_aligned * 4 /3, 1, NULL);
9. LogDetail("mPreviewConvertMem mem: %p (%dB)", mPreviewConvertMem->data, mPreviewConvertMem->size);
10.
11. for (int i = 0; i < kBufferCount; i++) {
12. mPreviewBuffer.flags[i] = 0;
13. mPreviewBuffer.base[i] = (void*)((unsigned)mPreviewBuffer.mem->data + (i * size_aligned));
14. mPreviewBuffer.start[i] = (uint8_t *)mPreviewBuffer.mem->data +
15. (i * size_aligned);
16. LogDetail2("mPreviewBuffer.start[%d] = %p", i, mPreviewBuffer.start[i]);
17. clrBF(&mPreviewBuffer.flags[i], BF_ENABLED|BF_LOCKED);
18. }
19. LogDetail("PreviewBufferInfo: num(%d), size(%d), heapsize(%d)",
20. kBufferCount, size, mPreviewBuffer.mem->size);
mGetMemory() 在hardware/intel/libcamera/CameraHardware.h 定义:
1. typedef camera_memory_t* (*camera_request_memory)(int fd, size_t buf_size, unsigned int num_bufs,
2. void *user);
int fd ---- 可以是 -1.
size_t buf_size --- buf大小
unsigned int num_bufs --- buffer数量
void *user --- buffer赋值,如果是申请空的内存,可以为NULL, 如果是存入数据,如照片,可以是指针。 //这点很重要。
camera_memory_t* 是个数组, 但是被转成函数形式来获得。
1. typedef struct camera_memory {
2. void *data;
3. size_t size;
4. void *handle;
5. camera_release_memory release;
6. } camera_memory_t;