summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGovindaraj Rajagopal <grajagop@codeaurora.org>2019-09-13 21:30:20 +0530
committerSanjay Singh <sisanj@codeaurora.org>2020-11-03 15:16:47 +0530
commit08af428cf849e0a35af4220cc7039940d31deaea (patch)
tree70edf26c677e40e3f2a93630c52f5714bad09c3e
parent3f7470b867ebc3e01c2f96300b7187ae7e84262c (diff)
downloadmedia-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.cpp23
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");