From 2ed8844684c86806bbd2d4df5c414bc41aa18889 Mon Sep 17 00:00:00 2001
From: Gokul S <g-s@ti.com>
Date: Fri, 28 Nov 2025 18:38:45 +0530
Subject: [PATCH] final

Signed-off-by: Gokul S <g-s@ti.com>
---
 apps/dl_demos/app_tidl_avp4/app_common.h |   2 +-
 apps/dl_demos/app_tidl_avp4/main.c       | 194 +++++++++++++++++++----
 2 files changed, 166 insertions(+), 30 deletions(-)

diff --git a/apps/dl_demos/app_tidl_avp4/app_common.h b/apps/dl_demos/app_tidl_avp4/app_common.h
index e2f2450..e0b9654 100644
--- a/apps/dl_demos/app_tidl_avp4/app_common.h
+++ b/apps/dl_demos/app_tidl_avp4/app_common.h
@@ -70,7 +70,7 @@
 // #define APP_DEBUG
 //#define APP_WRITE_INTERMEDIATE_OUTPUTS
 
-#define APP_TIVX_LOG_RT_ENABLE
+// #define APP_TIVX_LOG_RT_ENABLE
 
 #define APP_MAX_FILE_PATH           (256u)
 #define APP_ASSERT(x)               assert((x))
