MediaProfiles.cpp revision f5a8385649204213dc19e1a64f4693931e048d85
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[] = { 621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"high", CAMCORDER_QUALITY_HIGH}, 631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"low", CAMCORDER_QUALITY_LOW} 641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 671d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logVideoCodec(const MediaProfiles::VideoCodec& codec) 681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("video codec:"); 701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", codec.mCodec); 711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("bit rate: %d", codec.mBitRate); 721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame width: %d", codec.mFrameWidth); 731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame height: %d", codec.mFrameHeight); 741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame rate: %d", codec.mFrameRate); 751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 781d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logAudioCodec(const MediaProfiles::AudioCodec& codec) 791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("audio codec:"); 811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", codec.mCodec); 821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("bit rate: %d", codec.mBitRate); 831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("sample rate: %d", codec.mSampleRate); 841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("number of channels: %d", codec.mChannels); 851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 881d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logVideoEncoderCap(const MediaProfiles::VideoEncoderCap& cap) 891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("video encoder cap:"); 911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", cap.mCodec); 921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("bit rate: min = %d and max = %d", cap.mMinBitRate, cap.mMaxBitRate); 931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame width: min = %d and max = %d", cap.mMinFrameWidth, cap.mMaxFrameWidth); 941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame height: min = %d and max = %d", cap.mMinFrameHeight, cap.mMaxFrameHeight); 951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame rate: min = %d and max = %d", cap.mMinFrameRate, cap.mMaxFrameRate); 961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 991d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logAudioEncoderCap(const MediaProfiles::AudioEncoderCap& cap) 1001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("audio 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("sample rate: min = %d and max = %d", cap.mMinSampleRate, cap.mMaxSampleRate); 1051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("number of channels: min = %d and max = %d", cap.mMinChannels, cap.mMaxChannels); 1061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 1091d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logVideoDecoderCap(const MediaProfiles::VideoDecoderCap& cap) 1101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("video decoder cap:"); 1121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", cap.mCodec); 1131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 1161d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logAudioDecoderCap(const MediaProfiles::AudioDecoderCap& cap) 1171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("audio codec cap:"); 1191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", cap.mCodec); 1201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ int 1231d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::findTagForName(const MediaProfiles::NameToTagMap *map, size_t nMappings, const char *name) 1241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int tag = -1; 1261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < nMappings; ++i) { 1271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp(map[i].name, name)) { 1281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong tag = map[i].tag; 1291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 1301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 1311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 1321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return tag; 1331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoCodec* 1361d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createVideoCodec(const char **atts, MediaProfiles *profiles) 1371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("codec", atts[0]) && 1391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("bitRate", atts[2]) && 1401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("width", atts[4]) && 1411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("height", atts[6]) && 1421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("frameRate", atts[8])); 1431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sVideoEncoderNameMap)/sizeof(sVideoEncoderNameMap[0]); 1451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sVideoEncoderNameMap, nMappings, atts[1]); 1461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 1471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoCodec *videoCodec = 1491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoCodec(static_cast<video_encoder>(codec), 1501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[3]), atoi(atts[5]), atoi(atts[7]), atoi(atts[9])); 1511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logVideoCodec(*videoCodec); 1521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong size_t nCamcorderProfiles; 1541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK((nCamcorderProfiles = profiles->mCamcorderProfiles.size()) >= 1); 1551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mCamcorderProfiles[nCamcorderProfiles - 1]->mVideoCodec = videoCodec; 1561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return videoCodec; 1571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioCodec* 1601d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createAudioCodec(const char **atts, MediaProfiles *profiles) 1611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("codec", atts[0]) && 1631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("bitRate", atts[2]) && 1641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("sampleRate", atts[4]) && 1651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("channels", atts[6])); 1661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sAudioEncoderNameMap)/sizeof(sAudioEncoderNameMap[0]); 1671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sAudioEncoderNameMap, nMappings, atts[1]); 1681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 1691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioCodec *audioCodec = 1711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioCodec(static_cast<audio_encoder>(codec), 1721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[3]), atoi(atts[5]), atoi(atts[7])); 1731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logAudioCodec(*audioCodec); 1741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong size_t nCamcorderProfiles; 1761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK((nCamcorderProfiles = profiles->mCamcorderProfiles.size()) >= 1); 1771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mCamcorderProfiles[nCamcorderProfiles - 1]->mAudioCodec = audioCodec; 1781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return audioCodec; 1791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioDecoderCap* 1811d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createAudioDecoderCap(const char **atts) 1821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0]) && 1841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("enabled", atts[2])); 1851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sAudioDecoderNameMap)/sizeof(sAudioDecoderNameMap[0]); 1871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sAudioDecoderNameMap, nMappings, atts[1]); 1881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 1891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioDecoderCap *cap = 1911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioDecoderCap(static_cast<audio_decoder>(codec)); 1921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logAudioDecoderCap(*cap); 1931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return cap; 1941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoDecoderCap* 1971d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createVideoDecoderCap(const char **atts) 1981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0]) && 2001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("enabled", atts[2])); 2011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sVideoDecoderNameMap)/sizeof(sVideoDecoderNameMap[0]); 2031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sVideoDecoderNameMap, nMappings, atts[1]); 2041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 2051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoDecoderCap *cap = 2071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoDecoderCap(static_cast<video_decoder>(codec)); 2081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logVideoDecoderCap(*cap); 2091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return cap; 2101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoEncoderCap* 2131d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createVideoEncoderCap(const char **atts) 2141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0]) && 2161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("enabled", atts[2]) && 2171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minBitRate", atts[4]) && 2181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxBitRate", atts[6]) && 2191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minFrameWidth", atts[8]) && 2201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxFrameWidth", atts[10]) && 2211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minFrameHeight", atts[12]) && 2221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxFrameHeight", atts[14]) && 2231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minFrameRate", atts[16]) && 2241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxFrameRate", atts[18])); 2251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sVideoEncoderNameMap)/sizeof(sVideoEncoderNameMap[0]); 2271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sVideoEncoderNameMap, nMappings, atts[1]); 2281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 2291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoEncoderCap *cap = 2311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoEncoderCap(static_cast<video_encoder>(codec), 2321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[5]), atoi(atts[7]), atoi(atts[9]), atoi(atts[11]), atoi(atts[13]), 2331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[15]), atoi(atts[17]), atoi(atts[19])); 2341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logVideoEncoderCap(*cap); 2351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return cap; 2361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioEncoderCap* 2391d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createAudioEncoderCap(const char **atts) 2401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0]) && 2421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("enabled", atts[2]) && 2431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minBitRate", atts[4]) && 2441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxBitRate", atts[6]) && 2451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minSampleRate", atts[8]) && 2461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxSampleRate", atts[10]) && 2471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minChannels", atts[12]) && 2481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxChannels", atts[14])); 2491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sAudioEncoderNameMap)/sizeof(sAudioEncoderNameMap[0]); 2511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sAudioEncoderNameMap, nMappings, atts[1]); 2521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 2531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioEncoderCap *cap = 2551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioEncoderCap(static_cast<audio_encoder>(codec), atoi(atts[5]), atoi(atts[7]), 2561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[9]), atoi(atts[11]), atoi(atts[13]), 2571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[15])); 2581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logAudioEncoderCap(*cap); 2591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return cap; 2601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ output_format 2631d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createEncoderOutputFileFormat(const char **atts) 2641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0])); 2661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings =sizeof(sFileFormatMap)/sizeof(sFileFormatMap[0]); 2681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int format = findTagForName(sFileFormatMap, nMappings, atts[1]); 2691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(format != -1); 2701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return static_cast<output_format>(format); 2721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::CamcorderProfile* 2751d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createCamcorderProfile(const char **atts) 2761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("quality", atts[0]) && 2781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("fileFormat", atts[2]) && 2791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("duration", atts[4])); 2801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nProfileMappings = sizeof(sCamcorderQualityNameMap)/sizeof(sCamcorderQualityNameMap[0]); 2821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int quality = findTagForName(sCamcorderQualityNameMap, nProfileMappings, atts[1]); 2831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(quality != -1); 2841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nFormatMappings = sizeof(sFileFormatMap)/sizeof(sFileFormatMap[0]); 2861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int fileFormat = findTagForName(sFileFormatMap, nFormatMappings, atts[3]); 2871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(fileFormat != -1); 2881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 2901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mFileFormat = static_cast<output_format>(fileFormat); 2911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mQuality = static_cast<camcorder_quality>(quality); 2921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mDuration = atoi(atts[5]); 2931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profile; 2941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 296f5a8385649204213dc19e1a64f4693931e048d85James Dong/*static*/ int 297f5a8385649204213dc19e1a64f4693931e048d85James DongMediaProfiles::getImageEncodingQualityLevel(const char** atts) 298f5a8385649204213dc19e1a64f4693931e048d85James Dong{ 299f5a8385649204213dc19e1a64f4693931e048d85James Dong CHECK(!strcmp("quality", atts[0])); 300f5a8385649204213dc19e1a64f4693931e048d85James Dong return atoi(atts[1]); 301f5a8385649204213dc19e1a64f4693931e048d85James Dong} 302f5a8385649204213dc19e1a64f4693931e048d85James Dong 3031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 3041d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::startElementHandler(void *userData, const char *name, const char **atts) 3051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 3061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles *profiles = (MediaProfiles *) userData; 3071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (strcmp("Video", name) == 0) { 3081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createVideoCodec(atts, profiles); 3091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("Audio", name) == 0) { 3101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createAudioCodec(atts, profiles); 3111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("VideoEncoderCap", name) == 0 && 3121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 3131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoEncoders.add(createVideoEncoderCap(atts)); 3141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("AudioEncoderCap", name) == 0 && 3151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 3161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioEncoders.add(createAudioEncoderCap(atts)); 3171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("VideoDecoderCap", name) == 0 && 3181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 3191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoDecoders.add(createVideoDecoderCap(atts)); 3201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("AudioDecoderCap", name) == 0 && 3211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 3221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioDecoders.add(createAudioDecoderCap(atts)); 3231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("EncoderOutputFileFormat", name) == 0) { 3241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mEncoderOutputFileFormats.add(createEncoderOutputFileFormat(atts)); 3251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("EncoderProfile", name) == 0) { 3261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mCamcorderProfiles.add(createCamcorderProfile(atts)); 327f5a8385649204213dc19e1a64f4693931e048d85James Dong } else if (strcmp("ImageEncoding", name) == 0) { 328f5a8385649204213dc19e1a64f4693931e048d85James Dong profiles->mImageEncodingQualityLevels.add(getImageEncodingQualityLevel(atts)); 3291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 3301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 3311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles* 3331d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::getInstance() 3341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 3351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("getInstance"); 3361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Mutex::Autolock lock(sLock); 3371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!sIsInitialized) { 3381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong char value[PROPERTY_VALUE_MAX]; 3391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (property_get("media.settings.xml", value, NULL) <= 0) { 3401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const char *defaultXmlFile = "/etc/media_profiles.xml"; 3411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong FILE *fp = fopen(defaultXmlFile, "r"); 3421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (fp == NULL) { 3431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGW("could not find media config xml file"); 3441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sInstance = createDefaultInstance(); 3451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else { 3461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong fclose(fp); // close the file first. 3471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sInstance = createInstanceFromXmlFile(defaultXmlFile); 3481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 3491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else { 3501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sInstance = createInstanceFromXmlFile(value); 3511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 3521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 3531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return sInstance; 3551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 3561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoEncoderCap* 3581d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultH263VideoEncoderCap() 3591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 3601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return new MediaProfiles::VideoEncoderCap( 3611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong VIDEO_ENCODER_H263, 192000, 420000, 176, 352, 144, 288, 1, 20); 3621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 3631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoEncoderCap* 3651d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultM4vVideoEncoderCap() 3661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 3671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return new MediaProfiles::VideoEncoderCap( 3681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong VIDEO_ENCODER_MPEG_4_SP, 192000, 420000, 176, 352, 144, 288, 1, 20); 3691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 3701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 3731d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultVideoEncoders(MediaProfiles *profiles) 3741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 3751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoEncoders.add(createDefaultH263VideoEncoderCap()); 3761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoEncoders.add(createDefaultM4vVideoEncoderCap()); 3771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 3781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::CamcorderProfile* 3801d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultCamcorderHighProfile() 3811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 3821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoCodec *videoCodec = 3831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoCodec(VIDEO_ENCODER_H263, 360000, 352, 288, 20); 3841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong AudioCodec *audioCodec = new AudioCodec(AUDIO_ENCODER_AMR_NB, 12200, 8000, 1); 3861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CamcorderProfile *profile = new CamcorderProfile; 3871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mFileFormat = OUTPUT_FORMAT_THREE_GPP; 3881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mQuality = CAMCORDER_QUALITY_HIGH; 3891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mDuration = 60; 3901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mVideoCodec = videoCodec; 3911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mAudioCodec = audioCodec; 3921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profile; 3931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 3941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::CamcorderProfile* 3961d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultCamcorderLowProfile() 3971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 3981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoCodec *videoCodec = 3991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoCodec(VIDEO_ENCODER_H263, 192000, 176, 144, 20); 4001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioCodec *audioCodec = 4021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioCodec(AUDIO_ENCODER_AMR_NB, 12200, 8000, 1); 4031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 4051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mFileFormat = OUTPUT_FORMAT_THREE_GPP; 4061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mQuality = CAMCORDER_QUALITY_LOW; 4071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mDuration = 30; 4081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mVideoCodec = videoCodec; 4091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mAudioCodec = audioCodec; 4101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profile; 4111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 4141d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultCamcorderProfiles(MediaProfiles *profiles) 4151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mCamcorderProfiles.add(createDefaultCamcorderHighProfile()); 4171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mCamcorderProfiles.add(createDefaultCamcorderLowProfile()); 4181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 4211d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultAudioEncoders(MediaProfiles *profiles) 4221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioEncoders.add(createDefaultAmrNBEncoderCap()); 4241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 4271d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultVideoDecoders(MediaProfiles *profiles) 4281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoDecoderCap *cap = 4301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoDecoderCap(VIDEO_DECODER_WMV); 4311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoDecoders.add(cap); 4331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 4361d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultAudioDecoders(MediaProfiles *profiles) 4371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioDecoderCap *cap = 4391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioDecoderCap(AUDIO_DECODER_WMA); 4401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioDecoders.add(cap); 4421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 4451d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultEncoderOutputFileFormats(MediaProfiles *profiles) 4461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mEncoderOutputFileFormats.add(OUTPUT_FORMAT_THREE_GPP); 4481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mEncoderOutputFileFormats.add(OUTPUT_FORMAT_MPEG_4); 4491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioEncoderCap* 4521d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultAmrNBEncoderCap() 4531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return new MediaProfiles::AudioEncoderCap( 4551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong AUDIO_ENCODER_AMR_NB, 5525, 12200, 8000, 8000, 1, 1); 4561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 458f5a8385649204213dc19e1a64f4693931e048d85James Dong/*static*/ void 459f5a8385649204213dc19e1a64f4693931e048d85James DongMediaProfiles::createDefaultImageEncodingQualityLevels(MediaProfiles *profiles) 460f5a8385649204213dc19e1a64f4693931e048d85James Dong{ 461f5a8385649204213dc19e1a64f4693931e048d85James Dong profiles->mImageEncodingQualityLevels.add(70); 462f5a8385649204213dc19e1a64f4693931e048d85James Dong profiles->mImageEncodingQualityLevels.add(80); 463f5a8385649204213dc19e1a64f4693931e048d85James Dong profiles->mImageEncodingQualityLevels.add(90); 464f5a8385649204213dc19e1a64f4693931e048d85James Dong} 465f5a8385649204213dc19e1a64f4693931e048d85James Dong 4661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles* 4671d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultInstance() 4681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles *profiles = new MediaProfiles; 4701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultCamcorderProfiles(profiles); 4711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultVideoEncoders(profiles); 4721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultAudioEncoders(profiles); 4731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultVideoDecoders(profiles); 4741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultAudioDecoders(profiles); 4751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultEncoderOutputFileFormats(profiles); 476f5a8385649204213dc19e1a64f4693931e048d85James Dong createDefaultImageEncodingQualityLevels(profiles); 4771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sIsInitialized = true; 4781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profiles; 4791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles* 4821d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createInstanceFromXmlFile(const char *xml) 4831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong FILE *fp = NULL; 4851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK((fp = fopen(xml, "r"))); 4861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong XML_Parser parser = ::XML_ParserCreate(NULL); 4881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(parser != NULL); 4891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles *profiles = new MediaProfiles(); 4911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::XML_SetUserData(parser, profiles); 4921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::XML_SetElementHandler(parser, startElementHandler, NULL); 4931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong /* 4951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong FIXME: 4961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong expat is not compiled with -DXML_DTD. We don't have DTD parsing support. 4971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!::XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS)) { 4991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("failed to enable DTD support in the xml file"); 5001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return UNKNOWN_ERROR; 5011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong */ 5041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int BUFF_SIZE = 512; 5061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (;;) { 5071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong void *buff = ::XML_GetBuffer(parser, BUFF_SIZE); 5081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (buff == NULL) { 5091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("failed to in call to XML_GetBuffer()"); 5101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete profiles; 5111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles = NULL; 5121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong goto exit; 5131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int bytes_read = ::fread(buff, 1, BUFF_SIZE, fp); 5161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (bytes_read < 0) { 5171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("failed in call to read"); 5181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete profiles; 5191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles = NULL; 5201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong goto exit; 5211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(::XML_ParseBuffer(parser, bytes_read, bytes_read == 0)); 5241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (bytes_read == 0) break; // done parsing the xml file 5261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongexit: 5291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::XML_ParserFree(parser); 5301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::fclose(fp); 5311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (profiles) { 5321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sIsInitialized = true; 5331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profiles; 5351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 5361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5371d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<output_format> MediaProfiles::getOutputFileFormats() const 5381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return mEncoderOutputFileFormats; // copy out 5401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 5411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5421d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<video_encoder> MediaProfiles::getVideoEncoders() const 5431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<video_encoder> encoders; 5451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoEncoders.size(); ++i) { 5461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong encoders.add(mVideoEncoders[i]->mCodec); 5471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return encoders; // copy out 5491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 5501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongint MediaProfiles::getVideoEncoderParamByName(const char *name, video_encoder codec) const 5521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("getVideoEncoderParamByName: %s for codec %d", name, codec); 5541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int index = -1; 5551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0, n = mVideoEncoders.size(); i < n; ++i) { 5561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (mVideoEncoders[i]->mCodec == codec) { 5571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong index = i; 5581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 5591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (index == -1) { 5621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given video encoder %d is not found", codec); 5631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 5641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.width.min", name)) return mVideoEncoders[index]->mMinFrameWidth; 5671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.width.max", name)) return mVideoEncoders[index]->mMaxFrameWidth; 5681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.height.min", name)) return mVideoEncoders[index]->mMinFrameHeight; 5691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.height.max", name)) return mVideoEncoders[index]->mMaxFrameHeight; 5701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.bps.min", name)) return mVideoEncoders[index]->mMinBitRate; 5711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.bps.max", name)) return mVideoEncoders[index]->mMaxBitRate; 5721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.fps.min", name)) return mVideoEncoders[index]->mMinFrameRate; 5731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.fps.max", name)) return mVideoEncoders[index]->mMaxFrameRate; 5741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given video encoder param name %s is not found", name); 5761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 5771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 5781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5791d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<audio_encoder> MediaProfiles::getAudioEncoders() const 5801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<audio_encoder> encoders; 5821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioEncoders.size(); ++i) { 5831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong encoders.add(mAudioEncoders[i]->mCodec); 5841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return encoders; // copy out 5861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 5871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongint MediaProfiles::getAudioEncoderParamByName(const char *name, audio_encoder codec) const 5891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("getAudioEncoderParamByName: %s for codec %d", name, codec); 5911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int index = -1; 5921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0, n = mAudioEncoders.size(); i < n; ++i) { 5931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (mAudioEncoders[i]->mCodec == codec) { 5941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong index = i; 5951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 5961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (index == -1) { 5991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given audio encoder %d is not found", codec); 6001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 6011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.ch.min", name)) return mAudioEncoders[index]->mMinChannels; 6041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.ch.max", name)) return mAudioEncoders[index]->mMaxChannels; 6051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.bps.min", name)) return mAudioEncoders[index]->mMinBitRate; 6061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.bps.max", name)) return mAudioEncoders[index]->mMaxBitRate; 6071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.hz.min", name)) return mAudioEncoders[index]->mMinSampleRate; 6081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.hz.max", name)) return mAudioEncoders[index]->mMaxSampleRate; 6091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given audio encoder param name %s is not found", name); 6111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 6121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6141d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<video_decoder> MediaProfiles::getVideoDecoders() const 6151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<video_decoder> decoders; 6171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoDecoders.size(); ++i) { 6181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong decoders.add(mVideoDecoders[i]->mCodec); 6191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return decoders; // copy out 6211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6231d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<audio_decoder> MediaProfiles::getAudioDecoders() const 6241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<audio_decoder> decoders; 6261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioDecoders.size(); ++i) { 6271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong decoders.add(mAudioDecoders[i]->mCodec); 6281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return decoders; // copy out 6301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongint MediaProfiles::getCamcorderProfileParamByName(const char *name, camcorder_quality quality) const 6331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("getCamcorderProfileParamByName: %s for quality %d", name, quality); 6351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int index = -1; 6371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0, n = mCamcorderProfiles.size(); i < n; ++i) { 6381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (mCamcorderProfiles[i]->mQuality == quality) { 6391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong index = i; 6401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 6411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (index == -1) { 6441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given camcorder profile quality %d is not found", quality); 6451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 6461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 648f5a8385649204213dc19e1a64f4693931e048d85James Dong if (!strcmp("duration", name)) return mCamcorderProfiles[index]->mDuration; 6491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("file.format", name)) return mCamcorderProfiles[index]->mFileFormat; 6501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.codec", name)) return mCamcorderProfiles[index]->mVideoCodec->mCodec; 6511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.width", name)) return mCamcorderProfiles[index]->mVideoCodec->mFrameWidth; 6521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.height", name)) return mCamcorderProfiles[index]->mVideoCodec->mFrameHeight; 6531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.bps", name)) return mCamcorderProfiles[index]->mVideoCodec->mBitRate; 6541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.fps", name)) return mCamcorderProfiles[index]->mVideoCodec->mFrameRate; 6551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.codec", name)) return mCamcorderProfiles[index]->mAudioCodec->mCodec; 6561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.bps", name)) return mCamcorderProfiles[index]->mAudioCodec->mBitRate; 6571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.ch", name)) return mCamcorderProfiles[index]->mAudioCodec->mChannels; 6581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.hz", name)) return mCamcorderProfiles[index]->mAudioCodec->mSampleRate; 6591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given camcorder profile param name %s is not found", name); 6611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 6621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 664f5a8385649204213dc19e1a64f4693931e048d85James DongVector<int> MediaProfiles::getImageEncodingQualityLevels() const 665f5a8385649204213dc19e1a64f4693931e048d85James Dong{ 666f5a8385649204213dc19e1a64f4693931e048d85James Dong return mImageEncodingQualityLevels; // copy out 667f5a8385649204213dc19e1a64f4693931e048d85James Dong} 668f5a8385649204213dc19e1a64f4693931e048d85James Dong 6691d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::~MediaProfiles() 6701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK("destructor should never be called" == 0); 6721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#if 0 6731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioEncoders.size(); ++i) { 6741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mAudioEncoders[i]; 6751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mAudioEncoders.clear(); 6771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoEncoders.size(); ++i) { 6791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mVideoEncoders[i]; 6801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mVideoEncoders.clear(); 6821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoDecoders.size(); ++i) { 6841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mVideoDecoders[i]; 6851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mVideoDecoders.clear(); 6871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioDecoders.size(); ++i) { 6891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mAudioDecoders[i]; 6901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mAudioDecoders.clear(); 6921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mCamcorderProfiles.size(); ++i) { 6941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mCamcorderProfiles[i]; 6951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mCamcorderProfiles.clear(); 6971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#endif 6981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} // namespace android 700