<div dir="ltr"><div>Hi</div><div><br></div><div>I am trying to understand what frame->integral actually contains. <span style="font-size:12.8px"> I understand that </span><span style="font-size:12.8px">frame->integral contains 2 planes. in the upper plane, each element </span><span style="font-size:12.8px"> the sum of an 8x8 pixel region with top-left corner on that point. </span><span style="font-size:12.8px">and in the lower plane, 4x4 sums (needed only with --partitions p4x4). I am trying to understand how the values are getting filled. I am analyzing the following snippet.</span></div><div><span style="font-size:12.8px"><br></span><div><div><span style="font-size:12.8px">for( int y = start; y < height; y++ )</span></div><div><span style="font-size:12.8px">        {</span></div><div><span style="font-size:12.8px">            pixel    *pix  = frame->plane[0] + y * stride - PADH;</span></div><div><span style="font-size:12.8px">            uint16_t *sum8 = frame->integral + (y+1) * stride - PADH;</span></div><div><span style="font-size:12.8px">            uint16_t *sum4;</span></div><div><span style="font-size:12.8px">            if( h->frames.b_have_sub8x8_esa )</span></div><div><span style="font-size:12.8px">            {</span></div><div><span style="font-size:12.8px">                h->mc.integral_init4h( sum8, pix, stride );</span></div><div><span style="font-size:12.8px">                sum8 -= 8*stride;</span></div><div><span style="font-size:12.8px">                sum4 = sum8 + stride * (frame->i_lines[0] + PADV*2);</span></div><div><span style="font-size:12.8px">                if( y >= 8-PADV )</span></div><div><span style="font-size:12.8px">                    h->mc.integral_init4v( sum8, sum4, stride );</span></div><div><span style="font-size:12.8px">            }</span></div><div><span style="font-size:12.8px">            else</span></div><div><span style="font-size:12.8px">            {</span></div><div><span style="font-size:12.8px">                h->mc.integral_init8h( sum8, pix, stride );</span></div><div><span style="font-size:12.8px">                if( y >= 8-PADV )</span></div><div><span style="font-size:12.8px">                    h->mc.integral_init8v( sum8-8*stride, stride );</span></div><div><span style="font-size:12.8px">            }</span></div><div><span style="font-size:12.8px">        }</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">According to my understanding, in the above snippet, if sub8x8_esa is present, integral 8x8 and </span><span style="font-size:12.8px">integral</span><span style="font-size:12.8px"> </span><span style="font-size:12.8px">4x4 are computed and if </span><span style="font-size:12.8px">sub8x8_esa is absent, integral 8x8 is alone computed.</span></div><div><span style="font-size:12.8px">integral_init4h fills sum8 with horizontally adding 4 pixels at a time.</span><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">integral_init4v fills sum4 with vertically added 4 pixels </span><span style="font-size:12.8px">at a time</span><span style="font-size:12.8px">. (thereby computing integral</span><span style="font-size:12.8px"> </span><span style="font-size:12.8px">4x4</span><span style="font-size:12.8px">) and also fills </span><span style="font-size:12.8px">integral 8x8</span><span style="font-size:12.8px">.</span></div><div><br></div><div><div><span style="font-size:12.8px">static void integral_init4v( uint16_t *sum8, uint16_t *sum4, intptr_t stride )</span></div><div><span style="font-size:12.8px">{</span></div><div><span style="font-size:12.8px">    for( int x = 0; x < stride-8; x++ )</span></div><div><span style="font-size:12.8px">        sum4[x] = sum8[x+4*stride] - sum8[x];</span></div><div><span style="font-size:12.8px">    for( int x = 0; x < stride-8; x++ )</span></div><div><span style="font-size:12.8px">        sum8[x] = sum8[x+8*stride] + sum8[x+8*stride+4] - sum8[x] - sum8[x+4];</span></div><div><span style="font-size:12.8px">}</span></div></div><div><span style="font-size:12.8px">To get sum4, why the loop is upto stride-8? If my understanding is correct, loop had to be upto stride - 4.</span></div><div><span style="font-size:12.8px"><br></span></div><div>static void integral_init8v( uint16_t *sum8, intptr_t stride )</div><div>{</div><div>    for( int x = 0; x < stride-8; x++ )</div><div>        sum8[x] = sum8[x+8*stride] - sum8[x];</div><div>}</div></div></div><div>In the above function why the loop is only upto stride - 8? As far as I understood, since it is for vertical, loop could go well till stride.</div><div><span style="font-size:12.8px">Someone please clarify if I went wrong in my understanding somewhere.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">Thanks</span></div></div>