1fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera/* 2fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * Copyright (C) 2010 The Android Open Source Project 3fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * 4fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * Licensed under the Apache License, Version 2.0 (the "License"); 5fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * you may not use this file except in compliance with the License. 6fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * You may obtain a copy of the License at 7fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * 8fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * http://www.apache.org/licenses/LICENSE-2.0 9fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * 10fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * Unless required by applicable law or agreed to in writing, software 11fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * distributed under the License is distributed on an "AS IS" BASIS, 12fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * See the License for the specific language governing permissions and 14fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * limitations under the License. 15fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera */ 16fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 17fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera#include <MimeTypeUtil.h> 18fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera#include <utils/Log.h> 19fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 20fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeheranamespace android { 21fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 22fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera#undef LOG_TAG 23fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera#define LOG_TAG "MimeTypeUtil" 24fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 2590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson#ifdef DRM_OMA_FL_ENGINE_DEBUG 2690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson#define LOG_NDEBUG 0 27b8a805261bf0282e992d3608035e47d05a898710Steve Block#define LOG_DEBUG(...) ALOGD(__VA_ARGS__) 2890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson#else 2990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson#define LOG_DEBUG(...) 3090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson#endif 3190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson 32fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeheraenum { 33fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera MIMETYPE_AUDIO = 0, 34fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera MIMETYPE_APPLICATION = 1, 35fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera MIMETYPE_IMAGE = 2, 36fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera MIMETYPE_VIDEO = 3, 37fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera MIMETYPE_LAST = -1, 38fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera}; 39fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 40fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherastruct MimeGroup{ 41fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera int type; // Audio, video,.. use the enum values 42fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera const char* pGroup; // "audio/", "video/",.. should contain the last "/" 43fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera int size; // Number of bytes. e.g. "audio/" = 6 bytes 44fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera}; 45fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 46fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherastruct MimeTypeList{ 47fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera int type; 48fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera const char* pMimeExt; // Everything after the '/' e.g. audio/x-mpeg -> "x-mpeg" 49fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera int size; // Number of bytes. e.g. "x-mpeg" = 6 bytes 50fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera const char* pMimeType; // Mimetype that should be returned 51fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera}; 52fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 53fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 54fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera// Known mimetypes by android 55fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherastatic const char mime_type_audio_mpeg[] = "audio/mpeg"; 56fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherastatic const char mime_type_audio_3gpp[] = "audio/3gpp"; 57fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherastatic const char mime_type_audio_amr[] = "audio/amr-wb"; 58fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherastatic const char mime_type_audio_aac[] = "audio/mp4a-latm"; 59fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherastatic const char mime_type_audio_wav[] = "audio/wav"; 60fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 61fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherastatic const char mime_type_video_mpeg4[] = "video/mpeg4"; 62fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherastatic const char mime_type_video_3gpp[] = "video/3gpp"; 63fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 64fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera// Known mimetype groups 65fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherastatic const char mime_group_audio[] = "audio/"; 66fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherastatic const char mime_group_application[] = "application/"; 67fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherastatic const char mime_group_image[] = "image/"; 68fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherastatic const char mime_group_video[] = "video/"; 6990855078eb989944bca1824058d7231cd68e5021Henrik B Anderssonstatic const char mime_type_unsupported[] = "unsupported/drm.mimetype"; 70fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 71fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherastatic struct MimeGroup mimeGroup[] = { 72fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_AUDIO, mime_group_audio, sizeof(mime_group_audio)-1}, 73fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_APPLICATION, mime_group_application, sizeof(mime_group_application)-1}, 74fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_IMAGE, mime_group_image, sizeof(mime_group_image)-1}, 75fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_VIDEO, mime_group_video, sizeof(mime_group_video)-1}, 76fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_LAST, NULL, 0} // Must be last entry 77fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera}; 78fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 79fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera// List of all mimetypes that should be converted. 80fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherastatic struct MimeTypeList mimeTypeList[] = { 81fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera // Mp3 mime types 82fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_AUDIO, "mp3", sizeof("mp3")-1, mime_type_audio_mpeg}, 83fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_AUDIO, "x-mpeg", sizeof("x-mpeg")-1, mime_type_audio_mpeg}, 84fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_AUDIO, "x-mp3", sizeof("x-mp3")-1, mime_type_audio_mpeg}, 85fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_AUDIO, "mpg", sizeof("mpg")-1, mime_type_audio_mpeg}, 86fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_AUDIO, "mpg3", sizeof("mpg")-1, mime_type_audio_mpeg}, 87fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_AUDIO, "x-mpg", sizeof("x-mpg")-1, mime_type_audio_mpeg}, 88fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_AUDIO, "x-mpegaudio", sizeof("x-mpegaudio")-1, mime_type_audio_mpeg}, 89fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 90fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera // 3gpp audio mime types 91fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_AUDIO, "3gp", sizeof("3gp")-1, mime_type_audio_3gpp}, 92fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 93fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera // Amr audio mime types 94fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_AUDIO, "amr", sizeof("amr")-1, mime_type_audio_amr}, 95fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 96fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera // Aac audio mime types 97fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_AUDIO, "aac", sizeof("aac")-1, mime_type_audio_aac}, 98fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 99fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera // Wav audio mime types 100fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_AUDIO, "x-wav", sizeof("x-wav")-1, mime_type_audio_wav}, 101fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 102fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera // Mpeg4 video mime types 103fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_VIDEO, "mpg4", sizeof("mpg4")-1, mime_type_video_mpeg4}, 104fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_VIDEO, "mp4v-es", sizeof("mp4v-es")-1, mime_type_video_mpeg4}, 105fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 106fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera // 3gpp video mime types 107fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_VIDEO, "3gp", sizeof("3gp")-1, mime_type_video_3gpp}, 108fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 109fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera // Must be last entry 110fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera {MIMETYPE_LAST, NULL, 0, NULL} 111fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera}; 112fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 113fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera/** 114fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * May convert the mimetype if there is a well known 115fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * replacement mimetype otherwise the original mimetype 116fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * is returned. 117fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * 1185a8dbe7ad39fbfb9076894dcd24c596aae2cfccbMark Salyzyn * If the mimetype is of unsupported group i.e. application/... 11990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * then "unsupported/drm.mimetype" will be returned. 12090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 121fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * @param mimeType - mimetype in lower case to convert. 122fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * 12390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @return mimetype or "unsupported/drm.mimetype". 124fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera */ 125fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat DalbeheraString8 MimeTypeUtil::convertMimeType(String8& mimeType) { 126fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera String8 result = mimeType; 127fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera const char* pMimeType; 128fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera struct MimeGroup* pGroup; 129fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera struct MimeTypeList* pMimeItem; 130fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera int len; 131fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera pMimeType = mimeType.string(); 132fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera if (NULL != pMimeType) { 13390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson if ((0 == strncmp(pMimeType, mime_group_audio, (sizeof mime_group_audio) - 1)) || 13490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson (0 == strncmp(pMimeType, mime_group_video, (sizeof mime_group_video) - 1))) { 13590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson /* Check which group the mimetype is */ 13690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson pGroup = mimeGroup; 13790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson while (MIMETYPE_LAST != pGroup->type) { 13890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson if (0 == strncmp(pMimeType, pGroup->pGroup, pGroup->size)) { 13990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson break; 14090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson } 14190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson pGroup++; 142fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera } 143fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 14490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson /* Go through the mimetype list. Only check items of the correct group */ 14590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson if (MIMETYPE_LAST != pGroup->type) { 14690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson pMimeItem = mimeTypeList; 14790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson len = strlen (pMimeType+pGroup->size); 14890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson while (MIMETYPE_LAST != pMimeItem->type) { 14990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson if ((pGroup->type == pMimeItem->type) && 15090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson (len == pMimeItem->size) && 15190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson (0 == strcmp(pMimeType+pGroup->size, pMimeItem->pMimeExt))) { 15290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson result = String8(pMimeItem->pMimeType); 15390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson break; 15490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson } 15590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson pMimeItem++; 156fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera } 157fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera } 15890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson } else { 15990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson result = String8(mime_type_unsupported); 160fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera } 16190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson LOG_DEBUG("convertMimeType got mimetype %s, converted into mimetype %s", 16290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson pMimeType, result.string()); 163fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera } 164fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera return result; 165fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera} 166fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera}; 167