MediaProfiles.cpp revision cabd5f867ec69c0dfe8333cba46323cb58917402
11d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/* 21d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** 31d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** Copyright 2010, The Android Open Source Project 41d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** 51d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** Licensed under the Apache License, Version 2.0 (the "License"); 61d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** you may not use this file except in compliance with the License. 71d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** You may obtain a copy of the License at 81d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** 91d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** http://www.apache.org/licenses/LICENSE-2.0 101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** 111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** Unless required by applicable law or agreed to in writing, software 121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** distributed under the License is distributed on an "AS IS" BASIS, 131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** See the License for the specific language governing permissions and 151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong** limitations under the License. 161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong*/ 171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong//#define LOG_NDEBUG 0 201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#define LOG_TAG "MediaProfiles" 211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#include <stdlib.h> 231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#include <utils/Log.h> 241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#include <utils/Vector.h> 251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#include <cutils/properties.h> 261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#include <expat.h> 271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#include <media/MediaProfiles.h> 281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#include <media/stagefright/MediaDebug.h> 291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongnamespace android { 311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 321d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMutex MediaProfiles::sLock; 331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongbool MediaProfiles::sIsInitialized = false; 341d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles *MediaProfiles::sInstance = NULL; 351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sVideoEncoderNameMap[] = { 371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"h263", VIDEO_ENCODER_H263}, 381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"h264", VIDEO_ENCODER_H264}, 391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"m4v", VIDEO_ENCODER_MPEG_4_SP} 401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sAudioEncoderNameMap[] = { 431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"amrnb", AUDIO_ENCODER_AMR_NB}, 441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"amrwb", AUDIO_ENCODER_AMR_WB}, 451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"aac", AUDIO_ENCODER_AAC}, 461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sFileFormatMap[] = { 491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"3gp", OUTPUT_FORMAT_THREE_GPP}, 501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"mp4", OUTPUT_FORMAT_MPEG_4} 511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sVideoDecoderNameMap[] = { 541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"wmv", VIDEO_DECODER_WMV} 551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sAudioDecoderNameMap[] = { 581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"wma", AUDIO_DECODER_WMA} 591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongconst MediaProfiles::NameToTagMap MediaProfiles::sCamcorderQualityNameMap[] = { 62c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"low", CAMCORDER_QUALITY_LOW}, 631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong {"high", CAMCORDER_QUALITY_HIGH}, 64c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"qcif", CAMCORDER_QUALITY_QCIF}, 659783ed8f85af3d7c72030098acfed7e1d6638349Nipun Kwatra {"cif", CAMCORDER_QUALITY_CIF}, 66c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"480p", CAMCORDER_QUALITY_480P}, 67c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"720p", CAMCORDER_QUALITY_720P}, 68c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"1080p", CAMCORDER_QUALITY_1080P}, 69c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra 70c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapselow", CAMCORDER_QUALITY_TIME_LAPSE_LOW}, 71c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapsehigh", CAMCORDER_QUALITY_TIME_LAPSE_HIGH}, 72c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapseqcif", CAMCORDER_QUALITY_TIME_LAPSE_QCIF}, 739783ed8f85af3d7c72030098acfed7e1d6638349Nipun Kwatra {"timelapsecif", CAMCORDER_QUALITY_TIME_LAPSE_CIF}, 74c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapse480p", CAMCORDER_QUALITY_TIME_LAPSE_480P}, 75c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapse720p", CAMCORDER_QUALITY_TIME_LAPSE_720P}, 76c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra {"timelapse1080p", CAMCORDER_QUALITY_TIME_LAPSE_1080P} 771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong}; 781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 801d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logVideoCodec(const MediaProfiles::VideoCodec& codec) 811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("video codec:"); 831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", codec.mCodec); 841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("bit rate: %d", codec.mBitRate); 851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame width: %d", codec.mFrameWidth); 861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame height: %d", codec.mFrameHeight); 871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame rate: %d", codec.mFrameRate); 881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 911d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logAudioCodec(const MediaProfiles::AudioCodec& codec) 921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("audio codec:"); 941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", codec.mCodec); 951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("bit rate: %d", codec.mBitRate); 961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("sample rate: %d", codec.mSampleRate); 971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("number of channels: %d", codec.mChannels); 981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 1011d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logVideoEncoderCap(const MediaProfiles::VideoEncoderCap& cap) 1021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("video encoder cap:"); 1041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", cap.mCodec); 1051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("bit rate: min = %d and max = %d", cap.mMinBitRate, cap.mMaxBitRate); 1061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame width: min = %d and max = %d", cap.mMinFrameWidth, cap.mMaxFrameWidth); 1071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame height: min = %d and max = %d", cap.mMinFrameHeight, cap.mMaxFrameHeight); 1081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("frame rate: min = %d and max = %d", cap.mMinFrameRate, cap.mMaxFrameRate); 1091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 1121d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logAudioEncoderCap(const MediaProfiles::AudioEncoderCap& cap) 1131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("audio encoder cap:"); 1151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", cap.mCodec); 1161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("bit rate: min = %d and max = %d", cap.mMinBitRate, cap.mMaxBitRate); 1171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("sample rate: min = %d and max = %d", cap.mMinSampleRate, cap.mMaxSampleRate); 1181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("number of channels: min = %d and max = %d", cap.mMinChannels, cap.mMaxChannels); 1191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 1221d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logVideoDecoderCap(const MediaProfiles::VideoDecoderCap& cap) 1231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("video decoder cap:"); 1251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", cap.mCodec); 1261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 1291d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::logAudioDecoderCap(const MediaProfiles::AudioDecoderCap& cap) 1301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("audio codec cap:"); 1321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("codec = %d", cap.mCodec); 1331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 135cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng/*static*/ void 136cabd5f867ec69c0dfe8333cba46323cb58917402Hong TengMediaProfiles::logVideoEditorCap(const MediaProfiles::VideoEditorCap& cap) 137cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng{ 138cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng LOGV("videoeditor cap:"); 139cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng LOGV("mMaxInputFrameWidth = %d", cap.mMaxInputFrameWidth); 140cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng LOGV("mMaxInputFrameHeight = %d", cap.mMaxInputFrameHeight); 141cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng LOGV("mMaxOutputFrameWidth = %d", cap.mMaxOutputFrameWidth); 142cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng LOGV("mMaxOutputFrameHeight = %d", cap.mMaxOutputFrameHeight); 143cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng} 144cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 1451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ int 1461d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::findTagForName(const MediaProfiles::NameToTagMap *map, size_t nMappings, const char *name) 1471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int tag = -1; 1491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < nMappings; ++i) { 1501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp(map[i].name, name)) { 1511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong tag = map[i].tag; 1521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 1531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 1541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 1551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return tag; 1561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoCodec* 1591d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createVideoCodec(const char **atts, MediaProfiles *profiles) 1601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("codec", atts[0]) && 1621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("bitRate", atts[2]) && 1631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("width", atts[4]) && 1641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("height", atts[6]) && 1651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("frameRate", atts[8])); 1661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sVideoEncoderNameMap)/sizeof(sVideoEncoderNameMap[0]); 1681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sVideoEncoderNameMap, nMappings, atts[1]); 1691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 1701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoCodec *videoCodec = 1721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoCodec(static_cast<video_encoder>(codec), 1731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[3]), atoi(atts[5]), atoi(atts[7]), atoi(atts[9])); 1741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logVideoCodec(*videoCodec); 1751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong size_t nCamcorderProfiles; 1771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK((nCamcorderProfiles = profiles->mCamcorderProfiles.size()) >= 1); 1781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mCamcorderProfiles[nCamcorderProfiles - 1]->mVideoCodec = videoCodec; 1791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return videoCodec; 1801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 1811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioCodec* 1831d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createAudioCodec(const char **atts, MediaProfiles *profiles) 1841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 1851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("codec", atts[0]) && 1861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("bitRate", atts[2]) && 1871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("sampleRate", atts[4]) && 1881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("channels", atts[6])); 1891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sAudioEncoderNameMap)/sizeof(sAudioEncoderNameMap[0]); 1901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sAudioEncoderNameMap, nMappings, atts[1]); 1911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 1921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioCodec *audioCodec = 1941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioCodec(static_cast<audio_encoder>(codec), 1951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[3]), atoi(atts[5]), atoi(atts[7])); 1961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logAudioCodec(*audioCodec); 1971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong size_t nCamcorderProfiles; 1991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK((nCamcorderProfiles = profiles->mCamcorderProfiles.size()) >= 1); 2001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mCamcorderProfiles[nCamcorderProfiles - 1]->mAudioCodec = audioCodec; 2011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return audioCodec; 2021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioDecoderCap* 2041d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createAudioDecoderCap(const char **atts) 2051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0]) && 2071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("enabled", atts[2])); 2081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sAudioDecoderNameMap)/sizeof(sAudioDecoderNameMap[0]); 2101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sAudioDecoderNameMap, nMappings, atts[1]); 2111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 2121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioDecoderCap *cap = 2141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioDecoderCap(static_cast<audio_decoder>(codec)); 2151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logAudioDecoderCap(*cap); 2161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return cap; 2171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoDecoderCap* 2201d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createVideoDecoderCap(const char **atts) 2211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0]) && 2231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("enabled", atts[2])); 2241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sVideoDecoderNameMap)/sizeof(sVideoDecoderNameMap[0]); 2261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sVideoDecoderNameMap, nMappings, atts[1]); 2271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 2281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoDecoderCap *cap = 2301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoDecoderCap(static_cast<video_decoder>(codec)); 2311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logVideoDecoderCap(*cap); 2321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return cap; 2331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoEncoderCap* 2361d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createVideoEncoderCap(const char **atts) 2371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0]) && 2391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("enabled", atts[2]) && 2401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minBitRate", atts[4]) && 2411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxBitRate", atts[6]) && 2421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minFrameWidth", atts[8]) && 2431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxFrameWidth", atts[10]) && 2441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minFrameHeight", atts[12]) && 2451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxFrameHeight", atts[14]) && 2461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minFrameRate", atts[16]) && 2471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxFrameRate", atts[18])); 2481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sVideoEncoderNameMap)/sizeof(sVideoEncoderNameMap[0]); 2501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sVideoEncoderNameMap, nMappings, atts[1]); 2511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 2521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoEncoderCap *cap = 2541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoEncoderCap(static_cast<video_encoder>(codec), 2551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[5]), atoi(atts[7]), atoi(atts[9]), atoi(atts[11]), atoi(atts[13]), 2561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[15]), atoi(atts[17]), atoi(atts[19])); 2571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logVideoEncoderCap(*cap); 2581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return cap; 2591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioEncoderCap* 2621d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createAudioEncoderCap(const char **atts) 2631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0]) && 2651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("enabled", atts[2]) && 2661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minBitRate", atts[4]) && 2671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxBitRate", atts[6]) && 2681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minSampleRate", atts[8]) && 2691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxSampleRate", atts[10]) && 2701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("minChannels", atts[12]) && 2711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("maxChannels", atts[14])); 2721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings = sizeof(sAudioEncoderNameMap)/sizeof(sAudioEncoderNameMap[0]); 2741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int codec = findTagForName(sAudioEncoderNameMap, nMappings, atts[1]); 2751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(codec != -1); 2761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioEncoderCap *cap = 2781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioEncoderCap(static_cast<audio_encoder>(codec), atoi(atts[5]), atoi(atts[7]), 2791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[9]), atoi(atts[11]), atoi(atts[13]), 2801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong atoi(atts[15])); 2811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong logAudioEncoderCap(*cap); 2821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return cap; 2831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ output_format 2861d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createEncoderOutputFileFormat(const char **atts) 2871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 2881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("name", atts[0])); 2891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nMappings =sizeof(sFileFormatMap)/sizeof(sFileFormatMap[0]); 2911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int format = findTagForName(sFileFormatMap, nMappings, atts[1]); 2921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(format != -1); 2931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return static_cast<output_format>(format); 2951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 2961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 2972a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dongstatic bool isCameraIdFound(int cameraId, const Vector<int>& cameraIds) { 2982a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong for (int i = 0, n = cameraIds.size(); i < n; ++i) { 2992a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (cameraId == cameraIds[i]) { 3002a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong return true; 3012a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 3022a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 3032a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong return false; 3042a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong} 3052a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 3061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::CamcorderProfile* 3072a7e0a1eb29306982fd77bdc64d324464a48a2b9James DongMediaProfiles::createCamcorderProfile(int cameraId, const char **atts, Vector<int>& cameraIds) 3081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 3091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(!strcmp("quality", atts[0]) && 3101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("fileFormat", atts[2]) && 3111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong !strcmp("duration", atts[4])); 3121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nProfileMappings = sizeof(sCamcorderQualityNameMap)/sizeof(sCamcorderQualityNameMap[0]); 3141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int quality = findTagForName(sCamcorderQualityNameMap, nProfileMappings, atts[1]); 3151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(quality != -1); 3161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const size_t nFormatMappings = sizeof(sFileFormatMap)/sizeof(sFileFormatMap[0]); 3181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int fileFormat = findTagForName(sFileFormatMap, nFormatMappings, atts[3]); 3191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(fileFormat != -1); 3201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 3223eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profile->mCameraId = cameraId; 3232a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (!isCameraIdFound(cameraId, cameraIds)) { 3242a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong cameraIds.add(cameraId); 3252a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 3261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mFileFormat = static_cast<output_format>(fileFormat); 3271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mQuality = static_cast<camcorder_quality>(quality); 3281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mDuration = atoi(atts[5]); 3291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profile; 3301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 3311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 3323eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangMediaProfiles::ImageEncodingQualityLevels* 3333eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangMediaProfiles::findImageEncodingQualityLevels(int cameraId) const 3343eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang{ 3353eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang int n = mImageEncodingQualityLevels.size(); 3363eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang for (int i = 0; i < n; i++) { 3373eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang ImageEncodingQualityLevels *levels = mImageEncodingQualityLevels[i]; 3383eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (levels->mCameraId == cameraId) { 3393eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang return levels; 3403eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } 3413eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } 3423eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang return NULL; 3433eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang} 3443eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang 3453eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Changvoid MediaProfiles::addImageEncodingQualityLevel(int cameraId, const char** atts) 346f5a8385649204213dc19e1a64f4693931e048d85James Dong{ 347f5a8385649204213dc19e1a64f4693931e048d85James Dong CHECK(!strcmp("quality", atts[0])); 3483eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang int quality = atoi(atts[1]); 3493eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang LOGV("%s: cameraId=%d, quality=%d\n", __func__, cameraId, quality); 3503eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang ImageEncodingQualityLevels *levels = findImageEncodingQualityLevels(cameraId); 3513eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang 3523eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (levels == NULL) { 3533eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels = new ImageEncodingQualityLevels(); 3543eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mCameraId = cameraId; 3553eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang mImageEncodingQualityLevels.add(levels); 3563eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } 3573eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang 3583eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mLevels.add(quality); 3593eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang} 3603eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang 3613eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang/*static*/ int 3623eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangMediaProfiles::getCameraId(const char** atts) 3633eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang{ 3643eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (!atts[0]) return 0; // default cameraId = 0 3653eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang CHECK(!strcmp("cameraId", atts[0])); 366f5a8385649204213dc19e1a64f4693931e048d85James Dong return atoi(atts[1]); 367f5a8385649204213dc19e1a64f4693931e048d85James Dong} 368f5a8385649204213dc19e1a64f4693931e048d85James Dong 3690f056290cb16763453f18bbef80cde673041dbbcJames Dongvoid MediaProfiles::addStartTimeOffset(int cameraId, const char** atts) 3700f056290cb16763453f18bbef80cde673041dbbcJames Dong{ 3710f056290cb16763453f18bbef80cde673041dbbcJames Dong int offsetTimeMs = 700; 3720f056290cb16763453f18bbef80cde673041dbbcJames Dong if (atts[2]) { 3730f056290cb16763453f18bbef80cde673041dbbcJames Dong CHECK(!strcmp("startOffsetMs", atts[2])); 3740f056290cb16763453f18bbef80cde673041dbbcJames Dong offsetTimeMs = atoi(atts[3]); 3750f056290cb16763453f18bbef80cde673041dbbcJames Dong } 3760f056290cb16763453f18bbef80cde673041dbbcJames Dong 3770f056290cb16763453f18bbef80cde673041dbbcJames Dong LOGV("%s: cameraId=%d, offset=%d ms", __func__, cameraId, offsetTimeMs); 3780f056290cb16763453f18bbef80cde673041dbbcJames Dong mStartTimeOffsets.replaceValueFor(cameraId, offsetTimeMs); 3790f056290cb16763453f18bbef80cde673041dbbcJames Dong} 3800f056290cb16763453f18bbef80cde673041dbbcJames Dong 381cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng/*static*/ MediaProfiles::VideoEditorCap* 382cabd5f867ec69c0dfe8333cba46323cb58917402Hong TengMediaProfiles::createVideoEditorCap(const char **atts, MediaProfiles *profiles) 383cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng{ 384cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng CHECK(!strcmp("maxInputFrameWidth", atts[0]) && 385cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng !strcmp("maxInputFrameHeight", atts[2]) && 386cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng !strcmp("maxOutputFrameWidth", atts[4]) && 387cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng !strcmp("maxOutputFrameHeight", atts[6])); 388cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 389cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng MediaProfiles::VideoEditorCap *pVideoEditorCap = 390cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng new MediaProfiles::VideoEditorCap(atoi(atts[1]), atoi(atts[3]), 391cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng atoi(atts[5]), atoi(atts[7])); 392cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 393cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng logVideoEditorCap(*pVideoEditorCap); 394cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng profiles->mVideoEditorCap = pVideoEditorCap; 395cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 396cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng return pVideoEditorCap; 397cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng} 398cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 3991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 4001d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::startElementHandler(void *userData, const char *name, const char **atts) 4011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 4021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles *profiles = (MediaProfiles *) userData; 4031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (strcmp("Video", name) == 0) { 4041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createVideoCodec(atts, profiles); 4051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("Audio", name) == 0) { 4061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createAudioCodec(atts, profiles); 4071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("VideoEncoderCap", name) == 0 && 4081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 4091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoEncoders.add(createVideoEncoderCap(atts)); 4101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("AudioEncoderCap", name) == 0 && 4111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 4121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioEncoders.add(createAudioEncoderCap(atts)); 4131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("VideoDecoderCap", name) == 0 && 4141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 4151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoDecoders.add(createVideoDecoderCap(atts)); 4161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("AudioDecoderCap", name) == 0 && 4171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong strcmp("true", atts[3]) == 0) { 4181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioDecoders.add(createAudioDecoderCap(atts)); 4191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("EncoderOutputFileFormat", name) == 0) { 4201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mEncoderOutputFileFormats.add(createEncoderOutputFileFormat(atts)); 4213eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } else if (strcmp("CamcorderProfiles", name) == 0) { 4223eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profiles->mCurrentCameraId = getCameraId(atts); 4230f056290cb16763453f18bbef80cde673041dbbcJames Dong profiles->addStartTimeOffset(profiles->mCurrentCameraId, atts); 4241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else if (strcmp("EncoderProfile", name) == 0) { 4253eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profiles->mCamcorderProfiles.add( 4262a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong createCamcorderProfile(profiles->mCurrentCameraId, atts, profiles->mCameraIds)); 427f5a8385649204213dc19e1a64f4693931e048d85James Dong } else if (strcmp("ImageEncoding", name) == 0) { 4283eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profiles->addImageEncodingQualityLevel(profiles->mCurrentCameraId, atts); 429cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng } else if (strcmp("VideoEditorCap", name) == 0) { 430cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng createVideoEditorCap(atts, profiles); 4311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 4321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 4331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 4342a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dongstatic bool isCamcorderProfile(camcorder_quality quality) { 4352a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong return quality >= CAMCORDER_QUALITY_LIST_START && 4362a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong quality <= CAMCORDER_QUALITY_LIST_END; 4372a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong} 4382a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 4392a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dongstatic bool isTimelapseProfile(camcorder_quality quality) { 4402a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong return quality >= CAMCORDER_QUALITY_TIME_LAPSE_LIST_START && 4412a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong quality <= CAMCORDER_QUALITY_TIME_LAPSE_LIST_END; 4422a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong} 4432a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 4442a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dongvoid MediaProfiles::initRequiredProfileRefs(const Vector<int>& cameraIds) { 4452a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong LOGV("Number of camera ids: %d", cameraIds.size()); 4462a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CHECK(cameraIds.size() > 0); 4472a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mRequiredProfileRefs = new RequiredProfiles[cameraIds.size()]; 4482a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong for (size_t i = 0, n = cameraIds.size(); i < n; ++i) { 4492a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mRequiredProfileRefs[i].mCameraId = cameraIds[i]; 4502a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong for (size_t j = 0; j < kNumRequiredProfiles; ++j) { 4512a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mRequiredProfileRefs[i].mRefs[j].mHasRefProfile = false; 4522a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mRequiredProfileRefs[i].mRefs[j].mRefProfileIndex = -1; 4532a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if ((j & 1) == 0) { // low resolution 4542a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mRequiredProfileRefs[i].mRefs[j].mResolutionProduct = 0x7FFFFFFF; 4552a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } else { // high resolution 4562a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mRequiredProfileRefs[i].mRefs[j].mResolutionProduct = 0; 4572a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 4582a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 4592a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 4602a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong} 4612a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 4622a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dongint MediaProfiles::getRequiredProfileRefIndex(int cameraId) { 4632a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong for (size_t i = 0, n = mCameraIds.size(); i < n; ++i) { 4642a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (mCameraIds[i] == cameraId) { 4652a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong return i; 4662a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 4672a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 4682a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong return -1; 4692a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong} 4702a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 4712a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dongvoid MediaProfiles::checkAndAddRequiredProfilesIfNecessary() { 4722a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (sIsInitialized) { 4732a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong return; 4742a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 4752a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 4762a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong initRequiredProfileRefs(mCameraIds); 4772a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 4782a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong for (size_t i = 0, n = mCamcorderProfiles.size(); i < n; ++i) { 4792a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong int product = mCamcorderProfiles[i]->mVideoCodec->mFrameWidth * 4802a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mCamcorderProfiles[i]->mVideoCodec->mFrameHeight; 4812a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 4822a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong camcorder_quality quality = mCamcorderProfiles[i]->mQuality; 4832a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong int cameraId = mCamcorderProfiles[i]->mCameraId; 4842a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong int index = -1; 4852a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong int refIndex = getRequiredProfileRefIndex(cameraId); 4862a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CHECK(refIndex != -1); 4872a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong RequiredProfileRefInfo *info; 4882a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong camcorder_quality refQuality; 4892a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong VideoCodec *codec = NULL; 4902a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 4912a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong // Check high and low from either camcorder profile or timelapse profile 4922a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong // but not both. Default, check camcorder profile 4932a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong size_t j = 0; 4942a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong size_t n = 2; 4952a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (isTimelapseProfile(quality)) { 4962a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong // Check timelapse profile instead. 4972a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong j = 2; 4982a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong n = kNumRequiredProfiles; 4992a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } else { 5002a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong // Must be camcorder profile. 5012a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CHECK(isCamcorderProfile(quality)); 5022a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5032a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong for (; j < n; ++j) { 5042a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong info = &(mRequiredProfileRefs[refIndex].mRefs[j]); 5052a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if ((j % 2 == 0 && product > info->mResolutionProduct) || // low 5062a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong (j % 2 != 0 && product < info->mResolutionProduct)) { // high 5072a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong continue; 5082a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5092a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong switch (j) { 5102a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong case 0: 5112a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong refQuality = CAMCORDER_QUALITY_LOW; 5122a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong break; 5132a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong case 1: 5142a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong refQuality = CAMCORDER_QUALITY_HIGH; 5152a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong break; 5162a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong case 2: 5172a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong refQuality = CAMCORDER_QUALITY_TIME_LAPSE_LOW; 5182a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong break; 5192a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong case 3: 5202a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong refQuality = CAMCORDER_QUALITY_TIME_LAPSE_HIGH; 5212a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong break; 5222a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong default: 5232a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CHECK(!"Should never reach here"); 5242a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5252a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5262a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (!info->mHasRefProfile) { 5272a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong index = getCamcorderProfileIndex(cameraId, refQuality); 5282a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5292a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (index == -1) { 5302a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong // New high or low quality profile is found. 5312a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong // Update its reference. 5322a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong info->mHasRefProfile = true; 5332a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong info->mRefProfileIndex = i; 5342a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong info->mResolutionProduct = product; 5352a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5362a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5372a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5382a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5392a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong for (size_t cameraId = 0; cameraId < mCameraIds.size(); ++cameraId) { 5402a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong for (size_t j = 0; j < kNumRequiredProfiles; ++j) { 5412a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong int refIndex = getRequiredProfileRefIndex(cameraId); 5422a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CHECK(refIndex != -1); 5432a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong RequiredProfileRefInfo *info = 5442a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong &mRequiredProfileRefs[refIndex].mRefs[j]; 5452a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5462a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (info->mHasRefProfile) { 5472a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5482a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CamcorderProfile *profile = 5492a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong new CamcorderProfile( 5502a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong *mCamcorderProfiles[info->mRefProfileIndex]); 5512a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5522a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong // Overwrite the quality 5532a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong switch (j % kNumRequiredProfiles) { 5542a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong case 0: 5552a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong profile->mQuality = CAMCORDER_QUALITY_LOW; 5562a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong break; 5572a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong case 1: 5582a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong profile->mQuality = CAMCORDER_QUALITY_HIGH; 5592a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong break; 5602a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong case 2: 5612a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong profile->mQuality = CAMCORDER_QUALITY_TIME_LAPSE_LOW; 5622a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong break; 5632a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong case 3: 5642a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong profile->mQuality = CAMCORDER_QUALITY_TIME_LAPSE_HIGH; 5652a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong break; 5662a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong default: 5672a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CHECK(!"Should never come here"); 5682a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5692a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5702a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong int index = getCamcorderProfileIndex(cameraId, profile->mQuality); 5712a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong if (index != -1) { 5722a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong LOGV("Profile quality %d for camera %d already exists", 5732a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong profile->mQuality, cameraId); 5742a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CHECK(index == refIndex); 5752a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong continue; 5762a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5772a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5782a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong // Insert the new profile 5792a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong LOGV("Add a profile: quality %d=>%d for camera %d", 5802a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mCamcorderProfiles[info->mRefProfileIndex]->mQuality, 5812a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong profile->mQuality, cameraId); 5822a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5832a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong mCamcorderProfiles.add(profile); 5842a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5852a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5862a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong } 5872a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong} 5882a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong 5891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles* 5901d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::getInstance() 5911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 5921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("getInstance"); 5931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Mutex::Autolock lock(sLock); 5941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!sIsInitialized) { 5951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong char value[PROPERTY_VALUE_MAX]; 5961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (property_get("media.settings.xml", value, NULL) <= 0) { 5971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const char *defaultXmlFile = "/etc/media_profiles.xml"; 5981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong FILE *fp = fopen(defaultXmlFile, "r"); 5991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (fp == NULL) { 6001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGW("could not find media config xml file"); 6011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sInstance = createDefaultInstance(); 6021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else { 6031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong fclose(fp); // close the file first. 6041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sInstance = createInstanceFromXmlFile(defaultXmlFile); 6051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } else { 6071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong sInstance = createInstanceFromXmlFile(value); 6081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6092a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong CHECK(sInstance != NULL); 6102a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong sInstance->checkAndAddRequiredProfilesIfNecessary(); 6112a7e0a1eb29306982fd77bdc64d324464a48a2b9James Dong sIsInitialized = true; 6121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 6131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return sInstance; 6151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoEncoderCap* 6181d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultH263VideoEncoderCap() 6191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return new MediaProfiles::VideoEncoderCap( 6211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong VIDEO_ENCODER_H263, 192000, 420000, 176, 352, 144, 288, 1, 20); 6221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::VideoEncoderCap* 6251d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultM4vVideoEncoderCap() 6261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return new MediaProfiles::VideoEncoderCap( 6281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong VIDEO_ENCODER_MPEG_4_SP, 192000, 420000, 176, 352, 144, 288, 1, 20); 6291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 6331d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultVideoEncoders(MediaProfiles *profiles) 6341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoEncoders.add(createDefaultH263VideoEncoderCap()); 6361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoEncoders.add(createDefaultM4vVideoEncoderCap()); 6371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 6381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 6391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::CamcorderProfile* 640d5672bc7162fa49abf9bb5844195887e911aa7ceNipun KwatraMediaProfiles::createDefaultCamcorderTimeLapseQcifProfile(camcorder_quality quality) 641c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra{ 642c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra MediaProfiles::VideoCodec *videoCodec = 643d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra new MediaProfiles::VideoCodec(VIDEO_ENCODER_H263, 1000000, 176, 144, 20); 644c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra 645c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra AudioCodec *audioCodec = new AudioCodec(AUDIO_ENCODER_AMR_NB, 12200, 8000, 1); 646c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 647c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mCameraId = 0; 648c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mFileFormat = OUTPUT_FORMAT_THREE_GPP; 649d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profile->mQuality = quality; 650c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mDuration = 60; 651c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mVideoCodec = videoCodec; 652c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mAudioCodec = audioCodec; 653c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra return profile; 654c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra} 655c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra 656c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra/*static*/ MediaProfiles::CamcorderProfile* 657d5672bc7162fa49abf9bb5844195887e911aa7ceNipun KwatraMediaProfiles::createDefaultCamcorderTimeLapse480pProfile(camcorder_quality quality) 658c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra{ 659c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra MediaProfiles::VideoCodec *videoCodec = 660d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra new MediaProfiles::VideoCodec(VIDEO_ENCODER_H263, 20000000, 720, 480, 20); 661c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra 662c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra AudioCodec *audioCodec = new AudioCodec(AUDIO_ENCODER_AMR_NB, 12200, 8000, 1); 663c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 664c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mCameraId = 0; 665c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mFileFormat = OUTPUT_FORMAT_THREE_GPP; 666d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profile->mQuality = quality; 667c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mDuration = 60; 668c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mVideoCodec = videoCodec; 669c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra profile->mAudioCodec = audioCodec; 670c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra return profile; 671c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra} 672c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra 673d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra/*static*/ void 674d5672bc7162fa49abf9bb5844195887e911aa7ceNipun KwatraMediaProfiles::createDefaultCamcorderTimeLapseLowProfiles( 675d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile **lowTimeLapseProfile, 676d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile **lowSpecificTimeLapseProfile) { 677d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra *lowTimeLapseProfile = createDefaultCamcorderTimeLapseQcifProfile(CAMCORDER_QUALITY_TIME_LAPSE_LOW); 678d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra *lowSpecificTimeLapseProfile = createDefaultCamcorderTimeLapseQcifProfile(CAMCORDER_QUALITY_TIME_LAPSE_QCIF); 679d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra} 680d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra 681d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra/*static*/ void 682d5672bc7162fa49abf9bb5844195887e911aa7ceNipun KwatraMediaProfiles::createDefaultCamcorderTimeLapseHighProfiles( 683d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile **highTimeLapseProfile, 684d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile **highSpecificTimeLapseProfile) { 685d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra *highTimeLapseProfile = createDefaultCamcorderTimeLapse480pProfile(CAMCORDER_QUALITY_TIME_LAPSE_HIGH); 686d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra *highSpecificTimeLapseProfile = createDefaultCamcorderTimeLapse480pProfile(CAMCORDER_QUALITY_TIME_LAPSE_480P); 687d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra} 688d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra 689c0a84782589eececdfa7e723e8aa0e572d0d79f5Nipun Kwatra/*static*/ MediaProfiles::CamcorderProfile* 690d5672bc7162fa49abf9bb5844195887e911aa7ceNipun KwatraMediaProfiles::createDefaultCamcorderQcifProfile(camcorder_quality quality) 6911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 6921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoCodec *videoCodec = 693d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra new MediaProfiles::VideoCodec(VIDEO_ENCODER_H263, 192000, 176, 144, 20); 6941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 695d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::AudioCodec *audioCodec = 696d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra new MediaProfiles::AudioCodec(AUDIO_ENCODER_AMR_NB, 12200, 8000, 1); 697d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra 698d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 6993eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profile->mCameraId = 0; 7001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mFileFormat = OUTPUT_FORMAT_THREE_GPP; 701d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profile->mQuality = quality; 702d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profile->mDuration = 30; 7031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mVideoCodec = videoCodec; 7041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mAudioCodec = audioCodec; 7051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profile; 7061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 7071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::CamcorderProfile* 709d5672bc7162fa49abf9bb5844195887e911aa7ceNipun KwatraMediaProfiles::createDefaultCamcorderCifProfile(camcorder_quality quality) 7101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 7111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoCodec *videoCodec = 712d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra new MediaProfiles::VideoCodec(VIDEO_ENCODER_H263, 360000, 352, 288, 20); 7131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 714d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra AudioCodec *audioCodec = new AudioCodec(AUDIO_ENCODER_AMR_NB, 12200, 8000, 1); 715d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra CamcorderProfile *profile = new MediaProfiles::CamcorderProfile; 7163eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profile->mCameraId = 0; 7171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mFileFormat = OUTPUT_FORMAT_THREE_GPP; 718d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profile->mQuality = quality; 719d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profile->mDuration = 60; 7201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mVideoCodec = videoCodec; 7211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profile->mAudioCodec = audioCodec; 7221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profile; 7231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 7241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 726d5672bc7162fa49abf9bb5844195887e911aa7ceNipun KwatraMediaProfiles::createDefaultCamcorderLowProfiles( 727d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile **lowProfile, 728d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile **lowSpecificProfile) { 729d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra *lowProfile = createDefaultCamcorderQcifProfile(CAMCORDER_QUALITY_LOW); 730d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra *lowSpecificProfile = createDefaultCamcorderQcifProfile(CAMCORDER_QUALITY_QCIF); 731d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra} 732d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra 733d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra/*static*/ void 734d5672bc7162fa49abf9bb5844195887e911aa7ceNipun KwatraMediaProfiles::createDefaultCamcorderHighProfiles( 735d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile **highProfile, 736d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile **highSpecificProfile) { 737d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra *highProfile = createDefaultCamcorderCifProfile(CAMCORDER_QUALITY_HIGH); 738d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra *highSpecificProfile = createDefaultCamcorderCifProfile(CAMCORDER_QUALITY_CIF); 739d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra} 740d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra 741d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra/*static*/ void 7421d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultCamcorderProfiles(MediaProfiles *profiles) 7431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 744d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra // low camcorder profiles. 745d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile *lowProfile, *lowSpecificProfile; 746d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra createDefaultCamcorderLowProfiles(&lowProfile, &lowSpecificProfile); 747d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profiles->mCamcorderProfiles.add(lowProfile); 748d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profiles->mCamcorderProfiles.add(lowSpecificProfile); 749d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra 750d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra // high camcorder profiles. 751d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile* highProfile, *highSpecificProfile; 752d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra createDefaultCamcorderHighProfiles(&highProfile, &highSpecificProfile); 753d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profiles->mCamcorderProfiles.add(highProfile); 754d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profiles->mCamcorderProfiles.add(highSpecificProfile); 755d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra 756d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra // low camcorder time lapse profiles. 757d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile *lowTimeLapseProfile, *lowSpecificTimeLapseProfile; 758d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra createDefaultCamcorderTimeLapseLowProfiles(&lowTimeLapseProfile, &lowSpecificTimeLapseProfile); 759d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profiles->mCamcorderProfiles.add(lowTimeLapseProfile); 760d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profiles->mCamcorderProfiles.add(lowSpecificTimeLapseProfile); 761d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra 762d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra // high camcorder time lapse profiles. 763d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra MediaProfiles::CamcorderProfile *highTimeLapseProfile, *highSpecificTimeLapseProfile; 764d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra createDefaultCamcorderTimeLapseHighProfiles(&highTimeLapseProfile, &highSpecificTimeLapseProfile); 765d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profiles->mCamcorderProfiles.add(highTimeLapseProfile); 766d5672bc7162fa49abf9bb5844195887e911aa7ceNipun Kwatra profiles->mCamcorderProfiles.add(highSpecificTimeLapseProfile); 7678031ec79eb657a0ae84325410578ea87f50eeb54James Dong 7688031ec79eb657a0ae84325410578ea87f50eeb54James Dong // For emulator and other legacy devices which does not have a 7698031ec79eb657a0ae84325410578ea87f50eeb54James Dong // media_profiles.xml file, We assume that the default camera id 7708031ec79eb657a0ae84325410578ea87f50eeb54James Dong // is 0 and that is the only camera available. 7718031ec79eb657a0ae84325410578ea87f50eeb54James Dong profiles->mCameraIds.push(0); 7721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 7731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 7751d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultAudioEncoders(MediaProfiles *profiles) 7761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 7771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioEncoders.add(createDefaultAmrNBEncoderCap()); 7781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 7791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 7811d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultVideoDecoders(MediaProfiles *profiles) 7821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 7831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::VideoDecoderCap *cap = 7841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::VideoDecoderCap(VIDEO_DECODER_WMV); 7851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mVideoDecoders.add(cap); 7871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 7881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 7901d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultAudioDecoders(MediaProfiles *profiles) 7911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 7921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles::AudioDecoderCap *cap = 7931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong new MediaProfiles::AudioDecoderCap(AUDIO_DECODER_WMA); 7941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mAudioDecoders.add(cap); 7961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 7971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 7981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ void 7991d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultEncoderOutputFileFormats(MediaProfiles *profiles) 8001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 8011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mEncoderOutputFileFormats.add(OUTPUT_FORMAT_THREE_GPP); 8021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles->mEncoderOutputFileFormats.add(OUTPUT_FORMAT_MPEG_4); 8031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 8041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles::AudioEncoderCap* 8061d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultAmrNBEncoderCap() 8071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 8081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return new MediaProfiles::AudioEncoderCap( 8091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong AUDIO_ENCODER_AMR_NB, 5525, 12200, 8000, 8000, 1, 1); 8101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 8111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 812f5a8385649204213dc19e1a64f4693931e048d85James Dong/*static*/ void 813f5a8385649204213dc19e1a64f4693931e048d85James DongMediaProfiles::createDefaultImageEncodingQualityLevels(MediaProfiles *profiles) 814f5a8385649204213dc19e1a64f4693931e048d85James Dong{ 8153eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang ImageEncodingQualityLevels *levels = new ImageEncodingQualityLevels(); 8163eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mCameraId = 0; 8173eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mLevels.add(70); 8183eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mLevels.add(80); 8193eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang levels->mLevels.add(90); 8203eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang profiles->mImageEncodingQualityLevels.add(levels); 821f5a8385649204213dc19e1a64f4693931e048d85James Dong} 822f5a8385649204213dc19e1a64f4693931e048d85James Dong 823cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng/*static*/ void 824cabd5f867ec69c0dfe8333cba46323cb58917402Hong TengMediaProfiles::createDefaultVideoEditorCap(MediaProfiles *profiles) 825cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng{ 826cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng profiles->mVideoEditorCap = 827cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng new MediaProfiles::VideoEditorCap( 828cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng VIDEOEDITOR_DEFAULT_MAX_INPUT_FRAME_WIDTH, 829cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng VIDEOEDITOR_DEFUALT_MAX_INPUT_FRAME_HEIGHT, 830cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng VIDEOEDITOR_DEFAULT_MAX_OUTPUT_FRAME_WIDTH, 831cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng VIDEOEDITOR_DEFUALT_MAX_OUTPUT_FRAME_HEIGHT); 832cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng} 833cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 8341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles* 8351d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createDefaultInstance() 8361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 8371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles *profiles = new MediaProfiles; 8381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultCamcorderProfiles(profiles); 8391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultVideoEncoders(profiles); 8401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultAudioEncoders(profiles); 8411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultVideoDecoders(profiles); 8421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultAudioDecoders(profiles); 8431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong createDefaultEncoderOutputFileFormats(profiles); 844f5a8385649204213dc19e1a64f4693931e048d85James Dong createDefaultImageEncodingQualityLevels(profiles); 845cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng createDefaultVideoEditorCap(profiles); 8461d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profiles; 8471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 8481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong/*static*/ MediaProfiles* 8501d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::createInstanceFromXmlFile(const char *xml) 8511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 8521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong FILE *fp = NULL; 8531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK((fp = fopen(xml, "r"))); 8541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong XML_Parser parser = ::XML_ParserCreate(NULL); 8561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(parser != NULL); 8571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8581d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong MediaProfiles *profiles = new MediaProfiles(); 8591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::XML_SetUserData(parser, profiles); 8601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::XML_SetElementHandler(parser, startElementHandler, NULL); 8611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8621d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong /* 8631d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong FIXME: 8641d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong expat is not compiled with -DXML_DTD. We don't have DTD parsing support. 8651d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8661d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!::XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS)) { 8671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("failed to enable DTD support in the xml file"); 8681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return UNKNOWN_ERROR; 8691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 8701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong */ 8721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong const int BUFF_SIZE = 512; 8741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (;;) { 8751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong void *buff = ::XML_GetBuffer(parser, BUFF_SIZE); 8761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (buff == NULL) { 8771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("failed to in call to XML_GetBuffer()"); 8781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete profiles; 8791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles = NULL; 8801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong goto exit; 8811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 8821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int bytes_read = ::fread(buff, 1, BUFF_SIZE, fp); 8841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (bytes_read < 0) { 8851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("failed in call to read"); 8861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete profiles; 8871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong profiles = NULL; 8881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong goto exit; 8891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 8901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK(::XML_ParseBuffer(parser, bytes_read, bytes_read == 0)); 8921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (bytes_read == 0) break; // done parsing the xml file 8941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 8951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 8961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongexit: 8971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::XML_ParserFree(parser); 8981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong ::fclose(fp); 8991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return profiles; 9001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 9011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9021d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<output_format> MediaProfiles::getOutputFileFormats() const 9031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 9041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return mEncoderOutputFileFormats; // copy out 9051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 9061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9071d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<video_encoder> MediaProfiles::getVideoEncoders() const 9081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 9091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<video_encoder> encoders; 9101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoEncoders.size(); ++i) { 9111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong encoders.add(mVideoEncoders[i]->mCodec); 9121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 9131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return encoders; // copy out 9141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 9151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongint MediaProfiles::getVideoEncoderParamByName(const char *name, video_encoder codec) const 9171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 9181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("getVideoEncoderParamByName: %s for codec %d", name, codec); 9191d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int index = -1; 9201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0, n = mVideoEncoders.size(); i < n; ++i) { 9211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (mVideoEncoders[i]->mCodec == codec) { 9221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong index = i; 9231d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 9241d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 9251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 9261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (index == -1) { 9271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given video encoder %d is not found", codec); 9281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 9291d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 9301d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9311d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.width.min", name)) return mVideoEncoders[index]->mMinFrameWidth; 9321d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.width.max", name)) return mVideoEncoders[index]->mMaxFrameWidth; 9331d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.height.min", name)) return mVideoEncoders[index]->mMinFrameHeight; 9341d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.height.max", name)) return mVideoEncoders[index]->mMaxFrameHeight; 9351d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.bps.min", name)) return mVideoEncoders[index]->mMinBitRate; 9361d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.bps.max", name)) return mVideoEncoders[index]->mMaxBitRate; 9371d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.fps.min", name)) return mVideoEncoders[index]->mMinFrameRate; 9381d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.vid.fps.max", name)) return mVideoEncoders[index]->mMaxFrameRate; 9391d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given video encoder param name %s is not found", name); 9411d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 9421d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 9431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 944cabd5f867ec69c0dfe8333cba46323cb58917402Hong Tengint MediaProfiles::getVideoEditorCapParamByName(const char *name) const 945cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng{ 946cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng LOGV("getVideoEditorCapParamByName: %s", name); 947cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 948cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng if (mVideoEditorCap == NULL) { 949cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng LOGE("The mVideoEditorCap is not created, then create default cap."); 950cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng createDefaultVideoEditorCap(sInstance); 951cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng } 952cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 953cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng if (!strcmp("videoeditor.input.width.max", name)) 954cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng return mVideoEditorCap->mMaxInputFrameWidth; 955cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng if (!strcmp("videoeditor.input.height.max", name)) 956cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng return mVideoEditorCap->mMaxInputFrameHeight; 957cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng if (!strcmp("videoeditor.output.width.max", name)) 958cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng return mVideoEditorCap->mMaxOutputFrameWidth; 959cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng if (!strcmp("videoeditor.output.height.max", name)) 960cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng return mVideoEditorCap->mMaxOutputFrameHeight; 961cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 962cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng LOGE("The given video editor param name %s is not found", name); 963cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng return -1; 964cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng} 965cabd5f867ec69c0dfe8333cba46323cb58917402Hong Teng 9661d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<audio_encoder> MediaProfiles::getAudioEncoders() const 9671d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 9681d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<audio_encoder> encoders; 9691d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioEncoders.size(); ++i) { 9701d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong encoders.add(mAudioEncoders[i]->mCodec); 9711d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 9721d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return encoders; // copy out 9731d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 9741d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9751d7491b19516505e0754c66a3c8cd61811c9b6a6James Dongint MediaProfiles::getAudioEncoderParamByName(const char *name, audio_encoder codec) const 9761d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 9771d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGV("getAudioEncoderParamByName: %s for codec %d", name, codec); 9781d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int index = -1; 9791d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0, n = mAudioEncoders.size(); i < n; ++i) { 9801d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (mAudioEncoders[i]->mCodec == codec) { 9811d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong index = i; 9821d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 9831d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 9841d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 9851d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (index == -1) { 9861d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given audio encoder %d is not found", codec); 9871d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 9881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 9891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.ch.min", name)) return mAudioEncoders[index]->mMinChannels; 9911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.ch.max", name)) return mAudioEncoders[index]->mMaxChannels; 9921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.bps.min", name)) return mAudioEncoders[index]->mMinBitRate; 9931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.bps.max", name)) return mAudioEncoders[index]->mMaxBitRate; 9941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.hz.min", name)) return mAudioEncoders[index]->mMinSampleRate; 9951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("enc.aud.hz.max", name)) return mAudioEncoders[index]->mMaxSampleRate; 9961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 9971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong LOGE("The given audio encoder param name %s is not found", name); 9981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 9991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 10001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 10011d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<video_decoder> MediaProfiles::getVideoDecoders() const 10021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 10031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<video_decoder> decoders; 10041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoDecoders.size(); ++i) { 10051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong decoders.add(mVideoDecoders[i]->mCodec); 10061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 10071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return decoders; // copy out 10081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 10091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 10101d7491b19516505e0754c66a3c8cd61811c9b6a6James DongVector<audio_decoder> MediaProfiles::getAudioDecoders() const 10111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 10121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong Vector<audio_decoder> decoders; 10131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioDecoders.size(); ++i) { 10141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong decoders.add(mAudioDecoders[i]->mCodec); 10151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 10161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return decoders; // copy out 10171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 10181d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 10198bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatraint MediaProfiles::getCamcorderProfileIndex(int cameraId, camcorder_quality quality) const 10201d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 10211d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong int index = -1; 10221d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0, n = mCamcorderProfiles.size(); i < n; ++i) { 10233eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (mCamcorderProfiles[i]->mCameraId == cameraId && 10243eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang mCamcorderProfiles[i]->mQuality == quality) { 10251d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong index = i; 10261d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong break; 10271d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 10281d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 10298bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra return index; 10308bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra} 10318bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra 10328bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatraint MediaProfiles::getCamcorderProfileParamByName(const char *name, 10338bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra int cameraId, 10348bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra camcorder_quality quality) const 10358bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra{ 10368bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra LOGV("getCamcorderProfileParamByName: %s for camera %d, quality %d", 10378bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra name, cameraId, quality); 10388bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra 10398bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra int index = getCamcorderProfileIndex(cameraId, quality); 10401d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (index == -1) { 10413eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang LOGE("The given camcorder profile camera %d quality %d is not found", 10423eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang cameraId, quality); 10431d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 10441d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 10451d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 1046f5a8385649204213dc19e1a64f4693931e048d85James Dong if (!strcmp("duration", name)) return mCamcorderProfiles[index]->mDuration; 10471d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("file.format", name)) return mCamcorderProfiles[index]->mFileFormat; 10481d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.codec", name)) return mCamcorderProfiles[index]->mVideoCodec->mCodec; 10491d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.width", name)) return mCamcorderProfiles[index]->mVideoCodec->mFrameWidth; 10501d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.height", name)) return mCamcorderProfiles[index]->mVideoCodec->mFrameHeight; 10511d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.bps", name)) return mCamcorderProfiles[index]->mVideoCodec->mBitRate; 10521d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("vid.fps", name)) return mCamcorderProfiles[index]->mVideoCodec->mFrameRate; 10531d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.codec", name)) return mCamcorderProfiles[index]->mAudioCodec->mCodec; 10541d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.bps", name)) return mCamcorderProfiles[index]->mAudioCodec->mBitRate; 10551d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.ch", name)) return mCamcorderProfiles[index]->mAudioCodec->mChannels; 10561d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong if (!strcmp("aud.hz", name)) return mCamcorderProfiles[index]->mAudioCodec->mSampleRate; 10571d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 10583eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang LOGE("The given camcorder profile param id %d name %s is not found", cameraId, name); 10591d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong return -1; 10601d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 10611d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 10628bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatrabool MediaProfiles::hasCamcorderProfile(int cameraId, camcorder_quality quality) const 10638bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra{ 10648bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra return (getCamcorderProfileIndex(cameraId, quality) != -1); 10658bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra} 10668bb5603cc735315c8691dc9b7a81b4ad4d6e253eNipun Kwatra 10673eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung ChangVector<int> MediaProfiles::getImageEncodingQualityLevels(int cameraId) const 1068f5a8385649204213dc19e1a64f4693931e048d85James Dong{ 10693eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang Vector<int> result; 10703eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang ImageEncodingQualityLevels *levels = findImageEncodingQualityLevels(cameraId); 10713eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang if (levels != NULL) { 10723eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang result = levels->mLevels; // copy out 10733eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang } 10743eaa4e92dbebb5b27cb89f329f31fac6fb6fe1f0Chih-Chung Chang return result; 1075f5a8385649204213dc19e1a64f4693931e048d85James Dong} 1076f5a8385649204213dc19e1a64f4693931e048d85James Dong 10770f056290cb16763453f18bbef80cde673041dbbcJames Dongint MediaProfiles::getStartTimeOffsetMs(int cameraId) const { 10780f056290cb16763453f18bbef80cde673041dbbcJames Dong int offsetTimeMs = -1; 10790f056290cb16763453f18bbef80cde673041dbbcJames Dong ssize_t index = mStartTimeOffsets.indexOfKey(cameraId); 10800f056290cb16763453f18bbef80cde673041dbbcJames Dong if (index >= 0) { 10810f056290cb16763453f18bbef80cde673041dbbcJames Dong offsetTimeMs = mStartTimeOffsets.valueFor(cameraId); 10820f056290cb16763453f18bbef80cde673041dbbcJames Dong } 10830f056290cb16763453f18bbef80cde673041dbbcJames Dong LOGV("%s: offsetTime=%d ms and cameraId=%d", offsetTimeMs, cameraId); 10840f056290cb16763453f18bbef80cde673041dbbcJames Dong return offsetTimeMs; 10850f056290cb16763453f18bbef80cde673041dbbcJames Dong} 10860f056290cb16763453f18bbef80cde673041dbbcJames Dong 10871d7491b19516505e0754c66a3c8cd61811c9b6a6James DongMediaProfiles::~MediaProfiles() 10881d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong{ 10891d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong CHECK("destructor should never be called" == 0); 10901d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#if 0 10911d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioEncoders.size(); ++i) { 10921d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mAudioEncoders[i]; 10931d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 10941d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mAudioEncoders.clear(); 10951d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 10961d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoEncoders.size(); ++i) { 10971d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mVideoEncoders[i]; 10981d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 10991d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mVideoEncoders.clear(); 11001d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 11011d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mVideoDecoders.size(); ++i) { 11021d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mVideoDecoders[i]; 11031d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 11041d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mVideoDecoders.clear(); 11051d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 11061d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mAudioDecoders.size(); ++i) { 11071d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mAudioDecoders[i]; 11081d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 11091d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mAudioDecoders.clear(); 11101d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong 11111d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong for (size_t i = 0; i < mCamcorderProfiles.size(); ++i) { 11121d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong delete mCamcorderProfiles[i]; 11131d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong } 11141d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong mCamcorderProfiles.clear(); 11151d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong#endif 11161d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} 11171d7491b19516505e0754c66a3c8cd61811c9b6a6James Dong} // namespace android 1118