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