三、Libmedia层介绍

在文件/framework/base/media/libmedia/MediaProfiles.cpp中实现了MediaProfilesgetInstance()getImageEncodingQualityLevels(),其code如下:

/*static*/ MediaProfiles*

MediaProfiles::getInstance()

{

LOGV("getInstance");

Mutex::Autolock lock(sLock);

if (!sIsInitialized) {

char value[PROPERTY_VALUE_MAX];

if (property_get("media.settings.xml", value, NULL) <= 0) {

const char *defaultXmlFile = "/etc/media_profiles.xml";

FILE *fp = fopen(defaultXmlFile, "r");

if (fp == NULL) {

LOGW("could not find media config xml file");

sInstance = createDefaultInstance();

} else {

fclose(fp); // close the file first.

sInstance = createInstanceFromXmlFile(defaultXmlFile);

}

} else {

sInstance = createInstanceFromXmlFile(value);

}

}

return sInstance;

}

该函数中判断,如果"/etc/media_profiles.xml"存在就调用函数

createInstanceFromXmlFile()去解析该xml文件,否则调用createDefaultInstance()创建默认的数值。

函数createDefaultInstance()的实现如下:

/*static*/ MediaProfiles*

MediaProfiles::createDefaultInstance()

{

MediaProfiles *profiles = new MediaProfiles;

createDefaultCamcorderProfiles(profiles);

createDefaultVideoEncoders(profiles);

createDefaultAudioEncoders(profiles);

createDefaultVideoDecoders(profiles);

createDefaultAudioDecoders(profiles);

createDefaultEncoderOutputFileFormats(profiles);

createDefaultImageEncodingQualityLevels(profiles);

sIsInitialized = true;

return profiles;

}

函数createDefaultImageEncodingQualityLevels()实现如下:

/*static*/ void

MediaProfiles::createDefaultImageEncodingQualityLevels(MediaProfiles *profiles)

{

profiles->mImageEncodingQualityLevels.add(70);

profiles->mImageEncodingQualityLevels.add(80);

profiles->mImageEncodingQualityLevels.add(90);

}

由此,可以看出,默认情况下,会将708090做为jpeg quality的三个quality等级对应的数值。

如果xml文件存在,就需要看看函数createInstanceFromXmlFile()了,其定义为:

/*static*/ MediaProfiles*

MediaProfiles::createInstanceFromXmlFile(const char *xml)

{

FILE *fp = NULL;

CHECK((fp = fopen(xml, "r")));

XML_Parser parser = ::XML_ParserCreate(NULL);

CHECK(parser != NULL);

MediaProfiles *profiles = new MediaProfiles();

::XML_SetUserData(parser, profiles);

::XML_SetElementHandler(parser, startElementHandler, NULL);

/*

FIXME:

expat is not compiled with -DXML_DTD. We don't have DTD parsing support.

if (!::XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS)) {

LOGE("failed to enable DTD support in the xml file");

return UNKNOWN_ERROR;

}

*/

const int BUFF_SIZE = 512;

for (;;) {

void *buff = ::XML_GetBuffer(parser, BUFF_SIZE);

if (buff == NULL) {

LOGE("failed to in call to XML_GetBuffer()");

delete profiles;

profiles = NULL;

goto exit;

}

int bytes_read = ::fread(buff, 1, BUFF_SIZE, fp);

if (bytes_read < 0) {

LOGE("failed in call to read");

delete profiles;

profiles = NULL;

goto exit;

}

CHECK(::XML_ParseBuffer(parser, bytes_read, bytes_read == 0));

if (bytes_read == 0) break; // done parsing the xml file

}

exit:

::XML_ParserFree(parser);

::fclose(fp);

if (profiles) {

sIsInitialized = true;

}

return profiles;

}

函数getImageEncodingQualityLevels()的定义为:

Vector<int> MediaProfiles::getImageEncodingQualityLevels() const

{

return mImageEncodingQualityLevels; // copy out

}

只需返回存储了jpeg quality数值的数组mImageEncodingQualityLevels就行了。

四、小结

通过研究jpeg quality的菜单,简单了解了JNI接口的注册和实现流程。虽然里面还有不少不大清楚地地方,但此记录可以帮助日后使用JNI接口时使用。

E-mailwxiaozhe@163.com

QQ1226062415
Date
2011/5/14
Blog
http://blog.csdn.net/wxzking

欢迎交流,欢迎转载,转载时请保留以上信息。

更多相关文章

  1. Android(安卓)Studio 与svn
  2. Android中不混淆类中函数
  3. ANDROID 一键搞定JNI创建C头文件
  4. android SElinux 总结--启用,关闭以及配置文件说明,很详细,值得学习
  5. android 调用视图报错The specified child already has a parent
  6. 大话企业级Android应用开发实战 音乐播放器的开发
  7. Android使用gradle的管理本地Maven服务器
  8. Android(安卓)相对布局中的 代码中修改属性与布局文件的设置不同
  9. 私有析构函数 Android(安卓)代码分析

随机推荐

  1. android基础知识12:android自动化测试04—
  2. Ubuntu中useradd和adduser的区别
  3. 15、Android之Adapter用法总结
  4. Android知识体系总结之Android部分之通知
  5. Android(安卓)图片库Glide - Glide3.x 官
  6. Android安装器学习笔记(一)
  7. Android 尺寸单位转换和屏幕适配相关
  8. 2011.07.14——— android res与assets的
  9. Android(安卓)Q之提前适配攻略(五)(存储权限
  10. Android 屏幕适配:最全面的解决方案