The alpha setting in NvBufferComposite is not in effect

I’m using NvBufferComposite to composite the image and the transparency setting doesn’t seem to work.

comp_param.dst_comp_rect_alpha[i] = 0.5f;

The image format is NvBufferColorFormat_ARGB32

Any suggestions are welcome.

Hi,
We have the sample demonstrating NvBufferComposite():

/usr/src/jetson_multimedia_api/samples/13_multi_camera

Please share a patch to the sample so that we can set up and check. And do you use Jetpack 4.6.2 or 4.6.3?

hi,
I refer to this example

/usr/src/jetson_multimedia_api/samples/13_multi_camera

jtop info


no minor version number is displayed

cat /etc/nv_tegra_release
# R32 (release), REVISION: 6.1, GCID: 27863751, BOARD: t186ref, EABI: aarch64, DATE: Mon Jul 26 19:36:31 UTC 2021

this is the mixed part of the code

int frame_comp()
{
    int32_t spacing = 10;
    NvBufferRect dstCompRect[3];
    NvBufferCreateParams input_params = {0};

    int32_t cellWidth = 300;
    int32_t cellHeight = 200;

    dstCompRect[0].top  = 0;
    dstCompRect[0].left = 0;
    dstCompRect[0].width = 1280;
    dstCompRect[0].height = 720;

    dstCompRect[1].top  = 0;
    dstCompRect[1].left = 0;
    dstCompRect[1].width = cellHeight;
    dstCompRect[1].height = cellWidth;

    dstCompRect[2].top  = 0;
    dstCompRect[2].left = cellWidth + spacing * 2;
    dstCompRect[2].width = cellWidth;
    dstCompRect[2].height = cellHeight;

    /* Allocate composited buffer */
    input_params.payloadType = NvBufferPayload_SurfArray;
    input_params.width = CAMWIDTH;
    input_params.height = CAMHEIGHT;
    input_params.layout = NvBufferLayout_Pitch;
    input_params.colorFormat = NvBufferColorFormat_ARGB32;
    input_params.nvbuf_tag = NvBufferTag_VIDEO_CONVERT;

    NvBufferCreateEx(&m_compositedFrame, &input_params);
    if (!m_compositedFrame)
        DLOG(ERROR) << "Failed to allocate composited buffer";

    memset(&m_compositeParam, 0, sizeof(m_compositeParam));
    m_compositeParam.composite_flag = NVBUFFER_COMPOSITE | NVBUFFER_COMPOSITE_FILTER;
    m_compositeParam.input_buf_count = 3;
    memcpy(m_compositeParam.dst_comp_rect, dstCompRect, sizeof(NvBufferRect) * m_compositeParam.input_buf_count);
    
    m_compositeParam.dst_comp_rect_alpha[0] = 1.0f;
    m_compositeParam.dst_comp_rect_alpha[1] = 0.5f;
    m_compositeParam.dst_comp_rect_alpha[2] = 0.5f;
    for (uint32_t i = 0; i < 3; i++)
    {
        m_compositeParam.composite_filter[i] = NvBufferTransform_Filter_Smart;
        m_compositeParam.src_comp_rect[i].top = 0;
        m_compositeParam.src_comp_rect[i].left = 0;
        m_compositeParam.src_comp_rect[i].width = 1280;
        m_compositeParam.src_comp_rect[i].height = 720;
    }
    NvBufferComposite(m_dmabufs, m_compositedFrame, &m_compositeParam);
    return m_compositedFrame;
}

Hi,
Please refer to the patch to 13_multi_camera sample:

--- a/multimedia_api/ll_samples/samples/13_multi_camera/main.cpp
+++ b/multimedia_api/ll_samples/samples/13_multi_camera/main.cpp
@@ -259,7 +259,7 @@ bool ConsumerThread::threadInitialize()
     input_params.width = STREAM_SIZE.width();
     input_params.height = STREAM_SIZE.height();
     input_params.layout = NvBufferLayout_Pitch;
-    input_params.colorFormat = NvBufferColorFormat_NV12;
+    input_params.colorFormat = NvBufferColorFormat_ABGR32;
     input_params.nvbuf_tag = NvBufferTag_VIDEO_CONVERT;
 
     NvBufferCreateEx (&m_compositedFrame, &input_params);
@@ -268,13 +268,16 @@ bool ConsumerThread::threadInitialize()
 
     /* Initialize composite parameters */
     memset(&m_compositeParam, 0, sizeof(m_compositeParam));
-    m_compositeParam.composite_flag = NVBUFFER_COMPOSITE;
+    m_compositeParam.composite_flag = NVBUFFER_COMPOSITE | NVBUFFER_BLEND;
     m_compositeParam.input_buf_count = m_streams.size();
     memcpy(m_compositeParam.dst_comp_rect, dstCompRect,
                 sizeof(NvBufferRect) * m_compositeParam.input_buf_count);
     for (uint32_t i = 0; i < 6; i++)
     {
-        m_compositeParam.dst_comp_rect_alpha[i] = 1.0f;
+        if (i == 0)
+            m_compositeParam.dst_comp_rect_alpha[i] = 0.9f;
+        if (i > 0)
+            m_compositeParam.dst_comp_rect_alpha[i] = 0.1f;
         m_compositeParam.src_comp_rect[i].top = 0;
         m_compositeParam.src_comp_rect[i].left = 0;
         m_compositeParam.src_comp_rect[i].width = STREAM_SIZE.width();
@@ -333,8 +336,8 @@ bool ConsumerThread::threadExecute()
             if (!m_dmabufs[i])
             {
                 m_dmabufs[i] = iNativeBuffer->createNvBuffer(iEglOutputStreams[i]->getResolution(),
-                                                          NvBufferColorFormat_YUV420,
-                                                          NvBufferLayout_BlockLinear);
+                                                          NvBufferColorFormat_ABGR32,
+                                                          NvBufferLayout_Pitch);
                 if (!m_dmabufs[i])
                     CONSUMER_PRINT("\tFailed to create NvBuffer\n");
             }

Please allocate NvBuffer in RGBA and add the flag NVBUFFER_BLEND

1 Like

thank you for your answer. no problem

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.