MediaProfiles.cpp revision 3eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0
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* 2753eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangMediaProfiles::createCamcorderProfile(int cameraId, 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; 2903eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profile->mCameraId = cameraId; 2911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mFileFormat = static_cast<output_format>(fileFormat); 2921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mQuality = static_cast<camcorder_quality>(quality); 2931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mDuration = atoi(atts[5]); 2941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profile; 2951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2973eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangMediaProfiles::ImageEncodingQualityLevels* 2983eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangMediaProfiles::findImageEncodingQualityLevels(int cameraId) const 2993eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang{ 3003eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang int n = mImageEncodingQualityLevels.size(); 3013eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang for (int i = 0; i < n; i++) { 3023eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang ImageEncodingQualityLevels *levels = mImageEncodingQualityLevels[i]; 3033eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (levels->mCameraId == cameraId) { 3043eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang return levels; 3053eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } 3063eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } 3073eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang return NULL; 3083eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang} 3093eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang 3103eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Changvoid MediaProfiles::addImageEncodingQualityLevel(int cameraId, const char** atts) 311f5a8385649204213dc19e1a64f4693931e048d85James Dong{ 312f5a8385649204213dc19e1a64f4693931e048d85James Dong CHECK(!strcmp("quality", atts[0])); 3133eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang int quality = atoi(atts[1]); 3143eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang LOGV("%s: cameraId=%d, quality=%d\n", __func__, cameraId, quality); 3153eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang ImageEncodingQualityLevels *levels = findImageEncodingQualityLevels(cameraId); 3163eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang 3173eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (levels == NULL) { 3183eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels = new ImageEncodingQualityLevels(); 3193eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mCameraId = cameraId; 3203eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang mImageEncodingQualityLevels.add(levels); 3213eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } 3223eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang 3233eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mLevels.add(quality); 3243eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang} 3253eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang 3263eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang/*static*/ int 3273eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangMediaProfiles::getCameraId(const char** atts) 3283eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang{ 3293eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (!atts[0]) return 0; // default cameraId = 0 3303eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang CHECK(!strcmp("cameraId", atts[0])); 331f5a8385649204213dc19e1a64f4693931e048d85James Dong return atoi(atts[1]); 332f5a8385649204213dc19e1a64f4693931e048d85James Dong} 333f5a8385649204213dc19e1a64f4693931e048d85James Dong 3341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 3351d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::startElementHandler(void *userData, const char *name, const char **atts) 3361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 3371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles *profiles = (MediaProfiles *) userData; 3381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (strcmp("Video", name) == 0) { 3391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createVideoCodec(atts, profiles); 3401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("Audio", name) == 0) { 3411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createAudioCodec(atts, profiles); 3421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("VideoEncoderCap", name) == 0 && 3431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 3441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoEncoders.add(createVideoEncoderCap(atts)); 3451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("AudioEncoderCap", name) == 0 && 3461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 3471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioEncoders.add(createAudioEncoderCap(atts)); 3481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("VideoDecoderCap", name) == 0 && 3491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 3501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoDecoders.add(createVideoDecoderCap(atts)); 3511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("AudioDecoderCap", name) == 0 && 3521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 3531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioDecoders.add(createAudioDecoderCap(atts)); 3541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("EncoderOutputFileFormat", name) == 0) { 3551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mEncoderOutputFileFormats.add(createEncoderOutputFileFormat(atts)); 3563eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } else if (strcmp("CamcorderProfiles", name) == 0) { 3573eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profiles->mCurrentCameraId = getCameraId(atts); 3581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("EncoderProfile", name) == 0) { 3593eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profiles->mCamcorderProfiles.add( 3603eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang createCamcorderProfile(profiles->mCurrentCameraId, atts)); 361f5a8385649204213dc19e1a64f4693931e048d85James Dong } else if (strcmp("ImageEncoding", name) == 0) { 3623eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profiles->addImageEncodingQualityLevel(profiles->mCurrentCameraId, atts); 3631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 3641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 3651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles* 3671d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::getInstance() 3681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 3691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("getInstance"); 3701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Mutex::Autolock lock(sLock); 3711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!sIsInitialized) { 3721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong char value[PROPERTY_VALUE_MAX]; 3731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (property_get("media.settings.xml", value, NULL) <= 0) { 3741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const char *defaultXmlFile = "/etc/media_profiles.xml"; 3751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong FILE *fp = fopen(defaultXmlFile, "r"); 3761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (fp == NULL) { 3771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGW("could not find media config xml file"); 3781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sInstance = createDefaultInstance(); 3791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else { 3801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong fclose(fp); // close the file first. 3811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sInstance = createInstanceFromXmlFile(defaultXmlFile); 3821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 3831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else { 3841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sInstance = createInstanceFromXmlFile(value); 3851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 3861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 3871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return sInstance; 3891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 3901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoEncoderCap* 3921d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultH263VideoEncoderCap() 3931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 3941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return new MediaProfiles::VideoEncoderCap( 3951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong VIDEO_ENCODER_H263, 192000, 420000, 176, 352, 144, 288, 1, 20); 3961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 3971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoEncoderCap* 3991d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultM4vVideoEncoderCap() 4001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return new MediaProfiles::VideoEncoderCap( 4021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong VIDEO_ENCODER_MPEG_4_SP, 192000, 420000, 176, 352, 144, 288, 1, 20); 4031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 4071d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultVideoEncoders(MediaProfiles *profiles) 4081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoEncoders.add(createDefaultH263VideoEncoderCap()); 4101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoEncoders.add(createDefaultM4vVideoEncoderCap()); 4111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::CamcorderProfile* 4141d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultCamcorderHighProfile() 4151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoCodec *videoCodec = 4171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoCodec(VIDEO_ENCODER_H263, 360000, 352, 288, 20); 4181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong AudioCodec *audioCodec = new AudioCodec(AUDIO_ENCODER_AMR_NB, 12200, 8000, 1); 4203eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 4213eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profile->mCameraId = 0; 4221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mFileFormat = OUTPUT_FORMAT_THREE_GPP; 4231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mQuality = CAMCORDER_QUALITY_HIGH; 4241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mDuration = 60; 4251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mVideoCodec = videoCodec; 4261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mAudioCodec = audioCodec; 4271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profile; 4281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::CamcorderProfile* 4311d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultCamcorderLowProfile() 4321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoCodec *videoCodec = 4341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoCodec(VIDEO_ENCODER_H263, 192000, 176, 144, 20); 4351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioCodec *audioCodec = 4371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioCodec(AUDIO_ENCODER_AMR_NB, 12200, 8000, 1); 4381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 4403eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profile->mCameraId = 0; 4411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mFileFormat = OUTPUT_FORMAT_THREE_GPP; 4421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mQuality = CAMCORDER_QUALITY_LOW; 4431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mDuration = 30; 4441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mVideoCodec = videoCodec; 4451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mAudioCodec = audioCodec; 4461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profile; 4471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 4501d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultCamcorderProfiles(MediaProfiles *profiles) 4511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mCamcorderProfiles.add(createDefaultCamcorderHighProfile()); 4531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mCamcorderProfiles.add(createDefaultCamcorderLowProfile()); 4541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 4571d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultAudioEncoders(MediaProfiles *profiles) 4581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioEncoders.add(createDefaultAmrNBEncoderCap()); 4601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 4631d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultVideoDecoders(MediaProfiles *profiles) 4641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoDecoderCap *cap = 4661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoDecoderCap(VIDEO_DECODER_WMV); 4671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoDecoders.add(cap); 4691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 4721d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultAudioDecoders(MediaProfiles *profiles) 4731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioDecoderCap *cap = 4751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioDecoderCap(AUDIO_DECODER_WMA); 4761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioDecoders.add(cap); 4781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 4811d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultEncoderOutputFileFormats(MediaProfiles *profiles) 4821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mEncoderOutputFileFormats.add(OUTPUT_FORMAT_THREE_GPP); 4841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mEncoderOutputFileFormats.add(OUTPUT_FORMAT_MPEG_4); 4851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioEncoderCap* 4881d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultAmrNBEncoderCap() 4891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return new MediaProfiles::AudioEncoderCap( 4911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong AUDIO_ENCODER_AMR_NB, 5525, 12200, 8000, 8000, 1, 1); 4921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 494f5a8385649204213dc19e1a64f4693931e048d85James Dong/*static*/ void 495f5a8385649204213dc19e1a64f4693931e048d85James DongMediaProfiles::createDefaultImageEncodingQualityLevels(MediaProfiles *profiles) 496f5a8385649204213dc19e1a64f4693931e048d85James Dong{ 4973eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang ImageEncodingQualityLevels *levels = new ImageEncodingQualityLevels(); 4983eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mCameraId = 0; 4993eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mLevels.add(70); 5003eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mLevels.add(80); 5013eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mLevels.add(90); 5023eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profiles->mImageEncodingQualityLevels.add(levels); 503f5a8385649204213dc19e1a64f4693931e048d85James Dong} 504f5a8385649204213dc19e1a64f4693931e048d85James Dong 5051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles* 5061d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultInstance() 5071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles *profiles = new MediaProfiles; 5091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultCamcorderProfiles(profiles); 5101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultVideoEncoders(profiles); 5111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultAudioEncoders(profiles); 5121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultVideoDecoders(profiles); 5131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultAudioDecoders(profiles); 5141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultEncoderOutputFileFormats(profiles); 515f5a8385649204213dc19e1a64f4693931e048d85James Dong createDefaultImageEncodingQualityLevels(profiles); 5161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sIsInitialized = true; 5171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profiles; 5181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 5191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles* 5211d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createInstanceFromXmlFile(const char *xml) 5221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong FILE *fp = NULL; 5241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK((fp = fopen(xml, "r"))); 5251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong XML_Parser parser = ::XML_ParserCreate(NULL); 5271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(parser != NULL); 5281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles *profiles = new MediaProfiles(); 5301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::XML_SetUserData(parser, profiles); 5311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::XML_SetElementHandler(parser, startElementHandler, NULL); 5321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong /* 5341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong FIXME: 5351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong expat is not compiled with -DXML_DTD. We don't have DTD parsing support. 5361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!::XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS)) { 5381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("failed to enable DTD support in the xml file"); 5391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return UNKNOWN_ERROR; 5401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong */ 5431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int BUFF_SIZE = 512; 5451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (;;) { 5461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong void *buff = ::XML_GetBuffer(parser, BUFF_SIZE); 5471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (buff == NULL) { 5481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("failed to in call to XML_GetBuffer()"); 5491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete profiles; 5501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles = NULL; 5511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong goto exit; 5521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int bytes_read = ::fread(buff, 1, BUFF_SIZE, fp); 5551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (bytes_read < 0) { 5561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("failed in call to read"); 5571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete profiles; 5581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles = NULL; 5591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong goto exit; 5601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(::XML_ParseBuffer(parser, bytes_read, bytes_read == 0)); 5631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (bytes_read == 0) break; // done parsing the xml file 5651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongexit: 5681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::XML_ParserFree(parser); 5691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::fclose(fp); 5701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (profiles) { 5711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sIsInitialized = true; 5721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profiles; 5741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 5751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5761d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<output_format> MediaProfiles::getOutputFileFormats() const 5771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return mEncoderOutputFileFormats; // copy out 5791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 5801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5811d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<video_encoder> MediaProfiles::getVideoEncoders() const 5821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<video_encoder> encoders; 5841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoEncoders.size(); ++i) { 5851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong encoders.add(mVideoEncoders[i]->mCodec); 5861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return encoders; // copy out 5881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 5891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 5901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongint MediaProfiles::getVideoEncoderParamByName(const char *name, video_encoder codec) const 5911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("getVideoEncoderParamByName: %s for codec %d", name, codec); 5931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int index = -1; 5941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0, n = mVideoEncoders.size(); i < n; ++i) { 5951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (mVideoEncoders[i]->mCodec == codec) { 5961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong index = i; 5971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 5981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 5991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (index == -1) { 6011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given video encoder %d is not found", codec); 6021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 6031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.width.min", name)) return mVideoEncoders[index]->mMinFrameWidth; 6061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.width.max", name)) return mVideoEncoders[index]->mMaxFrameWidth; 6071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.height.min", name)) return mVideoEncoders[index]->mMinFrameHeight; 6081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.height.max", name)) return mVideoEncoders[index]->mMaxFrameHeight; 6091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.bps.min", name)) return mVideoEncoders[index]->mMinBitRate; 6101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.bps.max", name)) return mVideoEncoders[index]->mMaxBitRate; 6111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.fps.min", name)) return mVideoEncoders[index]->mMinFrameRate; 6121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.fps.max", name)) return mVideoEncoders[index]->mMaxFrameRate; 6131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given video encoder param name %s is not found", name); 6151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 6161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6181d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<audio_encoder> MediaProfiles::getAudioEncoders() const 6191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<audio_encoder> encoders; 6211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioEncoders.size(); ++i) { 6221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong encoders.add(mAudioEncoders[i]->mCodec); 6231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return encoders; // copy out 6251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongint MediaProfiles::getAudioEncoderParamByName(const char *name, audio_encoder codec) const 6281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("getAudioEncoderParamByName: %s for codec %d", name, codec); 6301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int index = -1; 6311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0, n = mAudioEncoders.size(); i < n; ++i) { 6321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (mAudioEncoders[i]->mCodec == codec) { 6331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong index = i; 6341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 6351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (index == -1) { 6381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given audio encoder %d is not found", codec); 6391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 6401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.ch.min", name)) return mAudioEncoders[index]->mMinChannels; 6431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.ch.max", name)) return mAudioEncoders[index]->mMaxChannels; 6441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.bps.min", name)) return mAudioEncoders[index]->mMinBitRate; 6451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.bps.max", name)) return mAudioEncoders[index]->mMaxBitRate; 6461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.hz.min", name)) return mAudioEncoders[index]->mMinSampleRate; 6471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.hz.max", name)) return mAudioEncoders[index]->mMaxSampleRate; 6481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given audio encoder param name %s is not found", name); 6501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 6511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6531d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<video_decoder> MediaProfiles::getVideoDecoders() const 6541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<video_decoder> decoders; 6561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoDecoders.size(); ++i) { 6571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong decoders.add(mVideoDecoders[i]->mCodec); 6581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return decoders; // copy out 6601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6621d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<audio_decoder> MediaProfiles::getAudioDecoders() const 6631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<audio_decoder> decoders; 6651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioDecoders.size(); ++i) { 6661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong decoders.add(mAudioDecoders[i]->mCodec); 6671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return decoders; // copy out 6691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6713eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Changint MediaProfiles::getCamcorderProfileParamByName(const char *name, 6723eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang int cameraId, 6733eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang camcorder_quality quality) const 6741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6753eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang LOGV("getCamcorderProfileParamByName: %s for camera %d, quality %d", 6763eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang name, cameraId, quality); 6771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int index = -1; 6791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0, n = mCamcorderProfiles.size(); i < n; ++i) { 6803eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (mCamcorderProfiles[i]->mCameraId == cameraId && 6813eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang mCamcorderProfiles[i]->mQuality == quality) { 6821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong index = i; 6831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 6841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (index == -1) { 6873eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang LOGE("The given camcorder profile camera %d quality %d is not found", 6883eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang cameraId, quality); 6891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 6901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 692f5a8385649204213dc19e1a64f4693931e048d85James Dong if (!strcmp("duration", name)) return mCamcorderProfiles[index]->mDuration; 6931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("file.format", name)) return mCamcorderProfiles[index]->mFileFormat; 6941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.codec", name)) return mCamcorderProfiles[index]->mVideoCodec->mCodec; 6951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.width", name)) return mCamcorderProfiles[index]->mVideoCodec->mFrameWidth; 6961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.height", name)) return mCamcorderProfiles[index]->mVideoCodec->mFrameHeight; 6971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.bps", name)) return mCamcorderProfiles[index]->mVideoCodec->mBitRate; 6981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.fps", name)) return mCamcorderProfiles[index]->mVideoCodec->mFrameRate; 6991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.codec", name)) return mCamcorderProfiles[index]->mAudioCodec->mCodec; 7001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.bps", name)) return mCamcorderProfiles[index]->mAudioCodec->mBitRate; 7011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.ch", name)) return mCamcorderProfiles[index]->mAudioCodec->mChannels; 7021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.hz", name)) return mCamcorderProfiles[index]->mAudioCodec->mSampleRate; 7031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7043eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang LOGE("The given camcorder profile param id %d name %s is not found", cameraId, name); 7051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 7061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 7071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7083eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangVector<int> MediaProfiles::getImageEncodingQualityLevels(int cameraId) const 709f5a8385649204213dc19e1a64f4693931e048d85James Dong{ 7103eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang Vector<int> result; 7113eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang ImageEncodingQualityLevels *levels = findImageEncodingQualityLevels(cameraId); 7123eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (levels != NULL) { 7133eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang result = levels->mLevels; // copy out 7143eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } 7153eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang return result; 716f5a8385649204213dc19e1a64f4693931e048d85James Dong} 717f5a8385649204213dc19e1a64f4693931e048d85James Dong 7181d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::~MediaProfiles() 7191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 7201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK("destructor should never be called" == 0); 7211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#if 0 7221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioEncoders.size(); ++i) { 7231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mAudioEncoders[i]; 7241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 7251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mAudioEncoders.clear(); 7261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoEncoders.size(); ++i) { 7281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mVideoEncoders[i]; 7291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 7301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mVideoEncoders.clear(); 7311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoDecoders.size(); ++i) { 7331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mVideoDecoders[i]; 7341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 7351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mVideoDecoders.clear(); 7361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioDecoders.size(); ++i) { 7381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mAudioDecoders[i]; 7391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 7401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mAudioDecoders.clear(); 7411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mCamcorderProfiles.size(); ++i) { 7431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mCamcorderProfiles[i]; 7441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 7451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mCamcorderProfiles.clear(); 7461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#endif 7471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 7481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} // namespace android 749