[Libav-user] Help : YUV value for a macroblock in a yuv240p frame

Boris ndjoreboris at gmail.com
Wed Apr 10 10:21:52 EEST 2019

```Le mar. 9 avr. 2019 à 17:44, Simon Brown <simon.k.brown at gmail.com> a écrit :

>
>> Thanks,
>> If I understand what you said, I have to proccess like this :
>>
>> //Declaration of yuv arrays
>> uint16_t yval[mb_height * mb_width][256];
>> uint16_t uval[mb_height * mb_width][256];
>> uint16_t vval[mb_height * mb_width][256];
>>
>> for(int mby=0;  mby<mb_height; mby++)
>> {
>>          for(int mbx=0; mbx <mb_width ;mbx++)
>>          {
>>              //Now for this 16x16 macroblock
>>             for(int y=0; y<16;y++)
>>             {
>>                for(int x=0; x<16;x++)
>>                {
>>                  yval[mby*mb_width + mbx][y*16+x] =
>> data[0][linesize[0]*y*16+x]; or yval[mby*mb_width + mbx][y*16+x] =
>> data[0][y*16+x]???
>>                  uval[mby*mb_width + mbx][(y/2)*16+x/2] =
>> data[1][linesize[1]*(y/2)*16+x/2];
>>                  uval[mby*mb_width + mbx][(y/2)*16+x/2] =
>> data[2][linesize[2]*(y/2)*16+x/2];
>>                //Setting of Yuv arrays
>>
>>              }
>> }
>> //Let's go to  an other macroblock
>> }
>> }
>>
>> Regards
>>
>>>
>>> Not quite - the data in data[0] is arranged by pixels, so your
> coordinate into that array must include all the pixels, not just the
> current macroblock.  So you need:
> yval[mby*mb_width + mbx][y*16+x] = data[0][ linesize[0]*(mby*16 + y) +
> (mbx*16 + x) ]
> so you skip all lines up to the one you're processing, including all
> previous macroblocks and all lines already processed in the current
> macroblock using "linesize[0]*(mby*16 + y)" and then all the pixels in the
> current line up to the macroblock you're interested in, and any pixels
> already processed in that macroblock with "mbx*16 + x".
>
> I hope that makes sense.
>
> Regards,
> Simon
>

Hello Simon,

Not quite.Excuse me if I ask you the same question but it is because I'm
new in ffmpeg and color format manipulation.
In my above code. mbx and mby are not (x, y) coordinate for the macroblock
but only integers used to run through the "for" loop. It is also the case
for x and y. mb_width is the number of macroblock
horizontally and mb_height is the number of macroblock vertically in the
frame.
Now let's suppose I want to have yuv value for only one 16X16  macroblock
located at (MBx, MBy) in the frame . Where MBx and MBy are the coordinate
of this macroblock in the frame.
Can I obtain yuv value for this macroblock like this :

for(int y=0; y<16;y++) // run through the heigh of the 16X16 macroblock
{
for(int x=0; x<16;x++)  // run through the width of the
16X16 macroblock
{
y+=data[0][ linesize[0]*(MBy*16 + y) + (MBx*16 + x)
]; //sum of all y pixel's value of the macroblock
// for u and v I must do only x/2 and y/2 or
(MBx*16 + x)/2 and (MBy*16 + y)/2)
u+=data[1][ linesize[1]*(MBy*16 + y/2) + (MBx*16 +
x/2) ]  or  u+=data[1][ linesize[1]*((MBy*16 + y)/2) + (MBx*16 + x)/2 ]
//sum of all y pixel's value of the macroblock
v+=data[2][ linesize[2]*(MBy*16 + y/2) + (MBx*16 +
x/2) ]   or  v+=data[2][ linesize[2]*((MBy*16 + y)/2) + (MBx*16 + x)/2 ]
//sum of all y pixel's value of the macroblock

}
}

Regards

_______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/libav-user
>
> To unsubscribe, visit link above, or email
> libav-user-request at ffmpeg.org with subject "unsubscribe".
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20190410/9f853623/attachment.html>
```