Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 // #define LOG_NDEBUG 0
     18 #define LOG_TAG "MediaCodecListOverrides_test"
     19 #include <utils/Log.h>
     20 
     21 #include <gtest/gtest.h>
     22 
     23 #include "MediaCodecListOverrides.h"
     24 
     25 #include <media/MediaCodecInfo.h>
     26 #include <media/stagefright/foundation/AMessage.h>
     27 #include <media/stagefright/MediaCodecList.h>
     28 
     29 #include <vector>
     30 
     31 namespace android {
     32 
     33 static const char kTestOverridesStr[] =
     34 "<MediaCodecs>\n"
     35 "    <Settings>\n"
     36 "        <Setting name=\"supports-multiple-secure-codecs\" value=\"false\" />\n"
     37 "        <Setting name=\"supports-secure-with-non-secure-codec\" value=\"true\" />\n"
     38 "    </Settings>\n"
     39 "    <Encoders>\n"
     40 "        <MediaCodec name=\"OMX.qcom.video.encoder.avc\" type=\"video/avc\" update=\"true\" >\n"
     41 "            <Limit name=\"max-supported-instances\" value=\"4\" />\n"
     42 "        </MediaCodec>\n"
     43 "        <MediaCodec name=\"OMX.qcom.video.encoder.mpeg4\" type=\"video/mp4v-es\" update=\"true\" >\n"
     44 "            <Limit name=\"max-supported-instances\" value=\"4\" />\n"
     45 "        </MediaCodec>\n"
     46 "    </Encoders>\n"
     47 "    <Decoders>\n"
     48 "        <MediaCodec name=\"OMX.qcom.video.decoder.avc.secure\" type=\"video/avc\" update=\"true\" >\n"
     49 "            <Limit name=\"max-supported-instances\" value=\"1\" />\n"
     50 "        </MediaCodec>\n"
     51 "        <MediaCodec name=\"OMX.qcom.video.decoder.h263\" type=\"video/3gpp\" update=\"true\" >\n"
     52 "            <Limit name=\"max-supported-instances\" value=\"4\" />\n"
     53 "        </MediaCodec>\n"
     54 "        <MediaCodec name=\"OMX.qcom.video.decoder.mpeg2\" type=\"video/mpeg2\" update=\"true\" >\n"
     55 "            <Limit name=\"max-supported-instances\" value=\"3\" />\n"
     56 "        </MediaCodec>\n"
     57 "        <MediaCodec name=\"OMX.qcom.video.decoder.mpeg4\" type=\"video/mp4v-es\" update=\"true\" >\n"
     58 "            <Limit name=\"max-supported-instances\" value=\"3\" />\n"
     59 "        </MediaCodec>\n"
     60 "    </Decoders>\n"
     61 "</MediaCodecs>\n";
     62 
     63 class MediaCodecListOverridesTest : public ::testing::Test {
     64 public:
     65     MediaCodecListOverridesTest() {}
     66 
     67     void addMaxInstancesSetting(
     68             const AString &key,
     69             const AString &value,
     70             KeyedVector<AString, CodecSettings> *results) {
     71         CodecSettings settings;
     72         settings.add("max-supported-instances", value);
     73         results->add(key, settings);
     74     }
     75 
     76     void verifyProfileResults(const KeyedVector<AString, CodecSettings> &results) {
     77         EXPECT_LT(0u, results.size());
     78         for (size_t i = 0; i < results.size(); ++i) {
     79             const AString &key = results.keyAt(i);
     80             const CodecSettings &settings = results.valueAt(i);
     81             EXPECT_EQ(1u, settings.size());
     82             EXPECT_TRUE(settings.keyAt(0) == "max-supported-instances");
     83             const AString &valueS = settings.valueAt(0);
     84             int32_t value = strtol(valueS.c_str(), NULL, 10);
     85             EXPECT_LT(0, value);
     86             ALOGV("profileCodecs results %s %s", key.c_str(), valueS.c_str());
     87         }
     88     }
     89 
     90     void exportTestResultsToXML(const char *fileName) {
     91         CodecSettings gR;
     92         gR.add("supports-multiple-secure-codecs", "false");
     93         gR.add("supports-secure-with-non-secure-codec", "true");
     94         KeyedVector<AString, CodecSettings> eR;
     95         addMaxInstancesSetting("OMX.qcom.video.encoder.avc video/avc", "4", &eR);
     96         addMaxInstancesSetting("OMX.qcom.video.encoder.mpeg4 video/mp4v-es", "4", &eR);
     97         KeyedVector<AString, CodecSettings> dR;
     98         addMaxInstancesSetting("OMX.qcom.video.decoder.avc.secure video/avc", "1", &dR);
     99         addMaxInstancesSetting("OMX.qcom.video.decoder.h263 video/3gpp", "4", &dR);
    100         addMaxInstancesSetting("OMX.qcom.video.decoder.mpeg2 video/mpeg2", "3", &dR);
    101         addMaxInstancesSetting("OMX.qcom.video.decoder.mpeg4 video/mp4v-es", "3", &dR);
    102 
    103         exportResultsToXML(fileName, gR, eR, dR);
    104     }
    105 };
    106 
    107 TEST_F(MediaCodecListOverridesTest, splitString) {
    108     AString s = "abc123";
    109     AString delimiter = " ";
    110     AString s1;
    111     AString s2;
    112     EXPECT_FALSE(splitString(s, delimiter, &s1, &s2));
    113     s = "abc 123";
    114     EXPECT_TRUE(splitString(s, delimiter, &s1, &s2));
    115     EXPECT_TRUE(s1 == "abc");
    116     EXPECT_TRUE(s2 == "123");
    117 }
    118 
    119 // TODO: the codec component never returns OMX_EventCmdComplete in unit test.
    120 TEST_F(MediaCodecListOverridesTest, DISABLED_profileCodecs) {
    121     sp<IMediaCodecList> list = MediaCodecList::getInstance();
    122     std::vector<sp<MediaCodecInfo>> infos;
    123     for (size_t i = 0; i < list->countCodecs(); ++i) {
    124         infos.push_back(list->getCodecInfo(i));
    125     }
    126     CodecSettings global_results;
    127     KeyedVector<AString, CodecSettings> encoder_results;
    128     KeyedVector<AString, CodecSettings> decoder_results;
    129     profileCodecs(
    130             infos, &global_results, &encoder_results, &decoder_results, true /* forceToMeasure */);
    131     verifyProfileResults(encoder_results);
    132     verifyProfileResults(decoder_results);
    133 }
    134 
    135 TEST_F(MediaCodecListOverridesTest, exportTestResultsToXML) {
    136     const char *fileName = "/sdcard/mediacodec_list_overrides_test.xml";
    137     remove(fileName);
    138 
    139     exportTestResultsToXML(fileName);
    140 
    141     // verify
    142     AString overrides;
    143     FILE *f = fopen(fileName, "rb");
    144     ASSERT_TRUE(f != NULL);
    145     fseek(f, 0, SEEK_END);
    146     long size = ftell(f);
    147     rewind(f);
    148 
    149     char *buf = (char *)malloc(size);
    150     EXPECT_EQ((size_t)1, fread(buf, size, 1, f));
    151     overrides.setTo(buf, size);
    152     fclose(f);
    153     free(buf);
    154 
    155     AString expected;
    156     expected.append(getProfilingVersionString());
    157     expected.append("\n");
    158     expected.append(kTestOverridesStr);
    159     EXPECT_TRUE(overrides == expected);
    160 
    161     remove(fileName);
    162 }
    163 
    164 } // namespace android
    165