summaryrefslogtreecommitdiff
path: root/src/android/meson.build
AgeCommit message (Expand)Author
2021-06-25libcamera/base: Validate internal headers as privateKieran Bingham
2021-06-25android: cros: Simplify integrationKieran Bingham
2021-06-25android: Split HAL to its own shared libraryKieran Bingham
2021-06-23android: Introduce CameraCapabilties classJacopo Mondi
2021-06-23android: Sort source files alphabeticallyJacopo Mondi
2021-05-25android: Add CameraHalConfig classJacopo Mondi
2021-04-04android: Define OS_CHROMEOS macro if android_platform=crosHirokazu Honda
2021-03-25android: meson: Remove unneeded android_enabled checkLaurent Pinchart
2021-03-03cros: Support the new cros camera API with set_up and tear_downPaul Elder
2021-03-03android: Introduce CameraBuffer interfaceJacopo Mondi
2021-02-19android: libyuv: Introduce PostProcessorYuvHirokazu Honda
2021-02-11meson: Fix coding style when declaring arraysLaurent Pinchart
2021-02-04android: Try build with a local libyuv firstHirokazu Honda
2021-02-04subprojects: Add libyuv and built if -Dandroid=enabledHirokazu Honda
2020-10-28android: jpeg: Introduce a simple image thumbnailerUmang Jain
2020-10-21android: metadata: Disable -WshadowKieran Bingham
2020-10-16android: jpeg: Port to PostProcessor interfaceUmang Jain
2020-10-14android: camera_worker: Introduce CameraWorkerJacopo Mondi
2020-10-07android: camera_stream: Break out CameraStreamJacopo Mondi
2020-09-16libcamera: Turn the android option into a featureLaurent Pinchart
2020-09-10android: jpeg: Add EXIF infrastructureKieran Bingham
2020-08-06android: Introduce JPEG encodingKieran Bingham
2020-05-13licenses: License all meson files under CC0-1.0Laurent Pinchart
2020-02-13android: Remove internal threadLaurent Pinchart
2019-10-30android: Replace ThreadRPC with blocking method callJacopo Mondi
2019-09-05android: Add CameraMetadata helper classLaurent Pinchart
2019-08-12android: hal: Add Camera3 HALJacopo Mondi
2019-08-12android: Add camera metadata libraryJacopo Mondi
dParser::Status MdParserSmia::Parse(libcamera::Span<const uint8_t> buffer, RegisterMap &registers) { if (reset_) { /* * Search again through the metadata for all the registers * requested. */ ASSERT(bits_per_pixel_); for (const auto &kv : offsets_) offsets_[kv.first] = {}; ParseStatus ret = findRegs(buffer); /* * > 0 means "worked partially but parse again next time", * < 0 means "hard error". * * In either case, we retry parsing on the next frame. */ if (ret != PARSE_OK) return ERROR; reset_ = false; } /* Populate the register values requested. */ registers.clear(); for (const auto &[reg, offset] : offsets_) { if (!offset) { reset_ = true; return NOTFOUND; } registers[reg] = buffer[offset.value()]; } return OK; } MdParserSmia::ParseStatus MdParserSmia::findRegs(libcamera::Span<const uint8_t> buffer) { ASSERT(offsets_.size()); if (buffer[0] != LINE_START) return NO_LINE_START; unsigned int current_offset = 1; /* after the LINE_START */ unsigned int current_line_start = 0, current_line = 0; unsigned int reg_num = 0, regs_done = 0; while (1) { int tag = buffer[current_offset++]; if ((bits_per_pixel_ == 10 && (current_offset + 1 - current_line_start) % 5 == 0) || (bits_per_pixel_ == 12 && (current_offset + 1 - current_line_start) % 3 == 0)) { if (buffer[current_offset++] != REG_SKIP) return BAD_DUMMY; } int data_byte = buffer[current_offset++]; if (tag == LINE_END_TAG) { if (data_byte != LINE_END_TAG) return BAD_LINE_END; if (num_lines_ && ++current_line == num_lines_) return MISSING_REGS; if (line_length_bytes_) { current_offset = current_line_start + line_length_bytes_; /* Require whole line to be in the buffer (if buffer size set). */ if (buffer.size() && current_offset + line_length_bytes_ > buffer.size()) return MISSING_REGS; if (buffer[current_offset] != LINE_START) return NO_LINE_START; } else { /* allow a zero line length to mean "hunt for the next line" */ while (current_offset < buffer.size() && buffer[current_offset] != LINE_START) current_offset++; if (current_offset == buffer.size()) return NO_LINE_START; } /* inc current_offset to after LINE_START */ current_line_start = current_offset++; } else { if (tag == REG_HI_BITS) reg_num = (reg_num & 0xff) | (data_byte << 8); else if (tag == REG_LOW_BITS) reg_num = (reg_num & 0xff00) | data_byte; else if (tag == REG_SKIP) reg_num++; else if (tag == REG_VALUE) { auto reg = offsets_.find(reg_num); if (reg != offsets_.end()) { offsets_[reg_num] = current_offset - 1; if (++regs_done == offsets_.size()) return PARSE_OK; } reg_num++; } else return ILLEGAL_TAG; } } }