mm-video-v4l2: send config update event for valid fbd

-- Send event config update prior to corresponding valid FBD
-- Serialize (using FIFO) getConfig to retrieve corresponding
   HDR10+ metadata.

Change-Id: I652949034700d280d1024f9fae2f6d6091febed5
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 9050049..eb0db84 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp
@@ -1073,41 +1073,36 @@
                     }
                     break;
                 case OMX_COMPONENT_GENERATE_FBD:
-                                        if (p2 != VDEC_S_SUCCESS) {
-                                            DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure");
-                                            pThis->omx_report_error ();
-                                            break;
-                                        }
-                                        if (pThis->fill_buffer_done(&pThis->m_cmp,
-                                                    (OMX_BUFFERHEADERTYPE *)(intptr_t)p1) != OMX_ErrorNone ) {
-                                            DEBUG_PRINT_ERROR("fill_buffer_done failure");
-                                            pThis->omx_report_error ();
-                                            break;
-                                        }
+                    if (p2 != VDEC_S_SUCCESS) {
+                        DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_FBD failure");
+                        pThis->omx_report_error ();
+                        break;
+                    }
 #if !HDR10_SETMETADATA_ENABLE
-                                        if (pThis->output_capability != V4L2_PIX_FMT_VP9 &&
-                                            pThis->output_capability != V4L2_PIX_FMT_HEVC)
-                                            break;
-
-                                        if (!pThis->m_cb.EventHandler) {
-                                            DEBUG_PRINT_ERROR("fill_buffer_done: null event handler");
-                                            break;
-                                        }
-                                        bool is_list_empty;
-                                        is_list_empty = false;
-                                        pthread_mutex_lock(&pThis->m_hdr10pluslock);
-                                        is_list_empty = pThis->m_hdr10pluslist.empty();
-                                        pthread_mutex_unlock(&pThis->m_hdr10pluslock);
-                                        if (!is_list_empty) {
-                                            DEBUG_PRINT_LOW("fill_buffer_done: event config update");
-                                            pThis->m_cb.EventHandler(&pThis->m_cmp,
-                                                    pThis->m_app_data,
-                                                    OMX_EventConfigUpdate,
-                                                    OMX_CORE_OUTPUT_PORT_INDEX,
-                                                    OMX_QTIIndexConfigDescribeHDR10PlusInfo, NULL);
-                                        }
+                    if (pThis->m_cb.EventHandler) {
+                        OMX_BUFFERHEADERTYPE * buffer = (OMX_BUFFERHEADERTYPE *)(intptr_t)p1;
+                        if (buffer->nFilledLen && (pThis->output_capability == V4L2_PIX_FMT_HEVC ||
+                            (pThis->output_capability == V4L2_PIX_FMT_VP9 && buffer->pMarkData))) {
+                           bool is_list_empty;
+                           is_list_empty = false;
+                           pthread_mutex_lock(&pThis->m_hdr10pluslock);
+                           is_list_empty = pThis->m_hdr10pluslist.empty();
+                           pthread_mutex_unlock(&pThis->m_hdr10pluslock);
+                           if (!is_list_empty) {
+                               DEBUG_PRINT_LOW("fill_buffer_done: event config update");
+                               pThis->m_cb.EventHandler(&pThis->m_cmp, pThis->m_app_data,
+                                       OMX_EventConfigUpdate, OMX_CORE_OUTPUT_PORT_INDEX,
+                                       OMX_QTIIndexConfigDescribeHDR10PlusInfo, NULL);
+                           }
+                        }
+                    }
 #endif
-                                        break;
+                    if (pThis->fill_buffer_done(&pThis->m_cmp,
+                               (OMX_BUFFERHEADERTYPE *)(intptr_t)p1) != OMX_ErrorNone ) {
+                        DEBUG_PRINT_ERROR("fill_buffer_done failure");
+                        pThis->omx_report_error ();
+                    }
+                    break;
 
                 case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH:
                                         DEBUG_PRINT_HIGH("Driver flush i/p Port complete, flags %#llx",
@@ -8019,6 +8014,7 @@
     m_extradata_misr.output_crop_updated = OMX_FALSE;
     data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
     if (data) {
+        bool is_hdr10_plus_info_found = false;
         while ((((consumed_len + sizeof(struct OMX_OTHER_EXTRADATATYPE)) <
                 drv_ctx.extradata_info.buffer_size) && ((consumed_len + data->nSize) <
                 drv_ctx.extradata_info.buffer_size))
@@ -8135,7 +8131,10 @@
                             memcpy(color_mdata.dynamicMetaDataPayload, userdata_payload->data, payload_len);
                             DEBUG_PRINT_HIGH("Copied %u bytes of HDR10+ extradata", payload_len);
 #else
-                            store_hevc_hdr10plusinfo(payload_len, userdata_payload);
+                            if(!is_hdr10_plus_info_found) {
+                               store_hevc_hdr10plusinfo(payload_len, userdata_payload);
+                               is_hdr10_plus_info_found = true;
+                            }
 #endif
                         }
                     }
@@ -9109,7 +9108,7 @@
     memset(&metadata, 0, sizeof(struct hdr10plusInfo));
     metadata.nParamSizeUsed = payload_size;
     memcpy(metadata.payload, hdr10plusdata->data , payload_size);
-    metadata.is_new = true;
+    metadata.is_new = false;
     if (m_etb_count) {
         metadata.timestamp = m_etb_timestamp + 1;
     }
@@ -9258,7 +9257,6 @@
 
 void omx_vdec::get_hdr10plusinfo(DescribeHDR10PlusInfoParams *hdr10plusdata)
 {
-    std::list<hdr10plusInfo>::iterator iter;
     bool is_list_empty = false;
 
     if (output_capability != V4L2_PIX_FMT_VP9 &&
@@ -9275,19 +9273,12 @@
     }
 
     pthread_mutex_lock(&m_hdr10pluslock);
-    iter = m_hdr10pluslist.begin();
-    while (iter != m_hdr10pluslist.end()) {
-        if (!iter->is_new) {
-            hdr10plusdata->nParamSizeUsed = iter->nParamSizeUsed;
-            memcpy(hdr10plusdata->nValue, iter->payload,
-                iter->nParamSizeUsed);
-            DEBUG_PRINT_LOW("found hdr10plus metadata with timestamp %lld, size %u",
-                iter->timestamp, iter->nParamSizeUsed);
-            iter = m_hdr10pluslist.erase(iter);
-            break;
-        }
-        iter++;
-    }
+    hdr10plusInfo item = m_hdr10pluslist.front();
+    hdr10plusdata->nParamSizeUsed = item.nParamSizeUsed;
+    memcpy(hdr10plusdata->nValue, item.payload,item.nParamSizeUsed);
+    DEBUG_PRINT_LOW("found hdr10plus metadata with timestamp %lld, size %u",
+        item.timestamp, item.nParamSizeUsed);
+    m_hdr10pluslist.pop_front();
     pthread_mutex_unlock(&m_hdr10pluslock);
 }