本文整理汇总了C++中String8::isEmpty方法的典型用法代码示例。如果您正苦于以下问题:C++ String8::isEmpty方法的具体用法?C++ String8::isEmpty怎么用?C++ String8::isEmpty使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类String8
的用法示例。
在下文中一共展示了String8::isEmpty方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: update
void TextureTracker::update(int textureId, bool ghost, String8 name) {
Mutex::Autolock _l(mLock);
TextureEntry entry(textureId);
ssize_t index = mMemoryList.indexOf(entry);
if (index >= 0) {
TextureEntry& item = mMemoryList.editItemAt(index);
TTLOGD("[TT]update before %s %d %d %d %d %d\n", item.mName.string(), item.mId, item.mWidth, item.mHeight,
item.mMemory, item.mGhost);
item.mGhost = ghost;
if (name.isEmpty()) {
if (!ghost) {
item.mName = mViews.top();
}
} else {
item.mName = name;
}
entry = mMemoryList.itemAt(index);
TTLOGD("[TT]update after %s %d %d %d %d %d\n", entry.mName.string(), entry.mId, entry.mWidth, entry.mHeight,
entry.mMemory, entry.mGhost);
} else {
TTLOGD("[TT]update not found %d", textureId);
}
}
示例2: if
bool
ParamsManager::
splitInt(String8 const& s8Input, Vector<int>& rOutput)
{
rOutput.clear();
//
if ( s8Input.isEmpty() )
{
MY_LOGW("empty string");
return false;
}
//
char const*start = s8Input.string();
char *end = NULL;
do {
int value = ::strtol(start, &end, 10);
if ( start == end ) {
MY_LOGW_IF(0, "no digits in str:%s", s8Input.string());
return false;
}
rOutput.push_back(value);
MY_LOGD_IF(0, "%d", value);
start = end + 1;
} while ( end && *end );
//
return (rOutput.size() > 0);
}
示例3: FileSource
// static
sp<DataSource> DataSource::CreateFromURI(
const char *uri, const KeyedVector<String8, String8> *headers) {
bool isWidevine = !strncasecmp("widevine://", uri, 11);
sp<DataSource> source;
if (!strncasecmp("file://", uri, 7)) {
source = new FileSource(uri + 7);
} else if (!strncasecmp("http://", uri, 7)
|| !strncasecmp("https://", uri, 8)
|| isWidevine) {
sp<HTTPBase> httpSource = HTTPBase::Create();
String8 tmp;
if (isWidevine) {
tmp = String8("http://");
tmp.append(uri + 11);
uri = tmp.string();
}
if (httpSource->connect(uri, headers) != OK) {
return NULL;
}
if (!isWidevine) {
String8 cacheConfig;
bool disconnectAtHighwatermark;
if (headers != NULL) {
KeyedVector<String8, String8> copy = *headers;
NuCachedSource2::RemoveCacheSpecificHeaders(
©, &cacheConfig, &disconnectAtHighwatermark);
}
source = new NuCachedSource2(
httpSource,
cacheConfig.isEmpty() ? NULL : cacheConfig.string());
} else {
// We do not want that prefetching, caching, datasource wrapper
// in the widevine:// case.
source = httpSource;
}
# if CHROMIUM_AVAILABLE
} else if (!strncasecmp("data:", uri, 5)) {
source = createDataUriSource(uri);
#endif
} else {
// Assume it's a filename.
source = new FileSource(uri);
}
if (source == NULL || source->initCheck() != OK) {
return NULL;
}
return source;
}
示例4: while
status_t PropertyMap::Parser::parse() {
while (!mTokenizer->isEof()) {
#if DEBUG_PARSER
ALOGD("Parsing %s: '%s'.", mTokenizer->getLocation().string(),
mTokenizer->peekRemainderOfLine().string());
#endif
mTokenizer->skipDelimiters(WHITESPACE);
if (!mTokenizer->isEol() && mTokenizer->peekChar() != '#') {
String8 keyToken = mTokenizer->nextToken(WHITESPACE_OR_PROPERTY_DELIMITER);
if (keyToken.isEmpty()) {
ALOGE("%s: Expected non-empty property key.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
mTokenizer->skipDelimiters(WHITESPACE);
if (mTokenizer->nextChar() != '=') {
ALOGE("%s: Expected '=' between property key and value.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
mTokenizer->skipDelimiters(WHITESPACE);
String8 valueToken = mTokenizer->nextToken(WHITESPACE);
if (valueToken.find("\\", 0) >= 0 || valueToken.find("\"", 0) >= 0) {
ALOGE("%s: Found reserved character '\\' or '\"' in property value.",
mTokenizer->getLocation().string());
return BAD_VALUE;
}
mTokenizer->skipDelimiters(WHITESPACE);
if (!mTokenizer->isEol()) {
ALOGE("%s: Expected end of line, got '%s'.",
mTokenizer->getLocation().string(),
mTokenizer->peekRemainderOfLine().string());
return BAD_VALUE;
}
if (mMap->hasProperty(keyToken)) {
ALOGE("%s: Duplicate property value for key '%s'.",
mTokenizer->getLocation().string(), keyToken.string());
return BAD_VALUE;
}
mMap->addProperty(keyToken, valueToken);
}
mTokenizer->nextLine();
}
return NO_ERROR;
}
示例5: readFromFile
static int readFromFile(const String8& path, char* buf, size_t size)
{
if (path.isEmpty())
return -1;
int fd = open(path.string(), O_RDONLY, 0);
if (fd == -1) {
ALOGE("Could not open '%s'", path.string());
return -1;
}
ssize_t count = read(fd, buf, size);
if (count > 0) {
while (count > 0 && buf[count-1] == '\n')
count--;
buf[count] = '\0';
} else {
buf[0] = '\0';
}
close(fd);
return count;
}
示例6: readFromFile
int BatteryMonitor::readFromFile(const String8& path, char* buf, size_t size) {
char *cp = NULL;
if (path.isEmpty())
return -1;
int fd = open(path.string(), O_RDONLY, 0);
if (fd == -1) {
KLOG_ERROR(LOG_TAG, "Could not open '%s'\n", path.string());
return -1;
}
ssize_t count = TEMP_FAILURE_RETRY(read(fd, buf, size));
if (count > 0)
cp = (char *)memrchr(buf, '\n', count);
if (cp)
*cp = '\0';
else
buf[0] = '\0';
close(fd);
return count;
}
示例7: setDisplayName
void DisplayDevice::setDisplayName(const String8& displayName) {
if (!displayName.isEmpty()) {
// never override the name with an empty name
mDisplayName = displayName;
}
}
示例8: if
status_t
CamAdapter::
setParameters()
{
MY_LOGD("+");
status_t ret = OK;
//
//(1) must set to mpPreviewCmdQueThread earlier than to 3A
if ( mpPreviewCmdQueThread != 0 )
{
if ( ! mpPreviewCmdQueThread->setParameters() )
{
MY_LOGE("mpPreviewCmdQueThread->setParameters fail");
}
}
else
{
MY_LOGE("mpPreviewCmdQueThread is NULL");
}
// (2) get Param from 3A
NS3A::Param_T cam3aParam;
Hal3ABase* p3AHal = Hal3ABase::createInstance(DevMetaInfo::queryHalSensorDev(getOpenId()));
if ( ! p3AHal )
{
MY_LOGE("p3AHal == NULL");
return INVALID_OPERATION;
}
//
if ( ! p3AHal->getParams(cam3aParam) )
{
MY_LOGE("getParams fail");
ret = INVALID_OPERATION;
goto lbExit;
}
//(3) set Param to 3A
#define UPDATE_PARAMS(param, eMapXXX, key) \
do { \
String8 const s = mpParamsMgr->getStr(key); \
if ( ! s.isEmpty() ) { \
param = PARAMSMANAGER_MAP_INST(eMapXXX)->valueFor(s); \
} \
} while (0)
// DEFAULT DEFINITION CATEGORY
cam3aParam.i4MinFps = 5000;
cam3aParam.i4MaxFps = 60000;
//
UPDATE_PARAMS(cam3aParam.u4AfMode, eMapFocusMode, CameraParameters::KEY_FOCUS_MODE);
UPDATE_PARAMS(cam3aParam.u4AwbMode, eMapWhiteBalance, CameraParameters::KEY_WHITE_BALANCE);
UPDATE_PARAMS(cam3aParam.u4SceneMode, eMapScene, CameraParameters::KEY_SCENE_MODE);
UPDATE_PARAMS(cam3aParam.u4StrobeMode, eMapFlashMode, CameraParameters::KEY_FLASH_MODE);
UPDATE_PARAMS(cam3aParam.u4EffectMode, eMapEffect, CameraParameters::KEY_EFFECT);
UPDATE_PARAMS(cam3aParam.u4AntiBandingMode, eMapAntiBanding, CameraParameters::KEY_ANTIBANDING);
//
cam3aParam.i4ExpIndex = mpParamsMgr->getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
cam3aParam.fExpCompStep = mpParamsMgr->getFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP);
//
// AE lock
{
String8 const s = mpParamsMgr->getStr(CameraParameters::KEY_AUTO_EXPOSURE_LOCK);
cam3aParam.bIsAELock = ( ! s.isEmpty() && s == CameraParameters::TRUE ) ? 1 : 0;
}
// AWB lock
{
String8 const s = mpParamsMgr->getStr(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK);
cam3aParam.bIsAWBLock = ( ! s.isEmpty() && s == CameraParameters::TRUE ) ? 1 : 0;
}
// AF Focus Areas
{
String8 const s8Area = mpParamsMgr->getStr(CameraParameters::KEY_FOCUS_AREAS);
if ( ! s8Area.isEmpty() )
{
MY_LOGD("Focus Areas:%s", s8Area.string());
const int maxNumFocusAreas = mpParamsMgr->getInt(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS);
List <camera_area_t> focusAreas;
mpParamsMgr->parseCamAreas(s8Area.string(), focusAreas, maxNumFocusAreas);
int index = 0;
for (List<camera_area_t>::iterator it = focusAreas.begin(); it != focusAreas.end(); it++) {
cam3aParam.rFocusAreas.rAreas[index].i4Left = it->left;
cam3aParam.rFocusAreas.rAreas[index].i4Top = it->top;
cam3aParam.rFocusAreas.rAreas[index].i4Right = it->right;
cam3aParam.rFocusAreas.rAreas[index].i4Bottom = it->bottom;
cam3aParam.rFocusAreas.rAreas[index].i4Weight = it->weight;
index++;
}
cam3aParam.rFocusAreas.u4Count = focusAreas.size();
}
}
// AE Metering Areas
{
String8 const s8Area = mpParamsMgr->getStr(CameraParameters::KEY_METERING_AREAS);
if ( ! s8Area.isEmpty() )
{
MY_LOGD("Metering Areas:%s", s8Area.string());
const int maxNumMeteringAreas = mpParamsMgr->getInt(CameraParameters::KEY_MAX_NUM_METERING_AREAS);
List <camera_area_t> meterAreas;
mpParamsMgr->parseCamAreas(s8Area.string(), meterAreas, maxNumMeteringAreas);
int index = 0;
//.........这里部分代码省略.........
示例9: CameraMetadata_dump
static void CameraMetadata_dump(JNIEnv *env, jobject thiz) {
ALOGV("%s", __FUNCTION__);
CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz);
if (metadata == NULL) {
return;
}
/*
* Create a socket pair for local streaming read/writes.
*
* The metadata will be dumped into the write side,
* and then read back out (and logged) via the read side.
*/
int writeFd, readFd;
{
int sv[2];
if (socketpair(AF_LOCAL, SOCK_STREAM, /*protocol*/0, &sv[0]) < 0) {
jniThrowExceptionFmt(env, "java/io/IOException",
"Failed to create socketpair (errno = %#x, message = '%s')",
errno, strerror(errno));
return;
}
writeFd = sv[0];
readFd = sv[1];
}
/*
* Create a thread for doing the writing.
*
* The reading and writing must be concurrent, otherwise
* the write will block forever once it exhausts the capped
* buffer size (from getsockopt).
*/
pthread_t writeThread;
DumpMetadataParams params = {
writeFd,
metadata
};
{
int threadRet = pthread_create(&writeThread, /*attr*/NULL,
CameraMetadata_writeMetadataThread, (void*)¶ms);
if (threadRet != 0) {
close(writeFd);
jniThrowExceptionFmt(env, "java/io/IOException",
"Failed to create thread for writing (errno = %#x, message = '%s')",
threadRet, strerror(threadRet));
}
}
/*
* Read out a byte until stream is complete. Write completed lines
* to ALOG.
*/
{
char out[] = {'\0', '\0'}; // large enough to append as a string
String8 logLine;
// Read one byte at a time! Very slow but avoids complicated \n scanning.
ssize_t res;
while ((res = TEMP_FAILURE_RETRY(read(readFd, &out[0], /*count*/1))) > 0) {
if (out[0] == '\n') {
ALOGD("%s", logLine.string());
logLine.clear();
} else {
logLine.append(out);
}
}
if (res < 0) {
jniThrowExceptionFmt(env, "java/io/IOException",
"Failed to read from fd (errno = %#x, message = '%s')",
errno, strerror(errno));
//return;
} else if (!logLine.isEmpty()) {
ALOGD("%s", logLine.string());
}
}
int res;
// Join until thread finishes. Ensures params/metadata is valid until then.
if ((res = pthread_join(writeThread, /*retval*/NULL)) != 0) {
ALOGE("%s: Failed to join thread (errno = %#x, message = '%s')",
__FUNCTION__, res, strerror(res));
}
}
开发者ID:PatrickSpitzer,项目名称:platform_frameworks_base,代码行数:91,代码来源:android_hardware_camera2_CameraMetadata.cpp
示例10: getPath
String8 KeyMap::getPath(const InputDeviceIdentifier& deviceIdentifier,
const String8& name, InputDeviceConfigurationFileType type) {
return name.isEmpty()
? getInputDeviceConfigurationFilePathByDeviceIdentifier(deviceIdentifier, type)
: getInputDeviceConfigurationFilePathByName(name, type);
}
示例11: doDump
//.........这里部分代码省略.........
// (but are retained here for documentary purposes.)
//bool specCompassFeature = false;
//bool specAccelerometerFeature = false;
//bool specProximityFeature = false;
//bool specAmbientLightFeature = false;
//bool specLiveWallpaperFeature = false;
int targetSdk = 0;
int smallScreen = 1;
int normalScreen = 1;
int largeScreen = 1;
int xlargeScreen = 1;
int anyDensity = 1;
int requiresSmallestWidthDp = 0;
int compatibleWidthLimitDp = 0;
int largestWidthLimitDp = 0;
String8 pkg;
String8 activityName;
String8 activityLabel;
String8 activityIcon;
String8 activityBanner;
String8 receiverName;
String8 serviceName;
Vector<String8> supportedInput;
FeatureGroup commonFeatures;
Vector<FeatureGroup> featureGroups;
KeyedVector<String8, ImpliedFeature> impliedFeatures;
while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
if (code == ResXMLTree::END_TAG) {
depth--;
if (depth < 2) {
if (withinSupportsInput && !supportedInput.isEmpty()) {
printf("supports-input: '");
const size_t N = supportedInput.size();
for (size_t i=0; i<N; i++) {
printf("%s", ResTable::normalizeForOutput(
supportedInput[i].string()).string());
if (i != N - 1) {
printf("' '");
} else {
printf("'\n");
}
}
supportedInput.clear();
}
withinApplication = false;
withinSupportsInput = false;
withinFeatureGroup = false;
} else if (depth < 3) {
if (withinActivity && isMainActivity) {
String8 aName(getComponentName(pkg, activityName));
if (isLauncherActivity) {
printf("launchable-activity:");
if (aName.length() > 0) {
printf(" name='%s' ",
ResTable::normalizeForOutput(aName.string()).string());
}
printf(" label='%s' icon='%s'\n",
ResTable::normalizeForOutput(activityLabel.string()).string(),
ResTable::normalizeForOutput(activityIcon.string()).string());
}
if (isLeanbackLauncherActivity) {
printf("leanback-launchable-activity:");
if (aName.length() > 0) {
示例12: main
//.........这里部分代码省略.........
break;
}
if (argv[i][1] == '-' && argv[i][2] == 0) {
++i; // Skip --.
break;
}
runtime.addOption(strdup(argv[i]));
ALOGV("app_process main add option '%s'", argv[i]);
}
// Parse runtime arguments. Stop at first unrecognized option.
bool zygote = false;
bool startSystemServer = false;
bool application = false;
String8 niceName;
String8 className;
++i; // Skip unused "parent dir" argument.
while (i < argc) {
const char* arg = argv[i++];
if (strcmp(arg, "--zygote") == 0) {
zygote = true;
niceName = ZYGOTE_NICE_NAME;
} else if (strcmp(arg, "--start-system-server") == 0) {
startSystemServer = true;
} else if (strcmp(arg, "--application") == 0) {
application = true;
} else if (strncmp(arg, "--nice-name=", 12) == 0) {
niceName.setTo(arg + 12);
} else if (strncmp(arg, "--", 2) != 0) {
className.setTo(arg);
break;
} else {
--i;
break;
}
}
Vector<String8> args;
if (!className.isEmpty()) {
// We're not in zygote mode, the only argument we need to pass
// to RuntimeInit is the application argument.
//
// The Remainder of args get passed to startup class main(). Make
// copies of them before we overwrite them with the process name.
args.add(application ? String8("application") : String8("tool"));
runtime.setClassNameAndArgs(className, argc - i, argv + i);
if (!LOG_NDEBUG) {
String8 restOfArgs;
char* const* argv_new = argv + i;
int argc_new = argc - i;
for (int k = 0; k < argc_new; ++k) {
restOfArgs.append("\"");
restOfArgs.append(argv_new[k]);
restOfArgs.append("\" ");
}
ALOGV("Class name = %s, args = %s", className.string(), restOfArgs.string());
}
} else {
// We're in zygote mode.
maybeCreateDalvikCache();
if (startSystemServer) {
args.add(String8("start-system-server"));
}
char prop[PROP_VALUE_MAX];
if (property_get(ABI_LIST_PROPERTY, prop, NULL) == 0) {
LOG_ALWAYS_FATAL("app_process: Unable to determine ABI list from property %s.",
ABI_LIST_PROPERTY);
return 11;
}
String8 abiFlag("--abi-list=");
abiFlag.append(prop);
args.add(abiFlag);
// In zygote mode, pass all remaining arguments to the zygote
// main() method.
for (; i < argc; ++i) {
args.add(String8(argv[i]));
}
}
if (!niceName.isEmpty()) {
runtime.setArgv0(niceName.string(), true /* setProcName */);
}
if (zygote) {
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
} else if (className) {
runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
} else {
fprintf(stderr, "Error: no class name or --zygote supplied.\n");
app_usage();
LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
}
}
示例13: find
//.........这里部分代码省略.........
#endif
return true;
}
if (exact) {
String8 absolutePath;
absolutePath.appendFormat("%s/%s.so", search, pattern.string());
if (!access(absolutePath.string(), R_OK)) {
result = absolutePath;
return true;
}
return false;
}
DIR* d = opendir(search);
if (d != NULL) {
struct dirent cur;
struct dirent* e;
while (readdir_r(d, &cur, &e) == 0 && e) {
if (e->d_type == DT_DIR) {
continue;
}
if (!strcmp(e->d_name, "libGLES_android.so")) {
// always skip the software renderer
continue;
}
if (strstr(e->d_name, pattern.string()) == e->d_name) {
if (!strcmp(e->d_name + strlen(e->d_name) - 3, ".so")) {
result.clear();
result.appendFormat("%s/%s", search, e->d_name);
closedir(d);
return true;
}
}
}
closedir(d);
}
return false;
}
};
String8 absolutePath = MatchFile::find(kind);
if (absolutePath.isEmpty()) {
// this happens often, we don't want to log an error
return 0;
}
const char* const driver_absolute_path = absolutePath.string();
void* dso = dlopen(driver_absolute_path, RTLD_NOW | RTLD_LOCAL);
if (dso == 0) {
const char* err = dlerror();
ALOGE("load_driver(%s): %s", driver_absolute_path, err?err:"unknown");
return 0;
}
ALOGD("loaded %s", driver_absolute_path);
if (mask & EGL) {
getProcAddress = (getProcAddressType)dlsym(dso, "eglGetProcAddress");
ALOGE_IF(!getProcAddress,
"can't find eglGetProcAddress() in %s", driver_absolute_path);
egl_t* egl = &cnx->egl;
__eglMustCastToProperFunctionPointerType* curr =
(__eglMustCastToProperFunctionPointerType*)egl;
char const * const * api = egl_names;
while (*api) {
char const * name = *api;
__eglMustCastToProperFunctionPointerType f =
(__eglMustCastToProperFunctionPointerType)dlsym(dso, name);
if (f == NULL) {
// couldn't find the entry-point, use eglGetProcAddress()
f = getProcAddress(name);
if (f == NULL) {
f = (__eglMustCastToProperFunctionPointerType)0;
}
}
*curr++ = f;
api++;
}
}
if (mask & GLESv1_CM) {
init_api(dso, gl_names,
(__eglMustCastToProperFunctionPointerType*)
&cnx->hooks[egl_connection_t::GLESv1_INDEX]->gl,
getProcAddress);
}
if (mask & GLESv2) {
init_api(dso, gl_names,
(__eglMustCastToProperFunctionPointerType*)
&cnx->hooks[egl_connection_t::GLESv2_INDEX]->gl,
getProcAddress);
}
return dso;
}
示例14: createFromParcel
status_t VendorTagDescriptor::createFromParcel(const Parcel* parcel,
/*out*/
sp<VendorTagDescriptor>& descriptor) {
status_t res = OK;
if (parcel == NULL) {
ALOGE("%s: parcel argument was NULL.", __FUNCTION__);
return BAD_VALUE;
}
int32_t tagCount = 0;
if ((res = parcel->readInt32(&tagCount)) != OK) {
ALOGE("%s: could not read tag count from parcel", __FUNCTION__);
return res;
}
if (tagCount < 0 || tagCount > INT32_MAX) {
ALOGE("%s: tag count %d from vendor ops is invalid.", __FUNCTION__, tagCount);
return BAD_VALUE;
}
sp<VendorTagDescriptor> desc = new VendorTagDescriptor();
desc->mTagCount = tagCount;
uint32_t tag, sectionIndex;
uint32_t maxSectionIndex = 0;
int32_t tagType;
Vector<uint32_t> allTags;
for (int32_t i = 0; i < tagCount; ++i) {
if ((res = parcel->readInt32(reinterpret_cast<int32_t*>(&tag))) != OK) {
ALOGE("%s: could not read tag id from parcel for index %d", __FUNCTION__, i);
break;
}
if (tag < CAMERA_METADATA_VENDOR_TAG_BOUNDARY) {
ALOGE("%s: vendor tag %d not in vendor tag section.", __FUNCTION__, tag);
res = BAD_VALUE;
break;
}
if ((res = parcel->readInt32(&tagType)) != OK) {
ALOGE("%s: could not read tag type from parcel for tag %d", __FUNCTION__, tag);
break;
}
if (tagType < 0 || tagType >= NUM_TYPES) {
ALOGE("%s: tag type %d from vendor ops does not exist.", __FUNCTION__, tagType);
res = BAD_VALUE;
break;
}
String8 tagName = parcel->readString8();
if (tagName.isEmpty()) {
ALOGE("%s: parcel tag name was NULL for tag %d.", __FUNCTION__, tag);
res = NOT_ENOUGH_DATA;
break;
}
if ((res = parcel->readInt32(reinterpret_cast<int32_t*>(§ionIndex))) != OK) {
ALOGE("%s: could not read section index for tag %d.", __FUNCTION__, tag);
break;
}
maxSectionIndex = (maxSectionIndex >= sectionIndex) ? maxSectionIndex : sectionIndex;
allTags.add(tag);
desc->mTagToNameMap.add(tag, tagName);
desc->mTagToSectionMap.add(tag, sectionIndex);
desc->mTagToTypeMap.add(tag, tagType);
}
if (res != OK) {
return res;
}
size_t sectionCount;
if (tagCount > 0) {
if ((res = parcel->readInt32(reinterpret_cast<int32_t*>(§ionCount))) != OK) {
ALOGE("%s: could not read section count for.", __FUNCTION__);
return res;
}
if (sectionCount < (maxSectionIndex + 1)) {
ALOGE("%s: Incorrect number of sections defined, received %zu, needs %d.",
__FUNCTION__, sectionCount, (maxSectionIndex + 1));
return BAD_VALUE;
}
LOG_ALWAYS_FATAL_IF(desc->mSections.setCapacity(sectionCount) <= 0,
"Vector capacity must be positive");
for (size_t i = 0; i < sectionCount; ++i) {
String8 sectionName = parcel->readString8();
if (sectionName.isEmpty()) {
ALOGE("%s: parcel section name was NULL for section %zu.",
__FUNCTION__, i);
return NOT_ENOUGH_DATA;
}
desc->mSections.add(sectionName);
}
}
LOG_ALWAYS_FATAL_IF(static_cast<size_t>(tagCount) != allTags.size(),
"tagCount must be the same as allTags size");
// Set up reverse mapping
for (size_t i = 0; i < static_cast<size_t>(tagCount); ++i) {
uint32_t tag = allTags[i];
String8 sectionString = desc->mSections[desc->mTagToSectionMap.valueFor(tag)];
//.........这里部分代码省略.........
示例15: parseMetaData
//.........这里部分代码省略.........
int64_t durationUs;
if (trackMeta->findInt64(kKeyDuration, &durationUs)) {
if (durationUs > maxDurationUs) {
maxDurationUs = durationUs;
}
}
const char *mime;
if (trackMeta->findCString(kKeyMIMEType, &mime)) {
if (!hasAudio && !strncasecmp("audio/", mime, 6)) {
hasAudio = true;
if (!trackMeta->findInt32(kKeyBitRate, &audioBitrate)) {
audioBitrate = -1;
}
} else if (!hasVideo && !strncasecmp("video/", mime, 6)) {
hasVideo = true;
CHECK(trackMeta->findInt32(kKeyWidth, &videoWidth));
CHECK(trackMeta->findInt32(kKeyHeight, &videoHeight));
if (!trackMeta->findInt32(kKeyRotation, &rotationAngle)) {
rotationAngle = 0;
}
} else if (!strcasecmp(mime, MEDIA_MIMETYPE_TEXT_3GPP)) {
const char *lang;
bool success = trackMeta->findCString(kKeyMediaLanguage, &lang);
if (success) {
timedTextLang.append(String8(lang));
timedTextLang.append(String8(":"));
} else {
ALOGE("No language found for timed text");
}
}
}
}
// To save the language codes for all timed text tracks
// If multiple text tracks present, the format will look
// like "eng:chi"
if (!timedTextLang.isEmpty()) {
mMetaData.add(METADATA_KEY_TIMED_TEXT_LANGUAGES, timedTextLang);
}
// The duration value is a string representing the duration in ms.
sprintf(tmp, "%lld", (maxDurationUs + 500) / 1000);
mMetaData.add(METADATA_KEY_DURATION, String8(tmp));
if (hasAudio) {
mMetaData.add(METADATA_KEY_HAS_AUDIO, String8("yes"));
}
if (hasVideo) {
mMetaData.add(METADATA_KEY_HAS_VIDEO, String8("yes"));
sprintf(tmp, "%d", videoWidth);
mMetaData.add(METADATA_KEY_VIDEO_WIDTH, String8(tmp));
sprintf(tmp, "%d", videoHeight);
mMetaData.add(METADATA_KEY_VIDEO_HEIGHT, String8(tmp));
sprintf(tmp, "%d", rotationAngle);
mMetaData.add(METADATA_KEY_VIDEO_ROTATION, String8(tmp));
}
if (numTracks == 1 && hasAudio && audioBitrate >= 0) {
sprintf(tmp, "%d", audioBitrate);
mMetaData.add(METADATA_KEY_BITRATE, String8(tmp));
} else {
off64_t sourceSize;
if (mSource->getSize(&sourceSize) == OK) {
int64_t avgBitRate = (int64_t)(sourceSize * 8E6 / maxDurationUs);
sprintf(tmp, "%lld", avgBitRate);
mMetaData.add(METADATA_KEY_BITRATE, String8(tmp));
}
}
if (numTracks == 1) {
const char *fileMIME;
CHECK(meta->findCString(kKeyMIMEType, &fileMIME));
if (!strcasecmp(fileMIME, "video/x-matroska")) {
sp<MetaData> trackMeta = mExtractor->getTrackMetaData(0);
const char *trackMIME;
CHECK(trackMeta->findCString(kKeyMIMEType, &trackMIME));
if (!strncasecmp("audio/", trackMIME, 6)) {
// The matroska file only contains a single audio track,
// rewrite its mime type.
mMetaData.add(
METADATA_KEY_MIMETYPE, String8("audio/x-matroska"));
}
}
}
// To check whether the media file is drm-protected
if (mExtractor->getDrmFlag()) {
mMetaData.add(METADATA_KEY_IS_DRM, String8("1"));
}
}