This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Image captured by DM1868 is blurry

Hi,

I'm using DN8168 to capture from computer video card, but quality of image is very bad.

If replace DEI link with a scaler link, image is OK, but framerate is low, a lot of frames is lost! And, when i set mcfw link to mulit-panels, the quality of image is also changed to bad.

Thanks!

  • Hello,

    What is the software release that you are using here?

    BR
    Margarita
  • Hi, Margarita

    I'm using RDK V04.00.00.03, and my usecase is based on multichhd_vcap_venc_vdis.

    BR

    Huo

  • Hello,

    e2e.ti.com/.../224844

    or you could search in the e2e for similar issue.

    BR
    Margarita
  • Below attached files is my image, usecase  source and run log, Anyone can help me? Thanks!

    LUBO>info
     
     
     [m3vpss ]  
     [m3vpss ]  *** Capture Driver Advanced Statistics *** 
     [m3vpss ]  
     [m3vpss ]  VIP Parser Reset Count : 0
     [m3vpss ]  
     [m3vpss ]      |   Total    Even     Odd  Total  Even   Odd  Min /  Max  Min /  Max Dropped Fid Repeat Frame Error Y/C
     [m3vpss ]  CH  |  Fields  Fields  Fields    FPS   FPS   FPS       Width      Height  Fields      Count (Desc Error Y/C)
     [m3vpss ]  ------------------------------------------------------------------------------------------------------------
     [m3vpss ]  000 |    6741    6741       0     49    49     0 1920 / 1920 1080 / 1080      34          0 0/0 (0/0)
     [m3vpss ]  200 |    8127    8127       0     60    60     0 1920 / 1920 1080 / 1080      32          0 0/0 (0/0)
     [m3vpss ]  
     [m3vpss ]  VIP Capture Port 0 | DescMissMatch1 = 0, DescMissMatch2 = 0 , DescMissMatch3 = 0 
     [m3vpss ]  VIP Capture Port 2 | DescMissMatch1 = 0, DescMissMatch2 = 0 , DescMissMatch3 = 0 
     [m3vpss ]  
     [m3vpss ]  *** Capture List Manager Advanced Statistics *** 
     [m3vpss ]  
     [m3vpss ]  List Post Count        : 33868 
     [m3vpss ]  List Stall Count       : 0 
     [m3vpss ]  List Post Time (ms)    : Max = 0, Min = 0, Avg = 0, Total = 0 
     [m3vpss ]  INTC Timeout Count     : (0, 0) (Min timeout value = 977, 989) 
     [m3vpss ]  Descriptor miss found count : 0 
     [m3vpss ]  
     [m3vpss ]  
     [m3vpss ]  VIP and VPDMA registers, 
     [m3vpss ]  VIP0 : FIQ_STATUS  : 0x4810551c = 0x00000000
     [m3vpss ]  VIP1 : FIQ_STATUS  : 0x48105a1c = 0x00000000
     [m3vpss ]  VPDMA: LIST_BUSY   : 0x4810d00c = 0x00120000
     [m3vpss ]  
     [m3vpss ]  
     [m3vpss ]  145526: CAPTURE: Fields = 14802 (fps = 109, CPU Load = 0)
     [m3vpss ]  145526: CAPTURE: Num Resets = 0 (Avg 0 ms per reset)
     [m3vpss ]  145526: SYSTEM  : FREE SPACE : System Heap      = 67024 B, Mbx = 10239 msgs) 
     [m3vpss ]  145527: SYSTEM  : FREE SPACE : SR0 Heap         = 8713728 B (8 MB) 
     [m3vpss ]  145527: SYSTEM  : FREE SPACE : Frame Buffer     = 166930304 B (159 MB) 
     [m3vpss ]  145527: SYSTEM  : FREE SPACE : Bitstream Buffer = 159338368 B (151 MB) 
     [m3vpss ] TILER_STATS: CNT :8BIT
     [m3vpss ] TILER_STATS: CNT RESOLUTION:    16384 x 8192
     [m3vpss ] TILER_STATS: BUCKET RESOLUTION: 16384 x 8188
     [m3vpss ] TILER_STATS: NUM FREE BUCKETS:  0
     [m3vpss ] TILER_STATS: NUM USED BUCKETS:  1
     [m3vpss ] TILER_STATS: TOTAL FREE AREA:   50323456 (37 %)
     [m3vpss ] TILER_STATS: TOTAL USED AREA:   83828736 (62 %)
     [m3vpss ] TILER_STATS: TOTAL WASTE AREA:  0 (0 %)
     [m3vpss ] TILER_STATS: MAX WIDTH RECT:    16384 x 2428
     [m3vpss ] TILER_STATS: MAX HEIGHT RECT:    16384 x 2428
     [m3vpss ] TILER_STATS: RES ALLOC COUNT [1080P] :  36
     [m3vpss ] TILER_STATS: CNT :16BIT
     [m3vpss ] TILER_STATS: CNT RESOLUTION:    32768 x 3072
     [m3vpss ] TILER_STATS: BUCKET RESOLUTION: 32768 x 3072
     [m3vpss ] TILER_STATS: NUM FREE BUCKETS:  0
     [m3vpss ] TILER_STATS: NUM USED BUCKETS:  1
     [m3vpss ] TILER_STATS: TOTAL FREE AREA:   58748928 (58 %)
     [m3vpss ] TILER_STATS: TOTAL USED AREA:   41914368 (41 %)
     [m3vpss ] TILER_STATS: TOTAL WASTE AREA:  0 (0 %)
     [m3vpss ] TILER_STATS: MAX WIDTH RECT:    32768 x 780
     [m3vpss ] TILER_STATS: MAX HEIGHT RECT:    32768 x 780
     [m3vpss ] TILER_STATS: RES ALLOC COUNT [1080P] :  36
     [m3vpss ]  145529: SYSTEM  : FREE SPACE : Tiler 8-bit      = 50323456 B (47 MB)  - TILER ON 
     [m3vpss ]  145529: SYSTEM  : FREE SPACE : Tiler 16-bit     = 58748928 B (56 MB)  - TILER ON 
     [m3vpss ]  
     [m3vpss ]  *** [NSF1] NSF Statistics *** 
     [m3vpss ]  
     [m3vpss ]  Elasped Time           : 136 secs
     [m3vpss ]  Total Fields Processed : 6166 
     [m3vpss ]  Total Fields FPS       : 1228 FPS
     [m3vpss ]  
     [m3vpss ]  
     [m3vpss ]  CH  | In Recv In Reject In Process Out User Out Out      
     [m3vpss ]  Num | FPS     FPS       FPS        FPS Skip FPS Skip FPS 
     [m3vpss ]  ------------------------------------------------
     [m3vpss ]    0 |      20         0         20  20        0        0
     [m3vpss ]    1 |      24         0         24  24        0        0
     [m3vpss ]  
     [m3vpss ]  
     [m3vpss ]  *** [DEI0    ] DEI Statistics *** 
     [m3vpss ]  
     [m3vpss ]  Elasped Time           : 136 secs
     [m3vpss ]  Total Fields Processed : 6168 
     [m3vpss ]  Total Fields FPS       : 124 FPS
     [m3vpss ]  
     [m3vpss ]  
     [m3vpss ]  CH  | In Recv In Reject In Process Out[0] Out[1] Out[2] Out[3] Out[4] Skip Out[0] Skip Out[1] Skip Out[2] Skip Out[3] Skip Out[4] User Out[0] User Out[1] User Out[2] User Out[3] User Out[4] Latency   
     [m3vpss ]  Num | FPS     FPS       FPS        FPS    FPS    FPS    FPS    FPS       FPS         FPS         FPS         FPS         FPS       Skip FPS    Skip FPS    Skip FPS    Skip FPS    Skip FPS   Min / Max 
     [m3vpss ]  -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     [m3vpss ]    0 |      49        28         20     20     20      0      0      0           0           0           0           0           0           0           0           0           0           0  17 / 106
     [m3vpss ]    1 |      59        34         24     24     24      0      0      0           0           0           0           0           0           0           0           0           0           0  17 / 101
     [m3vpss ]  
     [m3vpss ]  
     [m3vpss ]  *** [SWMS1] Mosaic Statistics *** 
     [m3vpss ]  
     [m3vpss ]  Elasped Time: 64 secs
     [m3vpss ]  
     [m3vpss ]  Output Request FPS   : 60 fps (3840 frames) 
     [m3vpss ]  Output Actual  FPS   : 60 fps (3840 frames) 
     [m3vpss ]  Output Drop    FPS   : 0 fps (0 frames) 
     [m3vpss ]  Output Reject  FPS   : 0 fps (0 frames) 
     [m3vpss ]  Scaling Internal     : 16 ms 
     [m3vpss ]  Scaling Internal min : 7 ms 
     [m3vpss ]  Scaling Internal max : 96 ms 
     [m3vpss ]  
     [m3vpss ]  Win | Window Repeat Drop Recv Que  FID Invlid Acc Event          Invalid   Que Reject Reject Latency   OutBufCopy InBufCopy
     [m3vpss ]  Num | FPS    FPS    FPS  FPS  FPS  FPS        Count (Max/Min)    CH Frames Frames     Frames Min / Max FPS        FPS      
     [m3vpss ]  ---------------------------------------------------------------------------------------------------------------------------
     [m3vpss ]    0 |      0     60    0    0    0          0        0 (  0/255)         0          0      0 65535 /   0          0         0 
     [m3vpss ]  
     [m3vpss ]  
     [m3vpss ]  *** [SWMS1] Mosaic Parameters *** 
     [m3vpss ]  
     [m3vpss ]  Output FPS: 60
     [m3vpss ]  
     [m3vpss ]  Win | Ch  | Input      | Input          | Input         | Input       | Output     |  Output         | Output        | Output      | Low Cost | SWMS | Data  | Blank |
     [m3vpss ]  Num | Num | Start X, Y | Width x Height | Pitch Y / C   | Memory Type | Start X, Y |  Width x Height | Pitch Y / C   | Memory Type | ON / OFF | Inst | Format| Frame |
     [m3vpss ]  ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
     [m3vpss ]    0 |   2 |    0,    0 |  1920 x   1080 | 16384 / 32768 | TILED       |    0,    0 |  1920 x   1080 |  3840 /      0 | NON-TILED   |      OFF |    0 |  420SP |    ON |
     [m3vpss ]  
     [m3vpss ]  
     [m3vpss ]  145545: DISPLAY: DVO2(BP1)  : 59 fps, Latency (Min / Max) = ( 59 / 150 ), Callback Interval (Min / Max) = ( 16 / 17 ) DropCount:0 DispLatency (Min / Max) = ( 41 / 116 ) !!! 
     [m3vpss ]  145545: DISPLAY DRV: DVO2(BP1)  : Q:[8088] Display:[8149], Repeat:[64], DQ:[8085]
    delete clientSession teacher
    delete clientSession teacher
    <1>h264buf ch1: destroy_reader: 1
    m_rtsp_discon_flag[0] = 0 m_live_flag[0] = 0
    m_rtsp_discon_flag[1] = 0 m_live_flag[1] = 0
    m_rtsp_discon_flag[2] = 0 m_live_flag[2] = 0
    m_rtsp_discon_flag[3] = 0 m_live_flag[3] = 0
    m_rtsp_discon_flag[4] = 0 m_live_flag[4] = 0
    **************m_distconnect_flag[0] = 1
     rtsp/client/hht_lubo_rtsp_client.cpp  135   RTSPClient stop  chid = 0  th_id = 1639969888
     exit chid = 0
    #######################*watchVariable = 1
    !!!!!!!!!!!!!!!!!!!!!!thread_rtsp_param->exit_flag = 1  id  = 0
    !!!!!!!!shutdownStream   stream_id :0
    [URL:"rtsp://admin:admin@192.168.68.2/teacherFieldMainStream"]: Closing the stream.
     rtsp/client/hht_lubo_rtsp_client.cpp  109   start_single   m_rtsp_client_quit[0] = 1  m_start_stream_id = 0  th_id = 1620952160
     **************m_distconnect_flag[1] = 1
     rtsp/client/hht_lubo_rtsp_client.cpp  135   RTSPClient stop  chid = 1  th_id = 1585788000
     exit chid = 1
    !!!!!!!!!!!!!!!!!!!!!!!!!!!open streamd_id = 0
    resuFlag :1
    Opening connection to 192.168.68.2, port 554...
    fn address :0x261a38
    #######################*watchVariable = 1
    !!!!!!!!!!!!!!!!!!!!!!thread_rtsp_param->exit_flag = 1  id  = 1
    !!!!!!!!shutdownStream   stream_id :1
    [URL:"rtsp://admin:admin@192.168.68.2/teacherObjectStream"]: Closing the stream.
     rtsp/client/hht_lubo_rtsp_client.cpp  109   start_single   m_rtsp_client_quit[1] = 1  m_start_stream_id = 1  th_id = 1639969888
     **************m_distconnect_flag[2] = 1
     rtsp/client/hht_lubo_rtsp_client.cpp  135   RTSPClient stop  chid = 2  th_id = 1595122784
     exit chid = 2
    !!!!!!!!!!!!!!!!!!!!!!!!!!!open streamd_id = 1
    resuFlag :1
    Opening connection to 192.168.68.2, port 554...
    fn address :0x261a38
    #######################*watchVariable = 1
    !!!!!!!!!!!!!!!!!!!!!!thread_rtsp_param->exit_flag = 1  id  = 2
    !!!!!!!!shutdownStream   stream_id :2
    [URL:"rtsp://admin:admin@192.168.68.3/stream1"]: Closing the stream.
     rtsp/client/hht_lubo_rtsp_client.cpp  109   start_single   m_rtsp_client_quit[2] = 1  m_start_stream_id = 2  th_id = 1585788000
     **************m_distconnect_flag[3] = 1
     rtsp/client/hht_lubo_rtsp_client.cpp  135   RTSPClient stop  chid = 3  th_id = 1603568736
     exit chid = 3
    !!!!!!!!!!!!!!!!!!!!!!!!!!!open streamd_id = 2
    resuFlag :1
    Opening connection to 192.168.68.3, port 554...
    fn address :0x261a38
    #######################*watchVariable = 1
    !!!!!!!!!!!!!!!!!!!!!!thread_rtsp_param->exit_flag = 1  id  = 3
    !!!!!!!!shutdownStream   stream_id :3
    [URL:"rtsp://admin:admin@192.168.68.2/teacherFieldSubStream"]: Closing the stream.
     rtsp/client/hht_lubo_rtsp_client.cpp  109   start_single   m_rtsp_client_quit[3] = 1  m_start_stream_id = 3  th_id = 1595122784
     **************m_distconnect_flag[4] = 1
     rtsp/client/hht_lubo_rtsp_client.cpp  135   RTSPClient stop  chid = 4  th_id = 1612395616
     exit chid = 4
    !!!!!!!!!!!!!!!!!!!!!!!!!!!open streamd_id = 3
    resuFlag :1
    Opening connection to 192.168.68.2, port 554...
    fn address :0x261a38
    #######################*watchVariable = 1
    !!!!!!!!!!!!!!!!!!!!!!thread_rtsp_param->exit_flag = 1  id  = 4
    !!!!!!!!shutdownStream   stream_id :4
    [URL:"rtsp://admin:admin@192.168.68.3/stream2"]: Closing the stream.
     rtsp/client/hht_lubo_rtsp_client.cpp  109   start_single   m_rtsp_client_quit[4] = 1  m_start_stream_id = 4  th_id = 1603568736
     !!!!!!!!!!!!!!!!!!!!!!!!!!!open streamd_id = 4
    resuFlag :1
    Opening connection to 192.168.68.3, port 554...
    fn address :0x261a38
    parseSucceeded  success = true
    cmdName = GET_PARAMETER
    parseSucceeded  success = true
    cmdName = GET_PARAMETER
     ## AVERAGE: ENCODE [  99.5] FPS, DECODE [   0.0] FPS, ENC+DEC [  99.5] FPS ... in 10.0 secs, 
     [m3video] 151545: HDVICP-ID:0
     [m3video] All percentage figures are based off totalElapsedTime
     [m3video]  totalAcquire2wait :0 %
     [m3video]  totalWait2Isr :50 %
     [m3video]  totalIsr2Done :0 %
     [m3video]  totalWait2Done :50 %
     [m3video]  totalDone2Release :0 %
     [m3video]  totalAcquire2Release :51 %
     [m3video]  totalAcq2acqDelay :48 %
     [m3video]  totalElapsedTime in msec :  141403
     [m3video]  numAccessCnt:    6465
     [m3video] IVA-FPS :      45
     [m3video] Average time spent per frame in microsec:   10936
     [m3video] 151546: HDVICP-ID:1
     [m3video] All percentage figures are based off totalElapsedTime
     [m3video]  totalAcquire2wait :0 %
     [m3video]  totalWait2Isr :0 %
     [m3video]  totalIsr2Done :0 %
     [m3video]  totalWait2Done :0 %
     [m3video]  totalDone2Release :0 %
     [m3video]  totalAcquire2Release :0 %
     [m3video]  totalAcq2acqDelay :0 %
     [m3video]  totalElapsedTime in msec :       0
     [m3video]  numAccessCnt:       0
     [m3video] IVA-FPS :       0
     [m3video] Average time spent per frame in microsec:       0
     [m3video] 151547: HDVICP-ID:2
     [m3video] All percentage figures are based off totalElapsedTime
     [m3video]  totalAcquire2wait :0 %
     [m3video]  totalWait2Isr :4 %
     [m3video]  totalIsr2Done :0 %
     [m3video]  totalWait2Done :4 %
     [m3video]  totalDone2Release :0 %
     [m3video]  totalAcquire2Release :4 %
     [m3video]  totalAcq2acqDelay :95 %
     [m3video]  totalElapsedTime in msec :  141393
     [m3video]  numAccessCnt:    6465
     [m3video] IVA-FPS :      45
     [m3video] Average time spent per frame in microsec:     874
     [m3video]  
     [m3video]  *** ENCODE Statistics *** 
     [m3video]  
     [m3video]  Elasped Time           : 118 secs
     [m3video]  
     [m3video]  
     [m3video]  CH  | In Recv In Skip In User  Out Latency  
     [m3video]  Num | FPS     FPS     Skip FPS FPS Min / Max
     [m3video]  --------------------------------------------
     [m3video]    0 |      24       0        0  24 255 / 915946290
     [m3video]    1 |      24       0        0  24 255 / 915946298
     [m3video]    2 |      24       0        0  24 255 / 915946282
     [m3video]    3 |      24       0        0  24 255 / 915946278
     [m3video]  
     [m3video] Multi Channel Encode Average Submit Batch Size 
     [m3video] Max Submit Batch Size : 24
     [m3video] IVAHD_0 Average Batch Size : 1
     [m3video] IVAHD_0 Max achieved Batch Size : 1
     [m3video] IVAHD_1 Average Batch Size : 0
     [m3video] IVAHD_1 Max achieved Batch Size : 0
     [m3video] IVAHD_2 Average Batch Size : 1
     [m3video] IVAHD_2 Max achieved Batch Size : 2
     [m3video]  
     [m3video] Multi Channel Encode Batch break Stats 
     [m3video] Total Number of Batches created: 5882 
     [m3video] All numbers are based off total number of Batches created
     [m3video]  Batch breaks due to batch sizeexceeding limit: 100 %
     [m3video]  Batch breaks due to ReqObj Que being empty: 0 %
     [m3video]  Batch breaks due to changed resolution class: 0 %
     [m3video]  Batch breaks due to interlace and progressivecontent mix: 0 %
     [m3video]  Batch breaks due to channel repeat: 0 %
     [m3video]  Batch breaks due to different codec: 0 %
     [m3video] Total Number of Batches created: 0 
     [m3video] All numbers are based off total number of Batches created
     [m3video]  Batch breaks due to batch sizeexceeding limit: 0 %
     [m3video]  Batch breaks due to ReqObj Que being empty: 0 %
     [m3video]  Batch breaks due to changed resolution class: 0 %
     [m3video]  Batch breaks due to interlace and progressivecontent mix: 0 %
     [m3video]  Batch breaks due to channel repeat: 0 %
     [m3video]  Batch breaks due to different codec: 0 %
     [m3video] Total Number of Batches created: 5881 
     [m3video] All numbers are based off total number of Batches created
     [m3video]  Batch breaks due to batch sizeexceeding limit: 0 %
     [m3video]  Batch breaks due to ReqObj Que being empty: 99 %
     [m3video]  Batch breaks due to changed resolution class: 0 %
     [m3video]  Batch breaks due to interlace and progressivecontent mix: 0 %
     [m3video]  Batch breaks due to channel repeat: 0 %
     [m3video]  Batch breaks due to different codec: 0 %
     [m3video]  
     [m3video]  *** DECODE Statistics *** 
     [m3video]  
     [m3video]  Elasped Time           : 142 secs
     [m3video]  
     [m3video]  
     [m3video]  CH  | In Recv In User  Out 
     [m3video]  Num | FPS     Skip FPS FPS 
     [m3video]  -----------------------------------
     [m3video]    0 |       0        0   0
     [m3video]    1 |       0        0   0
     [m3video]    2 |       0        0   0
     [m3video]    3 |       0        0   0
     [m3video]  
     [m3video] Multi Channel Decode Average Submit Batch Size 
     [m3video] Max Submit Batch Size : 24
     [m3video] IVAHD_0 Average Batch Size : 0
     [m3video] IVAHD_0 Max achieved Batch Size : 0
     [m3video] IVAHD_1 Average Batch Size : 0
     [m3video] IVAHD_1 Max achieved Batch Size : 0
     [m3video] IVAHD_2 Average Batch Size : 0
     [m3video] IVAHD_2 Max achieved Batch Size : 0
     [m3video]  
     [m3video] Multi Channel Decode Batch break Stats 
     [m3video] Total Number of Batches created: 0 
     [m3video] All numbers are based off total number of Batches created
     [m3video]  Batch breaks due to batch sizeexceeding limit: 0 %
     [m3video]  Batch breaks due to ReqObj Que being empty: 0 %
     [m3video]  Batch breaks due to changed resolution class: 0 %
     [m3video]  Batch breaks due to interlace and progressivecontent mix: 0 %
     [m3video]  Batch breaks due to channel repeat: 0 %
     [m3video]  Batch breaks due to different codec: 0 %
     [m3video] Total Number of Batches created: 0 
     [m3video] All numbers are based off total number of Batches created
     [m3video]  Batch breaks due to batch sizeexceeding limit: 0 %
     [m3video]  Batch breaks due to ReqObj Que being empty: 0 %
     [m3video]  Batch breaks due to changed resolution class: 0 %
     [m3video]  Batch breaks due to interlace and progressivecontent mix: 0 %
     [m3video]  Batch breaks due to channel repeat: 0 %
     [m3video]  Batch breaks due to different codec: 0 %
     [m3video] Total Number of Batches created: 0 
     [m3video] All numbers are based off total number of Batches created
     [m3video]  Batch breaks due to batch sizeexceeding limit: 0 %
     [m3video]  Batch breaks due to ReqObj Que being empty: 0 %
     [m3video]  Batch breaks due to changed resolution class: 0 %
     [m3video]  Batch breaks due to interlace and progressivecontent mix: 0 %
     [m3video]  Batch breaks due to channel repeat: 0 %
     [m3video]  Batch breaks due to different codec: 0 %
     [m3video]  
    ...Connection to server failed: No route to host
    [URL:"rtsp://admin:admin@192.168.68.2/teacherFieldMainStream"]: Failed to get a SDP description: Connection to server failed: No route to host
    !!!!!!!!shutdownStream   stream_id :0
    [URL:"rtsp://admin:admin@192.168.68.2/teacherFieldMainStream"]: Closing the stream.
    ...Connection to server failed: No route to host
    [URL:"rtsp://admin:admin@192.168.68.2/teacherObjectStream"]: Failed to get a SDP description: Connection to server failed: No route to host
    !!!!!!!!shutdownStream   stream_id :1
    [URL:"rtsp://admin:admin@192.168.68.2/teacherObjectStream"]: Closing the stream.
    ...Connection to server failed: No route to host
    [URL:"rtsp://admin:admin@192.168.68.2/teacherFieldSubStream"]: Failed to get a SDP description: Connection to server failed: No route to host
    !!!!!!!!shutdownStream   stream_id :3
    [URL:"rtsp://admin:admin@192.168.68.2/teacherFieldSubStream"]: Closing the stream.
    ...Connection to server failed: No route to host
    [URL:"rtsp://admin:admin@192.168.68.3/stream1"]: Failed to get a SDP description: Connection to server failed: No route to host
    !!!!!!!!shutdownStream   stream_id :2
    [URL:"rtsp://admin:admin@192.168.68.3/stream1"]: Closing the stream.
    ...Connection to server failed: No route to host
    [URL:"rtsp://admin:admin@192.168.68.3/stream2"]: Failed to get a SDP description: Connection to server failed: No route to host
    !!!!!!!!shutdownStream   stream_id :4
    [URL:"rtsp://admin:admin@192.168.68.3/stream2"]: Closing the stream.
     [m3vpss ]  
     [m3vpss ]  154555: LOAD: CPU: 10.1% HWI: 1.8%, SWI:1.1% 
     [m3vpss ]  
     [m3vpss ]  154555: LOAD: TSK: IPC_OUT_M30         : 0.5% 
     [m3vpss ]  154555: LOAD: TSK: CAPTURE             : 0.4% 
     [m3vpss ]  154555: LOAD: TSK: NSF1                : 0.4% 
     [m3vpss ]  154555: LOAD: TSK: DEI0                : 0.9% 
     [m3vpss ]  154555: LOAD: TSK: DISPLAY1            : 0.3% 
     [m3vpss ]  154555: LOAD: TSK: DUP0                : 0.3% 
     [m3vpss ]  154556: LOAD: TSK: SWMS1               : 1.2% 
     [m3vpss ]  154556: LOAD: TSK: MERGE1              : 0.1% 
     [m3vpss ]  154556: LOAD: TSK: MERGE2              : 0.1% 
     [m3vpss ]  154556: LOAD: TSK: MISC                : 3.0% 
     [m3vpss ]  
     [m3video]  
     [m3video]  155056: LOAD: CPU: 6.5% HWI: 0.5%, SWI:1.1% 
     [m3video]  
     [m3video]  155057: LOAD: TSK: IPC_IN_M30          : 0.2% 
     [m3video]  155057: LOAD: TSK: IPC_BITS_IN0        : 0.1% 
     [m3video]  155057: LOAD: TSK: IPC_BITS_OUT0       : 0.6% 
     [m3video]  155057: LOAD: TSK: ENC0                : 1.0% 
     [m3video]  155057: LOAD: TSK: DEC0                : 0.4% 
     [m3video]  155057: LOAD: TSK: ENC_PROCESS_TSK_0   : 1.0% 
     [m3video]  155057: LOAD: TSK: ENC_PROCESS_TSK_2   : 1.0% 
     [m3video]  155057: LOAD: TSK: MISC                : 0.6% 
     [m3video]  
     [c6xdsp ]  
     [c6xdsp ]  155201: LOAD: CPU: 0.2% HWI: 0.0%, SWI:0.0% 
     [c6xdsp ]  
     [c6xdsp ]  155201: LOAD: TSK: MISC                : 0.2% 
     [c6xdsp ]  
    
    
     *** Encode Bitstream Received Statistics *** 
    
     Elased time =  181.0 secs
    
     CH | Bitrate (Kbps) | FPS | Key-frame FPS | Width (max/min) | Height (max/min) | Latency (max/min)
     --------------------------------------------------------------------------------------------------
      0 |        1371.58 | 16.9 |           0.6 |  1920 /   1920 |   1080 /   1080  |    173 /     49
      1 |          89.82 | 20.1 |           0.7 |  1920 /   1920 |   1080 /   1080  |    184 /     50
      2 |         271.62 | 16.9 |           0.6 |   480 /    480 |    270 /    270  |    162 /     41
      3 |          18.46 | 20.1 |           0.7 |   480 /    480 |    270 /    270  |    169 /     39
    
    
     [host] 
    
     *** SCD Frame Results Received Statistics *** 
    
     Elased time =  181.1 secs
    
     CH | Bitrate (Kbps) | FPS | Width (max/min) | Height (max/min)
     ----------------------------------------------------------------------------------
    LUBO>
    /*******************************************************************************
     *                                                                             *
     * Copyright (c) 2009 Texas Instruments Incorporated - http://www.ti.com/      *
     *                        ALL RIGHTS RESERVED                                  *
     *                                                                             *
     ******************************************************************************/
    
    #include "mcfw/src_linux/mcfw_api/usecases/multich_common.h"
    #include "mcfw/src_linux/mcfw_api/usecases/multich_ipcbits.h"
    #include "mcfw/src_linux/mcfw_api/ti_vdis_priv.h"
    #include "mcfw/src_linux/devices/tw2968/src/tw2968_priv.h"
    #include "mcfw/src_linux/devices/tvp5158/src/tvp5158_priv.h"
    #include "mcfw/interfaces/link_api/system_tiler.h"
    #include "mcfw/interfaces/link_api/avsync_hlos.h"
    #include "mcfw/interfaces/ti_vdis_timings.h"
    
    int hrecGetMovieResolution(int *xres, int *yres);
    int hrecGetMovieBitrate(void);
    
    // HUOCP
    #define VPS_CAPT_VIDEO_IF_MODE_16BIT 1
    #define VPS_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_EMBEDDED_SYNC             0
    #define VPS_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_DISCRETE_SYNC_HSYNC_VSYNC 4
    #define FVID2_SF_PROGRESSIVE 1
    
    #define MAX_PRIMARY_WIDTH           (1920)
    #define MAX_PRIMARY_HEIGHT          (1080)
    
    #define MOVIE_CH_NUM      1
    
    /*
    
    SWMS
    CH 0, 1, 2, 3   - LOW RES LIVE CHs    - 540p30
    CH 4, 5, 6, 7   - PLAYBACK CHs        - 1080p30
    CH 8, 9, 10, 11 - HIGH RES LIVE CHs   - 1080p30
    
    SWMS0 - HDMI
    - Supports
        - 1x1 LIVE      - HIGH RES LIVE CH
    
                                                                                Capture
                                                                                   |
                                                                                   |  2CH 1080p60
                                                                                   |  YUV422
                                                                                   |
                                                                                  DUP0
       IPC BITS OUT (A8)                                                          |  |
           |                                        (for live preview)            |  |
       IPC BITS IN  (Video M3)          +-----------------------------------------+  +-----+
           |                            |                                                  |
       Decode (4CH 1080p30 h264)        |                                                  |
           |                            |                                                DEIHQ0
       IPC M3 OUT (Video M3)            |                                               |      |
           |                            |                                           (VIP-SC)   |
       IPC M3 IN  (VPSS M3)             |                                               |      |
           |                            |                                               |   (DEI-SC)
           +------------------------+   |                                               |      |
                                    |   |                                               |      |
                                    MERGE1                                              |     NSF1
                                       |                                                |      |
                                     DUP2                                               |      |
                                     |  |                                                MERGE3
                                +----+  +----+                                             |
                                |            |                                        IPC OUT (M3)
                              SWMS0        SWMS1                                           |
                              (SC5)        (SC2)                                      IPC IN  (M3)
                                 |           |                                             |
                            +----+         DVO2                                 Encode (1CH 1080p30 h264)
                            |                                                              |
               HDDAC --- HDMI                                                       IPC BITS OUT (M3)
                  (tied VENC)                                                              |
                                                                                    IPC BITS IN  (A8)
    */
    
    
    #define TILER_ENABLE_DECODE      (TRUE)
    #define TILER_ENABLE_ENCODE      (TRUE)
    
    
    /*
        Encode
        CH 0, 1 - 1080p30 H264
        CH 2, 3 -  176p30 H264
    
        Decode
        CH 0, 1,  2,  3 - 1080p30 H264
    */
    static SystemVideo_Ivahd2ChMap_Tbl systemVid_encDecIvaChMapTbl =
    {
        .isPopulated = 1,
        .ivaMap[0] =
        {
            .EncNumCh  = 2,
            .EncChList = {0, 1 },
            .DecNumCh  = 0,
        },
        .ivaMap[1] =
        {
            .EncNumCh  = 0,
            .DecNumCh  = 2,
            .DecChList = {0, 1 },
        },
        .ivaMap[2] =
        {
            .EncNumCh  = 2,
            .EncChList = {2, 3 },
            .DecNumCh  = 2,
            .DecChList = {2, 3 },
        },
    };
    
    
    #define MULTICH_HD_DVR_USECASE_MAX_NUM_LINKS    (64)
    
    #define DUP_FULL_RES_CAPTURE        (0)
    #define DUP_DISPLAY                 (2)
    #define NUM_DUP_LINK                (3)
    
    #define MERGE_DISPLAY               (1)
    #define MERGE_ENCODE                (2)
    #define NUM_MERGE_LINK              (3)
    
    #define NSF_Q_RES_CAPTURE           (1)
    #define NUM_NSF_LINK                (3)
    
    #define DEIHQ_FULL_RES              (0)
    #define NUM_DEI_LINK                (3)
    
    #define MAX_NUM_DECODE_CHANNELS     (4)
    #define MAX_NUM_CAPTURE_CHANNELS    (2)
    
    #define     NUM_BUFS_PER_CH_CAPTURE              (6)
    #define     NUM_BUFS_PER_CH_DEI                  (4)
    #define     NUM_BUFS_PER_CH_DEC                  (6)  /*�����ֵ̫С�����ܵ���ͼ��������β��*/
    #define     NUM_BUFS_PER_CH_SWMS                 (6)
    #define     NUM_BUFS_PER_CH_ENC_PRI              (4)
    #define     NUM_BUFS_PER_CH_ENC_SEC              (4)
    #define     NUM_BUFS_PER_CH_NSF_Q_RES_CAPTURE    (4)
    
    #define     ENC_LINK_SECONDARY_STREAM_POOL_ID    (0)
    #define     ENC_LINK_PRIMARY_STREAM_POOL_ID      (1)
    
    #define     BIT_BUF_LENGTH_LIMIT_FACTOR_HD      (5)
    
    #define     MAX_BUFFERING_QUEUE_LEN_PER_CH           (6)
    
    typedef struct {
    
        UInt32 mergeId[NUM_MERGE_LINK];
        UInt32 dupId[NUM_DUP_LINK];
    
        UInt32 grpxId[VDIS_DEV_MAX];
    
        UInt32 ipcOutVpssId;
        UInt32 ipcInVpssId;
        UInt32 ipcOutVideoId;
        UInt32 ipcInVideoId;
    
        UInt32 createdLinkCount;
        UInt32 createdLinks[MULTICH_HD_DVR_USECASE_MAX_NUM_LINKS];
    
        CaptureLink_CreateParams          capturePrm;
        NsfLink_CreateParams              nsfPrm[NUM_NSF_LINK];
        DeiLink_CreateParams              deiPrm[NUM_DEI_LINK];
        SwMsLink_CreateParams             swMsPrm[VDIS_DEV_MAX];
        AvsyncLink_LinkSynchConfigParams  avsyncCfg[2];
        DisplayLink_CreateParams          displayPrm[VDIS_DEV_MAX];
    
        MergeLink_CreateParams            mergePrm[NUM_MERGE_LINK];
        DupLink_CreateParams              dupPrm[NUM_DUP_LINK];
    
        IpcLink_CreateParams              ipcOutVideoPrm;
        IpcLink_CreateParams              ipcInVpssPrm;
        IpcLink_CreateParams              ipcOutVpssPrm;
        IpcLink_CreateParams              ipcInVideoPrm;
        IpcBitsOutLinkHLOS_CreateParams   ipcBitsOutHostPrm;
        IpcBitsInLinkRTOS_CreateParams    ipcBitsInVideoPrm;
        IpcBitsOutLinkRTOS_CreateParams   ipcBitsOutVideoPrm;
        IpcBitsInLinkHLOS_CreateParams    ipcBitsInHostPrm[1];
    
        EncLink_CreateParams              encPrm;
        DecLink_CreateParams              decPrm;
    
        SwMsLink_LayoutPrm                swmsLayoutPrm[VDIS_DEV_MAX];
    
    } MultiChHdDvr_Context;
    
    
    MultiChHdDvr_Context gHdDvrUsecaseContext =
    {
        .createdLinkCount           = 0
    };
    
    
    static
    Void multich_hddvr_register_created_link(MultiChHdDvr_Context *pContext,
                                                        UInt32 linkID)
    {
        OSA_assert(pContext->createdLinkCount < OSA_ARRAYSIZE(pContext->createdLinks));
        pContext->createdLinks[pContext->createdLinkCount] = linkID;
        pContext->createdLinkCount++;
    }
    
    #define MULTICH_HDDVR_CREATE_LINK(linkID,createPrm)                \
        do                                                             \
        {                                                              \
            System_linkCreate(linkID,&createPrm,sizeof(createPrm));    \
            multich_hddvr_register_created_link(&gHdDvrUsecaseContext, \
                                                    linkID);           \
        } while (0)
    
    static
    Void multich_hddvr_reset_link_prms()
    {
        int i;
    
        MULTICH_INIT_STRUCT(IpcLink_CreateParams,gHdDvrUsecaseContext.ipcOutVpssPrm);
        MULTICH_INIT_STRUCT(IpcLink_CreateParams,gHdDvrUsecaseContext.ipcInVideoPrm);
    
        MULTICH_INIT_STRUCT(IpcLink_CreateParams,gHdDvrUsecaseContext.ipcOutVideoPrm);
        MULTICH_INIT_STRUCT(IpcLink_CreateParams,gHdDvrUsecaseContext.ipcInVpssPrm);
    
        MULTICH_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,gHdDvrUsecaseContext.ipcBitsOutVideoPrm);
        MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,gHdDvrUsecaseContext.ipcBitsInHostPrm[0]);
    
        IpcBitsOutLinkHLOS_CreateParams_Init(&gHdDvrUsecaseContext.ipcBitsOutHostPrm);
    
        MULTICH_INIT_STRUCT(IpcBitsInLinkRTOS_CreateParams,gHdDvrUsecaseContext.ipcBitsInVideoPrm);
    
        CaptureLink_CreateParams_Init(&gHdDvrUsecaseContext.capturePrm);
    
        for (i = 0; i < OSA_ARRAYSIZE(gHdDvrUsecaseContext.nsfPrm);i++)
        {
            NsfLink_CreateParams_Init(&gHdDvrUsecaseContext.nsfPrm[i]);
        }
    
        for (i = 0; i < OSA_ARRAYSIZE(gHdDvrUsecaseContext.deiPrm);i++)
        {
            DeiLink_CreateParams_Init(&gHdDvrUsecaseContext.deiPrm[i]);
        }
    
        for (i = 0; i < OSA_ARRAYSIZE(gHdDvrUsecaseContext.swMsPrm);i++)
        {
            SwMsLink_CreateParams_Init(&gHdDvrUsecaseContext.swMsPrm[i]);
        }
    
        for (i = 0; i < OSA_ARRAYSIZE(gHdDvrUsecaseContext.avsyncCfg);i++)
        {
            AvsyncLink_LinkSynchConfigParams_Init(&gHdDvrUsecaseContext.avsyncCfg[i]);
        }
    
        for (i = 0; i < OSA_ARRAYSIZE(gHdDvrUsecaseContext.displayPrm);i++)
        {
            DisplayLink_CreateParams_Init(&gHdDvrUsecaseContext.displayPrm[i]);
        }
    
        DecLink_CreateParams_Init(&gHdDvrUsecaseContext.decPrm);
        EncLink_CreateParams_Init(&gHdDvrUsecaseContext.encPrm);
    }
    
    static
    Void multich_hddvr_set_capture_prm(CaptureLink_CreateParams *capturePrm)
    {
        CaptureLink_VipInstParams         *pCaptureInstPrm;
        CaptureLink_OutParams             *pCaptureOutPrm;
        UInt32 vipInstId;
        UInt32 instVipPort[] = { SYSTEM_CAPTURE_INST_VIP0_PORTA, SYSTEM_CAPTURE_INST_VIP1_PORTA };
    
        capturePrm->isPalMode                   = FALSE;
        capturePrm->numVipInst                  = 2;
        capturePrm->tilerEnable                 = FALSE;
        capturePrm->fakeHdMode                  = FALSE;
        capturePrm->enableSdCrop                = FALSE;
        capturePrm->doCropInCapture             = FALSE;
        capturePrm->numBufsPerCh                = NUM_BUFS_PER_CH_CAPTURE;
        capturePrm->numExtraBufs                = 0;
        capturePrm->maxBlindAreasPerCh          = 0;
        capturePrm->overrideNumBufsInInstPrms   = 0;
    
        for(vipInstId=0; vipInstId<capturePrm->numVipInst; vipInstId++)
        {
            pCaptureInstPrm                     = &capturePrm->vipInst[vipInstId];
            pCaptureInstPrm->vipInstId          = instVipPort[vipInstId];
            pCaptureInstPrm->videoDecoderId     = 0; /* DONT set it to TVP5158 */
            pCaptureInstPrm->standard           = SYSTEM_STD_1080P_60; //(vipInstId==0)?SYSTEM_STD_1080P_60:SYSTEM_STD_1080P_30; //HUOCP
            pCaptureInstPrm->inDataFormat       = SYSTEM_DF_YUV422P;
            pCaptureInstPrm->numOutput          = 1;
            
            pCaptureInstPrm->videoCaptureMode   = VPS_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_EMBEDDED_SYNC;
            //if(vipInstId==0)pCaptureInstPrm->videoCaptureMode   = VPS_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_DISCRETE_SYNC_HSYNC_VSYNC; //HUOCP
            pCaptureInstPrm->videoIfMode        = VPS_CAPT_VIDEO_IF_MODE_16BIT;
            pCaptureInstPrm->inScanFormat       = FVID2_SF_PROGRESSIVE;
    
            pCaptureOutPrm                      = &pCaptureInstPrm->outParams[0];
            pCaptureOutPrm->dataFormat          = SYSTEM_DF_YUV420SP_UV; //SYSTEM_DF_YUV422I_YUYV; //HUOCP
            pCaptureOutPrm->scEnable            = FALSE;
            pCaptureOutPrm->scOutWidth          = 0;
            pCaptureOutPrm->scOutHeight         = 0;
            pCaptureOutPrm->outQueId            = 0;
        }
    }
    
    static
    Void multich_hddvr_set_nsf_prm(NsfLink_CreateParams * nsfPrm, UInt32 numBufPerCh, UInt32 outputFrameRate)
    {
        nsfPrm->numOutQue    = 1;
        nsfPrm->bypassNsf    = TRUE;
        nsfPrm->tilerEnable  = FALSE;
        nsfPrm->numBufsPerCh = numBufPerCh;
        nsfPrm->inputFrameRate = 30;
        nsfPrm->outputFrameRate = outputFrameRate;
    }
    
    static
    Void multich_hddvr_set_dei_prm(DeiLink_CreateParams *deiPrm, DeiLink_OutputScaleFactor *outScalerFactorDeiSc, DeiLink_OutputScaleFactor *outScalerFactorVipSc)
    {
        UInt32 i, outId, chId;
        UInt32 outIdList[] = { DEI_LINK_OUT_QUE_DEI_SC, DEI_LINK_OUT_QUE_VIP_SC };
    
        deiPrm->comprEnable                 = FALSE;
        deiPrm->setVipScYuv422Format        = FALSE;
        deiPrm->inputDeiFrameRate           = 60;
        deiPrm->outputDeiFrameRate          = 25;
        deiPrm->enableDeiForceBypass        = TRUE;
        deiPrm->enableForceInterlacedInput  = FALSE;
        deiPrm->enableLineSkipSc            = FALSE;
        deiPrm->enableDualVipOut            = FALSE;
        deiPrm->enableInputFrameRateUpscale = FALSE;
    
        for(i=0; i<OSA_ARRAYSIZE(outIdList); i++)
        {
            outId = outIdList[i];
    
            deiPrm->enableOut[outId] = TRUE;
    
            deiPrm->tilerEnable[outId] = FALSE;
            if(outId==DEI_LINK_OUT_QUE_VIP_SC)
                deiPrm->tilerEnable[outId] = TILER_ENABLE_ENCODE;
    
            for(chId=0; chId<DEI_LINK_MAX_CH; chId++)
            {
                if(outId==DEI_LINK_OUT_QUE_VIP_SC)
                    deiPrm->outScaleFactor[outId][chId] = *outScalerFactorVipSc;
                if(outId==DEI_LINK_OUT_QUE_DEI_SC)
                    deiPrm->outScaleFactor[outId][chId] = *outScalerFactorDeiSc;
            }
    
            deiPrm->inputFrameRate[outId]   = 25;
            deiPrm->outputFrameRate[outId]  = 25;
    
            deiPrm->numBufsPerCh[outId]     = NUM_BUFS_PER_CH_DEI;
            deiPrm->generateBlankOut[outId] = FALSE;
        }
    }
    
    static
    Void multich_hddvr_set_enclink_prm(EncLink_CreateParams *encPrm)
    {
        int i,j;
        EncLink_ChCreateParams *pLinkChPrm;
        EncLink_ChDynamicParams *pLinkDynPrm;
        VENC_CHN_DYNAMIC_PARAM_S *pDynPrm;
        VENC_CHN_PARAMS_S *pChPrm;
    
        encPrm->numBufPerCh[ENC_LINK_SECONDARY_STREAM_POOL_ID] = NUM_BUFS_PER_CH_ENC_SEC;
        encPrm->numBufPerCh[ENC_LINK_PRIMARY_STREAM_POOL_ID] = NUM_BUFS_PER_CH_ENC_PRI;
    
        /* Primary Stream Params - D1 */
        for (i=0; i < gVencModuleContext.vencConfig.numPrimaryChn; i++)
        {
            pLinkChPrm  = &encPrm->chCreateParams[i];
            pLinkDynPrm = &pLinkChPrm->defaultDynamicParams;
    
            pChPrm      = &gVencModuleContext.vencConfig.encChannelParams[i];
            pDynPrm     = &pChPrm->dynamicParam;
    
            pLinkChPrm->format                  = IVIDEO_H264HP;
            pLinkChPrm->profile                 = gVencModuleContext.vencConfig.h264Profile[i];
            pLinkChPrm->dataLayout              = VCODEC_FIELD_SEPARATED;
            pLinkChPrm->fieldMergeEncodeEnable  = FALSE;
            pLinkChPrm->enableAnalyticinfo      = FALSE;
            pLinkChPrm->maxBitRate              = pChPrm->maxBitRate;
            pLinkChPrm->encodingPreset          = pChPrm->encodingPreset;
            pLinkChPrm->rateControlPreset       = pChPrm->rcType;
            pLinkChPrm->enableHighSpeed         = TRUE;
            pLinkChPrm->numTemporalLayer        = VENC_TEMPORAL_LAYERS_1;
            pLinkChPrm->enableSVCExtensionFlag  = pChPrm->enableSVCExtensionFlag;
    
            pLinkDynPrm->intraFrameInterval     = pDynPrm->intraFrameInterval;
            pLinkDynPrm->targetBitRate          = pDynPrm->targetBitRate;
            pLinkDynPrm->interFrameInterval     = 1;
            pLinkDynPrm->mvAccuracy             = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
            pLinkDynPrm->inputFrameRate         = pDynPrm->inputFrameRate;
            pLinkDynPrm->rcAlg                  = pDynPrm->rcAlg;
            pLinkDynPrm->qpMin                  = pDynPrm->qpMin;
            pLinkDynPrm->qpMax                  = pDynPrm->qpMax;
            pLinkDynPrm->qpInit                 = pDynPrm->qpInit;
            pLinkDynPrm->vbrDuration            = pDynPrm->vbrDuration;
            pLinkDynPrm->vbrSensitivity         = pDynPrm->vbrSensitivity;
    				if (1) {
    					int bitrate = hrecGetMovieBitrate();
    					if (bitrate >= 1*1000*1000 && bitrate <= 10*1000*1000) {
    		        pLinkDynPrm->targetBitRate      = bitrate;
    					}
    				}
        }
    
        /* Secondary Out <CIF> Params */
        for (i =  gVencModuleContext.vencConfig.numPrimaryChn,
             j =  VENC_PRIMARY_CHANNELS;
             i < (gVencModuleContext.vencConfig.numPrimaryChn
                  + gVencModuleContext.vencConfig.numSecondaryChn);
             i++, j++)
        {
            pLinkChPrm  = &encPrm->chCreateParams[i];
            pLinkDynPrm = &pLinkChPrm->defaultDynamicParams;
    
            pChPrm      = &gVencModuleContext.vencConfig.encChannelParams[j];
            pDynPrm     = &pChPrm->dynamicParam;
    
            pLinkChPrm->format                  = IVIDEO_H264HP;
            pLinkChPrm->profile                 = gVencModuleContext.vencConfig.h264Profile[i];
            pLinkChPrm->dataLayout              = VCODEC_FIELD_SEPARATED;
            pLinkChPrm->fieldMergeEncodeEnable  = FALSE;
            pLinkChPrm->enableAnalyticinfo      = pChPrm->enableAnalyticinfo;
            pLinkChPrm->maxBitRate              = pChPrm->maxBitRate;
            pLinkChPrm->encodingPreset          = pChPrm->encodingPreset;
            pLinkChPrm->rateControlPreset       = pChPrm->rcType;
            pLinkChPrm->enableHighSpeed         = TRUE;
            pLinkChPrm->numTemporalLayer        = VENC_TEMPORAL_LAYERS_1;
            pLinkChPrm->enableSVCExtensionFlag  = pChPrm->enableSVCExtensionFlag;
    
    
            pLinkDynPrm->intraFrameInterval     = pDynPrm->intraFrameInterval;
            pLinkDynPrm->targetBitRate          = pDynPrm->targetBitRate;
            pLinkDynPrm->interFrameInterval     = 1;
            pLinkDynPrm->mvAccuracy             = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
            pLinkDynPrm->inputFrameRate         = pDynPrm->inputFrameRate;
            pLinkDynPrm->qpMin                  = pDynPrm->qpMin;
            pLinkDynPrm->qpMax                  = pDynPrm->qpMax;
            pLinkDynPrm->qpInit                 = pDynPrm->qpInit;
            pLinkDynPrm->vbrDuration            = pDynPrm->vbrDuration;
            pLinkDynPrm->vbrSensitivity         = pDynPrm->vbrSensitivity;
        }
        if (gVsysModuleContext.vsysConfig.enableMjpegEnc == TRUE)
        {
            for (i=gVencModuleContext.vencConfig.numPrimaryChn + gVencModuleContext.vencConfig.numSecondaryChn;
                 i<(gVencModuleContext.vencConfig.numPrimaryChn + gVencModuleContext.vencConfig.numSecondaryChn + gVencModuleContext.vencConfig.numPrimaryChn);
                 i++)
            {
                pLinkChPrm  = &encPrm->chCreateParams[i];
                pLinkDynPrm = &pLinkChPrm->defaultDynamicParams;
    
                pChPrm      = &gVencModuleContext.vencConfig.encChannelParams[i];
                pDynPrm     = &pChPrm->dynamicParam;
    
                pLinkChPrm->format                 = IVIDEO_MJPEG;
                pLinkChPrm->profile                = 0;
                pLinkChPrm->dataLayout             = VCODEC_FIELD_SEPARATED;
                pLinkChPrm->fieldMergeEncodeEnable = FALSE;
                pLinkChPrm->enableAnalyticinfo     = 0;
                pLinkChPrm->enableWaterMarking     = 0;
                pLinkChPrm->maxBitRate             = 0;
                pLinkChPrm->encodingPreset         = 0;
                pLinkChPrm->rateControlPreset      = 0;
                pLinkChPrm->enableSVCExtensionFlag = 0;
                pLinkChPrm->numTemporalLayer       = 0;
    
                pLinkDynPrm->intraFrameInterval    = 0;
                pLinkDynPrm->targetBitRate         = 100*1000;
                pLinkDynPrm->interFrameInterval    = 0;
                pLinkDynPrm->mvAccuracy            = 0;
                pLinkDynPrm->inputFrameRate        = 1;
                pLinkDynPrm->qpMin                 = 0;
                pLinkDynPrm->qpMax                 = 0;
                pLinkDynPrm->qpInit                = -1;
                pLinkDynPrm->vbrDuration           = 0;
                pLinkDynPrm->vbrSensitivity        = 0;
            }
        }
    }
    
    static
    Void multich_hddvr_set_swms_default_layout(SwMsLink_CreateParams *swMsPrm, UInt32 devId)
    {
        SwMsLink_LayoutPrm *layoutInfo;
        SwMsLink_LayoutWinInfo *winInfo;
        UInt32 outWidth, outHeight, winId, widthAlign, heightAlign;
        UInt32 chNum;
        UInt32 rowMax,colMax,row,col;
    
        MultiCh_swMsGetOutSize(swMsPrm->initOutRes, &outWidth, &outHeight);
    
        widthAlign = 8;
        heightAlign = 1;
    
        if(devId>=VDIS_DEV_MAX)
            devId = VDIS_DEV_HDMI;
    
        rowMax = 2;
        colMax = 2;
        chNum  = 0;
    
        layoutInfo = &swMsPrm->layoutPrm;
    
        /* init to known default */
        memset(layoutInfo, 0, sizeof(*layoutInfo));
    
        layoutInfo->onlyCh2WinMapChanged = FALSE;
        layoutInfo->outputFPS            = 30;
    #if 0
        layoutInfo->numWin               = rowMax * colMax;
    
        for(row=0; row<rowMax; row++)
        {
            for(col=0; col<colMax; col++)
            {
                winId = row*colMax+col;
    
                winInfo = &layoutInfo->winInfo[winId];
    
                winInfo->width  = VsysUtils_floor(outWidth/colMax    , widthAlign );
                winInfo->height = VsysUtils_floor(outHeight/rowMax   , heightAlign);
                winInfo->startX = VsysUtils_floor(winInfo->width*col , widthAlign );
                winInfo->startY = VsysUtils_floor(winInfo->height*row, heightAlign);
    
                if (col == colMax - 1) /* the last col */
                {
                    winInfo->width = outWidth - winInfo->width * (colMax - 1);
                }
    
                //if (MOVIE_CH_NUM == chNum) chNum++;//HUOCP
                winInfo->channelNum = chNum++;
                winInfo->bypass = FALSE;
            }
        }
    #else
        layoutInfo->numWin               = 1;
        winInfo = &layoutInfo->winInfo[0];
        winInfo->startX = VsysUtils_floor(0 , widthAlign );
        winInfo->startY = VsysUtils_floor(0, heightAlign);
        winInfo->width  = VsysUtils_floor(1920 , widthAlign );
        winInfo->height = VsysUtils_floor(1080, heightAlign);
        winInfo->channelNum = 2; // see mcfw.cpp:SWMS_CHID
        winInfo->bypass = FALSE;
    #endif
    }
    
    #if 0//HUOCP
    static
    Void lubo_set_preview_layout(SwMsLink_CreateParams *swMsPrm)
    {
        SwMsLink_LayoutPrm *layoutInfo;
        SwMsLink_LayoutWinInfo *winInfo;
        UInt32 outWidth, outHeight;
    
        MultiCh_swMsGetOutSize(swMsPrm->initOutRes, &outWidth, &outHeight);
    
        layoutInfo = &swMsPrm->layoutPrm;
    
        /* init to known default */
        memset(layoutInfo, 0, sizeof(*layoutInfo));
        layoutInfo->onlyCh2WinMapChanged = FALSE;
        layoutInfo->outputFPS            = 30;
        layoutInfo->numWin               = 1;
    
        winInfo = &layoutInfo->winInfo[0];
        winInfo->width  = outWidth;
        winInfo->height = outHeight;
        winInfo->startX = 0;
        winInfo->startY = 0;
        winInfo->channelNum = MOVIE_CH_NUM;
        winInfo->bypass = TRUE; //FALSE; //HUOCP
    }
    #endif
    
    static
    Void multich_hddvr_set_swms_prm(SwMsLink_CreateParams *swMsPrm,
                                        UInt32 swMsIdx)
    {
        UInt32 devId, maxOutRes;
    
        swMsPrm->numSwMsInst = 1;
    
        if (swMsIdx == 1)
        {
            swMsPrm->swMsInstId[0] = SYSTEM_SW_MS_SC_INST_SC5;
    
            maxOutRes  = VSYS_STD_1080P_60;
            devId      = VDIS_DEV_DVO2;
        }
        else
        {
            swMsPrm->swMsInstId[0] = SYSTEM_SW_MS_SC_INST_SC5;
    
            maxOutRes  = VSYS_STD_1080P_60;
            devId      = VDIS_DEV_HDMI;
        }
    
        swMsPrm->maxOutRes                   = maxOutRes;
        swMsPrm->initOutRes                  = gVdisModuleContext.vdisConfig.deviceParams[devId].resolution;
        swMsPrm->lineSkipMode                = FALSE;
        swMsPrm->enableLayoutGridDraw        = gVdisModuleContext.vdisConfig.enableLayoutGridDraw;
        swMsPrm->maxInputQueLen              = SYSTEM_SW_MS_DEFAULT_INPUT_QUE_LEN + 6;
        swMsPrm->numOutBuf                   = NUM_BUFS_PER_CH_SWMS;
        swMsPrm->enableOuputDup              = TRUE;
        swMsPrm->enableProcessTieWithDisplay = TRUE;
        swMsPrm->outDataFormat               = SYSTEM_DF_YUV422I_YUYV;
        swMsPrm->outputBufModified           = TRUE;
    
        //if (VDIS_DEV_DVO2 == devId) {//HUOCP
            multich_hddvr_set_swms_default_layout(swMsPrm, devId);
        //} else {//HUOCP
        //    lubo_set_preview_layout(swMsPrm);//HUOCP
        //}//HUOCP
    }
    
    static
    Void multich_hddvr_set_avsync_vidque_prm(Avsync_SynchConfigParams *queCfg,
                                                Int chnum,
                                                UInt32 avsStartChNum,
                                                UInt32 avsEndChNum)
    {
        queCfg->chNum = chnum;
        queCfg->audioPresent = FALSE;
        if ((queCfg->chNum >= avsStartChNum)
            &&
            (queCfg->chNum <= avsEndChNum)
            &&
            (gVsysModuleContext.vsysConfig.enableAVsync))
        {
            queCfg->avsyncEnable = FALSE;
        }
        else
        {
            queCfg->avsyncEnable = FALSE;
        }
        queCfg->clkAdjustPolicy.refClkType = AVSYNC_REFCLKADJUST_NONE;
        queCfg->playTimerStartTimeout = 0;
        queCfg->playStartMode = AVSYNC_PLAYBACK_START_MODE_WAITSYNCH;
        queCfg->ptsInitMode   = AVSYNC_PTS_INIT_MODE_APP;
        queCfg->clkAdjustPolicy.clkAdjustLead = AVSYNC_VIDEO_TIMEBASESHIFT_MAX_LEAD_MS;
        queCfg->clkAdjustPolicy.clkAdjustLag = AVSYNC_VIDEO_TIMEBASESHIFT_MAX_LAG_MS;
        queCfg->vidSynchPolicy.playMaxLag    = 200;
    }
    
    static
    Void multich_hddvr_set_avsync_prm(AvsyncLink_LinkSynchConfigParams *avsyncPrm,
                                         UInt32 swMsIdx,
                                         UInt32 prevLinkID,
                                         UInt32 prevLinkQueId)
    {
        System_LinkInfo                   swmsInLinkInfo;
        Int i;
        Int32 status;
    
        if (0 == swMsIdx)
        {
            Vdis_getAvsyncConfig(VDIS_DEV_HDMI,avsyncPrm);
            avsyncPrm->displayLinkID        = Vdis_getDisplayId(VDIS_DEV_HDMI);
            avsyncPrm->videoSynchLinkID = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)];
        }
        else
        {
            Vdis_getAvsyncConfig(VDIS_DEV_DVO2,avsyncPrm);
            avsyncPrm->displayLinkID        = Vdis_getDisplayId(VDIS_DEV_DVO2);
            avsyncPrm->videoSynchLinkID = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)];
        }
        System_linkGetInfo(prevLinkID,&swmsInLinkInfo);
        OSA_assert(swmsInLinkInfo.numQue > prevLinkQueId);
    
        avsyncPrm->numCh            = swmsInLinkInfo.queInfo[prevLinkQueId].numCh;
        avsyncPrm->syncMasterChnum = AVSYNC_INVALID_CHNUM;
        for (i = 0; i < avsyncPrm->numCh;i++)
        {
            multich_hddvr_set_avsync_vidque_prm(&avsyncPrm->queCfg[i],
                                                   i,
                                                   gVcapModuleContext.vcapConfig.numChn,
                                                   (gVcapModuleContext.vcapConfig.numChn + (gVdecModuleContext.vdecConfig.numChn - 1)));
        }
        if (0 == swMsIdx)
        {
            Vdis_setAvsyncConfig(VDIS_DEV_HDMI,avsyncPrm);
        }
        else
        {
            //OSA_assert(0);
            Vdis_setAvsyncConfig(VDIS_DEV_DVO2,avsyncPrm);
        }
    
        status = Avsync_configSyncConfigInfo(avsyncPrm);
        OSA_assert(status == 0);
    
    }
    
    static
    Void multich_hddvr_set_declink_prms(DecLink_CreateParams *decPrm)
    {
        int i;
    
        gVdecModuleContext.vdecConfig.numChn = MAX_NUM_DECODE_CHANNELS;
        for (i=0; i<gVdecModuleContext.vdecConfig.numChn; i++)
        {
            decPrm->chCreateParams[i].format                 = IVIDEO_H264HP;
            decPrm->chCreateParams[i].profile                = IH264VDEC_PROFILE_ANY;
            decPrm->chCreateParams[i].processCallLevel       = VDEC_FRAMELEVELPROCESSCALL;
            decPrm->chCreateParams[i].targetMaxWidth         = 1920;
            decPrm->chCreateParams[i].targetMaxHeight        = 1080;
            decPrm->chCreateParams[i].numBufPerCh            = NUM_BUFS_PER_CH_DEC;
            decPrm->chCreateParams[i].tilerEnable            = TILER_ENABLE_DECODE;
            decPrm->chCreateParams[i].defaultDynamicParams.targetFrameRate = gVdecModuleContext.vdecConfig.decChannelParams[i].dynamicParam.frameRate;
            decPrm->chCreateParams[i].defaultDynamicParams.targetBitRate   = gVdecModuleContext.vdecConfig.decChannelParams[i].dynamicParam.targetBitRate;
        }
    }
    
    static
    Void multich_hddvr_set_ipcbitsout_hlos_prms(IpcBitsOutLinkHLOS_CreateParams * ipcBitsOutHostPrm)
    {
        int i;
    
        for (i = 0;
             i < (MAX_NUM_DECODE_CHANNELS);
             i++)
        {
            System_LinkChInfo *pChInfo;
    
            pChInfo = &ipcBitsOutHostPrm->inQueInfo.chInfo[i];
    
            pChInfo->bufType        = 0; // NOT USED
            pChInfo->codingformat   = 0; // NOT USED
            pChInfo->dataFormat     = 0; // NOT USED
            pChInfo->memType        = 0; // NOT USED
            pChInfo->startX         = 0; // NOT USED
            pChInfo->startY         = 0; // NOT USED
            pChInfo->width          = 1920;
            pChInfo->height         = 1080;
            pChInfo->pitch[0]       = 0; // NOT USED
            pChInfo->pitch[1]       = 0; // NOT USED
            pChInfo->pitch[2]       = 0; // NOT USED
            pChInfo->scanFormat     = SYSTEM_SF_PROGRESSIVE;
    
            ipcBitsOutHostPrm->maxQueueDepth[i] =
                MAX_BUFFERING_QUEUE_LEN_PER_CH;
            ipcBitsOutHostPrm->chMaxReqBufSize[i] = (pChInfo->width * pChInfo->height);
            ipcBitsOutHostPrm->totalBitStreamBufferSize [i] =
                    (ipcBitsOutHostPrm->chMaxReqBufSize[i] * BIT_BUF_LENGTH_LIMIT_FACTOR_HD);
        }
        ipcBitsOutHostPrm->baseCreateParams.noNotifyMode   = FALSE;
        ipcBitsOutHostPrm->baseCreateParams.notifyNextLink = TRUE;
        ipcBitsOutHostPrm->baseCreateParams.numOutQue      = 1;
        ipcBitsOutHostPrm->inQueInfo.numCh                 = MAX_NUM_DECODE_CHANNELS;
    }
    
    static
    Void multich_hddvr_set_display_prms(DisplayLink_CreateParams *displayPrm,
                                            UInt32 maxOutRes)
    {
        displayPrm->displayRes = maxOutRes;
    }
    
    static
    Void multich_hddvr_set_link_ids()
    {
        int    i;
    
        gVcapModuleContext.captureId    = SYSTEM_LINK_ID_CAPTURE;
    
        for (i = 0; i < NUM_MERGE_LINK;i++)
        {
            gHdDvrUsecaseContext.mergeId[i] = SYSTEM_VPSS_LINK_ID_MERGE_0 + i;
        }
        for (i = 0; i < NUM_NSF_LINK;i++)
        {
            gVcapModuleContext.nsfId[i]         = SYSTEM_LINK_ID_NSF_0 + i;
        }
    
        gVcapModuleContext.deiId[DEIHQ_FULL_RES]     = SYSTEM_LINK_ID_DEI_HQ_0;
    
        gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)]    = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0;
        gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)]      = SYSTEM_LINK_ID_SW_MS_MULTI_INST_1;
    
        gVdisModuleContext.displayId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)] = SYSTEM_LINK_ID_DISPLAY_0; /* ON CHIP HDMI */
        gVdisModuleContext.displayId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)] = SYSTEM_LINK_ID_DISPLAY_1; /* OFF CHIP HDMI */
    //    gVdisModuleContext.displayId[Vdis_getDisplayContextIndex(VDIS_DEV_SD)]   = SYSTEM_LINK_ID_DISPLAY_2; /* SD HDMI */
    
        gHdDvrUsecaseContext.grpxId[0]                       = SYSTEM_LINK_ID_GRPX_0;
        gHdDvrUsecaseContext.grpxId[1]                       = SYSTEM_LINK_ID_GRPX_1;
    
        for (i = 0; i < NUM_DUP_LINK;i++)
        {
            gHdDvrUsecaseContext.dupId[i] = SYSTEM_VPSS_LINK_ID_DUP_0 + i;
        }
    
        gVencModuleContext.encId        = SYSTEM_LINK_ID_VENC_0;
        gVdecModuleContext.decId        = SYSTEM_LINK_ID_VDEC_0;
    
        gHdDvrUsecaseContext.ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;
        gHdDvrUsecaseContext.ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0;
    
        gHdDvrUsecaseContext.ipcOutVideoId= SYSTEM_VIDEO_LINK_ID_IPC_OUT_M3_0;
        gHdDvrUsecaseContext.ipcInVpssId  = SYSTEM_VPSS_LINK_ID_IPC_IN_M3_0;
    
        gVencModuleContext.ipcBitsOutRTOSId     = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0;
        gVencModuleContext.ipcBitsInHLOSId   = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;
    
        gVdecModuleContext.ipcBitsOutHLOSId     = SYSTEM_HOST_LINK_ID_IPC_BITS_OUT_0;
        gVdecModuleContext.ipcBitsInRTOSId      = SYSTEM_VIDEO_LINK_ID_IPC_BITS_IN_0;
    
        gVdisModuleContext.setMosaicFxn         = MultiCh_hdDvrSetMosaicParams;
    }
    
    static
    Void multich_hddvr_reset_link_ids()
    {
        int    i;
    
        gVcapModuleContext.captureId    = SYSTEM_LINK_ID_INVALID;
    
        for (i = 0; i < NUM_NSF_LINK;i++)
        {
            gVcapModuleContext.nsfId[i]         = SYSTEM_LINK_ID_INVALID;
        }
        for(i=0; i<NUM_DEI_LINK; i++)
        {
            gVcapModuleContext.deiId[i]     = SYSTEM_LINK_ID_INVALID;
        }
    
        gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)]      = SYSTEM_LINK_ID_INVALID;
        gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)]      = SYSTEM_LINK_ID_INVALID;
    
        gVdisModuleContext.displayId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)] = SYSTEM_LINK_ID_INVALID; /* ON CHIP HDMI */
        gVdisModuleContext.displayId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)] = SYSTEM_LINK_ID_INVALID; /* OFF CHIP HDMI */
    //    gVdisModuleContext.displayId[Vdis_getDisplayContextIndex(VDIS_DEV_SD)] = SYSTEM_LINK_ID_INVALID; /* SD HDMI */
    
        gHdDvrUsecaseContext.grpxId[0]                       = SYSTEM_LINK_ID_INVALID;
        gHdDvrUsecaseContext.grpxId[1]                       = SYSTEM_LINK_ID_INVALID;
    
        for (i = 0; i < NUM_MERGE_LINK;i++)
        {
            gHdDvrUsecaseContext.mergeId[i] = SYSTEM_LINK_ID_INVALID;
        }
        for (i = 0; i < NUM_DUP_LINK;i++)
        {
            gHdDvrUsecaseContext.dupId[i] = SYSTEM_LINK_ID_INVALID;
        }
    
        gVencModuleContext.encId        = SYSTEM_LINK_ID_INVALID;
        gVdecModuleContext.decId        = SYSTEM_LINK_ID_INVALID;
    
        gHdDvrUsecaseContext.ipcOutVpssId = SYSTEM_LINK_ID_INVALID;
        gHdDvrUsecaseContext.ipcInVideoId = SYSTEM_LINK_ID_INVALID;
    
        gHdDvrUsecaseContext.ipcOutVideoId= SYSTEM_LINK_ID_INVALID;
        gHdDvrUsecaseContext.ipcInVpssId  = SYSTEM_LINK_ID_INVALID;
    
        gVencModuleContext.ipcBitsOutRTOSId  = SYSTEM_LINK_ID_INVALID;
        gVencModuleContext.ipcBitsInHLOSId   = SYSTEM_LINK_ID_INVALID;
    
        gVdecModuleContext.ipcBitsOutHLOSId  = SYSTEM_LINK_ID_INVALID;
        gVdecModuleContext.ipcBitsInRTOSId  = SYSTEM_LINK_ID_INVALID;
    
        gVdisModuleContext.setMosaicFxn     = NULL;
    }
    
    static
    Void multich_hddvr_connect_encode_links()
    {
        /* ipcOutVpssIdisOutVpssId ---Q0---> ipcInVideoId */
        gHdDvrUsecaseContext.ipcOutVpssPrm.inQueParams.prevLinkId    = gHdDvrUsecaseContext.mergeId[MERGE_ENCODE];
        gHdDvrUsecaseContext.ipcOutVpssPrm.inQueParams.prevLinkQueId = 0;
        gHdDvrUsecaseContext.ipcOutVpssPrm.outQueParams[0].nextLink  = gHdDvrUsecaseContext.ipcInVideoId;
        gHdDvrUsecaseContext.ipcOutVpssPrm.notifyNextLink            = FALSE;
        gHdDvrUsecaseContext.ipcOutVpssPrm.notifyPrevLink            = TRUE;
        gHdDvrUsecaseContext.ipcOutVpssPrm.noNotifyMode              = TRUE;
    
        MULTICH_HDDVR_CREATE_LINK(
            gHdDvrUsecaseContext.ipcOutVpssId,
            gHdDvrUsecaseContext.ipcOutVpssPrm
        );
    
    
        /* ipcInVideoId ---Q0---> encId */
        gHdDvrUsecaseContext.ipcInVideoPrm.inQueParams.prevLinkId    = gHdDvrUsecaseContext.ipcOutVpssId;
        gHdDvrUsecaseContext.ipcInVideoPrm.inQueParams.prevLinkQueId = 0;
        gHdDvrUsecaseContext.ipcInVideoPrm.numOutQue                 = 1;
        gHdDvrUsecaseContext.ipcInVideoPrm.outQueParams[0].nextLink  = gVencModuleContext.encId;
        gHdDvrUsecaseContext.ipcInVideoPrm.notifyNextLink            = TRUE;
        gHdDvrUsecaseContext.ipcInVideoPrm.notifyPrevLink            = FALSE;
        gHdDvrUsecaseContext.ipcInVideoPrm.noNotifyMode              = TRUE;
    
        MULTICH_HDDVR_CREATE_LINK(
            gHdDvrUsecaseContext.ipcInVideoId,
            gHdDvrUsecaseContext.ipcInVideoPrm
        );
    
    
        /* encId ---Q0---> ipcBitsOutRTOSId */
        multich_hddvr_set_enclink_prm(&gHdDvrUsecaseContext.encPrm);
        gHdDvrUsecaseContext.encPrm.inQueParams.prevLinkId    = gHdDvrUsecaseContext.ipcInVideoId;
        gHdDvrUsecaseContext.encPrm.inQueParams.prevLinkQueId = 0;
        gHdDvrUsecaseContext.encPrm.outQueParams.nextLink     = gVencModuleContext.ipcBitsOutRTOSId;
    
        MULTICH_HDDVR_CREATE_LINK(
            gVencModuleContext.encId,
            gHdDvrUsecaseContext.encPrm
        );
    
        /* ipcBitsOutVideoId ---Q0---> ipcBitsInHostId */
        gHdDvrUsecaseContext.ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId    = gVencModuleContext.encId;
        gHdDvrUsecaseContext.ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
        gHdDvrUsecaseContext.ipcBitsOutVideoPrm.baseCreateParams.numOutQue                 = 1;
        gHdDvrUsecaseContext.ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink  = gVencModuleContext.ipcBitsInHLOSId;
        MultiCh_ipcBitsInitCreateParams_BitsOutRTOS(&gHdDvrUsecaseContext.ipcBitsOutVideoPrm,
                                                   TRUE);
        gHdDvrUsecaseContext.ipcBitsInHostPrm[0].baseCreateParams.inQueParams.prevLinkId    = gVencModuleContext.ipcBitsOutRTOSId;
        gHdDvrUsecaseContext.ipcBitsInHostPrm[0].baseCreateParams.inQueParams.prevLinkQueId = 0;
    
        MULTICH_HDDVR_CREATE_LINK(
            gVencModuleContext.ipcBitsOutRTOSId,
            gHdDvrUsecaseContext.ipcBitsOutVideoPrm
        );
    
        MultiCh_ipcBitsInitCreateParams_BitsInHLOS(&gHdDvrUsecaseContext.ipcBitsInHostPrm[0]);
        MULTICH_HDDVR_CREATE_LINK(
            gVencModuleContext.ipcBitsInHLOSId,
            gHdDvrUsecaseContext.ipcBitsInHostPrm[0]
        );
    }
    
    static
    Void multich_hddvr_connect_decode_links()
    {
        /* ipcBitsOutHostId ---Q0---> ipcBitsInRtosId */
        multich_hddvr_set_ipcbitsout_hlos_prms(&gHdDvrUsecaseContext.ipcBitsOutHostPrm);
        gHdDvrUsecaseContext.ipcBitsOutHostPrm.baseCreateParams.outQueParams[0].nextLink    = gVdecModuleContext.ipcBitsInRTOSId;
    
        MULTICH_HDDVR_CREATE_LINK(
            gVdecModuleContext.ipcBitsOutHLOSId,
            gHdDvrUsecaseContext.ipcBitsOutHostPrm
        );
    
        /* ipcBitsInRtosId ---Q0---> decId */
        gHdDvrUsecaseContext.ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkId      = gVdecModuleContext.ipcBitsOutHLOSId;
        gHdDvrUsecaseContext.ipcBitsInVideoPrm.baseCreateParams.inQueParams.prevLinkQueId   = 0;
        gHdDvrUsecaseContext.ipcBitsInVideoPrm.baseCreateParams.numOutQue                    = 1;
        gHdDvrUsecaseContext.ipcBitsInVideoPrm.baseCreateParams.outQueParams[0].nextLink     = gVdecModuleContext.decId;
        MultiCh_ipcBitsInitCreateParams_BitsInRTOS(&gHdDvrUsecaseContext.ipcBitsInVideoPrm, TRUE);
    
        MULTICH_HDDVR_CREATE_LINK(
            gVdecModuleContext.ipcBitsInRTOSId,
            gHdDvrUsecaseContext.ipcBitsInVideoPrm
        );
    
        /* decId---Q0--->ipcOutVideoId*/
        multich_hddvr_set_declink_prms(&gHdDvrUsecaseContext.decPrm);
        gHdDvrUsecaseContext.decPrm.inQueParams.prevLinkId    = gVdecModuleContext.ipcBitsInRTOSId;
        gHdDvrUsecaseContext.decPrm.inQueParams.prevLinkQueId = 0;
        gHdDvrUsecaseContext.decPrm.outQueParams.nextLink  = gHdDvrUsecaseContext.ipcOutVideoId;
    
        MULTICH_HDDVR_CREATE_LINK(
            gVdecModuleContext.decId,
            gHdDvrUsecaseContext.decPrm
        );
    
        /*ipcOutVideoId---Q0-->ipcInVpssId*/
        gHdDvrUsecaseContext.ipcOutVideoPrm.inQueParams.prevLinkId    = gVdecModuleContext.decId;
        gHdDvrUsecaseContext.ipcOutVideoPrm.inQueParams.prevLinkQueId = 0;
        gHdDvrUsecaseContext.ipcOutVideoPrm.numOutQue                 = 1;
        gHdDvrUsecaseContext.ipcOutVideoPrm.outQueParams[0].nextLink  = gHdDvrUsecaseContext.ipcInVpssId;
        gHdDvrUsecaseContext.ipcOutVideoPrm.notifyNextLink            = FALSE;
        gHdDvrUsecaseContext.ipcOutVideoPrm.notifyPrevLink            = TRUE;
        gHdDvrUsecaseContext.ipcOutVideoPrm.noNotifyMode              = TRUE;
    
        MULTICH_HDDVR_CREATE_LINK(
            gHdDvrUsecaseContext.ipcOutVideoId,
            gHdDvrUsecaseContext.ipcOutVideoPrm
        );
    
        /*ipcInVpssId---Q0--> mergeId[MERGE_DISPLAY] */
        gHdDvrUsecaseContext.ipcInVpssPrm.inQueParams.prevLinkId    = gHdDvrUsecaseContext.ipcOutVideoId;
        gHdDvrUsecaseContext.ipcInVpssPrm.inQueParams.prevLinkQueId = 0;
        gHdDvrUsecaseContext.ipcInVpssPrm.numOutQue                 = 1;
        gHdDvrUsecaseContext.ipcInVpssPrm.outQueParams[0].nextLink  = gHdDvrUsecaseContext.mergeId[MERGE_DISPLAY];
        gHdDvrUsecaseContext.ipcInVpssPrm.notifyNextLink            = TRUE;
        gHdDvrUsecaseContext.ipcInVpssPrm.notifyPrevLink            = FALSE;
        gHdDvrUsecaseContext.ipcInVpssPrm.noNotifyMode              = TRUE;
    
        MULTICH_HDDVR_CREATE_LINK(
            gHdDvrUsecaseContext.ipcInVpssId,
            gHdDvrUsecaseContext.ipcInVpssPrm
        );
    }
    
    // HDMI,DVO2ͬʱ���
    static
    Void multich_hddvr_connect_display_links()
    {
        /* MERGE Link
            to merge input for display from low res live, playback and high res live
        */
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].numInQue = 2;
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].inQueParams[0].prevLinkId    = gHdDvrUsecaseContext.dupId[DUP_FULL_RES_CAPTURE];
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].inQueParams[0].prevLinkQueId = 0;
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].inQueParams[1].prevLinkId    = gHdDvrUsecaseContext.ipcInVpssId;
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].inQueParams[1].prevLinkQueId = 0;
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].outQueParams.nextLink        = gHdDvrUsecaseContext.dupId[DUP_DISPLAY];
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].notifyNextLink               = TRUE;
    
        MULTICH_HDDVR_CREATE_LINK(
            gHdDvrUsecaseContext.mergeId[MERGE_DISPLAY],
            gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY]
        );
    
        /*dupId[DUP_DISPLAY]---Q0--> swMsId[0] */
        /*dupId[DUP_DISPLAY]---Q1--> swMsId[1] */
        gHdDvrUsecaseContext.dupPrm[DUP_DISPLAY].inQueParams.prevLinkId       = gHdDvrUsecaseContext.mergeId[MERGE_DISPLAY];
        gHdDvrUsecaseContext.dupPrm[DUP_DISPLAY].inQueParams.prevLinkQueId      = 0;
        gHdDvrUsecaseContext.dupPrm[DUP_DISPLAY].numOutQue                      = 2;
        gHdDvrUsecaseContext.dupPrm[DUP_DISPLAY].outQueParams[0].nextLink       = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)];
        gHdDvrUsecaseContext.dupPrm[DUP_DISPLAY].outQueParams[1].nextLink       = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)];
        gHdDvrUsecaseContext.dupPrm[DUP_DISPLAY].notifyNextLink                 = TRUE;
    
        MULTICH_HDDVR_CREATE_LINK(
            gHdDvrUsecaseContext.dupId[DUP_DISPLAY],
            gHdDvrUsecaseContext.dupPrm[DUP_DISPLAY]
        );
    
        /* Avsync configuration for SwMs[0] */
        multich_hddvr_set_avsync_prm(&gHdDvrUsecaseContext.avsyncCfg[0],
                                    0,
                                    gHdDvrUsecaseContext.dupId[DUP_DISPLAY],
                                    0);
    #if 0
        /*swMsId[0]---Q0--> displayId[VDIS_DEV_HDMI] */
        multich_hddvr_set_swms_prm(&gHdDvrUsecaseContext.swMsPrm[0], 0);
        gHdDvrUsecaseContext.swMsPrm[0].inQueParams.prevLinkId    = gHdDvrUsecaseContext.dupId[DUP_DISPLAY];
        gHdDvrUsecaseContext.swMsPrm[0].inQueParams.prevLinkQueId = 0;
        gHdDvrUsecaseContext.swMsPrm[0].outQueParams.nextLink     = Vdis_getDisplayId(VDIS_DEV_HDMI);
    
        MULTICH_HDDVR_CREATE_LINK(
            gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)],
            gHdDvrUsecaseContext.swMsPrm[0]
        );
    
        gHdDvrUsecaseContext.swmsLayoutPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)] = gHdDvrUsecaseContext.swMsPrm[0].layoutPrm;
    #endif
        /*swMsId[1]---Q1--> displayId[VDIS_DEV_DVO2] */
        multich_hddvr_set_swms_prm(&gHdDvrUsecaseContext.swMsPrm[1], 1);
        gHdDvrUsecaseContext.swMsPrm[1].inQueParams.prevLinkId    = gHdDvrUsecaseContext.dupId[DUP_DISPLAY];
        gHdDvrUsecaseContext.swMsPrm[1].inQueParams.prevLinkQueId = 1;
        gHdDvrUsecaseContext.swMsPrm[1].outQueParams.nextLink     = Vdis_getDisplayId(VDIS_DEV_DVO2);
    
        MULTICH_HDDVR_CREATE_LINK(
            gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)],
            gHdDvrUsecaseContext.swMsPrm[1]
        );
    
        gHdDvrUsecaseContext.swmsLayoutPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)] = gHdDvrUsecaseContext.swMsPrm[1].layoutPrm;
    
    #if 0
        multich_hddvr_set_display_prms(
            &gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)],
            gHdDvrUsecaseContext.swMsPrm[0].initOutRes
        );
        gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)].numInputQueues = 1;
        gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)].inQueParams[0].prevLinkId    = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)];
        gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)].inQueParams[0].prevLinkQueId = 0;
    
        MULTICH_HDDVR_CREATE_LINK(
            Vdis_getDisplayId(VDIS_DEV_HDMI),
            gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)]
        );
    #endif
        multich_hddvr_set_display_prms(
            &gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)],
            gHdDvrUsecaseContext.swMsPrm[1].initOutRes
        );
        gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)].numInputQueues = 1;
        gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)].inQueParams[0].prevLinkId    = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)];
        gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)].inQueParams[0].prevLinkQueId = 0;
    
        MULTICH_HDDVR_CREATE_LINK(
            Vdis_getDisplayId(VDIS_DEV_DVO2),
            gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)]
        );
    }
    
    // ֻHDMI���
    static
    Void multich_hddvr_connect_display_links2()
    {
        /* MERGE Link
            to merge input for display from low res live, playback and high res live
        */
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].numInQue = 2;
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].inQueParams[0].prevLinkId    = gHdDvrUsecaseContext.dupId[DUP_FULL_RES_CAPTURE];
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].inQueParams[0].prevLinkQueId = 0;
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].inQueParams[1].prevLinkId    = gHdDvrUsecaseContext.ipcInVpssId;
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].inQueParams[1].prevLinkQueId = 0;
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].outQueParams.nextLink        = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)];
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].notifyNextLink               = TRUE;
    
        MULTICH_HDDVR_CREATE_LINK(
            gHdDvrUsecaseContext.mergeId[MERGE_DISPLAY],
            gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY]
        );
    
        /*swMsId[0]---Q0--> displayId[VDIS_DEV_HDMI] */
        multich_hddvr_set_swms_prm(&gHdDvrUsecaseContext.swMsPrm[0], 0);
        gHdDvrUsecaseContext.swMsPrm[0].inQueParams.prevLinkId    = gHdDvrUsecaseContext.mergeId[MERGE_DISPLAY];
        gHdDvrUsecaseContext.swMsPrm[0].inQueParams.prevLinkQueId = 0;
        gHdDvrUsecaseContext.swMsPrm[0].outQueParams.nextLink     = Vdis_getDisplayId(VDIS_DEV_HDMI);
    
        MULTICH_HDDVR_CREATE_LINK(
            gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)],
            gHdDvrUsecaseContext.swMsPrm[0]
        );
    
        gHdDvrUsecaseContext.swmsLayoutPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)] = gHdDvrUsecaseContext.swMsPrm[0].layoutPrm;
    
        multich_hddvr_set_display_prms(
            &gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)],
            gHdDvrUsecaseContext.swMsPrm[0].initOutRes
        );
        gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)].numInputQueues = 1;
        gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)].inQueParams[0].prevLinkId    = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)];
        gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)].inQueParams[0].prevLinkQueId = 0;
    
        MULTICH_HDDVR_CREATE_LINK(
            Vdis_getDisplayId(VDIS_DEV_HDMI),
            gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_HDMI)]
        );
    }
    
    // ֻDVO2���
    static
    Void multich_hddvr_connect_display_links3()
    {
        /* MERGE Link
            to merge input for display from low res live, playback and high res live
        */
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].numInQue = 2;
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].inQueParams[0].prevLinkId    = gHdDvrUsecaseContext.dupId[DUP_FULL_RES_CAPTURE];
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].inQueParams[0].prevLinkQueId = 0;
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].inQueParams[1].prevLinkId    = gHdDvrUsecaseContext.ipcInVpssId;
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].inQueParams[1].prevLinkQueId = 0;
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].outQueParams.nextLink        = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)];
        gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY].notifyNextLink               = TRUE;
    
        MULTICH_HDDVR_CREATE_LINK(
            gHdDvrUsecaseContext.mergeId[MERGE_DISPLAY],
            gHdDvrUsecaseContext.mergePrm[MERGE_DISPLAY]
        );
    
        /*swMsId[1]---Q1--> displayId[VDIS_DEV_DVO2] */
        multich_hddvr_set_swms_prm(&gHdDvrUsecaseContext.swMsPrm[1], 1);
        gHdDvrUsecaseContext.swMsPrm[1].inQueParams.prevLinkId    = gHdDvrUsecaseContext.mergeId[MERGE_DISPLAY];
        gHdDvrUsecaseContext.swMsPrm[1].inQueParams.prevLinkQueId = 0;
        gHdDvrUsecaseContext.swMsPrm[1].outQueParams.nextLink     = Vdis_getDisplayId(VDIS_DEV_DVO2);
    
        MULTICH_HDDVR_CREATE_LINK(
            gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)],
            gHdDvrUsecaseContext.swMsPrm[1]
        );
    
        gHdDvrUsecaseContext.swmsLayoutPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)] = gHdDvrUsecaseContext.swMsPrm[1].layoutPrm;
    
        multich_hddvr_set_display_prms(
            &gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)],
            gHdDvrUsecaseContext.swMsPrm[1].initOutRes
        );
        gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)].numInputQueues = 1;
        gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)].inQueParams[0].prevLinkId    = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)];
        gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)].inQueParams[0].prevLinkQueId = 0;
    
        MULTICH_HDDVR_CREATE_LINK(
            Vdis_getDisplayId(VDIS_DEV_DVO2),
            gHdDvrUsecaseContext.displayPrm[Vdis_getDisplayContextIndex(VDIS_DEV_DVO2)]
        );
    }
    
    static
    Void multich_hddvr_connect_links(Bool   enableScdAlgLink)
    {
        DeiLink_OutputScaleFactor outScaleFactorDeiSc, outScaleFactorVipSc;
    
        gVcapModuleContext.vcapConfig.enableConfigExtVideoDecoder = FALSE;
    
        /* Capture Link */
        multich_hddvr_set_capture_prm(&gHdDvrUsecaseContext.capturePrm);
        gHdDvrUsecaseContext.capturePrm.outQueParams[0].nextLink = gHdDvrUsecaseContext.dupId[DUP_FULL_RES_CAPTURE];
    
        MULTICH_HDDVR_CREATE_LINK(
            gVcapModuleContext.captureId,
            gHdDvrUsecaseContext.capturePrm
        );
    
        /* DUP Full resolution capture
            1st DUP for high res live preview
            2nd DUP for H264 encode scaling, low res live preview scaling
            3rd DUP for MJPEG encode
        */
        gHdDvrUsecaseContext.dupPrm[DUP_FULL_RES_CAPTURE].inQueParams.prevLinkId    = gVcapModuleContext.captureId;
        gHdDvrUsecaseContext.dupPrm[DUP_FULL_RES_CAPTURE].inQueParams.prevLinkQueId = 0;
    
        gHdDvrUsecaseContext.dupPrm[DUP_FULL_RES_CAPTURE].numOutQue                 = 2;
        gHdDvrUsecaseContext.dupPrm[DUP_FULL_RES_CAPTURE].outQueParams[0].nextLink  = gHdDvrUsecaseContext.mergeId[MERGE_DISPLAY];
        gHdDvrUsecaseContext.dupPrm[DUP_FULL_RES_CAPTURE].outQueParams[1].nextLink  = gVcapModuleContext.deiId[DEIHQ_FULL_RES];
    
        gHdDvrUsecaseContext.dupPrm[DUP_FULL_RES_CAPTURE].notifyNextLink            = TRUE;
    
        MULTICH_HDDVR_CREATE_LINK(
            gHdDvrUsecaseContext.dupId[DUP_FULL_RES_CAPTURE],
            gHdDvrUsecaseContext.dupPrm[DUP_FULL_RES_CAPTURE]
        );
    
        /* DEIHQ link create
            used in bypass mode as scalar
            1st output is Quater of high res input and is used as secondary encode scaling
            2nd output is through VIP-SC YUV420 and is used for high res encode
        */
    
        /* 1/2 scaling */
        outScaleFactorDeiSc.scaleMode = DEI_SCALE_MODE_RATIO;
        outScaleFactorDeiSc.ratio.widthRatio.numerator     = 1;
        outScaleFactorDeiSc.ratio.widthRatio.denominator   = 4;
        outScaleFactorDeiSc.ratio.heightRatio.numerator    = 1;
        outScaleFactorDeiSc.ratio.heightRatio.denominator  = 4;
    
        /* 1:1 scaling */
        outScaleFactorVipSc.scaleMode = DEI_SCALE_MODE_RATIO;
        outScaleFactorVipSc.ratio.widthRatio.numerator     = 1;
        outScaleFactorVipSc.ratio.widthRatio.denominator   = 1;
        outScaleFactorVipSc.ratio.heightRatio.numerator    = 1;
        outScaleFactorVipSc.ratio.heightRatio.denominator  = 1;
        if (1) {
        	int xres, yres;
    			if (hrecGetMovieResolution(&xres, &yres) >= 0) {
    				if (xres != yres && xres < 1920 && yres < 1080) {
    			    outScaleFactorVipSc.ratio.widthRatio.numerator     = xres;
    			    outScaleFactorVipSc.ratio.widthRatio.denominator   = 1920;
    			    outScaleFactorVipSc.ratio.heightRatio.numerator    = yres;
    			    outScaleFactorVipSc.ratio.heightRatio.denominator  = 1080;
    			  }
    			}
    		}
    
        /* DEIHQ */
        multich_hddvr_set_dei_prm(&gHdDvrUsecaseContext.deiPrm[DEIHQ_FULL_RES], &outScaleFactorDeiSc, &outScaleFactorVipSc);
    
        gHdDvrUsecaseContext.deiPrm[DEIHQ_FULL_RES].inQueParams.prevLinkId    = gHdDvrUsecaseContext.dupId[DUP_FULL_RES_CAPTURE];
        gHdDvrUsecaseContext.deiPrm[DEIHQ_FULL_RES].inQueParams.prevLinkQueId = 1;
        gHdDvrUsecaseContext.deiPrm[DEIHQ_FULL_RES].outQueParams[DEI_LINK_OUT_QUE_DEI_SC].nextLink = gVcapModuleContext.nsfId[NSF_Q_RES_CAPTURE];
        gHdDvrUsecaseContext.deiPrm[DEIHQ_FULL_RES].outQueParams[DEI_LINK_OUT_QUE_VIP_SC].nextLink = gHdDvrUsecaseContext.mergeId[MERGE_ENCODE];
    
        MULTICH_HDDVR_CREATE_LINK(
            gVcapModuleContext.deiId[DEIHQ_FULL_RES],
            gHdDvrUsecaseContext.deiPrm[DEIHQ_FULL_RES]
        );
    
        /* NSF link
            to convert YUV422 data to YUV420, this is to save DDR BW (double read issue with YUV422 input) at
            subsequent steps of scaling
        */
        multich_hddvr_set_nsf_prm(&gHdDvrUsecaseContext.nsfPrm[NSF_Q_RES_CAPTURE], NUM_BUFS_PER_CH_NSF_Q_RES_CAPTURE, 30);
    
        gHdDvrUsecaseContext.nsfPrm[NSF_Q_RES_CAPTURE].inQueParams.prevLinkId    = gVcapModuleContext.deiId[DEIHQ_FULL_RES];
        gHdDvrUsecaseContext.nsfPrm[NSF_Q_RES_CAPTURE].inQueParams.prevLinkQueId = DEI_LINK_OUT_QUE_DEI_SC;
        gHdDvrUsecaseContext.nsfPrm[NSF_Q_RES_CAPTURE].outQueParams[0].nextLink  = gHdDvrUsecaseContext.mergeId[MERGE_ENCODE];
    
        MULTICH_HDDVR_CREATE_LINK(
            gVcapModuleContext.nsfId[NSF_Q_RES_CAPTURE],
            gHdDvrUsecaseContext.nsfPrm[NSF_Q_RES_CAPTURE]
        );
    
        /* MERGE Link
            to merge input for H264 primary encode, H264 secondary encode, MJPEG encode
        */
        gHdDvrUsecaseContext.mergePrm[MERGE_ENCODE].numInQue = 2;
        gHdDvrUsecaseContext.mergePrm[MERGE_ENCODE].inQueParams[0].prevLinkId    = gVcapModuleContext.deiId[DEIHQ_FULL_RES];
        gHdDvrUsecaseContext.mergePrm[MERGE_ENCODE].inQueParams[0].prevLinkQueId = DEI_LINK_OUT_QUE_VIP_SC;
        gHdDvrUsecaseContext.mergePrm[MERGE_ENCODE].inQueParams[1].prevLinkId    = gVcapModuleContext.nsfId[NSF_Q_RES_CAPTURE];
        gHdDvrUsecaseContext.mergePrm[MERGE_ENCODE].inQueParams[1].prevLinkQueId = 0;
        gHdDvrUsecaseContext.mergePrm[MERGE_ENCODE].outQueParams.nextLink        = gHdDvrUsecaseContext.ipcOutVpssId;
        gHdDvrUsecaseContext.mergePrm[MERGE_ENCODE].notifyNextLink               = TRUE;
    
        MULTICH_HDDVR_CREATE_LINK(
            gHdDvrUsecaseContext.mergeId[MERGE_ENCODE],
            gHdDvrUsecaseContext.mergePrm[MERGE_ENCODE]
        );
    
    
        multich_hddvr_connect_encode_links();
        multich_hddvr_connect_decode_links();
        multich_hddvr_connect_display_links3(); // multich_hddvr_connect_display_links2();
    }
    
    Void MultiCh_createHdDvr()
    {
    
        multich_hddvr_reset_link_prms();
        multich_hddvr_set_link_ids();
        printf("\n********* Entered usecase HdDvr <816x> Cap/Enc/Dec/Dis \n\n");
    
        MultiCh_detectBoard();
    
        System_linkControl(
            SYSTEM_LINK_ID_M3VPSS,
            SYSTEM_M3VPSS_CMD_RESET_VIDEO_DEVICES,
            NULL,
            0,
            TRUE
            );
    
        System_linkControl(
            SYSTEM_LINK_ID_M3VIDEO,
            SYSTEM_COMMON_CMD_SET_CH2IVAHD_MAP_TBL,
            &systemVid_encDecIvaChMapTbl,
            sizeof(SystemVideo_Ivahd2ChMap_Tbl),
            TRUE
        );
    
        if ((FALSE == TILER_ENABLE_ENCODE) && (FALSE == TILER_ENABLE_DECODE))
        {
            SystemTiler_disableAllocator();
        }
        multich_hddvr_connect_links(gVsysModuleContext.vsysConfig.enableScd);
    }
    
    Void MultiCh_deleteHdDvr()
    {
        UInt32 i;
    
        for (i = 0; i < gHdDvrUsecaseContext.createdLinkCount; i++)
        {
            System_linkDelete (gHdDvrUsecaseContext.createdLinks[i]);
        }
        gHdDvrUsecaseContext.createdLinkCount = 0;
        multich_hddvr_reset_link_ids();
    
        Vcap_deleteVideoDecoder();
        /* Print the HWI, SWI and all tasks load */
        /* Reset the accumulated timer ticks */
        MultiCh_prfLoadCalcEnable(FALSE, TRUE, FALSE);
    }
    
    
    Int32 MultiCh_hdDvrSetMosaicParams(VDIS_DEV vdDevId, VDIS_MOSAIC_S *psVdMosaicParam )
    {
        UInt32 swMsId;
        Int32 retVal = -1;
        Uint32 numLiveCh=0, numPlayCh=0, numHighResCh=0;
        SwMsLink_LayoutPrm *vdisLayoutPrm;
        UInt32 winId, chId;
    
        swMsId = gVdisModuleContext.swMsId[Vdis_getDisplayContextIndex(vdDevId)];
        if(swMsId==SYSTEM_LINK_ID_INVALID)
            return -1;
    
        vdisLayoutPrm = &gHdDvrUsecaseContext.swmsLayoutPrm[Vdis_getDisplayContextIndex(vdDevId)];
    
        /* Get display resolution and coordinates */
        vdisLayoutPrm->numWin = psVdMosaicParam->numberOfWindows;
        vdisLayoutPrm->onlyCh2WinMapChanged = psVdMosaicParam->onlyCh2WinMapChanged;
        vdisLayoutPrm->outputFPS = psVdMosaicParam->outputFPS;
    
        /* Assign each windows coordinates, size and mapping */
        for(winId=0; winId<vdisLayoutPrm->numWin; winId++)
        {
            chId = psVdMosaicParam->chnMap[winId];
    
            vdisLayoutPrm->winInfo[winId].channelNum         = chId;
            vdisLayoutPrm->winInfo[winId].bufAddrOffset[0u]  = -1;
            vdisLayoutPrm->winInfo[winId].bufAddrOffset[1u]  = -1;
            vdisLayoutPrm->winInfo[winId].width              = psVdMosaicParam->winList[winId].width;
            vdisLayoutPrm->winInfo[winId].height             = psVdMosaicParam->winList[winId].height;
            vdisLayoutPrm->winInfo[winId].startX             = psVdMosaicParam->winList[winId].start_X;
            vdisLayoutPrm->winInfo[winId].startY             = psVdMosaicParam->winList[winId].start_Y;
            vdisLayoutPrm->winInfo[winId].bypass             = FALSE;
    
            if(chId >= (MAX_NUM_CAPTURE_CHANNELS+MAX_NUM_DECODE_CHANNELS))
            {
                /* not a valid CH ID, mark it as invalid */
                vdisLayoutPrm->winInfo[winId].channelNum = SYSTEM_SW_MS_INVALID_ID;
                continue;
            }
    
    #if 0 // HUOCP
            if(chId < gVdisModuleContext.vdisConfig.numChannels)
            {
                Vdis_setChn2WinMap(vdDevId, chId,winId);
    
                if(Vdis_isEnableChn(vdDevId,chId) == FALSE)
                {
                    vdisLayoutPrm->winInfo[winId].channelNum = SYSTEM_SW_MS_INVALID_ID;
                }
            }
    
            if(chId >= MAX_NUM_CAPTURE_CHANNELS && chId < (MAX_NUM_CAPTURE_CHANNELS+MAX_NUM_DECODE_CHANNELS))
                numPlayCh++;
            if(chId < MAX_NUM_CAPTURE_CHANNELS )
            {
                numLiveCh++;
                if( vdisLayoutPrm->winInfo[winId].width > (MAX_PRIMARY_WIDTH/2)
                    &&
                    vdisLayoutPrm->winInfo[winId].height > (MAX_PRIMARY_HEIGHT/2)
                    )
                {
                    if(numHighResCh==0)
                    {
                        /* switch to high res channel */
                        /* can have only one high res channel in a layout */
                        vdisLayoutPrm->winInfo[winId].channelNum = chId + (MAX_NUM_CAPTURE_CHANNELS);
                    }
    
                    numHighResCh++;
                }
            }
    #endif
        }
    
        Vdis_swMs_PrintLayoutParams(vdDevId, vdisLayoutPrm);
        System_linkControl(swMsId, SYSTEM_SW_MS_LINK_CMD_SWITCH_LAYOUT, (vdisLayoutPrm), sizeof(*vdisLayoutPrm), TRUE);
    
        return retVal;
    }
    
    void  MultiCh_hdDvrSwmsChReMap(VDIS_MOSAIC_S *psVdMosaicParam)
    {
        Int32 winId, chId;
    
        /*
            Convert from SW Moisac Ch ID  to McFW CH ID
    
            SWMS Ch ID                            McFW CH ID
            0..3   (low res live CHs in SWMS)     0..3        Live channels in McFW
            4..7   ( playback CHs in SWMS)        4..7        Playback channels in McFW
            8..11  (high res live CHs in SWMS)    0..3        Live channels in McFW
         */
    
        for (winId = 0; winId < psVdMosaicParam->numberOfWindows; winId++)
        {
            chId = psVdMosaicParam->chnMap[winId];
    
            if ( chId >= (MAX_NUM_CAPTURE_CHANNELS) )
            {
                if(chId != (UInt32)(VDIS_CHN_INVALID) )
                {
                    chId -= (MAX_NUM_CAPTURE_CHANNELS);
                    chId = (chId % MAX_NUM_CAPTURE_CHANNELS);
                }
            }
    
            psVdMosaicParam->chnMap[winId] = chId;
        }
    }
    
    Int32 MultiCh_hdDvrSetCapDynamicParamChn(VCAP_CHN vcChnId, VCAP_CHN_DYNAMIC_PARAM_S *psCapChnDynaParam, VCAP_PARAMS_E paramId)
    {
            return -1;
    }
    
    Int32 MultiCh_hdDvrGetCapDynamicParamChn(VCAP_CHN vcChnId, VCAP_CHN_DYNAMIC_PARAM_S *psCapChnDynaParam, VCAP_PARAMS_E paramId)
    {
            return -1;
    }
    
    Int32 MultiCh_hdDvrSetCapFrameRate(VCAP_CHN vcChnId, VCAP_STRM vcStrmId, Int32 inputFrameRate, Int32 outputFrameRate)
    {
            return -1;
    }
    
    Int32 MultiCh_hdDvrEnableDisableCapChn(VCAP_CHN vcChnId, VCAP_STRM vcStrmId, Bool enableChn)
    {
            return -1;
    }