summaryrefslogtreecommitdiffstats
path: root/sec_mm/sec_omx/sec_codecs
diff options
context:
space:
mode:
Diffstat (limited to 'sec_mm/sec_omx/sec_codecs')
-rw-r--r--sec_mm/sec_omx/sec_codecs/video/mfc_c110/dec/src/SsbSipMfcDecAPI.c15
-rw-r--r--sec_mm/sec_omx/sec_codecs/video/mfc_c110/enc/src/SsbSipMfcEncAPI.c35
-rw-r--r--sec_mm/sec_omx/sec_codecs/video/mfc_c110/include/SsbSipMfcApi.h9
-rw-r--r--sec_mm/sec_omx/sec_codecs/video/mfc_c110/include/mfc_interface.h10
4 files changed, 63 insertions, 6 deletions
diff --git a/sec_mm/sec_omx/sec_codecs/video/mfc_c110/dec/src/SsbSipMfcDecAPI.c b/sec_mm/sec_omx/sec_codecs/video/mfc_c110/dec/src/SsbSipMfcDecAPI.c
index 19b63b0..8e47683 100644
--- a/sec_mm/sec_omx/sec_codecs/video/mfc_c110/dec/src/SsbSipMfcDecAPI.c
+++ b/sec_mm/sec_omx/sec_codecs/video/mfc_c110/dec/src/SsbSipMfcDecAPI.c
@@ -84,11 +84,13 @@ out:
return MFC_UNPACKED_PB;
}
-void *SsbSipMfcDecOpen(void)
+void *SsbSipMfcDecOpen(void *value)
{
int hMFCOpen;
unsigned int mapped_addr;
_MFCLIB *pCTX;
+ mfc_common_args DecArg;
+ int ret_code;
pCTX = (_MFCLIB *)malloc(sizeof(_MFCLIB));
if (pCTX == NULL) {
@@ -103,6 +105,17 @@ void *SsbSipMfcDecOpen(void)
return NULL;
}
+ if (*(unsigned int *)value == NO_CACHE ||
+ *(unsigned int *)value == CACHE) {
+ DecArg.args.buf_type = *(unsigned int *)value;
+ ret_code = ioctl(hMFCOpen, IOCTL_MFC_BUF_CACHE, &DecArg);
+ if (DecArg.ret_code != MFC_RET_OK) {
+ LOGE("SsbSipMfcDecOpenExt: IOCTL_MFC_BUF_CACHE (%d) failed\n", DecArg.ret_code);
+ }
+ } else {
+ LOGE("SsbSipMfcDecOpenExt: value is invalid, value: %d\n", *(int *)value);
+ }
+
mapped_addr = (unsigned int)mmap(0, MMAP_BUFFER_SIZE_MMAP, PROT_READ | PROT_WRITE, MAP_SHARED, hMFCOpen, 0);
if (!mapped_addr) {
LOGE("SsbSipMfcDecOpen: FIMV5.0 driver address mapping failed\n");
diff --git a/sec_mm/sec_omx/sec_codecs/video/mfc_c110/enc/src/SsbSipMfcEncAPI.c b/sec_mm/sec_omx/sec_codecs/video/mfc_c110/enc/src/SsbSipMfcEncAPI.c
index 9216c7b..b51a55f 100644
--- a/sec_mm/sec_omx/sec_codecs/video/mfc_c110/enc/src/SsbSipMfcEncAPI.c
+++ b/sec_mm/sec_omx/sec_codecs/video/mfc_c110/enc/src/SsbSipMfcEncAPI.c
@@ -30,11 +30,13 @@
#define _MFCLIB_MAGIC_NUMBER 0x92241001
-void *SsbSipMfcEncOpen(void)
+void *SsbSipMfcEncOpen(void *value)
{
int hMFCOpen;
_MFCLIB *pCTX;
unsigned int mapped_addr;
+ mfc_common_args EncArg;
+ int ret_code;
hMFCOpen = open(S5PC110_MFC_DEV_NAME, O_RDWR | O_NDELAY);
if (hMFCOpen < 0) {
@@ -49,6 +51,17 @@ void *SsbSipMfcEncOpen(void)
return NULL;
}
+ if (*(unsigned int *)value == NO_CACHE ||
+ *(unsigned int *)value == CACHE) {
+ EncArg.args.buf_type = *(unsigned int *)value;
+ ret_code = ioctl(hMFCOpen, IOCTL_MFC_BUF_CACHE, &EncArg);
+ if (EncArg.ret_code != MFC_RET_OK) {
+ LOGE("SsbSipMfcDecOpenExt: IOCTL_MFC_BUF_CACHE (%d) failed\n", EncArg.ret_code);
+ }
+ } else {
+ LOGE("SsbSipMfcDecOpenExt: value is invalid, value: %d\n", *(int *)value);
+ }
+
mapped_addr = (unsigned int)mmap(0, MMAP_BUFFER_SIZE_MMAP, PROT_READ | PROT_WRITE, MAP_SHARED, hMFCOpen, 0);
if (!mapped_addr) {
LOGE("SsbSipMfcEncOpen: FIMV5.0 driver address mapping failed\n");
@@ -374,6 +387,13 @@ SSBSIP_MFC_ERROR_CODE SsbSipMfcEncExe(void *openHandle)
EncArg.args.enc_exe.in_strm_st = (unsigned int)pCTX->phyStrmBuf;
EncArg.args.enc_exe.in_strm_end = (unsigned int)pCTX->phyStrmBuf + pCTX->sizeStrmBuf;
EncArg.args.enc_exe.in_frametag = pCTX->in_frametag;
+ if (pCTX->encode_cnt == 0) {
+ EncArg.args.enc_exe.in_strm_st = (unsigned int)pCTX->phyStrmBuf;
+ EncArg.args.enc_exe.in_strm_end = (unsigned int)pCTX->phyStrmBuf + pCTX->sizeStrmBuf;
+ } else {
+ EncArg.args.enc_exe.in_strm_st = (unsigned int)pCTX->phyStrmBuf + (MAX_ENCODER_OUTPUT_BUFFER_SIZE/2);
+ EncArg.args.enc_exe.in_strm_end = (unsigned int)pCTX->phyStrmBuf + (MAX_ENCODER_OUTPUT_BUFFER_SIZE/2) + pCTX->sizeStrmBuf;
+ }
ret_code = ioctl(pCTX->hMFC, IOCTL_MFC_ENC_EXE, &EncArg);
if (EncArg.ret_code != MFC_RET_OK) {
@@ -534,8 +554,17 @@ SSBSIP_MFC_ERROR_CODE SsbSipMfcEncGetOutBuf(void *openHandle, SSBSIP_MFC_ENC_OUT
output_info->headerSize = pCTX->encodedHeaderSize;
output_info->dataSize = pCTX->encodedDataSize;
- output_info->StrmPhyAddr = (void *)pCTX->phyStrmBuf;
- output_info->StrmVirAddr = (void *)pCTX->virStrmBuf;
+
+ if (pCTX->encode_cnt == 0) {
+ output_info->StrmPhyAddr = (void *)pCTX->phyStrmBuf;
+ output_info->StrmVirAddr = (void *)pCTX->virStrmBuf;
+ } else {
+ output_info->StrmPhyAddr = (unsigned char *)pCTX->phyStrmBuf + (MAX_ENCODER_OUTPUT_BUFFER_SIZE/2);
+ output_info->StrmVirAddr = (unsigned char *)pCTX->virStrmBuf + (MAX_ENCODER_OUTPUT_BUFFER_SIZE/2);
+ }
+
+ pCTX->encode_cnt ++;
+ pCTX->encode_cnt %= 2;
if (pCTX->encodedframeType == 0)
output_info->frameType = MFC_FRAME_TYPE_NOT_CODED;
diff --git a/sec_mm/sec_omx/sec_codecs/video/mfc_c110/include/SsbSipMfcApi.h b/sec_mm/sec_omx/sec_codecs/video/mfc_c110/include/SsbSipMfcApi.h
index a07739a..3c10390 100644
--- a/sec_mm/sec_omx/sec_codecs/video/mfc_c110/include/SsbSipMfcApi.h
+++ b/sec_mm/sec_omx/sec_codecs/video/mfc_c110/include/SsbSipMfcApi.h
@@ -61,6 +61,11 @@ typedef enum {
} SSBSIP_MFC_INSTRM_MODE_TYPE;
typedef enum {
+ NO_CACHE = 0,
+ CACHE = 1
+} SSBIP_MFC_BUFFER_TYPE;
+
+typedef enum {
MFC_DEC_SETCONF_POST_ENABLE = 1,
MFC_DEC_SETCONF_EXTRA_BUFFER_NUM,
MFC_DEC_SETCONF_DISPLAY_DELAY,
@@ -289,7 +294,7 @@ extern "C" {
/*--------------------------------------------------------------------------------*/
/* Decoding APIs */
/*--------------------------------------------------------------------------------*/
-void *SsbSipMfcDecOpen(void);
+void *SsbSipMfcDecOpen(void *value);
SSBSIP_MFC_ERROR_CODE SsbSipMfcDecInit(void *openHandle, SSBSIP_MFC_CODEC_TYPE codec_type, int Frameleng);
SSBSIP_MFC_ERROR_CODE SsbSipMfcDecExe(void *openHandle, int lengthBufFill);
SSBSIP_MFC_ERROR_CODE SsbSipMfcDecClose(void *openHandle);
@@ -305,7 +310,7 @@ SSBSIP_MFC_ERROR_CODE SsbSipMfcDecGetConfig(void *openHandle, SSBSIP_MFC_DEC_CON
/*--------------------------------------------------------------------------------*/
/* Encoding APIs */
/*--------------------------------------------------------------------------------*/
-void *SsbSipMfcEncOpen(void);
+void *SsbSipMfcEncOpen(void *value);
SSBSIP_MFC_ERROR_CODE SsbSipMfcEncInit(void *openHandle, void *param);
SSBSIP_MFC_ERROR_CODE SsbSipMfcEncExe(void *openHandle);
SSBSIP_MFC_ERROR_CODE SsbSipMfcEncClose(void *openHandle);
diff --git a/sec_mm/sec_omx/sec_codecs/video/mfc_c110/include/mfc_interface.h b/sec_mm/sec_omx/sec_codecs/video/mfc_c110/include/mfc_interface.h
index f4a1f42..466860d 100644
--- a/sec_mm/sec_omx/sec_codecs/video/mfc_c110/include/mfc_interface.h
+++ b/sec_mm/sec_omx/sec_codecs/video/mfc_c110/include/mfc_interface.h
@@ -31,6 +31,8 @@
#define IOCTL_MFC_SET_CONFIG 0x00800101
#define IOCTL_MFC_GET_CONFIG 0x00800102
+#define IOCTL_MFC_BUF_CACHE 0x00801000
+
/* MFC H/W support maximum 32 extra DPB */
#define MFC_MAX_EXTRA_DPB 5
@@ -283,6 +285,11 @@ typedef struct tag_mem_free_arg_t
unsigned int u_addr;
} mfc_mem_free_arg_t;
+typedef enum {
+ MFC_BUFFER_NO_CACHE = 0,
+ MFC_BUFFER_CACHE = 1
+} mfc_buffer_type;
+
typedef union {
mfc_enc_init_mpeg4_arg_t enc_init_mpeg4;
mfc_enc_init_h263_arg_t enc_init_h263;
@@ -298,6 +305,8 @@ typedef union {
mfc_mem_alloc_arg_t mem_alloc;
mfc_mem_free_arg_t mem_free;
mfc_get_phys_addr_arg_t get_phys_addr;
+
+ mfc_buffer_type buf_type;
} mfc_args;
typedef struct tag_mfc_args {
@@ -332,6 +341,7 @@ typedef struct {
int out_frametag_bottom;
unsigned int encoded_Y_paddr;
unsigned int encoded_C_paddr;
+ unsigned int encode_cnt;
} _MFCLIB;
#endif /* _MFC_INTERFACE_H_ */