Set partial pixel to be transparent in video

Peter Maersk-Moller pmaersk at gmail.com
Mon Sep 26 09:12:15 UTC 2016


Smaller correction

if (format != RGBA && format != BGRA && format != ARGB && format != ABGRA)
goto fail;
uint8_t *p = frame_address_start + ((start_row*width)+start_col)*4 +
(format == RGBA || format == BGRA) ? 3 : 0;
stride = (start_col + width - end_col) << 2;
for (j=start_row; j <= end_row; j++) {
    for (i=start_col; i <= end_col; i++) { *p = 0;  p += 4; }
    p += stride;
}

On Mon, Sep 26, 2016 at 11:10 AM, Peter Maersk-Moller <pmaersk at gmail.com>
wrote:

> Hi Sean.
>
> GStreamer uses RGBA in byteorder and not in word-order. See
> https://en.wikipedia.org/wiki/RGBA_color_space for byte-order/word-order.
>
> Your code is clearing the red component for the first half of the entire
> frame.
>
> BTW you code should be more efficient. Find the beginning of the first
> pixel address, add 3 for RGBA and BGRA (0 for ARGB/ABGR) and then
>
> Something like below
>
> ifr (format != RGBA && format != BGRA && format != ARGB && format !=
> ABGRA) goto fail;
> uint8_t *p = frame_address_start ((start_row*width)+start_col)*4 +
> (format == RGBA || format == BGRA) ? 3 : 0;
> stride = (start_col + width - end_col) << 2;
> for (j=start_row; j <= end_row; j++) {
>     for (i=start_col; i <= end_col; i++) { *p = 0;  p += 4; }
>     p += stride;
> }
>
> Only one byte setting and one 32 bit addition per pixel affected plus one
> 32 bit addition per line affected.
>
>
> On Mon, Sep 26, 2016 at 7:52 AM, Sean <csosmo at hotmail.com> wrote:
>
>> Hi,
>>
>> I wrote to customized element (myelement) to set partial pixels of one
>> video
>> frame to be transparent. My machine is little endian.
>>
>>
>> This is myelement implementation, I want to make the upper half of 640x480
>> (i.e. the upper 640x240 pixels ) invisible by setting the Alpha value to
>> be
>> 0x0
>>
>>     GstMapInfo info;
>>     if (!gst_buffer_map(buffer, &info, GST_MAP_READ)) {
>>       return GST_FLOW_ERROR;
>>     }
>>     for (int i  = 0; i < 240; i++) {
>>       for (int j = 0; j < 640; j++)
>>       info.data[(i*640+j)*4] = 0x0;
>>     }
>>     GST_FLOW_OK;
>>
>>
>> This is my test command:
>> gst_launch -v videotestsrc ! video/x-raw,format=RGBA,width=640,
>> height=480 !
>> videoconvert ! myelement ! x264enc ! mpegtsmux ! filesink location=test.ts
>>
>>  I expect the upper half of the test.ts should be transparent. However,
>> the
>> result is (row,col)=(0,4), (0,8) (0,12)...... become a GREEN pixel. Would
>> anyone help to comment which part is wrong?
>>
>> Thanks a lot.
>>
>>
>>
>> --
>> View this message in context: http://gstreamer-devel.966125.
>> n4.nabble.com/Set-partial-pixel-to-be-transparent-in-video-tp4679769.html
>> Sent from the GStreamer-devel mailing list archive at Nabble.com.
>> _______________________________________________
>> gstreamer-devel mailing list
>> gstreamer-devel at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20160926/83efd887/attachment.html>


More information about the gstreamer-devel mailing list