|
|
|
@ -23,6 +23,7 @@
|
|
|
|
|
|
|
|
|
|
#include <binder/IPCThreadState.h>
|
|
|
|
|
#include <binder/Parcel.h>
|
|
|
|
|
#include <binder/PermissionCache.h>
|
|
|
|
|
#include <media/IMediaExtractor.h>
|
|
|
|
|
#include <media/stagefright/MetaData.h>
|
|
|
|
|
|
|
|
|
@ -323,13 +324,21 @@ void registerMediaExtractor(
|
|
|
|
|
|
|
|
|
|
status_t dumpExtractors(int fd, const Vector<String16>&) {
|
|
|
|
|
String8 out;
|
|
|
|
|
out.append("Recent extractors, most recent first:\n");
|
|
|
|
|
{
|
|
|
|
|
Mutex::Autolock lock(sExtractorsLock);
|
|
|
|
|
for (size_t i = 0; i < sExtractors.size(); i++) {
|
|
|
|
|
const ExtractorInstance &instance = sExtractors.itemAt(i);
|
|
|
|
|
out.append(" ");
|
|
|
|
|
out.append(instance.toString());
|
|
|
|
|
const IPCThreadState* ipc = IPCThreadState::self();
|
|
|
|
|
const int pid = ipc->getCallingPid();
|
|
|
|
|
const int uid = ipc->getCallingUid();
|
|
|
|
|
if (!PermissionCache::checkPermission(String16("android.permission.DUMP"), pid, uid)) {
|
|
|
|
|
out.appendFormat("Permission Denial: "
|
|
|
|
|
"can't dump MediaExtractor from pid=%d, uid=%d\n", pid, uid);
|
|
|
|
|
} else {
|
|
|
|
|
out.append("Recent extractors, most recent first:\n");
|
|
|
|
|
{
|
|
|
|
|
Mutex::Autolock lock(sExtractorsLock);
|
|
|
|
|
for (size_t i = 0; i < sExtractors.size(); i++) {
|
|
|
|
|
const ExtractorInstance &instance = sExtractors.itemAt(i);
|
|
|
|
|
out.append(" ");
|
|
|
|
|
out.append(instance.toString());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
write(fd, out.string(), out.size());
|
|
|
|
|