diff options
author | Govindaraj Rajagopal <grajagop@codeaurora.org> | 2019-09-13 21:30:20 +0530 |
---|---|---|
committer | Sanjay Singh <sisanj@codeaurora.org> | 2020-11-03 15:16:47 +0530 |
commit | 08af428cf849e0a35af4220cc7039940d31deaea (patch) | |
tree | 70edf26c677e40e3f2a93630c52f5714bad09c3e | |
parent | 3f7470b867ebc3e01c2f96300b7187ae7e84262c (diff) | |
download | media-08af428cf849e0a35af4220cc7039940d31deaea.tar.gz |
mm-video-v4l2: vdec: add special handling for codec_config buffer
[1] During flush, current implementation allows codec_config buffer to
send it to firmware, even there is no sufficient FTB buffers avaliable
with firmware. So VideoDecMsgThread thread is waiting on codec_config
EBD for 2 sec and that lead to timeout in pre-roll logic at framework.
So framework treats that as a corrupted clip and closes video session
and proceeds with only audio.
[2] To handle this situation, send outstanding FTB buffers to firmware,
before queuing codec_config ETB's.
Change-Id: I5df3bada976cab282a41b3cb2b836ed468d37615
Signed-off-by: Govindaraj Rajagopal <grajagop@codeaurora.org>
Signed-off-by: Sanjay Singh <sisanj@codeaurora.org>
-rw-r--r-- | mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp index 97bb7d20..24b4230f 100644 --- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp +++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp @@ -3142,7 +3142,7 @@ OMX_ERRORTYPE omx_vdec::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp, struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); - ts.tv_sec += 2; + ts.tv_sec += 1; DEBUG_PRINT_LOW("waiting for %d EBDs of CODEC CONFIG buffers ", m_queued_codec_config_count); BITMASK_SET(&m_flags, OMX_COMPONENT_FLUSH_DEFERRED); @@ -12809,9 +12809,9 @@ bool omx_vdec::allocate_color_convert_buf::get_color_format(OMX_COLOR_FORMATTYPE void omx_vdec::send_codec_config() { if (codec_config_flag) { - unsigned long p1 = 0; // Parameter - 1 - unsigned long p2 = 0; // Parameter - 2 - unsigned long ident = 0; + unsigned long p1 = 0, p2 = 0; + unsigned long p3 = 0, p4 = 0; + unsigned long ident = 0, ident2 = 0; pthread_mutex_lock(&m_lock); DEBUG_PRINT_LOW("\n Check Queue for codec_config buffer \n"); while (m_etb_q.m_size) { @@ -12829,6 +12829,21 @@ void omx_vdec::send_codec_config() { } } else if (ident == OMX_COMPONENT_GENERATE_ETB) { if (((OMX_BUFFERHEADERTYPE *)p2)->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { + while (m_ftb_q.m_size) { + m_ftb_q.pop_entry(&p3,&p4,&ident2); + if (ident2 == OMX_COMPONENT_GENERATE_FTB) { + pthread_mutex_unlock(&m_lock); + if (fill_this_buffer_proxy((OMX_HANDLETYPE)p3,\ + (OMX_BUFFERHEADERTYPE *)p4) != OMX_ErrorNone) { + DEBUG_PRINT_ERROR("\n fill_this_buffer_proxy failure"); + omx_report_error (); + } + pthread_mutex_lock(&m_lock); + } else if (ident2 == OMX_COMPONENT_GENERATE_FBD) { + fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p3); + } + } + pthread_mutex_unlock(&m_lock); if (empty_this_buffer_proxy((OMX_HANDLETYPE)p1,\ (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { DEBUG_PRINT_ERROR("\n empty_this_buffer_proxy failure"); |