1 /*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #define LOG_TAG "CameraServerExifUtils"
18 #define ATRACE_TAG ATRACE_TAG_CAMERA
19 //#define LOG_NDEBUG 0
20
21 #include <cutils/log.h>
22
23 #include <inttypes.h>
24 #include <math.h>
25 #include <stdint.h>
26 #include <string>
27 #include <vector>
28
29 #include "ExifUtils.h"
30
31 extern "C" {
32 #include <libexif/exif-data.h>
33 }
34
35 namespace std {
36
37 template <>
38 struct default_delete<ExifEntry> {
operator ()std::default_delete39 inline void operator()(ExifEntry* entry) const { exif_entry_unref(entry); }
40 };
41
42 } // namespace std
43
44
45 namespace android {
46 namespace camera3 {
47
48
49 class ExifUtilsImpl : public ExifUtils {
50 public:
51 ExifUtilsImpl();
52
53 virtual ~ExifUtilsImpl();
54
55 // Initialize() can be called multiple times. The setting of Exif tags will be
56 // cleared.
57 virtual bool initialize(const unsigned char *app1Segment, size_t app1SegmentSize);
58 virtual bool initializeEmpty();
59
60 // set all known fields from a metadata structure
61 virtual bool setFromMetadata(const CameraMetadata& metadata,
62 const CameraMetadata& staticInfo,
63 const size_t imageWidth,
64 const size_t imageHeight);
65
66 // sets the len aperture.
67 // Returns false if memory allocation fails.
68 virtual bool setAperture(float aperture);
69
70 // sets the color space.
71 // Returns false if memory allocation fails.
72 virtual bool setColorSpace(uint16_t color_space);
73
74 // sets the date and time of image last modified. It takes local time. The
75 // name of the tag is DateTime in IFD0.
76 // Returns false if memory allocation fails.
77 virtual bool setDateTime(const struct tm& t);
78
79 // sets the digital zoom ratio. If the numerator is 0, it means digital zoom
80 // was not used.
81 // Returns false if memory allocation fails.
82 virtual bool setDigitalZoomRatio(
83 uint32_t crop_width, uint32_t crop_height,
84 uint32_t sensor_width, uint32_t sensor_height);
85
86 // Sets the exposure bias.
87 // Returns false if memory allocation fails.
88 virtual bool setExposureBias(int32_t ev,
89 uint32_t ev_step_numerator, uint32_t ev_step_denominator);
90
91 // sets the exposure mode set when the image was shot.
92 // Returns false if memory allocation fails.
93 virtual bool setExposureMode(uint8_t exposure_mode);
94
95 // sets the exposure time, given in seconds.
96 // Returns false if memory allocation fails.
97 virtual bool setExposureTime(float exposure_time);
98
99 // sets the status of flash.
100 // Returns false if memory allocation fails.
101 virtual bool setFlash(uint8_t flash_available, uint8_t flash_state, uint8_t ae_mode);
102
103 // sets the F number.
104 // Returns false if memory allocation fails.
105 virtual bool setFNumber(float f_number);
106
107 // sets the focal length of lens used to take the image in millimeters.
108 // Returns false if memory allocation fails.
109 virtual bool setFocalLength(float focal_length);
110
111 // sets the focal length of lens for 35mm film used to take the image in millimeters.
112 // Returns false if memory allocation fails.
113 virtual bool setFocalLengthIn35mmFilm(float focal_length,
114 float sensor_size_x, float sensor_size_y);
115
116 // sets the altitude in meters.
117 // Returns false if memory allocation fails.
118 virtual bool setGpsAltitude(double altitude);
119
120 // sets the latitude with degrees minutes seconds format.
121 // Returns false if memory allocation fails.
122 virtual bool setGpsLatitude(double latitude);
123
124 // sets the longitude with degrees minutes seconds format.
125 // Returns false if memory allocation fails.
126 virtual bool setGpsLongitude(double longitude);
127
128 // sets GPS processing method.
129 // Returns false if memory allocation fails.
130 virtual bool setGpsProcessingMethod(const std::string& method);
131
132 // sets GPS date stamp and time stamp (atomic clock). It takes UTC time.
133 // Returns false if memory allocation fails.
134 virtual bool setGpsTimestamp(const struct tm& t);
135
136 // sets the length (number of rows) of main image.
137 // Returns false if memory allocation fails.
138 virtual bool setImageHeight(uint32_t length);
139
140 // sets the width (number of columes) of main image.
141 // Returns false if memory allocation fails.
142 virtual bool setImageWidth(uint32_t width);
143
144 // sets the ISO speed.
145 // Returns false if memory allocation fails.
146 virtual bool setIsoSpeedRating(uint16_t iso_speed_ratings);
147
148 // sets the smallest F number of the lens.
149 // Returns false if memory allocation fails.
150 virtual bool setMaxAperture(float aperture);
151
152 // sets image orientation.
153 // Returns false if memory allocation fails.
154 virtual bool setOrientation(uint16_t degrees);
155
156 // sets image orientation.
157 // Returns false if memory allocation fails.
158 virtual bool setOrientationValue(ExifOrientation orientationValue);
159
160 // sets the shutter speed.
161 // Returns false if memory allocation fails.
162 virtual bool setShutterSpeed(float exposure_time);
163
164 // sets the distance to the subject, given in meters.
165 // Returns false if memory allocation fails.
166 virtual bool setSubjectDistance(float diopters);
167
168 // sets the fractions of seconds for the <DateTime> tag.
169 // Returns false if memory allocation fails.
170 virtual bool setSubsecTime(const std::string& subsec_time);
171
172 // sets the white balance mode set when the image was shot.
173 // Returns false if memory allocation fails.
174 virtual bool setWhiteBalance(uint8_t white_balance);
175
176 // Generates APP1 segment.
177 // Returns false if generating APP1 segment fails.
178 virtual bool generateApp1();
179
180 // Gets buffer of APP1 segment. This method must be called only after calling
181 // GenerateAPP1().
182 virtual const uint8_t* getApp1Buffer();
183
184 // Gets length of APP1 segment. This method must be called only after calling
185 // GenerateAPP1().
186 virtual unsigned int getApp1Length();
187
188 protected:
189 // sets the version of this standard supported.
190 // Returns false if memory allocation fails.
191 virtual bool setExifVersion(const std::string& exif_version);
192
193 // Resets the pointers and memories.
194 virtual void reset();
195
196 // Adds a variable length tag to |exif_data_|. It will remove the original one
197 // if the tag exists.
198 // Returns the entry of the tag. The reference count of returned ExifEntry is
199 // two.
200 virtual std::unique_ptr<ExifEntry> addVariableLengthEntry(ExifIfd ifd,
201 ExifTag tag, ExifFormat format, uint64_t components, unsigned int size);
202
203 // Adds a entry of |tag| in |exif_data_|. It won't remove the original one if
204 // the tag exists.
205 // Returns the entry of the tag. It adds one reference count to returned
206 // ExifEntry.
207 virtual std::unique_ptr<ExifEntry> addEntry(ExifIfd ifd, ExifTag tag);
208
209 // Helpe functions to add exif data with different types.
210 virtual bool setShort(ExifIfd ifd, ExifTag tag, uint16_t value, const std::string& msg);
211
212 virtual bool setLong(ExifIfd ifd, ExifTag tag, uint32_t value, const std::string& msg);
213
214 virtual bool setRational(ExifIfd ifd, ExifTag tag, uint32_t numerator,
215 uint32_t denominator, const std::string& msg);
216
217 virtual bool setSRational(ExifIfd ifd, ExifTag tag, int32_t numerator,
218 int32_t denominator, const std::string& msg);
219
220 virtual bool setString(ExifIfd ifd, ExifTag tag, ExifFormat format,
221 const std::string& buffer, const std::string& msg);
222
convertToApex(float val)223 float convertToApex(float val) {
224 return 2.0f * log2f(val);
225 }
226
227 // Destroys the buffer of APP1 segment if exists.
228 virtual void destroyApp1();
229
230 // The Exif data (APP1). Owned by this class.
231 ExifData* exif_data_;
232 // The raw data of APP1 segment. It's allocated by ExifMem in |exif_data_| but
233 // owned by this class.
234 uint8_t* app1_buffer_;
235 // The length of |app1_buffer_|.
236 unsigned int app1_length_;
237
238 // How precise the float-to-rational conversion for EXIF tags would be.
239 const static int kRationalPrecision = 10000;
240 };
241
242 #define SET_SHORT(ifd, tag, value) \
243 do { \
244 if (setShort(ifd, tag, value, #tag) == false) \
245 return false; \
246 } while (0);
247
248 #define SET_LONG(ifd, tag, value) \
249 do { \
250 if (setLong(ifd, tag, value, #tag) == false) \
251 return false; \
252 } while (0);
253
254 #define SET_RATIONAL(ifd, tag, numerator, denominator) \
255 do { \
256 if (setRational(ifd, tag, numerator, denominator, #tag) == false) \
257 return false; \
258 } while (0);
259
260 #define SET_SRATIONAL(ifd, tag, numerator, denominator) \
261 do { \
262 if (setSRational(ifd, tag, numerator, denominator, #tag) == false) \
263 return false; \
264 } while (0);
265
266 #define SET_STRING(ifd, tag, format, buffer) \
267 do { \
268 if (setString(ifd, tag, format, buffer, #tag) == false) \
269 return false; \
270 } while (0);
271
272 // This comes from the Exif Version 2.2 standard table 6.
273 const char gExifAsciiPrefix[] = {0x41, 0x53, 0x43, 0x49, 0x49, 0x0, 0x0, 0x0};
274
setLatitudeOrLongitudeData(unsigned char * data,double num)275 static void setLatitudeOrLongitudeData(unsigned char* data, double num) {
276 // Take the integer part of |num|.
277 ExifLong degrees = static_cast<ExifLong>(num);
278 ExifLong minutes = static_cast<ExifLong>(60 * (num - degrees));
279 ExifLong microseconds =
280 static_cast<ExifLong>(3600000000u * (num - degrees - minutes / 60.0));
281 exif_set_rational(data, EXIF_BYTE_ORDER_INTEL, {degrees, 1});
282 exif_set_rational(data + sizeof(ExifRational), EXIF_BYTE_ORDER_INTEL, {minutes, 1});
283 exif_set_rational(data + 2 * sizeof(ExifRational), EXIF_BYTE_ORDER_INTEL,
284 {microseconds, 1000000});
285 }
286
create()287 ExifUtils *ExifUtils::create() {
288 return new ExifUtilsImpl();
289 }
290
~ExifUtils()291 ExifUtils::~ExifUtils() {
292 }
293
ExifUtilsImpl()294 ExifUtilsImpl::ExifUtilsImpl()
295 : exif_data_(nullptr), app1_buffer_(nullptr), app1_length_(0) {}
296
~ExifUtilsImpl()297 ExifUtilsImpl::~ExifUtilsImpl() {
298 reset();
299 }
300
301
initialize(const unsigned char * app1Segment,size_t app1SegmentSize)302 bool ExifUtilsImpl::initialize(const unsigned char *app1Segment, size_t app1SegmentSize) {
303 reset();
304 exif_data_ = exif_data_new_from_data(app1Segment, app1SegmentSize);
305 if (exif_data_ == nullptr) {
306 ALOGE("%s: allocate memory for exif_data_ failed", __FUNCTION__);
307 return false;
308 }
309 // set the image options.
310 exif_data_set_option(exif_data_, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION);
311 exif_data_set_data_type(exif_data_, EXIF_DATA_TYPE_COMPRESSED);
312 exif_data_set_byte_order(exif_data_, EXIF_BYTE_ORDER_INTEL);
313
314 // set exif version to 2.2.
315 if (!setExifVersion("0220")) {
316 return false;
317 }
318
319 return true;
320 }
321
initializeEmpty()322 bool ExifUtilsImpl::initializeEmpty() {
323 reset();
324 exif_data_ = exif_data_new();
325 if (exif_data_ == nullptr) {
326 ALOGE("%s: allocate memory for exif_data_ failed", __FUNCTION__);
327 return false;
328 }
329 // set the image options.
330 exif_data_set_option(exif_data_, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION);
331 exif_data_set_data_type(exif_data_, EXIF_DATA_TYPE_COMPRESSED);
332 exif_data_set_byte_order(exif_data_, EXIF_BYTE_ORDER_INTEL);
333
334 // set exif version to 2.2.
335 if (!setExifVersion("0220")) {
336 return false;
337 }
338
339 return true;
340 }
341
setAperture(float aperture)342 bool ExifUtilsImpl::setAperture(float aperture) {
343 float apexValue = convertToApex(aperture);
344 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_APERTURE_VALUE,
345 static_cast<uint32_t>(std::round(apexValue * kRationalPrecision)),
346 kRationalPrecision);
347 return true;
348 }
349
setColorSpace(uint16_t color_space)350 bool ExifUtilsImpl::setColorSpace(uint16_t color_space) {
351 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_COLOR_SPACE, color_space);
352 return true;
353 }
354
setDateTime(const struct tm & t)355 bool ExifUtilsImpl::setDateTime(const struct tm& t) {
356 // The length is 20 bytes including NULL for termination in Exif standard.
357 char str[20];
358 int result = snprintf(str, sizeof(str), "%04i:%02i:%02i %02i:%02i:%02i",
359 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
360 if (result != sizeof(str) - 1) {
361 ALOGW("%s: Input time is invalid", __FUNCTION__);
362 return false;
363 }
364 std::string buffer(str);
365 SET_STRING(EXIF_IFD_0, EXIF_TAG_DATE_TIME, EXIF_FORMAT_ASCII, buffer);
366 SET_STRING(EXIF_IFD_EXIF, EXIF_TAG_DATE_TIME_ORIGINAL, EXIF_FORMAT_ASCII, buffer);
367 SET_STRING(EXIF_IFD_EXIF, EXIF_TAG_DATE_TIME_DIGITIZED, EXIF_FORMAT_ASCII, buffer);
368 return true;
369 }
370
setDigitalZoomRatio(uint32_t crop_width,uint32_t crop_height,uint32_t sensor_width,uint32_t sensor_height)371 bool ExifUtilsImpl::setDigitalZoomRatio(
372 uint32_t crop_width, uint32_t crop_height,
373 uint32_t sensor_width, uint32_t sensor_height) {
374 float zoomRatioX = (crop_width == 0) ? 1.0 : 1.0 * sensor_width / crop_width;
375 float zoomRatioY = (crop_height == 0) ? 1.0 : 1.0 * sensor_height / crop_height;
376 float zoomRatio = std::max(zoomRatioX, zoomRatioY);
377 const static float noZoomThreshold = 1.02f;
378
379 if (zoomRatio <= noZoomThreshold) {
380 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_DIGITAL_ZOOM_RATIO, 0, 1);
381 } else {
382 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_DIGITAL_ZOOM_RATIO,
383 static_cast<uint32_t>(std::round(zoomRatio * kRationalPrecision)),
384 kRationalPrecision);
385 }
386 return true;
387 }
388
setExposureMode(uint8_t exposure_mode)389 bool ExifUtilsImpl::setExposureMode(uint8_t exposure_mode) {
390 uint16_t exposureMode = (exposure_mode == ANDROID_CONTROL_AE_MODE_OFF) ? 1 : 0;
391 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_MODE, exposureMode);
392 return true;
393 }
394
setExposureTime(float exposure_time)395 bool ExifUtilsImpl::setExposureTime(float exposure_time) {
396 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_TIME,
397 static_cast<uint32_t>(std::round(exposure_time * kRationalPrecision)),
398 kRationalPrecision);
399 return true;
400 }
401
setFlash(uint8_t flash_available,uint8_t flash_state,uint8_t ae_mode)402 bool ExifUtilsImpl::setFlash(uint8_t flash_available, uint8_t flash_state, uint8_t ae_mode) {
403 // EXIF_TAG_FLASH bits layout per EXIF standard:
404 // Bit 0: 0 - did not fire
405 // 1 - fired
406 // Bit 1-2: status of return light
407 // Bit 3-4: 0 - unknown
408 // 1 - compulsory flash firing
409 // 2 - compulsory flash suppression
410 // 3 - auto mode
411 // Bit 5: 0 - flash function present
412 // 1 - no flash function
413 // Bit 6: 0 - no red-eye reduction mode or unknown
414 // 1 - red-eye reduction supported
415 uint16_t flash = 0x20;
416
417 if (flash_available == ANDROID_FLASH_INFO_AVAILABLE_TRUE) {
418 flash = 0x00;
419
420 if (flash_state == ANDROID_FLASH_STATE_FIRED) {
421 flash |= 0x1;
422 }
423 if (ae_mode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
424 flash |= 0x40;
425 }
426
427 uint16_t flashMode = 0;
428 switch (ae_mode) {
429 case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:
430 case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE:
431 flashMode = 3; // AUTO
432 break;
433 case ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH:
434 case ANDROID_CONTROL_AE_MODE_ON_EXTERNAL_FLASH:
435 flashMode = 1; // ON
436 break;
437 case ANDROID_CONTROL_AE_MODE_OFF:
438 case ANDROID_CONTROL_AE_MODE_ON:
439 flashMode = 2; // OFF
440 break;
441 default:
442 flashMode = 0; // UNKNOWN
443 break;
444 }
445 flash |= (flashMode << 3);
446 }
447 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_FLASH, flash);
448 return true;
449 }
450
setFNumber(float f_number)451 bool ExifUtilsImpl::setFNumber(float f_number) {
452 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_FNUMBER,
453 static_cast<uint32_t>(std::round(f_number * kRationalPrecision)),
454 kRationalPrecision);
455 return true;
456 }
457
setFocalLength(float focal_length)458 bool ExifUtilsImpl::setFocalLength(float focal_length) {
459 uint32_t numerator = static_cast<uint32_t>(std::round(focal_length * kRationalPrecision));
460 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_FOCAL_LENGTH, numerator, kRationalPrecision);
461 return true;
462 }
463
setFocalLengthIn35mmFilm(float focal_length,float sensor_size_x,float sensor_size_y)464 bool ExifUtilsImpl::setFocalLengthIn35mmFilm(
465 float focal_length, float sensor_size_x, float sensor_size_y) {
466 static const float filmDiagonal = 43.27; // diagonal of 35mm film
467 static const float minSensorDiagonal = 0.01;
468 float sensorDiagonal = std::sqrt(
469 sensor_size_x * sensor_size_x + sensor_size_y * sensor_size_y);
470 sensorDiagonal = std::max(sensorDiagonal, minSensorDiagonal);
471 float focalLength35mmFilm = std::round(focal_length * filmDiagonal / sensorDiagonal);
472 focalLength35mmFilm = std::min(1.0f * 65535, focalLength35mmFilm);
473
474 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_FOCAL_LENGTH_IN_35MM_FILM,
475 static_cast<uint16_t>(focalLength35mmFilm));
476 return true;
477 }
478
setGpsAltitude(double altitude)479 bool ExifUtilsImpl::setGpsAltitude(double altitude) {
480 ExifTag refTag = static_cast<ExifTag>(EXIF_TAG_GPS_ALTITUDE_REF);
481 std::unique_ptr<ExifEntry> refEntry =
482 addVariableLengthEntry(EXIF_IFD_GPS, refTag, EXIF_FORMAT_BYTE, 1, 1);
483 if (!refEntry) {
484 ALOGE("%s: Adding GPSAltitudeRef exif entry failed", __FUNCTION__);
485 return false;
486 }
487 if (altitude >= 0) {
488 *refEntry->data = 0;
489 } else {
490 *refEntry->data = 1;
491 altitude *= -1;
492 }
493
494 ExifTag tag = static_cast<ExifTag>(EXIF_TAG_GPS_ALTITUDE);
495 std::unique_ptr<ExifEntry> entry = addVariableLengthEntry(
496 EXIF_IFD_GPS, tag, EXIF_FORMAT_RATIONAL, 1, sizeof(ExifRational));
497 if (!entry) {
498 exif_content_remove_entry(exif_data_->ifd[EXIF_IFD_GPS], refEntry.get());
499 ALOGE("%s: Adding GPSAltitude exif entry failed", __FUNCTION__);
500 return false;
501 }
502 exif_set_rational(entry->data, EXIF_BYTE_ORDER_INTEL,
503 {static_cast<ExifLong>(altitude * 1000), 1000});
504
505 return true;
506 }
507
setGpsLatitude(double latitude)508 bool ExifUtilsImpl::setGpsLatitude(double latitude) {
509 const ExifTag refTag = static_cast<ExifTag>(EXIF_TAG_GPS_LATITUDE_REF);
510 std::unique_ptr<ExifEntry> refEntry =
511 addVariableLengthEntry(EXIF_IFD_GPS, refTag, EXIF_FORMAT_ASCII, 2, 2);
512 if (!refEntry) {
513 ALOGE("%s: Adding GPSLatitudeRef exif entry failed", __FUNCTION__);
514 return false;
515 }
516 if (latitude >= 0) {
517 memcpy(refEntry->data, "N", sizeof("N"));
518 } else {
519 memcpy(refEntry->data, "S", sizeof("S"));
520 latitude *= -1;
521 }
522
523 const ExifTag tag = static_cast<ExifTag>(EXIF_TAG_GPS_LATITUDE);
524 std::unique_ptr<ExifEntry> entry = addVariableLengthEntry(
525 EXIF_IFD_GPS, tag, EXIF_FORMAT_RATIONAL, 3, 3 * sizeof(ExifRational));
526 if (!entry) {
527 exif_content_remove_entry(exif_data_->ifd[EXIF_IFD_GPS], refEntry.get());
528 ALOGE("%s: Adding GPSLatitude exif entry failed", __FUNCTION__);
529 return false;
530 }
531 setLatitudeOrLongitudeData(entry->data, latitude);
532
533 return true;
534 }
535
setGpsLongitude(double longitude)536 bool ExifUtilsImpl::setGpsLongitude(double longitude) {
537 ExifTag refTag = static_cast<ExifTag>(EXIF_TAG_GPS_LONGITUDE_REF);
538 std::unique_ptr<ExifEntry> refEntry =
539 addVariableLengthEntry(EXIF_IFD_GPS, refTag, EXIF_FORMAT_ASCII, 2, 2);
540 if (!refEntry) {
541 ALOGE("%s: Adding GPSLongitudeRef exif entry failed", __FUNCTION__);
542 return false;
543 }
544 if (longitude >= 0) {
545 memcpy(refEntry->data, "E", sizeof("E"));
546 } else {
547 memcpy(refEntry->data, "W", sizeof("W"));
548 longitude *= -1;
549 }
550
551 ExifTag tag = static_cast<ExifTag>(EXIF_TAG_GPS_LONGITUDE);
552 std::unique_ptr<ExifEntry> entry = addVariableLengthEntry(
553 EXIF_IFD_GPS, tag, EXIF_FORMAT_RATIONAL, 3, 3 * sizeof(ExifRational));
554 if (!entry) {
555 exif_content_remove_entry(exif_data_->ifd[EXIF_IFD_GPS], refEntry.get());
556 ALOGE("%s: Adding GPSLongitude exif entry failed", __FUNCTION__);
557 return false;
558 }
559 setLatitudeOrLongitudeData(entry->data, longitude);
560
561 return true;
562 }
563
setGpsProcessingMethod(const std::string & method)564 bool ExifUtilsImpl::setGpsProcessingMethod(const std::string& method) {
565 std::string buffer =
566 std::string(gExifAsciiPrefix, sizeof(gExifAsciiPrefix)) + method;
567 SET_STRING(EXIF_IFD_GPS, static_cast<ExifTag>(EXIF_TAG_GPS_PROCESSING_METHOD),
568 EXIF_FORMAT_UNDEFINED, buffer);
569 return true;
570 }
571
setGpsTimestamp(const struct tm & t)572 bool ExifUtilsImpl::setGpsTimestamp(const struct tm& t) {
573 const ExifTag dateTag = static_cast<ExifTag>(EXIF_TAG_GPS_DATE_STAMP);
574 const size_t kGpsDateStampSize = 11;
575 std::unique_ptr<ExifEntry> entry = addVariableLengthEntry(EXIF_IFD_GPS,
576 dateTag, EXIF_FORMAT_ASCII, kGpsDateStampSize, kGpsDateStampSize);
577 if (!entry) {
578 ALOGE("%s: Adding GPSDateStamp exif entry failed", __FUNCTION__);
579 return false;
580 }
581 int result = snprintf(reinterpret_cast<char*>(entry->data), kGpsDateStampSize,
582 "%04i:%02i:%02i", t.tm_year + 1900, t.tm_mon + 1, t.tm_mday);
583 if (result != kGpsDateStampSize - 1) {
584 ALOGW("%s: Input time is invalid", __FUNCTION__);
585 return false;
586 }
587
588 const ExifTag timeTag = static_cast<ExifTag>(EXIF_TAG_GPS_TIME_STAMP);
589 entry = addVariableLengthEntry(EXIF_IFD_GPS, timeTag, EXIF_FORMAT_RATIONAL, 3,
590 3 * sizeof(ExifRational));
591 if (!entry) {
592 ALOGE("%s: Adding GPSTimeStamp exif entry failed", __FUNCTION__);
593 return false;
594 }
595 exif_set_rational(entry->data, EXIF_BYTE_ORDER_INTEL,
596 {static_cast<ExifLong>(t.tm_hour), 1});
597 exif_set_rational(entry->data + sizeof(ExifRational), EXIF_BYTE_ORDER_INTEL,
598 {static_cast<ExifLong>(t.tm_min), 1});
599 exif_set_rational(entry->data + 2 * sizeof(ExifRational), EXIF_BYTE_ORDER_INTEL,
600 {static_cast<ExifLong>(t.tm_sec), 1});
601
602 return true;
603 }
604
setImageHeight(uint32_t length)605 bool ExifUtilsImpl::setImageHeight(uint32_t length) {
606 SET_SHORT(EXIF_IFD_0, EXIF_TAG_IMAGE_LENGTH, length);
607 SET_LONG(EXIF_IFD_EXIF, EXIF_TAG_PIXEL_Y_DIMENSION, length);
608 return true;
609 }
610
setImageWidth(uint32_t width)611 bool ExifUtilsImpl::setImageWidth(uint32_t width) {
612 SET_SHORT(EXIF_IFD_0, EXIF_TAG_IMAGE_WIDTH, width);
613 SET_LONG(EXIF_IFD_EXIF, EXIF_TAG_PIXEL_X_DIMENSION, width);
614 return true;
615 }
616
setIsoSpeedRating(uint16_t iso_speed_ratings)617 bool ExifUtilsImpl::setIsoSpeedRating(uint16_t iso_speed_ratings) {
618 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_ISO_SPEED_RATINGS, iso_speed_ratings);
619 return true;
620 }
621
setMaxAperture(float aperture)622 bool ExifUtilsImpl::setMaxAperture(float aperture) {
623 float maxAperture = convertToApex(aperture);
624 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_MAX_APERTURE_VALUE,
625 static_cast<uint32_t>(std::round(maxAperture * kRationalPrecision)),
626 kRationalPrecision);
627 return true;
628 }
629
setExposureBias(int32_t ev,uint32_t ev_step_numerator,uint32_t ev_step_denominator)630 bool ExifUtilsImpl::setExposureBias(int32_t ev,
631 uint32_t ev_step_numerator, uint32_t ev_step_denominator) {
632 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_BIAS_VALUE,
633 ev * ev_step_numerator, ev_step_denominator);
634 return true;
635 }
636
setOrientation(uint16_t degrees)637 bool ExifUtilsImpl::setOrientation(uint16_t degrees) {
638 ExifOrientation value = ExifOrientation::ORIENTATION_0_DEGREES;
639 switch (degrees) {
640 case 90:
641 value = ExifOrientation::ORIENTATION_90_DEGREES;
642 break;
643 case 180:
644 value = ExifOrientation::ORIENTATION_180_DEGREES;
645 break;
646 case 270:
647 value = ExifOrientation::ORIENTATION_270_DEGREES;
648 break;
649 default:
650 break;
651 }
652 return setOrientationValue(value);
653 }
654
setOrientationValue(ExifOrientation orientationValue)655 bool ExifUtilsImpl::setOrientationValue(ExifOrientation orientationValue) {
656 SET_SHORT(EXIF_IFD_0, EXIF_TAG_ORIENTATION, orientationValue);
657 return true;
658 }
659
setShutterSpeed(float exposure_time)660 bool ExifUtilsImpl::setShutterSpeed(float exposure_time) {
661 float shutterSpeed = -log2f(exposure_time);
662 SET_SRATIONAL(EXIF_IFD_EXIF, EXIF_TAG_SHUTTER_SPEED_VALUE,
663 static_cast<uint32_t>(shutterSpeed * kRationalPrecision), kRationalPrecision);
664 return true;
665 }
666
setSubjectDistance(float diopters)667 bool ExifUtilsImpl::setSubjectDistance(float diopters) {
668 const static float kInfinityDiopters = 1.0e-6;
669 uint32_t numerator, denominator;
670 uint16_t distanceRange;
671 if (diopters > kInfinityDiopters) {
672 float focusDistance = 1.0f / diopters;
673 numerator = static_cast<uint32_t>(std::round(focusDistance * kRationalPrecision));
674 denominator = kRationalPrecision;
675
676 if (focusDistance < 1.0f) {
677 distanceRange = 1; // Macro
678 } else if (focusDistance < 3.0f) {
679 distanceRange = 2; // Close
680 } else {
681 distanceRange = 3; // Distant
682 }
683 } else {
684 numerator = 0xFFFFFFFF;
685 denominator = 1;
686 distanceRange = 3; // Distant
687 }
688 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_SUBJECT_DISTANCE, numerator, denominator);
689 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_SUBJECT_DISTANCE_RANGE, distanceRange);
690 return true;
691 }
692
setSubsecTime(const std::string & subsec_time)693 bool ExifUtilsImpl::setSubsecTime(const std::string& subsec_time) {
694 SET_STRING(EXIF_IFD_EXIF, EXIF_TAG_SUB_SEC_TIME, EXIF_FORMAT_ASCII, subsec_time);
695 SET_STRING(EXIF_IFD_EXIF, EXIF_TAG_SUB_SEC_TIME_ORIGINAL, EXIF_FORMAT_ASCII, subsec_time);
696 SET_STRING(EXIF_IFD_EXIF, EXIF_TAG_SUB_SEC_TIME_DIGITIZED, EXIF_FORMAT_ASCII, subsec_time);
697 return true;
698 }
699
setWhiteBalance(uint8_t white_balance)700 bool ExifUtilsImpl::setWhiteBalance(uint8_t white_balance) {
701 uint16_t whiteBalance = (white_balance == ANDROID_CONTROL_AWB_MODE_AUTO) ? 0 : 1;
702 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_WHITE_BALANCE, whiteBalance);
703 return true;
704 }
705
generateApp1()706 bool ExifUtilsImpl::generateApp1() {
707 destroyApp1();
708 // Save the result into |app1_buffer_|.
709 exif_data_save_data(exif_data_, &app1_buffer_, &app1_length_);
710 if (!app1_length_) {
711 ALOGE("%s: Allocate memory for app1_buffer_ failed", __FUNCTION__);
712 return false;
713 }
714 /*
715 * The JPEG segment size is 16 bits in spec. The size of APP1 segment should
716 * be smaller than 65533 because there are two bytes for segment size field.
717 */
718 if (app1_length_ > 65533) {
719 destroyApp1();
720 ALOGE("%s: The size of APP1 segment is too large", __FUNCTION__);
721 return false;
722 }
723 return true;
724 }
725
getApp1Buffer()726 const uint8_t* ExifUtilsImpl::getApp1Buffer() {
727 return app1_buffer_;
728 }
729
getApp1Length()730 unsigned int ExifUtilsImpl::getApp1Length() {
731 return app1_length_;
732 }
733
setExifVersion(const std::string & exif_version)734 bool ExifUtilsImpl::setExifVersion(const std::string& exif_version) {
735 SET_STRING(EXIF_IFD_EXIF, EXIF_TAG_EXIF_VERSION, EXIF_FORMAT_UNDEFINED, exif_version);
736 return true;
737 }
738
reset()739 void ExifUtilsImpl::reset() {
740 destroyApp1();
741 if (exif_data_) {
742 /*
743 * Since we decided to ignore the original APP1, we are sure that there is
744 * no thumbnail allocated by libexif. |exif_data_->data| is actually
745 * allocated by JpegCompressor. sets |exif_data_->data| to nullptr to
746 * prevent exif_data_unref() destroy it incorrectly.
747 */
748 exif_data_->data = nullptr;
749 exif_data_->size = 0;
750 exif_data_unref(exif_data_);
751 exif_data_ = nullptr;
752 }
753 }
754
addVariableLengthEntry(ExifIfd ifd,ExifTag tag,ExifFormat format,uint64_t components,unsigned int size)755 std::unique_ptr<ExifEntry> ExifUtilsImpl::addVariableLengthEntry(ExifIfd ifd,
756 ExifTag tag, ExifFormat format, uint64_t components, unsigned int size) {
757 // Remove old entry if exists.
758 exif_content_remove_entry(exif_data_->ifd[ifd],
759 exif_content_get_entry(exif_data_->ifd[ifd], tag));
760 ExifMem* mem = exif_mem_new_default();
761 if (!mem) {
762 ALOGE("%s: Allocate memory for exif entry failed", __FUNCTION__);
763 return nullptr;
764 }
765 std::unique_ptr<ExifEntry> entry(exif_entry_new_mem(mem));
766 if (!entry) {
767 ALOGE("%s: Allocate memory for exif entry failed", __FUNCTION__);
768 exif_mem_unref(mem);
769 return nullptr;
770 }
771 void* tmpBuffer = exif_mem_alloc(mem, size);
772 if (!tmpBuffer) {
773 ALOGE("%s: Allocate memory for exif entry failed", __FUNCTION__);
774 exif_mem_unref(mem);
775 return nullptr;
776 }
777
778 entry->data = static_cast<unsigned char*>(tmpBuffer);
779 entry->tag = tag;
780 entry->format = format;
781 entry->components = components;
782 entry->size = size;
783
784 exif_content_add_entry(exif_data_->ifd[ifd], entry.get());
785 exif_mem_unref(mem);
786
787 return entry;
788 }
789
addEntry(ExifIfd ifd,ExifTag tag)790 std::unique_ptr<ExifEntry> ExifUtilsImpl::addEntry(ExifIfd ifd, ExifTag tag) {
791 std::unique_ptr<ExifEntry> entry(exif_content_get_entry(exif_data_->ifd[ifd], tag));
792 if (entry) {
793 // exif_content_get_entry() won't ref the entry, so we ref here.
794 exif_entry_ref(entry.get());
795 return entry;
796 }
797 entry.reset(exif_entry_new());
798 if (!entry) {
799 ALOGE("%s: Allocate memory for exif entry failed", __FUNCTION__);
800 return nullptr;
801 }
802 entry->tag = tag;
803 exif_content_add_entry(exif_data_->ifd[ifd], entry.get());
804 exif_entry_initialize(entry.get(), tag);
805 return entry;
806 }
807
setShort(ExifIfd ifd,ExifTag tag,uint16_t value,const std::string & msg)808 bool ExifUtilsImpl::setShort(ExifIfd ifd, ExifTag tag, uint16_t value, const std::string& msg) {
809 std::unique_ptr<ExifEntry> entry = addEntry(ifd, tag);
810 if (!entry) {
811 ALOGE("%s: Adding '%s' entry failed", __FUNCTION__, msg.c_str());
812 return false;
813 }
814 exif_set_short(entry->data, EXIF_BYTE_ORDER_INTEL, value);
815 return true;
816 }
817
setLong(ExifIfd ifd,ExifTag tag,uint32_t value,const std::string & msg)818 bool ExifUtilsImpl::setLong(ExifIfd ifd, ExifTag tag, uint32_t value, const std::string& msg) {
819 std::unique_ptr<ExifEntry> entry = addEntry(ifd, tag);
820 if (!entry) {
821 ALOGE("%s: Adding '%s' entry failed", __FUNCTION__, msg.c_str());
822 return false;
823 }
824 exif_set_long(entry->data, EXIF_BYTE_ORDER_INTEL, value);
825 return true;
826 }
827
setRational(ExifIfd ifd,ExifTag tag,uint32_t numerator,uint32_t denominator,const std::string & msg)828 bool ExifUtilsImpl::setRational(ExifIfd ifd, ExifTag tag, uint32_t numerator,
829 uint32_t denominator, const std::string& msg) {
830 std::unique_ptr<ExifEntry> entry = addEntry(ifd, tag);
831 if (!entry) {
832 ALOGE("%s: Adding '%s' entry failed", __FUNCTION__, msg.c_str());
833 return false;
834 }
835 exif_set_rational(entry->data, EXIF_BYTE_ORDER_INTEL, {numerator, denominator});
836 return true;
837 }
838
setSRational(ExifIfd ifd,ExifTag tag,int32_t numerator,int32_t denominator,const std::string & msg)839 bool ExifUtilsImpl::setSRational(ExifIfd ifd, ExifTag tag, int32_t numerator,
840 int32_t denominator, const std::string& msg) {
841 std::unique_ptr<ExifEntry> entry = addEntry(ifd, tag);
842 if (!entry) {
843 ALOGE("%s: Adding '%s' entry failed", __FUNCTION__, msg.c_str());
844 return false;
845 }
846 exif_set_srational(entry->data, EXIF_BYTE_ORDER_INTEL, {numerator, denominator});
847 return true;
848 }
849
setString(ExifIfd ifd,ExifTag tag,ExifFormat format,const std::string & buffer,const std::string & msg)850 bool ExifUtilsImpl::setString(ExifIfd ifd, ExifTag tag, ExifFormat format,
851 const std::string& buffer, const std::string& msg) {
852 size_t entry_size = buffer.length();
853 // Since the exif format is undefined, NULL termination is not necessary.
854 if (format == EXIF_FORMAT_ASCII) {
855 entry_size++;
856 }
857 std::unique_ptr<ExifEntry> entry =
858 addVariableLengthEntry(ifd, tag, format, entry_size, entry_size);
859 if (!entry) {
860 ALOGE("%s: Adding '%s' entry failed", __FUNCTION__, msg.c_str());
861 return false;
862 }
863 memcpy(entry->data, buffer.c_str(), entry_size);
864 return true;
865 }
866
destroyApp1()867 void ExifUtilsImpl::destroyApp1() {
868 /*
869 * Since there is no API to access ExifMem in ExifData->priv, we use free
870 * here, which is the default free function in libexif. See
871 * exif_data_save_data() for detail.
872 */
873 free(app1_buffer_);
874 app1_buffer_ = nullptr;
875 app1_length_ = 0;
876 }
877
setFromMetadata(const CameraMetadata & metadata,const CameraMetadata & staticInfo,const size_t imageWidth,const size_t imageHeight)878 bool ExifUtilsImpl::setFromMetadata(const CameraMetadata& metadata,
879 const CameraMetadata& staticInfo,
880 const size_t imageWidth, const size_t imageHeight) {
881 if (!setImageWidth(imageWidth) ||
882 !setImageHeight(imageHeight)) {
883 ALOGE("%s: setting image resolution failed.", __FUNCTION__);
884 return false;
885 }
886
887 struct timespec tp;
888 struct tm time_info;
889 bool time_available = clock_gettime(CLOCK_REALTIME, &tp) != -1;
890 localtime_r(&tp.tv_sec, &time_info);
891 if (!setDateTime(time_info)) {
892 ALOGE("%s: setting data time failed.", __FUNCTION__);
893 return false;
894 }
895
896 float focal_length;
897 camera_metadata_ro_entry entry = metadata.find(ANDROID_LENS_FOCAL_LENGTH);
898 if (entry.count) {
899 focal_length = entry.data.f[0];
900
901 if (!setFocalLength(focal_length)) {
902 ALOGE("%s: setting focal length failed.", __FUNCTION__);
903 return false;
904 }
905
906 camera_metadata_ro_entry sensorSizeEntry =
907 staticInfo.find(ANDROID_SENSOR_INFO_PHYSICAL_SIZE);
908 if (sensorSizeEntry.count == 2) {
909 if (!setFocalLengthIn35mmFilm(
910 focal_length, sensorSizeEntry.data.f[0], sensorSizeEntry.data.f[1])) {
911 ALOGE("%s: setting focal length in 35mm failed.", __FUNCTION__);
912 return false;
913 }
914 }
915 } else {
916 ALOGV("%s: Cannot find focal length in metadata.", __FUNCTION__);
917 }
918
919 if (metadata.exists(ANDROID_SCALER_CROP_REGION) &&
920 staticInfo.exists(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE)) {
921 entry = metadata.find(ANDROID_SCALER_CROP_REGION);
922 camera_metadata_ro_entry activeArrayEntry =
923 staticInfo.find(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE);
924
925 if (!setDigitalZoomRatio(entry.data.i32[2], entry.data.i32[3],
926 activeArrayEntry.data.i32[2], activeArrayEntry.data.i32[3])) {
927 ALOGE("%s: setting digital zoom ratio failed.", __FUNCTION__);
928 return false;
929 }
930 }
931
932 if (metadata.exists(ANDROID_JPEG_GPS_COORDINATES)) {
933 entry = metadata.find(ANDROID_JPEG_GPS_COORDINATES);
934 if (entry.count < 3) {
935 ALOGE("%s: Gps coordinates in metadata is not complete.", __FUNCTION__);
936 return false;
937 }
938 if (!setGpsLatitude(entry.data.d[0])) {
939 ALOGE("%s: setting gps latitude failed.", __FUNCTION__);
940 return false;
941 }
942 if (!setGpsLongitude(entry.data.d[1])) {
943 ALOGE("%s: setting gps longitude failed.", __FUNCTION__);
944 return false;
945 }
946 if (!setGpsAltitude(entry.data.d[2])) {
947 ALOGE("%s: setting gps altitude failed.", __FUNCTION__);
948 return false;
949 }
950 }
951
952 if (metadata.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) {
953 entry = metadata.find(ANDROID_JPEG_GPS_PROCESSING_METHOD);
954 std::string method_str(reinterpret_cast<const char*>(entry.data.u8));
955 if (!setGpsProcessingMethod(method_str)) {
956 ALOGE("%s: setting gps processing method failed.", __FUNCTION__);
957 return false;
958 }
959 }
960
961 if (time_available && metadata.exists(ANDROID_JPEG_GPS_TIMESTAMP)) {
962 entry = metadata.find(ANDROID_JPEG_GPS_TIMESTAMP);
963 time_t timestamp = static_cast<time_t>(entry.data.i64[0]);
964 if (gmtime_r(×tamp, &time_info)) {
965 if (!setGpsTimestamp(time_info)) {
966 ALOGE("%s: setting gps timestamp failed.", __FUNCTION__);
967 return false;
968 }
969 } else {
970 ALOGE("%s: Time tranformation failed.", __FUNCTION__);
971 return false;
972 }
973 }
974
975 if (staticInfo.exists(ANDROID_CONTROL_AE_COMPENSATION_STEP) &&
976 metadata.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
977 entry = metadata.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION);
978 camera_metadata_ro_entry stepEntry =
979 staticInfo.find(ANDROID_CONTROL_AE_COMPENSATION_STEP);
980 if (!setExposureBias(entry.data.i32[0], stepEntry.data.r[0].numerator,
981 stepEntry.data.r[0].denominator)) {
982 ALOGE("%s: setting exposure bias failed.", __FUNCTION__);
983 return false;
984 }
985 }
986
987 if (metadata.exists(ANDROID_JPEG_ORIENTATION)) {
988 entry = metadata.find(ANDROID_JPEG_ORIENTATION);
989 if (!setOrientation(entry.data.i32[0])) {
990 ALOGE("%s: setting orientation failed.", __FUNCTION__);
991 return false;
992 }
993 }
994
995 if (metadata.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
996 entry = metadata.find(ANDROID_SENSOR_EXPOSURE_TIME);
997 float exposure_time = 1.0f * entry.data.i64[0] / 1e9;
998 if (!setExposureTime(exposure_time)) {
999 ALOGE("%s: setting exposure time failed.", __FUNCTION__);
1000 return false;
1001 }
1002
1003 if (!setShutterSpeed(exposure_time)) {
1004 ALOGE("%s: setting shutter speed failed.", __FUNCTION__);
1005 return false;
1006 }
1007 }
1008
1009 if (metadata.exists(ANDROID_LENS_FOCUS_DISTANCE)) {
1010 entry = metadata.find(ANDROID_LENS_FOCUS_DISTANCE);
1011 if (!setSubjectDistance(entry.data.f[0])) {
1012 ALOGE("%s: setting subject distance failed.", __FUNCTION__);
1013 return false;
1014 }
1015 }
1016
1017 if (metadata.exists(ANDROID_SENSOR_SENSITIVITY)) {
1018 entry = metadata.find(ANDROID_SENSOR_SENSITIVITY);
1019 int32_t iso = entry.data.i32[0];
1020 camera_metadata_ro_entry postRawSensEntry =
1021 metadata.find(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST);
1022 if (postRawSensEntry.count > 0) {
1023 iso = iso * postRawSensEntry.data.i32[0] / 100;
1024 }
1025
1026 if (!setIsoSpeedRating(static_cast<uint16_t>(iso))) {
1027 ALOGE("%s: setting iso rating failed.", __FUNCTION__);
1028 return false;
1029 }
1030 }
1031
1032 if (metadata.exists(ANDROID_LENS_APERTURE)) {
1033 entry = metadata.find(ANDROID_LENS_APERTURE);
1034 if (!setFNumber(entry.data.f[0])) {
1035 ALOGE("%s: setting F number failed.", __FUNCTION__);
1036 return false;
1037 }
1038 if (!setAperture(entry.data.f[0])) {
1039 ALOGE("%s: setting aperture failed.", __FUNCTION__);
1040 return false;
1041 }
1042 }
1043
1044 static const uint16_t kSRGBColorSpace = 1;
1045 if (!setColorSpace(kSRGBColorSpace)) {
1046 ALOGE("%s: setting color space failed.", __FUNCTION__);
1047 return false;
1048 }
1049
1050 if (staticInfo.exists(ANDROID_LENS_INFO_AVAILABLE_APERTURES)) {
1051 entry = staticInfo.find(ANDROID_LENS_INFO_AVAILABLE_APERTURES);
1052 if (!setMaxAperture(entry.data.f[0])) {
1053 ALOGE("%s: setting max aperture failed.", __FUNCTION__);
1054 return false;
1055 }
1056 }
1057
1058 if (staticInfo.exists(ANDROID_FLASH_INFO_AVAILABLE)) {
1059 entry = staticInfo.find(ANDROID_FLASH_INFO_AVAILABLE);
1060 camera_metadata_ro_entry flashStateEntry = metadata.find(ANDROID_FLASH_STATE);
1061 camera_metadata_ro_entry aeModeEntry = metadata.find(ANDROID_CONTROL_AE_MODE);
1062 uint8_t flashState = flashStateEntry.count > 0 ?
1063 flashStateEntry.data.u8[0] : ANDROID_FLASH_STATE_UNAVAILABLE;
1064 uint8_t aeMode = aeModeEntry.count > 0 ?
1065 aeModeEntry.data.u8[0] : ANDROID_CONTROL_AE_MODE_OFF;
1066
1067 if (!setFlash(entry.data.u8[0], flashState, aeMode)) {
1068 ALOGE("%s: setting flash failed.", __FUNCTION__);
1069 return false;
1070 }
1071 }
1072
1073 if (metadata.exists(ANDROID_CONTROL_AWB_MODE)) {
1074 entry = metadata.find(ANDROID_CONTROL_AWB_MODE);
1075 if (!setWhiteBalance(entry.data.u8[0])) {
1076 ALOGE("%s: setting white balance failed.", __FUNCTION__);
1077 return false;
1078 }
1079 }
1080
1081 if (metadata.exists(ANDROID_CONTROL_AE_MODE)) {
1082 entry = metadata.find(ANDROID_CONTROL_AE_MODE);
1083 if (!setExposureMode(entry.data.u8[0])) {
1084 ALOGE("%s: setting exposure mode failed.", __FUNCTION__);
1085 return false;
1086 }
1087 }
1088 if (time_available) {
1089 char str[4];
1090 if (snprintf(str, sizeof(str), "%03ld", tp.tv_nsec / 1000000) < 0) {
1091 ALOGE("%s: Subsec is invalid: %ld", __FUNCTION__, tp.tv_nsec);
1092 return false;
1093 }
1094 if (!setSubsecTime(std::string(str))) {
1095 ALOGE("%s: setting subsec time failed.", __FUNCTION__);
1096 return false;
1097 }
1098 }
1099
1100 return true;
1101 }
1102
1103 } // namespace camera3
1104 } // namespace android
1105