#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,
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,
/*
* 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);