Skip to content

Instantly share code, notes, and snippets.

@itlodge
Created November 26, 2013 01:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save itlodge/7652195 to your computer and use it in GitHub Desktop.
Save itlodge/7652195 to your computer and use it in GitHub Desktop.
Get vendor codecs for android 4.0. Link this program with ``-ldl -lutils``. Add ``-fno-rtti`` to g++.
#include <dlfcn.h>
#include <stdio.h>
typedef char * OMX_STRING;
typedef unsigned int OMX_U32;
typedef enum OMX_ERRORTYPE {
OMX_ErrorNone = 0,
OMX_ErrorNoMore = 0x8000100E
} OMX_ERRORTYPE;
namespace android {
class String8 {
public:
String8();
String8(const String8& o);
~String8();
inline String8& operator=(const String8& other);
inline const char* string() const
{ return mString; }
private:
const char* mString;
};
class VectorImpl {
public:
VectorImpl(size_t itemSize, uint32_t flags);
VectorImpl(const VectorImpl& rhs);
virtual ~VectorImpl();
VectorImpl& operator = (const VectorImpl& rhs);
inline const void *arrayImpl() const { return mStorage; }
protected:
virtual void do_construct(void* storage, size_t num) const = 0;
virtual void do_destroy(void* storage, size_t num) const = 0;
virtual void do_copy(void* dest, const void* from, size_t num) const = 0;
virtual void do_splat(void* dest, const void* item, size_t num) const = 0;
virtual void do_move_forward(void* dest, const void* from, size_t num) const = 0;
virtual void do_move_backward(void* dest, const void* from, size_t num) const = 0;
// take care of FBC...
virtual void reservedVectorImpl1();
virtual void reservedVectorImpl2();
virtual void reservedVectorImpl3();
virtual void reservedVectorImpl4();
virtual void reservedVectorImpl5();
virtual void reservedVectorImpl6();
virtual void reservedVectorImpl7();
virtual void reservedVectorImpl8();
private:
void *mStorage; // base address of the vector
size_t mCount; // number of items
const uint32_t mFlags;
const size_t mItemSize;
};
template <class TYPE>
class Vector : private VectorImpl {
public:
Vector()
: VectorImpl(sizeof(TYPE), 0)
{ }
Vector(const Vector<TYPE>& rhs);
virtual ~Vector();
const Vector<TYPE>& operator = (const Vector<TYPE>& rhs) const;
Vector<TYPE>& operator = (const Vector<TYPE>& rhs);
inline const TYPE& operator [] (size_t index) const
{ return *(array() + index); }
inline const TYPE* array() const
{ return static_cast<const TYPE *>(arrayImpl()); }
protected:
virtual void do_construct(void* storage, size_t num) const;
virtual void do_destroy(void* storage, size_t num) const;
virtual void do_copy(void* dest, const void* from, size_t num) const;
virtual void do_splat(void* dest, const void* item, size_t num) const;
virtual void do_move_forward(void* dest, const void* from, size_t num) const;
virtual void do_move_backward(void* dest, const void* from, size_t num) const;
};
};
struct OMXPluginBase {
OMXPluginBase() {}
virtual ~OMXPluginBase() {}
virtual void dummy1() = 0;
virtual void dummy2() = 0;
virtual OMX_ERRORTYPE enumerateComponents(
OMX_STRING name,
size_t size,
OMX_U32 index) = 0;
virtual OMX_ERRORTYPE getRolesOfComponent(
const char *name,
android::Vector<android::String8> *roles) = 0;
private:
OMXPluginBase(const OMXPluginBase &);
OMXPluginBase &operator=(const OMXPluginBase &);
};
void *__gxx_personality_v0;
int
main(int argc, char *argv[])
{
void *handle = dlopen("libstagefrighthw.so", RTLD_NOW);
if (handle == NULL) {
return -1;
}
typedef OMXPluginBase *(*CreateOMXPluginFunc)();
CreateOMXPluginFunc createOMXPlugin =
(CreateOMXPluginFunc)dlsym(handle, "createOMXPlugin");
if (!createOMXPlugin) {
createOMXPlugin = (CreateOMXPluginFunc)dlsym(
handle, "_ZN7android15createOMXPluginEv");
}
OMXPluginBase *plugin = (*createOMXPlugin)();
if (plugin) {
OMX_U32 index = -1;
char name[128];
android::Vector<android::String8> roles;
OMX_ERRORTYPE err;
while ((err = plugin->enumerateComponents(name, sizeof(name),
++index)) == OMX_ErrorNone) {
if ((err = plugin->getRolesOfComponent(name, &roles))
== OMX_ErrorNone) {
printf("%s -- %s\n", name, roles[0].string());
} else {
printf("0x%x\n", err);
}
}
if (err != OMX_ErrorNoMore) {
printf("0x%x\n", err);
}
}
dlclose(handle);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment