aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--avc-enc/psb_avc.cpp46
-rw-r--r--avc-enc/psb_avc.h2
-rw-r--r--h263-enc/psb_h263.cpp29
-rw-r--r--h263-enc/psb_h263.h2
-rw-r--r--m4v-enc/psb_m4v.cpp37
-rw-r--r--m4v-enc/psb_m4v.h2
-rw-r--r--psb-dec/psb.cpp34
-rw-r--r--psb-dec/psb.h2
-rw-r--r--sst/sst.cpp52
-rw-r--r--sst/sst.h2
-rw-r--r--videocodec/OMXComponentCodecBase.h2
-rw-r--r--videocodec/OMXVideoDecoderAVC.cpp40
-rw-r--r--videocodec/OMXVideoDecoderAVC.h3
-rw-r--r--videocodec/OMXVideoDecoderBase.cpp254
-rw-r--r--videocodec/OMXVideoDecoderBase.h20
-rw-r--r--videocodec/OMXVideoDecoderH263.cpp30
-rw-r--r--videocodec/OMXVideoDecoderH263.h3
-rw-r--r--videocodec/OMXVideoDecoderMPEG4.cpp29
-rw-r--r--videocodec/OMXVideoDecoderMPEG4.h3
-rw-r--r--videocodec/OMXVideoDecoderPAVC.cpp31
-rw-r--r--videocodec/OMXVideoDecoderPAVC.h3
-rw-r--r--videocodec/OMXVideoDecoderWMV.cpp32
-rw-r--r--videocodec/OMXVideoDecoderWMV.h3
23 files changed, 461 insertions, 200 deletions
diff --git a/avc-enc/psb_avc.cpp b/avc-enc/psb_avc.cpp
index 04a169f..0406fb6 100644
--- a/avc-enc/psb_avc.cpp
+++ b/avc-enc/psb_avc.cpp
@@ -1872,7 +1872,7 @@ OMX_ERRORTYPE MrstPsbComponent::ParserConfigData(OMX_U8* coded_buf,OMX_U32 coded
/* implement ComponentBase::ProcessorProcess */
OMX_ERRORTYPE MrstPsbComponent::ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retain,
OMX_U32 nr_buffers)
{
@@ -1889,10 +1889,10 @@ OMX_ERRORTYPE MrstPsbComponent::ProcessorProcess(
LOGV("%s(): <******avc******> enter encode\n", __func__);
- LOGV_IF(buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_EOS,
+ LOGV_IF((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_EOS,
"%s(),%d: got OMX_BUFFERFLAG_EOS\n", __func__, __LINE__);
- if (!buffers[INPORT_INDEX]->nFilledLen) {
+ if (!(*pBuffers[INPORT_INDEX])->nFilledLen) {
LOGV("%s(),%d: input buffer's nFilledLen is zero\n",
__func__, __LINE__);
goto out;
@@ -1902,20 +1902,20 @@ OMX_ERRORTYPE MrstPsbComponent::ProcessorProcess(
buffer_in.data_size = buffer_sharing_info[0].dataSize;
buffer_in.buffer_size = buffer_sharing_info[0].allocatedSize;
buffer_in.data =
- *(reinterpret_cast<uchar**>(buffers[INPORT_INDEX]->pBuffer + buffers[INPORT_INDEX]->nOffset));
+ *(reinterpret_cast<uchar**>((*pBuffers[INPORT_INDEX])->pBuffer + (*pBuffers[INPORT_INDEX])->nOffset));
} else {
buffer_in.data =
- buffers[INPORT_INDEX]->pBuffer + buffers[INPORT_INDEX]->nOffset;
- buffer_in.data_size = buffers[INPORT_INDEX]->nFilledLen;
- buffer_in.buffer_size = buffers[INPORT_INDEX]->nFilledLen;
+ (*pBuffers[INPORT_INDEX])->pBuffer + (*pBuffers[INPORT_INDEX])->nOffset;
+ buffer_in.data_size = (*pBuffers[INPORT_INDEX])->nFilledLen;
+ buffer_in.buffer_size = (*pBuffers[INPORT_INDEX])->nFilledLen;
}
LOGV("buffer_in.data=%x, data_size=%d, buffer_size=%d",
(unsigned)buffer_in.data, buffer_in.data_size, buffer_in.buffer_size);
- buffer_out.data = buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset;
+ buffer_out.data = (*pBuffers[OUTPORT_INDEX])->pBuffer +(*pBuffers[OUTPORT_INDEX])->nOffset;
buffer_out.data_size = 0;
- buffer_out.buffer_size = buffers[OUTPORT_INDEX]->nAllocLen - buffers[OUTPORT_INDEX]->nOffset;
+ buffer_out.buffer_size = (*pBuffers[OUTPORT_INDEX])->nAllocLen - (*pBuffers[OUTPORT_INDEX])->nOffset;
mixiovec_out[0] = &buffer_out;
normal_start:
@@ -1942,8 +1942,8 @@ normal_start:
/* encoder */
LOGV("in buffer = 0x%x ts = %lld",
- buffers[INPORT_INDEX]->pBuffer + buffers[INPORT_INDEX]->nOffset,
- buffers[INPORT_INDEX]->nTimeStamp);
+ (*pBuffers[INPORT_INDEX])->pBuffer + (*pBuffers[INPORT_INDEX])->nOffset,
+ (*pBuffers[INPORT_INDEX])->nTimeStamp);
switch(avcEncNaluFormatType) {
@@ -1955,7 +1955,7 @@ normal_start:
LOGV("%s(), mret = 0x%08x", __func__, mret);
LOGV("output data size = %d", mixiovec_out[0]->data_size);
- outtimestamp = buffers[INPORT_INDEX]->nTimeStamp;
+ outtimestamp = (*pBuffers[INPORT_INDEX])->nTimeStamp;
if (mret != MIX_RESULT_SUCCESS) {
LOGE("%s(), %d: exit, mix_video_encode failed (ret == 0x%08x)\n",
@@ -1986,7 +1986,7 @@ normal_start:
LOGV("%s(), mret = 0x%08x", __func__, mret);
LOGV("output data size = %d", mixiovec_out[0]->data_size);
- outtimestamp = buffers[INPORT_INDEX]->nTimeStamp;
+ outtimestamp = (*pBuffers[INPORT_INDEX])->nTimeStamp;
if (mret != MIX_RESULT_SUCCESS) {
LOGE("%s(), %d: exit, mix_video_encode failed (ret == 0x%08x)\n",
@@ -2022,8 +2022,8 @@ normal_start:
oret = OMX_ErrorUndefined;
goto out;
}
- if (buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset != config_data) {
- memcpy(buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset, config_data, config_len);
+ if ((*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset != config_data) {
+ memcpy((*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset, config_data, config_len);
}
// Separate SPS+PPS data from first IDR frame
video_len = mixiovec_out[0]->data_size - config_len;
@@ -2036,8 +2036,8 @@ normal_start:
}
else {
//send SPS+PPS+IDR frame data
- if (buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset != video_data) {
- memcpy(buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset, video_data,video_len);
+ if ((*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset != video_data) {
+ memcpy((*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset, video_data,video_len);
}
outfilledlen = video_len;
video_data = NULL;
@@ -2055,8 +2055,8 @@ normal_start:
outflags |= OMX_BUFFERFLAG_SYNCFRAME;
}
- if (buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset != video_data) {
- memcpy(buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset, video_data, video_len);
+ if ((*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset != video_data) {
+ memcpy((*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset, video_data, video_len);
}
video_data = NULL;
@@ -2114,14 +2114,14 @@ out:
}
LOGV("output buffers = %p:%d, flag = %x",
- buffers[OUTPORT_INDEX]->pBuffer,
+ (*pBuffers[OUTPORT_INDEX])->pBuffer,
outfilledlen,
outflags);
if(retain[OUTPORT_INDEX] != BUFFER_RETAIN_GETAGAIN) {
- buffers[OUTPORT_INDEX]->nFilledLen = outfilledlen;
- buffers[OUTPORT_INDEX]->nTimeStamp = outtimestamp;
- buffers[OUTPORT_INDEX]->nFlags = outflags;
+ (*pBuffers[OUTPORT_INDEX])->nFilledLen = outfilledlen;
+ (*pBuffers[OUTPORT_INDEX])->nTimeStamp = outtimestamp;
+ (*pBuffers[OUTPORT_INDEX])->nFlags = outflags;
}
if (retain[INPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN ||
diff --git a/avc-enc/psb_avc.h b/avc-enc/psb_avc.h
index 5845858..e55062d 100644
--- a/avc-enc/psb_avc.h
+++ b/avc-enc/psb_avc.h
@@ -101,7 +101,7 @@ private:
virtual OMX_ERRORTYPE ProcessorPause(void); /* Executing to Pause */
virtual OMX_ERRORTYPE ProcessorResume(void);/* Pause to Executing */
virtual OMX_ERRORTYPE ProcessorFlush(OMX_U32 port_index);
- virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE **buffers,
+ virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retain,
OMX_U32 nr_buffers);
diff --git a/h263-enc/psb_h263.cpp b/h263-enc/psb_h263.cpp
index d227602..6ca7ca7 100644
--- a/h263-enc/psb_h263.cpp
+++ b/h263-enc/psb_h263.cpp
@@ -1167,7 +1167,7 @@ OMX_ERRORTYPE MrstPsbComponent::ProcessorResume(void)
/* implement ComponentBase::ProcessorProcess */
OMX_ERRORTYPE MrstPsbComponent::ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retain,
OMX_U32 nr_buffers)
{
@@ -1175,16 +1175,15 @@ OMX_ERRORTYPE MrstPsbComponent::ProcessorProcess(
OMX_U32 outfilledlen = 0;
OMX_S64 outtimestamp = 0;
OMX_U32 outflags = 0;
-
OMX_ERRORTYPE oret = OMX_ErrorNone;
MIX_RESULT mret;
LOGV("%s(): enter encode\n", __func__);
- LOGV_IF(buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_EOS,
+ LOGV_IF((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_EOS,
"%s(),%d: got OMX_BUFFERFLAG_EOS\n", __func__, __LINE__);
- if (!buffers[INPORT_INDEX]->nFilledLen) {
+ if (!(*pBuffers[INPORT_INDEX])->nFilledLen) {
LOGE("%s(),%d: input buffer's nFilledLen is zero\n",
__func__, __LINE__);
goto out;
@@ -1193,22 +1192,20 @@ OMX_ERRORTYPE MrstPsbComponent::ProcessorProcess(
if (buffer_sharing_state != BUFFER_SHARING_INVALID) {
buffer_in.data_size = buffer_sharing_info[0].dataSize;
buffer_in.buffer_size = buffer_sharing_info[0].allocatedSize;
- buffer_in.data =
- *(reinterpret_cast<uchar**>(buffers[INPORT_INDEX]->pBuffer + buffers[INPORT_INDEX]->nOffset));
+ buffer_in.data = *(reinterpret_cast<uchar**>((*pBuffers[INPORT_INDEX])->pBuffer + (*pBuffers[INPORT_INDEX])->nOffset));
} else {
- buffer_in.data =
- buffers[INPORT_INDEX]->pBuffer + buffers[INPORT_INDEX]->nOffset;
- buffer_in.data_size = buffers[INPORT_INDEX]->nFilledLen;
- buffer_in.buffer_size = buffers[INPORT_INDEX]->nFilledLen;
+ buffer_in.data = (*pBuffers[INPORT_INDEX])->pBuffer + (*pBuffers[INPORT_INDEX])->nOffset;
+ buffer_in.data_size = (*pBuffers[INPORT_INDEX])->nFilledLen;
+ buffer_in.buffer_size = (*pBuffers[INPORT_INDEX])->nFilledLen;
}
LOGV("buffer_in.data=%x, data_size=%d, buffer_size=%d",
(unsigned)buffer_in.data, buffer_in.data_size, buffer_in.buffer_size);
buffer_out.data =
- buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset;
+ (*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset;
buffer_out.data_size = 0;
- buffer_out.buffer_size = buffers[OUTPORT_INDEX]->nAllocLen - buffers[OUTPORT_INDEX]->nOffset;
+ buffer_out.buffer_size = (*pBuffers[OUTPORT_INDEX])->nAllocLen - (*pBuffers[OUTPORT_INDEX])->nOffset;
mixiovec_out[0] = &buffer_out;
normal_start:
@@ -1248,7 +1245,7 @@ normal_start:
}
outfilledlen = mixiovec_out[0]->data_size;
- outtimestamp = buffers[INPORT_INDEX]->nTimeStamp;
+ outtimestamp = (*pBuffers[INPORT_INDEX])->nTimeStamp;
outflags |= OMX_BUFFERFLAG_ENDOFFRAME;
int32 width;
@@ -1308,9 +1305,9 @@ out:
}
if(retain[OUTPORT_INDEX] != BUFFER_RETAIN_GETAGAIN) {
- buffers[OUTPORT_INDEX]->nFilledLen = outfilledlen;
- buffers[OUTPORT_INDEX]->nTimeStamp = outtimestamp;
- buffers[OUTPORT_INDEX]->nFlags = outflags;
+ (*pBuffers[OUTPORT_INDEX])->nFilledLen = outfilledlen;
+ (*pBuffers[OUTPORT_INDEX])->nTimeStamp = outtimestamp;
+ (*pBuffers[OUTPORT_INDEX])->nFlags = outflags;
LOGV("********** output buffer: len=%d, ts=%ld, flags=%x",
outfilledlen,
diff --git a/h263-enc/psb_h263.h b/h263-enc/psb_h263.h
index 0a0071b..e9cc627 100644
--- a/h263-enc/psb_h263.h
+++ b/h263-enc/psb_h263.h
@@ -80,7 +80,7 @@ private:
virtual OMX_ERRORTYPE ProcessorPause(void); /* Executing to Pause */
virtual OMX_ERRORTYPE ProcessorResume(void);/* Pause to Executing */
virtual OMX_ERRORTYPE ProcessorFlush(OMX_U32 port_index);
- virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE **buffers,
+ virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retain,
OMX_U32 nr_buffers);
diff --git a/m4v-enc/psb_m4v.cpp b/m4v-enc/psb_m4v.cpp
index 7bf4456..e3299d9 100644
--- a/m4v-enc/psb_m4v.cpp
+++ b/m4v-enc/psb_m4v.cpp
@@ -1337,7 +1337,7 @@ OMX_ERRORTYPE MrstPsbComponent::ParserConfigData(OMX_U8* coded_buf, OMX_U32 code
/* implement ComponentBase::ProcessorProcess */
OMX_ERRORTYPE MrstPsbComponent::ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retain,
OMX_U32 nr_buffers)
{
@@ -1353,10 +1353,10 @@ OMX_ERRORTYPE MrstPsbComponent::ProcessorProcess(
LOGV("%s(): enter encode\n", __func__);
- LOGV_IF(buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_EOS,
+ LOGV_IF((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_EOS,
"%s(),%d: got OMX_BUFFERFLAG_EOS\n", __func__, __LINE__);
- if (!buffers[INPORT_INDEX]->nFilledLen) {
+ if (!(*pBuffers[INPORT_INDEX])->nFilledLen) {
LOGV("%s(),%d: input buffer's nFilledLen is zero\n",
__func__, __LINE__);
goto out;
@@ -1365,22 +1365,19 @@ OMX_ERRORTYPE MrstPsbComponent::ProcessorProcess(
if (buffer_sharing_state != BUFFER_SHARING_INVALID) {
buffer_in.data_size = buffer_sharing_info[0].dataSize;
buffer_in.buffer_size = buffer_sharing_info[0].allocatedSize;
- buffer_in.data =
- *(reinterpret_cast<uchar**>(buffers[INPORT_INDEX]->pBuffer + buffers[INPORT_INDEX]->nOffset));
+ buffer_in.data = *(reinterpret_cast<uchar**>((*pBuffers[INPORT_INDEX])->pBuffer + (*pBuffers[INPORT_INDEX])->nOffset));
} else {
- buffer_in.data =
- buffers[INPORT_INDEX]->pBuffer + buffers[INPORT_INDEX]->nOffset;
- buffer_in.data_size = buffers[INPORT_INDEX]->nFilledLen;
- buffer_in.buffer_size = buffers[INPORT_INDEX]->nFilledLen;
+ buffer_in.data = (*pBuffers[INPORT_INDEX])->pBuffer + (*pBuffers[INPORT_INDEX])->nOffset;
+ buffer_in.data_size = (*pBuffers[INPORT_INDEX])->nFilledLen;
+ buffer_in.buffer_size = (*pBuffers[INPORT_INDEX])->nFilledLen;
}
LOGV("buffer_in.data=%x, data_size=%d, buffer_size=%d",
(unsigned)buffer_in.data, buffer_in.data_size, buffer_in.buffer_size);
- buffer_out.data =
- buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset;
+ buffer_out.data = (*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset;
buffer_out.data_size = 0;
- buffer_out.buffer_size = buffers[OUTPORT_INDEX]->nAllocLen - buffers[OUTPORT_INDEX]->nOffset;
+ buffer_out.buffer_size = (*pBuffers[OUTPORT_INDEX])->nAllocLen - (*pBuffers[OUTPORT_INDEX])->nOffset;
mixiovec_out[0] = &buffer_out;
nomal_start:
@@ -1415,7 +1412,7 @@ nomal_start:
LOGV("%s(), mret = 0x%08x", __func__, mret);
LOGV("output data size = %d", mixiovec_out[0]->data_size);
- outtimestamp = buffers[INPORT_INDEX]->nTimeStamp;
+ outtimestamp = (*pBuffers[INPORT_INDEX])->nTimeStamp;
if (mret != MIX_RESULT_SUCCESS) {
LOGE("%s(), %d: exit, mix_video_encode failed (ret == 0x%08x)\n",
@@ -1451,8 +1448,8 @@ nomal_start:
oret = OMX_ErrorUndefined;
goto out;
}
- if(buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset != config_data) {
- memcpy(buffers[OUTPORT_INDEX]->pBuffer+buffers[OUTPORT_INDEX]->nOffset,config_data,config_len);
+ if((*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset != config_data) {
+ memcpy((*pBuffers[OUTPORT_INDEX])->pBuffer+(*pBuffers[OUTPORT_INDEX])->nOffset,config_data,config_len);
}
}
else {
@@ -1474,8 +1471,8 @@ nomal_start:
if(DetectSyncFrame(video_data)) {
outflags |= OMX_BUFFERFLAG_SYNCFRAME;
}
- if(buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset != video_data) {
- memcpy(buffers[OUTPORT_INDEX]->pBuffer+buffers[OUTPORT_INDEX]->nOffset,video_data,video_len);
+ if((*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset != video_data) {
+ memcpy((*pBuffers[OUTPORT_INDEX])->pBuffer+(*pBuffers[OUTPORT_INDEX])->nOffset,video_data,video_len);
}
video_data = NULL;
video_len = 0;
@@ -1525,9 +1522,9 @@ out:
}
if(retain[OUTPORT_INDEX] != BUFFER_RETAIN_GETAGAIN) {
- buffers[OUTPORT_INDEX]->nFilledLen = outfilledlen;
- buffers[OUTPORT_INDEX]->nTimeStamp = outtimestamp;
- buffers[OUTPORT_INDEX]->nFlags = outflags;
+ (*pBuffers[OUTPORT_INDEX])->nFilledLen = outfilledlen;
+ (*pBuffers[OUTPORT_INDEX])->nTimeStamp = outtimestamp;
+ (*pBuffers[OUTPORT_INDEX])->nFlags = outflags;
}
if (retain[INPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN ||
diff --git a/m4v-enc/psb_m4v.h b/m4v-enc/psb_m4v.h
index 1633a55..3018f3b 100644
--- a/m4v-enc/psb_m4v.h
+++ b/m4v-enc/psb_m4v.h
@@ -92,7 +92,7 @@ private:
virtual OMX_ERRORTYPE ProcessorPause(void); /* Executing to Pause */
virtual OMX_ERRORTYPE ProcessorResume(void);/* Pause to Executing */
virtual OMX_ERRORTYPE ProcessorFlush(OMX_U32 port_index);
- virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE **buffers,
+ virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retain,
OMX_U32 nr_buffers);
diff --git a/psb-dec/psb.cpp b/psb-dec/psb.cpp
index 1fb31ae..0712f4c 100644
--- a/psb-dec/psb.cpp
+++ b/psb-dec/psb.cpp
@@ -2176,7 +2176,7 @@ OMX_ERRORTYPE MrstPsbComponent::ProcessorResume(void)
/* implement ComponentBase::ProcessorProcess */
OMX_ERRORTYPE MrstPsbComponent::ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retain,
OMX_U32 nr_buffers)
{
@@ -2191,27 +2191,27 @@ OMX_ERRORTYPE MrstPsbComponent::ProcessorProcess(
VABuffer *vaBuf;
int retry_decode_count;
- LOGV_IF(buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_EOS,
+ LOGV_IF((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_EOS,
"%s(),%d: got OMX_BUFFERFLAG_EOS\n", __func__, __LINE__);
- if (!buffers[INPORT_INDEX]->nFilledLen) {
+ if (!(*pBuffers[INPORT_INDEX])->nFilledLen) {
LOGV("%s(),%d: input buffer's nFilledLen is zero\n",
__func__, __LINE__);
goto out;
}
buffer_in.data =
- buffers[INPORT_INDEX]->pBuffer + buffers[INPORT_INDEX]->nOffset;
- buffer_in.data_size = buffers[INPORT_INDEX]->nFilledLen;
- buffer_in.buffer_size = buffers[INPORT_INDEX]->nFilledLen;
+ (*pBuffers[INPORT_INDEX])->pBuffer + (*pBuffers[INPORT_INDEX])->nOffset;
+ buffer_in.data_size = (*pBuffers[INPORT_INDEX])->nFilledLen;
+ buffer_in.buffer_size = (*pBuffers[INPORT_INDEX])->nFilledLen;
LOGV("buffer_in.data=%x, data_size=%d, buffer_size=%d",
(unsigned)buffer_in.data, buffer_in.data_size, buffer_in.buffer_size);
buffer_out.data =
- buffers[OUTPORT_INDEX]->pBuffer + buffers[OUTPORT_INDEX]->nOffset;
+ (*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset;
buffer_out.data_size = 0;
- buffer_out.buffer_size = buffers[OUTPORT_INDEX]->nAllocLen - buffers[OUTPORT_INDEX]->nOffset;
+ buffer_out.buffer_size = (*pBuffers[OUTPORT_INDEX])->nAllocLen - (*pBuffers[OUTPORT_INDEX])->nOffset;
mixiovec_out[0] = &buffer_out;
@@ -2276,9 +2276,9 @@ OMX_ERRORTYPE MrstPsbComponent::ProcessorProcess(
outflags |= OMX_BUFFERFLAG_ENDOFFRAME;
retain[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN;
- buffers[OUTPORT_INDEX]->nFilledLen = outfilledlen;
- buffers[OUTPORT_INDEX]->nTimeStamp = outtimestamp;
- buffers[OUTPORT_INDEX]->nFlags = outflags;
+ (*pBuffers[OUTPORT_INDEX])->nFilledLen = outfilledlen;
+ (*pBuffers[OUTPORT_INDEX])->nTimeStamp = outtimestamp;
+ (*pBuffers[OUTPORT_INDEX])->nFlags = outflags;
outframe_counter++;
@@ -2358,8 +2358,8 @@ normal_start:
}
/* only in case of decode mode */
- if ((buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_ENDOFFRAME) &&
- (buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
+ if (((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_ENDOFFRAME) &&
+ ((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
if (coding_type == OMX_VIDEO_CodingAVC) {
if (inframe_counter == 0) {
@@ -2484,7 +2484,7 @@ normal_start:
MixVideoFrame *frame;
/* set timestamp */
- outtimestamp = buffers[INPORT_INDEX]->nTimeStamp;
+ outtimestamp = (*pBuffers[INPORT_INDEX])->nTimeStamp;
mix_videodecodeparams_set_timestamp(MIX_VIDEODECODEPARAMS(mvp),
outtimestamp);
@@ -2717,9 +2717,9 @@ out:
}
if(retain[OUTPORT_INDEX] != BUFFER_RETAIN_GETAGAIN) {
- buffers[OUTPORT_INDEX]->nFilledLen = outfilledlen;
- buffers[OUTPORT_INDEX]->nTimeStamp = outtimestamp;
- buffers[OUTPORT_INDEX]->nFlags = outflags;
+ (*pBuffers[OUTPORT_INDEX])->nFilledLen = outfilledlen;
+ (*pBuffers[OUTPORT_INDEX])->nTimeStamp = outtimestamp;
+ (*pBuffers[OUTPORT_INDEX])->nFlags = outflags;
}
if (retain[INPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN ||
diff --git a/psb-dec/psb.h b/psb-dec/psb.h
index b36b5cf..a21b7d7 100644
--- a/psb-dec/psb.h
+++ b/psb-dec/psb.h
@@ -72,7 +72,7 @@ private:
virtual OMX_ERRORTYPE ProcessorPause(void); /* Executing to Pause */
virtual OMX_ERRORTYPE ProcessorResume(void);/* Pause to Executing */
virtual OMX_ERRORTYPE ProcessorFlush(OMX_U32 port_index);
- virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE **buffers,
+ virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retain,
OMX_U32 nr_buffers);
diff --git a/sst/sst.cpp b/sst/sst.cpp
index 7415246..9134c8c 100644
--- a/sst/sst.cpp
+++ b/sst/sst.cpp
@@ -1076,7 +1076,7 @@ OMX_ERRORTYPE MrstSstComponent::ProcessorResume(void)
/* implement ComponentBase::ProcessorProcess */
OMX_ERRORTYPE MrstSstComponent::ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retain,
OMX_U32 nr_buffers)
{
@@ -1095,34 +1095,34 @@ OMX_ERRORTYPE MrstSstComponent::ProcessorProcess(
LOGV("%s(): enter\n", __func__);
#if !LOG_NDEBUG
- DumpBuffer(buffers[INPORT_INDEX], false);
+ DumpBuffer(*pBuffers[INPORT_INDEX], false);
#endif
- LOGV_IF(buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_EOS,
+ LOGV_IF((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_EOS,
"%s(),%d: got OMX_BUFFERFLAG_EOS\n", __func__, __LINE__);
- if (!buffers[INPORT_INDEX]->nFilledLen) {
+ if (!(*pBuffers[INPORT_INDEX])->nFilledLen) {
LOGV("%s(),%d: exit, input buffer's nFilledLen is zero (ret = void)\n",
__func__, __LINE__);
goto out;
}
- mixio_in->data = buffers[INPORT_INDEX]->pBuffer +
- buffers[INPORT_INDEX]->nOffset;
- mixio_in->data_size = buffers[INPORT_INDEX]->nFilledLen;
- mixio_in->buffer_size = buffers[INPORT_INDEX]->nAllocLen;
+ mixio_in->data = (*pBuffers[INPORT_INDEX])->pBuffer +
+ (*pBuffers[INPORT_INDEX])->nOffset;
+ mixio_in->data_size = (*pBuffers[INPORT_INDEX])->nFilledLen;
+ mixio_in->buffer_size = (*pBuffers[INPORT_INDEX])->nAllocLen;
- mixio_out->data = buffers[OUTPORT_INDEX]->pBuffer +
- buffers[OUTPORT_INDEX]->nOffset;
+ mixio_out->data = (*pBuffers[OUTPORT_INDEX])->pBuffer +
+ (*pBuffers[OUTPORT_INDEX])->nOffset;
mixio_out->data_size = 0;
- mixio_out->buffer_size = buffers[OUTPORT_INDEX]->nAllocLen;
+ mixio_out->buffer_size = (*pBuffers[OUTPORT_INDEX])->nAllocLen;
if (codec_mode == MIX_CODING_DECODE) {
if (((coding_type == OMX_AUDIO_CodingMP3) &&
- (buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_SYNCFRAME))
+ ((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_SYNCFRAME))
||
((coding_type == OMX_AUDIO_CodingAAC) &&
- (buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_CODECCONFIG))) {
+ ((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_CODECCONFIG))) {
oret = ChangeAcpWithConfigHeader(mixio_in->data,
&acp_changed);
@@ -1172,7 +1172,7 @@ OMX_ERRORTYPE MrstSstComponent::ProcessorProcess(
if (coding_type == OMX_AUDIO_CodingAAC) {
#if TEST_USE_AAC_ENCODING_RAW
if (codecdata) {
- memcpy(buffers[OUTPORT_INDEX]->pBuffer, codecdata, 2);
+ memcpy((*pBuffers[OUTPORT_INDEX])->pBuffer, codecdata, 2);
free(codecdata);
codecdata = NULL;
@@ -1212,7 +1212,7 @@ OMX_ERRORTYPE MrstSstComponent::ProcessorProcess(
}
if (codec_mode == MIX_CODING_DECODE) {
- if (buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
+ if ((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
retain[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN;
goto out;
}
@@ -1257,8 +1257,8 @@ OMX_ERRORTYPE MrstSstComponent::ProcessorProcess(
outfilledlen = produced;
LOGV("%s(): %lu bytes produced\n", __func__, outfilledlen);
- buffers[INPORT_INDEX]->nFilledLen -= (OMX_U32)consumed;
- if (buffers[INPORT_INDEX]->nFilledLen) {
+ (*pBuffers[INPORT_INDEX])->nFilledLen -= (OMX_U32)consumed;
+ if ((*pBuffers[INPORT_INDEX])->nFilledLen) {
LOGV("%s(): input buffer NOT fully consumed %lu bytes consumed\n",
__func__, (OMX_U32)consumed);
@@ -1268,29 +1268,29 @@ OMX_ERRORTYPE MrstSstComponent::ProcessorProcess(
}
LOGV("%s(): %lu bytes remained, waits for next turn\n",
- __func__, buffers[INPORT_INDEX]->nFilledLen);
+ __func__, (*pBuffers[INPORT_INDEX])->nFilledLen);
- buffers[INPORT_INDEX]->nOffset += (OMX_U32)consumed;
+ (*pBuffers[INPORT_INDEX])->nOffset += (OMX_U32)consumed;
retain[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN;
/* FIXME */
- outtimestamp = buffers[INPORT_INDEX]->nTimeStamp;
+ outtimestamp = (*pBuffers[INPORT_INDEX])->nTimeStamp;
}
else {
- buffers[INPORT_INDEX]->nOffset = 0;
- outtimestamp = buffers[INPORT_INDEX]->nTimeStamp;
+ (*pBuffers[INPORT_INDEX])->nOffset = 0;
+ outtimestamp = (*pBuffers[INPORT_INDEX])->nTimeStamp;
LOGV("%s(): %lu bytes fully consumed\n", __func__,
(OMX_U32)consumed);
}
out:
- buffers[OUTPORT_INDEX]->nFilledLen = outfilledlen;
- buffers[OUTPORT_INDEX]->nTimeStamp = outtimestamp;
- buffers[OUTPORT_INDEX]->nFlags = outflags;
+ (*pBuffers[OUTPORT_INDEX])->nFilledLen = outfilledlen;
+ (*pBuffers[OUTPORT_INDEX])->nTimeStamp = outtimestamp;
+ (*pBuffers[OUTPORT_INDEX])->nFlags = outflags;
#if !LOG_NDEBUG
if (retain[OUTPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN)
- DumpBuffer(buffers[OUTPORT_INDEX], false);
+ DumpBuffer(*pBuffers[OUTPORT_INDEX], false);
#endif
LOGV("%s(),%d: exit, done\n", __func__, __LINE__);
diff --git a/sst/sst.h b/sst/sst.h
index fad13e6..26952cf 100644
--- a/sst/sst.h
+++ b/sst/sst.h
@@ -92,7 +92,7 @@ private:
virtual OMX_ERRORTYPE ProcessorStop(void); /* Executing/Pause to Idle */
virtual OMX_ERRORTYPE ProcessorPause(void); /* Executing to Pause */
virtual OMX_ERRORTYPE ProcessorResume(void);/* Pause to Executing */
- virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE **buffers,
+ virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retain,
OMX_U32 nr_buffers);
diff --git a/videocodec/OMXComponentCodecBase.h b/videocodec/OMXComponentCodecBase.h
index 7d9e0e8..81b7daf 100644
--- a/videocodec/OMXComponentCodecBase.h
+++ b/videocodec/OMXComponentCodecBase.h
@@ -30,6 +30,8 @@
#include <componentbase.h>
#include "OMXComponentDefines.h"
+#include <media/stagefright/HardwareAPI.h>
+
diff --git a/videocodec/OMXVideoDecoderAVC.cpp b/videocodec/OMXVideoDecoderAVC.cpp
index 7bec5af..7f22974 100644
--- a/videocodec/OMXVideoDecoderAVC.cpp
+++ b/videocodec/OMXVideoDecoderAVC.cpp
@@ -20,6 +20,7 @@
#include <utils/Log.h>
#include "OMXVideoDecoderAVC.h"
+
// Be sure to have an equal string in VideoDecoderHost.cpp (libmix)
static const char* AVC_MIME_TYPE = "video/h264";
#define INVALID_PTS (OMX_S64)-1
@@ -89,11 +90,11 @@ OMX_ERRORTYPE OMXVideoDecoderAVC::ProcessorFlush(OMX_U32 portIndex) {
}
OMX_ERRORTYPE OMXVideoDecoderAVC::ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retains,
OMX_U32 numberBuffers) {
- return OMXVideoDecoderBase::ProcessorProcess(buffers, retains, numberBuffers);
+ return OMXVideoDecoderBase::ProcessorProcess(pBuffers, retains, numberBuffers);
}
OMX_ERRORTYPE OMXVideoDecoderAVC::PrepareConfigBuffer(VideoConfigBuffer *p) {
@@ -112,8 +113,12 @@ OMX_ERRORTYPE OMXVideoDecoderAVC::PrepareConfigBuffer(VideoConfigBuffer *p) {
p->width = mDecodeSettings.nMaxWidth;
p->height = mDecodeSettings.nMaxHeight;
p->profile = VAProfileH264ConstrainedBaseline;
- p->surfaceNumber = mDecodeSettings.nMaxNumberOfReferenceFrame + EXTRA_REFERENCE_FRAME;
- p->flag = WANT_ERROR_CONCEALMENT | WANT_LOW_DELAY | HAS_SURFACE_NUMBER | HAS_VA_PROFILE;
+ if(!(p->flag & USE_NATIVE_GRAPHIC_BUFFER)) {
+ p->surfaceNumber = mDecodeSettings.nMaxNumberOfReferenceFrame + EXTRA_REFERENCE_FRAME;
+ p->flag = WANT_ERROR_CONCEALMENT | WANT_LOW_DELAY | HAS_SURFACE_NUMBER | HAS_VA_PROFILE;
+ } else {
+ p->flag |= WANT_ERROR_CONCEALMENT | WANT_LOW_DELAY | HAS_SURFACE_NUMBER | HAS_VA_PROFILE;
+ }
return OMX_ErrorNone;
}
@@ -218,6 +223,7 @@ OMX_ERRORTYPE OMXVideoDecoderAVC::BuildHandlerList(void) {
OMXVideoDecoderBase::BuildHandlerList();
AddHandler(OMX_IndexParamVideoAvc, GetParamVideoAvc, SetParamVideoAvc);
AddHandler((OMX_INDEXTYPE)OMX_IndexParamIntelAVCDecodeSettings, GetParamIntelAVCDecodeSettings, SetParamIntelAVCDecodeSettings);
+ AddHandler(static_cast<OMX_INDEXTYPE>(OMX_IndexExtEnableNativeBuffer),GetNativeBufferMode,SetNativeBufferMode);
return OMX_ErrorNone;
}
@@ -268,5 +274,31 @@ OMX_ERRORTYPE OMXVideoDecoderAVC::SetParamIntelAVCDecodeSettings(OMX_PTR pStruct
return OMX_ErrorNone;
}
+OMX_ERRORTYPE OMXVideoDecoderAVC::GetNativeBufferMode(OMX_PTR pStructure) {
+ OMX_ERRORTYPE ret;
+ return OMX_ErrorNone; //would not be here
+}
+
+#define MAX_OUTPUT_BUFFER_COUNT_FOR_AVC 16+1+6
+OMX_ERRORTYPE OMXVideoDecoderAVC::SetNativeBufferMode(OMX_PTR pStructure) {
+ OMX_ERRORTYPE ret;
+
+ //CHECK_TYPE_HEADER(param);
+ CHECK_SET_PARAM_STATE();
+ mNativeBufferMode = true;
+ PortVideo *port = NULL;
+ port = static_cast<PortVideo *>(this->ports[OUTPORT_INDEX]);
+
+ OMX_PARAM_PORTDEFINITIONTYPE port_def;
+ memcpy(&port_def,port->GetPortDefinition(),sizeof(port_def));
+ port_def.nBufferCountMin = 1;
+ port_def.nBufferCountActual = MAX_OUTPUT_BUFFER_COUNT_FOR_AVC;
+ port_def.format.video.cMIMEType = (OMX_STRING)VA_VED_RAW_MIME_TYPE;
+ port_def.format.video.eColorFormat = static_cast<OMX_COLOR_FORMATTYPE>(VA_VED_COLOR_FORMAT);
+ port->SetPortDefinition(&port_def,true);
+
+ return OMX_ErrorNone;
+}
+
DECLARE_OMX_COMPONENT("OMX.Intel.VideoDecoder.AVC", "video_decoder.avc", OMXVideoDecoderAVC);
diff --git a/videocodec/OMXVideoDecoderAVC.h b/videocodec/OMXVideoDecoderAVC.h
index 832449c..90d5f93 100644
--- a/videocodec/OMXVideoDecoderAVC.h
+++ b/videocodec/OMXVideoDecoderAVC.h
@@ -31,7 +31,7 @@ protected:
virtual OMX_ERRORTYPE ProcessorDeinit(void);
virtual OMX_ERRORTYPE ProcessorFlush(OMX_U32 portIndex);
virtual OMX_ERRORTYPE ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retains,
OMX_U32 numberBuffers);
@@ -41,6 +41,7 @@ protected:
virtual OMX_ERRORTYPE BuildHandlerList(void);
DECLARE_HANDLER(OMXVideoDecoderAVC, ParamVideoAvc);
DECLARE_HANDLER(OMXVideoDecoderAVC, ParamIntelAVCDecodeSettings);
+ DECLARE_HANDLER(OMXVideoDecoderAVC,NativeBufferMode);
private:
inline OMX_ERRORTYPE AccumulateBuffer(OMX_BUFFERHEADERTYPE *buffer);
diff --git a/videocodec/OMXVideoDecoderBase.cpp b/videocodec/OMXVideoDecoderBase.cpp
index 0023766..a38d886 100644
--- a/videocodec/OMXVideoDecoderBase.cpp
+++ b/videocodec/OMXVideoDecoderBase.cpp
@@ -14,25 +14,26 @@
* limitations under the License.
*/
-#define LOG_NDEBUG 0
+//#define LOG_NDEBUG 0
#define LOG_TAG "OMXVideoDecoderBase"
#include <utils/Log.h>
#include "OMXVideoDecoderBase.h"
-#include <va/va.h>
#include <va/va_android.h>
-#include <va/vabuffer.h>
+
static const char* VA_RAW_MIME_TYPE = "video/x-raw-va";
static const uint32_t VA_COLOR_FORMAT = 0x7FA00E00;
OMXVideoDecoderBase::OMXVideoDecoderBase()
: mVideoDecoder(NULL),
- mBufferIDMode(false) {
+ mNativeBufferMode(false),
+ mOMXBufferHeaderTypePtrNum(0),
+ mGraphicBuffercolorformat(0),
+ mGraphicBufferStride(0){
}
OMXVideoDecoderBase::~OMXVideoDecoderBase() {
releaseVideoDecoder(mVideoDecoder);
-
if (this->ports) {
if (this->ports[INPORT_INDEX]) {
delete this->ports[INPORT_INDEX];
@@ -184,6 +185,7 @@ OMX_ERRORTYPE OMXVideoDecoderBase::ProcessorInit(void) {
Decode_Status status = mVideoDecoder->start(&configBuffer);
//pthread_mutex_unlock(&mSerializationLock);
+
if (status != DECODE_SUCCESS) {
return TranslateDecodeStatus(status);
}
@@ -230,16 +232,81 @@ OMX_ERRORTYPE OMXVideoDecoderBase::ProcessorFlush(OMX_U32 portIndex) {
return OMX_ErrorNone;
}
+ OMX_ERRORTYPE OMXVideoDecoderBase::PreProcessBuffer(OMX_BUFFERHEADERTYPE* buffer){
+
+ if(mNativeBufferMode && buffer->nOutputPortIndex == OUTPORT_INDEX){
+ Decode_Status status;
+ if(mVideoDecoder == NULL){
+ LOGE("PreProcessBuffer: Video decoder is not created");
+ return OMX_ErrorDynamicResourcesUnavailable;
+ }
+ status = mVideoDecoder->SignalRenderDoneFlag(buffer->pBuffer);
+
+ if (status != DECODE_SUCCESS) {
+ return TranslateDecodeStatus(status);
+ }
+ }
+ return OMX_ErrorNone;
+}
+
+
+ OMX_ERRORTYPE OMXVideoDecoderBase::PreProcessBufferQueue_Locked(void) {
+ if(!mNativeBufferMode )
+ return OMX_ErrorNone;
+ Decode_Status status = DECODE_SUCCESS;
+ PortBase *port_out = this->ports[OUTPORT_INDEX];
+
+ OMX_BUFFERHEADERTYPE *buffer = NULL;
+ OMX_BUFFERHEADERTYPE *buffer_head = NULL;
+ bool used = false;
+
+ OMX_U32 len = port_out->BufferQueueLength();
+ //check the buffer from buffer queue. used means cannot be used to decode
+ for( OMX_U32 i=0; i <len; i++){
+ buffer = port_out->PopBuffer();
+ if(buffer == NULL)
+ break;
+ status = mVideoDecoder->GetNativeBufferStatus(buffer->pBuffer,&used);
+ if(status != DECODE_SUCCESS){
+ LOGW("GetNativeBufferStatus returned status =%d",status);
+ }
+ if(used){
+ port_out->MixPushThisBuffer(buffer);
+ }
+ else{
+ port_out->PushThisBuffer(buffer);
+ }
+ }
+ //check the buffer from mix buffer queue,
+ len = port_out->MixBufferQueueLength();
+ for( OMX_U32 i=0; i <len; i++){
+ buffer = port_out->MixPopBuffer();
+ if(buffer == NULL)
+ break;
+ mVideoDecoder->GetNativeBufferStatus(buffer->pBuffer,&used);
+ if(status != DECODE_SUCCESS){
+ LOGW("GetNativeBufferStatus returned status =%d",status);
+ }
+ if(used){
+ port_out->MixPushThisBuffer(buffer);
+ }
+ else{
+ port_out->PushThisBuffer(buffer);
+ }
+ }
+
+ return OMX_ErrorNone;
+}
+
OMX_ERRORTYPE OMXVideoDecoderBase::ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retains,
OMX_U32 numberBuffers) {
OMX_ERRORTYPE ret;
Decode_Status status;
-
// fill render buffer without draining decoder output queue
- ret = FillRenderBuffer(buffers[OUTPORT_INDEX], 0);
+ ret = FillRenderBuffer(pBuffers[OUTPORT_INDEX], 0);
if (ret == OMX_ErrorNone) {
retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN;
// TODO: continue decoding
@@ -250,7 +317,7 @@ OMX_ERRORTYPE OMXVideoDecoderBase::ProcessorProcess(
VideoDecodeBuffer decodeBuffer;
// PrepareDecodeBuffer will set retain to either BUFFER_RETAIN_GETAGAIN or BUFFER_RETAIN_NOT_RETAIN
- ret = PrepareDecodeBuffer(buffers[INPORT_INDEX], &retains[INPORT_INDEX], &decodeBuffer);
+ ret = PrepareDecodeBuffer(*pBuffers[INPORT_INDEX], &retains[INPORT_INDEX], &decodeBuffer);
if (ret == OMX_ErrorNotReady) {
retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN;
return OMX_ErrorNone;
@@ -266,7 +333,7 @@ OMX_ERRORTYPE OMXVideoDecoderBase::ProcessorProcess(
if (status == DECODE_FORMAT_CHANGE) {
ret = HandleFormatChange();
CHECK_RETURN_VALUE("HandleFormatChange");
- buffers[OUTPORT_INDEX]->nFilledLen = 0;
+ ((*pBuffers[OUTPORT_INDEX]))->nFilledLen = 0;
// don't use the output buffer if format is changed.
return OMX_ErrorNone;
} else if (status == DECODE_NO_CONFIG) {
@@ -285,17 +352,19 @@ OMX_ERRORTYPE OMXVideoDecoderBase::ProcessorProcess(
// For decoder errors that could be omitted, not throw error and continue to decode.
TranslateDecodeStatus(status);
- buffers[OUTPORT_INDEX]->nFilledLen = 0;
+ ((*pBuffers[OUTPORT_INDEX]))->nFilledLen = 0;
return OMX_ErrorNone;
}
}
}
// drain the decoder output queue when in EOS state and fill the render buffer
- ret = FillRenderBuffer(buffers[OUTPORT_INDEX], buffers[INPORT_INDEX]->nFlags);
+ ret = FillRenderBuffer(pBuffers[OUTPORT_INDEX], ((*pBuffers[INPORT_INDEX]))->nFlags);
+
if (ret == OMX_ErrorNotReady) {
retains[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN;
ret = OMX_ErrorNone;
}
+
return ret;
}
@@ -308,12 +377,23 @@ OMX_ERRORTYPE OMXVideoDecoderBase::PrepareConfigBuffer(VideoConfigBuffer *p) {
return OMX_ErrorBadParameter;
}
- if (!mBufferIDMode) {
- LOGD("intel omx video decoder working in raw nv12 mode");
- } else {
- LOGD("intel omx video decoder working in buffer index mode");
+ if ( mNativeBufferMode) {
+ LOGD("intel omx video decoder working in native buffer mode");
+ }else{
+ LOGD("intel omx video decoder working in raw nv12 mode ");
}
+ if( mNativeBufferMode){
+ p->surfaceNumber = mOMXBufferHeaderTypePtrNum;
+ for( int i=0; i < mOMXBufferHeaderTypePtrNum;i++){
+ OMX_BUFFERHEADERTYPE *buffer_hdr = mOMXBufferHeaderTypePtrArray[i];
+ p->graphicBufferHandler[i] = buffer_hdr->pBuffer;
+ LOGV("PrepareConfigBuffer bufferid=%p,handle =%p",buffer_hdr,buffer_hdr->pBuffer);
+ }
+ p->flag |= USE_NATIVE_GRAPHIC_BUFFER;
+ p->graphicBufferStride = mGraphicBufferStride;
+ p->graphicBufferColorFormat = mGraphicBuffercolorformat;
+ }
p->width = paramPortDefinitionInput->format.video.nFrameWidth;
p->height = paramPortDefinitionInput->format.video.nFrameHeight;
return OMX_ErrorNone;
@@ -354,8 +434,12 @@ OMX_ERRORTYPE OMXVideoDecoderBase::PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE *buf
return OMX_ErrorNone;
}
-OMX_ERRORTYPE OMXVideoDecoderBase::FillRenderBuffer(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 inportBufferFlags) {
- if (buffer->pPlatformPrivate) {
+OMX_ERRORTYPE OMXVideoDecoderBase::FillRenderBuffer(OMX_BUFFERHEADERTYPE **pBuffer, OMX_U32 inportBufferFlags) {
+
+ OMX_BUFFERHEADERTYPE *buffer = *pBuffer;
+ OMX_BUFFERHEADERTYPE *buffer_orign = buffer;
+
+ if (!mNativeBufferMode && buffer->pPlatformPrivate) {
VideoRenderBuffer *p = (VideoRenderBuffer *)buffer->pPlatformPrivate;
p->renderDone = true;
buffer->pPlatformPrivate = NULL;
@@ -375,40 +459,58 @@ OMX_ERRORTYPE OMXVideoDecoderBase::FillRenderBuffer(OMX_BUFFERHEADERTYPE *buffer
return OMX_ErrorNotReady;
}
+ if(mNativeBufferMode) {
+ buffer = *pBuffer = mOMXBufferHeaderTypePtrArray[renderBuffer->acquirePos];
+ }
+
buffer->nFlags = OMX_BUFFERFLAG_ENDOFFRAME;
buffer->nTimeStamp = renderBuffer->timeStamp;
- if (!mBufferIDMode) {
- MapRawNV12(renderBuffer, buffer->pBuffer + buffer->nOffset, buffer->nFilledLen);
+ if (mNativeBufferMode) {
+
+ PortBase *port_out = this->ports[OUTPORT_INDEX];
+ //check orign buffer
+ if(buffer_orign != buffer){
+
+ bool used = false;
+ mVideoDecoder->GetNativeBufferStatus(buffer_orign->pBuffer,&used);
+ if(used){
+ port_out->MixPushThisBuffer(buffer_orign);
+ }else{
+ port_out->PushThisBuffer(buffer_orign);
+ }
+
+ //need pop the returing buffer from mix used buffer queue
+ OMX_U32 len = port_out->MixBufferQueueLength();
+ OMX_BUFFERHEADERTYPE *temp = NULL;
+ for(OMX_U32 i =0 ; i < len; i++){
+ temp = port_out->MixPopBuffer();
+ if(temp == NULL)
+ break;
+ if(temp == buffer){
+ LOGV("FillRenderBuffer Poped buffer = %p from mix queue",temp);
+ break;
+ }
+ else{
+ port_out->MixPushThisBuffer(temp);
+ }
+ }
+ }
+
+ buffer->nFilledLen = sizeof(OMX_U8*);
+
} else {
-#if 0
- buffer->nFilledLen = sizeof(VABuffer);
- VABuffer *p = (VABuffer *)(buffer->pBuffer + buffer->nOffset);
-
- // TODO: pass cropping data to VABuffer
- p->surface = renderBuffer->surface;
- p->display = renderBuffer->display;
- p->frame_structure = renderBuffer->scanFormat;
-#else
- buffer->nFilledLen = sizeof(VABufferIDPackage);
- VABufferIDPackage *p = (VABufferIDPackage *)(buffer->pBuffer + buffer->nOffset);
-
- vaGetBufferID(renderBuffer->display, renderBuffer->surface, &p->devid, &p->bufid);
- p->width = this->ports[OUTPORT_INDEX]->GetPortDefinition()->format.video.nFrameWidth;
- p->height = this->ports[OUTPORT_INDEX]->GetPortDefinition()->format.video.nFrameHeight;
-#endif
+ MapRawNV12(renderBuffer, buffer->pBuffer + buffer->nOffset, buffer->nFilledLen);
+ buffer->pPlatformPrivate = (void *)renderBuffer;
}
- // TODO: set "RenderDone" in next "FillRenderBuffer" with the same OMX buffer header.
- // this indicates surface is "rendered" and can be reused for decoding.
- //renderBuffer->renderDone = true;
-
- buffer->pPlatformPrivate = (void *)renderBuffer;
return OMX_ErrorNone;
}
OMX_ERRORTYPE OMXVideoDecoderBase::HandleFormatChange(void) {
LOGW("Video format is changed.");
+ if(mNativeBufferMode)
+ return OMX_ErrorNone;
//pthread_mutex_lock(&mSerializationLock);
const VideoFormatInfo *formatInfo = mVideoDecoder->getFormatInfo();
//pthread_mutex_unlock(&mSerializationLock);
@@ -516,8 +618,9 @@ OMX_ERRORTYPE OMXVideoDecoderBase::TranslateDecodeStatus(Decode_Status status) {
OMX_ERRORTYPE OMXVideoDecoderBase::BuildHandlerList(void) {
OMXComponentCodecBase::BuildHandlerList();
AddHandler(OMX_IndexParamVideoPortFormat, GetParamVideoPortFormat, SetParamVideoPortFormat);
- //AddHandler(PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX, GetCapabilityFlags, SetCapabilityFlags);
- AddHandler(static_cast<OMX_INDEXTYPE>(OMX_IndexBufferIDMode), GetBufferIDMode, SetBufferIDMode);
+ //AddHandler(PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX, GetCapabilityFlags, SetCapabilityFlags);
+ AddHandler(static_cast<OMX_INDEXTYPE>(OMX_IndexExtGetNativeBufferUsage),GetNativeBufferUsage,SetNativeBufferUsage);
+ AddHandler(static_cast<OMX_INDEXTYPE>(OMX_IndexExtUseNativeBuffer),GetNativeBuffer,SetNativeBuffer);
return OMX_ErrorNone;
}
@@ -551,39 +654,46 @@ OMX_ERRORTYPE OMXVideoDecoderBase::SetParamVideoPortFormat(OMX_PTR pStructure) {
return OMX_ErrorNone;
}
-
-OMX_ERRORTYPE OMXVideoDecoderBase::GetBufferIDMode(OMX_PTR pStructure) {
+OMX_ERRORTYPE OMXVideoDecoderBase::GetNativeBufferUsage(OMX_PTR pStructure) {
+ OMX_ERRORTYPE ret;
+ GetAndroidNativeBufferUsageParams *param = (GetAndroidNativeBufferUsageParams*)pStructure;
+ CHECK_TYPE_HEADER(param);
+ param->nUsage |= GRALLOC_USAGE_SW_WRITE_OFTEN;
+ param->nUsage |= GRALLOC_USAGE_HW_TEXTURE;
+ return OMX_ErrorNone;
+}
+OMX_ERRORTYPE OMXVideoDecoderBase::SetNativeBufferUsage(OMX_PTR pStructure) {
OMX_ERRORTYPE ret;
-
- *(static_cast<bool*>(pStructure)) = mBufferIDMode;
- return OMX_ErrorNone;
+ CHECK_SET_PARAM_STATE();
+ return OMX_ErrorBadParameter;
}
-OMX_ERRORTYPE OMXVideoDecoderBase::SetBufferIDMode(OMX_PTR pStructure) {
+OMX_ERRORTYPE OMXVideoDecoderBase::GetNativeBuffer(OMX_PTR pStructure) {
+ OMX_ERRORTYPE ret;
+ return OMX_ErrorBadParameter;
+}
+OMX_ERRORTYPE OMXVideoDecoderBase::SetNativeBuffer(OMX_PTR pStructure) {
OMX_ERRORTYPE ret;
-
CHECK_SET_PARAM_STATE();
-
- OMX_PARAM_PORTDEFINITIONTYPE port_def;
- PortVideo *port;
-
- mBufferIDMode = *(static_cast<bool*>(pStructure));
-
- port = static_cast<PortVideo *>(this->ports[OUTPORT_INDEX]);
- memcpy(&port_def, port->GetPortDefinition(), sizeof(port_def));
-
- if (!mBufferIDMode) {
- port_def.nBufferSize = OUTPORT_BUFFER_SIZE;
- port_def.format.video.cMIMEType = (OMX_STRING)"video/raw";
- port_def.format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
- } else {
- port_def.nBufferSize = sizeof(VideoRenderBuffer);
- port_def.format.video.cMIMEType = (OMX_STRING)VA_RAW_MIME_TYPE;
- port_def.format.video.eColorFormat = static_cast<OMX_COLOR_FORMATTYPE>(VA_COLOR_FORMAT);
+ UseAndroidNativeBufferParams *param = (UseAndroidNativeBufferParams*)pStructure;
+ CHECK_TYPE_HEADER(param);
+ if(param->nPortIndex != OUTPORT_INDEX)
+ return OMX_ErrorBadParameter;
+ OMX_BUFFERHEADERTYPE *buf_hdr = NULL;
+ ret = this->ports[OUTPORT_INDEX]->UseBuffer(&buf_hdr,OUTPORT_INDEX,param->pAppPrivate,sizeof(OMX_U8*),
+ const_cast<OMX_U8*>(reinterpret_cast<const OMX_U8*>(param->nativeBuffer->handle)));
+ if(ret != OMX_ErrorNone)
+ return ret;
+ if (mOMXBufferHeaderTypePtrNum >= MAX_GRAPHIC_NUM)
+ return OMX_ErrorOverflow;
+ mOMXBufferHeaderTypePtrArray[mOMXBufferHeaderTypePtrNum++] = buf_hdr;
+ *(param->bufferHeader) = buf_hdr;
+ if(!mGraphicBuffercolorformat) {
+ mGraphicBuffercolorformat = param->nativeBuffer->format;
+ }
+ if(!mGraphicBufferStride) {
+ mGraphicBufferStride = param->nativeBuffer->stride;
}
-
- port->SetPortDefinition(&port_def, true);
-
return OMX_ErrorNone;
}
@@ -596,7 +706,7 @@ OMX_ERRORTYPE OMXVideoDecoderBase::MapRawNV12(const VideoRenderBuffer* renderBuf
int32_t height = this->ports[OUTPORT_INDEX]->GetPortDefinition()->format.video.nFrameHeight;
size = width * height * 3 / 2;
-
+
vaStatus = vaSyncSurface(renderBuffer->display, renderBuffer->surface);
if (vaStatus != VA_STATUS_SUCCESS) {
return OMX_ErrorUndefined;
@@ -635,7 +745,7 @@ OMX_ERRORTYPE OMXVideoDecoderBase::MapRawNV12(const VideoRenderBuffer* renderBuf
if (vaStatus != VA_STATUS_SUCCESS) {
return OMX_ErrorUndefined;
}
-
+
if (size == (int32_t)vaImage.data_size) {
memcpy(rawData, pBuf, size);
} else {
diff --git a/videocodec/OMXVideoDecoderBase.h b/videocodec/OMXVideoDecoderBase.h
index 7c5db5e..2262220 100644
--- a/videocodec/OMXVideoDecoderBase.h
+++ b/videocodec/OMXVideoDecoderBase.h
@@ -23,6 +23,10 @@
#include "VideoDecoderInterface.h"
#include "VideoDecoderHost.h"
+static const char* VA_VED_RAW_MIME_TYPE = "video/x-raw-vaved";
+static const uint32_t VA_VED_COLOR_FORMAT = 0x20;
+
+
class OMXVideoDecoderBase : public OMXComponentCodecBase {
public:
OMXVideoDecoderBase();
@@ -42,13 +46,16 @@ protected:
//virtual OMX_ERRORTYPE ProcessorResume(void);
virtual OMX_ERRORTYPE ProcessorFlush(OMX_U32 portIndex);
virtual OMX_ERRORTYPE ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retains,
OMX_U32 numberBuffers);
+ virtual OMX_ERRORTYPE PreProcessBuffer(OMX_BUFFERHEADERTYPE* buffer);
+ virtual OMX_ERRORTYPE PreProcessBufferQueue_Locked();
+
virtual OMX_ERRORTYPE PrepareConfigBuffer(VideoConfigBuffer *p);
virtual OMX_ERRORTYPE PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE *buffer, buffer_retain_t *retain, VideoDecodeBuffer *p);
- virtual OMX_ERRORTYPE FillRenderBuffer(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 inportBufferFlags);
+ virtual OMX_ERRORTYPE FillRenderBuffer(OMX_BUFFERHEADERTYPE **pBuffer, OMX_U32 inportBufferFlags);
virtual OMX_ERRORTYPE HandleFormatChange(void);
virtual OMX_ERRORTYPE TranslateDecodeStatus(Decode_Status status);
virtual OMX_ERRORTYPE MapRawNV12(const VideoRenderBuffer* renderBuffer, OMX_U8 *rawData, OMX_U32& size);
@@ -56,7 +63,8 @@ protected:
virtual OMX_ERRORTYPE BuildHandlerList(void);
DECLARE_HANDLER(OMXVideoDecoderBase, ParamVideoPortFormat);
DECLARE_HANDLER(OMXVideoDecoderBase, CapabilityFlags);
- DECLARE_HANDLER(OMXVideoDecoderBase, BufferIDMode);
+ DECLARE_HANDLER(OMXVideoDecoderBase, NativeBufferUsage);
+ DECLARE_HANDLER(OMXVideoDecoderBase, NativeBuffer);
private:
enum {
@@ -70,10 +78,14 @@ private:
OUTPORT_ACTUAL_BUFFER_COUNT = 4,
OUTPORT_BUFFER_SIZE = 1382400,
};
+ uint32_t mOMXBufferHeaderTypePtrNum;
+ OMX_BUFFERHEADERTYPE *mOMXBufferHeaderTypePtrArray[MAX_GRAPHIC_NUM];
+ uint32_t mGraphicBufferStride;
+ uint32_t mGraphicBuffercolorformat;
protected:
IVideoDecoder *mVideoDecoder;
- bool mBufferIDMode;
+ bool mNativeBufferMode;
};
#endif /* OMX_VIDEO_DECODER_BASE_H_ */
diff --git a/videocodec/OMXVideoDecoderH263.cpp b/videocodec/OMXVideoDecoderH263.cpp
index ce5434c..5cf1d45 100644
--- a/videocodec/OMXVideoDecoderH263.cpp
+++ b/videocodec/OMXVideoDecoderH263.cpp
@@ -64,11 +64,11 @@ OMX_ERRORTYPE OMXVideoDecoderH263::ProcessorDeinit(void) {
}
OMX_ERRORTYPE OMXVideoDecoderH263::ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retains,
OMX_U32 numberBuffers) {
- return OMXVideoDecoderBase::ProcessorProcess(buffers, retains, numberBuffers);
+ return OMXVideoDecoderBase::ProcessorProcess(pBuffers, retains, numberBuffers);
}
OMX_ERRORTYPE OMXVideoDecoderH263::PrepareConfigBuffer(VideoConfigBuffer *p) {
@@ -82,6 +82,7 @@ OMX_ERRORTYPE OMXVideoDecoderH263::PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE *buf
OMX_ERRORTYPE OMXVideoDecoderH263::BuildHandlerList(void) {
OMXVideoDecoderBase::BuildHandlerList();
AddHandler(OMX_IndexParamVideoH263, GetParamVideoH263, SetParamVideoH263);
+ AddHandler(static_cast<OMX_INDEXTYPE>(OMX_IndexExtEnableNativeBuffer),GetNativeBufferMode,SetNativeBufferMode);
return OMX_ErrorNone;
}
@@ -108,6 +109,31 @@ OMX_ERRORTYPE OMXVideoDecoderH263::SetParamVideoH263(OMX_PTR pStructure) {
return OMX_ErrorNone;
}
+OMX_ERRORTYPE OMXVideoDecoderH263::GetNativeBufferMode(OMX_PTR pStructure) {
+ OMX_ERRORTYPE ret;
+ return OMX_ErrorNone; //would not be here
+}
+
+#define MAX_OUTPUT_BUFFER_COUNT_FOR_H263 10
+
+OMX_ERRORTYPE OMXVideoDecoderH263::SetNativeBufferMode(OMX_PTR pStructure) {
+ OMX_ERRORTYPE ret;
+ CHECK_SET_PARAM_STATE();
+ //EnableAndroidNativeBuffersParams *param = (EnableAndroidNativeBuffersParams*)pStructure;
+ //CHECK_TYPE_HEADER(param);
+ mNativeBufferMode = true;
+ PortVideo *port = NULL;
+ port = static_cast<PortVideo *>(this->ports[OUTPORT_INDEX]);
+ OMX_PARAM_PORTDEFINITIONTYPE port_def;
+ memcpy(&port_def,port->GetPortDefinition(),sizeof(port_def));
+ port_def.nBufferCountMin = 1;
+ port_def.nBufferCountActual = MAX_OUTPUT_BUFFER_COUNT_FOR_H263;
+ port_def.format.video.cMIMEType = (OMX_STRING)VA_VED_RAW_MIME_TYPE;
+ port_def.format.video.eColorFormat =static_cast<OMX_COLOR_FORMATTYPE>(VA_VED_COLOR_FORMAT) ;//
+ port->SetPortDefinition(&port_def,true);
+ return OMX_ErrorNone;
+}
+
DECLARE_OMX_COMPONENT("OMX.Intel.VideoDecoder.H263", "video_decoder.h263", OMXVideoDecoderH263);
diff --git a/videocodec/OMXVideoDecoderH263.h b/videocodec/OMXVideoDecoderH263.h
index cfedb78..2cf80af 100644
--- a/videocodec/OMXVideoDecoderH263.h
+++ b/videocodec/OMXVideoDecoderH263.h
@@ -31,7 +31,7 @@ protected:
virtual OMX_ERRORTYPE ProcessorInit(void);
virtual OMX_ERRORTYPE ProcessorDeinit(void);
virtual OMX_ERRORTYPE ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retains,
OMX_U32 numberBuffers);
@@ -40,6 +40,7 @@ protected:
virtual OMX_ERRORTYPE BuildHandlerList(void);
DECLARE_HANDLER(OMXVideoDecoderH263, ParamVideoH263);
+ DECLARE_HANDLER(OMXVideoDecoderH263,NativeBufferMode);
private:
enum {
diff --git a/videocodec/OMXVideoDecoderMPEG4.cpp b/videocodec/OMXVideoDecoderMPEG4.cpp
index 850899a..be19d13 100644
--- a/videocodec/OMXVideoDecoderMPEG4.cpp
+++ b/videocodec/OMXVideoDecoderMPEG4.cpp
@@ -64,11 +64,11 @@ OMX_ERRORTYPE OMXVideoDecoderMPEG4::ProcessorDeinit(void) {
}
OMX_ERRORTYPE OMXVideoDecoderMPEG4::ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retains,
OMX_U32 numberBuffers) {
- return OMXVideoDecoderBase::ProcessorProcess(buffers, retains, numberBuffers);
+ return OMXVideoDecoderBase::ProcessorProcess(pBuffers, retains, numberBuffers);
}
OMX_ERRORTYPE OMXVideoDecoderMPEG4::PrepareConfigBuffer(VideoConfigBuffer *p) {
@@ -82,6 +82,7 @@ OMX_ERRORTYPE OMXVideoDecoderMPEG4::PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE *bu
OMX_ERRORTYPE OMXVideoDecoderMPEG4::BuildHandlerList(void) {
OMXVideoDecoderBase::BuildHandlerList();
AddHandler(OMX_IndexParamVideoMpeg4, GetParamVideoMpeg4, SetParamVideoMpeg4);
+ AddHandler(static_cast<OMX_INDEXTYPE>(OMX_IndexExtEnableNativeBuffer),GetNativeBufferMode,SetNativeBufferMode);
return OMX_ErrorNone;
}
@@ -107,6 +108,30 @@ OMX_ERRORTYPE OMXVideoDecoderMPEG4::SetParamVideoMpeg4(OMX_PTR pStructure) {
memcpy(&mParamMpeg4, p, sizeof(mParamMpeg4));
return OMX_ErrorNone;
}
+OMX_ERRORTYPE OMXVideoDecoderMPEG4::GetNativeBufferMode(OMX_PTR pStructure) {
+ OMX_ERRORTYPE ret;
+ return OMX_ErrorNone; //would not be here
+}
+
+
+#define MAX_OUTPUT_BUFFER_COUNT_FOR_MPEG4 10
+OMX_ERRORTYPE OMXVideoDecoderMPEG4::SetNativeBufferMode(OMX_PTR pStructure) {
+ OMX_ERRORTYPE ret;
+ //EnableAndroidNativeBuffersParams *param = (EnableAndroidNativeBuffersParams*)pStructure;
+ //CHECK_TYPE_HEADER(param);
+ CHECK_SET_PARAM_STATE();
+ mNativeBufferMode = true;
+ PortVideo *port = NULL;
+ port = static_cast<PortVideo *>(this->ports[OUTPORT_INDEX]);
+ OMX_PARAM_PORTDEFINITIONTYPE port_def;
+ memcpy(&port_def,port->GetPortDefinition(),sizeof(port_def));
+ port_def.nBufferCountMin = 1;
+ port_def.nBufferCountActual = MAX_OUTPUT_BUFFER_COUNT_FOR_MPEG4;
+ port_def.format.video.cMIMEType = (OMX_STRING)VA_VED_RAW_MIME_TYPE;
+ port_def.format.video.eColorFormat =static_cast<OMX_COLOR_FORMATTYPE>(VA_VED_COLOR_FORMAT);
+ port->SetPortDefinition(&port_def,true);
+ return OMX_ErrorNone;
+}
DECLARE_OMX_COMPONENT("OMX.Intel.VideoDecoder.MPEG4", "video_decoder.mpeg4", OMXVideoDecoderMPEG4);
diff --git a/videocodec/OMXVideoDecoderMPEG4.h b/videocodec/OMXVideoDecoderMPEG4.h
index 43fab7b..c3e5773 100644
--- a/videocodec/OMXVideoDecoderMPEG4.h
+++ b/videocodec/OMXVideoDecoderMPEG4.h
@@ -32,7 +32,7 @@ protected:
virtual OMX_ERRORTYPE ProcessorInit(void);
virtual OMX_ERRORTYPE ProcessorDeinit(void);
virtual OMX_ERRORTYPE ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retains,
OMX_U32 numberBuffers);
@@ -41,6 +41,7 @@ protected:
virtual OMX_ERRORTYPE BuildHandlerList(void);
DECLARE_HANDLER(OMXVideoDecoderMPEG4, ParamVideoMpeg4);
+ DECLARE_HANDLER(OMXVideoDecoderMPEG4,NativeBufferMode);
private:
enum {
diff --git a/videocodec/OMXVideoDecoderPAVC.cpp b/videocodec/OMXVideoDecoderPAVC.cpp
index 30ec9ca..d9f01b2 100644
--- a/videocodec/OMXVideoDecoderPAVC.cpp
+++ b/videocodec/OMXVideoDecoderPAVC.cpp
@@ -74,11 +74,11 @@ OMX_ERRORTYPE OMXVideoDecoderPAVC::ProcessorFlush(OMX_U32 portIndex) {
}
OMX_ERRORTYPE OMXVideoDecoderPAVC::ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retains,
OMX_U32 numberBuffers) {
- return OMXVideoDecoderBase::ProcessorProcess(buffers, retains, numberBuffers);
+ return OMXVideoDecoderBase::ProcessorProcess(pBuffers, retains, numberBuffers);
}
OMX_ERRORTYPE OMXVideoDecoderPAVC::PrepareConfigBuffer(VideoConfigBuffer *p) {
@@ -115,6 +115,7 @@ OMX_ERRORTYPE OMXVideoDecoderPAVC::BuildHandlerList(void) {
AddHandler(OMX_IndexParamVideoAvc, GetParamVideoAvc, SetParamVideoAvc);
AddHandler(OMX_IndexParamVideoProfileLevelQuerySupported, GetVideoProfileLevelQuerySupported, SetVideoProfileLevelQuerySupported);
AddHandler(OMX_IndexParamVideoProfileLevelCurrent, GetVideoProfileLevelCurrent, SetVideoProfileLevelCurrent);
+ AddHandler(static_cast<OMX_INDEXTYPE>(OMX_IndexExtEnableNativeBuffer),GetNativeBufferMode,SetNativeBufferMode);
return OMX_ErrorNone;
}
@@ -201,5 +202,31 @@ OMX_ERRORTYPE OMXVideoDecoderPAVC::SetVideoProfileLevelCurrent(OMX_PTR pStructur
}
+OMX_ERRORTYPE OMXVideoDecoderPAVC::GetNativeBufferMode(OMX_PTR pStructure) {
+ OMX_ERRORTYPE ret;
+ return OMX_ErrorNone; //would not be here
+}
+
+#define MAX_OUTPUT_BUFFER_COUNT_FOR_PAVC 10
+OMX_ERRORTYPE OMXVideoDecoderPAVC::SetNativeBufferMode(OMX_PTR pStructure) {
+ // OMX_ERRORTYPE ret;
+ //EnableAndroidNativeBuffersParams *param = (EnableAndroidNativeBuffersParams*)pStructure;
+ //CHECK_TYPE_HEADER(param);
+ CHECK_SET_PARAM_STATE();
+ mNativeBufferMode = true;
+ PortVideo *port = NULL;
+ port = static_cast<PortVideo *>(this->ports[OUTPORT_INDEX]);
+ OMX_PARAM_PORTDEFINITIONTYPE port_def;
+ memcpy(&port_def,port->GetPortDefinition(),sizeof(port_def));
+ port_def.nBufferCountMin = 1;
+ port_def.nBufferCountActual = MAX_OUTPUT_BUFFER_COUNT_FOR_PAVC;
+ port_def.format.video.cMIMEType = (OMX_STRING)"video/raw_ve";
+ port_def.format.video.eColorFormat =static_cast<OMX_COLOR_FORMATTYPE>(0x7FA00EFF) ;//
+ port->SetPortDefinition(&port_def,true);
+ return OMX_ErrorNone;
+}
+
+
+
DECLARE_OMX_COMPONENT("OMX.Intel.VideoDecoder.PAVC", "video_decoder.pavc", OMXVideoDecoderPAVC);
diff --git a/videocodec/OMXVideoDecoderPAVC.h b/videocodec/OMXVideoDecoderPAVC.h
index 5428aae..128f47c 100644
--- a/videocodec/OMXVideoDecoderPAVC.h
+++ b/videocodec/OMXVideoDecoderPAVC.h
@@ -31,7 +31,7 @@ protected:
virtual OMX_ERRORTYPE ProcessorDeinit(void);
virtual OMX_ERRORTYPE ProcessorFlush(OMX_U32 portIndex);
virtual OMX_ERRORTYPE ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retains,
OMX_U32 numberBuffers);
@@ -42,6 +42,7 @@ protected:
DECLARE_HANDLER(OMXVideoDecoderPAVC, ParamVideoAvc);
DECLARE_HANDLER(OMXVideoDecoderPAVC, VideoProfileLevelQuerySupported);
DECLARE_HANDLER(OMXVideoDecoderPAVC, VideoProfileLevelCurrent);
+ DECLARE_HANDLER(OMXVideoDecoderPAVC, NativeBufferMode);
private:
diff --git a/videocodec/OMXVideoDecoderWMV.cpp b/videocodec/OMXVideoDecoderWMV.cpp
index e97c693..659616a 100644
--- a/videocodec/OMXVideoDecoderWMV.cpp
+++ b/videocodec/OMXVideoDecoderWMV.cpp
@@ -62,11 +62,11 @@ OMX_ERRORTYPE OMXVideoDecoderWMV::ProcessorDeinit(void) {
}
OMX_ERRORTYPE OMXVideoDecoderWMV::ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retains,
OMX_U32 numberBuffers) {
- return OMXVideoDecoderBase::ProcessorProcess(buffers, retains, numberBuffers);
+ return OMXVideoDecoderBase::ProcessorProcess(pBuffers, retains, numberBuffers);
}
OMX_ERRORTYPE OMXVideoDecoderWMV::PrepareConfigBuffer(VideoConfigBuffer *p) {
@@ -80,6 +80,7 @@ OMX_ERRORTYPE OMXVideoDecoderWMV::PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE *buff
OMX_ERRORTYPE OMXVideoDecoderWMV::BuildHandlerList(void) {
OMXVideoDecoderBase::BuildHandlerList();
AddHandler(OMX_IndexParamVideoWmv, GetParamVideoWmv, SetParamVideoWmv);
+ AddHandler(static_cast<OMX_INDEXTYPE>(OMX_IndexExtEnableNativeBuffer),GetNativeBufferMode,SetNativeBufferMode);
return OMX_ErrorNone;
}
@@ -106,6 +107,33 @@ OMX_ERRORTYPE OMXVideoDecoderWMV::SetParamVideoWmv(OMX_PTR pStructure) {
}
+
+OMX_ERRORTYPE OMXVideoDecoderWMV::GetNativeBufferMode(OMX_PTR pStructure) {
+ OMX_ERRORTYPE ret;
+ return OMX_ErrorNone; //would not be here
+}
+
+#define MAX_OUTPUT_BUFFER_COUNT_FOR_WMV 10
+OMX_ERRORTYPE OMXVideoDecoderWMV::SetNativeBufferMode(OMX_PTR pStructure) {
+ //OMX_ERRORTYPE ret;
+ //EnableAndroidNativeBuffersParams *param = (EnableAndroidNativeBuffersParams*)pStructure;
+ //CHECK_TYPE_HEADER(param);
+ CHECK_SET_PARAM_STATE();
+ mNativeBufferMode = true;
+ PortVideo *port = NULL;
+ port = static_cast<PortVideo *>(this->ports[OUTPORT_INDEX]);
+ OMX_PARAM_PORTDEFINITIONTYPE port_def;
+ memcpy(&port_def,port->GetPortDefinition(),sizeof(port_def));
+ port_def.nBufferCountMin = 1;
+ port_def.nBufferCountActual = MAX_OUTPUT_BUFFER_COUNT_FOR_WMV;
+ port_def.format.video.cMIMEType = (OMX_STRING)"video/raw_ve";
+ port_def.format.video.eColorFormat =static_cast<OMX_COLOR_FORMATTYPE>(0x7FA00EFF) ;//
+ port->SetPortDefinition(&port_def,true);
+ return OMX_ErrorNone;
+}
+
+
+
DECLARE_OMX_COMPONENT("OMX.Intel.VideoDecoder.WMV", "video_decoder.wmv", OMXVideoDecoderWMV);
diff --git a/videocodec/OMXVideoDecoderWMV.h b/videocodec/OMXVideoDecoderWMV.h
index 963d9ab..b9702cd 100644
--- a/videocodec/OMXVideoDecoderWMV.h
+++ b/videocodec/OMXVideoDecoderWMV.h
@@ -32,7 +32,7 @@ protected:
virtual OMX_ERRORTYPE ProcessorInit(void);
virtual OMX_ERRORTYPE ProcessorDeinit(void);
virtual OMX_ERRORTYPE ProcessorProcess(
- OMX_BUFFERHEADERTYPE **buffers,
+ OMX_BUFFERHEADERTYPE ***pBuffers,
buffer_retain_t *retains,
OMX_U32 numberBuffers);
@@ -41,6 +41,7 @@ protected:
virtual OMX_ERRORTYPE BuildHandlerList(void);
DECLARE_HANDLER(OMXVideoDecoderWMV, ParamVideoWmv);
+ DECLARE_HANDLER(OMXVideoDecoderWMV, NativeBufferMode);
private:
enum {