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

Simon Brown simon.k.brown at gmail.com
Tue Apr 9 18:44:33 EEST 2019


>
>
> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20190409/c70bddc3/attachment.html>


More information about the Libav-user mailing list