MediaProfiles.cpp revision c0a84782589eececdfa7e723e8aa0e572d0d79f5
11d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/* 21d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** 31d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** Copyright 2010, The Android Open Source Project 41d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** 51d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** Licensed under the Apache License, Version 2.0 (the "License"); 61d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** you may not use this file except in compliance with the License. 71d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** You may obtain a copy of the License at 81d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** 91d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** http://www.apache.org/licenses/LICENSE-2.0 101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** 111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** Unless required by applicable law or agreed to in writing, software 121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** distributed under the License is distributed on an "AS IS" BASIS, 131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** See the License for the specific language governing permissions and 151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** limitations under the License. 161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong*/ 171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong//#define LOG_NDEBUG 0 201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#define LOG_TAG "MediaProfiles" 211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#include <stdlib.h> 231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#include <utils/Log.h> 241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#include <utils/Vector.h> 251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#include <cutils/properties.h> 261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#include <expat.h> 271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#include <media/MediaProfiles.h> 281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#include <media/stagefright/MediaDebug.h> 291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongnamespace android { 311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 321d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMutex MediaProfiles::sLock; 331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongbool MediaProfiles::sIsInitialized = false; 341d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles *MediaProfiles::sInstance = NULL; 351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sVideoEncoderNameMap[] = { 371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"h263", VIDEO_ENCODER_H263}, 381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"h264", VIDEO_ENCODER_H264}, 391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"m4v", VIDEO_ENCODER_MPEG_4_SP} 401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sAudioEncoderNameMap[] = { 431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"amrnb", AUDIO_ENCODER_AMR_NB}, 441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"amrwb", AUDIO_ENCODER_AMR_WB}, 451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"aac", AUDIO_ENCODER_AAC}, 461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sFileFormatMap[] = { 491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"3gp", OUTPUT_FORMAT_THREE_GPP}, 501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"mp4", OUTPUT_FORMAT_MPEG_4} 511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sVideoDecoderNameMap[] = { 541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"wmv", VIDEO_DECODER_WMV} 551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sAudioDecoderNameMap[] = { 581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"wma", AUDIO_DECODER_WMA} 591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sCamcorderQualityNameMap[] = { 62c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"low", CAMCORDER_QUALITY_LOW}, 631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"high", CAMCORDER_QUALITY_HIGH}, 64c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"qcif", CAMCORDER_QUALITY_QCIF}, 65c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"480p", CAMCORDER_QUALITY_480P}, 66c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"720p", CAMCORDER_QUALITY_720P}, 67c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"1080p", CAMCORDER_QUALITY_1080P}, 68c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra 69c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapselow", CAMCORDER_QUALITY_TIME_LAPSE_LOW}, 70c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapsehigh", CAMCORDER_QUALITY_TIME_LAPSE_HIGH}, 71c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapseqcif", CAMCORDER_QUALITY_TIME_LAPSE_QCIF}, 72c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapse480p", CAMCORDER_QUALITY_TIME_LAPSE_480P}, 73c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapse720p", CAMCORDER_QUALITY_TIME_LAPSE_720P}, 74c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapse1080p", CAMCORDER_QUALITY_TIME_LAPSE_1080P} 751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 781d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logVideoCodec(const MediaProfiles::VideoCodec& codec) 791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("video codec:"); 811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", codec.mCodec); 821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("bit rate: %d", codec.mBitRate); 831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame width: %d", codec.mFrameWidth); 841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame height: %d", codec.mFrameHeight); 851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame rate: %d", codec.mFrameRate); 861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 891d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logAudioCodec(const MediaProfiles::AudioCodec& codec) 901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("audio codec:"); 921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", codec.mCodec); 931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("bit rate: %d", codec.mBitRate); 941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("sample rate: %d", codec.mSampleRate); 951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("number of channels: %d", codec.mChannels); 961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 991d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logVideoEncoderCap(const MediaProfiles::VideoEncoderCap& cap) 1001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("video encoder cap:"); 1021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", cap.mCodec); 1031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("bit rate: min = %d and max = %d", cap.mMinBitRate, cap.mMaxBitRate); 1041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame width: min = %d and max = %d", cap.mMinFrameWidth, cap.mMaxFrameWidth); 1051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame height: min = %d and max = %d", cap.mMinFrameHeight, cap.mMaxFrameHeight); 1061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame rate: min = %d and max = %d", cap.mMinFrameRate, cap.mMaxFrameRate); 1071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 1101d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logAudioEncoderCap(const MediaProfiles::AudioEncoderCap& cap) 1111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("audio encoder cap:"); 1131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", cap.mCodec); 1141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("bit rate: min = %d and max = %d", cap.mMinBitRate, cap.mMaxBitRate); 1151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("sample rate: min = %d and max = %d", cap.mMinSampleRate, cap.mMaxSampleRate); 1161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("number of channels: min = %d and max = %d", cap.mMinChannels, cap.mMaxChannels); 1171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 1201d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logVideoDecoderCap(const MediaProfiles::VideoDecoderCap& cap) 1211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("video decoder cap:"); 1231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", cap.mCodec); 1241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 1271d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logAudioDecoderCap(const MediaProfiles::AudioDecoderCap& cap) 1281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("audio codec cap:"); 1301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", cap.mCodec); 1311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ int 1341d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::findTagForName(const MediaProfiles::NameToTagMap *map, size_t nMappings, const char *name) 1351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int tag = -1; 1371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < nMappings; ++i) { 1381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp(map[i].name, name)) { 1391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong tag = map[i].tag; 1401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 1411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 1421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 1431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return tag; 1441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoCodec* 1471d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createVideoCodec(const char **atts, MediaProfiles *profiles) 1481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("codec", atts[0]) && 1501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("bitRate", atts[2]) && 1511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("width", atts[4]) && 1521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("height", atts[6]) && 1531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("frameRate", atts[8])); 1541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sVideoEncoderNameMap)/sizeof(sVideoEncoderNameMap[0]); 1561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sVideoEncoderNameMap, nMappings, atts[1]); 1571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 1581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoCodec *videoCodec = 1601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoCodec(static_cast<video_encoder>(codec), 1611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[3]), atoi(atts[5]), atoi(atts[7]), atoi(atts[9])); 1621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logVideoCodec(*videoCodec); 1631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong size_t nCamcorderProfiles; 1651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK((nCamcorderProfiles = profiles->mCamcorderProfiles.size()) >= 1); 1661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mCamcorderProfiles[nCamcorderProfiles - 1]->mVideoCodec = videoCodec; 1671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return videoCodec; 1681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioCodec* 1711d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createAudioCodec(const char **atts, MediaProfiles *profiles) 1721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("codec", atts[0]) && 1741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("bitRate", atts[2]) && 1751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("sampleRate", atts[4]) && 1761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("channels", atts[6])); 1771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sAudioEncoderNameMap)/sizeof(sAudioEncoderNameMap[0]); 1781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sAudioEncoderNameMap, nMappings, atts[1]); 1791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 1801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioCodec *audioCodec = 1821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioCodec(static_cast<audio_encoder>(codec), 1831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[3]), atoi(atts[5]), atoi(atts[7])); 1841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logAudioCodec(*audioCodec); 1851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong size_t nCamcorderProfiles; 1871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK((nCamcorderProfiles = profiles->mCamcorderProfiles.size()) >= 1); 1881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mCamcorderProfiles[nCamcorderProfiles - 1]->mAudioCodec = audioCodec; 1891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return audioCodec; 1901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioDecoderCap* 1921d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createAudioDecoderCap(const char **atts) 1931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0]) && 1951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("enabled", atts[2])); 1961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sAudioDecoderNameMap)/sizeof(sAudioDecoderNameMap[0]); 1981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sAudioDecoderNameMap, nMappings, atts[1]); 1991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 2001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioDecoderCap *cap = 2021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioDecoderCap(static_cast<audio_decoder>(codec)); 2031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logAudioDecoderCap(*cap); 2041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return cap; 2051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoDecoderCap* 2081d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createVideoDecoderCap(const char **atts) 2091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0]) && 2111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("enabled", atts[2])); 2121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sVideoDecoderNameMap)/sizeof(sVideoDecoderNameMap[0]); 2141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sVideoDecoderNameMap, nMappings, atts[1]); 2151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 2161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoDecoderCap *cap = 2181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoDecoderCap(static_cast<video_decoder>(codec)); 2191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logVideoDecoderCap(*cap); 2201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return cap; 2211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoEncoderCap* 2241d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createVideoEncoderCap(const char **atts) 2251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0]) && 2271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("enabled", atts[2]) && 2281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minBitRate", atts[4]) && 2291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxBitRate", atts[6]) && 2301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minFrameWidth", atts[8]) && 2311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxFrameWidth", atts[10]) && 2321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minFrameHeight", atts[12]) && 2331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxFrameHeight", atts[14]) && 2341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minFrameRate", atts[16]) && 2351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxFrameRate", atts[18])); 2361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sVideoEncoderNameMap)/sizeof(sVideoEncoderNameMap[0]); 2381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sVideoEncoderNameMap, nMappings, atts[1]); 2391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 2401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoEncoderCap *cap = 2421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoEncoderCap(static_cast<video_encoder>(codec), 2431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[5]), atoi(atts[7]), atoi(atts[9]), atoi(atts[11]), atoi(atts[13]), 2441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[15]), atoi(atts[17]), atoi(atts[19])); 2451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logVideoEncoderCap(*cap); 2461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return cap; 2471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioEncoderCap* 2501d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createAudioEncoderCap(const char **atts) 2511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0]) && 2531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("enabled", atts[2]) && 2541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minBitRate", atts[4]) && 2551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxBitRate", atts[6]) && 2561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minSampleRate", atts[8]) && 2571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxSampleRate", atts[10]) && 2581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minChannels", atts[12]) && 2591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxChannels", atts[14])); 2601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sAudioEncoderNameMap)/sizeof(sAudioEncoderNameMap[0]); 2621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sAudioEncoderNameMap, nMappings, atts[1]); 2631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 2641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioEncoderCap *cap = 2661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioEncoderCap(static_cast<audio_encoder>(codec), atoi(atts[5]), atoi(atts[7]), 2671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[9]), atoi(atts[11]), atoi(atts[13]), 2681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[15])); 2691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logAudioEncoderCap(*cap); 2701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return cap; 2711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ output_format 2741d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createEncoderOutputFileFormat(const char **atts) 2751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0])); 2771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings =sizeof(sFileFormatMap)/sizeof(sFileFormatMap[0]); 2791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int format = findTagForName(sFileFormatMap, nMappings, atts[1]); 2801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(format != -1); 2811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return static_cast<output_format>(format); 2831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::CamcorderProfile* 2863eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangMediaProfiles::createCamcorderProfile(int cameraId, const char **atts) 2871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("quality", atts[0]) && 2891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("fileFormat", atts[2]) && 2901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("duration", atts[4])); 2911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nProfileMappings = sizeof(sCamcorderQualityNameMap)/sizeof(sCamcorderQualityNameMap[0]); 2931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int quality = findTagForName(sCamcorderQualityNameMap, nProfileMappings, atts[1]); 2941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(quality != -1); 2951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nFormatMappings = sizeof(sFileFormatMap)/sizeof(sFileFormatMap[0]); 2971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int fileFormat = findTagForName(sFileFormatMap, nFormatMappings, atts[3]); 2981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(fileFormat != -1); 2991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 3013eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profile->mCameraId = cameraId; 3021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mFileFormat = static_cast<output_format>(fileFormat); 3031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mQuality = static_cast<camcorder_quality>(quality); 3041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mDuration = atoi(atts[5]); 3051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profile; 3061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 3071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3083eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangMediaProfiles::ImageEncodingQualityLevels* 3093eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangMediaProfiles::findImageEncodingQualityLevels(int cameraId) const 3103eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang{ 3113eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang int n = mImageEncodingQualityLevels.size(); 3123eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang for (int i = 0; i < n; i++) { 3133eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang ImageEncodingQualityLevels *levels = mImageEncodingQualityLevels[i]; 3143eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (levels->mCameraId == cameraId) { 3153eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang return levels; 3163eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } 3173eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } 3183eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang return NULL; 3193eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang} 3203eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang 3213eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Changvoid MediaProfiles::addImageEncodingQualityLevel(int cameraId, const char** atts) 322f5a8385649204213dc19e1a64f4693931e048d85James Dong{ 323f5a8385649204213dc19e1a64f4693931e048d85James Dong CHECK(!strcmp("quality", atts[0])); 3243eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang int quality = atoi(atts[1]); 3253eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang LOGV("%s: cameraId=%d, quality=%d\n", __func__, cameraId, quality); 3263eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang ImageEncodingQualityLevels *levels = findImageEncodingQualityLevels(cameraId); 3273eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang 3283eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (levels == NULL) { 3293eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels = new ImageEncodingQualityLevels(); 3303eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mCameraId = cameraId; 3313eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang mImageEncodingQualityLevels.add(levels); 3323eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } 3333eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang 3343eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mLevels.add(quality); 3353eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang} 3363eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang 3373eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang/*static*/ int 3383eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangMediaProfiles::getCameraId(const char** atts) 3393eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang{ 3403eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (!atts[0]) return 0; // default cameraId = 0 3413eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang CHECK(!strcmp("cameraId", atts[0])); 342f5a8385649204213dc19e1a64f4693931e048d85James Dong return atoi(atts[1]); 343f5a8385649204213dc19e1a64f4693931e048d85James Dong} 344f5a8385649204213dc19e1a64f4693931e048d85James Dong 3451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 3461d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::startElementHandler(void *userData, const char *name, const char **atts) 3471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 3481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles *profiles = (MediaProfiles *) userData; 3491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (strcmp("Video", name) == 0) { 3501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createVideoCodec(atts, profiles); 3511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("Audio", name) == 0) { 3521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createAudioCodec(atts, profiles); 3531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("VideoEncoderCap", name) == 0 && 3541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 3551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoEncoders.add(createVideoEncoderCap(atts)); 3561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("AudioEncoderCap", name) == 0 && 3571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 3581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioEncoders.add(createAudioEncoderCap(atts)); 3591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("VideoDecoderCap", name) == 0 && 3601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 3611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoDecoders.add(createVideoDecoderCap(atts)); 3621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("AudioDecoderCap", name) == 0 && 3631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 3641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioDecoders.add(createAudioDecoderCap(atts)); 3651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("EncoderOutputFileFormat", name) == 0) { 3661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mEncoderOutputFileFormats.add(createEncoderOutputFileFormat(atts)); 3673eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } else if (strcmp("CamcorderProfiles", name) == 0) { 3683eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profiles->mCurrentCameraId = getCameraId(atts); 3691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("EncoderProfile", name) == 0) { 3703eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profiles->mCamcorderProfiles.add( 3713eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang createCamcorderProfile(profiles->mCurrentCameraId, atts)); 372f5a8385649204213dc19e1a64f4693931e048d85James Dong } else if (strcmp("ImageEncoding", name) == 0) { 3733eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profiles->addImageEncodingQualityLevel(profiles->mCurrentCameraId, atts); 3741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 3751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 3761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles* 3781d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::getInstance() 3791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 3801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("getInstance"); 3811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Mutex::Autolock lock(sLock); 3821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!sIsInitialized) { 3831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong char value[PROPERTY_VALUE_MAX]; 3841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (property_get("media.settings.xml", value, NULL) <= 0) { 3851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const char *defaultXmlFile = "/etc/media_profiles.xml"; 3861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong FILE *fp = fopen(defaultXmlFile, "r"); 3871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (fp == NULL) { 3881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGW("could not find media config xml file"); 3891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sInstance = createDefaultInstance(); 3901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else { 3911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong fclose(fp); // close the file first. 3921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sInstance = createInstanceFromXmlFile(defaultXmlFile); 3931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 3941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else { 3951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sInstance = createInstanceFromXmlFile(value); 3961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 3971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 3981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return sInstance; 4001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoEncoderCap* 4031d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultH263VideoEncoderCap() 4041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return new MediaProfiles::VideoEncoderCap( 4061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong VIDEO_ENCODER_H263, 192000, 420000, 176, 352, 144, 288, 1, 20); 4071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoEncoderCap* 4101d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultM4vVideoEncoderCap() 4111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return new MediaProfiles::VideoEncoderCap( 4131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong VIDEO_ENCODER_MPEG_4_SP, 192000, 420000, 176, 352, 144, 288, 1, 20); 4141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 4181d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultVideoEncoders(MediaProfiles *profiles) 4191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoEncoders.add(createDefaultH263VideoEncoderCap()); 4211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoEncoders.add(createDefaultM4vVideoEncoderCap()); 4221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::CamcorderProfile* 425c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun KwatraMediaProfiles::createDefaultCamcorderTimeLapseHighProfile() 426c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra{ 427c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra MediaProfiles::VideoCodec *videoCodec = 428c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra new MediaProfiles::VideoCodec(VIDEO_ENCODER_H263, 20000000, 720, 480, 20); 429c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra 430c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra AudioCodec *audioCodec = new AudioCodec(AUDIO_ENCODER_AMR_NB, 12200, 8000, 1); 431c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 432c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mCameraId = 0; 433c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mFileFormat = OUTPUT_FORMAT_THREE_GPP; 434c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mQuality = CAMCORDER_QUALITY_TIME_LAPSE_HIGH; 435c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mDuration = 60; 436c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mVideoCodec = videoCodec; 437c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mAudioCodec = audioCodec; 438c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra return profile; 439c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra} 440c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra 441c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra/*static*/ MediaProfiles::CamcorderProfile* 442c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun KwatraMediaProfiles::createDefaultCamcorderTimeLapseLowProfile() 443c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra{ 444c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra MediaProfiles::VideoCodec *videoCodec = 445c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra new MediaProfiles::VideoCodec(VIDEO_ENCODER_H263, 1000000, 176, 144, 20); 446c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra 447c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra AudioCodec *audioCodec = new AudioCodec(AUDIO_ENCODER_AMR_NB, 12200, 8000, 1); 448c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 449c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mCameraId = 0; 450c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mFileFormat = OUTPUT_FORMAT_THREE_GPP; 451c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mQuality = CAMCORDER_QUALITY_TIME_LAPSE_LOW; 452c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mDuration = 60; 453c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mVideoCodec = videoCodec; 454c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mAudioCodec = audioCodec; 455c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra return profile; 456c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra} 457c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra 458c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra/*static*/ MediaProfiles::CamcorderProfile* 4591d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultCamcorderHighProfile() 4601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoCodec *videoCodec = 4621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoCodec(VIDEO_ENCODER_H263, 360000, 352, 288, 20); 4631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong AudioCodec *audioCodec = new AudioCodec(AUDIO_ENCODER_AMR_NB, 12200, 8000, 1); 4653eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 4663eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profile->mCameraId = 0; 4671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mFileFormat = OUTPUT_FORMAT_THREE_GPP; 4681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mQuality = CAMCORDER_QUALITY_HIGH; 4691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mDuration = 60; 4701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mVideoCodec = videoCodec; 4711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mAudioCodec = audioCodec; 4721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profile; 4731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::CamcorderProfile* 4761d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultCamcorderLowProfile() 4771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoCodec *videoCodec = 4791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoCodec(VIDEO_ENCODER_H263, 192000, 176, 144, 20); 4801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioCodec *audioCodec = 4821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioCodec(AUDIO_ENCODER_AMR_NB, 12200, 8000, 1); 4831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 4853eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profile->mCameraId = 0; 4861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mFileFormat = OUTPUT_FORMAT_THREE_GPP; 4871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mQuality = CAMCORDER_QUALITY_LOW; 4881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mDuration = 30; 4891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mVideoCodec = videoCodec; 4901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mAudioCodec = audioCodec; 4911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profile; 4921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 4951d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultCamcorderProfiles(MediaProfiles *profiles) 4961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 497c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profiles->mCamcorderProfiles.add(createDefaultCamcorderTimeLapseHighProfile()); 498c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profiles->mCamcorderProfiles.add(createDefaultCamcorderTimeLapseLowProfile()); 4991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mCamcorderProfiles.add(createDefaultCamcorderHighProfile()); 5001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mCamcorderProfiles.add(createDefaultCamcorderLowProfile()); 5011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 5021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 5041d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultAudioEncoders(MediaProfiles *profiles) 5051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioEncoders.add(createDefaultAmrNBEncoderCap()); 5071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 5081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 5101d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultVideoDecoders(MediaProfiles *profiles) 5111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoDecoderCap *cap = 5131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoDecoderCap(VIDEO_DECODER_WMV); 5141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoDecoders.add(cap); 5161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 5171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 5191d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultAudioDecoders(MediaProfiles *profiles) 5201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioDecoderCap *cap = 5221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioDecoderCap(AUDIO_DECODER_WMA); 5231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioDecoders.add(cap); 5251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 5261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 5281d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultEncoderOutputFileFormats(MediaProfiles *profiles) 5291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mEncoderOutputFileFormats.add(OUTPUT_FORMAT_THREE_GPP); 5311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mEncoderOutputFileFormats.add(OUTPUT_FORMAT_MPEG_4); 5321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 5331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioEncoderCap* 5351d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultAmrNBEncoderCap() 5361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return new MediaProfiles::AudioEncoderCap( 5381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong AUDIO_ENCODER_AMR_NB, 5525, 12200, 8000, 8000, 1, 1); 5391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 5401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 541f5a8385649204213dc19e1a64f4693931e048d85James Dong/*static*/ void 542f5a8385649204213dc19e1a64f4693931e048d85James DongMediaProfiles::createDefaultImageEncodingQualityLevels(MediaProfiles *profiles) 543f5a8385649204213dc19e1a64f4693931e048d85James Dong{ 5443eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang ImageEncodingQualityLevels *levels = new ImageEncodingQualityLevels(); 5453eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mCameraId = 0; 5463eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mLevels.add(70); 5473eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mLevels.add(80); 5483eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mLevels.add(90); 5493eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profiles->mImageEncodingQualityLevels.add(levels); 550f5a8385649204213dc19e1a64f4693931e048d85James Dong} 551f5a8385649204213dc19e1a64f4693931e048d85James Dong 5521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles* 5531d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultInstance() 5541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles *profiles = new MediaProfiles; 5561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultCamcorderProfiles(profiles); 5571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultVideoEncoders(profiles); 5581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultAudioEncoders(profiles); 5591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultVideoDecoders(profiles); 5601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultAudioDecoders(profiles); 5611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultEncoderOutputFileFormats(profiles); 562f5a8385649204213dc19e1a64f4693931e048d85James Dong createDefaultImageEncodingQualityLevels(profiles); 5631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sIsInitialized = true; 5641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profiles; 5651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 5661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles* 5681d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createInstanceFromXmlFile(const char *xml) 5691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong FILE *fp = NULL; 5711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK((fp = fopen(xml, "r"))); 5721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong XML_Parser parser = ::XML_ParserCreate(NULL); 5741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(parser != NULL); 5751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles *profiles = new MediaProfiles(); 5771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::XML_SetUserData(parser, profiles); 5781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::XML_SetElementHandler(parser, startElementHandler, NULL); 5791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong /* 5811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong FIXME: 5821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong expat is not compiled with -DXML_DTD. We don't have DTD parsing support. 5831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!::XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS)) { 5851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("failed to enable DTD support in the xml file"); 5861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return UNKNOWN_ERROR; 5871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong */ 5901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int BUFF_SIZE = 512; 5921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (;;) { 5931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong void *buff = ::XML_GetBuffer(parser, BUFF_SIZE); 5941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (buff == NULL) { 5951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("failed to in call to XML_GetBuffer()"); 5961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete profiles; 5971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles = NULL; 5981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong goto exit; 5991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int bytes_read = ::fread(buff, 1, BUFF_SIZE, fp); 6021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (bytes_read < 0) { 6031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("failed in call to read"); 6041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete profiles; 6051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles = NULL; 6061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong goto exit; 6071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(::XML_ParseBuffer(parser, bytes_read, bytes_read == 0)); 6101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (bytes_read == 0) break; // done parsing the xml file 6121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongexit: 6151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::XML_ParserFree(parser); 6161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::fclose(fp); 6171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (profiles) { 6181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sIsInitialized = true; 6191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profiles; 6211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6231d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<output_format> MediaProfiles::getOutputFileFormats() const 6241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return mEncoderOutputFileFormats; // copy out 6261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6281d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<video_encoder> MediaProfiles::getVideoEncoders() const 6291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<video_encoder> encoders; 6311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoEncoders.size(); ++i) { 6321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong encoders.add(mVideoEncoders[i]->mCodec); 6331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return encoders; // copy out 6351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongint MediaProfiles::getVideoEncoderParamByName(const char *name, video_encoder codec) const 6381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("getVideoEncoderParamByName: %s for codec %d", name, codec); 6401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int index = -1; 6411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0, n = mVideoEncoders.size(); i < n; ++i) { 6421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (mVideoEncoders[i]->mCodec == codec) { 6431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong index = i; 6441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 6451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (index == -1) { 6481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given video encoder %d is not found", codec); 6491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 6501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.width.min", name)) return mVideoEncoders[index]->mMinFrameWidth; 6531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.width.max", name)) return mVideoEncoders[index]->mMaxFrameWidth; 6541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.height.min", name)) return mVideoEncoders[index]->mMinFrameHeight; 6551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.height.max", name)) return mVideoEncoders[index]->mMaxFrameHeight; 6561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.bps.min", name)) return mVideoEncoders[index]->mMinBitRate; 6571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.bps.max", name)) return mVideoEncoders[index]->mMaxBitRate; 6581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.fps.min", name)) return mVideoEncoders[index]->mMinFrameRate; 6591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.fps.max", name)) return mVideoEncoders[index]->mMaxFrameRate; 6601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given video encoder param name %s is not found", name); 6621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 6631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6651d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<audio_encoder> MediaProfiles::getAudioEncoders() const 6661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<audio_encoder> encoders; 6681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioEncoders.size(); ++i) { 6691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong encoders.add(mAudioEncoders[i]->mCodec); 6701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return encoders; // copy out 6721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongint MediaProfiles::getAudioEncoderParamByName(const char *name, audio_encoder codec) const 6751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("getAudioEncoderParamByName: %s for codec %d", name, codec); 6771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int index = -1; 6781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0, n = mAudioEncoders.size(); i < n; ++i) { 6791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (mAudioEncoders[i]->mCodec == codec) { 6801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong index = i; 6811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 6821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (index == -1) { 6851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given audio encoder %d is not found", codec); 6861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 6871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.ch.min", name)) return mAudioEncoders[index]->mMinChannels; 6901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.ch.max", name)) return mAudioEncoders[index]->mMaxChannels; 6911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.bps.min", name)) return mAudioEncoders[index]->mMinBitRate; 6921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.bps.max", name)) return mAudioEncoders[index]->mMaxBitRate; 6931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.hz.min", name)) return mAudioEncoders[index]->mMinSampleRate; 6941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.hz.max", name)) return mAudioEncoders[index]->mMaxSampleRate; 6951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given audio encoder param name %s is not found", name); 6971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 6981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7001d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<video_decoder> MediaProfiles::getVideoDecoders() const 7011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 7021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<video_decoder> decoders; 7031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoDecoders.size(); ++i) { 7041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong decoders.add(mVideoDecoders[i]->mCodec); 7051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 7061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return decoders; // copy out 7071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 7081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7091d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<audio_decoder> MediaProfiles::getAudioDecoders() const 7101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 7111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<audio_decoder> decoders; 7121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioDecoders.size(); ++i) { 7131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong decoders.add(mAudioDecoders[i]->mCodec); 7141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 7151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return decoders; // copy out 7161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 7171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7183eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Changint MediaProfiles::getCamcorderProfileParamByName(const char *name, 7193eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang int cameraId, 7203eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang camcorder_quality quality) const 7211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 7223eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang LOGV("getCamcorderProfileParamByName: %s for camera %d, quality %d", 7233eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang name, cameraId, quality); 7241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int index = -1; 7261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0, n = mCamcorderProfiles.size(); i < n; ++i) { 7273eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (mCamcorderProfiles[i]->mCameraId == cameraId && 7283eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang mCamcorderProfiles[i]->mQuality == quality) { 7291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong index = i; 7301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 7311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 7321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 7331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (index == -1) { 7343eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang LOGE("The given camcorder profile camera %d quality %d is not found", 7353eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang cameraId, quality); 7361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 7371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 7381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 739f5a8385649204213dc19e1a64f4693931e048d85James Dong if (!strcmp("duration", name)) return mCamcorderProfiles[index]->mDuration; 7401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("file.format", name)) return mCamcorderProfiles[index]->mFileFormat; 7411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.codec", name)) return mCamcorderProfiles[index]->mVideoCodec->mCodec; 7421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.width", name)) return mCamcorderProfiles[index]->mVideoCodec->mFrameWidth; 7431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.height", name)) return mCamcorderProfiles[index]->mVideoCodec->mFrameHeight; 7441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.bps", name)) return mCamcorderProfiles[index]->mVideoCodec->mBitRate; 7451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.fps", name)) return mCamcorderProfiles[index]->mVideoCodec->mFrameRate; 7461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.codec", name)) return mCamcorderProfiles[index]->mAudioCodec->mCodec; 7471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.bps", name)) return mCamcorderProfiles[index]->mAudioCodec->mBitRate; 7481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.ch", name)) return mCamcorderProfiles[index]->mAudioCodec->mChannels; 7491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.hz", name)) return mCamcorderProfiles[index]->mAudioCodec->mSampleRate; 7501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7513eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang LOGE("The given camcorder profile param id %d name %s is not found", cameraId, name); 7521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 7531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 7541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7553eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangVector<int> MediaProfiles::getImageEncodingQualityLevels(int cameraId) const 756f5a8385649204213dc19e1a64f4693931e048d85James Dong{ 7573eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang Vector<int> result; 7583eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang ImageEncodingQualityLevels *levels = findImageEncodingQualityLevels(cameraId); 7593eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (levels != NULL) { 7603eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang result = levels->mLevels; // copy out 7613eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } 7623eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang return result; 763f5a8385649204213dc19e1a64f4693931e048d85James Dong} 764f5a8385649204213dc19e1a64f4693931e048d85James Dong 7651d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::~MediaProfiles() 7661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 7671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK("destructor should never be called" == 0); 7681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#if 0 7691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioEncoders.size(); ++i) { 7701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mAudioEncoders[i]; 7711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 7721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mAudioEncoders.clear(); 7731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoEncoders.size(); ++i) { 7751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mVideoEncoders[i]; 7761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 7771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mVideoEncoders.clear(); 7781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoDecoders.size(); ++i) { 7801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mVideoDecoders[i]; 7811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 7821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mVideoDecoders.clear(); 7831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioDecoders.size(); ++i) { 7851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mAudioDecoders[i]; 7861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 7871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mAudioDecoders.clear(); 7881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mCamcorderProfiles.size(); ++i) { 7901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mCamcorderProfiles[i]; 7911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 7921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mCamcorderProfiles.clear(); 7931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#endif 7941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 7951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} // namespace android 796