status_t CameraMetadata::erase(uint32_t tag) { camera_metadata_entry_t entry; status_t res; if (mLocked) { ALOGE("%s: CameraMetadata is locked", __FUNCTION__); return INVALID_OPERATION; } res = find_camera_metadata_entry(mBuffer, tag, &entry); if (res == NAME_NOT_FOUND) { return OK; } else if (res != OK) { ALOGE("%s: Error looking for entry %s.%s (%x): %s %d", __FUNCTION__, get_camera_metadata_section_name(tag), get_camera_metadata_tag_name(tag), tag, strerror(-res), res); return res; } res = delete_camera_metadata_entry(mBuffer, entry.index); if (res != OK) { ALOGE("%s: Error deleting entry %s.%s (%x): %s %d", __FUNCTION__, get_camera_metadata_section_name(tag), get_camera_metadata_tag_name(tag), tag, strerror(-res), res); } return res; }
status_t CameraMetadata::update(uint32_t tag, const void *data, size_t data_count) { status_t res; int type = get_camera_metadata_tag_type(tag); if (type == -1) { ALOGE("%s: Tag %d not found", __FUNCTION__, tag); return BAD_VALUE; } size_t data_size = calculate_camera_metadata_entry_data_size(type, data_count); res = resizeIfNeeded(1, data_size); if (res == OK) { camera_metadata_entry_t entry; res = find_camera_metadata_entry(mBuffer, tag, &entry); if (res == NAME_NOT_FOUND) { res = add_camera_metadata_entry(mBuffer, tag, data, data_count); } else if (res == OK) { res = update_camera_metadata_entry(mBuffer, entry.index, data, data_count, NULL); } } if (res != OK) { ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)", __FUNCTION__, get_camera_metadata_section_name(tag), get_camera_metadata_tag_name(tag), tag, strerror(-res), res); } return res; }
status_t CameraMetadata::updateImpl(uint32_t tag, const void *data, size_t data_count) { status_t res; if (mLocked) { ALOGE("%s: CameraMetadata is locked", __FUNCTION__); return INVALID_OPERATION; } int type = get_camera_metadata_tag_type(tag); if (type == -1) { ALOGE("%s: Tag %d not found", __FUNCTION__, tag); return BAD_VALUE; } // Safety check - ensure that data isn't pointing to this metadata, since // that would get invalidated if a resize is needed size_t bufferSize = get_camera_metadata_size(mBuffer); uintptr_t bufAddr = reinterpret_cast<uintptr_t>(mBuffer); uintptr_t dataAddr = reinterpret_cast<uintptr_t>(data); if (dataAddr > bufAddr && dataAddr < (bufAddr + bufferSize)) { ALOGE("%s: Update attempted with data from the same metadata buffer!", __FUNCTION__); return INVALID_OPERATION; } size_t data_size = calculate_camera_metadata_entry_data_size(type, data_count); res = resizeIfNeeded(1, data_size); if (res == OK) { camera_metadata_entry_t entry; res = find_camera_metadata_entry(mBuffer, tag, &entry); if (res == NAME_NOT_FOUND) { res = add_camera_metadata_entry(mBuffer, tag, data, data_count); } else if (res == OK) { res = update_camera_metadata_entry(mBuffer, entry.index, data, data_count, NULL); } } if (res != OK) { ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)", __FUNCTION__, get_camera_metadata_section_name(tag), get_camera_metadata_tag_name(tag), tag, strerror(-res), res); } IF_ALOGV() { ALOGE_IF(validate_camera_metadata_structure(mBuffer, /*size*/NULL) != OK, "%s: Failed to validate metadata structure after update %p", __FUNCTION__, mBuffer); } return res; }
camera_metadata_entry_t CameraMetadata::find(uint32_t tag) { status_t res; camera_metadata_entry entry; res = find_camera_metadata_entry(mBuffer, tag, &entry); if (CC_UNLIKELY( res != OK )) { entry.count = 0; entry.data.u8 = NULL; } return entry; }
status_t updateMetadata(camera_metadata_t * metadata, uint32_t tag, const void* data, size_t data_count) { status_t res = NO_ERROR; camera_metadata_entry_t entry; res = find_camera_metadata_entry(metadata, tag, &entry); if (res == NAME_NOT_FOUND) { res = add_camera_metadata_entry(metadata, tag, data, data_count); } else if (res == OK) { res = update_camera_metadata_entry(metadata, entry.index, data, data_count, NULL); } return res; }
camera_metadata_entry_t CameraMetadata::find(uint32_t tag) { status_t res; camera_metadata_entry entry; if (mLocked) { ALOGE("%s: CameraMetadata is locked", __FUNCTION__); entry.count = 0; return entry; } res = find_camera_metadata_entry(mBuffer, tag, &entry); if (CC_UNLIKELY( res != OK )) { entry.count = 0; entry.data.u8 = NULL; } return entry; }
status_t CameraMetadata::updateImpl(uint32_t tag, const void *data, size_t data_count) { status_t res; if (mLocked) { ALOGE("%s: CameraMetadata is locked", __FUNCTION__); return INVALID_OPERATION; } int type = get_camera_metadata_tag_type(tag); if (type == -1) { ALOGE("%s: Tag %d not found", __FUNCTION__, tag); return BAD_VALUE; } size_t data_size = calculate_camera_metadata_entry_data_size(type, data_count); res = resizeIfNeeded(1, data_size); if (res == OK) { camera_metadata_entry_t entry; res = find_camera_metadata_entry(mBuffer, tag, &entry); if (res == NAME_NOT_FOUND) { res = add_camera_metadata_entry(mBuffer, tag, data, data_count); } else if (res == OK) { res = update_camera_metadata_entry(mBuffer, entry.index, data, data_count, NULL); } } if (res != OK) { ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)", __FUNCTION__, get_camera_metadata_section_name(tag), get_camera_metadata_tag_name(tag), tag, strerror(-res), res); } IF_ALOGV() { ALOGE_IF(validate_camera_metadata_structure(mBuffer, /*size*/NULL) != OK, "%s: Failed to validate metadata structure after update %p", __FUNCTION__, mBuffer); } return res; }
void QCameraHardwareInterface::runCommandThread(void *data) { /** * This function implements the main service routine for the incoming * frame requests, this thread routine is started everytime we get a * notify_request_queue_not_empty trigger, this thread makes the * assumption that once it receives a NULL on a dequest_request call * there will be a fresh notify_request_queue_not_empty call that is * invoked thereby launching a new instance of this thread. Therefore, * once we get a NULL on a dequeue request we simply let this thread die */ int res; camera_metadata_t *request=NULL; mPendingRequests=0; while(mRequestQueueSrc) { ALOGV("%s:Dequeue request using mRequestQueueSrc:%p",__func__,mRequestQueueSrc); mRequestQueueSrc->dequeue_request(mRequestQueueSrc,&request); if(request==NULL) { ALOGE("%s:No more requests available from src command \ thread dying",__func__); return; } mPendingRequests++; /* Set the metadata values */ /* Wait for the SOF for the new metadata values to be applied */ /* Check the streams that need to be active in the stream request */ sort_camera_metadata(request); camera_metadata_entry_t streams; res = find_camera_metadata_entry(request, ANDROID_REQUEST_OUTPUT_STREAMS, &streams); if (res != NO_ERROR) { ALOGE("%s: error reading output stream tag", __FUNCTION__); return; } res = tryRestartStreams(streams); if (res != NO_ERROR) { ALOGE("error tryRestartStreams %d", res); return; } /* 3rd pass: Turn on all streams requested */ for (uint32_t i = 0; i < streams.count; i++) { int streamId = streams.data.u8[i]; QCameraStream *stream = QCameraStream::getStreamAtId(streamId); /* Increment the frame pending count in each stream class */ /* Assuming we will have the stream obj in had at this point may be * may be multiple objs in which case we loop through array of streams */ stream->onNewRequest(); } ALOGV("%s:Freeing request using mRequestQueueSrc:%p",__func__,mRequestQueueSrc); /* Free the request buffer */ mRequestQueueSrc->free_request(mRequestQueueSrc,request); mPendingRequests--; ALOGV("%s:Completed request",__func__); }