1 /* 2 * Copyright (C) 2012 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_NDEBUG 1 18 #define LOG_TAG "camera_metadata_tests" 19 #include "cutils/log.h" 20 21 #include <errno.h> 22 23 #include "gtest/gtest.h" 24 #include "system/camera_metadata.h" 25 26 #include "camera_metadata_tests_fake_vendor.h" 27 28 #define EXPECT_NULL(x) EXPECT_EQ((void*)0, x) 29 #define EXPECT_NOT_NULL(x) EXPECT_NE((void*)0, x) 30 31 #define OK 0 32 #define ERROR 1 33 #define NOT_FOUND (-ENOENT) 34 35 TEST(camera_metadata, allocate_normal) { 36 camera_metadata_t *m = NULL; 37 const size_t entry_capacity = 5; 38 const size_t data_capacity = 32; 39 40 m = allocate_camera_metadata(entry_capacity, data_capacity); 41 42 EXPECT_NOT_NULL(m); 43 EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m)); 44 EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m)); 45 EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m)); 46 EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m)); 47 48 free_camera_metadata(m); 49 } 50 51 TEST(camera_metadata, allocate_nodata) { 52 camera_metadata_t *m = NULL; 53 54 m = allocate_camera_metadata(1, 0); 55 56 EXPECT_NOT_NULL(m); 57 EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m)); 58 EXPECT_EQ((size_t)1, get_camera_metadata_entry_capacity(m)); 59 EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m)); 60 EXPECT_EQ((size_t)0, get_camera_metadata_data_capacity(m)); 61 62 free_camera_metadata(m); 63 } 64 65 TEST(camera_metadata, allocate_nothing) { 66 camera_metadata_t *m = NULL; 67 68 m = allocate_camera_metadata(0, 0); 69 70 EXPECT_NULL(m); 71 } 72 73 TEST(camera_metadata, place_normal) { 74 camera_metadata_t *m = NULL; 75 void *buf = NULL; 76 77 const size_t entry_capacity = 5; 78 const size_t data_capacity = 32; 79 80 size_t buf_size = calculate_camera_metadata_size(entry_capacity, 81 data_capacity); 82 83 EXPECT_TRUE(buf_size > 0); 84 85 buf = malloc(buf_size); 86 87 EXPECT_NOT_NULL(buf); 88 89 m = place_camera_metadata(buf, buf_size, entry_capacity, data_capacity); 90 91 EXPECT_EQ(buf, (uint8_t*)m); 92 EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m)); 93 EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m)); 94 EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m)); 95 EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m)); 96 97 free(buf); 98 } 99 100 TEST(camera_metadata, place_nospace) { 101 camera_metadata_t *m = NULL; 102 void *buf = NULL; 103 104 const size_t entry_capacity = 5; 105 const size_t data_capacity = 32; 106 107 size_t buf_size = calculate_camera_metadata_size(entry_capacity, 108 data_capacity); 109 110 EXPECT_GT(buf_size, (size_t)0); 111 112 buf_size--; 113 114 buf = malloc(buf_size); 115 116 EXPECT_NOT_NULL(buf); 117 118 m = place_camera_metadata(buf, buf_size, entry_capacity, data_capacity); 119 120 EXPECT_NULL(m); 121 122 free(buf); 123 } 124 125 TEST(camera_metadata, place_extraspace) { 126 camera_metadata_t *m = NULL; 127 uint8_t *buf = NULL; 128 129 const size_t entry_capacity = 5; 130 const size_t data_capacity = 32; 131 const size_t extra_space = 10; 132 133 size_t buf_size = calculate_camera_metadata_size(entry_capacity, 134 data_capacity); 135 136 EXPECT_GT(buf_size, (size_t)0); 137 138 buf_size += extra_space; 139 140 buf = (uint8_t*)malloc(buf_size); 141 142 EXPECT_NOT_NULL(buf); 143 144 m = place_camera_metadata(buf, buf_size, entry_capacity, data_capacity); 145 146 EXPECT_EQ((uint8_t*)m, buf); 147 EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m)); 148 EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m)); 149 EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m)); 150 EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m)); 151 EXPECT_EQ(buf + buf_size - extra_space, (uint8_t*)m + get_camera_metadata_size(m)); 152 153 free(buf); 154 } 155 156 TEST(camera_metadata, get_size) { 157 camera_metadata_t *m = NULL; 158 const size_t entry_capacity = 5; 159 const size_t data_capacity = 32; 160 161 m = allocate_camera_metadata(entry_capacity, data_capacity); 162 163 EXPECT_EQ(calculate_camera_metadata_size(entry_capacity, data_capacity), 164 get_camera_metadata_size(m) ); 165 166 EXPECT_EQ(calculate_camera_metadata_size(0,0), 167 get_camera_metadata_compact_size(m) ); 168 169 free_camera_metadata(m); 170 } 171 172 TEST(camera_metadata, add_get_normal) { 173 camera_metadata_t *m = NULL; 174 const size_t entry_capacity = 5; 175 const size_t data_capacity = 80; 176 177 m = allocate_camera_metadata(entry_capacity, data_capacity); 178 179 int result; 180 size_t data_used = 0; 181 size_t entries_used = 0; 182 183 // INT64 184 185 int64_t exposure_time = 1000000000; 186 result = add_camera_metadata_entry(m, 187 ANDROID_SENSOR_EXPOSURE_TIME, 188 &exposure_time, 1); 189 EXPECT_EQ(OK, result); 190 data_used += calculate_camera_metadata_entry_data_size( 191 get_camera_metadata_tag_type(ANDROID_SENSOR_EXPOSURE_TIME), 1); 192 entries_used++; 193 194 // INT32 195 196 int32_t sensitivity = 800; 197 result = add_camera_metadata_entry(m, 198 ANDROID_SENSOR_SENSITIVITY, 199 &sensitivity, 1); 200 EXPECT_EQ(OK, result); 201 data_used += calculate_camera_metadata_entry_data_size( 202 get_camera_metadata_tag_type(ANDROID_SENSOR_SENSITIVITY), 1); 203 entries_used++; 204 205 // FLOAT 206 207 float focusDistance = 0.5f; 208 result = add_camera_metadata_entry(m, 209 ANDROID_LENS_FOCUS_DISTANCE, 210 &focusDistance, 1); 211 EXPECT_EQ(OK, result); 212 data_used += calculate_camera_metadata_entry_data_size( 213 get_camera_metadata_tag_type(ANDROID_LENS_FOCUS_DISTANCE), 1); 214 entries_used++; 215 216 // Array of FLOAT 217 218 float colorTransform[9] = { 219 0.9f, 0.0f, 0.0f, 220 0.2f, 0.5f, 0.0f, 221 0.0f, 0.1f, 0.7f 222 }; 223 result = add_camera_metadata_entry(m, 224 ANDROID_COLOR_TRANSFORM, 225 colorTransform, 9); 226 EXPECT_EQ(OK, result); 227 data_used += calculate_camera_metadata_entry_data_size( 228 get_camera_metadata_tag_type(ANDROID_COLOR_TRANSFORM), 9); 229 entries_used++; 230 231 // Check added entries 232 233 camera_metadata_entry entry; 234 result = get_camera_metadata_entry(m, 235 0, &entry); 236 EXPECT_EQ(OK, result); 237 EXPECT_EQ(0, (int)entry.index); 238 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, entry.tag); 239 EXPECT_EQ(TYPE_INT64, entry.type); 240 EXPECT_EQ((size_t)1, entry.count); 241 EXPECT_EQ(exposure_time, *entry.data.i64); 242 243 result = get_camera_metadata_entry(m, 244 1, &entry); 245 EXPECT_EQ(OK, result); 246 EXPECT_EQ((size_t)1, entry.index); 247 EXPECT_EQ(ANDROID_SENSOR_SENSITIVITY, entry.tag); 248 EXPECT_EQ(TYPE_INT32, entry.type); 249 EXPECT_EQ((size_t)1, entry.count); 250 EXPECT_EQ(sensitivity, *entry.data.i32); 251 252 result = get_camera_metadata_entry(m, 253 2, &entry); 254 EXPECT_EQ(OK, result); 255 EXPECT_EQ((size_t)2, entry.index); 256 EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag); 257 EXPECT_EQ(TYPE_FLOAT, entry.type); 258 EXPECT_EQ((size_t)1, entry.count); 259 EXPECT_EQ(focusDistance, *entry.data.f); 260 261 result = get_camera_metadata_entry(m, 262 3, &entry); 263 EXPECT_EQ(OK, result); 264 EXPECT_EQ((size_t)3, entry.index); 265 EXPECT_EQ(ANDROID_COLOR_TRANSFORM, entry.tag); 266 EXPECT_EQ(TYPE_FLOAT, entry.type); 267 EXPECT_EQ((size_t)9, entry.count); 268 for (unsigned int i=0; i < entry.count; i++) { 269 EXPECT_EQ(colorTransform[i], entry.data.f[i] ); 270 } 271 272 EXPECT_EQ(calculate_camera_metadata_size(entry_capacity, data_capacity), 273 get_camera_metadata_size(m) ); 274 275 EXPECT_EQ(calculate_camera_metadata_size(entries_used, data_used), 276 get_camera_metadata_compact_size(m) ); 277 278 IF_ALOGV() { 279 dump_camera_metadata(m, 0, 2); 280 } 281 282 free_camera_metadata(m); 283 } 284 285 void add_test_metadata(camera_metadata_t *m, int entry_count) { 286 287 EXPECT_NOT_NULL(m); 288 289 int result; 290 size_t data_used = 0; 291 size_t entries_used = 0; 292 int64_t exposure_time; 293 for (int i=0; i < entry_count; i++ ) { 294 exposure_time = 100 + i * 100; 295 result = add_camera_metadata_entry(m, 296 ANDROID_SENSOR_EXPOSURE_TIME, 297 &exposure_time, 1); 298 EXPECT_EQ(OK, result); 299 data_used += calculate_camera_metadata_entry_data_size( 300 get_camera_metadata_tag_type(ANDROID_SENSOR_EXPOSURE_TIME), 1); 301 entries_used++; 302 } 303 EXPECT_EQ(data_used, get_camera_metadata_data_count(m)); 304 EXPECT_EQ(entries_used, get_camera_metadata_entry_count(m)); 305 EXPECT_GT(get_camera_metadata_data_capacity(m), 306 get_camera_metadata_data_count(m)); 307 } 308 309 TEST(camera_metadata, add_get_toomany) { 310 camera_metadata_t *m = NULL; 311 const size_t entry_capacity = 5; 312 const size_t data_capacity = 50; 313 int result; 314 315 m = allocate_camera_metadata(entry_capacity, data_capacity); 316 317 add_test_metadata(m, entry_capacity); 318 319 int32_t sensitivity = 100; 320 result = add_camera_metadata_entry(m, 321 ANDROID_SENSOR_SENSITIVITY, 322 &sensitivity, 1); 323 324 EXPECT_EQ(ERROR, result); 325 326 camera_metadata_entry entry; 327 for (unsigned int i=0; i < entry_capacity; i++) { 328 int64_t exposure_time = 100 + i * 100; 329 result = get_camera_metadata_entry(m, 330 i, &entry); 331 EXPECT_EQ(OK, result); 332 EXPECT_EQ(i, entry.index); 333 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, entry.tag); 334 EXPECT_EQ(TYPE_INT64, entry.type); 335 EXPECT_EQ((size_t)1, entry.count); 336 EXPECT_EQ(exposure_time, *entry.data.i64); 337 } 338 entry.tag = 1234; 339 entry.type = 56; 340 entry.data.u8 = NULL; 341 entry.count = 7890; 342 result = get_camera_metadata_entry(m, 343 entry_capacity, &entry); 344 EXPECT_EQ(ERROR, result); 345 EXPECT_EQ((uint32_t)1234, entry.tag); 346 EXPECT_EQ((uint8_t)56, entry.type); 347 EXPECT_EQ(NULL, entry.data.u8); 348 EXPECT_EQ((size_t)7890, entry.count); 349 350 IF_ALOGV() { 351 dump_camera_metadata(m, 0, 2); 352 } 353 354 free_camera_metadata(m); 355 } 356 357 TEST(camera_metadata, copy_metadata) { 358 camera_metadata_t *m = NULL; 359 const size_t entry_capacity = 50; 360 const size_t data_capacity = 450; 361 362 int result; 363 364 m = allocate_camera_metadata(entry_capacity, data_capacity); 365 366 add_test_metadata(m, entry_capacity); 367 368 size_t buf_size = get_camera_metadata_compact_size(m); 369 EXPECT_LT((size_t)0, buf_size); 370 371 uint8_t *buf = (uint8_t*)malloc(buf_size); 372 EXPECT_NOT_NULL(buf); 373 374 camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m); 375 EXPECT_NOT_NULL(m2); 376 EXPECT_EQ(buf, (uint8_t*)m2); 377 EXPECT_EQ(get_camera_metadata_entry_count(m), 378 get_camera_metadata_entry_count(m2)); 379 EXPECT_EQ(get_camera_metadata_data_count(m), 380 get_camera_metadata_data_count(m2)); 381 EXPECT_EQ(get_camera_metadata_entry_capacity(m2), 382 get_camera_metadata_entry_count(m2)); 383 EXPECT_EQ(get_camera_metadata_data_capacity(m2), 384 get_camera_metadata_data_count(m2)); 385 386 for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) { 387 camera_metadata_entry e1, e2; 388 int result; 389 result = get_camera_metadata_entry(m, i, &e1); 390 EXPECT_EQ(OK, result); 391 result = get_camera_metadata_entry(m2, i, &e2); 392 EXPECT_EQ(OK, result); 393 EXPECT_EQ(e1.index, e2.index); 394 EXPECT_EQ(e1.tag, e2.tag); 395 EXPECT_EQ(e1.type, e2.type); 396 EXPECT_EQ(e1.count, e2.count); 397 for (unsigned int j=0; 398 j < e1.count * camera_metadata_type_size[e1.type]; 399 j++) { 400 EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]); 401 } 402 } 403 404 free(buf); 405 406 free_camera_metadata(m); 407 } 408 409 TEST(camera_metadata, copy_metadata_extraspace) { 410 camera_metadata_t *m = NULL; 411 const size_t entry_capacity = 12; 412 const size_t data_capacity = 100; 413 414 const size_t extra_space = 10; 415 416 int result; 417 418 m = allocate_camera_metadata(entry_capacity, data_capacity); 419 420 add_test_metadata(m, entry_capacity); 421 422 size_t buf_size = get_camera_metadata_compact_size(m); 423 EXPECT_LT((size_t)0, buf_size); 424 buf_size += extra_space; 425 426 uint8_t *buf = (uint8_t*)malloc(buf_size); 427 EXPECT_NOT_NULL(buf); 428 429 camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m); 430 EXPECT_NOT_NULL(m2); 431 EXPECT_EQ(buf, (uint8_t*)m2); 432 EXPECT_EQ(get_camera_metadata_entry_count(m), 433 get_camera_metadata_entry_count(m2)); 434 EXPECT_EQ(get_camera_metadata_data_count(m), 435 get_camera_metadata_data_count(m2)); 436 EXPECT_EQ(get_camera_metadata_entry_capacity(m2), 437 get_camera_metadata_entry_count(m2)); 438 EXPECT_EQ(get_camera_metadata_data_capacity(m2), 439 get_camera_metadata_data_count(m2)); 440 EXPECT_EQ(buf + buf_size - extra_space, 441 (uint8_t*)m2 + get_camera_metadata_size(m2) ); 442 443 for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) { 444 camera_metadata_entry e1, e2; 445 446 int result; 447 result = get_camera_metadata_entry(m, i, &e1); 448 EXPECT_EQ(OK, result); 449 EXPECT_EQ(i, e1.index); 450 result = get_camera_metadata_entry(m2, i, &e2); 451 EXPECT_EQ(OK, result); 452 EXPECT_EQ(e1.index, e2.index); 453 EXPECT_EQ(e1.tag, e2.tag); 454 EXPECT_EQ(e1.type, e2.type); 455 EXPECT_EQ(e1.count, e2.count); 456 for (unsigned int j=0; 457 j < e1.count * camera_metadata_type_size[e1.type]; 458 j++) { 459 EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]); 460 } 461 } 462 463 free(buf); 464 465 free_camera_metadata(m); 466 } 467 468 TEST(camera_metadata, copy_metadata_nospace) { 469 camera_metadata_t *m = NULL; 470 const size_t entry_capacity = 5; 471 const size_t data_capacity = 50; 472 473 int result; 474 475 m = allocate_camera_metadata(entry_capacity, data_capacity); 476 477 add_test_metadata(m, entry_capacity); 478 479 size_t buf_size = get_camera_metadata_compact_size(m); 480 EXPECT_LT((size_t)0, buf_size); 481 482 buf_size--; 483 484 uint8_t *buf = (uint8_t*)malloc(buf_size); 485 EXPECT_NOT_NULL(buf); 486 487 camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m); 488 EXPECT_NULL(m2); 489 490 free(buf); 491 492 free_camera_metadata(m); 493 } 494 495 TEST(camera_metadata, append_metadata) { 496 camera_metadata_t *m = NULL; 497 const size_t entry_capacity = 5; 498 const size_t data_capacity = 50; 499 500 int result; 501 502 m = allocate_camera_metadata(entry_capacity, data_capacity); 503 504 add_test_metadata(m, entry_capacity); 505 506 camera_metadata_t *m2 = NULL; 507 508 m2 = allocate_camera_metadata(entry_capacity*2, data_capacity*2); 509 EXPECT_NOT_NULL(m2); 510 511 result = append_camera_metadata(m2, m); 512 513 EXPECT_EQ(OK, result); 514 515 EXPECT_EQ(get_camera_metadata_entry_count(m), 516 get_camera_metadata_entry_count(m2)); 517 EXPECT_EQ(get_camera_metadata_data_count(m), 518 get_camera_metadata_data_count(m2)); 519 EXPECT_EQ(entry_capacity*2, get_camera_metadata_entry_capacity(m2)); 520 EXPECT_EQ(data_capacity*2, get_camera_metadata_data_capacity(m2)); 521 522 for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) { 523 camera_metadata_entry e1, e2; 524 int result; 525 result = get_camera_metadata_entry(m, i, &e1); 526 EXPECT_EQ(OK, result); 527 EXPECT_EQ(i, e1.index); 528 result = get_camera_metadata_entry(m2, i, &e2); 529 EXPECT_EQ(OK, result); 530 EXPECT_EQ(e1.index, e2.index); 531 EXPECT_EQ(e1.tag, e2.tag); 532 EXPECT_EQ(e1.type, e2.type); 533 EXPECT_EQ(e1.count, e2.count); 534 for (unsigned int j=0; 535 j < e1.count * camera_metadata_type_size[e1.type]; 536 j++) { 537 EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]); 538 } 539 } 540 541 result = append_camera_metadata(m2, m); 542 543 EXPECT_EQ(OK, result); 544 545 EXPECT_EQ(get_camera_metadata_entry_count(m)*2, 546 get_camera_metadata_entry_count(m2)); 547 EXPECT_EQ(get_camera_metadata_data_count(m)*2, 548 get_camera_metadata_data_count(m2)); 549 EXPECT_EQ(entry_capacity*2, get_camera_metadata_entry_capacity(m2)); 550 EXPECT_EQ(data_capacity*2, get_camera_metadata_data_capacity(m2)); 551 552 for (unsigned int i=0; i < get_camera_metadata_entry_count(m2); i++) { 553 camera_metadata_entry e1, e2; 554 555 int result; 556 result = get_camera_metadata_entry(m, 557 i % entry_capacity, &e1); 558 EXPECT_EQ(OK, result); 559 EXPECT_EQ(i % entry_capacity, e1.index); 560 result = get_camera_metadata_entry(m2, 561 i, &e2); 562 EXPECT_EQ(OK, result); 563 EXPECT_EQ(i, e2.index); 564 EXPECT_EQ(e1.tag, e2.tag); 565 EXPECT_EQ(e1.type, e2.type); 566 EXPECT_EQ(e1.count, e2.count); 567 for (unsigned int j=0; 568 j < e1.count * camera_metadata_type_size[e1.type]; 569 j++) { 570 EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]); 571 } 572 } 573 574 free_camera_metadata(m); 575 free_camera_metadata(m2); 576 } 577 578 TEST(camera_metadata, append_metadata_nospace) { 579 camera_metadata_t *m = NULL; 580 const size_t entry_capacity = 5; 581 const size_t data_capacity = 50; 582 583 int result; 584 585 m = allocate_camera_metadata(entry_capacity, data_capacity); 586 587 add_test_metadata(m, entry_capacity); 588 589 camera_metadata_t *m2 = NULL; 590 591 m2 = allocate_camera_metadata(entry_capacity-1, data_capacity); 592 EXPECT_NOT_NULL(m2); 593 594 result = append_camera_metadata(m2, m); 595 596 EXPECT_EQ(ERROR, result); 597 EXPECT_EQ((size_t)0, get_camera_metadata_entry_count(m2)); 598 EXPECT_EQ((size_t)0, get_camera_metadata_data_count(m2)); 599 600 free_camera_metadata(m); 601 free_camera_metadata(m2); 602 } 603 604 TEST(camera_metadata, append_metadata_onespace) { 605 camera_metadata_t *m = NULL; 606 const size_t entry_capacity = 5; 607 const size_t data_capacity = 50; 608 const size_t entry_capacity2 = entry_capacity * 2 - 2; 609 const size_t data_capacity2 = data_capacity * 2; 610 int result; 611 612 m = allocate_camera_metadata(entry_capacity, data_capacity); 613 614 add_test_metadata(m, entry_capacity); 615 616 camera_metadata_t *m2 = NULL; 617 618 m2 = allocate_camera_metadata(entry_capacity2, data_capacity2); 619 EXPECT_NOT_NULL(m2); 620 621 result = append_camera_metadata(m2, m); 622 623 EXPECT_EQ(OK, result); 624 625 EXPECT_EQ(get_camera_metadata_entry_count(m), 626 get_camera_metadata_entry_count(m2)); 627 EXPECT_EQ(get_camera_metadata_data_count(m), 628 get_camera_metadata_data_count(m2)); 629 EXPECT_EQ(entry_capacity2, get_camera_metadata_entry_capacity(m2)); 630 EXPECT_EQ(data_capacity2, get_camera_metadata_data_capacity(m2)); 631 632 for (unsigned int i=0; i < get_camera_metadata_entry_count(m); i++) { 633 camera_metadata_entry e1, e2; 634 635 int result; 636 result = get_camera_metadata_entry(m, i, &e1); 637 EXPECT_EQ(OK, result); 638 EXPECT_EQ(i, e1.index); 639 result = get_camera_metadata_entry(m2, i, &e2); 640 EXPECT_EQ(OK, result); 641 EXPECT_EQ(e1.index, e2.index); 642 EXPECT_EQ(e1.tag, e2.tag); 643 EXPECT_EQ(e1.type, e2.type); 644 EXPECT_EQ(e1.count, e2.count); 645 for (unsigned int j=0; 646 j < e1.count * camera_metadata_type_size[e1.type]; 647 j++) { 648 EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]); 649 } 650 } 651 652 result = append_camera_metadata(m2, m); 653 654 EXPECT_EQ(ERROR, result); 655 EXPECT_EQ(entry_capacity, get_camera_metadata_entry_count(m2)); 656 EXPECT_EQ(get_camera_metadata_data_count(m), 657 get_camera_metadata_data_count(m2)); 658 EXPECT_EQ(entry_capacity2, get_camera_metadata_entry_capacity(m2)); 659 EXPECT_EQ(data_capacity2, get_camera_metadata_data_capacity(m2)); 660 661 for (unsigned int i=0; i < get_camera_metadata_entry_count(m2); i++) { 662 camera_metadata_entry e1, e2; 663 664 int result; 665 result = get_camera_metadata_entry(m, 666 i % entry_capacity, &e1); 667 EXPECT_EQ(OK, result); 668 EXPECT_EQ(i % entry_capacity, e1.index); 669 result = get_camera_metadata_entry(m2, i, &e2); 670 EXPECT_EQ(OK, result); 671 EXPECT_EQ(i, e2.index); 672 EXPECT_EQ(e1.tag, e2.tag); 673 EXPECT_EQ(e1.type, e2.type); 674 EXPECT_EQ(e1.count, e2.count); 675 for (unsigned int j=0; 676 j < e1.count * camera_metadata_type_size[e1.type]; 677 j++) { 678 EXPECT_EQ(e1.data.u8[j], e2.data.u8[j]); 679 } 680 } 681 682 free_camera_metadata(m); 683 free_camera_metadata(m2); 684 } 685 686 TEST(camera_metadata, vendor_tags) { 687 camera_metadata_t *m = NULL; 688 const size_t entry_capacity = 5; 689 const size_t data_capacity = 50; 690 int result; 691 692 m = allocate_camera_metadata(entry_capacity, data_capacity); 693 694 uint8_t superMode = 5; 695 result = add_camera_metadata_entry(m, 696 FAKEVENDOR_SENSOR_SUPERMODE, 697 &superMode, 1); 698 EXPECT_EQ(ERROR, result); 699 700 result = add_camera_metadata_entry(m, 701 ANDROID_REQUEST_METADATA_MODE, 702 &superMode, 1); 703 EXPECT_EQ(OK, result); 704 705 EXPECT_NULL(get_camera_metadata_section_name(FAKEVENDOR_SENSOR_SUPERMODE)); 706 EXPECT_NULL(get_camera_metadata_tag_name(FAKEVENDOR_SENSOR_SUPERMODE)); 707 EXPECT_EQ(-1, get_camera_metadata_tag_type(FAKEVENDOR_SENSOR_SUPERMODE)); 708 709 set_camera_metadata_vendor_tag_ops(&fakevendor_query_ops); 710 711 result = add_camera_metadata_entry(m, 712 FAKEVENDOR_SENSOR_SUPERMODE, 713 &superMode, 1); 714 EXPECT_EQ(OK, result); 715 716 result = add_camera_metadata_entry(m, 717 ANDROID_REQUEST_METADATA_MODE, 718 &superMode, 1); 719 EXPECT_EQ(OK, result); 720 721 result = add_camera_metadata_entry(m, 722 FAKEVENDOR_SCALER_END, 723 &superMode, 1); 724 EXPECT_EQ(ERROR, result); 725 726 EXPECT_STREQ("com.fakevendor.sensor", 727 get_camera_metadata_section_name(FAKEVENDOR_SENSOR_SUPERMODE)); 728 EXPECT_STREQ("superMode", 729 get_camera_metadata_tag_name(FAKEVENDOR_SENSOR_SUPERMODE)); 730 EXPECT_EQ(TYPE_BYTE, 731 get_camera_metadata_tag_type(FAKEVENDOR_SENSOR_SUPERMODE)); 732 733 EXPECT_STREQ("com.fakevendor.scaler", 734 get_camera_metadata_section_name(FAKEVENDOR_SCALER_END)); 735 EXPECT_NULL(get_camera_metadata_tag_name(FAKEVENDOR_SCALER_END)); 736 EXPECT_EQ(-1, get_camera_metadata_tag_type(FAKEVENDOR_SCALER_END)); 737 738 set_camera_metadata_vendor_tag_ops(NULL); 739 740 result = add_camera_metadata_entry(m, 741 FAKEVENDOR_SENSOR_SUPERMODE, 742 &superMode, 1); 743 EXPECT_EQ(ERROR, result); 744 745 result = add_camera_metadata_entry(m, 746 ANDROID_REQUEST_METADATA_MODE, 747 &superMode, 1); 748 EXPECT_EQ(OK, result); 749 750 EXPECT_NULL(get_camera_metadata_section_name(FAKEVENDOR_SENSOR_SUPERMODE)); 751 EXPECT_NULL(get_camera_metadata_tag_name(FAKEVENDOR_SENSOR_SUPERMODE)); 752 EXPECT_EQ(-1, get_camera_metadata_tag_type(FAKEVENDOR_SENSOR_SUPERMODE)); 753 754 free_camera_metadata(m); 755 } 756 757 TEST(camera_metadata, add_all_tags) { 758 int total_tag_count = 0; 759 for (int i = 0; i < ANDROID_SECTION_COUNT; i++) { 760 total_tag_count += camera_metadata_section_bounds[i][1] - 761 camera_metadata_section_bounds[i][0]; 762 } 763 int entry_data_count = 3; 764 int conservative_data_space = total_tag_count * entry_data_count * 8; 765 uint8_t data[entry_data_count * 8]; 766 int32_t *data_int32 = (int32_t *)data; 767 float *data_float = (float *)data; 768 int64_t *data_int64 = (int64_t *)data; 769 double *data_double = (double *)data; 770 camera_metadata_rational_t *data_rational = 771 (camera_metadata_rational_t *)data; 772 773 camera_metadata_t *m = allocate_camera_metadata(total_tag_count, 774 conservative_data_space); 775 776 ASSERT_NE((void*)NULL, (void*)m); 777 778 int result; 779 780 int counter = 0; 781 for (int i = 0; i < ANDROID_SECTION_COUNT; i++) { 782 for (uint32_t tag = camera_metadata_section_bounds[i][0]; 783 tag < camera_metadata_section_bounds[i][1]; 784 tag++, counter++) { 785 int type = get_camera_metadata_tag_type(tag); 786 ASSERT_NE(-1, type); 787 788 switch (type) { 789 case TYPE_BYTE: 790 data[0] = tag & 0xFF; 791 data[1] = (tag >> 8) & 0xFF; 792 data[2] = (tag >> 16) & 0xFF; 793 break; 794 case TYPE_INT32: 795 data_int32[0] = tag; 796 data_int32[1] = i; 797 data_int32[2] = counter; 798 break; 799 case TYPE_FLOAT: 800 data_float[0] = tag; 801 data_float[1] = i; 802 data_float[2] = counter / (float)total_tag_count; 803 break; 804 case TYPE_INT64: 805 data_int64[0] = (int64_t)tag | ( (int64_t)tag << 32); 806 data_int64[1] = i; 807 data_int64[2] = counter; 808 break; 809 case TYPE_DOUBLE: 810 data_double[0] = tag; 811 data_double[1] = i; 812 data_double[2] = counter / (double)total_tag_count; 813 break; 814 case TYPE_RATIONAL: 815 data_rational[0].numerator = tag; 816 data_rational[0].denominator = 1; 817 data_rational[1].numerator = i; 818 data_rational[1].denominator = 1; 819 data_rational[2].numerator = counter; 820 data_rational[2].denominator = total_tag_count; 821 break; 822 default: 823 FAIL() << "Unknown type field encountered:" << type; 824 break; 825 } 826 result = add_camera_metadata_entry(m, 827 tag, 828 data, 829 entry_data_count); 830 ASSERT_EQ(OK, result); 831 832 } 833 } 834 835 IF_ALOGV() { 836 dump_camera_metadata(m, 0, 2); 837 } 838 839 free_camera_metadata(m); 840 } 841 842 TEST(camera_metadata, sort_metadata) { 843 camera_metadata_t *m = NULL; 844 const size_t entry_capacity = 5; 845 const size_t data_capacity = 100; 846 847 int result; 848 849 m = allocate_camera_metadata(entry_capacity, data_capacity); 850 851 // Add several unique entries in non-sorted order 852 853 float colorTransform[9] = { 854 0.9f, 0.0f, 0.0f, 855 0.2f, 0.5f, 0.0f, 856 0.0f, 0.1f, 0.7f 857 }; 858 result = add_camera_metadata_entry(m, 859 ANDROID_COLOR_TRANSFORM, 860 colorTransform, 9); 861 EXPECT_EQ(OK, result); 862 863 float focus_distance = 0.5f; 864 result = add_camera_metadata_entry(m, 865 ANDROID_LENS_FOCUS_DISTANCE, 866 &focus_distance, 1); 867 EXPECT_EQ(OK, result); 868 869 int64_t exposure_time = 1000000000; 870 result = add_camera_metadata_entry(m, 871 ANDROID_SENSOR_EXPOSURE_TIME, 872 &exposure_time, 1); 873 EXPECT_EQ(OK, result); 874 875 int32_t sensitivity = 800; 876 result = add_camera_metadata_entry(m, 877 ANDROID_SENSOR_SENSITIVITY, 878 &sensitivity, 1); 879 EXPECT_EQ(OK, result); 880 881 // Test unsorted find 882 camera_metadata_entry_t entry; 883 result = find_camera_metadata_entry(m, 884 ANDROID_LENS_FOCUS_DISTANCE, 885 &entry); 886 EXPECT_EQ(OK, result); 887 EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag); 888 EXPECT_EQ((size_t)1, entry.index); 889 EXPECT_EQ(TYPE_FLOAT, entry.type); 890 EXPECT_EQ((size_t)1, entry.count); 891 EXPECT_EQ(focus_distance, *entry.data.f); 892 893 result = find_camera_metadata_entry(m, 894 ANDROID_NOISE_STRENGTH, 895 &entry); 896 EXPECT_EQ(NOT_FOUND, result); 897 EXPECT_EQ((size_t)1, entry.index); 898 EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag); 899 EXPECT_EQ(TYPE_FLOAT, entry.type); 900 EXPECT_EQ((size_t)1, entry.count); 901 EXPECT_EQ(focus_distance, *entry.data.f); 902 903 // Sort 904 IF_ALOGV() { 905 std::cout << "Pre-sorted metadata" << std::endl; 906 dump_camera_metadata(m, 0, 2); 907 } 908 909 result = sort_camera_metadata(m); 910 EXPECT_EQ(OK, result); 911 912 IF_ALOGV() { 913 std::cout << "Sorted metadata" << std::endl; 914 dump_camera_metadata(m, 0, 2); 915 } 916 917 // Test sorted find 918 919 result = find_camera_metadata_entry(m, 920 ANDROID_LENS_FOCUS_DISTANCE, 921 &entry); 922 EXPECT_EQ(OK, result); 923 EXPECT_EQ((size_t)0, entry.index); 924 EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag); 925 EXPECT_EQ(TYPE_FLOAT, entry.type); 926 EXPECT_EQ((size_t)1, (size_t)entry.count); 927 EXPECT_EQ(focus_distance, *entry.data.f); 928 929 result = find_camera_metadata_entry(m, 930 ANDROID_NOISE_STRENGTH, 931 &entry); 932 EXPECT_EQ(NOT_FOUND, result); 933 EXPECT_EQ((size_t)0, entry.index); 934 EXPECT_EQ(ANDROID_LENS_FOCUS_DISTANCE, entry.tag); 935 EXPECT_EQ(TYPE_FLOAT, entry.type); 936 EXPECT_EQ((size_t)1, entry.count); 937 EXPECT_EQ(focus_distance, *entry.data.f); 938 939 940 free_camera_metadata(m); 941 } 942 943 TEST(camera_metadata, delete_metadata) { 944 camera_metadata_t *m = NULL; 945 const size_t entry_capacity = 50; 946 const size_t data_capacity = 450; 947 948 int result; 949 950 m = allocate_camera_metadata(entry_capacity, data_capacity); 951 952 size_t num_entries = 5; 953 size_t data_per_entry = 954 calculate_camera_metadata_entry_data_size(TYPE_INT64, 1); 955 size_t num_data = num_entries * data_per_entry; 956 957 // Delete an entry with data 958 959 add_test_metadata(m, num_entries); 960 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m)); 961 EXPECT_EQ(num_data, get_camera_metadata_data_count(m)); 962 963 result = delete_camera_metadata_entry(m, 1); 964 EXPECT_EQ(OK, result); 965 num_entries--; 966 num_data -= data_per_entry; 967 968 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m)); 969 EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m)); 970 EXPECT_EQ(num_data, get_camera_metadata_data_count(m)); 971 EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m)); 972 973 result = delete_camera_metadata_entry(m, 4); 974 EXPECT_EQ(ERROR, result); 975 976 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m)); 977 EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m)); 978 EXPECT_EQ(num_data, get_camera_metadata_data_count(m)); 979 EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m)); 980 981 for (size_t i = 0; i < num_entries; i++) { 982 camera_metadata_entry e; 983 result = get_camera_metadata_entry(m, i, &e); 984 EXPECT_EQ(OK, result); 985 EXPECT_EQ(i, e.index); 986 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag); 987 EXPECT_EQ(TYPE_INT64, e.type); 988 int64_t exposureTime = i < 1 ? 100 : 200 + 100 * i; 989 EXPECT_EQ(exposureTime, *e.data.i64); 990 } 991 992 // Delete an entry with no data, at end of array 993 994 int32_t frameCount = 12; 995 result = add_camera_metadata_entry(m, 996 ANDROID_REQUEST_FRAME_COUNT, 997 &frameCount, 1); 998 EXPECT_EQ(OK, result); 999 num_entries++; 1000 1001 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m)); 1002 EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m)); 1003 EXPECT_EQ(num_data, get_camera_metadata_data_count(m)); 1004 EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m)); 1005 1006 camera_metadata_entry e; 1007 result = get_camera_metadata_entry(m, 4, &e); 1008 EXPECT_EQ(OK, result); 1009 1010 EXPECT_EQ((size_t)4, e.index); 1011 EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag); 1012 EXPECT_EQ(TYPE_INT32, e.type); 1013 EXPECT_EQ((size_t)1, e.count); 1014 EXPECT_EQ(frameCount, *e.data.i32); 1015 1016 result = delete_camera_metadata_entry(m, 4); 1017 EXPECT_EQ(OK, result); 1018 1019 num_entries--; 1020 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m)); 1021 EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m)); 1022 EXPECT_EQ(num_data, get_camera_metadata_data_count(m)); 1023 EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m)); 1024 1025 result = delete_camera_metadata_entry(m, 4); 1026 EXPECT_EQ(ERROR, result); 1027 1028 result = get_camera_metadata_entry(m, 4, &e); 1029 EXPECT_EQ(ERROR, result); 1030 1031 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m)); 1032 EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m)); 1033 EXPECT_EQ(num_data, get_camera_metadata_data_count(m)); 1034 EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m)); 1035 1036 // Delete with extra data on end of array 1037 result = delete_camera_metadata_entry(m, 3); 1038 EXPECT_EQ(OK, result); 1039 num_entries--; 1040 num_data -= data_per_entry; 1041 1042 for (size_t i = 0; i < num_entries; i++) { 1043 camera_metadata_entry e2; 1044 result = get_camera_metadata_entry(m, i, &e2); 1045 EXPECT_EQ(OK, result); 1046 EXPECT_EQ(i, e2.index); 1047 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag); 1048 EXPECT_EQ(TYPE_INT64, e2.type); 1049 int64_t exposureTime = i < 1 ? 100 : 200 + 100 * i; 1050 EXPECT_EQ(exposureTime, *e2.data.i64); 1051 } 1052 1053 // Delete without extra data in front of array 1054 1055 frameCount = 1001; 1056 result = add_camera_metadata_entry(m, 1057 ANDROID_REQUEST_FRAME_COUNT, 1058 &frameCount, 1); 1059 EXPECT_EQ(OK, result); 1060 num_entries++; 1061 1062 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m)); 1063 EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m)); 1064 EXPECT_EQ(num_data, get_camera_metadata_data_count(m)); 1065 EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m)); 1066 1067 result = sort_camera_metadata(m); 1068 EXPECT_EQ(OK, result); 1069 1070 result = find_camera_metadata_entry(m, 1071 ANDROID_REQUEST_FRAME_COUNT, &e); 1072 EXPECT_EQ(OK, result); 1073 EXPECT_EQ((size_t)0, e.index); 1074 EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag); 1075 EXPECT_EQ(TYPE_INT32, e.type); 1076 EXPECT_EQ((size_t)1, e.count); 1077 EXPECT_EQ(frameCount, *e.data.i32); 1078 1079 result = delete_camera_metadata_entry(m, e.index); 1080 EXPECT_EQ(OK, result); 1081 num_entries--; 1082 1083 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m)); 1084 EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m)); 1085 EXPECT_EQ(num_data, get_camera_metadata_data_count(m)); 1086 EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m)); 1087 1088 for (size_t i = 0; i < num_entries; i++) { 1089 camera_metadata_entry e2; 1090 result = get_camera_metadata_entry(m, i, &e2); 1091 EXPECT_EQ(OK, result); 1092 EXPECT_EQ(i, e2.index); 1093 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag); 1094 EXPECT_EQ(TYPE_INT64, e2.type); 1095 int64_t exposureTime = i < 1 ? 100 : 200 + 100 * i; 1096 EXPECT_EQ(exposureTime, *e2.data.i64); 1097 } 1098 } 1099 1100 TEST(camera_metadata, update_metadata) { 1101 camera_metadata_t *m = NULL; 1102 const size_t entry_capacity = 50; 1103 const size_t data_capacity = 450; 1104 1105 int result; 1106 1107 m = allocate_camera_metadata(entry_capacity, data_capacity); 1108 1109 size_t num_entries = 5; 1110 size_t data_per_entry = 1111 calculate_camera_metadata_entry_data_size(TYPE_INT64, 1); 1112 size_t num_data = num_entries * data_per_entry; 1113 1114 add_test_metadata(m, num_entries); 1115 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m)); 1116 EXPECT_EQ(num_data, get_camera_metadata_data_count(m)); 1117 1118 // Update with same-size data, doesn't fit in entry 1119 1120 int64_t newExposureTime = 1000; 1121 camera_metadata_entry_t e; 1122 result = update_camera_metadata_entry(m, 1123 0, &newExposureTime, 1, &e); 1124 EXPECT_EQ(OK, result); 1125 1126 EXPECT_EQ((size_t)0, e.index); 1127 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag); 1128 EXPECT_EQ(TYPE_INT64, e.type); 1129 EXPECT_EQ((size_t)1, e.count); 1130 EXPECT_EQ(newExposureTime, *e.data.i64); 1131 1132 e.count = 0; 1133 result = get_camera_metadata_entry(m, 1134 0, &e); 1135 1136 EXPECT_EQ((size_t)0, e.index); 1137 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag); 1138 EXPECT_EQ(TYPE_INT64, e.type); 1139 EXPECT_EQ((size_t)1, e.count); 1140 EXPECT_EQ(newExposureTime, *e.data.i64); 1141 1142 for (size_t i = 1; i < num_entries; i++) { 1143 camera_metadata_entry e2; 1144 result = get_camera_metadata_entry(m, i, &e2); 1145 EXPECT_EQ(OK, result); 1146 EXPECT_EQ(i, e2.index); 1147 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag); 1148 EXPECT_EQ(TYPE_INT64, e2.type); 1149 int64_t exposureTime = 100 + 100 * i; 1150 EXPECT_EQ(exposureTime, *e2.data.i64); 1151 } 1152 1153 // Update with larger data 1154 int64_t newExposures[2] = { 5000, 6000 }; 1155 result = update_camera_metadata_entry(m, 1156 0, newExposures, 2, &e); 1157 EXPECT_EQ(OK, result); 1158 num_data += data_per_entry; 1159 1160 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m)); 1161 EXPECT_EQ(num_data, get_camera_metadata_data_count(m)); 1162 1163 EXPECT_EQ((size_t)0, e.index); 1164 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag); 1165 EXPECT_EQ(TYPE_INT64, e.type); 1166 EXPECT_EQ((size_t)2, e.count); 1167 EXPECT_EQ(newExposures[0], e.data.i64[0]); 1168 EXPECT_EQ(newExposures[1], e.data.i64[1]); 1169 1170 e.count = 0; 1171 result = get_camera_metadata_entry(m, 1172 0, &e); 1173 1174 EXPECT_EQ((size_t)0, e.index); 1175 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag); 1176 EXPECT_EQ(TYPE_INT64, e.type); 1177 EXPECT_EQ((size_t)2, e.count); 1178 EXPECT_EQ(newExposures[0], e.data.i64[0]); 1179 EXPECT_EQ(newExposures[1], e.data.i64[1]); 1180 1181 for (size_t i = 1; i < num_entries; i++) { 1182 camera_metadata_entry e2; 1183 result = get_camera_metadata_entry(m, i, &e2); 1184 EXPECT_EQ(OK, result); 1185 EXPECT_EQ(i, e2.index); 1186 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag); 1187 EXPECT_EQ(TYPE_INT64, e2.type); 1188 int64_t exposureTime = 100 + 100 * i; 1189 EXPECT_EQ(exposureTime, *e2.data.i64); 1190 } 1191 1192 // Update with smaller data 1193 newExposureTime = 100; 1194 result = update_camera_metadata_entry(m, 1195 0, &newExposureTime, 1, &e); 1196 EXPECT_EQ(OK, result); 1197 1198 num_data -= data_per_entry; 1199 1200 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m)); 1201 EXPECT_EQ(num_data, get_camera_metadata_data_count(m)); 1202 1203 EXPECT_EQ((size_t)0, e.index); 1204 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag); 1205 EXPECT_EQ(TYPE_INT64, e.type); 1206 EXPECT_EQ((size_t)1, e.count); 1207 EXPECT_EQ(newExposureTime, *e.data.i64); 1208 1209 e.count = 0; 1210 result = get_camera_metadata_entry(m, 1211 0, &e); 1212 1213 EXPECT_EQ((size_t)0, e.index); 1214 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag); 1215 EXPECT_EQ(TYPE_INT64, e.type); 1216 EXPECT_EQ((size_t)1, e.count); 1217 EXPECT_EQ(newExposureTime, *e.data.i64); 1218 1219 for (size_t i = 1; i < num_entries; i++) { 1220 camera_metadata_entry e2; 1221 result = get_camera_metadata_entry(m, i, &e2); 1222 EXPECT_EQ(OK, result); 1223 EXPECT_EQ(i, e2.index); 1224 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag); 1225 EXPECT_EQ(TYPE_INT64, e2.type); 1226 int64_t exposureTime = 100 + 100 * i; 1227 EXPECT_EQ(exposureTime, *e2.data.i64); 1228 } 1229 1230 // Update with size fitting in entry 1231 1232 int32_t frameCount = 1001; 1233 result = add_camera_metadata_entry(m, 1234 ANDROID_REQUEST_FRAME_COUNT, 1235 &frameCount, 1); 1236 EXPECT_EQ(OK, result); 1237 num_entries++; 1238 1239 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m)); 1240 EXPECT_EQ(entry_capacity, get_camera_metadata_entry_capacity(m)); 1241 EXPECT_EQ(num_data, get_camera_metadata_data_count(m)); 1242 EXPECT_EQ(data_capacity, get_camera_metadata_data_capacity(m)); 1243 1244 result = sort_camera_metadata(m); 1245 EXPECT_EQ(OK, result); 1246 1247 result = find_camera_metadata_entry(m, 1248 ANDROID_REQUEST_FRAME_COUNT, &e); 1249 EXPECT_EQ(OK, result); 1250 EXPECT_EQ((size_t)0, e.index); 1251 EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag); 1252 EXPECT_EQ(TYPE_INT32, e.type); 1253 EXPECT_EQ((size_t)1, e.count); 1254 EXPECT_EQ(frameCount, *e.data.i32); 1255 1256 int32_t newFrameCount = 0x12349876; 1257 result = update_camera_metadata_entry(m, 1258 0, &newFrameCount, 1, &e); 1259 1260 EXPECT_EQ(OK, result); 1261 EXPECT_EQ((size_t)0, e.index); 1262 EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag); 1263 EXPECT_EQ(TYPE_INT32, e.type); 1264 EXPECT_EQ((size_t)1, e.count); 1265 EXPECT_EQ(newFrameCount, *e.data.i32); 1266 1267 result = find_camera_metadata_entry(m, 1268 ANDROID_REQUEST_FRAME_COUNT, &e); 1269 1270 EXPECT_EQ(OK, result); 1271 EXPECT_EQ((size_t)0, e.index); 1272 EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag); 1273 EXPECT_EQ(TYPE_INT32, e.type); 1274 EXPECT_EQ((size_t)1, e.count); 1275 EXPECT_EQ(newFrameCount, *e.data.i32); 1276 1277 for (size_t i = 1; i < num_entries; i++) { 1278 camera_metadata_entry e2; 1279 result = get_camera_metadata_entry(m, i, &e2); 1280 EXPECT_EQ(OK, result); 1281 EXPECT_EQ(i, e2.index); 1282 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag); 1283 EXPECT_EQ(TYPE_INT64, e2.type); 1284 int64_t exposureTime = 100 * i; 1285 EXPECT_EQ(exposureTime, *e2.data.i64); 1286 } 1287 1288 // Update to bigger than entry 1289 1290 int32_t newFrameCounts[4] = { 0x0, 0x1, 0x10, 0x100 }; 1291 1292 result = update_camera_metadata_entry(m, 1293 0, &newFrameCounts, 4, &e); 1294 1295 EXPECT_EQ(OK, result); 1296 1297 num_data += calculate_camera_metadata_entry_data_size(TYPE_INT32, 1298 4); 1299 1300 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m)); 1301 EXPECT_EQ(num_data, get_camera_metadata_data_count(m)); 1302 1303 EXPECT_EQ((size_t)0, e.index); 1304 EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag); 1305 EXPECT_EQ(TYPE_INT32, e.type); 1306 EXPECT_EQ((size_t)4, e.count); 1307 EXPECT_EQ(newFrameCounts[0], e.data.i32[0]); 1308 EXPECT_EQ(newFrameCounts[1], e.data.i32[1]); 1309 EXPECT_EQ(newFrameCounts[2], e.data.i32[2]); 1310 EXPECT_EQ(newFrameCounts[3], e.data.i32[3]); 1311 1312 e.count = 0; 1313 1314 result = find_camera_metadata_entry(m, 1315 ANDROID_REQUEST_FRAME_COUNT, &e); 1316 1317 EXPECT_EQ(OK, result); 1318 EXPECT_EQ((size_t)0, e.index); 1319 EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag); 1320 EXPECT_EQ(TYPE_INT32, e.type); 1321 EXPECT_EQ((size_t)4, e.count); 1322 EXPECT_EQ(newFrameCounts[0], e.data.i32[0]); 1323 EXPECT_EQ(newFrameCounts[1], e.data.i32[1]); 1324 EXPECT_EQ(newFrameCounts[2], e.data.i32[2]); 1325 EXPECT_EQ(newFrameCounts[3], e.data.i32[3]); 1326 1327 for (size_t i = 1; i < num_entries; i++) { 1328 camera_metadata_entry e2; 1329 result = get_camera_metadata_entry(m, i, &e2); 1330 EXPECT_EQ(OK, result); 1331 EXPECT_EQ(i, e2.index); 1332 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag); 1333 EXPECT_EQ(TYPE_INT64, e2.type); 1334 int64_t exposureTime = 100 * i; 1335 EXPECT_EQ(exposureTime, *e2.data.i64); 1336 } 1337 1338 // Update to smaller than entry 1339 result = update_camera_metadata_entry(m, 1340 0, &newFrameCount, 1, &e); 1341 1342 EXPECT_EQ(OK, result); 1343 1344 num_data -= camera_metadata_type_size[TYPE_INT32] * 4; 1345 1346 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m)); 1347 EXPECT_EQ(num_data, get_camera_metadata_data_count(m)); 1348 1349 EXPECT_EQ((size_t)0, e.index); 1350 EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag); 1351 EXPECT_EQ(TYPE_INT32, e.type); 1352 EXPECT_EQ((size_t)1, e.count); 1353 EXPECT_EQ(newFrameCount, *e.data.i32); 1354 1355 result = find_camera_metadata_entry(m, 1356 ANDROID_REQUEST_FRAME_COUNT, &e); 1357 1358 EXPECT_EQ(OK, result); 1359 EXPECT_EQ((size_t)0, e.index); 1360 EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag); 1361 EXPECT_EQ(TYPE_INT32, e.type); 1362 EXPECT_EQ((size_t)1, e.count); 1363 EXPECT_EQ(newFrameCount, *e.data.i32); 1364 1365 for (size_t i = 1; i < num_entries; i++) { 1366 camera_metadata_entry_t e2; 1367 result = get_camera_metadata_entry(m, i, &e2); 1368 EXPECT_EQ(OK, result); 1369 EXPECT_EQ(i, e2.index); 1370 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag); 1371 EXPECT_EQ(TYPE_INT64, e2.type); 1372 int64_t exposureTime = 100 * i; 1373 EXPECT_EQ(exposureTime, *e2.data.i64); 1374 } 1375 1376 // Setup new buffer with no spare data space 1377 1378 result = update_camera_metadata_entry(m, 1379 1, newExposures, 2, &e); 1380 EXPECT_EQ(OK, result); 1381 1382 num_data += data_per_entry; 1383 1384 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m)); 1385 EXPECT_EQ(num_data, get_camera_metadata_data_count(m)); 1386 1387 EXPECT_EQ((size_t)1, e.index); 1388 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag); 1389 EXPECT_EQ(TYPE_INT64, e.type); 1390 EXPECT_EQ((size_t)2, e.count); 1391 EXPECT_EQ(newExposures[0], e.data.i64[0]); 1392 EXPECT_EQ(newExposures[1], e.data.i64[1]); 1393 1394 camera_metadata_t *m2; 1395 m2 = allocate_camera_metadata(get_camera_metadata_entry_count(m), 1396 get_camera_metadata_data_count(m)); 1397 EXPECT_NOT_NULL(m2); 1398 1399 result = append_camera_metadata(m2, m); 1400 EXPECT_EQ(OK, result); 1401 1402 result = find_camera_metadata_entry(m2, 1403 ANDROID_REQUEST_FRAME_COUNT, &e); 1404 1405 EXPECT_EQ(OK, result); 1406 EXPECT_EQ((size_t)0, e.index); 1407 EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag); 1408 EXPECT_EQ(TYPE_INT32, e.type); 1409 EXPECT_EQ((size_t)1, e.count); 1410 EXPECT_EQ(newFrameCount, *e.data.i32); 1411 1412 // Update when there's no more room 1413 1414 result = update_camera_metadata_entry(m2, 1415 0, &newFrameCounts, 4, &e); 1416 EXPECT_EQ(ERROR, result); 1417 1418 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2)); 1419 EXPECT_EQ(num_data, get_camera_metadata_data_count(m2)); 1420 1421 EXPECT_EQ((size_t)0, e.index); 1422 EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag); 1423 EXPECT_EQ(TYPE_INT32, e.type); 1424 EXPECT_EQ((size_t)1, e.count); 1425 EXPECT_EQ(newFrameCount, *e.data.i32); 1426 1427 // Update when there's no data room, but change fits into entry 1428 1429 newFrameCount = 5; 1430 result = update_camera_metadata_entry(m2, 1431 0, &newFrameCount, 1, &e); 1432 EXPECT_EQ(OK, result); 1433 1434 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2)); 1435 EXPECT_EQ(num_data, get_camera_metadata_data_count(m2)); 1436 1437 EXPECT_EQ((size_t)0, e.index); 1438 EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag); 1439 EXPECT_EQ(TYPE_INT32, e.type); 1440 EXPECT_EQ((size_t)1, e.count); 1441 EXPECT_EQ(newFrameCount, *e.data.i32); 1442 1443 result = find_camera_metadata_entry(m2, 1444 ANDROID_REQUEST_FRAME_COUNT, &e); 1445 1446 EXPECT_EQ(OK, result); 1447 EXPECT_EQ((size_t)0, e.index); 1448 EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag); 1449 EXPECT_EQ(TYPE_INT32, e.type); 1450 EXPECT_EQ((size_t)1, e.count); 1451 EXPECT_EQ(newFrameCount, *e.data.i32); 1452 1453 result = get_camera_metadata_entry(m2, 1, &e); 1454 EXPECT_EQ((size_t)1, e.index); 1455 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag); 1456 EXPECT_EQ(TYPE_INT64, e.type); 1457 EXPECT_EQ((size_t)2, e.count); 1458 EXPECT_EQ(newExposures[0], e.data.i64[0]); 1459 EXPECT_EQ(newExposures[1], e.data.i64[1]); 1460 1461 for (size_t i = 2; i < num_entries; i++) { 1462 camera_metadata_entry_t e2; 1463 result = get_camera_metadata_entry(m2, i, &e2); 1464 EXPECT_EQ(OK, result); 1465 EXPECT_EQ(i, e2.index); 1466 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag); 1467 EXPECT_EQ(TYPE_INT64, e2.type); 1468 int64_t exposureTime = 100 * i; 1469 EXPECT_EQ(exposureTime, *e2.data.i64); 1470 } 1471 1472 // Update when there's no data room, but data size doesn't change 1473 1474 newExposures[0] = 1000; 1475 1476 result = update_camera_metadata_entry(m2, 1477 1, newExposures, 2, &e); 1478 EXPECT_EQ(OK, result); 1479 1480 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2)); 1481 EXPECT_EQ(num_data, get_camera_metadata_data_count(m2)); 1482 1483 EXPECT_EQ((size_t)1, e.index); 1484 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag); 1485 EXPECT_EQ(TYPE_INT64, e.type); 1486 EXPECT_EQ((size_t)2, e.count); 1487 EXPECT_EQ(newExposures[0], e.data.i64[0]); 1488 EXPECT_EQ(newExposures[1], e.data.i64[1]); 1489 1490 result = find_camera_metadata_entry(m2, 1491 ANDROID_REQUEST_FRAME_COUNT, &e); 1492 1493 EXPECT_EQ(OK, result); 1494 EXPECT_EQ((size_t)0, e.index); 1495 EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag); 1496 EXPECT_EQ(TYPE_INT32, e.type); 1497 EXPECT_EQ((size_t)1, e.count); 1498 EXPECT_EQ(newFrameCount, *e.data.i32); 1499 1500 for (size_t i = 2; i < num_entries; i++) { 1501 camera_metadata_entry_t e2; 1502 result = get_camera_metadata_entry(m2, i, &e2); 1503 EXPECT_EQ(OK, result); 1504 EXPECT_EQ(i, e2.index); 1505 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag); 1506 EXPECT_EQ(TYPE_INT64, e2.type); 1507 int64_t exposureTime = 100 * i; 1508 EXPECT_EQ(exposureTime, *e2.data.i64); 1509 } 1510 1511 // Update when there's no data room, but data size shrinks 1512 1513 result = update_camera_metadata_entry(m2, 1514 1, &newExposureTime, 1, &e); 1515 EXPECT_EQ(OK, result); 1516 1517 num_data -= calculate_camera_metadata_entry_data_size(TYPE_INT64, 2); 1518 num_data += calculate_camera_metadata_entry_data_size(TYPE_INT64, 1); 1519 1520 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m2)); 1521 EXPECT_EQ(num_data, get_camera_metadata_data_count(m2)); 1522 1523 EXPECT_EQ((size_t)1, e.index); 1524 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e.tag); 1525 EXPECT_EQ(TYPE_INT64, e.type); 1526 EXPECT_EQ((size_t)1, e.count); 1527 EXPECT_EQ(newExposureTime, e.data.i64[0]); 1528 1529 result = find_camera_metadata_entry(m2, 1530 ANDROID_REQUEST_FRAME_COUNT, &e); 1531 1532 EXPECT_EQ(OK, result); 1533 EXPECT_EQ((size_t)0, e.index); 1534 EXPECT_EQ(ANDROID_REQUEST_FRAME_COUNT, e.tag); 1535 EXPECT_EQ(TYPE_INT32, e.type); 1536 EXPECT_EQ((size_t)1, e.count); 1537 EXPECT_EQ(newFrameCount, *e.data.i32); 1538 1539 for (size_t i = 2; i < num_entries; i++) { 1540 camera_metadata_entry_t e2; 1541 result = get_camera_metadata_entry(m2, i, &e2); 1542 EXPECT_EQ(OK, result); 1543 EXPECT_EQ(i, e2.index); 1544 EXPECT_EQ(ANDROID_SENSOR_EXPOSURE_TIME, e2.tag); 1545 EXPECT_EQ(TYPE_INT64, e2.type); 1546 int64_t exposureTime = 100 * i; 1547 EXPECT_EQ(exposureTime, *e2.data.i64); 1548 } 1549 1550 } 1551 1552 TEST(camera_metadata, user_pointer) { 1553 camera_metadata_t *m = NULL; 1554 const size_t entry_capacity = 50; 1555 const size_t data_capacity = 450; 1556 1557 int result; 1558 1559 m = allocate_camera_metadata(entry_capacity, data_capacity); 1560 1561 size_t num_entries = 5; 1562 size_t data_per_entry = 1563 calculate_camera_metadata_entry_data_size(TYPE_INT64, 1); 1564 size_t num_data = num_entries * data_per_entry; 1565 1566 add_test_metadata(m, num_entries); 1567 EXPECT_EQ(num_entries, get_camera_metadata_entry_count(m)); 1568 EXPECT_EQ(num_data, get_camera_metadata_data_count(m)); 1569 1570 void* ptr; 1571 result = get_camera_metadata_user_pointer(m, &ptr); 1572 EXPECT_EQ(OK, result); 1573 EXPECT_NULL(ptr); 1574 1575 int testValue = 10; 1576 result = set_camera_metadata_user_pointer(m, &testValue); 1577 EXPECT_EQ(OK, result); 1578 1579 result = get_camera_metadata_user_pointer(m, &ptr); 1580 EXPECT_EQ(OK, result); 1581 EXPECT_EQ(&testValue, (int*)ptr); 1582 EXPECT_EQ(testValue, *(int*)ptr); 1583 1584 size_t buf_size = get_camera_metadata_compact_size(m); 1585 EXPECT_LT((size_t)0, buf_size); 1586 1587 uint8_t *buf = (uint8_t*)malloc(buf_size); 1588 EXPECT_NOT_NULL(buf); 1589 1590 camera_metadata_t *m2 = copy_camera_metadata(buf, buf_size, m); 1591 EXPECT_NOT_NULL(m2); 1592 1593 result = get_camera_metadata_user_pointer(m2, &ptr); 1594 EXPECT_NULL(ptr); 1595 1596 free(buf); 1597 free_camera_metadata(m); 1598 } 1599