Merge changes Idbea7883,Ie49cec34 into qt-dev

* changes:
  extractor: load extractors on boot, not on request.
  Revert "Make tombstone in the child process on loading failure."
gugelfrei
TreeHugger Robot 5 years ago committed by Android (Google) Code Review
commit 1526ab3ea0

@ -26,7 +26,6 @@
#include <C2Config.h> #include <C2Config.h>
#include <C2PlatformStorePluginLoader.h> #include <C2PlatformStorePluginLoader.h>
#include <C2PlatformSupport.h> #include <C2PlatformSupport.h>
#include <media/stagefright/foundation/ADebug.h>
#include <util/C2InterfaceHelper.h> #include <util/C2InterfaceHelper.h>
#include <dlfcn.h> #include <dlfcn.h>
@ -662,36 +661,30 @@ c2_status_t C2PlatformComponentStore::ComponentModule::init(
ALOGV("in %s", __func__); ALOGV("in %s", __func__);
ALOGV("loading dll"); ALOGV("loading dll");
mLibHandle = dlopen(libPath.c_str(), RTLD_NOW|RTLD_NODELETE); mLibHandle = dlopen(libPath.c_str(), RTLD_NOW|RTLD_NODELETE);
if (mLibHandle == nullptr) { LOG_ALWAYS_FATAL_IF(mLibHandle == nullptr,
LOG_ALWAYS_FATAL_IN_CHILD_PROC("could not dlopen %s: %s", libPath.c_str(), dlerror()); "could not dlopen %s: %s", libPath.c_str(), dlerror());
mInit = C2_CORRUPTED;
return mInit;
}
createFactory = createFactory =
(C2ComponentFactory::CreateCodec2FactoryFunc)dlsym(mLibHandle, "CreateCodec2Factory"); (C2ComponentFactory::CreateCodec2FactoryFunc)dlsym(mLibHandle, "CreateCodec2Factory");
if (createFactory == nullptr) { LOG_ALWAYS_FATAL_IF(createFactory == nullptr,
LOG_ALWAYS_FATAL_IN_CHILD_PROC("createFactory is null in %s", libPath.c_str()); "createFactory is null in %s", libPath.c_str());
mInit = C2_CORRUPTED;
return mInit;
}
destroyFactory = destroyFactory =
(C2ComponentFactory::DestroyCodec2FactoryFunc)dlsym(mLibHandle, "DestroyCodec2Factory"); (C2ComponentFactory::DestroyCodec2FactoryFunc)dlsym(mLibHandle, "DestroyCodec2Factory");
if (destroyFactory == nullptr) { LOG_ALWAYS_FATAL_IF(destroyFactory == nullptr,
LOG_ALWAYS_FATAL_IN_CHILD_PROC("destroyFactory is null in %s", libPath.c_str()); "destroyFactory is null in %s", libPath.c_str());
mInit = C2_CORRUPTED;
return mInit;
}
mComponentFactory = createFactory(); mComponentFactory = createFactory();
if (mComponentFactory == nullptr) { if (mComponentFactory == nullptr) {
ALOGD("could not create factory in %s", libPath.c_str()); ALOGD("could not create factory in %s", libPath.c_str());
mInit = C2_NO_MEMORY; mInit = C2_NO_MEMORY;
return mInit; } else {
mInit = C2_OK;
} }
mInit = C2_OK; if (mInit != C2_OK) {
return mInit;
}
std::shared_ptr<C2ComponentInterface> intf; std::shared_ptr<C2ComponentInterface> intf;
c2_status_t res = createInterface(0, &intf); c2_status_t res = createInterface(0, &intf);

@ -19,11 +19,11 @@
#include <utils/Log.h> #include <utils/Log.h>
#include <android/dlext.h> #include <android/dlext.h>
#include <android-base/logging.h>
#include <binder/IPCThreadState.h> #include <binder/IPCThreadState.h>
#include <binder/PermissionCache.h> #include <binder/PermissionCache.h>
#include <binder/IServiceManager.h> #include <binder/IServiceManager.h>
#include <media/DataSource.h> #include <media/DataSource.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/InterfaceUtils.h> #include <media/stagefright/InterfaceUtils.h>
#include <media/stagefright/MediaExtractor.h> #include <media/stagefright/MediaExtractor.h>
#include <media/stagefright/MediaExtractorFactory.h> #include <media/stagefright/MediaExtractorFactory.h>
@ -71,8 +71,6 @@ sp<IMediaExtractor> MediaExtractorFactory::CreateFromService(
ALOGV("MediaExtractorFactory::CreateFromService %s", mime); ALOGV("MediaExtractorFactory::CreateFromService %s", mime);
UpdateExtractors();
// initialize source decryption if needed // initialize source decryption if needed
source->DrmInitialization(nullptr /* mime */); source->DrmInitialization(nullptr /* mime */);
@ -245,21 +243,17 @@ void MediaExtractorFactory::RegisterExtractors(
void *libHandle = android_dlopen_ext( void *libHandle = android_dlopen_ext(
libPath.string(), libPath.string(),
RTLD_NOW | RTLD_LOCAL, dlextinfo); RTLD_NOW | RTLD_LOCAL, dlextinfo);
if (libHandle) { CHECK(libHandle != nullptr)
GetExtractorDef getDef = << "couldn't dlopen(" << libPath.string() << ") " << strerror(errno);
(GetExtractorDef) dlsym(libHandle, "GETEXTRACTORDEF");
if (getDef) { GetExtractorDef getDef =
ALOGV("registering sniffer for %s", libPath.string()); (GetExtractorDef) dlsym(libHandle, "GETEXTRACTORDEF");
RegisterExtractor( CHECK(getDef != nullptr)
new ExtractorPlugin(getDef(), libHandle, libPath), pluginList); << libPath.string() << " does not contain sniffer";
} else {
LOG_ALWAYS_FATAL_IN_CHILD_PROC("%s does not contain sniffer", libPath.string()); ALOGV("registering sniffer for %s", libPath.string());
dlclose(libHandle); RegisterExtractor(
} new ExtractorPlugin(getDef(), libHandle, libPath), pluginList);
} else {
LOG_ALWAYS_FATAL_IN_CHILD_PROC(
"couldn't dlopen(%s) %s", libPath.string(), strerror(errno));
}
} }
closedir(libDir); closedir(libDir);
} else { } else {
@ -274,7 +268,7 @@ static bool compareFunc(const sp<ExtractorPlugin>& first, const sp<ExtractorPlug
static std::unordered_set<std::string> gSupportedExtensions; static std::unordered_set<std::string> gSupportedExtensions;
// static // static
void MediaExtractorFactory::UpdateExtractors() { void MediaExtractorFactory::LoadExtractors() {
Mutex::Autolock autoLock(gPluginMutex); Mutex::Autolock autoLock(gPluginMutex);
if (gPluginsRegistered) { if (gPluginsRegistered) {

@ -114,15 +114,6 @@ inline static const char *asString(status_t i, const char *def = "??") {
#define TRESPASS_DBG(...) #define TRESPASS_DBG(...)
#endif #endif
#ifndef LOG_ALWAYS_FATAL_IN_CHILD_PROC
#define LOG_ALWAYS_FATAL_IN_CHILD_PROC(...) \
do { \
if (fork() == 0) { \
LOG_ALWAYS_FATAL(__VA_ARGS__); \
} \
} while (false)
#endif
struct ADebug { struct ADebug {
enum Level { enum Level {
kDebugNone, // no debug kDebugNone, // no debug

@ -37,6 +37,7 @@ public:
const sp<DataSource> &source, const char *mime = NULL); const sp<DataSource> &source, const char *mime = NULL);
static status_t dump(int fd, const Vector<String16>& args); static status_t dump(int fd, const Vector<String16>& args);
static std::unordered_set<std::string> getSupportedTypes(); static std::unordered_set<std::string> getSupportedTypes();
static void LoadExtractors();
private: private:
static Mutex gPluginMutex; static Mutex gPluginMutex;
@ -53,8 +54,6 @@ private:
static void *sniff(const sp<DataSource> &source, static void *sniff(const sp<DataSource> &source,
float *confidence, void **meta, FreeMetaFunc *freeMeta, float *confidence, void **meta, FreeMetaFunc *freeMeta,
sp<ExtractorPlugin> &plugin, uint32_t *creatorVersion); sp<ExtractorPlugin> &plugin, uint32_t *creatorVersion);
static void UpdateExtractors();
}; };
} // namespace android } // namespace android

@ -30,7 +30,9 @@
namespace android { namespace android {
MediaExtractorService::MediaExtractorService() MediaExtractorService::MediaExtractorService()
: BnMediaExtractorService() { } : BnMediaExtractorService() {
MediaExtractorFactory::LoadExtractors();
}
sp<IMediaExtractor> MediaExtractorService::makeExtractor( sp<IMediaExtractor> MediaExtractorService::makeExtractor(
const sp<IDataSource> &remoteSource, const char *mime) { const sp<IDataSource> &remoteSource, const char *mime) {

Loading…
Cancel
Save