OSDN Git Service

Bug 5585323 Authorize audio decode for system
authorJean-Michel Trivi <jmtrivi@google.com>
Mon, 7 Nov 2011 23:59:51 +0000 (15:59 -0800)
committerJean-Michel Trivi <jmtrivi@google.com>
Tue, 8 Nov 2011 19:57:50 +0000 (11:57 -0800)
Authorize the use of specific audio codecs for audio decoding
by the system, which guarantees audio is decoded for playback,
when the appropriate system permission is used.

Change-Id: I0633b04b4d0aebe89804ef48752bf05d72abc56d

wilhelm/src/android/android_AudioSfDecoder.cpp

index 79e01a4..de07265 100644 (file)
@@ -19,6 +19,7 @@
 #include "sles_allinclusive.h"
 #include "android/android_AudioSfDecoder.h"
 
+#include <binder/IServiceManager.h>
 #include <media/stagefright/foundation/ADebug.h>
 
 
@@ -776,17 +777,25 @@ void AudioSfDecoder::hasNewDecodeParams() {
     updateAudioSink();
 }
 
-static const char* const kUnsupportedCodecs[] = { MEDIA_MIMETYPE_AUDIO_AMR_NB,
+static const char* const kPlaybackOnlyCodecs[] = { MEDIA_MIMETYPE_AUDIO_AMR_NB,
         MEDIA_MIMETYPE_AUDIO_AMR_WB };
-#define NB_UNSUPPORTED_CODECS (sizeof(kUnsupportedCodecs)/sizeof(kUnsupportedCodecs[0]))
+#define NB_PLAYBACK_ONLY_CODECS (sizeof(kPlaybackOnlyCodecs)/sizeof(kPlaybackOnlyCodecs[0]))
 
 bool AudioSfDecoder::isSupportedCodec(const char* mime) {
-    for (unsigned int i = 0 ; i < NB_UNSUPPORTED_CODECS ; i++) {
-        if (!strcasecmp(mime, kUnsupportedCodecs[i])) {
-            return false;
+    bool codecRequiresPermission = false;
+    for (unsigned int i = 0 ; i < NB_PLAYBACK_ONLY_CODECS ; i++) {
+        if (!strcasecmp(mime, kPlaybackOnlyCodecs[i])) {
+            codecRequiresPermission = true;
+            break;
         }
     }
-    return true;
+    if (codecRequiresPermission) {
+        // verify only the system can decode, for playback only
+        return checkCallingPermission(
+                String16("android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK"));
+    } else {
+        return true;
+    }
 }
 
 } // namespace android