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

Paul B Mahol onemda at gmail.com
Wed Apr 10 12:57:33 EEST 2019

```On 4/10/19, Boris <ndjoreboris at gmail.com> wrote:
> 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,
>
> I do like you tell me but data[0][ linesize[0]*(mby*16 + y) + (mbx*16 + x)
> ] gives me some negatives pixel's values.
> Is it normal ?
> For exemple data[0][ linesize[0]*(mby*16 + y) + (mbx*16 + x) ] =
>  -62
> -65
> -72
> My question is to know if it is normal to have negatives pixel's value ( y
> = -a; u=-b; v=-c) where a, b and c are integers.

Doesn't make sense, post full code.
```