Skip to content

Commit

Permalink
Media: Make media support DRM file's playing
Browse files Browse the repository at this point in the history
- Make media support DRM file's playing.

Change-Id: I1558e62ceec12a17749aa826bf94c3fcca7eedd5
  • Loading branch information
Paramananda authored and rmcc committed Sep 15, 2015
1 parent 4d97392 commit d2612cc
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 7 deletions.
3 changes: 3 additions & 0 deletions drm/drmserver/DrmManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ void DrmManager::removeUniqueId(int uniqueId) {

status_t DrmManager::loadPlugIns() {

String8 vendorPluginDirPath64("/vendor/lib64/drm");
loadPlugIns(vendorPluginDirPath64);

String8 vendorPluginDirPath("/vendor/lib/drm");
loadPlugIns(vendorPluginDirPath);

Expand Down
7 changes: 7 additions & 0 deletions drm/drmserver/DrmManagerService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ static bool isProtectedCallAllowed() {
// TODO
// Following implementation is just for reference.
// Each OEM manufacturer should implement/replace with their own solutions.

// Disabling the reference to allow all process to access DRM API.
/*
IPCThreadState* ipcState = IPCThreadState::self();
uid_t uid = ipcState->getCallingUid();
Expand All @@ -46,6 +49,10 @@ static bool isProtectedCallAllowed() {
}
}
return false;
*/

// All process can access DRM Framework APIs.
return true;
}

void DrmManagerService::instantiate() {
Expand Down
47 changes: 42 additions & 5 deletions drm/libdrmframework/plugins/common/util/src/MimeTypeUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,14 +52,24 @@ struct MimeTypeList{


// Known mimetypes by android
static const char mime_type_audio_mpeg[] = "audio/mpeg";
static const char mime_type_audio_mpeg[] = "audio/qc-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_amr[] = "audio/qc-amr";
static const char mime_type_audio_amr_wb[] = "audio/qc-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_audio_wav[] = "audio/qc-wav";
static const char mime_type_audio_wma[] = "audio/x-ms-wma";

static const char mime_type_video_mpeg4[] = "video/mpeg4";
static const char mime_type_video_3gpp[] = "video/3gpp";
static const char mime_type_video_ogg[] = "video/qc-ogg";
static const char mime_type_video_flv[] = "video/qc-flv";
static const char mime_type_video_3g2[] = "video/3g2";
static const char mime_type_video_wmv[] = "video/x-ms-wmv";

static const char mime_type_image_png[] = "image/png";
static const char mime_type_image_jpeg[] = "image/jpeg";
static const char mime_type_image_gif[] = "image/gif";

// Known mimetype groups
static const char mime_group_audio[] = "audio/";
Expand All @@ -80,6 +90,7 @@ static struct MimeGroup mimeGroup[] = {
static struct MimeTypeList mimeTypeList[] = {
// Mp3 mime types
{MIMETYPE_AUDIO, "mp3", sizeof("mp3")-1, mime_type_audio_mpeg},
{MIMETYPE_AUDIO, "mp3d", sizeof("mp3d")-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},
Expand All @@ -89,23 +100,47 @@ static struct MimeTypeList mimeTypeList[] = {

// 3gpp audio mime types
{MIMETYPE_AUDIO, "3gp", sizeof("3gp")-1, mime_type_audio_3gpp},
{MIMETYPE_AUDIO, "3gpp2", sizeof("3gpp2")-1, mime_type_audio_3gpp},
{MIMETYPE_AUDIO, "3gpp", sizeof("3gpp")-1, mime_type_video_3g2},



// Amr audio mime types
{MIMETYPE_AUDIO, "amr", sizeof("amr")-1, mime_type_audio_amr},
{MIMETYPE_AUDIO, "amr-nb", sizeof("amr-nb")-1, mime_type_audio_amr},
{MIMETYPE_AUDIO, "amr-wb", sizeof("amr-wb")-1, mime_type_audio_amr_wb},

// Aac audio mime types
{MIMETYPE_AUDIO, "aac", sizeof("aac")-1, mime_type_audio_aac},
{MIMETYPE_AUDIO, "mp4a-latm", sizeof("mp4a-latm")-1, mime_type_audio_aac},

// Wav audio mime types
{MIMETYPE_AUDIO, "x-wav", sizeof("x-wav")-1, mime_type_audio_wav},
{MIMETYPE_AUDIO, "wav", sizeof("wav")-1, mime_type_audio_wav},

// Wma audio mime types
{MIMETYPE_AUDIO, "wma", sizeof("wma")-1, mime_type_audio_wma},

// 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},
{MIMETYPE_AUDIO, "m4a", sizeof("m4a")-1, mime_type_video_mpeg4},

{MIMETYPE_VIDEO, "ogg", sizeof("ogg")-1, mime_type_video_ogg},
{MIMETYPE_VIDEO, "flv", sizeof("flv")-1, mime_type_video_flv},

// 3gpp video mime types
{MIMETYPE_VIDEO, "3gp", sizeof("3gp")-1, mime_type_video_3gpp},

// png image mime type
{MIMETYPE_IMAGE, "png", sizeof("png")-1, mime_type_image_png},

// jpeg image mime type
{MIMETYPE_IMAGE, "jpeg", sizeof("jpeg")-1, mime_type_image_jpeg},

// jpeg image mime type
{MIMETYPE_IMAGE, "gif", sizeof("gif")-1, mime_type_image_gif},

// Must be last entry
{MIMETYPE_LAST, NULL, 0, NULL}
};
Expand All @@ -131,7 +166,9 @@ String8 MimeTypeUtil::convertMimeType(String8& mimeType) {
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))) {
(0 == strncmp(pMimeType, mime_group_video, (sizeof mime_group_video) - 1)) ||
(0 == strncmp(pMimeType, mime_group_image, (sizeof mime_group_image) - 1)) ||
(0 == strncmp(pMimeType, "application/ogg", 15))) {
/* Check which group the mimetype is */
pGroup = mimeGroup;
while (MIMETYPE_LAST != pGroup->type) {
Expand Down Expand Up @@ -163,4 +200,4 @@ String8 MimeTypeUtil::convertMimeType(String8& mimeType) {
}
return result;
}
};
};
1 change: 1 addition & 0 deletions media/libmediaplayerservice/Android.mk
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ LOCAL_SHARED_LIBRARIES := \
libstagefright_wfd \
libutils \
libvorbisidec \
libdrmframework \

LOCAL_STATIC_LIBRARIES := \
libstagefright_nuplayer \
Expand Down
2 changes: 2 additions & 0 deletions media/libmediaplayerservice/MediaPlayerService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -496,6 +496,7 @@ status_t MediaPlayerService::dump(int fd, const Vector<String16>& args)
while (!feof(f)) {
fgets(buffer, SIZE, f);
if (strstr(buffer, " /storage/") ||
strstr(buffer, " /mnt/sdcard/") ||
strstr(buffer, " /system/sounds/") ||
strstr(buffer, " /data/") ||
strstr(buffer, " /system/media/")) {
Expand Down Expand Up @@ -532,6 +533,7 @@ status_t MediaPlayerService::dump(int fd, const Vector<String16>& args)
linkto[len] = 0;
}
if (strstr(linkto, "/storage/") == linkto ||
strstr(linkto, "/mnt/sdcard/") == linkto ||
strstr(linkto, "/system/sounds/") == linkto ||
strstr(linkto, "/data/") == linkto ||
strstr(linkto, "/system/media/") == linkto) {
Expand Down
20 changes: 19 additions & 1 deletion media/libstagefright/AwesomePlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,8 @@ AwesomePlayer::AwesomePlayer()
#ifdef MTK_HARDWARE
mAVSyncTimeUs(-1),
#endif
mIsFirstFrameAfterResume(false) {
mIsFirstFrameAfterResume(false),
mConsumeRights(true) {
CHECK_EQ(mClient.connect(), (status_t)OK);

DataSource::RegisterDefaultSniffers();
Expand Down Expand Up @@ -498,6 +499,9 @@ void AwesomePlayer::checkDrmStatus(const sp<DataSource>& dataSource) {
CHECK(mDrmManagerClient);
if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) {
notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE);
} else {
ALOGV("awesome: calling consumeRights, fd");
mConsumeRights = true;
}
}
}
Expand Down Expand Up @@ -1061,6 +1065,8 @@ void AwesomePlayer::onStreamDone() {

notifyListener_l(MEDIA_PLAYBACK_COMPLETE);

mConsumeRights = true;

pause_l(true /* at eos */);

// If audio hasn't completed MEDIA_SEEK_COMPLETE yet,
Expand All @@ -1080,6 +1086,12 @@ status_t AwesomePlayer::play() {

Mutex::Autolock autoLock(mLock);

if (mDrmManagerClient && mDecryptHandle != NULL && mConsumeRights) {
ALOGV("awesome: calling consumeRights,ap=[%p]", this);
mDrmManagerClient->consumeRights(mDecryptHandle, Action::PLAY, true);
mConsumeRights = false;
}

modifyFlags(CACHE_UNDERRUN, CLEAR);

return play_l();
Expand Down Expand Up @@ -1557,6 +1569,9 @@ status_t AwesomePlayer::pause() {
Mutex::Autolock autoLock(mLock);

modifyFlags(CACHE_UNDERRUN, CLEAR);
if (mDecryptHandle != NULL) {
mConsumeRights = false;
}

return pause_l();
}
Expand Down Expand Up @@ -1803,6 +1818,9 @@ status_t AwesomePlayer::seekTo_l(int64_t timeUs) {
}

if (!(mFlags & PLAYING)) {
if (mDecryptHandle != NULL) {
mConsumeRights = false;
}
ALOGV("seeking while paused, sending SEEK_COMPLETE notification"
" immediately.");

Expand Down
2 changes: 1 addition & 1 deletion media/libstagefright/include/AwesomePlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,7 @@ struct AwesomePlayer {
bool mAudioTearDown;
bool mAudioTearDownWasPlaying;
int64_t mAudioTearDownPosition;

bool mConsumeRights;
status_t setVideoScalingMode(int32_t mode);
status_t setVideoScalingMode_l(int32_t mode);
status_t getTrackInfo(Parcel* reply) const;
Expand Down

0 comments on commit d2612cc

Please sign in to comment.