diff --git a/apps/dl_demos/app_tidl_avp4/main.c b/apps/dl_demos/app_tidl_avp4/main.c
index 795cd09..9da490b 100644
--- a/apps/dl_demos/app_tidl_avp4/main.c
+++ b/apps/dl_demos/app_tidl_avp4/main.c
@@ -107,6 +107,11 @@ typedef struct {
     ImgHistObj    imgHistObj;
     PyramidObj    pyramidObj;
     DofProcObj    dofProcObj;
+    vx_object_array viss_output_arr[APP_BUFFER_Q_DEPTH];
+    vx_image viss_output_img[APP_BUFFER_Q_DEPTH];
+    uint32_t viss_graph_parameter_index;
+    uint32_t ldc_graph_parameter_index;
+    uint32_t srv_graph_parameter_index;
 
     vx_char input_file_path[APP_MAX_FILE_PATH];
     vx_char output_file_path[APP_MAX_FILE_PATH];
@@ -114,7 +119,8 @@ typedef struct {
     /* OpenVX references */
     vx_context context;
     vx_graph   graph;
-
+    vx_graph   od_graph;
+    vx_graph   srv_graph;
     vx_uint32 is_interactive;
 
     vx_uint32 num_frames_to_run;
@@ -123,6 +129,7 @@ typedef struct {
     vx_uint32 num_frames_to_skip;
 
     tivx_task task;
+    tivx_task od_graph_task;
     vx_uint32 stop_task;
     vx_uint32 stop_task_done;
 
@@ -135,6 +142,7 @@ typedef struct {
     int32_t pipeline;
     int32_t enqueueCnt;
     int32_t dequeueCnt;
+    int32_t od_pipeline;
 
     int32_t enable_capture;
     int32_t enable_viss;
@@ -269,6 +277,8 @@ static vx_status app_run_graph_interactive(AppObj *obj)
                 case 'p':
                     appPerfStatsPrintAll();
                     tivx_utils_graph_perf_print(obj->graph);
+                    tivx_utils_graph_perf_print(obj->od_graph);
+                    tivx_utils_graph_perf_print(obj->srv_graph);
                     appPerfPointPrint(&obj->fileio_perf);
                     appPerfPointPrint(&obj->total_perf);
                     printf("\n");
@@ -1122,6 +1132,11 @@ static void app_deinit(AppObj *obj)
         APP_PRINTF("Capture deinit done!\n");
     }
 
+    for(int i=0;i< APP_BUFFER_Q_DEPTH; i++){
+        vxReleaseObjectArray(&obj->viss_output_arr[i]);
+        vxReleaseImage(&obj->viss_output_img[i]);
+    }
+
     if(obj->enable_viss == 1)
     {
         app_deinit_viss(&obj->vissObj);
@@ -1304,6 +1319,8 @@ static void app_delete_graph(AppObj *obj)
     #endif
 
     vxReleaseGraph(&obj->graph);
+    vxReleaseGraph(&obj->od_graph);
+    vxReleaseGraph(&obj->srv_graph);
     APP_PRINTF("Graph delete done!\n");
 }
 
@@ -1311,11 +1328,23 @@ static vx_status app_create_graph(AppObj *obj)
 {
     vx_status status = VX_SUCCESS;
     vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[2];
+    vx_graph_parameter_queue_params_t od_graph_parameters_queue_params_list[2];
+    vx_graph_parameter_queue_params_t srv_graph_parameters_queue_params_list[2];
     vx_int32 graph_parameter_index;
+    vx_int32 od_graph_parameter_index;
+    vx_int32 srv_graph_parameter_index;
 
     obj->graph = vxCreateGraph(obj->context);
     status = vxGetStatus((vx_reference)obj->graph);
-    vxSetReferenceName((vx_reference)obj->graph, "app_tidl_avp4_graph");
+    vxSetReferenceName((vx_reference)obj->graph, "app_capture_avp4_graph");
+    obj->od_graph = vxCreateGraph(obj->context);
+    status = vxGetStatus((vx_reference)obj->od_graph);
+    vxSetReferenceName((vx_reference)obj->od_graph, "app_tidl_avp4_graph");
+    obj->srv_graph = vxCreateGraph(obj->context);
+    status = vxGetStatus((vx_reference)obj->srv_graph);
+    vxSetReferenceName((vx_reference)obj->srv_graph, "app_srv_avp4_graph");
+
+
     APP_PRINTF("Graph create done!\n");
 
     if((status == VX_SUCCESS) && (obj->enable_capture == 1))
@@ -1323,7 +1352,26 @@ static vx_status app_create_graph(AppObj *obj)
         status = app_create_graph_capture(obj->graph, &obj->captureObj);
         APP_PRINTF("Capture graph done!\n");
     }
+    uint32_t img_width  = obj->sensorObj.sensorParams.sensorInfo.raw_params.width;
+    uint32_t img_height = obj->sensorObj.sensorParams.sensorInfo.raw_params.height;
 
+    vx_image viss_output_img = vxCreateImage(obj->context, img_width, img_height, VX_DF_IMAGE_NV12);
+    status = vxGetStatus((vx_reference)viss_output_img);
+    for(int i=0;i< APP_BUFFER_Q_DEPTH; i++){
+        if(status == VX_SUCCESS)
+        {
+            obj->viss_output_arr[i] = vxCreateObjectArray(obj->context, (vx_reference)viss_output_img, obj->sensorObj.num_cameras_enabled);
+            obj->viss_output_img[i] = (vx_image)vxGetObjectArrayItem(obj->viss_output_arr[i], 0);
+            status = vxGetStatus((vx_reference)obj->viss_output_arr[i]);
+            if(status != VX_SUCCESS)
+            {
+                printf("ERROR \n");
+            }
+        }
+    }
+    vxReleaseImage(&viss_output_img);
+    vxReleaseObjectArray(&obj->vissObj.output_arr);
+    obj->vissObj.output_arr = obj->viss_output_arr[0];
     if((status == VX_SUCCESS) && (obj->enable_viss == 1))
     {
         status = app_create_graph_viss(obj->graph, &obj->vissObj, obj->captureObj.raw_image_arr[0], TIVX_TARGET_VPAC_VISS1);
@@ -1338,7 +1386,7 @@ static vx_status app_create_graph(AppObj *obj)
 
     if((status == VX_SUCCESS) && (obj->enable_srv == 1))
     {
-        status = app_create_graph_srv(obj->context, obj->graph, &obj->srvObj, obj->vissObj.output_arr);
+        status = app_create_graph_srv(obj->context, obj->srv_graph, &obj->srvObj, obj->vissObj.output_arr);
         APP_PRINTF("SRV graph done!\n");
     }
 
@@ -1346,7 +1394,7 @@ static vx_status app_create_graph(AppObj *obj)
     {
         if(status == VX_SUCCESS)
         {
-            status = app_create_graph_ldc(obj->graph, &obj->ldcObj, obj->vissObj.output_arr, TIVX_TARGET_VPAC_LDC1);
+            status = app_create_graph_ldc(obj->od_graph, &obj->ldcObj, obj->viss_output_arr[0], TIVX_TARGET_VPAC_LDC1);
             APP_PRINTF("LDC graph done!\n");
         }
     }
@@ -1355,11 +1403,11 @@ static vx_status app_create_graph(AppObj *obj)
     {
         if(obj->enable_ldc == 1)
         {
-            app_create_graph_scaler(obj->context, obj->graph, &obj->scalerObj, obj->ldcObj.output_arr);
+            app_create_graph_scaler(obj->context, obj->od_graph, &obj->scalerObj, obj->ldcObj.output_arr);
         }
         else
         {
-            app_create_graph_scaler(obj->context, obj->graph, &obj->scalerObj, obj->vissObj.output_arr);
+            app_create_graph_scaler(obj->context, obj->od_graph, &obj->scalerObj, obj->vissObj.output_arr);
         }
         APP_PRINTF("Scaler graph done!\n");
     }
@@ -1368,11 +1416,11 @@ static vx_status app_create_graph(AppObj *obj)
     {
         if(obj->enable_ldc == 1)
         {
-            app_create_graph_img_hist(obj->graph, &obj->imgHistObj, obj->ldcObj.output_arr);
+            app_create_graph_img_hist(obj->od_graph, &obj->imgHistObj, obj->ldcObj.output_arr);
         }
         else
         {
-            app_create_graph_img_hist(obj->graph, &obj->imgHistObj, obj->vissObj.output_arr);
+            app_create_graph_img_hist(obj->od_graph, &obj->imgHistObj, obj->vissObj.output_arr);
         }
         APP_PRINTF("Img Hist graph done!\n");
     }
@@ -1386,10 +1434,10 @@ static vx_status app_create_graph(AppObj *obj)
 #endif
         if(obj->dofProcObj.enable_temporal_predicton_flow_vector == 1)
         {
-            vxRegisterAutoAging(obj->graph, obj->dofProcObj.flow_vector_field_delay);
+            vxRegisterAutoAging(obj->od_graph, obj->dofProcObj.flow_vector_field_delay);
         }
 
-        app_create_graph_dof_proc(obj->graph, &obj->dofProcObj, obj->pyramidObj.pyramid_delay);
+        app_create_graph_dof_proc(obj->od_graph, &obj->dofProcObj, obj->pyramidObj.pyramid_delay);
 
 
         APP_PRINTF("DOF graph done!\n");
@@ -1397,19 +1445,19 @@ static vx_status app_create_graph(AppObj *obj)
 
     if((status == VX_SUCCESS) && (obj->enable_pre_proc == 1))
     {
-        app_create_graph_pre_proc(obj->graph, &obj->preProcObj, obj->scalerObj.output[0].arr);
+        app_create_graph_pre_proc(obj->od_graph, &obj->preProcObj, obj->scalerObj.output[0].arr);
         APP_PRINTF("Pre proc graph done!\n");
     }
 
     if((status == VX_SUCCESS) && (obj->enable_tidl == 1))
     {
-        app_create_graph_tidl(obj->context, obj->graph, &obj->tidlObj, obj->preProcObj.output_tensor_arr);
+        app_create_graph_tidl(obj->context, obj->od_graph, &obj->tidlObj, obj->preProcObj.output_tensor_arr);
         APP_PRINTF("TIDL graph done!\n");
     }
 
     if((status == VX_SUCCESS) && (obj->enable_post_proc == 1))
     {
-        app_create_graph_post_proc(obj->graph, &obj->postProcObj, obj->scalerObj.output[0].arr, obj->tidlObj.out_args_arr, obj->tidlObj.output_tensor_arr[0]);
+        app_create_graph_post_proc(obj->od_graph, &obj->postProcObj, obj->scalerObj.output[0].arr, obj->tidlObj.out_args_arr, obj->tidlObj.output_tensor_arr[0]);
         APP_PRINTF("Post proc graph done!\n");
     }
 
@@ -1431,13 +1479,13 @@ static vx_status app_create_graph(AppObj *obj)
             obj->imgMosaicObj.num_inputs = idx;
         }
 
-        status = app_create_graph_img_mosaic(obj->graph, &obj->imgMosaicObj, NULL);
+        status = app_create_graph_img_mosaic(obj->od_graph, &obj->imgMosaicObj, NULL);
         APP_PRINTF("Img Mosaic graph done!\n");
     }
 
     if((status == VX_SUCCESS) && (obj->enable_display == 1))
     {
-        status = app_create_graph_display(obj->graph, &obj->displayObj, obj->imgMosaicObj.output_image[0]);
+        status = app_create_graph_display(obj->od_graph, &obj->displayObj, obj->imgMosaicObj.output_image[0]);
         APP_PRINTF("Display graph done!\n");
     }
 
@@ -1454,6 +1502,15 @@ static vx_status app_create_graph(AppObj *obj)
             graph_parameters_queue_params_list[graph_parameter_index].refs_list = (vx_reference*)&obj->captureObj.raw_image_arr[0];
             graph_parameter_index++;
         }
+        if(obj->enable_viss){
+            // viss output as graph parameter
+            add_graph_parameter_by_node_index(obj->graph, obj->vissObj.node, 6);
+            obj->viss_graph_parameter_index = graph_parameter_index;
+            graph_parameters_queue_params_list[graph_parameter_index].graph_parameter_index = graph_parameter_index;
+            graph_parameters_queue_params_list[graph_parameter_index].refs_list_size = APP_BUFFER_Q_DEPTH;
+            graph_parameters_queue_params_list[graph_parameter_index].refs_list = (vx_reference*)&obj->viss_output_img[0];
+            graph_parameter_index++;
+        }
 
         vxSetGraphScheduleConfig(obj->graph,
                 VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
@@ -1464,7 +1521,7 @@ static vx_status app_create_graph(AppObj *obj)
 
         if(obj->enable_viss == 1)
         {
-            tivxSetNodeParameterNumBufByIndex(obj->vissObj.node, 6, APP_BUFFER_Q_DEPTH);
+            // tivxSetNodeParameterNumBufByIndex(obj->vissObj.node, 6, APP_BUFFER_Q_DEPTH); // output set as graph parameter
             tivxSetNodeParameterNumBufByIndex(obj->vissObj.node, 9, APP_BUFFER_Q_DEPTH);
         }
 
@@ -1473,6 +1530,37 @@ static vx_status app_create_graph(AppObj *obj)
             tivxSetNodeParameterNumBufByIndex(obj->aewbObj.node, 4, APP_BUFFER_Q_DEPTH);
         }
 
+        od_graph_parameter_index = 0;
+        // ldc_input as graph parameter
+        add_graph_parameter_by_node_index(obj->od_graph, obj->ldcObj.node, 6); //6th parameter is input
+        obj->ldc_graph_parameter_index = od_graph_parameter_index;
+        od_graph_parameters_queue_params_list[od_graph_parameter_index].graph_parameter_index = od_graph_parameter_index;
+        od_graph_parameters_queue_params_list[od_graph_parameter_index].refs_list_size = APP_BUFFER_Q_DEPTH;
+        od_graph_parameters_queue_params_list[od_graph_parameter_index].refs_list = (vx_reference*)&obj->viss_output_img[0];
+        od_graph_parameter_index++;
+
+        vxSetGraphScheduleConfig(obj->od_graph,
+            VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+            od_graph_parameter_index,
+            od_graph_parameters_queue_params_list);
+
+        srv_graph_parameter_index = 0;
+        // ldc_input as graph parameter
+        add_graph_parameter_by_node_index(obj->srv_graph, obj->srvObj.node, 1); //1st parameter is input
+        obj->srv_graph_parameter_index = srv_graph_parameter_index;
+        srv_graph_parameters_queue_params_list[srv_graph_parameter_index].graph_parameter_index = srv_graph_parameter_index;
+        srv_graph_parameters_queue_params_list[srv_graph_parameter_index].refs_list_size = APP_BUFFER_Q_DEPTH;
+        srv_graph_parameters_queue_params_list[srv_graph_parameter_index].refs_list = (vx_reference*)&obj->viss_output_arr[0];
+        srv_graph_parameter_index++;
+
+        vxSetGraphScheduleConfig(obj->srv_graph,
+            VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO,
+            srv_graph_parameter_index,
+            srv_graph_parameters_queue_params_list);
+
+        tivxSetGraphPipelineDepth(obj->od_graph, APP_PIPELINE_DEPTH);
+        tivxSetGraphPipelineDepth(obj->srv_graph, APP_PIPELINE_DEPTH);
+
         if(obj->enable_ldc == 1)
         {
             tivxSetNodeParameterNumBufByIndex(obj->ldcObj.node, 7, APP_BUFFER_Q_DEPTH);
@@ -1522,6 +1610,8 @@ static vx_status app_verify_graph(AppObj *obj)
     vx_status status = VX_SUCCESS;
 
     status = vxVerifyGraph(obj->graph);
+    status = vxVerifyGraph(obj->od_graph);
+    status = vxVerifyGraph(obj->srv_graph);
 
     if(status == VX_SUCCESS)
     {
@@ -1531,12 +1621,17 @@ static vx_status app_verify_graph(AppObj *obj)
     #if 1
     if(VX_SUCCESS == status)
     {
-        status = tivxExportGraphToDot(obj->graph,".", "vx_app_tidl_avp4");
+        status = tivxExportGraphToDot(obj->graph,".", "vx_app_tidl_avp4_srv");
     }
     #endif
+    if(VX_SUCCESS == status)
+    {
+        status = tivxExportGraphToDot(obj->od_graph,".", "vx_app_tidl_avp4_od");
+    }
 
     #ifdef APP_TIVX_LOG_RT_ENABLE
     tivxLogRtTraceEnable(obj->graph);
+    tivxLogRtTraceEnable(obj->od_graph);
     #endif
 
     if (obj->captureObj.enable_error_detection)
@@ -1576,6 +1671,7 @@ static vx_status app_run_graph_for_one_frame_sequential(AppObj *obj, vx_int32 fr
 static vx_status app_run_graph_for_one_frame_pipeline(AppObj *obj, vx_int32 frame_id)
 {
     vx_status status = VX_SUCCESS;
+    static uint32_t share_buf_count;
 
     appPerfPointBegin(&obj->total_perf);
 
@@ -1590,6 +1686,10 @@ static vx_status app_run_graph_for_one_frame_pipeline(AppObj *obj, vx_int32 fram
         {
             vxGraphParameterEnqueueReadyRef(obj->graph, captureObj->graph_parameter_index, (vx_reference*)&captureObj->raw_image_arr[obj->enqueueCnt], 1);
         }
+        if(obj->enable_viss == 1)
+        {
+            vxGraphParameterEnqueueReadyRef(obj->graph, obj->viss_graph_parameter_index, (vx_reference*)&obj->viss_output_img[obj->enqueueCnt], 1);
+        }
 
         obj->enqueueCnt++;
         obj->enqueueCnt   = (obj->enqueueCnt  >= APP_BUFFER_Q_DEPTH)? 0 : obj->enqueueCnt;
@@ -1603,6 +1703,11 @@ static vx_status app_run_graph_for_one_frame_pipeline(AppObj *obj, vx_int32 fram
         {
             vxGraphParameterEnqueueReadyRef(obj->graph, captureObj->graph_parameter_index, (vx_reference*)&captureObj->raw_image_arr[obj->enqueueCnt], 1);
         }
+        if(obj->enable_viss == 1)
+        {
+            vxGraphParameterEnqueueReadyRef(obj->graph, obj->viss_graph_parameter_index, (vx_reference*)&obj->viss_output_img[obj->enqueueCnt], 1);
+        }
+
         obj->enqueueCnt++;
         obj->enqueueCnt   = (obj->enqueueCnt  >= APP_BUFFER_Q_DEPTH)? 0 : obj->enqueueCnt;
         obj->pipeline++;
@@ -1611,27 +1716,57 @@ static vx_status app_run_graph_for_one_frame_pipeline(AppObj *obj, vx_int32 fram
     if(obj->pipeline > 0)
     {
         vx_reference raw_image;
+        vx_reference viss_output_img, viss_output_obj_arr;
         uint32_t num_refs;
 
         if(obj->enable_capture == 1)
         {
             /* Dequeue input */
-            vxGraphParameterDequeueDoneRef(obj->graph, captureObj->graph_parameter_index, (vx_reference*)&raw_image, 1, &num_refs);
+            vxGraphParameterDequeueDoneRef(obj->graph, obj->captureObj.graph_parameter_index, (vx_reference*)&raw_image, 1, &num_refs);
         }
 
-    if(obj->enable_capture == 1)
-    {
-        /* Enqueue input - start execution */
-        vxGraphParameterEnqueueReadyRef(obj->graph, captureObj->graph_parameter_index, &raw_image, 1);
-    }
+        if(obj->enable_capture == 1)
+        {
+            /* Enqueue input - start execution */
+            vxGraphParameterEnqueueReadyRef(obj->graph, obj->captureObj.graph_parameter_index, &raw_image, 1);
+        }
 
-    obj->enqueueCnt++;
-    obj->dequeueCnt++;
+        vxGraphParameterDequeueDoneRef(obj->graph, obj->viss_graph_parameter_index, (vx_reference*)&viss_output_img, 1, &num_refs);
 
-    obj->enqueueCnt = (obj->enqueueCnt >= APP_BUFFER_Q_DEPTH)? 0 : obj->enqueueCnt;
-    obj->dequeueCnt = (obj->dequeueCnt >= APP_BUFFER_Q_DEPTH)? 0 : obj->dequeueCnt;
+        if(share_buf_count < APP_BUFFER_Q_DEPTH/2)
+        {
+            // just enqueue the buffers to srv_graph and od_graph so that all 3 graphs have buffers to process
+            // if APP_BUFFER_Q_DEPTH == 2 then 2 buffers are given for main_graph and the 2 buffers are given for other 2 (od, srv) graph
+            // increase the APP_BUFFER_Q_DEPTH if more buffers are needed across different graphs
+            //viss_output is a image get the parent and then enqueue because srv_node input is obj_array
+            viss_output_obj_arr = tivxGetReferenceParent(viss_output_img );
+            vxGraphParameterEnqueueReadyRef(obj->srv_graph, obj->srv_graph_parameter_index, &viss_output_obj_arr, 1);
+            vxGraphParameterEnqueueReadyRef(obj->od_graph, obj->ldc_graph_parameter_index, &viss_output_img, 1);    
+
+            share_buf_count++;
+        }
+        else
+        {
+            // here dequeue the buffers from (od,srv) graph and enqueue it back to main_graph to circulate the buffers b/w graphs
+            //viss_output is a image get the parent and then enqueue because srv_node input is obj_array
+            viss_output_obj_arr = tivxGetReferenceParent(viss_output_img );
+            vxGraphParameterEnqueueReadyRef(obj->srv_graph, obj->srv_graph_parameter_index, &viss_output_obj_arr, 1);
+            vxGraphParameterEnqueueReadyRef(obj->od_graph, obj->ldc_graph_parameter_index, &viss_output_img, 1);
+                
+            vxGraphParameterDequeueDoneRef(obj->srv_graph, obj->srv_graph_parameter_index, (vx_reference*)&viss_output_obj_arr, 1, &num_refs); // simply dequeue as we are dequeuing the reference from do_graph
+            vxGraphParameterDequeueDoneRef(obj->od_graph, obj->ldc_graph_parameter_index, (vx_reference*)&viss_output_img, 1, &num_refs); 
+
+            // viss_output_img = vxGetObjectArrayItem((vx_object_array)viss_output_obj_arr, 0 ); // get element from obj_arr because srv node dequeues an obj_array
+            vxGraphParameterEnqueueReadyRef(obj->graph, obj->viss_graph_parameter_index, &viss_output_img, 1);
+        }
+        
+        obj->enqueueCnt++;
+        obj->dequeueCnt++;
+
+        obj->enqueueCnt = (obj->enqueueCnt >= APP_BUFFER_Q_DEPTH)? 0 : obj->enqueueCnt;
+        obj->dequeueCnt = (obj->dequeueCnt >= APP_BUFFER_Q_DEPTH)? 0 : obj->dequeueCnt;
 
-  }
+    }
 
   appPerfPointEnd(&obj->total_perf);
 
@@ -1700,7 +1835,7 @@ static vx_status app_run_graph(AppObj *obj)
     }
 
     obj->stop_task = 1;
-
+    tivxTaskWaitMsecs(100);
     if(obj->enable_capture == 1)
     {
         status = appStopImageSensor(obj->sensorObj.sensor_name, ((1 << sensorObj->num_cameras_enabled) - 1));
@@ -1726,6 +1861,7 @@ static void app_pipeline_params_defaults(AppObj *obj)
     obj->pipeline       = -APP_BUFFER_Q_DEPTH + 1;
     obj->enqueueCnt     = 0;
     obj->dequeueCnt     = 0;
+    obj->od_pipeline    = -APP_BUFFER_Q_DEPTH + 1;
 }
 
 static void set_sensor_defaults(SensorObj *sensorObj)
-- 
2.34.1

