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