Tizen 2.0 Release
[sdk/emulator/qemu.git] / tizen / src / hw / maru_codec.h
index 1cc00fe..fb74bda 100644 (file)
 #include "pci.h"
 #include "pci_ids.h"
 #include "tizen/src/debug_ch.h"
+#include "maru_pci_ids.h"
 
 #include <libavformat/avformat.h>
-#include <libswscale/swscale.h>
 
-// #define CODEC_HOST
+#define CODEC_MAX_CONTEXT   10
 
 /*
  *  Codec Device Structures
  */
 
 typedef struct _SVCodecParam {
-    uint32_t        func_num;
+    uint32_t        apiIndex;
+    uint32_t        ctxIndex;
     uint32_t        in_args[20];
     uint32_t        ret_args;
+    uint32_t        mmapOffset;
+       uint32_t                fileIndex;
 } SVCodecParam;
 
+typedef struct _SVCodecContext {
+    AVCodecContext          *pAVCtx;
+    AVFrame                 *pFrame;
+    AVCodecParserContext    *pParserCtx;
+    uint8_t                 *pParserBuffer;
+    bool                    bParser;
+    bool                    bUsed;
+       uint32_t                                nFileValue;
+} SVCodecContext;
 
 typedef struct _SVCodecState {
     PCIDevice           dev;
+    SVCodecContext      ctxArr[CODEC_MAX_CONTEXT];
     SVCodecParam        codecParam;
+    pthread_mutex_t     codec_mutex;
 
     int                 mmioIndex;
-
-    uint8_t*            vaddr;
-    ram_addr_t          vram_offset;
-
     uint32_t            mem_addr;
     uint32_t            mmio_addr;
 
-    int                 index;
+    uint8_t*            vaddr;
+    MemoryRegion        vram;
+    MemoryRegion        mmio;
 } SVCodecState;
 
 enum {
-    FUNC_NUM            = 0x00,
-    IN_ARGS             = 0x04,
-    RET_STR             = 0x08,
+    CODEC_API_INDEX         = 0x00,
+    CODEC_IN_PARAM          = 0x04,
+    CODEC_RETURN_VALUE      = 0x08,
+    CODEC_CONTEXT_INDEX     = 0x0c,
+    CODEC_MMAP_OFFSET       = 0x10,
+    CODEC_FILE_INDEX        = 0x14,
+    CODEC_CLOSED            = 0x18,
 };
 
 enum {
     EMUL_AV_REGISTER_ALL = 1,
-    EMUL_AVCODEC_OPEN,
-    EMUL_AVCODEC_CLOSE,
     EMUL_AVCODEC_ALLOC_CONTEXT,
     EMUL_AVCODEC_ALLOC_FRAME,
+    EMUL_AVCODEC_OPEN,
+    EMUL_AVCODEC_CLOSE,
     EMUL_AV_FREE_CONTEXT,
     EMUL_AV_FREE_FRAME,
     EMUL_AV_FREE_PALCTRL,
@@ -87,6 +103,8 @@ enum {
     EMUL_AVCODEC_FLUSH_BUFFERS,
     EMUL_AVCODEC_DECODE_VIDEO,
     EMUL_AVCODEC_ENCODE_VIDEO,
+    EMUL_AVCODEC_DECODE_AUDIO,
+    EMUL_AVCODEC_ENCODE_AUDIO,
     EMUL_AV_PICTURE_COPY,
     EMUL_AV_PARSER_INIT,
     EMUL_AV_PARSER_PARSE,
@@ -97,50 +115,61 @@ enum {
 /*
  *  Codec Device APIs
  */
-int pci_codec_init (PCIBus *bus);
-static int codec_operate(uint32_t value, SVCodecState *opaque);
+int codec_init (PCIBus *bus);
+
+uint64_t codec_read (void *opaque, target_phys_addr_t addr, unsigned size);
+
+void codec_write (void *opaque, target_phys_addr_t addr, uint64_t value, unsigned size);
+
+static int codec_operate(uint32_t apiIndex, uint32_t ctxIndex, SVCodecState *state);
 
 /*
- *  FFMPEG APIs
+ *  Codec Helper APIs
  */
+static void qemu_parser_init (SVCodecState *s, int ctxIndex);
 
-void qemu_parser_init (void);
+static void qemu_restore_context (AVCodecContext *dst, AVCodecContext *src);
+
+/*
+ *  FFMPEG APIs
+ */
 
-void qemu_restore_context (AVCodecContext *dst, AVCodecContext *src);
+static void qemu_av_register_all (void);
 
-void qemu_av_register_all (void);
+static int qemu_avcodec_open (SVCodecState *s, int ctxIndex);
 
-int qemu_avcodec_open (SVCodecState *s);
+static int qemu_avcodec_close (SVCodecState *s, int ctxIndex);
 
-int qemu_avcodec_close (SVCodecState *s);
+static void qemu_avcodec_alloc_context (SVCodecState *s);
 
-void qemu_avcodec_alloc_context (void);
+static void qemu_avcodec_alloc_frame (SVCodecState *s);
 
-void qemu_avcodec_alloc_frame (void);
+static void qemu_av_free_context (SVCodecState* s, int ctxIndex);
 
-void qemu_av_free_context (void);
+static void qemu_av_free_picture (SVCodecState* s, int ctxIndex);
 
-void qemu_av_free_picture (void);
+static void qemu_av_free_palctrl (SVCodecState* s, int ctxIndex);
 
-void qemu_av_free_palctrl (void);
+static void qemu_av_free_extradata (SVCodecState* s, int ctxIndex);
 
-void qemu_av_free_extradata (void);
+static void qemu_avcodec_flush_buffers (SVCodecState *s, int ctxIndex);
 
-void qemu_avcodec_flush_buffers (void);
+static int qemu_avcodec_decode_video (SVCodecState *s, int ctxIndex);
 
-int qemu_avcodec_decode_video (SVCodecState *s);
+static int qemu_avcodec_encode_video (SVCodecState *s, int ctxIndex);
 
-int qemu_avcodec_encode_video (SVCodecState *s);
+static int qemu_avcodec_decode_audio (SVCodecState *s, int ctxIndex);
 
-void qemu_av_picture_copy (SVCodecState *s);
+static int qemu_avcodec_encode_audio (SVCodecState *s, int ctxIndex);
 
-void qemu_av_parser_init (SVCodecState *s);
+static void qemu_av_picture_copy (SVCodecState *s, int ctxIndex);
 
-int qemu_av_parser_parse (SVCodecState *s);
+static void qemu_av_parser_init (SVCodecState *s, int ctxIndex);
 
-void qemu_av_parser_close (void);
+static int qemu_av_parser_parse (SVCodecState *s, int ctxIndex);
 
-int qemu_avcodec_get_buffer (AVCodecContext *context, AVFrame *picture);
+static void qemu_av_parser_close (SVCodecState *s, int ctxIndex);
 
-void qemu_avcodec_release_buffer (AVCodecContext *context, AVFrame *picture);
+static int qemu_avcodec_get_buffer (AVCodecContext *context, AVFrame *picture);
 
+static void qemu_avcodec_release_buffer (AVCodecContext *context, AVFrame *picture);