| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include <MimeTypeUtil.h> |
| #include <utils/Log.h> |
| |
| namespace android { |
| |
| #undef LOG_TAG |
| #define LOG_TAG "MimeTypeUtil" |
| |
| #ifdef DRM_OMA_FL_ENGINE_DEBUG |
| #define LOG_NDEBUG 0 |
| #define LOG_DEBUG(...) ALOGD(__VA_ARGS__) |
| #else |
| #define LOG_DEBUG(...) |
| #endif |
| |
| enum { |
| MIMETYPE_AUDIO = 0, |
| MIMETYPE_APPLICATION = 1, |
| MIMETYPE_IMAGE = 2, |
| MIMETYPE_VIDEO = 3, |
| MIMETYPE_LAST = -1, |
| }; |
| |
| struct MimeGroup{ |
| int type; // Audio, video,.. use the enum values |
| const char* pGroup; // "audio/", "video/",.. should contain the last "/" |
| int size; // Number of bytes. e.g. "audio/" = 6 bytes |
| }; |
| |
| struct MimeTypeList{ |
| int type; |
| const char* pMimeExt; // Everything after the '/' e.g. audio/x-mpeg -> "x-mpeg" |
| int size; // Number of bytes. e.g. "x-mpeg" = 6 bytes |
| const char* pMimeType; // Mimetype that should be returned |
| }; |
| |
| |
| // Known mimetypes by android |
| static const char mime_type_audio_mpeg[] = "audio/mpeg"; |
| static const char mime_type_audio_3gpp[] = "audio/3gpp"; |
| static const char mime_type_audio_amr[] = "audio/amr-wb"; |
| static const char mime_type_audio_aac[] = "audio/mp4a-latm"; |
| static const char mime_type_audio_wav[] = "audio/wav"; |
| |
| static const char mime_type_video_mpeg4[] = "video/mpeg4"; |
| static const char mime_type_video_3gpp[] = "video/3gpp"; |
| |
| // Known mimetype groups |
| static const char mime_group_audio[] = "audio/"; |
| static const char mime_group_application[] = "application/"; |
| static const char mime_group_image[] = "image/"; |
| static const char mime_group_video[] = "video/"; |
| static const char mime_type_unsupported[] = "unsupported/drm.mimetype"; |
| |
| static struct MimeGroup mimeGroup[] = { |
| {MIMETYPE_AUDIO, mime_group_audio, sizeof(mime_group_audio)-1}, |
| {MIMETYPE_APPLICATION, mime_group_application, sizeof(mime_group_application)-1}, |
| {MIMETYPE_IMAGE, mime_group_image, sizeof(mime_group_image)-1}, |
| {MIMETYPE_VIDEO, mime_group_video, sizeof(mime_group_video)-1}, |
| {MIMETYPE_LAST, NULL, 0} // Must be last entry |
| }; |
| |
| // List of all mimetypes that should be converted. |
| static struct MimeTypeList mimeTypeList[] = { |
| // Mp3 mime types |
| {MIMETYPE_AUDIO, "mp3", sizeof("mp3")-1, mime_type_audio_mpeg}, |
| {MIMETYPE_AUDIO, "x-mpeg", sizeof("x-mpeg")-1, mime_type_audio_mpeg}, |
| {MIMETYPE_AUDIO, "x-mp3", sizeof("x-mp3")-1, mime_type_audio_mpeg}, |
| {MIMETYPE_AUDIO, "mpg", sizeof("mpg")-1, mime_type_audio_mpeg}, |
| {MIMETYPE_AUDIO, "mpg3", sizeof("mpg")-1, mime_type_audio_mpeg}, |
| {MIMETYPE_AUDIO, "x-mpg", sizeof("x-mpg")-1, mime_type_audio_mpeg}, |
| {MIMETYPE_AUDIO, "x-mpegaudio", sizeof("x-mpegaudio")-1, mime_type_audio_mpeg}, |
| |
| // 3gpp audio mime types |
| {MIMETYPE_AUDIO, "3gp", sizeof("3gp")-1, mime_type_audio_3gpp}, |
| |
| // Amr audio mime types |
| {MIMETYPE_AUDIO, "amr", sizeof("amr")-1, mime_type_audio_amr}, |
| |
| // Aac audio mime types |
| {MIMETYPE_AUDIO, "aac", sizeof("aac")-1, mime_type_audio_aac}, |
| |
| // Wav audio mime types |
| {MIMETYPE_AUDIO, "x-wav", sizeof("x-wav")-1, mime_type_audio_wav}, |
| |
| // Mpeg4 video mime types |
| {MIMETYPE_VIDEO, "mpg4", sizeof("mpg4")-1, mime_type_video_mpeg4}, |
| {MIMETYPE_VIDEO, "mp4v-es", sizeof("mp4v-es")-1, mime_type_video_mpeg4}, |
| |
| // 3gpp video mime types |
| {MIMETYPE_VIDEO, "3gp", sizeof("3gp")-1, mime_type_video_3gpp}, |
| |
| // Must be last entry |
| {MIMETYPE_LAST, NULL, 0, NULL} |
| }; |
| |
| /** |
| * May convert the mimetype if there is a well known |
| * replacement mimetype otherwise the original mimetype |
| * is returned. |
| * |
| * If the mimetype is of unsupported group i.e. application/* |
| * then "unsupported/drm.mimetype" will be returned. |
| * |
| * @param mimeType - mimetype in lower case to convert. |
| * |
| * @return mimetype or "unsupported/drm.mimetype". |
| */ |
| String8 MimeTypeUtil::convertMimeType(String8& mimeType) { |
| String8 result = mimeType; |
| const char* pMimeType; |
| struct MimeGroup* pGroup; |
| struct MimeTypeList* pMimeItem; |
| int len; |
| pMimeType = mimeType.string(); |
| if (NULL != pMimeType) { |
| if ((0 == strncmp(pMimeType, mime_group_audio, (sizeof mime_group_audio) - 1)) || |
| (0 == strncmp(pMimeType, mime_group_video, (sizeof mime_group_video) - 1))) { |
| /* Check which group the mimetype is */ |
| pGroup = mimeGroup; |
| while (MIMETYPE_LAST != pGroup->type) { |
| if (0 == strncmp(pMimeType, pGroup->pGroup, pGroup->size)) { |
| break; |
| } |
| pGroup++; |
| } |
| |
| /* Go through the mimetype list. Only check items of the correct group */ |
| if (MIMETYPE_LAST != pGroup->type) { |
| pMimeItem = mimeTypeList; |
| len = strlen (pMimeType+pGroup->size); |
| while (MIMETYPE_LAST != pMimeItem->type) { |
| if ((pGroup->type == pMimeItem->type) && |
| (len == pMimeItem->size) && |
| (0 == strcmp(pMimeType+pGroup->size, pMimeItem->pMimeExt))) { |
| result = String8(pMimeItem->pMimeType); |
| break; |
| } |
| pMimeItem++; |
| } |
| } |
| } else { |
| result = String8(mime_type_unsupported); |
| } |
| LOG_DEBUG("convertMimeType got mimetype %s, converted into mimetype %s", |
| pMimeType, result.string()); |
| } |
| return result; |
| } |
| }; |