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