Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fdd65a0f authored by Pravat Dalbehera's avatar Pravat Dalbehera Committed by Johan Redestig
Browse files

Initial OMA DRM forward lock contribution

OMA DRM forward lock agent is plugged into the
Open DRM framework. Forward lock agent implementation contains:
- Forward lock engine to communicate with framework
- Converter to encrypt the original file into a special format
- Decoder to feed the decrypted data for rendering
- Lightweight unique key-encryption mechanism
- Documentation

Change-Id: Id828ebc30b8147b58b14960a73571648bc01ae94
parent 7f7371ad
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
#
# 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 $(call all-subdir-makefiles)
+52 −0
Original line number Diff line number Diff line
#
# 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.
#
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := \
    src/MimeTypeUtil.cpp

LOCAL_MODULE := libdrmutility

LOCAL_SHARED_LIBRARIES :=  \
    libutils \
    libdl \
    libdvm \
    libandroid_runtime \
    libnativehelper \
    liblog


base := frameworks/base

LOCAL_C_INCLUDES += \
    $(JNI_H_INCLUDE) \
    $(base)/include \
    $(base)/include/drm \
    $(base)/include/drm/plugins \
    $(LOCAL_PATH)/include


ifneq ($(TARGET_BUILD_VARIANT),user)
LOCAL_C_INCLUDES += \
    $(LOCAL_PATH)/tools

endif

LOCAL_MODULE_TAGS := optional

include $(BUILD_STATIC_LIBRARY)
+46 −0
Original line number Diff line number Diff line
/*
 * 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.
 */

#ifndef __MIMETYPEUTIL_H__
#define __MIMETYPEUTIL_H__

#include <utils/String8.h>

namespace android {

class MimeTypeUtil {

public:

    MimeTypeUtil() {}

    virtual ~MimeTypeUtil() {}

/**
 * May convert the mimetype if there is a well known
 * replacement mimetype otherwise the original mimetype
 * is returned.
 *
 * @param mimeType - mimetype in lower case to convert.
 *
 * @return mimetype or null.
 */
static String8 convertMimeType(String8& mimeType);

};
};

#endif /* __MIMETYPEUTIL_H__ */
+155 −0
Original line number Diff line number Diff line
/*
 * 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.
 */

#ifndef __SESSIONMAP_H__
#define __SESSIONMAP_H__

#include <utils/KeyedVector.h>

namespace android {

/**
 * A wrapper template class for handling DRM Engine sessions.
 */
template <typename NODE>
class SessionMap {

public:
    KeyedVector<int, NODE> map;

    SessionMap() {}

    virtual ~SessionMap() {
        destroyMap();
    }

/**
 * Adds a new value in the session map table. It expects memory to be allocated already
 * for the session object
 *
 * @param key - key or Session ID
 * @param value - session object to add
 *
 * @return boolean result of adding value. returns false if key is already exist.
 */
bool addValue(int key, NODE value) {
    bool result = false;

    if (!isCreated(key)) {
        map.add(key, value);
        result = true;
    }

    return result;
}


/**
 * returns the session object by the key
 *
 * @param key - key or Session ID
 *
 * @return session object as per the key
 */
NODE getValue(int key) {
    NODE value = NULL;

    if (isCreated(key)) {
        value = (NODE) map.valueFor(key);
    }

    return value;
}

/**
 * returns the number of objects in the session map table
 *
 * @return count of number of session objects.
 */
int getSize() {
    return map.size();
}

/**
 * returns the session object by the index in the session map table
 *
 * @param index - index of the value required
 *
 * @return session object as per the index
 */
NODE getValueAt(unsigned int index) {
    NODE value = NULL;

    if (map.size() > index) {
      value = map.valueAt(index);
    }

    return value;
}

/**
 * deletes the object from session map. It also frees up memory for the session object.
 *
 * @param key - key of the value to be deleted
 *
 */
void removeValue(int key) {
    deleteValue(getValue(key));
    map.removeItem(key);
}

/**
 * decides if session is already created.
 *
 * @param key - key of the value for the session
 *
 * @return boolean result of whether session is created
 */
bool isCreated(int key) {
    return (0 <= map.indexOfKey(key));
}

/**
 * empty the entire session table. It releases all the memory for session objects.
 */
void destroyMap() {
    int size = map.size();
    int i = 0;

    for (i = 0; i < size; i++) {
        deleteValue(map.valueAt(i));
    }

    map.clear();
}

/**
 * free up the memory for the session object.
 * Make sure if any reference to the session object anywhere, otherwise it will be a
 * dangle pointer after this call.
 *
 * @param value - session object to free
 *
 */
void deleteValue(NODE value) {
    delete value;
}

};

};

#endif /* __SESSIONMAP_H__ */
+154 −0
Original line number Diff line number Diff line
/*
 * 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"

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 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.
 *
 * @param mimeType - mimetype in lower case to convert.
 *
 * @return mimetype or null.
 */
String8 MimeTypeUtil::convertMimeType(String8& mimeType) {
    String8 result = mimeType;
    const char* pTmp;
    const char* pMimeType;
    struct MimeGroup* pGroup;
    struct MimeTypeList* pMimeItem;
    int len;

    pMimeType = mimeType.string();
    if (NULL != pMimeType) {
        /* 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 ((len == pMimeItem->size) &&
                    (0 == strcmp(pMimeType+pGroup->size, pMimeItem->pMimeExt))) {
                    result = String8(pMimeItem->pMimeType);
                    break;
                }
                pMimeItem++;
            }
        }
        LOGI("convertMimeType got mimetype %s, converted into mimetype %s",
             pMimeType, result.string());
    }

    return result;
}
};
Loading