[FFmpeg-devel] [PATCH i/N] RV30 loop filter

Kostya kostya.shishkov
Sat Mar 8 19:47:40 CET 2008


On Sat, Mar 08, 2008 at 06:50:10PM +0100, Michael Niedermayer wrote:
> On Sat, Mar 08, 2008 at 07:15:18PM +0200, Kostya wrote:
> > On Sun, Feb 24, 2008 at 12:37:24AM +0100, Michael Niedermayer wrote:
> > > On Sat, Feb 23, 2008 at 12:57:29PM +0200, Kostya wrote:
> > > > $subj
> > > > 
> > > > Probably correct.
> > > 
> > [...]
> > > > +static void rv30_loop_filter(RV34DecContext *r)
> > > > +{
> > > > +    MpegEncContext *s = &r->s;
> > > > +    int mb_pos;
> > > > +    int i, j;
> > > 
> > > > +    int strength = 0;//FIXME how to determine correct value?
> > > > +    const uint8_t* lim = rv30_loop_filt_lim[strength];
> > > 
> > > This does not look correct.
> > 
> > I believe it is - rv30_loop_filt_lim is an array of 32-element mapping
> > tables between quantizer and limit values.
> 
> I mean strength=0 above vs. your claim about "Probably correct." above.
> This just does not look correct at all, the FIXME also contradicts that this
> is correct.
 
I meant the whole flow; strength parameter must be initialized somehow, but
zero value for strength for now has some sense too.
 
> [...]
> > > > +                cbp1 = r->cbp_chroma[mb_pos - 1];
> > > > +                cbp2 = r->cbp_chroma[mb_pos];
> > > > +                for(i = 0; i < 8; i += 4, cbp1 >>= 2, cbp2 >>= 2){
> > > > +                    if((cbp1 & 0x02) && (cbp2 & 0x01))
>                                             ^^
> > > > +                        rv30_weak_loop_filter(s->dest[1] + i * s->uvlinesize, 1, s->uvlinesize, lim[q]);
> > > > +                    if((cbp1 & 0x20) && (cbp2 & 0x10))
> > > > +                        rv30_weak_loop_filter(s->dest[2] + i * s->uvlinesize, 1, s->uvlinesize, lim[q]);
> > > > +                }
> > > > +            }
> > > > +            q = s->current_picture_ptr->qscale_table[mb_pos];
> > > > +            for(j = 4; j < 16; j += 4){
> > > > +                cbp1 = r->cbp_luma[mb_pos] >> ((j >> 2) - 1);
> > > > +                for(i = 0; i < 16; i += 4, cbp1 >>= 4)
> > > > +                    if(cbp1 & 3)
> > > > +                        rv30_weak_loop_filter(s->dest[0] + j + i * s->linesize, 1, s->linesize, lim[q]);
> > > > +            }
> > > > +            cbp1 = r->cbp_chroma[mb_pos];
> > > > +            for(i = 0; i < 8; i += 4, cbp1 >>= 2){
> > > > +                if(cbp1 & 0x03)
>                           ^^^^^^^^^^^
> > > > +                    rv30_weak_loop_filter(s->dest[1] + 4 + i * s->uvlinesize, 1, s->uvlinesize, lim[q]);
> > > > +                if(cbp1 & 0x30)
> > > > +                    rv30_weak_loop_filter(s->dest[2] + 4 + i * s->uvlinesize, 1, s->uvlinesize, lim[q]);
> > > > +            }
> > > 
> > > This code does cbpA || cbpB the one above does cbpA && cbpB, this is strange.
> > 
> > before it was luma, here it is chroma and I just merged U and V filter calls together
> 
> The first code excutes rv30_weak_loop_filter when both blocks are coded
> The second code excutes rv30_weak_loop_filter when either block is coded
> They are both for chroma
 
Ah, I forgot to state if((cbp1 & 0x03) == 0x03).
 
> [...]
> -- 
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB




More information about the ffmpeg-devel mailing list