MediaProfiles.cpp revision b187de1ada34a9023c05d020a4592686ba761278
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> 26e8057dd8208f0a185109992339a995c518b12780Elliott Hughes#include <libexpat/expat.h> 271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#include <media/MediaProfiles.h> 28f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h> 296c6b4d0d2b98a7ceee8b697daaf611f8df3254fbJames Dong#include <OMX_Video.h> 301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongnamespace android { 321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 331d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMutex MediaProfiles::sLock; 341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongbool MediaProfiles::sIsInitialized = false; 351d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles *MediaProfiles::sInstance = NULL; 361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sVideoEncoderNameMap[] = { 381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"h263", VIDEO_ENCODER_H263}, 391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"h264", VIDEO_ENCODER_H264}, 401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"m4v", VIDEO_ENCODER_MPEG_4_SP} 411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sAudioEncoderNameMap[] = { 44aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke {"amrnb", AUDIO_ENCODER_AMR_NB}, 45aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke {"amrwb", AUDIO_ENCODER_AMR_WB}, 46aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke {"aac", AUDIO_ENCODER_AAC}, 47f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke {"heaac", AUDIO_ENCODER_HE_AAC}, 48f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke {"aaceld", AUDIO_ENCODER_AAC_ELD} 491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sFileFormatMap[] = { 521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"3gp", OUTPUT_FORMAT_THREE_GPP}, 531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"mp4", OUTPUT_FORMAT_MPEG_4} 541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sVideoDecoderNameMap[] = { 571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"wmv", VIDEO_DECODER_WMV} 581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sAudioDecoderNameMap[] = { 611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"wma", AUDIO_DECODER_WMA} 621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sCamcorderQualityNameMap[] = { 65c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"low", CAMCORDER_QUALITY_LOW}, 661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"high", CAMCORDER_QUALITY_HIGH}, 67c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"qcif", CAMCORDER_QUALITY_QCIF}, 689783ed8f85af3d7c72030098acfed7e1d6638349Nipun Kwatra {"cif", CAMCORDER_QUALITY_CIF}, 69c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"480p", CAMCORDER_QUALITY_480P}, 70c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"720p", CAMCORDER_QUALITY_720P}, 71c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"1080p", CAMCORDER_QUALITY_1080P}, 725f6af1a8e34381ca2ac2527fcefe220a22f49b53Zhijun He {"2160p", CAMCORDER_QUALITY_2160P}, 73669012d77b00a2aacb6fd12837f2870f9ec17865James Dong {"qvga", CAMCORDER_QUALITY_QVGA}, 74c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra 75c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapselow", CAMCORDER_QUALITY_TIME_LAPSE_LOW}, 76c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapsehigh", CAMCORDER_QUALITY_TIME_LAPSE_HIGH}, 77c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapseqcif", CAMCORDER_QUALITY_TIME_LAPSE_QCIF}, 789783ed8f85af3d7c72030098acfed7e1d6638349Nipun Kwatra {"timelapsecif", CAMCORDER_QUALITY_TIME_LAPSE_CIF}, 79c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapse480p", CAMCORDER_QUALITY_TIME_LAPSE_480P}, 80c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapse720p", CAMCORDER_QUALITY_TIME_LAPSE_720P}, 81669012d77b00a2aacb6fd12837f2870f9ec17865James Dong {"timelapse1080p", CAMCORDER_QUALITY_TIME_LAPSE_1080P}, 825f6af1a8e34381ca2ac2527fcefe220a22f49b53Zhijun He {"timelapse2160p", CAMCORDER_QUALITY_TIME_LAPSE_2160P}, 83669012d77b00a2aacb6fd12837f2870f9ec17865James Dong {"timelapseqvga", CAMCORDER_QUALITY_TIME_LAPSE_QVGA}, 84e07909715b44cc56df723750af93f0608210f94dZhijun He 85e07909715b44cc56df723750af93f0608210f94dZhijun He {"highspeedlow", CAMCORDER_QUALITY_HIGH_SPEED_LOW}, 86e07909715b44cc56df723750af93f0608210f94dZhijun He {"highspeedhigh", CAMCORDER_QUALITY_HIGH_SPEED_HIGH}, 87e07909715b44cc56df723750af93f0608210f94dZhijun He {"highspeed480p", CAMCORDER_QUALITY_HIGH_SPEED_480P}, 88e07909715b44cc56df723750af93f0608210f94dZhijun He {"highspeed720p", CAMCORDER_QUALITY_HIGH_SPEED_720P}, 89e07909715b44cc56df723750af93f0608210f94dZhijun He {"highspeed1080p", CAMCORDER_QUALITY_HIGH_SPEED_1080P}, 909520aa609c505cf8a9ee105bd78dc186cfb7770bZhijun He {"highspeed2160p", CAMCORDER_QUALITY_HIGH_SPEED_2160P}, 911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9380520381d0bdf3451bd17c9ddef73d3fe71c58c2Glenn Kasten#if LOG_NDEBUG 9480520381d0bdf3451bd17c9ddef73d3fe71c58c2Glenn Kasten#define UNUSED __unused 9580520381d0bdf3451bd17c9ddef73d3fe71c58c2Glenn Kasten#else 9680520381d0bdf3451bd17c9ddef73d3fe71c58c2Glenn Kasten#define UNUSED 9780520381d0bdf3451bd17c9ddef73d3fe71c58c2Glenn Kasten#endif 9880520381d0bdf3451bd17c9ddef73d3fe71c58c2Glenn Kasten 991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 10080520381d0bdf3451bd17c9ddef73d3fe71c58c2Glenn KastenMediaProfiles::logVideoCodec(const MediaProfiles::VideoCodec& codec UNUSED) 1011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("video codec:"); 1033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("codec = %d", codec.mCodec); 1043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("bit rate: %d", codec.mBitRate); 1053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("frame width: %d", codec.mFrameWidth); 1063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("frame height: %d", codec.mFrameHeight); 1073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("frame rate: %d", codec.mFrameRate); 1081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 11180520381d0bdf3451bd17c9ddef73d3fe71c58c2Glenn KastenMediaProfiles::logAudioCodec(const MediaProfiles::AudioCodec& codec UNUSED) 1121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("audio codec:"); 1143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("codec = %d", codec.mCodec); 1153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("bit rate: %d", codec.mBitRate); 1163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("sample rate: %d", codec.mSampleRate); 1173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("number of channels: %d", codec.mChannels); 1181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 12180520381d0bdf3451bd17c9ddef73d3fe71c58c2Glenn KastenMediaProfiles::logVideoEncoderCap(const MediaProfiles::VideoEncoderCap& cap UNUSED) 1221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("video encoder cap:"); 1243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("codec = %d", cap.mCodec); 1253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("bit rate: min = %d and max = %d", cap.mMinBitRate, cap.mMaxBitRate); 1263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("frame width: min = %d and max = %d", cap.mMinFrameWidth, cap.mMaxFrameWidth); 1273856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("frame height: min = %d and max = %d", cap.mMinFrameHeight, cap.mMaxFrameHeight); 1283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("frame rate: min = %d and max = %d", cap.mMinFrameRate, cap.mMaxFrameRate); 1291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 13280520381d0bdf3451bd17c9ddef73d3fe71c58c2Glenn KastenMediaProfiles::logAudioEncoderCap(const MediaProfiles::AudioEncoderCap& cap UNUSED) 1331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("audio encoder cap:"); 1353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("codec = %d", cap.mCodec); 1363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("bit rate: min = %d and max = %d", cap.mMinBitRate, cap.mMaxBitRate); 1373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("sample rate: min = %d and max = %d", cap.mMinSampleRate, cap.mMaxSampleRate); 1383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("number of channels: min = %d and max = %d", cap.mMinChannels, cap.mMaxChannels); 1391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 14280520381d0bdf3451bd17c9ddef73d3fe71c58c2Glenn KastenMediaProfiles::logVideoDecoderCap(const MediaProfiles::VideoDecoderCap& cap UNUSED) 1431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1443856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("video decoder cap:"); 1453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("codec = %d", cap.mCodec); 1461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 14980520381d0bdf3451bd17c9ddef73d3fe71c58c2Glenn KastenMediaProfiles::logAudioDecoderCap(const MediaProfiles::AudioDecoderCap& cap UNUSED) 1501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("audio codec cap:"); 1523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("codec = %d", cap.mCodec); 1531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 155cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng/*static*/ void 15680520381d0bdf3451bd17c9ddef73d3fe71c58c2Glenn KastenMediaProfiles::logVideoEditorCap(const MediaProfiles::VideoEditorCap& cap UNUSED) 157cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng{ 1583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("videoeditor cap:"); 1593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("mMaxInputFrameWidth = %d", cap.mMaxInputFrameWidth); 1603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("mMaxInputFrameHeight = %d", cap.mMaxInputFrameHeight); 1613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("mMaxOutputFrameWidth = %d", cap.mMaxOutputFrameWidth); 1623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("mMaxOutputFrameHeight = %d", cap.mMaxOutputFrameHeight); 163cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng} 164cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 1651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ int 166b187de1ada34a9023c05d020a4592686ba761278Glenn KastenMediaProfiles::findTagForName(const MediaProfiles::NameToTagMap *map, size_t nMappings, 167b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten const char *name) 1681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int tag = -1; 1701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < nMappings; ++i) { 1711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp(map[i].name, name)) { 1721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong tag = map[i].tag; 1731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 1741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 1751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 1761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return tag; 1771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoCodec* 1801d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createVideoCodec(const char **atts, MediaProfiles *profiles) 1811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("codec", atts[0]) && 1831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("bitRate", atts[2]) && 1841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("width", atts[4]) && 1851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("height", atts[6]) && 1861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("frameRate", atts[8])); 1871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sVideoEncoderNameMap)/sizeof(sVideoEncoderNameMap[0]); 1891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sVideoEncoderNameMap, nMappings, atts[1]); 1901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 1911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoCodec *videoCodec = 1931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoCodec(static_cast<video_encoder>(codec), 1941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[3]), atoi(atts[5]), atoi(atts[7]), atoi(atts[9])); 1951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logVideoCodec(*videoCodec); 1961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong size_t nCamcorderProfiles; 1981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK((nCamcorderProfiles = profiles->mCamcorderProfiles.size()) >= 1); 1991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mCamcorderProfiles[nCamcorderProfiles - 1]->mVideoCodec = videoCodec; 2001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return videoCodec; 2011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioCodec* 2041d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createAudioCodec(const char **atts, MediaProfiles *profiles) 2051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("codec", atts[0]) && 2071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("bitRate", atts[2]) && 2081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("sampleRate", atts[4]) && 2091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("channels", atts[6])); 2101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sAudioEncoderNameMap)/sizeof(sAudioEncoderNameMap[0]); 2111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sAudioEncoderNameMap, nMappings, atts[1]); 2121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 2131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioCodec *audioCodec = 2151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioCodec(static_cast<audio_encoder>(codec), 2161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[3]), atoi(atts[5]), atoi(atts[7])); 2171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logAudioCodec(*audioCodec); 2181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong size_t nCamcorderProfiles; 2201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK((nCamcorderProfiles = profiles->mCamcorderProfiles.size()) >= 1); 2211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mCamcorderProfiles[nCamcorderProfiles - 1]->mAudioCodec = audioCodec; 2221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return audioCodec; 2231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioDecoderCap* 2251d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createAudioDecoderCap(const char **atts) 2261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0]) && 2281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("enabled", atts[2])); 2291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sAudioDecoderNameMap)/sizeof(sAudioDecoderNameMap[0]); 2311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sAudioDecoderNameMap, nMappings, atts[1]); 2321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 2331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioDecoderCap *cap = 2351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioDecoderCap(static_cast<audio_decoder>(codec)); 2361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logAudioDecoderCap(*cap); 2371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return cap; 2381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoDecoderCap* 2411d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createVideoDecoderCap(const char **atts) 2421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0]) && 2441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("enabled", atts[2])); 2451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sVideoDecoderNameMap)/sizeof(sVideoDecoderNameMap[0]); 2471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sVideoDecoderNameMap, nMappings, atts[1]); 2481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 2491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoDecoderCap *cap = 2511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoDecoderCap(static_cast<video_decoder>(codec)); 2521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logVideoDecoderCap(*cap); 2531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return cap; 2541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoEncoderCap* 2571d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createVideoEncoderCap(const char **atts) 2581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0]) && 2601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("enabled", atts[2]) && 2611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minBitRate", atts[4]) && 2621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxBitRate", atts[6]) && 2631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minFrameWidth", atts[8]) && 2641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxFrameWidth", atts[10]) && 2651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minFrameHeight", atts[12]) && 2661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxFrameHeight", atts[14]) && 2671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minFrameRate", atts[16]) && 2681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxFrameRate", atts[18])); 2691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sVideoEncoderNameMap)/sizeof(sVideoEncoderNameMap[0]); 2711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sVideoEncoderNameMap, nMappings, atts[1]); 2721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 2731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoEncoderCap *cap = 2751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoEncoderCap(static_cast<video_encoder>(codec), 2761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[5]), atoi(atts[7]), atoi(atts[9]), atoi(atts[11]), atoi(atts[13]), 2771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[15]), atoi(atts[17]), atoi(atts[19])); 2781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logVideoEncoderCap(*cap); 2791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return cap; 2801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioEncoderCap* 2831d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createAudioEncoderCap(const char **atts) 2841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0]) && 2861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("enabled", atts[2]) && 2871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minBitRate", atts[4]) && 2881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxBitRate", atts[6]) && 2891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minSampleRate", atts[8]) && 2901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxSampleRate", atts[10]) && 2911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minChannels", atts[12]) && 2921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxChannels", atts[14])); 2931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sAudioEncoderNameMap)/sizeof(sAudioEncoderNameMap[0]); 2951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sAudioEncoderNameMap, nMappings, atts[1]); 2961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 2971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioEncoderCap *cap = 299b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten new MediaProfiles::AudioEncoderCap(static_cast<audio_encoder>(codec), atoi(atts[5]), 300b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten atoi(atts[7]), atoi(atts[9]), atoi(atts[11]), atoi(atts[13]), atoi(atts[15])); 3011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logAudioEncoderCap(*cap); 3021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return cap; 3031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 3041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ output_format 3061d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createEncoderOutputFileFormat(const char **atts) 3071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 3081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0])); 3091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings =sizeof(sFileFormatMap)/sizeof(sFileFormatMap[0]); 3111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int format = findTagForName(sFileFormatMap, nMappings, atts[1]); 3121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(format != -1); 3131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return static_cast<output_format>(format); 3151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 3161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3172a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dongstatic bool isCameraIdFound(int cameraId, const Vector<int>& cameraIds) { 3182a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong for (int i = 0, n = cameraIds.size(); i < n; ++i) { 3192a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (cameraId == cameraIds[i]) { 3202a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong return true; 3212a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 3222a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 3232a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong return false; 3242a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong} 3252a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 3261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::CamcorderProfile* 3272a7e0a1eb29306982fd77bdc64d324464a48a2b9James DongMediaProfiles::createCamcorderProfile(int cameraId, const char **atts, Vector<int>& cameraIds) 3281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 3291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("quality", atts[0]) && 3301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("fileFormat", atts[2]) && 3311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("duration", atts[4])); 3321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 333b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten const size_t nProfileMappings = sizeof(sCamcorderQualityNameMap)/ 334b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten sizeof(sCamcorderQualityNameMap[0]); 3351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int quality = findTagForName(sCamcorderQualityNameMap, nProfileMappings, atts[1]); 3361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(quality != -1); 3371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nFormatMappings = sizeof(sFileFormatMap)/sizeof(sFileFormatMap[0]); 3391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int fileFormat = findTagForName(sFileFormatMap, nFormatMappings, atts[3]); 3401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(fileFormat != -1); 3411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 3433eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profile->mCameraId = cameraId; 3442a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (!isCameraIdFound(cameraId, cameraIds)) { 3452a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong cameraIds.add(cameraId); 3462a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 3471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mFileFormat = static_cast<output_format>(fileFormat); 3481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mQuality = static_cast<camcorder_quality>(quality); 3491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mDuration = atoi(atts[5]); 3501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profile; 3511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 3521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3533eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangMediaProfiles::ImageEncodingQualityLevels* 3543eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangMediaProfiles::findImageEncodingQualityLevels(int cameraId) const 3553eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang{ 3563eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang int n = mImageEncodingQualityLevels.size(); 3573eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang for (int i = 0; i < n; i++) { 3583eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang ImageEncodingQualityLevels *levels = mImageEncodingQualityLevels[i]; 3593eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (levels->mCameraId == cameraId) { 3603eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang return levels; 3613eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } 3623eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } 3633eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang return NULL; 3643eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang} 3653eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang 3663eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Changvoid MediaProfiles::addImageEncodingQualityLevel(int cameraId, const char** atts) 367f5a8385649204213dc19e1a64f4693931e048d85James Dong{ 368f5a8385649204213dc19e1a64f4693931e048d85James Dong CHECK(!strcmp("quality", atts[0])); 3693eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang int quality = atoi(atts[1]); 37090bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("%s: cameraId=%d, quality=%d", __func__, cameraId, quality); 3713eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang ImageEncodingQualityLevels *levels = findImageEncodingQualityLevels(cameraId); 3723eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang 3733eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (levels == NULL) { 3743eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels = new ImageEncodingQualityLevels(); 3753eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mCameraId = cameraId; 3763eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang mImageEncodingQualityLevels.add(levels); 3773eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } 3783eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang 3793eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mLevels.add(quality); 3803eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang} 3813eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang 3823eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang/*static*/ int 3833eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangMediaProfiles::getCameraId(const char** atts) 3843eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang{ 3853eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (!atts[0]) return 0; // default cameraId = 0 3863eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang CHECK(!strcmp("cameraId", atts[0])); 387f5a8385649204213dc19e1a64f4693931e048d85James Dong return atoi(atts[1]); 388f5a8385649204213dc19e1a64f4693931e048d85James Dong} 389f5a8385649204213dc19e1a64f4693931e048d85James Dong 3900f056290cb16763453f18bbef80cde673041dbbcJames Dongvoid MediaProfiles::addStartTimeOffset(int cameraId, const char** atts) 3910f056290cb16763453f18bbef80cde673041dbbcJames Dong{ 392b1eb1a0dd38a36dd0c0626d3d57043dbd0042a92Eric Laurent int offsetTimeMs = 1000; 3930f056290cb16763453f18bbef80cde673041dbbcJames Dong if (atts[2]) { 3940f056290cb16763453f18bbef80cde673041dbbcJames Dong CHECK(!strcmp("startOffsetMs", atts[2])); 3950f056290cb16763453f18bbef80cde673041dbbcJames Dong offsetTimeMs = atoi(atts[3]); 3960f056290cb16763453f18bbef80cde673041dbbcJames Dong } 3970f056290cb16763453f18bbef80cde673041dbbcJames Dong 3983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s: cameraId=%d, offset=%d ms", __func__, cameraId, offsetTimeMs); 3990f056290cb16763453f18bbef80cde673041dbbcJames Dong mStartTimeOffsets.replaceValueFor(cameraId, offsetTimeMs); 4000f056290cb16763453f18bbef80cde673041dbbcJames Dong} 4018f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury/*static*/ MediaProfiles::ExportVideoProfile* 4028f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh ChowduryMediaProfiles::createExportVideoProfile(const char **atts) 4038f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury{ 4048f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury CHECK(!strcmp("name", atts[0]) && 4058f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury !strcmp("profile", atts[2]) && 4068f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury !strcmp("level", atts[4])); 4078f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury 4088f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury const size_t nMappings = 4098f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury sizeof(sVideoEncoderNameMap)/sizeof(sVideoEncoderNameMap[0]); 4108f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury const int codec = findTagForName(sVideoEncoderNameMap, nMappings, atts[1]); 4118f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury CHECK(codec != -1); 4128f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury 4138f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury MediaProfiles::ExportVideoProfile *profile = 4148f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury new MediaProfiles::ExportVideoProfile( 4158f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury codec, atoi(atts[3]), atoi(atts[5])); 4160f056290cb16763453f18bbef80cde673041dbbcJames Dong 4178f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury return profile; 4188f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury} 419cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng/*static*/ MediaProfiles::VideoEditorCap* 420cabd5f867ec69c0dfe8333cba46323cb58917402Hong TengMediaProfiles::createVideoEditorCap(const char **atts, MediaProfiles *profiles) 421cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng{ 422cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng CHECK(!strcmp("maxInputFrameWidth", atts[0]) && 423cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng !strcmp("maxInputFrameHeight", atts[2]) && 424cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng !strcmp("maxOutputFrameWidth", atts[4]) && 4253a9cefebd2c5d2157aefaed01c54f151dc64a5b3Hong Teng !strcmp("maxOutputFrameHeight", atts[6]) && 4263a9cefebd2c5d2157aefaed01c54f151dc64a5b3Hong Teng !strcmp("maxPrefetchYUVFrames", atts[8])); 427cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 428cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng MediaProfiles::VideoEditorCap *pVideoEditorCap = 429cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng new MediaProfiles::VideoEditorCap(atoi(atts[1]), atoi(atts[3]), 4303a9cefebd2c5d2157aefaed01c54f151dc64a5b3Hong Teng atoi(atts[5]), atoi(atts[7]), atoi(atts[9])); 431cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 432cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng logVideoEditorCap(*pVideoEditorCap); 433cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng profiles->mVideoEditorCap = pVideoEditorCap; 434cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 435cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng return pVideoEditorCap; 436cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng} 437cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 4381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 4391d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::startElementHandler(void *userData, const char *name, const char **atts) 4401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles *profiles = (MediaProfiles *) userData; 4421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (strcmp("Video", name) == 0) { 4431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createVideoCodec(atts, profiles); 4441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("Audio", name) == 0) { 4451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createAudioCodec(atts, profiles); 4461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("VideoEncoderCap", name) == 0 && 4471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 4481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoEncoders.add(createVideoEncoderCap(atts)); 4491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("AudioEncoderCap", name) == 0 && 4501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 4511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioEncoders.add(createAudioEncoderCap(atts)); 4521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("VideoDecoderCap", name) == 0 && 4531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 4541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoDecoders.add(createVideoDecoderCap(atts)); 4551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("AudioDecoderCap", name) == 0 && 4561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 4571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioDecoders.add(createAudioDecoderCap(atts)); 4581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("EncoderOutputFileFormat", name) == 0) { 4591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mEncoderOutputFileFormats.add(createEncoderOutputFileFormat(atts)); 4603eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } else if (strcmp("CamcorderProfiles", name) == 0) { 4613eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profiles->mCurrentCameraId = getCameraId(atts); 4620f056290cb16763453f18bbef80cde673041dbbcJames Dong profiles->addStartTimeOffset(profiles->mCurrentCameraId, atts); 4631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("EncoderProfile", name) == 0) { 4643eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profiles->mCamcorderProfiles.add( 4652a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong createCamcorderProfile(profiles->mCurrentCameraId, atts, profiles->mCameraIds)); 466f5a8385649204213dc19e1a64f4693931e048d85James Dong } else if (strcmp("ImageEncoding", name) == 0) { 4673eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profiles->addImageEncodingQualityLevel(profiles->mCurrentCameraId, atts); 468cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng } else if (strcmp("VideoEditorCap", name) == 0) { 469cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng createVideoEditorCap(atts, profiles); 4708f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury } else if (strcmp("ExportVideoProfile", name) == 0) { 4718f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury profiles->mVideoEditorExportProfiles.add(createExportVideoProfile(atts)); 4721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 4731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4752a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dongstatic bool isCamcorderProfile(camcorder_quality quality) { 4762a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong return quality >= CAMCORDER_QUALITY_LIST_START && 4772a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong quality <= CAMCORDER_QUALITY_LIST_END; 4782a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong} 4792a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 4802a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dongstatic bool isTimelapseProfile(camcorder_quality quality) { 4812a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong return quality >= CAMCORDER_QUALITY_TIME_LAPSE_LIST_START && 4822a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong quality <= CAMCORDER_QUALITY_TIME_LAPSE_LIST_END; 4832a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong} 4842a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 485e07909715b44cc56df723750af93f0608210f94dZhijun Hestatic bool isHighSpeedProfile(camcorder_quality quality) { 486e07909715b44cc56df723750af93f0608210f94dZhijun He return quality >= CAMCORDER_QUALITY_HIGH_SPEED_LIST_START && 487e07909715b44cc56df723750af93f0608210f94dZhijun He quality <= CAMCORDER_QUALITY_HIGH_SPEED_LIST_END; 488e07909715b44cc56df723750af93f0608210f94dZhijun He} 489e07909715b44cc56df723750af93f0608210f94dZhijun He 4902a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dongvoid MediaProfiles::initRequiredProfileRefs(const Vector<int>& cameraIds) { 49134fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn ALOGV("Number of camera ids: %zu", cameraIds.size()); 4922a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CHECK(cameraIds.size() > 0); 4932a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mRequiredProfileRefs = new RequiredProfiles[cameraIds.size()]; 4942a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong for (size_t i = 0, n = cameraIds.size(); i < n; ++i) { 4952a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mRequiredProfileRefs[i].mCameraId = cameraIds[i]; 4962a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong for (size_t j = 0; j < kNumRequiredProfiles; ++j) { 4972a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mRequiredProfileRefs[i].mRefs[j].mHasRefProfile = false; 4982a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mRequiredProfileRefs[i].mRefs[j].mRefProfileIndex = -1; 4992a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if ((j & 1) == 0) { // low resolution 5002a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mRequiredProfileRefs[i].mRefs[j].mResolutionProduct = 0x7FFFFFFF; 5012a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } else { // high resolution 5022a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mRequiredProfileRefs[i].mRefs[j].mResolutionProduct = 0; 5032a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5042a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5052a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5062a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong} 5072a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5082a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dongint MediaProfiles::getRequiredProfileRefIndex(int cameraId) { 5092a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong for (size_t i = 0, n = mCameraIds.size(); i < n; ++i) { 5102a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (mCameraIds[i] == cameraId) { 5112a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong return i; 5122a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5132a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5142a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong return -1; 5152a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong} 5162a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5172a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dongvoid MediaProfiles::checkAndAddRequiredProfilesIfNecessary() { 5182a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (sIsInitialized) { 5192a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong return; 5202a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5212a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5222a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong initRequiredProfileRefs(mCameraIds); 5232a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5242a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong for (size_t i = 0, n = mCamcorderProfiles.size(); i < n; ++i) { 5252a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong int product = mCamcorderProfiles[i]->mVideoCodec->mFrameWidth * 5262a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mCamcorderProfiles[i]->mVideoCodec->mFrameHeight; 5272a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5282a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong camcorder_quality quality = mCamcorderProfiles[i]->mQuality; 5292a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong int cameraId = mCamcorderProfiles[i]->mCameraId; 5302a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong int index = -1; 5312a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong int refIndex = getRequiredProfileRefIndex(cameraId); 5322a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CHECK(refIndex != -1); 5332a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong RequiredProfileRefInfo *info; 5342a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong camcorder_quality refQuality; 5352a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong VideoCodec *codec = NULL; 5362a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 537e07909715b44cc56df723750af93f0608210f94dZhijun He // Check high and low from either camcorder profile, timelapse profile 538e07909715b44cc56df723750af93f0608210f94dZhijun He // or high speed profile, but not all of them. Default, check camcorder profile 5392a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong size_t j = 0; 5403c8889e827d95b195fe5ba077a01cb5b6042e534Bernhard Rosenkraenzer size_t o = 2; 5412a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (isTimelapseProfile(quality)) { 5422a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong // Check timelapse profile instead. 5432a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong j = 2; 5443c8889e827d95b195fe5ba077a01cb5b6042e534Bernhard Rosenkraenzer o = kNumRequiredProfiles; 545e07909715b44cc56df723750af93f0608210f94dZhijun He } else if (isHighSpeedProfile(quality)) { 546e07909715b44cc56df723750af93f0608210f94dZhijun He // Skip the check for high speed profile. 547e07909715b44cc56df723750af93f0608210f94dZhijun He continue; 5482a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } else { 5492a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong // Must be camcorder profile. 5502a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CHECK(isCamcorderProfile(quality)); 5512a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5523c8889e827d95b195fe5ba077a01cb5b6042e534Bernhard Rosenkraenzer for (; j < o; ++j) { 5532a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong info = &(mRequiredProfileRefs[refIndex].mRefs[j]); 5542a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if ((j % 2 == 0 && product > info->mResolutionProduct) || // low 5552a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong (j % 2 != 0 && product < info->mResolutionProduct)) { // high 5562a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong continue; 5572a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5582a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong switch (j) { 5592a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong case 0: 5602a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong refQuality = CAMCORDER_QUALITY_LOW; 5612a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong break; 5622a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong case 1: 5632a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong refQuality = CAMCORDER_QUALITY_HIGH; 5642a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong break; 5652a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong case 2: 5662a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong refQuality = CAMCORDER_QUALITY_TIME_LAPSE_LOW; 5672a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong break; 5682a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong case 3: 5692a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong refQuality = CAMCORDER_QUALITY_TIME_LAPSE_HIGH; 5702a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong break; 5712a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong default: 5722a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CHECK(!"Should never reach here"); 5732a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5742a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5752a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (!info->mHasRefProfile) { 5762a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong index = getCamcorderProfileIndex(cameraId, refQuality); 5772a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5782a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (index == -1) { 5792a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong // New high or low quality profile is found. 5802a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong // Update its reference. 5812a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong info->mHasRefProfile = true; 5822a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong info->mRefProfileIndex = i; 5832a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong info->mResolutionProduct = product; 5842a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5852a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5862a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5872a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5882a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong for (size_t cameraId = 0; cameraId < mCameraIds.size(); ++cameraId) { 5892a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong for (size_t j = 0; j < kNumRequiredProfiles; ++j) { 5902a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong int refIndex = getRequiredProfileRefIndex(cameraId); 5912a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CHECK(refIndex != -1); 5922a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong RequiredProfileRefInfo *info = 5932a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong &mRequiredProfileRefs[refIndex].mRefs[j]; 5942a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5952a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (info->mHasRefProfile) { 5962a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5972a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CamcorderProfile *profile = 5982a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong new CamcorderProfile( 5992a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong *mCamcorderProfiles[info->mRefProfileIndex]); 6002a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 6012a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong // Overwrite the quality 6022a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong switch (j % kNumRequiredProfiles) { 6032a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong case 0: 6042a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong profile->mQuality = CAMCORDER_QUALITY_LOW; 6052a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong break; 6062a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong case 1: 6072a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong profile->mQuality = CAMCORDER_QUALITY_HIGH; 6082a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong break; 6092a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong case 2: 6102a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong profile->mQuality = CAMCORDER_QUALITY_TIME_LAPSE_LOW; 6112a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong break; 6122a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong case 3: 6132a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong profile->mQuality = CAMCORDER_QUALITY_TIME_LAPSE_HIGH; 6142a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong break; 6152a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong default: 6162a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CHECK(!"Should never come here"); 6172a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 6182a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 6192a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong int index = getCamcorderProfileIndex(cameraId, profile->mQuality); 6202a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (index != -1) { 62134fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn ALOGV("Profile quality %d for camera %zu already exists", 6222a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong profile->mQuality, cameraId); 6232a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CHECK(index == refIndex); 6242a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong continue; 6252a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 6262a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 6272a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong // Insert the new profile 62834fb29696b0f3abf61b10f8d053b1f33d501de0aMark Salyzyn ALOGV("Add a profile: quality %d=>%d for camera %zu", 6292a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mCamcorderProfiles[info->mRefProfileIndex]->mQuality, 6302a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong profile->mQuality, cameraId); 6312a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 6322a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mCamcorderProfiles.add(profile); 6332a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 6342a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 6352a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 6362a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong} 6372a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 6381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles* 6391d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::getInstance() 6401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getInstance"); 6421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Mutex::Autolock lock(sLock); 6431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!sIsInitialized) { 6441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong char value[PROPERTY_VALUE_MAX]; 6451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (property_get("media.settings.xml", value, NULL) <= 0) { 6461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const char *defaultXmlFile = "/etc/media_profiles.xml"; 6471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong FILE *fp = fopen(defaultXmlFile, "r"); 6481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (fp == NULL) { 6495ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("could not find media config xml file"); 6501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sInstance = createDefaultInstance(); 6511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else { 6521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong fclose(fp); // close the file first. 6531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sInstance = createInstanceFromXmlFile(defaultXmlFile); 6541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else { 6561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sInstance = createInstanceFromXmlFile(value); 6571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6582a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CHECK(sInstance != NULL); 6592a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong sInstance->checkAndAddRequiredProfilesIfNecessary(); 6602a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong sIsInitialized = true; 6611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return sInstance; 6641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoEncoderCap* 6671d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultH263VideoEncoderCap() 6681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return new MediaProfiles::VideoEncoderCap( 6701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong VIDEO_ENCODER_H263, 192000, 420000, 176, 352, 144, 288, 1, 20); 6711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoEncoderCap* 6741d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultM4vVideoEncoderCap() 6751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return new MediaProfiles::VideoEncoderCap( 6771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong VIDEO_ENCODER_MPEG_4_SP, 192000, 420000, 176, 352, 144, 288, 1, 20); 6781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 6821d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultVideoEncoders(MediaProfiles *profiles) 6831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoEncoders.add(createDefaultH263VideoEncoderCap()); 6851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoEncoders.add(createDefaultM4vVideoEncoderCap()); 6861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::CamcorderProfile* 689d5672bc7162fa49abf9bb5844195887e911aa7ceNipun KwatraMediaProfiles::createDefaultCamcorderTimeLapseQcifProfile(camcorder_quality quality) 690c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra{ 691c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra MediaProfiles::VideoCodec *videoCodec = 692d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra new MediaProfiles::VideoCodec(VIDEO_ENCODER_H263, 1000000, 176, 144, 20); 693c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra 694c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra AudioCodec *audioCodec = new AudioCodec(AUDIO_ENCODER_AMR_NB, 12200, 8000, 1); 695c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 696c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mCameraId = 0; 697c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mFileFormat = OUTPUT_FORMAT_THREE_GPP; 698d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profile->mQuality = quality; 699c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mDuration = 60; 700c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mVideoCodec = videoCodec; 701c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mAudioCodec = audioCodec; 702c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra return profile; 703c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra} 704c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra 705c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra/*static*/ MediaProfiles::CamcorderProfile* 706d5672bc7162fa49abf9bb5844195887e911aa7ceNipun KwatraMediaProfiles::createDefaultCamcorderTimeLapse480pProfile(camcorder_quality quality) 707c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra{ 708c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra MediaProfiles::VideoCodec *videoCodec = 709d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra new MediaProfiles::VideoCodec(VIDEO_ENCODER_H263, 20000000, 720, 480, 20); 710c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra 711c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra AudioCodec *audioCodec = new AudioCodec(AUDIO_ENCODER_AMR_NB, 12200, 8000, 1); 712c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 713c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mCameraId = 0; 714c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mFileFormat = OUTPUT_FORMAT_THREE_GPP; 715d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profile->mQuality = quality; 716c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mDuration = 60; 717c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mVideoCodec = videoCodec; 718c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mAudioCodec = audioCodec; 719c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra return profile; 720c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra} 721c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra 722d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra/*static*/ void 723d5672bc7162fa49abf9bb5844195887e911aa7ceNipun KwatraMediaProfiles::createDefaultCamcorderTimeLapseLowProfiles( 724d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile **lowTimeLapseProfile, 725d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile **lowSpecificTimeLapseProfile) { 726b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten *lowTimeLapseProfile = createDefaultCamcorderTimeLapseQcifProfile( 727b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten CAMCORDER_QUALITY_TIME_LAPSE_LOW); 728b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten *lowSpecificTimeLapseProfile = createDefaultCamcorderTimeLapseQcifProfile( 729b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten CAMCORDER_QUALITY_TIME_LAPSE_QCIF); 730d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra} 731d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra 732d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra/*static*/ void 733d5672bc7162fa49abf9bb5844195887e911aa7ceNipun KwatraMediaProfiles::createDefaultCamcorderTimeLapseHighProfiles( 734d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile **highTimeLapseProfile, 735d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile **highSpecificTimeLapseProfile) { 736b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten *highTimeLapseProfile = createDefaultCamcorderTimeLapse480pProfile( 737b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten CAMCORDER_QUALITY_TIME_LAPSE_HIGH); 738b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten *highSpecificTimeLapseProfile = createDefaultCamcorderTimeLapse480pProfile( 739b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten CAMCORDER_QUALITY_TIME_LAPSE_480P); 740d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra} 741d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra 742c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra/*static*/ MediaProfiles::CamcorderProfile* 743d5672bc7162fa49abf9bb5844195887e911aa7ceNipun KwatraMediaProfiles::createDefaultCamcorderQcifProfile(camcorder_quality quality) 7441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 7451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoCodec *videoCodec = 746d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra new MediaProfiles::VideoCodec(VIDEO_ENCODER_H263, 192000, 176, 144, 20); 7471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 748d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::AudioCodec *audioCodec = 749d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra new MediaProfiles::AudioCodec(AUDIO_ENCODER_AMR_NB, 12200, 8000, 1); 750d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra 751d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 7523eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profile->mCameraId = 0; 7531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mFileFormat = OUTPUT_FORMAT_THREE_GPP; 754d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profile->mQuality = quality; 755d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profile->mDuration = 30; 7561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mVideoCodec = videoCodec; 7571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mAudioCodec = audioCodec; 7581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profile; 7591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 7601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::CamcorderProfile* 762d5672bc7162fa49abf9bb5844195887e911aa7ceNipun KwatraMediaProfiles::createDefaultCamcorderCifProfile(camcorder_quality quality) 7631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 7641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoCodec *videoCodec = 765d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra new MediaProfiles::VideoCodec(VIDEO_ENCODER_H263, 360000, 352, 288, 20); 7661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 767d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra AudioCodec *audioCodec = new AudioCodec(AUDIO_ENCODER_AMR_NB, 12200, 8000, 1); 768d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 7693eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profile->mCameraId = 0; 7701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mFileFormat = OUTPUT_FORMAT_THREE_GPP; 771d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profile->mQuality = quality; 772d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profile->mDuration = 60; 7731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mVideoCodec = videoCodec; 7741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mAudioCodec = audioCodec; 7751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profile; 7761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 7771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 779d5672bc7162fa49abf9bb5844195887e911aa7ceNipun KwatraMediaProfiles::createDefaultCamcorderLowProfiles( 780d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile **lowProfile, 781d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile **lowSpecificProfile) { 782d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra *lowProfile = createDefaultCamcorderQcifProfile(CAMCORDER_QUALITY_LOW); 783d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra *lowSpecificProfile = createDefaultCamcorderQcifProfile(CAMCORDER_QUALITY_QCIF); 784d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra} 785d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra 786d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra/*static*/ void 787d5672bc7162fa49abf9bb5844195887e911aa7ceNipun KwatraMediaProfiles::createDefaultCamcorderHighProfiles( 788d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile **highProfile, 789d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile **highSpecificProfile) { 790d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra *highProfile = createDefaultCamcorderCifProfile(CAMCORDER_QUALITY_HIGH); 791d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra *highSpecificProfile = createDefaultCamcorderCifProfile(CAMCORDER_QUALITY_CIF); 792d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra} 793d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra 794d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra/*static*/ void 7951d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultCamcorderProfiles(MediaProfiles *profiles) 7961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 797d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra // low camcorder profiles. 798d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile *lowProfile, *lowSpecificProfile; 799d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra createDefaultCamcorderLowProfiles(&lowProfile, &lowSpecificProfile); 800d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profiles->mCamcorderProfiles.add(lowProfile); 801d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profiles->mCamcorderProfiles.add(lowSpecificProfile); 802d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra 803d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra // high camcorder profiles. 804d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile* highProfile, *highSpecificProfile; 805d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra createDefaultCamcorderHighProfiles(&highProfile, &highSpecificProfile); 806d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profiles->mCamcorderProfiles.add(highProfile); 807d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profiles->mCamcorderProfiles.add(highSpecificProfile); 808d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra 809d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra // low camcorder time lapse profiles. 810d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile *lowTimeLapseProfile, *lowSpecificTimeLapseProfile; 811d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra createDefaultCamcorderTimeLapseLowProfiles(&lowTimeLapseProfile, &lowSpecificTimeLapseProfile); 812d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profiles->mCamcorderProfiles.add(lowTimeLapseProfile); 813d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profiles->mCamcorderProfiles.add(lowSpecificTimeLapseProfile); 814d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra 815d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra // high camcorder time lapse profiles. 816d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile *highTimeLapseProfile, *highSpecificTimeLapseProfile; 817b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten createDefaultCamcorderTimeLapseHighProfiles(&highTimeLapseProfile, 818b187de1ada34a9023c05d020a4592686ba761278Glenn Kasten &highSpecificTimeLapseProfile); 819d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profiles->mCamcorderProfiles.add(highTimeLapseProfile); 820d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profiles->mCamcorderProfiles.add(highSpecificTimeLapseProfile); 8218031ec79eb657a0ae84325410578ea87f50eeb54James Dong 8228031ec79eb657a0ae84325410578ea87f50eeb54James Dong // For emulator and other legacy devices which does not have a 8238031ec79eb657a0ae84325410578ea87f50eeb54James Dong // media_profiles.xml file, We assume that the default camera id 8248031ec79eb657a0ae84325410578ea87f50eeb54James Dong // is 0 and that is the only camera available. 8258031ec79eb657a0ae84325410578ea87f50eeb54James Dong profiles->mCameraIds.push(0); 8261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 8271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 8291d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultAudioEncoders(MediaProfiles *profiles) 8301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 8311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioEncoders.add(createDefaultAmrNBEncoderCap()); 8321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 8331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 8351d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultVideoDecoders(MediaProfiles *profiles) 8361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 8371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoDecoderCap *cap = 8381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoDecoderCap(VIDEO_DECODER_WMV); 8391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoDecoders.add(cap); 8411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 8421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 8441d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultAudioDecoders(MediaProfiles *profiles) 8451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 8461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioDecoderCap *cap = 8471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioDecoderCap(AUDIO_DECODER_WMA); 8481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioDecoders.add(cap); 8501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 8511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 8531d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultEncoderOutputFileFormats(MediaProfiles *profiles) 8541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 8551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mEncoderOutputFileFormats.add(OUTPUT_FORMAT_THREE_GPP); 8561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mEncoderOutputFileFormats.add(OUTPUT_FORMAT_MPEG_4); 8571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 8581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioEncoderCap* 8601d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultAmrNBEncoderCap() 8611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 8621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return new MediaProfiles::AudioEncoderCap( 8631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong AUDIO_ENCODER_AMR_NB, 5525, 12200, 8000, 8000, 1, 1); 8641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 8651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 866f5a8385649204213dc19e1a64f4693931e048d85James Dong/*static*/ void 867f5a8385649204213dc19e1a64f4693931e048d85James DongMediaProfiles::createDefaultImageEncodingQualityLevels(MediaProfiles *profiles) 868f5a8385649204213dc19e1a64f4693931e048d85James Dong{ 8693eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang ImageEncodingQualityLevels *levels = new ImageEncodingQualityLevels(); 8703eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mCameraId = 0; 8713eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mLevels.add(70); 8723eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mLevels.add(80); 8733eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mLevels.add(90); 8743eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profiles->mImageEncodingQualityLevels.add(levels); 875f5a8385649204213dc19e1a64f4693931e048d85James Dong} 876f5a8385649204213dc19e1a64f4693931e048d85James Dong 877cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng/*static*/ void 878cabd5f867ec69c0dfe8333cba46323cb58917402Hong TengMediaProfiles::createDefaultVideoEditorCap(MediaProfiles *profiles) 879cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng{ 880cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng profiles->mVideoEditorCap = 881cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng new MediaProfiles::VideoEditorCap( 882cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng VIDEOEDITOR_DEFAULT_MAX_INPUT_FRAME_WIDTH, 883cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng VIDEOEDITOR_DEFUALT_MAX_INPUT_FRAME_HEIGHT, 884cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng VIDEOEDITOR_DEFAULT_MAX_OUTPUT_FRAME_WIDTH, 8853a9cefebd2c5d2157aefaed01c54f151dc64a5b3Hong Teng VIDEOEDITOR_DEFUALT_MAX_OUTPUT_FRAME_HEIGHT, 8863a9cefebd2c5d2157aefaed01c54f151dc64a5b3Hong Teng VIDEOEDITOR_DEFAULT_MAX_PREFETCH_YUV_FRAMES); 887cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng} 8888f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury/*static*/ void 8898f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh ChowduryMediaProfiles::createDefaultExportVideoProfiles(MediaProfiles *profiles) 8908f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury{ 8918f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury // Create default video export profiles 8928f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury profiles->mVideoEditorExportProfiles.add( 8938f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury new ExportVideoProfile(VIDEO_ENCODER_H263, 8948f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level10)); 8958f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury profiles->mVideoEditorExportProfiles.add( 8968f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury new ExportVideoProfile(VIDEO_ENCODER_MPEG_4_SP, 8978f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level1)); 8988f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury profiles->mVideoEditorExportProfiles.add( 8998f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury new ExportVideoProfile(VIDEO_ENCODER_H264, 9008f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel13)); 9018f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury} 902cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 9031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles* 9041d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultInstance() 9051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 9061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles *profiles = new MediaProfiles; 9071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultCamcorderProfiles(profiles); 9081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultVideoEncoders(profiles); 9091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultAudioEncoders(profiles); 9101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultVideoDecoders(profiles); 9111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultAudioDecoders(profiles); 9121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultEncoderOutputFileFormats(profiles); 913f5a8385649204213dc19e1a64f4693931e048d85James Dong createDefaultImageEncodingQualityLevels(profiles); 914cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng createDefaultVideoEditorCap(profiles); 9158f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury createDefaultExportVideoProfiles(profiles); 9161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profiles; 9171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 9181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles* 9201d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createInstanceFromXmlFile(const char *xml) 9211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 9221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong FILE *fp = NULL; 9231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK((fp = fopen(xml, "r"))); 9241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong XML_Parser parser = ::XML_ParserCreate(NULL); 9261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(parser != NULL); 9271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles *profiles = new MediaProfiles(); 9291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::XML_SetUserData(parser, profiles); 9301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::XML_SetElementHandler(parser, startElementHandler, NULL); 9311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong /* 9331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong FIXME: 9341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong expat is not compiled with -DXML_DTD. We don't have DTD parsing support. 9351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!::XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS)) { 93729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("failed to enable DTD support in the xml file"); 9381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return UNKNOWN_ERROR; 9391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 9401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong */ 9421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int BUFF_SIZE = 512; 9441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (;;) { 9451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong void *buff = ::XML_GetBuffer(parser, BUFF_SIZE); 9461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (buff == NULL) { 94729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("failed to in call to XML_GetBuffer()"); 9481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete profiles; 9491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles = NULL; 9501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong goto exit; 9511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 9521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int bytes_read = ::fread(buff, 1, BUFF_SIZE, fp); 9541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (bytes_read < 0) { 95529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("failed in call to read"); 9561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete profiles; 9571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles = NULL; 9581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong goto exit; 9591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 9601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(::XML_ParseBuffer(parser, bytes_read, bytes_read == 0)); 9621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (bytes_read == 0) break; // done parsing the xml file 9641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 9651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongexit: 9671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::XML_ParserFree(parser); 9681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::fclose(fp); 9691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profiles; 9701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 9711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9721d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<output_format> MediaProfiles::getOutputFileFormats() const 9731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 9741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return mEncoderOutputFileFormats; // copy out 9751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 9761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9771d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<video_encoder> MediaProfiles::getVideoEncoders() const 9781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 9791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<video_encoder> encoders; 9801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoEncoders.size(); ++i) { 9811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong encoders.add(mVideoEncoders[i]->mCodec); 9821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 9831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return encoders; // copy out 9841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 9851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongint MediaProfiles::getVideoEncoderParamByName(const char *name, video_encoder codec) const 9871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 9883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getVideoEncoderParamByName: %s for codec %d", name, codec); 9891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int index = -1; 9901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0, n = mVideoEncoders.size(); i < n; ++i) { 9911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (mVideoEncoders[i]->mCodec == codec) { 9921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong index = i; 9931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 9941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 9951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 9961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (index == -1) { 99729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("The given video encoder %d is not found", codec); 9981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 9991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 10001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 10011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.width.min", name)) return mVideoEncoders[index]->mMinFrameWidth; 10021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.width.max", name)) return mVideoEncoders[index]->mMaxFrameWidth; 10031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.height.min", name)) return mVideoEncoders[index]->mMinFrameHeight; 10041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.height.max", name)) return mVideoEncoders[index]->mMaxFrameHeight; 10051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.bps.min", name)) return mVideoEncoders[index]->mMinBitRate; 10061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.bps.max", name)) return mVideoEncoders[index]->mMaxBitRate; 10071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.fps.min", name)) return mVideoEncoders[index]->mMinFrameRate; 10081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.fps.max", name)) return mVideoEncoders[index]->mMaxFrameRate; 10091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 101029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("The given video encoder param name %s is not found", name); 10111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 10121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 10138f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowduryint MediaProfiles::getVideoEditorExportParamByName( 10148f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury const char *name, int codec) const 10158f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury{ 10163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getVideoEditorExportParamByName: name %s codec %d", name, codec); 10178f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury ExportVideoProfile *exportProfile = NULL; 10188f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury int index = -1; 10198f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury for (size_t i =0; i < mVideoEditorExportProfiles.size(); i++) { 10208f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury exportProfile = mVideoEditorExportProfiles[i]; 10218f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury if (exportProfile->mCodec == codec) { 10228f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury index = i; 10238f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury break; 10248f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury } 10258f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury } 10268f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury if (index == -1) { 102729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("The given video decoder %d is not found", codec); 10288f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury return -1; 10298f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury } 10308f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury if (!strcmp("videoeditor.export.profile", name)) 10318f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury return exportProfile->mProfile; 10328f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury if (!strcmp("videoeditor.export.level", name)) 10338f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury return exportProfile->mLevel; 10341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 103529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("The given video editor export param name %s is not found", name); 10368f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury return -1; 10378f74b712fbf5c24de8bc799b7129dc802747a6f4Rajneesh Chowdury} 1038cabd5f867ec69c0dfe8333cba46323cb58917402Hong Tengint MediaProfiles::getVideoEditorCapParamByName(const char *name) const 1039cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng{ 10403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getVideoEditorCapParamByName: %s", name); 1041cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 1042cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng if (mVideoEditorCap == NULL) { 104329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("The mVideoEditorCap is not created, then create default cap."); 1044cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng createDefaultVideoEditorCap(sInstance); 1045cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng } 1046cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 1047cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng if (!strcmp("videoeditor.input.width.max", name)) 1048cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng return mVideoEditorCap->mMaxInputFrameWidth; 1049cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng if (!strcmp("videoeditor.input.height.max", name)) 1050cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng return mVideoEditorCap->mMaxInputFrameHeight; 1051cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng if (!strcmp("videoeditor.output.width.max", name)) 1052cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng return mVideoEditorCap->mMaxOutputFrameWidth; 1053cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng if (!strcmp("videoeditor.output.height.max", name)) 1054cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng return mVideoEditorCap->mMaxOutputFrameHeight; 10553a9cefebd2c5d2157aefaed01c54f151dc64a5b3Hong Teng if (!strcmp("maxPrefetchYUVFrames", name)) 10563a9cefebd2c5d2157aefaed01c54f151dc64a5b3Hong Teng return mVideoEditorCap->mMaxPrefetchYUVFrames; 1057cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 105829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("The given video editor param name %s is not found", name); 1059cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng return -1; 1060cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng} 1061cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 10621d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<audio_encoder> MediaProfiles::getAudioEncoders() const 10631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 10641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<audio_encoder> encoders; 10651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioEncoders.size(); ++i) { 10661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong encoders.add(mAudioEncoders[i]->mCodec); 10671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 10681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return encoders; // copy out 10691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 10701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 10711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongint MediaProfiles::getAudioEncoderParamByName(const char *name, audio_encoder codec) const 10721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 10733856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getAudioEncoderParamByName: %s for codec %d", name, codec); 10741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int index = -1; 10751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0, n = mAudioEncoders.size(); i < n; ++i) { 10761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (mAudioEncoders[i]->mCodec == codec) { 10771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong index = i; 10781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 10791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 10801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 10811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (index == -1) { 108229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("The given audio encoder %d is not found", codec); 10831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 10841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 10851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 10861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.ch.min", name)) return mAudioEncoders[index]->mMinChannels; 10871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.ch.max", name)) return mAudioEncoders[index]->mMaxChannels; 10881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.bps.min", name)) return mAudioEncoders[index]->mMinBitRate; 10891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.bps.max", name)) return mAudioEncoders[index]->mMaxBitRate; 10901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.hz.min", name)) return mAudioEncoders[index]->mMinSampleRate; 10911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.hz.max", name)) return mAudioEncoders[index]->mMaxSampleRate; 10921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 109329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("The given audio encoder param name %s is not found", name); 10941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 10951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 10961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 10971d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<video_decoder> MediaProfiles::getVideoDecoders() const 10981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 10991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<video_decoder> decoders; 11001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoDecoders.size(); ++i) { 11011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong decoders.add(mVideoDecoders[i]->mCodec); 11021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 11031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return decoders; // copy out 11041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 11051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 11061d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<audio_decoder> MediaProfiles::getAudioDecoders() const 11071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 11081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<audio_decoder> decoders; 11091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioDecoders.size(); ++i) { 11101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong decoders.add(mAudioDecoders[i]->mCodec); 11111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 11121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return decoders; // copy out 11131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 11141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 11158bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatraint MediaProfiles::getCamcorderProfileIndex(int cameraId, camcorder_quality quality) const 11161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 11171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int index = -1; 11181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0, n = mCamcorderProfiles.size(); i < n; ++i) { 11193eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (mCamcorderProfiles[i]->mCameraId == cameraId && 11203eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang mCamcorderProfiles[i]->mQuality == quality) { 11211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong index = i; 11221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 11231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 11241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 11258bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra return index; 11268bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra} 11278bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra 11288bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatraint MediaProfiles::getCamcorderProfileParamByName(const char *name, 11298bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra int cameraId, 11308bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra camcorder_quality quality) const 11318bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra{ 11323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getCamcorderProfileParamByName: %s for camera %d, quality %d", 1133e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten name, cameraId, quality); 11348bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra 11358bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra int index = getCamcorderProfileIndex(cameraId, quality); 11361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (index == -1) { 113729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("The given camcorder profile camera %d quality %d is not found", 1138e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten cameraId, quality); 11391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 11401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 11411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1142f5a8385649204213dc19e1a64f4693931e048d85James Dong if (!strcmp("duration", name)) return mCamcorderProfiles[index]->mDuration; 11431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("file.format", name)) return mCamcorderProfiles[index]->mFileFormat; 11441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.codec", name)) return mCamcorderProfiles[index]->mVideoCodec->mCodec; 11451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.width", name)) return mCamcorderProfiles[index]->mVideoCodec->mFrameWidth; 11461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.height", name)) return mCamcorderProfiles[index]->mVideoCodec->mFrameHeight; 11471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.bps", name)) return mCamcorderProfiles[index]->mVideoCodec->mBitRate; 11481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.fps", name)) return mCamcorderProfiles[index]->mVideoCodec->mFrameRate; 11491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.codec", name)) return mCamcorderProfiles[index]->mAudioCodec->mCodec; 11501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.bps", name)) return mCamcorderProfiles[index]->mAudioCodec->mBitRate; 11511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.ch", name)) return mCamcorderProfiles[index]->mAudioCodec->mChannels; 11521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.hz", name)) return mCamcorderProfiles[index]->mAudioCodec->mSampleRate; 11531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 115429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("The given camcorder profile param id %d name %s is not found", cameraId, name); 11551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 11561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 11571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 11588bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatrabool MediaProfiles::hasCamcorderProfile(int cameraId, camcorder_quality quality) const 11598bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra{ 11608bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra return (getCamcorderProfileIndex(cameraId, quality) != -1); 11618bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra} 11628bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra 11633eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangVector<int> MediaProfiles::getImageEncodingQualityLevels(int cameraId) const 1164f5a8385649204213dc19e1a64f4693931e048d85James Dong{ 11653eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang Vector<int> result; 11663eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang ImageEncodingQualityLevels *levels = findImageEncodingQualityLevels(cameraId); 11673eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (levels != NULL) { 11683eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang result = levels->mLevels; // copy out 11693eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } 11703eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang return result; 1171f5a8385649204213dc19e1a64f4693931e048d85James Dong} 1172f5a8385649204213dc19e1a64f4693931e048d85James Dong 11730f056290cb16763453f18bbef80cde673041dbbcJames Dongint MediaProfiles::getStartTimeOffsetMs(int cameraId) const { 11740f056290cb16763453f18bbef80cde673041dbbcJames Dong int offsetTimeMs = -1; 11750f056290cb16763453f18bbef80cde673041dbbcJames Dong ssize_t index = mStartTimeOffsets.indexOfKey(cameraId); 11760f056290cb16763453f18bbef80cde673041dbbcJames Dong if (index >= 0) { 11770f056290cb16763453f18bbef80cde673041dbbcJames Dong offsetTimeMs = mStartTimeOffsets.valueFor(cameraId); 11780f056290cb16763453f18bbef80cde673041dbbcJames Dong } 11793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("offsetTime=%d ms and cameraId=%d", offsetTimeMs, cameraId); 11800f056290cb16763453f18bbef80cde673041dbbcJames Dong return offsetTimeMs; 11810f056290cb16763453f18bbef80cde673041dbbcJames Dong} 11820f056290cb16763453f18bbef80cde673041dbbcJames Dong 11831d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::~MediaProfiles() 11841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 11851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK("destructor should never be called" == 0); 11861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#if 0 11871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioEncoders.size(); ++i) { 11881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mAudioEncoders[i]; 11891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 11901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mAudioEncoders.clear(); 11911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 11921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoEncoders.size(); ++i) { 11931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mVideoEncoders[i]; 11941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 11951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mVideoEncoders.clear(); 11961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 11971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoDecoders.size(); ++i) { 11981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mVideoDecoders[i]; 11991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 12001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mVideoDecoders.clear(); 12011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 12021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioDecoders.size(); ++i) { 12031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mAudioDecoders[i]; 12041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 12051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mAudioDecoders.clear(); 12061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 12071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mCamcorderProfiles.size(); ++i) { 12081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mCamcorderProfiles[i]; 12091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 12101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mCamcorderProfiles.clear(); 12111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#endif 12121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 12131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} // namespace android 1214