1 /* 2 * Copyright (C) Texas Instruments - http://www.ti.com/ 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 /** 18 * @file OMXCap.cpp 19 * 20 * This file implements the OMX Capabilities feature. 21 * 22 */ 23 24 #include "CameraHal.h" 25 #include "OMXCameraAdapter.h" 26 #include "ErrorUtils.h" 27 #include "TICameraParameters.h" 28 29 namespace android { 30 31 #undef LOG_TAG 32 33 // Maintain a separate tag for OMXCameraAdapter logs to isolate issues OMX specific 34 #define LOG_TAG "CameraHAL" 35 36 /************************************ 37 * global constants and variables 38 *************************************/ 39 40 #define ARRAY_SIZE(array) (sizeof((array)) / sizeof((array)[0])) 41 #define FPS_MIN 5 42 #define FPS_STEP 5 43 #define FPS_RANGE_STEP 5 44 45 static const char PARAM_SEP[] = ","; 46 static const int PARAM_SEP_CHAR = ','; 47 static const uint32_t VFR_OFFSET = 8; 48 static const char VFR_BACKET_START[] = "("; 49 static const char VFR_BRACKET_END[] = ")"; 50 static const char FRAMERATE_COUNT = 10; 51 52 /**** look up tables to translate OMX Caps to Parameter ****/ 53 54 const CapResolution OMXCameraAdapter::mImageCapRes [] = { 55 { 4032, 3024, "4032x3024" }, 56 { 4000, 3000, "4000x3000" }, 57 { 3648, 2736, "3648x2736" }, 58 { 3264, 2448, "3264x2448" }, 59 { 2592, 1944, "2592x1944" }, 60 { 2048, 1536, "2048x1536" }, 61 { 1600, 1200, "1600x1200" }, 62 { 1280, 1024, "1280x1024" }, 63 { 1152, 864, "1152x864" }, 64 { 1280, 960, "1280x960" }, 65 { 640, 480, "640x480" }, 66 { 320, 240, "320x240" }, 67 }; 68 69 const CapResolution OMXCameraAdapter::mPreviewRes [] = { 70 { 1920, 1080, "1920x1080" }, 71 { 1280, 720, "1280x720" }, 72 { 960, 720, "960x720" }, 73 { 800, 480, "800x480" }, 74 { 720, 576, "720x576" }, 75 { 720, 480, "720x480" }, 76 { 768, 576, "768x576" }, 77 { 640, 480, "640x480" }, 78 { 320, 240, "320x240" }, 79 { 352, 288, "352x288" }, 80 { 240, 160, "240x160" }, 81 { 176, 144, "176x144" }, 82 { 128, 96, "128x96" }, 83 }; 84 85 const CapResolution OMXCameraAdapter::mThumbRes [] = { 86 { 640, 480, "640x480" }, 87 { 160, 120, "160x120" }, 88 { 200, 120, "200x120" }, 89 { 320, 240, "320x240" }, 90 { 512, 384, "512x384" }, 91 { 352, 144, "352x144" }, 92 { 176, 144, "176x144" }, 93 { 96, 96, "96x96" }, 94 }; 95 96 const CapPixelformat OMXCameraAdapter::mPixelformats [] = { 97 { OMX_COLOR_FormatCbYCrY, CameraParameters::PIXEL_FORMAT_YUV422I }, 98 { OMX_COLOR_FormatYUV420SemiPlanar, CameraParameters::PIXEL_FORMAT_YUV420SP }, 99 { OMX_COLOR_Format16bitRGB565, CameraParameters::PIXEL_FORMAT_RGB565 }, 100 { OMX_COLOR_FormatRawBayer10bit, TICameraParameters::PIXEL_FORMAT_RAW }, 101 { OMX_COLOR_FormatYUV420SemiPlanar, CameraParameters::PIXEL_FORMAT_YUV420P }, 102 }; 103 104 const CapFramerate OMXCameraAdapter::mFramerates [] = { 105 { 30, "30" }, 106 { 15, "15" }, 107 }; 108 109 const CapZoom OMXCameraAdapter::mZoomStages [] = { 110 { 65536, "100" }, 111 { 68157, "104" }, 112 { 70124, "107" }, 113 { 72745, "111" }, 114 { 75366, "115" }, 115 { 77988, "119" }, 116 { 80609, "123" }, 117 { 83231, "127" }, 118 { 86508, "132" }, 119 { 89784, "137" }, 120 { 92406, "141" }, 121 { 95683, "146" }, 122 { 99615, "152" }, 123 { 102892, "157" }, 124 { 106168, "162" }, 125 { 110100, "168" }, 126 { 114033, "174" }, 127 { 117965, "180" }, 128 { 122552, "187" }, 129 { 126484, "193" }, 130 { 131072, "200" }, 131 { 135660, "207" }, 132 { 140247, "214" }, 133 { 145490, "222" }, 134 { 150733, "230" }, 135 { 155976, "238" }, 136 { 161219, "246" }, 137 { 167117, "255" }, 138 { 173015, "264" }, 139 { 178913, "273" }, 140 { 185467, "283" }, 141 { 192020, "293" }, 142 { 198574, "303" }, 143 { 205783, "314" }, 144 { 212992, "325" }, 145 { 220201, "336" }, 146 { 228065, "348" }, 147 { 236585, "361" }, 148 { 244449, "373" }, 149 { 252969, "386" }, 150 { 262144, "400" }, 151 { 271319, "414" }, 152 { 281149, "429" }, 153 { 290980, "444" }, 154 { 300810, "459" }, 155 { 311951, "476" }, 156 { 322437, "492" }, 157 { 334234, "510" }, 158 { 346030, "528" }, 159 { 357827, "546" }, 160 { 370934, "566" }, 161 { 384041, "586" }, 162 { 397148, "606" }, 163 { 411566, "628" }, 164 { 425984, "650" }, 165 { 441057, "673" }, 166 { 456131, "696" }, 167 { 472515, "721" }, 168 { 488899, "746" }, 169 { 506593, "773" }, 170 { 524288, "800" }, 171 }; 172 173 const CapISO OMXCameraAdapter::mISOStages [] = { 174 { 0, "auto" }, 175 { 100, "100" }, 176 { 200, "200"}, 177 { 400, "400" }, 178 { 800, "800" }, 179 { 1000, "1000" }, 180 { 1200, "1200" }, 181 { 1600, "1600" }, 182 }; 183 184 // mapped values have to match with new_sensor_MSP.h 185 const CapU32 OMXCameraAdapter::mSensorNames [] = { 186 { 300, "IMX060" }, 187 { 301, "OV5650" }, 188 { 305, "S5K4E1GA"}, 189 { 306, "S5K6A1GX03" } 190 // TODO(XXX): need to account for S3D camera later 191 }; 192 193 // values for supported variable framerates sorted in ascending order 194 // CapU32Pair = (max fps, min fps, string representation) 195 const CapU32Pair OMXCameraAdapter::mVarFramerates [] = { 196 { 15, 15, "(15000,15000)"}, 197 { 30, 15, "(15000,30000)" }, 198 { 30, 24, "(24000,30000)" }, 199 // TODO(XXX): Removing 30,30 range to limit 1080p at 24fps. Will put back soon. 200 #if 0 201 { 30, 30, "(30000,30000)" }, 202 #endif 203 }; 204 /************************************ 205 * static helper functions 206 *************************************/ 207 208 // utility function to remove last seperator 209 void remove_last_sep(char* buffer) { 210 char* last_sep = NULL; 211 last_sep = strrchr(buffer, PARAM_SEP_CHAR); 212 if (last_sep != NULL) { 213 last_sep[0] = '\0'; 214 } 215 } 216 217 218 /***************************************** 219 * internal static function declarations 220 *****************************************/ 221 222 /**** Utility functions to help translate OMX Caps to Parameter ****/ 223 224 status_t OMXCameraAdapter::encodePixelformatCap(OMX_COLOR_FORMATTYPE format, 225 const CapPixelformat *cap, 226 size_t capCount, 227 char * buffer, 228 size_t bufferSize) { 229 status_t ret = NO_ERROR; 230 231 LOG_FUNCTION_NAME; 232 233 if ( ( NULL == buffer ) || ( NULL == cap ) ) { 234 CAMHAL_LOGEA("Invalid input arguments"); 235 return -EINVAL; 236 } 237 238 for ( unsigned int i = 0; i < capCount; i++ ) { 239 if ( format == cap[i].pixelformat ) { 240 strncat(buffer, cap[i].param, bufferSize - 1); 241 strncat(buffer, PARAM_SEP, bufferSize - 1); 242 } 243 } 244 245 LOG_FUNCTION_NAME_EXIT; 246 247 return ret; 248 } 249 250 status_t OMXCameraAdapter::encodeFramerateCap(OMX_U32 framerateMax, 251 OMX_U32 framerateMin, 252 const CapFramerate *cap, 253 size_t capCount, 254 char * buffer, 255 size_t bufferSize) { 256 status_t ret = NO_ERROR; 257 bool minInserted = false; 258 bool maxInserted = false; 259 char tmpBuffer[FRAMERATE_COUNT]; 260 261 LOG_FUNCTION_NAME; 262 263 if ( ( NULL == buffer ) || ( NULL == cap ) ) { 264 CAMHAL_LOGEA("Invalid input arguments"); 265 return -EINVAL; 266 } 267 268 for ( unsigned int i = 0; i < capCount; i++ ) { 269 if ( (framerateMax >= cap[i].num) && (framerateMin <= cap[i].num) ) { 270 strncat(buffer, cap[i].param, bufferSize - 1); 271 strncat(buffer, PARAM_SEP, bufferSize - 1); 272 273 if ( cap[i].num == framerateMin ) { 274 minInserted = true; 275 } 276 } 277 if ( cap[i].num == framerateMax ) { 278 maxInserted = true; 279 } 280 } 281 282 if ( !maxInserted ) { 283 memset(tmpBuffer, 0, FRAMERATE_COUNT); 284 snprintf(tmpBuffer, FRAMERATE_COUNT - 1, "%u,", ( unsigned int ) framerateMax); 285 strncat(buffer, tmpBuffer, bufferSize - 1); 286 strncat(buffer, PARAM_SEP, bufferSize - 1); 287 } 288 289 if ( !minInserted ) { 290 memset(tmpBuffer, 0, FRAMERATE_COUNT); 291 snprintf(tmpBuffer, FRAMERATE_COUNT - 1, "%u,", ( unsigned int ) framerateMin); 292 strncat(buffer, tmpBuffer, bufferSize - 1); 293 strncat(buffer, PARAM_SEP, bufferSize - 1); 294 } 295 296 remove_last_sep(buffer); 297 298 LOG_FUNCTION_NAME_EXIT; 299 300 return ret; 301 } 302 303 status_t OMXCameraAdapter::encodeVFramerateCap(OMX_TI_CAPTYPE &caps, 304 const CapU32Pair *cap, 305 size_t capCount, 306 char *buffer, 307 char *defaultRange, 308 size_t bufferSize) { 309 status_t ret = NO_ERROR; 310 uint32_t minVFR, maxVFR; 311 int default_index = -1; 312 313 LOG_FUNCTION_NAME; 314 315 if ( (NULL == buffer) || (NULL == cap) ) { 316 CAMHAL_LOGEA("Invalid input arguments"); 317 return -EINVAL; 318 } 319 320 if(caps.ulPrvVarFPSModesCount < 1) { 321 return NO_ERROR; 322 } 323 324 // Assumption: last range in tPrvVarFPSModes will be for S30FPSHD mode 325 minVFR = caps.tPrvVarFPSModes[caps.ulPrvVarFPSModesCount-1].nVarFPSMin >> VFR_OFFSET; 326 maxVFR = caps.tPrvVarFPSModes[caps.ulPrvVarFPSModesCount-1].nVarFPSMax >> VFR_OFFSET; 327 328 if (minVFR < FPS_MIN) { 329 minVFR = FPS_MIN; 330 } 331 332 for (unsigned int i = 0; i < capCount; i++) { 333 // add cap[i] if it is in range and maxVFR != minVFR 334 if ((maxVFR >= cap[i].num1) && (minVFR <= cap[i].num2)) { 335 if (buffer[0] != '\0') { 336 strncat(buffer, PARAM_SEP, bufferSize - 1); 337 } 338 strncat(buffer, cap[i].param, bufferSize - 1); 339 340 // choose the max variable framerate as default 341 if (cap[i].num1 != cap[i].num2) { 342 default_index = i; 343 } 344 } 345 } 346 347 // if we haven't found any caps in the list to populate 348 // just use the min and max 349 if (buffer[0] == '\0') { 350 snprintf(buffer, bufferSize - 1, 351 "(%u,%u)", 352 minVFR * CameraHal::VFR_SCALE, 353 maxVFR * CameraHal::VFR_SCALE); 354 } 355 356 if (default_index != -1) { 357 snprintf(defaultRange, (MAX_PROP_VALUE_LENGTH - 1), "%lu,%lu", 358 cap[default_index].num2 * CameraHal::VFR_SCALE, 359 cap[default_index].num1 * CameraHal::VFR_SCALE); 360 } else { 361 snprintf(defaultRange, (MAX_PROP_VALUE_LENGTH - 1), "%u,%u", 362 minVFR * CameraHal::VFR_SCALE, maxVFR * CameraHal::VFR_SCALE); 363 } 364 365 LOG_FUNCTION_NAME_EXIT; 366 367 return ret; 368 } 369 370 size_t OMXCameraAdapter::encodeZoomCap(OMX_S32 maxZoom, 371 const CapZoom *cap, 372 size_t capCount, 373 char * buffer, 374 size_t bufferSize) { 375 status_t res = NO_ERROR; 376 size_t ret = 0; 377 378 LOG_FUNCTION_NAME; 379 380 if ( (NULL == buffer) || (NULL == cap) ) { 381 CAMHAL_LOGEA("Invalid input arguments"); 382 return -EINVAL; 383 } 384 385 386 for ( unsigned int i = 0; i < capCount; i++ ) { 387 if ( cap[i].num <= maxZoom ) { 388 strncat(buffer, cap[i].param, bufferSize - 1); 389 strncat(buffer, PARAM_SEP, bufferSize - 1); 390 ret++; 391 } 392 } 393 remove_last_sep(buffer); 394 395 LOG_FUNCTION_NAME_EXIT; 396 397 return ret; 398 } 399 400 status_t OMXCameraAdapter::encodeISOCap(OMX_U32 maxISO, 401 const CapISO *cap, 402 size_t capCount, 403 char * buffer, 404 size_t bufferSize) { 405 status_t ret = NO_ERROR; 406 407 LOG_FUNCTION_NAME; 408 409 if ( (NULL == buffer) || (NULL == cap) ) { 410 CAMHAL_LOGEA("Invalid input arguments"); 411 return -EINVAL; 412 } 413 414 for ( unsigned int i = 0; i < capCount; i++ ) { 415 if ( cap[i].num <= maxISO) { 416 strncat(buffer, cap[i].param, bufferSize - 1); 417 strncat(buffer, PARAM_SEP, bufferSize - 1); 418 } 419 } 420 remove_last_sep(buffer); 421 422 LOG_FUNCTION_NAME_EXIT; 423 424 return ret; 425 } 426 427 status_t OMXCameraAdapter::encodeSizeCap(OMX_TI_CAPRESTYPE &res, 428 const CapResolution *cap, 429 size_t capCount, 430 char * buffer, 431 size_t bufferSize) { 432 status_t ret = NO_ERROR; 433 434 LOG_FUNCTION_NAME; 435 436 if ( (NULL == buffer) || (NULL == cap) ) { 437 CAMHAL_LOGEA("Invalid input arguments"); 438 return -EINVAL; 439 } 440 441 for ( unsigned int i = 0 ; i < capCount ; i++ ) { 442 if ( (cap[i].width <= res.nWidthMax) && 443 (cap[i].height <= res.nHeightMax) && 444 (cap[i].width >= res.nWidthMin) && 445 (cap[i].height >= res.nHeightMin) ) { 446 strncat(buffer, cap[i].param, bufferSize -1); 447 strncat(buffer, PARAM_SEP, bufferSize - 1); 448 } 449 } 450 451 LOG_FUNCTION_NAME_EXIT; 452 453 return ret; 454 } 455 456 status_t OMXCameraAdapter::insertImageSizes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 457 status_t ret = NO_ERROR; 458 char supported[MAX_PROP_VALUE_LENGTH]; 459 460 LOG_FUNCTION_NAME; 461 462 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 463 464 ret = encodeSizeCap(caps.tImageResRange, 465 mImageCapRes, 466 ARRAY_SIZE(mImageCapRes), 467 supported, 468 MAX_PROP_VALUE_LENGTH); 469 470 if ( NO_ERROR != ret ) { 471 CAMHAL_LOGEB("Error inserting supported picture sizes 0x%x", ret); 472 } else { 473 remove_last_sep(supported); 474 params->set(CameraProperties::SUPPORTED_PICTURE_SIZES, supported); 475 } 476 477 LOG_FUNCTION_NAME; 478 479 return ret; 480 } 481 482 status_t OMXCameraAdapter::insertPreviewSizes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 483 status_t ret = NO_ERROR; 484 char supported[MAX_PROP_VALUE_LENGTH]; 485 486 LOG_FUNCTION_NAME; 487 488 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 489 490 ret = encodeSizeCap(caps.tPreviewResRange, 491 mPreviewRes, 492 ARRAY_SIZE(mPreviewRes), 493 supported, 494 MAX_PROP_VALUE_LENGTH); 495 496 if ( NO_ERROR != ret ) { 497 CAMHAL_LOGEB("Error inserting supported preview sizes 0x%x", ret); 498 } else { 499 remove_last_sep(supported); 500 params->set(CameraProperties::SUPPORTED_PREVIEW_SIZES, supported); 501 } 502 503 LOG_FUNCTION_NAME; 504 505 return ret; 506 } 507 508 status_t OMXCameraAdapter::insertVideoSizes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 509 status_t ret = NO_ERROR; 510 char supported[MAX_PROP_VALUE_LENGTH]; 511 512 LOG_FUNCTION_NAME; 513 514 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 515 516 ret = encodeSizeCap(caps.tPreviewResRange, 517 mPreviewRes, 518 ARRAY_SIZE(mPreviewRes), 519 supported, 520 MAX_PROP_VALUE_LENGTH); 521 522 if ( NO_ERROR != ret ) { 523 CAMHAL_LOGEB("Error inserting supported video sizes 0x%x", ret); 524 } else { 525 remove_last_sep(supported); 526 params->set(CameraProperties::SUPPORTED_VIDEO_SIZES, supported); 527 } 528 529 LOG_FUNCTION_NAME; 530 531 return ret; 532 } 533 534 status_t OMXCameraAdapter::insertThumbSizes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 535 status_t ret = NO_ERROR; 536 char supported[MAX_PROP_VALUE_LENGTH]; 537 538 LOG_FUNCTION_NAME; 539 540 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 541 542 ret = encodeSizeCap(caps.tThumbResRange, 543 mThumbRes, 544 ARRAY_SIZE(mThumbRes), 545 supported, 546 MAX_PROP_VALUE_LENGTH); 547 548 if ( NO_ERROR != ret ) { 549 CAMHAL_LOGEB("Error inserting supported thumbnail sizes 0x%x", ret); 550 } else { 551 //CTS Requirement: 0x0 should always be supported 552 strncat(supported, "0x0", MAX_PROP_NAME_LENGTH); 553 params->set(CameraProperties::SUPPORTED_THUMBNAIL_SIZES, supported); 554 } 555 556 LOG_FUNCTION_NAME; 557 558 return ret; 559 } 560 561 status_t OMXCameraAdapter::insertZoomStages(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) 562 { 563 status_t ret = NO_ERROR; 564 char supported[MAX_PROP_VALUE_LENGTH]; 565 size_t zoomStageCount = 0; 566 567 LOG_FUNCTION_NAME; 568 569 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 570 571 zoomStageCount = encodeZoomCap(caps.xMaxWidthZoom, 572 mZoomStages, 573 ARRAY_SIZE(mZoomStages), 574 supported, 575 MAX_PROP_VALUE_LENGTH); 576 577 params->set(CameraProperties::SUPPORTED_ZOOM_RATIOS, supported); 578 params->set(CameraProperties::SUPPORTED_ZOOM_STAGES, zoomStageCount - 1); //As per CTS requirement 579 580 if ( 0 == zoomStageCount ) { 581 params->set(CameraProperties::ZOOM_SUPPORTED, TICameraParameters::ZOOM_UNSUPPORTED); 582 params->set(CameraProperties::SMOOTH_ZOOM_SUPPORTED, TICameraParameters::ZOOM_UNSUPPORTED); 583 } else { 584 params->set(CameraProperties::ZOOM_SUPPORTED, TICameraParameters::ZOOM_SUPPORTED); 585 params->set(CameraProperties::SMOOTH_ZOOM_SUPPORTED, TICameraParameters::ZOOM_SUPPORTED); 586 } 587 588 LOG_FUNCTION_NAME; 589 590 return ret; 591 } 592 593 status_t OMXCameraAdapter::insertImageFormats(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 594 status_t ret = NO_ERROR; 595 char supported[MAX_PROP_VALUE_LENGTH]; 596 597 LOG_FUNCTION_NAME; 598 599 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 600 601 for ( int i = 0 ; i < caps.ulImageFormatCount ; i++ ) { 602 ret = encodePixelformatCap(caps.eImageFormats[i], 603 mPixelformats, 604 ARRAY_SIZE(mPixelformats), 605 supported, 606 MAX_PROP_VALUE_LENGTH); 607 if ( NO_ERROR != ret ) { 608 CAMHAL_LOGEB("Error inserting supported picture formats 0x%x", ret); 609 break; 610 } 611 } 612 613 if ( NO_ERROR == ret ) { 614 //jpeg is not supported in OMX capabilies yet 615 strncat(supported, CameraParameters::PIXEL_FORMAT_JPEG, MAX_PROP_VALUE_LENGTH - 1); 616 params->set(CameraProperties::SUPPORTED_PICTURE_FORMATS, supported); 617 } 618 619 LOG_FUNCTION_NAME; 620 621 return ret; 622 } 623 624 status_t OMXCameraAdapter::insertPreviewFormats(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 625 status_t ret = NO_ERROR; 626 char supported[MAX_PROP_VALUE_LENGTH]; 627 628 LOG_FUNCTION_NAME; 629 630 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 631 632 for ( int i = 0 ; i < caps.ulPreviewFormatCount; i++ ) { 633 ret = encodePixelformatCap(caps.ePreviewFormats[i], 634 mPixelformats, 635 ARRAY_SIZE(mPixelformats), 636 supported, 637 MAX_PROP_VALUE_LENGTH); 638 if ( NO_ERROR != ret ) { 639 CAMHAL_LOGEB("Error inserting supported preview formats 0x%x", ret); 640 break; 641 } 642 } 643 644 if ( NO_ERROR == ret ) { 645 // need to advertise we support YV12 format 646 // We will program preview port with NV21 when we see application set YV12 647 strncat(supported, CameraParameters::PIXEL_FORMAT_YUV420P, MAX_PROP_VALUE_LENGTH - 1); 648 params->set(CameraProperties::SUPPORTED_PREVIEW_FORMATS, supported); 649 } 650 651 LOG_FUNCTION_NAME; 652 653 return ret; 654 } 655 656 status_t OMXCameraAdapter::insertFramerates(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 657 status_t ret = NO_ERROR; 658 char supported[MAX_PROP_VALUE_LENGTH]; 659 660 LOG_FUNCTION_NAME; 661 662 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 663 664 ret = encodeFramerateCap(caps.xFramerateMax >> VFR_OFFSET, 665 caps.xFramerateMin >> VFR_OFFSET, 666 mFramerates, 667 ARRAY_SIZE(mFramerates), 668 supported, 669 MAX_PROP_VALUE_LENGTH); 670 671 if ( NO_ERROR != ret ) { 672 CAMHAL_LOGEB("Error inserting supported preview framerates 0x%x", ret); 673 } else { 674 params->set(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES, supported); 675 } 676 677 LOG_FUNCTION_NAME; 678 679 return ret; 680 } 681 682 status_t OMXCameraAdapter::insertVFramerates(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 683 status_t ret = NO_ERROR; 684 char supported[MAX_PROP_VALUE_LENGTH]; 685 char defaultRange[MAX_PROP_VALUE_LENGTH]; 686 687 LOG_FUNCTION_NAME; 688 689 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 690 691 ret = encodeVFramerateCap(caps, 692 mVarFramerates, 693 ARRAY_SIZE(mVarFramerates), 694 supported, 695 defaultRange, 696 MAX_PROP_VALUE_LENGTH); 697 698 if ( NO_ERROR != ret ) { 699 CAMHAL_LOGEB("Error inserting supported preview framerate ranges 0x%x", ret); 700 } else { 701 params->set(CameraProperties::FRAMERATE_RANGE_SUPPORTED, supported); 702 CAMHAL_LOGDB("framerate ranges %s", supported); 703 params->set(CameraProperties::FRAMERATE_RANGE, DEFAULT_FRAMERATE_RANGE_IMAGE); 704 params->set(CameraProperties::FRAMERATE_RANGE_VIDEO, DEFAULT_FRAMERATE_RANGE_VIDEO); 705 params->set(CameraProperties::FRAMERATE_RANGE_IMAGE, DEFAULT_FRAMERATE_RANGE_IMAGE); 706 CAMHAL_LOGDB("Default framerate range: [%s]", DEFAULT_FRAMERATE_RANGE_IMAGE); 707 } 708 709 LOG_FUNCTION_NAME; 710 711 return ret; 712 } 713 714 status_t OMXCameraAdapter::insertEVs(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 715 status_t ret = NO_ERROR; 716 char supported[MAX_PROP_VALUE_LENGTH]; 717 718 LOG_FUNCTION_NAME; 719 720 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 721 722 snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", ( int ) ( caps.xEVCompensationMin * 10 )); 723 params->set(CameraProperties::SUPPORTED_EV_MIN, supported); 724 725 snprintf(supported, MAX_PROP_VALUE_LENGTH, "%d", ( int ) ( caps.xEVCompensationMax * 10 )); 726 params->set(CameraProperties::SUPPORTED_EV_MAX, supported); 727 728 LOG_FUNCTION_NAME; 729 730 return ret; 731 } 732 733 status_t OMXCameraAdapter::insertISOModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 734 status_t ret = NO_ERROR; 735 char supported[MAX_PROP_VALUE_LENGTH]; 736 737 LOG_FUNCTION_NAME; 738 739 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 740 741 ret = encodeISOCap(caps.nSensitivityMax, 742 mISOStages, 743 ARRAY_SIZE(mISOStages), 744 supported, 745 MAX_PROP_VALUE_LENGTH); 746 if ( NO_ERROR != ret ) { 747 CAMHAL_LOGEB("Error inserting supported ISO modes 0x%x", ret); 748 } else { 749 params->set(CameraProperties::SUPPORTED_ISO_VALUES, supported); 750 } 751 752 LOG_FUNCTION_NAME; 753 754 return ret; 755 } 756 757 status_t OMXCameraAdapter::insertIPPModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 758 status_t ret = NO_ERROR; 759 char supported[MAX_PROP_VALUE_LENGTH]; 760 761 LOG_FUNCTION_NAME; 762 763 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 764 765 //Off is always supported 766 strncat(supported, TICameraParameters::IPP_NONE, MAX_PROP_NAME_LENGTH); 767 strncat(supported, PARAM_SEP, 1); 768 769 if ( caps.bLensDistortionCorrectionSupported ) { 770 strncat(supported, TICameraParameters::IPP_LDC, MAX_PROP_NAME_LENGTH); 771 strncat(supported, PARAM_SEP, 1); 772 } 773 774 if ( caps.bISONoiseFilterSupported ) { 775 strncat(supported, TICameraParameters::IPP_NSF, MAX_PROP_NAME_LENGTH); 776 strncat(supported, PARAM_SEP, 1); 777 } 778 779 if ( caps.bISONoiseFilterSupported && caps.bLensDistortionCorrectionSupported ) { 780 strncat(supported, TICameraParameters::IPP_LDCNSF, MAX_PROP_NAME_LENGTH); 781 strncat(supported, PARAM_SEP, 1); 782 } 783 784 remove_last_sep(supported); 785 params->set(CameraProperties::SUPPORTED_IPP_MODES, supported); 786 787 LOG_FUNCTION_NAME; 788 789 return ret; 790 } 791 792 status_t OMXCameraAdapter::insertWBModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 793 status_t ret = NO_ERROR; 794 char supported[MAX_PROP_VALUE_LENGTH]; 795 const char *p; 796 797 LOG_FUNCTION_NAME; 798 799 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 800 801 for ( unsigned int i = 0 ; i < caps.ulWhiteBalanceCount ; i++ ) { 802 p = getLUTvalue_OMXtoHAL(caps.eWhiteBalanceModes[i], WBalLUT); 803 if ( NULL != p ) { 804 strncat(supported, p, MAX_PROP_NAME_LENGTH); 805 strncat(supported, PARAM_SEP, 1); 806 } 807 } 808 809 params->set(CameraProperties::SUPPORTED_WHITE_BALANCE, supported); 810 811 LOG_FUNCTION_NAME; 812 813 return ret; 814 } 815 816 status_t OMXCameraAdapter::insertEffects(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 817 status_t ret = NO_ERROR; 818 char supported[MAX_PROP_VALUE_LENGTH]; 819 const char *p; 820 821 LOG_FUNCTION_NAME; 822 823 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 824 825 for ( unsigned int i = 0 ; i < caps.ulColorEffectCount; i++ ) { 826 p = getLUTvalue_OMXtoHAL(caps.eColorEffects[i], EffLUT); 827 if ( NULL != p ) { 828 strncat(supported, p, MAX_PROP_NAME_LENGTH); 829 strncat(supported, PARAM_SEP, 1); 830 } 831 } 832 remove_last_sep(supported); 833 params->set(CameraProperties::SUPPORTED_EFFECTS, supported); 834 835 LOG_FUNCTION_NAME; 836 837 return ret; 838 } 839 840 status_t OMXCameraAdapter::insertExpModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 841 status_t ret = NO_ERROR; 842 char supported[MAX_PROP_VALUE_LENGTH]; 843 const char *p; 844 845 LOG_FUNCTION_NAME; 846 847 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 848 849 for ( unsigned int i = 0 ; i < caps.ulExposureModeCount; i++ ) { 850 p = getLUTvalue_OMXtoHAL(caps.eExposureModes[i], ExpLUT); 851 if ( NULL != p ) { 852 strncat(supported, p, MAX_PROP_NAME_LENGTH); 853 strncat(supported, PARAM_SEP, 1); 854 } 855 } 856 857 params->set(CameraProperties::SUPPORTED_EXPOSURE_MODES, supported); 858 859 LOG_FUNCTION_NAME; 860 861 return ret; 862 } 863 864 status_t OMXCameraAdapter::insertFlashModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 865 status_t ret = NO_ERROR; 866 char supported[MAX_PROP_VALUE_LENGTH]; 867 const char *p; 868 869 LOG_FUNCTION_NAME; 870 871 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 872 873 for ( unsigned int i = 0 ; i < caps.ulFlashCount; i++ ) { 874 p = getLUTvalue_OMXtoHAL(caps.eFlashModes[i], FlashLUT); 875 if ( NULL != p ) { 876 strncat(supported, p, MAX_PROP_NAME_LENGTH); 877 strncat(supported, PARAM_SEP, 1); 878 } 879 } 880 881 remove_last_sep(supported); 882 params->set(CameraProperties::SUPPORTED_FLASH_MODES, supported); 883 884 LOG_FUNCTION_NAME; 885 886 return ret; 887 } 888 889 status_t OMXCameraAdapter::insertSceneModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 890 status_t ret = NO_ERROR; 891 char supported[MAX_PROP_VALUE_LENGTH]; 892 const char *p; 893 894 LOG_FUNCTION_NAME; 895 896 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 897 898 for ( unsigned int i = 0 ; i < caps.ulSceneCount; i++ ) { 899 p = getLUTvalue_OMXtoHAL(caps.eSceneModes[i], SceneLUT); 900 if ( NULL != p ) { 901 strncat(supported, p, MAX_PROP_NAME_LENGTH); 902 strncat(supported, PARAM_SEP, 1); 903 } 904 } 905 906 remove_last_sep(supported); 907 params->set(CameraProperties::SUPPORTED_SCENE_MODES, supported); 908 909 LOG_FUNCTION_NAME; 910 911 return ret; 912 } 913 914 status_t OMXCameraAdapter::insertFocusModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 915 status_t ret = NO_ERROR; 916 char supported[MAX_PROP_VALUE_LENGTH]; 917 const char *p; 918 919 LOG_FUNCTION_NAME; 920 921 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 922 923 for ( unsigned int i = 0 ; i < caps.ulFocusModeCount; i++ ) { 924 p = getLUTvalue_OMXtoHAL(caps.eFocusModes[i], FocusLUT); 925 if ( NULL != p ) { 926 strncat(supported, p, MAX_PROP_NAME_LENGTH); 927 strncat(supported, PARAM_SEP, 1); 928 } 929 } 930 931 // Check if focus is supported by camera 932 if (caps.ulFocusModeCount == 1 && 933 caps.eFocusModes[0] == OMX_IMAGE_FocusControlOff) { 934 // Focus is not supported by camera 935 // Advertise this to app as infinitiy focus mode 936 strncat(supported, CameraParameters::FOCUS_MODE_INFINITY, MAX_PROP_NAME_LENGTH); 937 } else { 938 // Focus is supported but these modes are not supported by the 939 // capability feature. Apply manually 940 strncat(supported, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE, MAX_PROP_NAME_LENGTH); 941 } 942 943 params->set(CameraProperties::SUPPORTED_FOCUS_MODES, supported); 944 945 LOG_FUNCTION_NAME; 946 947 return ret; 948 } 949 950 status_t OMXCameraAdapter::insertFlickerModes(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 951 status_t ret = NO_ERROR; 952 char supported[MAX_PROP_VALUE_LENGTH]; 953 const char *p; 954 955 LOG_FUNCTION_NAME; 956 957 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 958 959 for ( unsigned int i = 0 ; i < caps.ulFlickerCount; i++ ) { 960 p = getLUTvalue_OMXtoHAL(caps.eFlicker[i], FlickerLUT); 961 if ( NULL != p ) { 962 strncat(supported, p, MAX_PROP_NAME_LENGTH); 963 strncat(supported, PARAM_SEP, 1); 964 } 965 } 966 remove_last_sep(supported); 967 params->set(CameraProperties::SUPPORTED_ANTIBANDING, supported); 968 969 LOG_FUNCTION_NAME; 970 971 return ret; 972 } 973 974 status_t OMXCameraAdapter::insertAreas(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 975 status_t ret = NO_ERROR; 976 char supported[MAX_PROP_VALUE_LENGTH]; 977 const char *p; 978 979 LOG_FUNCTION_NAME; 980 981 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 982 983 sprintf(supported, "%d", caps.ulAlgoAreasFocusCount); 984 params->set(CameraProperties::MAX_FOCUS_AREAS, supported); 985 CAMHAL_LOGDB("Maximum supported focus areas %s", supported); 986 987 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 988 sprintf(supported, "%d", caps.ulAlgoAreasExposureCount); 989 params->set(CameraProperties::MAX_NUM_METERING_AREAS, supported); 990 CAMHAL_LOGDB("Maximum supported exposure areas %s", supported); 991 992 LOG_FUNCTION_NAME; 993 994 return ret; 995 } 996 997 status_t OMXCameraAdapter::insertLocks(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 998 status_t ret = NO_ERROR; 999 1000 LOG_FUNCTION_NAME 1001 1002 params->set(CameraProperties::AUTO_EXPOSURE_LOCK_SUPPORTED, DEFAULT_LOCK_SUPPORTED); 1003 params->set(CameraProperties::AUTO_WHITEBALANCE_LOCK_SUPPORTED, DEFAULT_LOCK_SUPPORTED); 1004 1005 LOG_FUNCTION_NAME 1006 1007 return ret; 1008 } 1009 1010 status_t OMXCameraAdapter::insertDefaults(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 1011 status_t ret = NO_ERROR; 1012 char supported[MAX_PROP_VALUE_LENGTH]; 1013 const char *p; 1014 1015 LOG_FUNCTION_NAME; 1016 1017 params->set(CameraProperties::ANTIBANDING, DEFAULT_ANTIBANDING); 1018 params->set(CameraProperties::BRIGHTNESS, DEFAULT_BRIGHTNESS); 1019 params->set(CameraProperties::CONTRAST, DEFAULT_CONTRAST); 1020 params->set(CameraProperties::EFFECT, DEFAULT_EFFECT); 1021 params->set(CameraProperties::EV_COMPENSATION, DEFAULT_EV_COMPENSATION); 1022 params->set(CameraProperties::SUPPORTED_EV_STEP, DEFAULT_EV_STEP); 1023 params->set(CameraProperties::EXPOSURE_MODE, DEFAULT_EXPOSURE_MODE); 1024 params->set(CameraProperties::FLASH_MODE, DEFAULT_FLASH_MODE); 1025 char *pos = strstr(params->get(CameraProperties::SUPPORTED_FOCUS_MODES), DEFAULT_FOCUS_MODE_PREFERRED); 1026 if ( NULL != pos ) 1027 { 1028 params->set(CameraProperties::FOCUS_MODE, DEFAULT_FOCUS_MODE_PREFERRED); 1029 } 1030 else 1031 { 1032 params->set(CameraProperties::FOCUS_MODE, DEFAULT_FOCUS_MODE); 1033 } 1034 params->set(CameraProperties::IPP, DEFAULT_IPP); 1035 params->set(CameraProperties::GBCE, DEFAULT_GBCE); 1036 params->set(CameraProperties::ISO_MODE, DEFAULT_ISO_MODE); 1037 params->set(CameraProperties::JPEG_QUALITY, DEFAULT_JPEG_QUALITY); 1038 params->set(CameraProperties::JPEG_THUMBNAIL_QUALITY, DEFAULT_THUMBNAIL_QUALITY); 1039 params->set(CameraProperties::JPEG_THUMBNAIL_SIZE, DEFAULT_THUMBNAIL_SIZE); 1040 params->set(CameraProperties::PICTURE_FORMAT, DEFAULT_PICTURE_FORMAT); 1041 params->set(CameraProperties::PICTURE_SIZE, DEFAULT_PICTURE_SIZE); 1042 params->set(CameraProperties::PREVIEW_FORMAT, DEFAULT_PREVIEW_FORMAT); 1043 params->set(CameraProperties::PREVIEW_FRAME_RATE, DEFAULT_FRAMERATE); 1044 params->set(CameraProperties::PREVIEW_SIZE, DEFAULT_PREVIEW_SIZE); 1045 params->set(CameraProperties::REQUIRED_PREVIEW_BUFS, DEFAULT_NUM_PREV_BUFS); 1046 params->set(CameraProperties::REQUIRED_IMAGE_BUFS, DEFAULT_NUM_PIC_BUFS); 1047 params->set(CameraProperties::SATURATION, DEFAULT_SATURATION); 1048 params->set(CameraProperties::SCENE_MODE, DEFAULT_SCENE_MODE); 1049 params->set(CameraProperties::SHARPNESS, DEFAULT_SHARPNESS); 1050 params->set(CameraProperties::VSTAB, DEFAULT_VSTAB); 1051 params->set(CameraProperties::VSTAB_SUPPORTED, DEFAULT_VSTAB_SUPPORTED); 1052 params->set(CameraProperties::WHITEBALANCE, DEFAULT_WB); 1053 params->set(CameraProperties::ZOOM, DEFAULT_ZOOM); 1054 params->set(CameraProperties::MAX_FD_HW_FACES, DEFAULT_MAX_FD_HW_FACES); 1055 params->set(CameraProperties::MAX_FD_SW_FACES, DEFAULT_MAX_FD_SW_FACES); 1056 params->set(CameraProperties::AUTO_EXPOSURE_LOCK, DEFAULT_AE_LOCK); 1057 params->set(CameraProperties::AUTO_WHITEBALANCE_LOCK, DEFAULT_AWB_LOCK); 1058 if(caps.tSenMounting.nSenId == 305) { 1059 params->set(CameraProperties::FOCAL_LENGTH, DEFAULT_FOCAL_LENGTH_PRIMARY); 1060 } else { 1061 params->set(CameraProperties::FOCAL_LENGTH, DEFAULT_FOCAL_LENGTH_SECONDARY); 1062 } 1063 params->set(CameraProperties::HOR_ANGLE, DEFAULT_HOR_ANGLE); 1064 params->set(CameraProperties::VER_ANGLE, DEFAULT_VER_ANGLE); 1065 params->set(CameraProperties::VIDEO_SNAPSHOT_SUPPORTED, DEFAULT_VIDEO_SNAPSHOT_SUPPORTED); 1066 params->set(CameraProperties::VIDEO_SIZE, DEFAULT_VIDEO_SIZE); 1067 params->set(CameraProperties::PREFERRED_PREVIEW_SIZE_FOR_VIDEO, DEFAULT_PREFERRED_PREVIEW_SIZE_FOR_VIDEO); 1068 1069 LOG_FUNCTION_NAME; 1070 1071 return ret; 1072 } 1073 1074 status_t OMXCameraAdapter::insertSenMount(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 1075 status_t ret = NO_ERROR; 1076 char supported[MAX_PROP_VALUE_LENGTH]; 1077 const char *p; 1078 unsigned int i = 0; 1079 1080 LOG_FUNCTION_NAME; 1081 1082 memset(supported, '\0', MAX_PROP_VALUE_LENGTH); 1083 1084 // 1) Look up and assign sensor name 1085 for (i = 0; i < ARRAY_SIZE(mSensorNames); i++) { 1086 if(mSensorNames[i].num == caps.tSenMounting.nSenId) { 1087 // sensor found 1088 break; 1089 } 1090 } 1091 if ( i == ARRAY_SIZE(mSensorNames) ) { 1092 p = "UNKNOWN_SENSOR"; 1093 } else { 1094 p = mSensorNames[i].param; 1095 } 1096 strncat(supported, p, MAX_PROP_NAME_LENGTH); 1097 params->set(CameraProperties::CAMERA_NAME, supported); 1098 1099 // 2) Assign mounting rotation 1100 params->set(CameraProperties::ORIENTATION_INDEX, caps.tSenMounting.nRotation); 1101 1102 LOG_FUNCTION_NAME; 1103 1104 return ret; 1105 } 1106 1107 status_t OMXCameraAdapter::insertCapabilities(CameraProperties::Properties* params, OMX_TI_CAPTYPE &caps) { 1108 status_t ret = NO_ERROR; 1109 char supported[MAX_PROP_VALUE_LENGTH]; 1110 1111 LOG_FUNCTION_NAME; 1112 1113 if ( NO_ERROR == ret ) { 1114 ret = insertImageSizes(params, caps); 1115 } 1116 1117 if ( NO_ERROR == ret ) { 1118 ret = insertPreviewSizes(params, caps); 1119 } 1120 1121 if ( NO_ERROR == ret ) { 1122 ret = insertThumbSizes(params, caps); 1123 } 1124 1125 if ( NO_ERROR == ret ) { 1126 ret = insertZoomStages(params, caps); 1127 } 1128 1129 if ( NO_ERROR == ret ) { 1130 ret = insertImageFormats(params, caps); 1131 } 1132 1133 if ( NO_ERROR == ret ) { 1134 ret = insertPreviewFormats(params, caps); 1135 } 1136 1137 if ( NO_ERROR == ret ) { 1138 ret = insertFramerates(params, caps); 1139 } 1140 1141 if ( NO_ERROR == ret ) { 1142 ret = insertVFramerates(params, caps); 1143 } 1144 1145 if ( NO_ERROR == ret ) { 1146 ret = insertEVs(params, caps); 1147 } 1148 1149 if ( NO_ERROR == ret ) { 1150 ret = insertISOModes(params, caps); 1151 } 1152 1153 if ( NO_ERROR == ret ) { 1154 ret = insertIPPModes(params, caps); 1155 } 1156 1157 if ( NO_ERROR == ret ) { 1158 ret = insertWBModes(params, caps); 1159 } 1160 1161 if ( NO_ERROR == ret ) { 1162 ret = insertEffects(params, caps); 1163 } 1164 1165 if ( NO_ERROR == ret ) { 1166 ret = insertExpModes(params, caps); 1167 } 1168 1169 if ( NO_ERROR == ret ) { 1170 ret = insertFlashModes(params, caps); 1171 } 1172 1173 if ( NO_ERROR == ret ) { 1174 ret = insertSceneModes(params, caps); 1175 } 1176 1177 if ( NO_ERROR == ret ) { 1178 ret = insertFocusModes(params, caps); 1179 } 1180 1181 if ( NO_ERROR == ret ) { 1182 ret = insertFlickerModes(params, caps); 1183 } 1184 1185 if ( NO_ERROR == ret ) { 1186 ret = insertSenMount(params, caps); 1187 } 1188 1189 if ( NO_ERROR == ret ) { 1190 ret = insertLocks(params, caps); 1191 } 1192 if ( NO_ERROR == ret) { 1193 ret = insertAreas(params, caps); 1194 1195 } 1196 1197 //NOTE: Ensure that we always call insertDefaults after inserting the supported capabilities 1198 //as there are checks inside insertDefaults to make sure a certain default is supported 1199 // or not 1200 if ( NO_ERROR == ret ) { 1201 ret = insertVideoSizes(params, caps); 1202 } 1203 1204 if ( NO_ERROR == ret ) { 1205 ret = insertDefaults(params, caps); 1206 } 1207 1208 1209 1210 LOG_FUNCTION_NAME_EXIT; 1211 1212 return ret; 1213 } 1214 1215 /***************************************** 1216 * public exposed function declarations 1217 *****************************************/ 1218 1219 status_t OMXCameraAdapter::getCaps(CameraProperties::Properties* params, OMX_HANDLETYPE handle) { 1220 status_t ret = NO_ERROR; 1221 int caps_size = 0; 1222 OMX_ERRORTYPE eError = OMX_ErrorNone; 1223 OMX_TI_CAPTYPE** caps = NULL;; 1224 OMX_TI_CONFIG_SHAREDBUFFER sharedBuffer; 1225 MemoryManager memMgr; 1226 1227 LOG_FUNCTION_NAME; 1228 1229 // allocate tiler (or ion) buffer for caps (size is always a multiple of 4K) 1230 caps_size = ((sizeof(OMX_TI_CAPTYPE)+4095)/4096)*4096; 1231 caps = (OMX_TI_CAPTYPE**) memMgr.allocateBuffer(0, 0, NULL, caps_size, 1); 1232 1233 if (!caps) { 1234 CAMHAL_LOGEB("Error allocating buffer for caps %d", eError); 1235 ret = -ENOMEM; 1236 goto EXIT; 1237 } 1238 1239 // initialize structures to be passed to OMX Camera 1240 OMX_INIT_STRUCT_PTR (caps[0], OMX_TI_CAPTYPE); 1241 caps[0]->nPortIndex = OMX_ALL; 1242 1243 OMX_INIT_STRUCT_PTR (&sharedBuffer, OMX_TI_CONFIG_SHAREDBUFFER); 1244 sharedBuffer.nPortIndex = OMX_ALL; 1245 sharedBuffer.nSharedBuffSize = caps_size; 1246 sharedBuffer.pSharedBuff = (OMX_U8 *) caps[0]; 1247 1248 // Get capabilities from OMX Camera 1249 eError = OMX_GetConfig(handle, (OMX_INDEXTYPE) OMX_TI_IndexConfigCamCapabilities, &sharedBuffer); 1250 if ( OMX_ErrorNone != eError ) { 1251 CAMHAL_LOGEB("Error during capabilities query 0x%x", eError); 1252 ret = UNKNOWN_ERROR; 1253 goto EXIT; 1254 } else { 1255 CAMHAL_LOGDA("OMX capability query success"); 1256 } 1257 1258 // Translate and insert Ducati capabilities to CameraProperties 1259 if ( NO_ERROR == ret ) { 1260 ret = insertCapabilities(params, *caps[0]); 1261 } 1262 1263 CAMHAL_LOGDB("sen mount id=%u", (unsigned int)caps[0]->tSenMounting.nSenId); 1264 1265 1266 EXIT: 1267 if (caps) { 1268 memMgr.freeBuffer((void*) caps); 1269 caps = NULL; 1270 } 1271 1272 LOG_FUNCTION_NAME_EXIT; 1273 return ret; 1274 } 1275 1276 }; 1277 1278