From: SeokYeon Hwang Date: Sat, 13 Sep 2014 04:36:22 +0000 (+0900) Subject: brillcodec: re-arrange device command X-Git-Tag: Tizen_Studio_1.3_Release_p2.3.2~620^2~11^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c6a14a50341ae7af87473cf933e29c8b62e9a035;p=sdk%2Femulator%2Fqemu.git brillcodec: re-arrange device command Change-Id: I6175149ea1bddbfd0f4156121fc39e01e81d70d2 Signed-off-by: SeokYeon Hwang --- diff --git a/tizen/src/hw/pci/maru_brillcodec.c b/tizen/src/hw/pci/maru_brillcodec.c index f768878a84..d4e4579237 100644 --- a/tizen/src/hw/pci/maru_brillcodec.c +++ b/tizen/src/hw/pci/maru_brillcodec.c @@ -198,6 +198,8 @@ static void brillcodec_push_readqueue(MaruBrillCodecState *s, data_buf = brillcodec_store_inbuf((uint8_t *)s->vaddr, ioparam); break; case CODEC_PICTURE_COPY: + case CODEC_DEINIT: + case CODEC_FLUSH_BUFFERS: default: TRACE("no buffer from guest\n"); break; diff --git a/tizen/src/hw/pci/maru_brillcodec_device.c b/tizen/src/hw/pci/maru_brillcodec_device.c index 21ee8811c7..428525f513 100644 --- a/tizen/src/hw/pci/maru_brillcodec_device.c +++ b/tizen/src/hw/pci/maru_brillcodec_device.c @@ -57,17 +57,17 @@ MULTI_DEBUG_CHANNEL(qemu, brillcodec); 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 { @@ -145,8 +145,8 @@ static uint64_t brillcodec_read(void *opaque, 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; @@ -158,7 +158,7 @@ static uint64_t brillcodec_read(void *opaque, 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; @@ -178,16 +178,17 @@ static uint64_t brillcodec_read(void *opaque, } 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; @@ -204,24 +205,24 @@ static void brillcodec_write(void *opaque, hwaddr addr, { 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; @@ -234,7 +235,7 @@ static void brillcodec_write(void *opaque, hwaddr addr, } break; - case CODEC_CMD_GET_DATA_FROM_QUEUE: + case DEVICE_CMD_GET_DATA_FROM_QUEUE: brillcodec_pop_writequeue(s, (uint32_t)value); break; @@ -254,32 +255,38 @@ static const MemoryRegionOps brillcodec_mmio_ops = { .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) { @@ -309,16 +316,9 @@ 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; } diff --git a/tizen/src/hw/pci/maru_brillcodec_plugin.h b/tizen/src/hw/pci/maru_brillcodec_plugin.h index 5b49b24e61..70e15c247d 100644 --- a/tizen/src/hw/pci/maru_brillcodec_plugin.h +++ b/tizen/src/hw/pci/maru_brillcodec_plugin.h @@ -38,6 +38,7 @@ typedef struct CodecPlugin { enum PixelFormat pix_fmt; enum PixelFormat output_pix_fmt; + bool (*probe)(void); bool (*setup)(AVCodecContext *, int , int); int (*get_buffer)(struct AVCodecContext *, AVFrame *); void (*release_buffer)(struct AVCodecContext *, AVFrame *);