diff options
| -rw-r--r-- | avc-enc/psb_avc.cpp | 46 | ||||
| -rw-r--r-- | avc-enc/psb_avc.h | 2 | ||||
| -rw-r--r-- | h263-enc/psb_h263.cpp | 29 | ||||
| -rw-r--r-- | h263-enc/psb_h263.h | 2 | ||||
| -rw-r--r-- | m4v-enc/psb_m4v.cpp | 37 | ||||
| -rw-r--r-- | m4v-enc/psb_m4v.h | 2 | ||||
| -rw-r--r-- | psb-dec/psb.cpp | 34 | ||||
| -rw-r--r-- | psb-dec/psb.h | 2 | ||||
| -rw-r--r-- | sst/sst.cpp | 52 | ||||
| -rw-r--r-- | sst/sst.h | 2 | ||||
| -rw-r--r-- | videocodec/OMXComponentCodecBase.h | 2 | ||||
| -rw-r--r-- | videocodec/OMXVideoDecoderAVC.cpp | 40 | ||||
| -rw-r--r-- | videocodec/OMXVideoDecoderAVC.h | 3 | ||||
| -rw-r--r-- | videocodec/OMXVideoDecoderBase.cpp | 254 | ||||
| -rw-r--r-- | videocodec/OMXVideoDecoderBase.h | 20 | ||||
| -rw-r--r-- | videocodec/OMXVideoDecoderH263.cpp | 30 | ||||
| -rw-r--r-- | videocodec/OMXVideoDecoderH263.h | 3 | ||||
| -rw-r--r-- | videocodec/OMXVideoDecoderMPEG4.cpp | 29 | ||||
| -rw-r--r-- | videocodec/OMXVideoDecoderMPEG4.h | 3 | ||||
| -rw-r--r-- | videocodec/OMXVideoDecoderPAVC.cpp | 31 | ||||
| -rw-r--r-- | videocodec/OMXVideoDecoderPAVC.h | 3 | ||||
| -rw-r--r-- | videocodec/OMXVideoDecoderWMV.cpp | 32 | ||||
| -rw-r--r-- | videocodec/OMXVideoDecoderWMV.h | 3 |
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__); @@ -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 { |
