summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Kondik <steve@cyngn.com>2014-12-12 23:04:33 -0800
committerSteve Kondik <steve@cyngn.com>2014-12-12 23:04:33 -0800
commit2abb33ec180a25b162eb06b7c32baa615ff49dbc (patch)
treeb7a03dafbdf3f9259a9ce97da0d2851e8abd8594
parentb12418fcf3844e8b82c18f3a9ddf27f0ab4bb44c (diff)
parent4fb0150cb9bda76c99593290707d61d0b3de7da1 (diff)
downloadandroid_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.h1
-rw-r--r--mm-video-v4l2/vidc/vdec/inc/omx_vdec.h16
-rw-r--r--mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc.cpp10
-rw-r--r--mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc_swvdec.cpp12
-rw-r--r--mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp70
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