---------- Forwarded message ----------
From: digital design <developer.fpga at gmail.com>
Date: 21 March 2011 13:38
Subject: Re: [theora] alghorithm of working encoder in libtheora
To: bens at alum.mit.edu
Cc: Reply-All at xiph.org
On 18 March 2011 23:15, Benjamin M. Schwartz <bmschwar at
fas.harvard.edu>wrote:
> On 03/18/2011 01:44 PM, digital design wrote:
> > Now i implement next stages of encoder^
> > Block1:
> > 1) RGB->YUV
> > 2) DCT of 16X16 blocks (pixel format 4:2:0)
> > 3) zig-zag in eatch 8*8 block from previous step and push it to bufer
> memory.
> >
> > i push 16X16 blocks to BLOCK1 using raster order (i'm right?)
> > Now i'm confused - so much types of ordering. What i must do after
DCT?
> > What is order for pass blocks to Huffman block?
>
> In Theora terminology, a 16x16 unit spanning all 3 color planes (8x8 in U
> and V) is called a "macroblock". To encode the contents of a
macroblock,
> you must separate out the different color planes, and form
"superblocks"
> in each color plane. The DC coefficients of each block are then coded in
> "raster order", while the AC coefficients are coded in
"coded order".
> These orders are described in sections 2.3 and 2.4 of the Theora bitstream
> specification.
>
> The ordering of coefficients is
> Y plane DC coefficients in raster order (whole plane)
> Y plane AC coefficient 1 in coded order (whole plane)
> Y plane AC coefficient 2 in coded order ...
> ...
> Same for U plane
> Same for V plane
>
> For future questions please use Reply-All so that more people can help you.
>
> --Ben
>
>
Now i create HOW-TO as reference for all hardware developers, who want
create theora encoder using FPGA
Here is begin, did i miss some thig?
/*********************************************
** Stages of my hardware encoder (I-frame) **
*********************************************/
For example we have input frame 128x128 pixels RGB byer.
------------------------------------------------------------------
Stages of theora bitstream creation:
1. Convert RGB to YUV 4:2:0
2.DCT
extract blocks (8x8 pixels) from each plane (scan order curve)
For each block:
- take DCT coeffs: DC, AC(0..62)
- quantize them, acording to quantization table
- for DC coefficient make DPCM
Save results for each plane in buffer memory
3.Huffman stage
3.1 Extract DC coefficients for all planes (Y,U & V)
Extraction order: superblocks extracted scan curve order, inside superblocks
extract blocks DC coefficiens in hilbert curve order
Here is:
"Y" - "y" plane of encoded frame
"U" - "u" plane of encoded frame (subsampled)
"V" - "v" plane of encoded frame (subsampled)
"SBn" - superblock (4x4 of blocks(8x8pixels)), n - is superblock
number
"--->" - scan curve
"DCs" - DC coefficient of each blocs inside SB
-----------------------------
| Y |Y |Y |Y |
|SB20 |SB21 |SB22 |SB23 |
|--->------>---------->------
|DCs |DCs |DCs |DCs |
-----------------------------
| Y |Y |Y |Y |
|SB16 |SB17 |SB18 |SB19 |
|--->------>---------->------
|DCs |DCs |DCs |DCs |
---------------------------------------------------------
|Y |Y |Y |Y |U |U |V |V |
|SB8 |SB9 |SB10 |SB11 |SB12 |SB13 |SB14 |SB15 |
|--->------>---------->------>------>------------>---->--
|DCs |DCs |DCs |DCs |DCs |DCs |DCs |DCs |
---------------------------------------------------------
|Y |Y |Y |Y |U |U |V |V |
|SB0 |SB1 |SB2 |SB3 |SB4 |SB5 |SB6 |SB7 |
|--->------>---------->------>------>------------>---->--
|DCs |DCs |DCs |DCs |DCs |DCs |DCs |DCs |
---------------------------------------------------------
Pass extracted DC to Huffman blocks, results save in buffer memory:
DDR2:
+----+---------------------------------+
ADDR | VALUE |
+----+---------------------------------+
N | DC results after Huffman blocks |
N+1 | DC results after Huffman blocks |
.. | ... |
N+m | DC results after Huffman blocks |
3.2 the same (like 3.1) for all AC0...AC62
Results in buffer memory (DDR2) after Huffman
DDR2:
+----+----------------------------------+
ADDR | VALUE |
+----+----------------------------------+
N | DC results after Huffman blocks |
.. | ... |
M | AC0 results after Huffman blocks |
.. | ... |
J | AC1 results after Huffman blocks |
.. | ... |
I |AC62 results after Huffman blocks |
Is scan order right and process flow right?
Thanks!
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
http://lists.xiph.org/pipermail/theora/attachments/20110321/64ed3b08/attachment.htm
-------------- next part --------------
/*********************************************
** Stages of my hardware encoder (I-frame) **
*********************************************/
For example we have input frame 128x128 pixels RGB byer.
------------------------------------------------------------------
Stages of theora bitstream creation:
1. Convert RGB to YUV 4:2:0
2.DCT
extract blocks (8x8 pixels) from each plane (scan order curve)
For each block:
- take DCT coeffs: DC, AC(0..62)
- quantize them, acording to quantization table
- for DC coefficient make DPCM
Save results for each plane in buffer memory
3.Huffman stage
3.1 Extract DC coefficients for all planes (Y,U & V)
Extraction order: superblocks extracted scan curve order, inside superblocks
extract blocks DC coefficiens in hilbert curve order
Here is:
"Y" - "y" plane of encoded frame
"U" - "u" plane of encoded frame (subsampled)
"V" - "v" plane of encoded frame (subsampled)
"SBn" - superblock (4x4 of blocks(8x8pixels)), n - is superblock
number
"--->" - scan curve
"DCs" - DC coefficient of each blocs inside SB
-----------------------------
| Y |Y |Y |Y |
|SB20 |SB21 |SB22 |SB23 |
|--->------>---------->------
|DCs |DCs |DCs |DCs |
-----------------------------
| Y |Y |Y |Y |
|SB16 |SB17 |SB18 |SB19 |
|--->------>---------->------
|DCs |DCs |DCs |DCs |
---------------------------------------------------------
|Y |Y |Y |Y |U |U |V |V |
|SB8 |SB9 |SB10 |SB11 |SB12 |SB13 |SB14 |SB15 |
|--->------>---------->------>------>------------>---->--
|DCs |DCs |DCs |DCs |DCs |DCs |DCs |DCs |
---------------------------------------------------------
|Y |Y |Y |Y |U |U |V |V |
|SB0 |SB1 |SB2 |SB3 |SB4 |SB5 |SB6 |SB7 |
|--->------>---------->------>------>------------>---->--
|DCs |DCs |DCs |DCs |DCs |DCs |DCs |DCs |
---------------------------------------------------------
Pass extracted DC to Huffman blocks, results save in buffer memory:
DDR2:
+----+---------------------------------+
ADDR | VALUE |
+----+---------------------------------+
N | DC results after Huffman blocks |
N+1 | DC results after Huffman blocks |
.. | ... |
N+m | DC results after Huffman blocks |
3.2 the same (like 3.1) for all AC0...AC62
Results in buffer memory (DDR2) after Huffman
DDR2:
+----+----------------------------------+
ADDR | VALUE |
+----+----------------------------------+
N | DC results after Huffman blocks |
.. | ... |
M | AC0 results after Huffman blocks |
.. | ... |
J | AC1 results after Huffman blocks |
.. | ... |
I |AC62 results after Huffman blocks |
Is scan order right and process flow right?
Thanks!