ADebug.h revision 43fb79ad6ffecb86d5041afd8c06b764fb6f934f
172961230a5890071bcca436eb5630172ce84ec41Andreas Huber/* 272961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Copyright (C) 2010 The Android Open Source Project 372961230a5890071bcca436eb5630172ce84ec41Andreas Huber * 472961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 572961230a5890071bcca436eb5630172ce84ec41Andreas Huber * you may not use this file except in compliance with the License. 672961230a5890071bcca436eb5630172ce84ec41Andreas Huber * You may obtain a copy of the License at 772961230a5890071bcca436eb5630172ce84ec41Andreas Huber * 872961230a5890071bcca436eb5630172ce84ec41Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 972961230a5890071bcca436eb5630172ce84ec41Andreas Huber * 1072961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Unless required by applicable law or agreed to in writing, software 1172961230a5890071bcca436eb5630172ce84ec41Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1272961230a5890071bcca436eb5630172ce84ec41Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1372961230a5890071bcca436eb5630172ce84ec41Andreas Huber * See the License for the specific language governing permissions and 1472961230a5890071bcca436eb5630172ce84ec41Andreas Huber * limitations under the License. 1572961230a5890071bcca436eb5630172ce84ec41Andreas Huber */ 1672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1772961230a5890071bcca436eb5630172ce84ec41Andreas Huber#ifndef A_DEBUG_H_ 1872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1972961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define A_DEBUG_H_ 2072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2172961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <string.h> 2272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2372961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <media/stagefright/foundation/ABase.h> 2472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <media/stagefright/foundation/AString.h> 256e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber#include <utils/Log.h> 2672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 277fa3efa6d7e92a9a2cc5ce780c7db29f1b36a23cLajos Molnarnamespace android { 287fa3efa6d7e92a9a2cc5ce780c7db29f1b36a23cLajos Molnar 297fa3efa6d7e92a9a2cc5ce780c7db29f1b36a23cLajos Molnarinline static const char *asString(status_t i, const char *def = "??") { 30054219874873b41f1c815552987c10465c34ba2bLajos Molnar switch (i) { 31054219874873b41f1c815552987c10465c34ba2bLajos Molnar case NO_ERROR: return "NO_ERROR"; 32054219874873b41f1c815552987c10465c34ba2bLajos Molnar case UNKNOWN_ERROR: return "UNKNOWN_ERROR"; 33054219874873b41f1c815552987c10465c34ba2bLajos Molnar case NO_MEMORY: return "NO_MEMORY"; 34054219874873b41f1c815552987c10465c34ba2bLajos Molnar case INVALID_OPERATION: return "INVALID_OPERATION"; 35054219874873b41f1c815552987c10465c34ba2bLajos Molnar case BAD_VALUE: return "BAD_VALUE"; 36054219874873b41f1c815552987c10465c34ba2bLajos Molnar case BAD_TYPE: return "BAD_TYPE"; 37054219874873b41f1c815552987c10465c34ba2bLajos Molnar case NAME_NOT_FOUND: return "NAME_NOT_FOUND"; 38054219874873b41f1c815552987c10465c34ba2bLajos Molnar case PERMISSION_DENIED: return "PERMISSION_DENIED"; 39054219874873b41f1c815552987c10465c34ba2bLajos Molnar case NO_INIT: return "NO_INIT"; 40054219874873b41f1c815552987c10465c34ba2bLajos Molnar case ALREADY_EXISTS: return "ALREADY_EXISTS"; 41054219874873b41f1c815552987c10465c34ba2bLajos Molnar case DEAD_OBJECT: return "DEAD_OBJECT"; 42054219874873b41f1c815552987c10465c34ba2bLajos Molnar case FAILED_TRANSACTION: return "FAILED_TRANSACTION"; 43054219874873b41f1c815552987c10465c34ba2bLajos Molnar case BAD_INDEX: return "BAD_INDEX"; 44054219874873b41f1c815552987c10465c34ba2bLajos Molnar case NOT_ENOUGH_DATA: return "NOT_ENOUGH_DATA"; 45054219874873b41f1c815552987c10465c34ba2bLajos Molnar case WOULD_BLOCK: return "WOULD_BLOCK"; 46054219874873b41f1c815552987c10465c34ba2bLajos Molnar case TIMED_OUT: return "TIMED_OUT"; 47054219874873b41f1c815552987c10465c34ba2bLajos Molnar case UNKNOWN_TRANSACTION: return "UNKNOWN_TRANSACTION"; 48054219874873b41f1c815552987c10465c34ba2bLajos Molnar case FDS_NOT_ALLOWED: return "FDS_NOT_ALLOWED"; 49054219874873b41f1c815552987c10465c34ba2bLajos Molnar default: return def; 50054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 51054219874873b41f1c815552987c10465c34ba2bLajos Molnar} 52054219874873b41f1c815552987c10465c34ba2bLajos Molnar 536e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber#define LITERAL_TO_STRING_INTERNAL(x) #x 546e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber#define LITERAL_TO_STRING(x) LITERAL_TO_STRING_INTERNAL(x) 5572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5672961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define CHECK(condition) \ 576e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber LOG_ALWAYS_FATAL_IF( \ 586e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber !(condition), \ 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "%s", \ 606e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber __FILE__ ":" LITERAL_TO_STRING(__LINE__) \ 616e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber " CHECK(" #condition ") failed.") 6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define MAKE_COMPARATOR(suffix,op) \ 6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber template<class A, class B> \ 6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber AString Compare_##suffix(const A &a, const B &b) { \ 6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber AString res; \ 6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (!(a op b)) { \ 6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber res.append(a); \ 6972961230a5890071bcca436eb5630172ce84ec41Andreas Huber res.append(" vs. "); \ 7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber res.append(b); \ 7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } \ 7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return res; \ 7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 7572961230a5890071bcca436eb5630172ce84ec41Andreas HuberMAKE_COMPARATOR(EQ,==) 7672961230a5890071bcca436eb5630172ce84ec41Andreas HuberMAKE_COMPARATOR(NE,!=) 7772961230a5890071bcca436eb5630172ce84ec41Andreas HuberMAKE_COMPARATOR(LE,<=) 7872961230a5890071bcca436eb5630172ce84ec41Andreas HuberMAKE_COMPARATOR(GE,>=) 7972961230a5890071bcca436eb5630172ce84ec41Andreas HuberMAKE_COMPARATOR(LT,<) 8072961230a5890071bcca436eb5630172ce84ec41Andreas HuberMAKE_COMPARATOR(GT,>) 8172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define CHECK_OP(x,y,suffix,op) \ 8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber do { \ 8472961230a5890071bcca436eb5630172ce84ec41Andreas Huber AString ___res = Compare_##suffix(x, y); \ 8572961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (!___res.empty()) { \ 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber AString ___full = \ 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber __FILE__ ":" LITERAL_TO_STRING(__LINE__) \ 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber " CHECK_" #suffix "( " #x "," #y ") failed: "; \ 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ___full.append(___res); \ 90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber \ 91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LOG_ALWAYS_FATAL("%s", ___full.c_str()); \ 9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } \ 9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } while (false) 9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define CHECK_EQ(x,y) CHECK_OP(x,y,EQ,==) 9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define CHECK_NE(x,y) CHECK_OP(x,y,NE,!=) 9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define CHECK_LE(x,y) CHECK_OP(x,y,LE,<=) 9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define CHECK_LT(x,y) CHECK_OP(x,y,LT,<) 9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define CHECK_GE(x,y) CHECK_OP(x,y,GE,>=) 10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define CHECK_GT(x,y) CHECK_OP(x,y,GT,>) 10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10243fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define TRESPASS(...) \ 103bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber LOG_ALWAYS_FATAL( \ 104bc7f5b2e56107cfeaeeab13cf8979379e3c2f139Andreas Huber __FILE__ ":" LITERAL_TO_STRING(__LINE__) \ 10543fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar " Should not be here. " __VA_ARGS__); 10643fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar 10743fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#ifdef NDEBUG 10843fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define CHECK_DBG CHECK 10943fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define CHECK_EQ_DBG CHECK_EQ 11043fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define CHECK_NE_DBG CHECK_NE 11143fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define CHECK_LE_DBG CHECK_LE 11243fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define CHECK_LT_DBG CHECK_LT 11343fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define CHECK_GE_DBG CHECK_GE 11443fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define CHECK_GT_DBG CHECK_GT 11543fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define TRESPASS_DBG TRESPASS 11643fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#else 11743fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define CHECK_DBG(condition) 11843fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define CHECK_EQ_DBG(x,y) 11943fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define CHECK_NE_DBG(x,y) 12043fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define CHECK_LE_DBG(x,y) 12143fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define CHECK_LT_DBG(x,y) 12243fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define CHECK_GE_DBG(x,y) 12343fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define CHECK_GT_DBG(x,y) 12443fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#define TRESPASS_DBG(...) 12543fb79ad6ffecb86d5041afd8c06b764fb6f934fLajos Molnar#endif 12672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 127f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarstruct ADebug { 128f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar enum Level { 129f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar kDebugNone, // no debug 130f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar kDebugLifeCycle, // lifecycle events: creation/deletion 131f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar kDebugState, // commands and events 132f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar kDebugConfig, // configuration 133f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar kDebugInternalState, // internal state changes 134f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar kDebugAll, // all 135f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar kDebugMax = kDebugAll, 136f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 137f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar }; 138f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1399903589eacc655481acebc5b85632b3b84418bc9Lajos Molnar // parse the property or string to get a long-type level for a component name 140f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // string format is: 141f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // <level>[:<glob>][,<level>[:<glob>]...] 142f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // - <level> is 0-5 corresponding to ADebug::Level 143f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // - <glob> is used to match component name case insensitively, if omitted, it 144f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // matches all components 145f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // - string is read left-to-right, and the last matching level is returned, or 146f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // the def if no terms matched 1479903589eacc655481acebc5b85632b3b84418bc9Lajos Molnar static long GetLevelFromSettingsString( 1489903589eacc655481acebc5b85632b3b84418bc9Lajos Molnar const char *name, const char *value, long def); 1499903589eacc655481acebc5b85632b3b84418bc9Lajos Molnar static long GetLevelFromProperty( 1509903589eacc655481acebc5b85632b3b84418bc9Lajos Molnar const char *name, const char *value, long def); 1519903589eacc655481acebc5b85632b3b84418bc9Lajos Molnar 1529903589eacc655481acebc5b85632b3b84418bc9Lajos Molnar // same for ADebug::Level - performs clamping to valid debug ranges 153f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar static Level GetDebugLevelFromProperty( 154f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar const char *name, const char *propertyName, Level def = kDebugNone); 155f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 156f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // remove redundant segments of a codec name, and return a newly allocated 157f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // string suitable for debugging 158f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar static char *GetDebugName(const char *name); 159011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar 160011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar inline static bool isExperimentEnabled( 161011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar const char *name __unused /* nonnull */, bool allow __unused = true) { 162011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar#ifdef ENABLE_STAGEFRIGHT_EXPERIMENTS 163011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar if (!strcmp(name, "legacy-adaptive")) { 164011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar return getExperimentFlag(allow, name, 2, 1); // every other day 165011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar } else if (!strcmp(name, "legacy-setsurface")) { 166011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar return getExperimentFlag(allow, name, 3, 1); // every third day 167011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar } else { 168011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar ALOGE("unknown experiment '%s' (disabled)", name); 169011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar } 170011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar#endif 171011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar return false; 172011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar } 173011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar 174011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnarprivate: 175011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar // pass in allow, so we can print in the log if the experiment is disabled 176011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar static bool getExperimentFlag( 177011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar bool allow, const char *name, uint64_t modulo, uint64_t limit, 178011778fd4cb9606b68bfea1ed483d73c04fc6dcdLajos Molnar uint64_t plus = 0, uint64_t timeDivisor = 24 * 60 * 60 /* 1 day */); 179f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar}; 180f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 18172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} // namespace android 18272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 18372961230a5890071bcca436eb5630172ce84ec41Andreas Huber#endif // A_DEBUG_H_ 18472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 185