15a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber/* 25a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber * Copyright (C) 2012 The Android Open Source Project 35a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber * 45a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 55a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber * you may not use this file except in compliance with the License. 65a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber * You may obtain a copy of the License at 75a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber * 85a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 95a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber * 105a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber * Unless required by applicable law or agreed to in writing, software 115a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 125a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber * See the License for the specific language governing permissions and 145a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber * limitations under the License. 155a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber */ 165a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber 175a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huberpackage android.media; 185a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber 19b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnarimport android.util.Log; 20b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar 2160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huberimport android.media.MediaCodecInfo; 22b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnarimport java.util.ArrayList; 23b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnarimport java.util.Arrays; 24ee2997577db8d9e3e52593b9ca454386f703d710Ronghua Wuimport java.util.Map; 2560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber 265a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber/** 27c06bb7f5b9c6be9d121e3f5b4ee7cd31c99f6879Scott Main * Allows you to enumerate available codecs, each specified as a {@link MediaCodecInfo} object, 285a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber * find a codec supporting a given format and query the capabilities 295a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber * of a given codec. 30c06bb7f5b9c6be9d121e3f5b4ee7cd31c99f6879Scott Main * <p>See {@link MediaCodecInfo} for sample usage. 3160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber */ 325a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huberfinal public class MediaCodecList { 33b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar private static final String TAG = "MediaCodecList"; 34b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar 3560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber /** 36b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * Count the number of available (regular) codecs. 37b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * 38217474682ab9c551f331a598cf99d4e8d50f2a8dLajos Molnar * @deprecated Use {@link #getCodecInfos} instead. 39217474682ab9c551f331a598cf99d4e8d50f2a8dLajos Molnar * 40b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * @see #REGULAR_CODECS 4160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber */ 42b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar public static final int getCodecCount() { 43b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar initCodecList(); 44b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar return sRegularCodecInfos.length; 45b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 46b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar 47b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar private static native final int native_getCodecCount(); 4807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 49b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar /** 50b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * Return the {@link MediaCodecInfo} object for the codec at 51b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * the given {@code index} in the regular list. 52b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * 53217474682ab9c551f331a598cf99d4e8d50f2a8dLajos Molnar * @deprecated Use {@link #getCodecInfos} instead. 54217474682ab9c551f331a598cf99d4e8d50f2a8dLajos Molnar * 55b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * @see #REGULAR_CODECS 56b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar */ 5760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber public static final MediaCodecInfo getCodecInfoAt(int index) { 58b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar initCodecList(); 59b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar if (index < 0 || index > sRegularCodecInfos.length) { 6060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber throw new IllegalArgumentException(); 6160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber } 62b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar return sRegularCodecInfos[index]; 63b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 64b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar 65ee2997577db8d9e3e52593b9ca454386f703d710Ronghua Wu /* package private */ static final Map<String, Object> getGlobalSettings() { 660d8337c3143867f51a52814830b0dd48535338b7Lajos Molnar synchronized (sInitLock) { 670d8337c3143867f51a52814830b0dd48535338b7Lajos Molnar if (sGlobalSettings == null) { 680d8337c3143867f51a52814830b0dd48535338b7Lajos Molnar sGlobalSettings = native_getGlobalSettings(); 690d8337c3143867f51a52814830b0dd48535338b7Lajos Molnar } 700d8337c3143867f51a52814830b0dd48535338b7Lajos Molnar } 71ee2997577db8d9e3e52593b9ca454386f703d710Ronghua Wu return sGlobalSettings; 72ee2997577db8d9e3e52593b9ca454386f703d710Ronghua Wu } 73ee2997577db8d9e3e52593b9ca454386f703d710Ronghua Wu 74b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar private static Object sInitLock = new Object(); 75b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar private static MediaCodecInfo[] sAllCodecInfos; 76b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar private static MediaCodecInfo[] sRegularCodecInfos; 77ee2997577db8d9e3e52593b9ca454386f703d710Ronghua Wu private static Map<String, Object> sGlobalSettings; 7807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 79b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar private static final void initCodecList() { 80b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar synchronized (sInitLock) { 81b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar if (sRegularCodecInfos == null) { 82b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar int count = native_getCodecCount(); 83b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar ArrayList<MediaCodecInfo> regulars = new ArrayList<MediaCodecInfo>(); 84b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar ArrayList<MediaCodecInfo> all = new ArrayList<MediaCodecInfo>(); 85b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar for (int index = 0; index < count; index++) { 86b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar try { 87b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar MediaCodecInfo info = getNewCodecInfoAt(index); 88b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar all.add(info); 89b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar info = info.makeRegular(); 90b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar if (info != null) { 91b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar regulars.add(info); 92b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 93b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } catch (Exception e) { 94b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar Log.e(TAG, "Could not get codec capabilities", e); 95b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 96b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 97b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar sRegularCodecInfos = 98b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar regulars.toArray(new MediaCodecInfo[regulars.size()]); 99b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar sAllCodecInfos = 100b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar all.toArray(new MediaCodecInfo[all.size()]); 101b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 102b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 103b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 104b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar 105b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar private static MediaCodecInfo getNewCodecInfoAt(int index) { 106b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar String[] supportedTypes = getSupportedTypes(index); 107b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar MediaCodecInfo.CodecCapabilities[] caps = 108b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar new MediaCodecInfo.CodecCapabilities[supportedTypes.length]; 109b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar int typeIx = 0; 110b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar for (String type: supportedTypes) { 111cad266aad9a07206a59cebfadae3c9f9ec17fbccChong Zhang caps[typeIx++] = getCodecCapabilities(index, type); 112b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 113b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar return new MediaCodecInfo( 114b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar getCodecName(index), isEncoder(index), caps); 11560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber } 1165a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber 11760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber /* package private */ static native final String getCodecName(int index); 11807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 11960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber /* package private */ static native final boolean isEncoder(int index); 1205a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber 12160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber /* package private */ static native final String[] getSupportedTypes(int index); 12207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 12360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber /* package private */ static native final MediaCodecInfo.CodecCapabilities 12460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber getCodecCapabilities(int index, String type); 1255a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber 126ee2997577db8d9e3e52593b9ca454386f703d710Ronghua Wu /* package private */ static native final Map<String, Object> native_getGlobalSettings(); 127ee2997577db8d9e3e52593b9ca454386f703d710Ronghua Wu 12893077a2902a74256b7eb4795e1ef92bbc5c50f10Martin Storsjo /* package private */ static native final int findCodecByName(String codec); 12993077a2902a74256b7eb4795e1ef92bbc5c50f10Martin Storsjo 130dbf1552d526e62859e7a40cfea8e68b614a7d413Lajos Molnar /** @hide */ 131dbf1552d526e62859e7a40cfea8e68b614a7d413Lajos Molnar public static MediaCodecInfo getInfoFor(String codec) { 132aa79d9957652af446d01d5e72afd11a44f7e91edLajos Molnar initCodecList(); 133dbf1552d526e62859e7a40cfea8e68b614a7d413Lajos Molnar return sAllCodecInfos[findCodecByName(codec)]; 134dbf1552d526e62859e7a40cfea8e68b614a7d413Lajos Molnar } 135dbf1552d526e62859e7a40cfea8e68b614a7d413Lajos Molnar 1365a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber private static native final void native_init(); 1375a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber 138b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar /** 139b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * Use in {@link #MediaCodecList} to enumerate only codecs that are suitable 140217474682ab9c551f331a598cf99d4e8d50f2a8dLajos Molnar * for regular (buffer-to-buffer) decoding or encoding. 141217474682ab9c551f331a598cf99d4e8d50f2a8dLajos Molnar * 142217474682ab9c551f331a598cf99d4e8d50f2a8dLajos Molnar * <em>NOTE:</em> These are the codecs that are returned prior to API 21, 143217474682ab9c551f331a598cf99d4e8d50f2a8dLajos Molnar * using the now deprecated static methods. 144b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar */ 145b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar public static final int REGULAR_CODECS = 0; 146b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar 147b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar /** 148b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * Use in {@link #MediaCodecList} to enumerate all codecs, even ones that are 149217474682ab9c551f331a598cf99d4e8d50f2a8dLajos Molnar * not suitable for regular (buffer-to-buffer) decoding or encoding. These 150217474682ab9c551f331a598cf99d4e8d50f2a8dLajos Molnar * include codecs, for example, that only work with special input or output 151217474682ab9c551f331a598cf99d4e8d50f2a8dLajos Molnar * surfaces, such as secure-only or tunneled-only codecs. 152217474682ab9c551f331a598cf99d4e8d50f2a8dLajos Molnar * 153217474682ab9c551f331a598cf99d4e8d50f2a8dLajos Molnar * @see MediaCodecInfo.CodecCapabilities#isFormatSupported 154217474682ab9c551f331a598cf99d4e8d50f2a8dLajos Molnar * @see MediaCodecInfo.CodecCapabilities#FEATURE_SecurePlayback 155217474682ab9c551f331a598cf99d4e8d50f2a8dLajos Molnar * @see MediaCodecInfo.CodecCapabilities#FEATURE_TunneledPlayback 156b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar */ 157b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar public static final int ALL_CODECS = 1; 158b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar 159b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar private MediaCodecList() { 160b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar this(REGULAR_CODECS); 161b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 162b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar 163b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar private MediaCodecInfo[] mCodecInfos; 164b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar 165b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar /** 166b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * Create a list of media-codecs of a specific kind. 167b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * @param kind Either {@code REGULAR_CODECS} or {@code ALL_CODECS}. 168b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar */ 169b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar public MediaCodecList(int kind) { 170b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar initCodecList(); 171b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar if (kind == REGULAR_CODECS) { 172b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar mCodecInfos = sRegularCodecInfos; 173b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } else { 174b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar mCodecInfos = sAllCodecInfos; 175b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 176b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 177b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar 178b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar /** 179b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * Returns the list of {@link MediaCodecInfo} objects for the list 180b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * of media-codecs. 181b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar */ 182b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar public final MediaCodecInfo[] getCodecInfos() { 183b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar return Arrays.copyOf(mCodecInfos, mCodecInfos.length); 184b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 1855a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber 1865a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber static { 1875a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber System.loadLibrary("media_jni"); 1885a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber native_init(); 189b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar 190b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar // mediaserver is not yet alive here 191b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 192b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar 193b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar /** 194b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * Find a decoder supporting a given {@link MediaFormat} in the list 195b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * of media-codecs. 196b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * 197afa6ceb5a0d809b630db43564d3ce7f7b821129cLajos Molnar * <p class=note> 198afa6ceb5a0d809b630db43564d3ce7f7b821129cLajos Molnar * <strong>Note:</strong> On {@link android.os.Build.VERSION_CODES#LOLLIPOP}, 199afa6ceb5a0d809b630db43564d3ce7f7b821129cLajos Molnar * {@code format} must not contain a {@linkplain MediaFormat#KEY_FRAME_RATE 200afa6ceb5a0d809b630db43564d3ce7f7b821129cLajos Molnar * frame rate}. Use 201afa6ceb5a0d809b630db43564d3ce7f7b821129cLajos Molnar * <code class=prettyprint>format.setString(MediaFormat.KEY_FRAME_RATE, null)</code> 202afa6ceb5a0d809b630db43564d3ce7f7b821129cLajos Molnar * to clear any existing frame rate setting in the format. 203afa6ceb5a0d809b630db43564d3ce7f7b821129cLajos Molnar * 204db56549ff24df1f5fc3ff7a816274a69e3fe4c3eLajos Molnar * @see MediaCodecList.CodecCapabilities.isFormatSupported for format keys 205db56549ff24df1f5fc3ff7a816274a69e3fe4c3eLajos Molnar * considered per android versions when evaluating suitable codecs. 206db56549ff24df1f5fc3ff7a816274a69e3fe4c3eLajos Molnar * 207b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * @param format A decoder media format with optional feature directives. 208b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * @throws IllegalArgumentException if format is not a valid media format. 209b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * @throws NullPointerException if format is null. 210b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * @return the name of a decoder that supports the given format and feature 211b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * requests, or {@code null} if no such codec has been found. 212b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar */ 213b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar public final String findDecoderForFormat(MediaFormat format) { 214b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar return findCodecForFormat(false /* encoder */, format); 215b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 216b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar 217b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar /** 218b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * Find an encoder supporting a given {@link MediaFormat} in the list 219b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * of media-codecs. 220b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * 221afa6ceb5a0d809b630db43564d3ce7f7b821129cLajos Molnar * <p class=note> 222afa6ceb5a0d809b630db43564d3ce7f7b821129cLajos Molnar * <strong>Note:</strong> On {@link android.os.Build.VERSION_CODES#LOLLIPOP}, 223afa6ceb5a0d809b630db43564d3ce7f7b821129cLajos Molnar * {@code format} must not contain a {@linkplain MediaFormat#KEY_FRAME_RATE 224afa6ceb5a0d809b630db43564d3ce7f7b821129cLajos Molnar * frame rate}. Use 225afa6ceb5a0d809b630db43564d3ce7f7b821129cLajos Molnar * <code class=prettyprint>format.setString(MediaFormat.KEY_FRAME_RATE, null)</code> 226afa6ceb5a0d809b630db43564d3ce7f7b821129cLajos Molnar * to clear any existing frame rate setting in the format. 227afa6ceb5a0d809b630db43564d3ce7f7b821129cLajos Molnar * 228db56549ff24df1f5fc3ff7a816274a69e3fe4c3eLajos Molnar * @see MediaCodecList.CodecCapabilities.isFormatSupported for format keys 229db56549ff24df1f5fc3ff7a816274a69e3fe4c3eLajos Molnar * considered per android versions when evaluating suitable codecs. 230db56549ff24df1f5fc3ff7a816274a69e3fe4c3eLajos Molnar * 231b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * @param format An encoder media format with optional feature directives. 232b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * @throws IllegalArgumentException if format is not a valid media format. 233b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * @throws NullPointerException if format is null. 234b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * @return the name of an encoder that supports the given format and feature 235b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar * requests, or {@code null} if no such codec has been found. 236b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar */ 237b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar public final String findEncoderForFormat(MediaFormat format) { 238e19a80def2146ef8e4e6f920fee57937b717dd30Ronghua Wu return findCodecForFormat(true /* encoder */, format); 239b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 240b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar 241b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar private String findCodecForFormat(boolean encoder, MediaFormat format) { 242b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar String mime = format.getString(MediaFormat.KEY_MIME); 243b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar for (MediaCodecInfo info: mCodecInfos) { 244b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar if (info.isEncoder() != encoder) { 245b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar continue; 246b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 247b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar try { 248b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar MediaCodecInfo.CodecCapabilities caps = info.getCapabilitiesForType(mime); 249b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar if (caps != null && caps.isFormatSupported(format)) { 250b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar return info.getName(); 251b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 252b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } catch (IllegalArgumentException e) { 253b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar // type is not supported 254b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 255b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar } 256b58dc3132272a5ec1ad4792c3c9d48b4198bd57fLajos Molnar return null; 2575a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber } 2585a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber} 259