diff options
author | Steve Kondik <steve@cyngn.com> | 2014-12-12 23:04:33 -0800 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2014-12-12 23:04:33 -0800 |
commit | 2abb33ec180a25b162eb06b7c32baa615ff49dbc (patch) | |
tree | b7a03dafbdf3f9259a9ce97da0d2851e8abd8594 | |
parent | b12418fcf3844e8b82c18f3a9ddf27f0ab4bb44c (diff) | |
parent | 4fb0150cb9bda76c99593290707d61d0b3de7da1 (diff) | |
download | android_hardware_qcom_media-2abb33ec180a25b162eb06b7c32baa615ff49dbc.tar.gz android_hardware_qcom_media-2abb33ec180a25b162eb06b7c32baa615ff49dbc.tar.bz2 android_hardware_qcom_media-2abb33ec180a25b162eb06b7c32baa615ff49dbc.zip |
Merge branch 'LA.BF.1.1_rb1.14' of git://codeaurora.org/platform/hardware/qcom/media into cm-12.0
-rw-r--r-- | mm-core/inc/QCMediaDefs.h | 1 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/vdec/inc/omx_vdec.h | 16 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc.cpp | 10 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc_swvdec.cpp | 12 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp | 70 |
5 files changed, 85 insertions, 24 deletions
diff --git a/mm-core/inc/QCMediaDefs.h b/mm-core/inc/QCMediaDefs.h index cc2ea95a..fa4b898d 100644 --- a/mm-core/inc/QCMediaDefs.h +++ b/mm-core/inc/QCMediaDefs.h @@ -63,6 +63,7 @@ extern const char *MEDIA_MIMETYPE_CONTAINER_QCMATROSKA; extern const char *MEDIA_MIMETYPE_CONTAINER_QCOGG; extern const char *MEDIA_MIMETYPE_CONTAINER_QTIFLAC; extern const char *MEDIA_MIMETYPE_VIDEO_VPX; //backward compatibility +extern const char *MEDIA_MIMETYPE_AUDIO_EAC3_JOC; } // namespace android #endif //QC_MEDIA_DEFS_H_ diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h index 171f5c9d..710bca8e 100644 --- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h +++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h @@ -47,6 +47,7 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <string.h> #include <inttypes.h> #include <cstddef> +#include <cutils/atomic.h> static ptrdiff_t x; @@ -149,10 +150,10 @@ class VideoHeap : public MemoryHeapBase (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp) // BitMask Management logic -#define BITS_PER_BYTE 32 -#define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_BYTE - 1)/BITS_PER_BYTE) -#define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_BYTE) -#define BITMASK_FLAG(mIndex) (1 << ((mIndex) % BITS_PER_BYTE)) +#define BITS_PER_INDEX 64 +#define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_INDEX - 1)/BITS_PER_INDEX) +#define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_INDEX) +#define BITMASK_FLAG(mIndex) ((uint64_t)1 << ((mIndex) % BITS_PER_INDEX)) #define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \ &= ~(BITMASK_FLAG(mIndex)) #define BITMASK_SET(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \ @@ -765,6 +766,7 @@ class omx_vdec: public qc_omx_component pthread_mutex_t c_lock; //sem to handle the minimum procesing of commands sem_t m_cmd_lock; + sem_t m_safe_flush; bool m_error_propogated; // compression format OMX_VIDEO_CODINGTYPE eCompressionFormat; @@ -804,9 +806,9 @@ class omx_vdec: public qc_omx_component int pending_input_buffers; int pending_output_buffers; // bitmask array size for output side - unsigned int m_out_bm_count; + uint64_t m_out_bm_count; // bitmask array size for input side - unsigned int m_inp_bm_count; + uint64_t m_inp_bm_count; //Input port Populated OMX_BOOL m_inp_bPopulated; //Output port Populated @@ -1040,6 +1042,8 @@ class omx_vdec: public qc_omx_component return (index < sizeof(formatsDefault) / sizeof(OMX_COLOR_FORMATTYPE)) ? formatsDefault[index] : OMX_COLOR_FormatMax; } + + volatile int32_t m_queued_codec_config_count; }; #ifdef _MSM8974_ diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc.cpp index a55c574f..4ac06703 100644 --- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc.cpp +++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc.cpp @@ -5263,6 +5263,7 @@ OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE h OMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_IN OMX_BUFFERHEADERTYPE* buffer) { + unsigned nPortIndex = buffer - client_buffers.get_il_buf_hdr(); if (m_state == OMX_StateInvalid) { DEBUG_PRINT_ERROR("FTB in Invalid State"); @@ -5275,7 +5276,9 @@ OMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, } if (buffer == NULL || - ((buffer - client_buffers.get_il_buf_hdr()) >= drv_ctx.op_buf.actualcount)) { + (nPortIndex >= drv_ctx.op_buf.actualcount)) { + DEBUG_PRINT_ERROR("FTB: ERROR: invalid buffer index, nPortIndex %u bufCount %u", + nPortIndex, drv_ctx.op_buf.actualcount); return OMX_ErrorBadParameter; } @@ -5316,8 +5319,11 @@ OMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy( nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()); - if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount) + if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount) { + DEBUG_PRINT_ERROR("FTBProxy: ERROR: invalid buffer index, nPortIndex %u bufCount %u", + nPortIndex, drv_ctx.op_buf.actualcount); return OMX_ErrorBadParameter; + } DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p", bufferAdd, bufferAdd->pBuffer); diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc_swvdec.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc_swvdec.cpp index 58419f95..bb589859 100644 --- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc_swvdec.cpp +++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc_swvdec.cpp @@ -1013,6 +1013,7 @@ void omx_vdec::process_event_cb(void *ctxt, unsigned char id) if (p2 == OMX_CORE_OUTPUT_PORT_INDEX && pThis->m_swvdec_mode == SWVDEC_MODE_DECODE_ONLY) { DEBUG_PRINT_LOW("send all interm buffers to dsp after port enabled"); + pThis->m_fill_internal_bufers = OMX_TRUE; pThis->fill_all_buffers_proxy_dsp(&pThis->m_cmp); } pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,\ @@ -6233,6 +6234,7 @@ true/false OMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_IN OMX_BUFFERHEADERTYPE* buffer) { + unsigned int nPortIndex = (unsigned int)(buffer - client_buffers.get_il_buf_hdr()); if(m_state == OMX_StateInvalid) { DEBUG_PRINT_ERROR("FTB in Invalid State"); @@ -6245,7 +6247,6 @@ OMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, return OMX_ErrorIncorrectStateOperation; } - unsigned int nPortIndex = (unsigned int)(buffer - client_buffers.get_il_buf_hdr()); if (!buffer || !buffer->pBuffer || nPortIndex >= drv_ctx.op_buf.actualcount) { DEBUG_PRINT_ERROR("ERROR:FTB invalid bufHdr %p, nPortIndex %u", buffer, nPortIndex); @@ -9904,6 +9905,7 @@ OMX_ERRORTYPE omx_vdec::fill_all_buffers_proxy_dsp(OMX_HANDLETYPE hComp) { DEBUG_PRINT_ERROR("fill_this_buffer_proxy_dsp failed for buff %d bufHdr %p pBuffer %p", idx, bufHdr, bufHdr->pBuffer); + pthread_mutex_unlock(&m_lock); break; } } @@ -9948,8 +9950,11 @@ OMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy_dsp( nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)m_interm_mem_ptr); - if (bufferAdd == NULL || nPortIndex > drv_ctx.interm_op_buf.actualcount) + if (bufferAdd == NULL || nPortIndex > drv_ctx.interm_op_buf.actualcount) { + DEBUG_PRINT_ERROR("FTBProxyDSP: bufhdr = %p, nPortIndex %u bufCount %u", + bufferAdd, nPortIndex, drv_ctx.interm_op_buf.actualcount); return OMX_ErrorBadParameter; + } DEBUG_PRINT_LOW("fill_this_buffer_proxy_dsp: bufhdr = %p,pBuffer = %p, idx %d, state %d", bufferAdd, bufferAdd->pBuffer, nPortIndex, m_interm_buf_state[nPortIndex]); @@ -10569,7 +10574,8 @@ bool omx_vdec::execute_output_flush_dsp() } } m_interm_flush_dsp_progress = false; - m_fill_internal_bufers = OMX_TRUE; + if (!in_reconfig) + m_fill_internal_bufers = OMX_TRUE; pthread_mutex_unlock(&m_lock); for (idx = 0; idx < (int)drv_ctx.interm_op_buf.actualcount; idx++) diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp index 0a622de4..b0a0d9b5 100644 --- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp +++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp @@ -39,6 +39,9 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Include Files ////////////////////////////////////////////////////////////////////////////// +#define __STDC_FORMAT_MACROS +#include <inttypes.h> + #include <string.h> #include <pthread.h> #include <sys/prctl.h> @@ -572,7 +575,8 @@ omx_vdec::omx_vdec(): m_error_propogated(false), m_profile(0), client_set_fps(false), ignore_not_coded_vops(true), - m_last_rendered_TS(-1) + m_last_rendered_TS(-1), + m_queued_codec_config_count(0) { /* Assumption is that , to begin with , we have all the frames with decoder */ DEBUG_PRINT_HIGH("In OMX vdec Constructor"); @@ -659,6 +663,7 @@ omx_vdec::omx_vdec(): m_error_propogated(false), pthread_mutex_init(&m_lock, NULL); pthread_mutex_init(&c_lock, NULL); sem_init(&m_cmd_lock,0,0); + sem_init(&m_safe_flush, 0, 0); streaming[CAPTURE_PORT] = streaming[OUTPUT_PORT] = false; #ifdef _ANDROID_ @@ -2015,6 +2020,7 @@ OMX_ERRORTYPE omx_vdec::send_command(OMX_IN OMX_HANDLETYPE hComp, "to invalid port: %lu", param1); return OMX_ErrorBadPortIndex; } + post_event((unsigned)cmd,(unsigned)param1,OMX_COMPONENT_GENERATE_COMMAND); sem_wait(&m_cmd_lock); DEBUG_PRINT_LOW("send_command: Command Processed"); @@ -2347,6 +2353,22 @@ OMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp, #ifdef _MSM8974_ send_codec_config(); #endif + if (cmd == OMX_CommandFlush && (param1 == OMX_CORE_INPUT_PORT_INDEX || + param1 == OMX_ALL)) { + while (android_atomic_add(0, &m_queued_codec_config_count) > 0) { + struct timespec ts; + + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += 2; + DEBUG_PRINT_LOW("waiting for %d EBDs of CODEC CONFIG buffers ", + m_queued_codec_config_count); + if (sem_timedwait(&m_safe_flush, &ts)) { + DEBUG_PRINT_ERROR("Failed to wait for EBDs of CODEC CONFIG buffers"); + break; + } + } + } + if (OMX_CORE_INPUT_PORT_INDEX == param1 || OMX_ALL == param1) { BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING); } @@ -3399,7 +3421,8 @@ OMX_ERRORTYPE omx_vdec::set_parameter(OMX_IN OMX_HANDLETYPE hComp, eRet = OMX_ErrorUnsupportedSetting; } } else if ((!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx",OMX_MAX_STRINGNAME_SIZE)) || - (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311",OMX_MAX_STRINGNAME_SIZE)) + (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx311", OMX_MAX_STRINGNAME_SIZE)) || + (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.divx4", OMX_MAX_STRINGNAME_SIZE)) ) { if (!strncmp((const char*)comp_role->cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE)) { strlcpy((char*)m_cRole,"video_decoder.divx",OMX_MAX_STRINGNAME_SIZE); @@ -5925,6 +5948,11 @@ if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) { DEBUG_PRINT_ERROR("Failed to qbuf Input buffer to driver"); return OMX_ErrorHardware; } + + if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { + android_atomic_inc(&m_queued_codec_config_count); + } + if (codec_config_flag && !(buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) { codec_config_flag = false; } @@ -5976,6 +6004,7 @@ if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) { OMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_IN OMX_BUFFERHEADERTYPE* buffer) { + unsigned nPortIndex = 0; if (dynamic_buf_mode) { private_handle_t *handle = NULL; struct VideoDecoderOutputMetaData *meta; @@ -6021,8 +6050,11 @@ OMX_ERRORTYPE omx_vdec::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, return OMX_ErrorIncorrectStateOperation; } + nPortIndex = buffer - client_buffers.get_il_buf_hdr(); if (buffer == NULL || - ((buffer - client_buffers.get_il_buf_hdr()) >= (int)drv_ctx.op_buf.actualcount)) { + (nPortIndex >= drv_ctx.op_buf.actualcount)) { + DEBUG_PRINT_ERROR("FTB: ERROR: invalid buffer index, nPortIndex %u bufCount %u", + nPortIndex, drv_ctx.op_buf.actualcount); return OMX_ErrorBadParameter; } @@ -6063,8 +6095,11 @@ OMX_ERRORTYPE omx_vdec::fill_this_buffer_proxy( nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr()); - if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount) + if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount) { + DEBUG_PRINT_ERROR("FTBProxy: ERROR: invalid buffer index, nPortIndex %u bufCount %u", + nPortIndex, drv_ctx.op_buf.actualcount); return OMX_ErrorBadParameter; + } DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p", bufferAdd, bufferAdd->pBuffer); @@ -6896,13 +6931,8 @@ OMX_ERRORTYPE omx_vdec::fill_buffer_done(OMX_HANDLETYPE hComp, OMX_U32 buf_index = buffer - m_out_mem_ptr; BufferDim_t dim; private_handle_t *private_handle = NULL; - if (is_down_scalar_enabled) { - dim.sliceWidth = framesize.nWidth; - dim.sliceHeight = framesize.nHeight; - } else { - dim.sliceWidth = drv_ctx.video_resolution.frame_width; - dim.sliceHeight = drv_ctx.video_resolution.frame_height; - } + dim.sliceWidth = framesize.nWidth; + dim.sliceHeight = framesize.nHeight; if (native_buffer[buf_index].privatehandle) private_handle = native_buffer[buf_index].privatehandle; if (private_handle) { @@ -6928,6 +6958,19 @@ OMX_ERRORTYPE omx_vdec::empty_buffer_done(OMX_HANDLETYPE hComp, DEBUG_PRINT_LOW("empty_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p", buffer, buffer->pBuffer); pending_input_buffers--; + if (buffer->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { + int pending_flush_waiters; + + while (pending_flush_waiters = INT_MAX, + sem_getvalue(&m_safe_flush, &pending_flush_waiters), + /* 0 == there /are/ waiters depending on POSIX implementation */ + pending_flush_waiters <= 0 ) { + DEBUG_PRINT_LOW("sem post for %d EBD of CODEC CONFIG buffer", m_queued_codec_config_count); + sem_post(&m_safe_flush); + } + + android_atomic_and(0, &m_queued_codec_config_count); /* no clearer way to set to 0 */ + } if (arbitrary_bytes) { if (pdest_frame == NULL && input_flush_progress == false) { @@ -7609,7 +7652,8 @@ OMX_ERRORTYPE omx_vdec::push_input_h264 (OMX_HANDLETYPE hComp) h264_scratch.pBuffer,h264_scratch.nFilledLen); pdest_frame->nFilledLen += h264_scratch.nFilledLen; h264_scratch.nFilledLen = 0; - pdest_frame->nTimeStamp = h264_last_au_ts; + if (h264_last_au_ts != LLONG_MAX) + pdest_frame->nTimeStamp = h264_last_au_ts; } else { /* Completely new frame, let's just push what * we have now. The resulting EBD would trigger @@ -8251,7 +8295,7 @@ OMX_ERRORTYPE omx_vdec::allocate_output_headers() sizeof(OMX_BUFFERHEADERTYPE), nPMEMInfoSize, nPlatformListSize); - DEBUG_PRINT_LOW("PE %d bmSize %d",nPlatformEntrySize, + DEBUG_PRINT_LOW("PE %d bmSize %"PRId64, nPlatformEntrySize, m_out_bm_count); m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); // Alloc mem for platform specific info |