extern CodecPlugin dxva_plugin;
#endif
-enum codec_io_cmd {
- CODEC_CMD_API_INDEX = 0x28,
- CODEC_CMD_CONTEXT_INDEX = 0x2C,
- CODEC_CMD_DEVICE_MEM_OFFSET = 0x34,
- CODEC_CMD_GET_THREAD_STATE = 0x38,
- CODEC_CMD_GET_CTX_FROM_QUEUE = 0x3C,
- CODEC_CMD_GET_DATA_FROM_QUEUE = 0x40,
- CODEC_CMD_RELEASE_CONTEXT = 0x44,
- CODEC_CMD_GET_VERSION = 0x50,
- CODEC_CMD_GET_ELEMENT = 0x54,
- CODEC_CMD_GET_CONTEXT_INDEX = 0x58,
+enum device_cmd {
+ DEVICE_CMD_API_INDEX = 0,
+ DEVICE_CMD_CONTEXT_INDEX,
+ DEVICE_CMD_DEVICE_MEM_OFFSET,
+ DEVICE_CMD_GET_THREAD_STATE,
+ DEVICE_CMD_GET_CTX_FROM_QUEUE,
+ DEVICE_CMD_GET_DATA_FROM_QUEUE,
+ DEVICE_CMD_RELEASE_CONTEXT,
+ DEVICE_CMD_GET_ELEMENT,
+ DEVICE_CMD_GET_CONTEXT_INDEX,
+ DEVICE_CMD_GET_DEVICE_INFO,
};
enum thread_state {
MaruBrillCodecState *s = (MaruBrillCodecState *)opaque;
uint64_t ret = 0;
- switch (addr) {
- case CODEC_CMD_GET_THREAD_STATE:
+ switch (addr >> 2) {
+ case DEVICE_CMD_GET_THREAD_STATE:
qemu_mutex_lock(&s->context_queue_mutex);
if (s->irq_raised) {
ret = CODEC_TASK_END;
TRACE("get thread_state. ret: %d\n", ret);
break;
- case CODEC_CMD_GET_CTX_FROM_QUEUE:
+ case DEVICE_CMD_GET_CTX_FROM_QUEUE:
{
DeviceMemEntry *head = NULL;
}
break;
- case CODEC_CMD_GET_VERSION:
+ case DEVICE_CMD_GET_DEVICE_INFO:
+ // we have only version information for now...
ret = CODEC_VERSION;
TRACE("codec version: %d\n", ret);
break;
- case CODEC_CMD_GET_ELEMENT:
+ case DEVICE_CMD_GET_ELEMENT:
ret = brillcodec_query_list(s);
break;
- case CODEC_CMD_GET_CONTEXT_INDEX:
+ case DEVICE_CMD_GET_CONTEXT_INDEX:
ret = brillcodec_get_context_index(s);
TRACE("get context index: %d\n", ret);
break;
{
MaruBrillCodecState *s = (MaruBrillCodecState *)opaque;
- switch (addr) {
- case CODEC_CMD_API_INDEX:
+ switch (addr >> 2) {
+ case DEVICE_CMD_API_INDEX:
TRACE("set codec_cmd value: %d\n", value);
s->ioparam.api_index = value;
brillcodec_wakeup_threads(s, value);
break;
- case CODEC_CMD_CONTEXT_INDEX:
+ case DEVICE_CMD_CONTEXT_INDEX:
TRACE("set context_index value: %d\n", value);
s->ioparam.ctx_index = value;
break;
- case CODEC_CMD_DEVICE_MEM_OFFSET:
+ case DEVICE_CMD_DEVICE_MEM_OFFSET:
TRACE("set mem_offset value: 0x%x\n", value);
s->ioparam.mem_offset = value;
break;
- case CODEC_CMD_RELEASE_CONTEXT:
+ case DEVICE_CMD_RELEASE_CONTEXT:
{
int ctx_id = (int32_t)value;
}
break;
- case CODEC_CMD_GET_DATA_FROM_QUEUE:
+ case DEVICE_CMD_GET_DATA_FROM_QUEUE:
brillcodec_pop_writequeue(s, (uint32_t)value);
break;
.endianness = DEVICE_LITTLE_ENDIAN,
};
-#ifdef CONFIG_VAAPI
-static CodecPlugin *vaapi_probe(void) {
- // FIXME: probing...
- void *handle;
-
- handle = dlopen("brillcodec-vaapi.so", RTLD_NOW);
- if (!handle) {
- INFO("plugin load failed : %s\n", dlerror());
- return NULL;
- }
+#define NUM_PLUGINS 2
+static CodecPlugin *probe_plugin(void) {
+ CodecPlugin *plugins[NUM_PLUGINS] = { NULL, };
+ int i = 0;
- CodecPlugin *plugin = dlsym(handle, "vaapi_plugin");
+#if defined(CONFIG_VAAPI)
+ {
+ void *handle;
- return plugin;
-}
-#endif
-#ifdef CONFIG_DXVA2
-static CodecPlugin *dxva2_probe(void) {
- CodecPlugin *plugin = NULL;
+ handle = dlopen("brillcodec-vaapi.so", RTLD_NOW);
+ if (!handle) {
+ INFO("plugin load failed : %s\n", dlerror());
+ return NULL;
+ }
- plugin = &dxva_plugin;
+ plugins[i++] = dlsym(handle, "vaapi_plugin");
- return plugin;
-}
+ }
+#elif defined(CONFIG_DXVA2)
+ {
+ plugins[i++] = &dxva_plugin;
+ }
#endif
+ for (i = 0; i < NUM_PLUGINS; ++i) {
+ if (plugins[i] && plugins[i]->probe && plugins[i]->probe()) {
+ return plugins[i];
+ }
+ }
+
+ return NULL;
+}
static int brillcodec_initfn(PCIDevice *dev)
{
s->codec_bh = qemu_bh_new(brillcodec_bh_callback, s);
// register plugins
-#ifdef CONFIG_VAAPI
- if ((s->hwaccel_plugin = vaapi_probe())) {
+ if ((s->hwaccel_plugin = probe_plugin())) {
INFO("VA-API extension is enabled.\n");
}
-#endif
-#ifdef CONFIG_DXVA2
- if ((s->hwaccel_plugin = dxva2_probe())) {
- INFO("DXVA2 extension is enabled.\n");
- }
-#endif
return 0;
}