comparison rv40.c @ 8198:de344498875e libavcodec

Strong filtering function for future RV40 loop filter
author kostya
date Sun, 23 Nov 2008 19:36:44 +0000
parents 4a92ea42a8bc
children d133e597db2d
comparison
equal deleted inserted replaced
8197:06acc3ab4bdc 8198:de344498875e
283 t = (diff_q1q0 + diff_q1q2 + diff) >> 1; 283 t = (diff_q1q0 + diff_q1q2 + diff) >> 1;
284 src[ 1*step] = cm[src[ 1*step] - CLIP_SYMM(t, lim_q1)]; 284 src[ 1*step] = cm[src[ 1*step] - CLIP_SYMM(t, lim_q1)];
285 } 285 }
286 } 286 }
287 287
288 static inline void rv40_adaptive_loop_filter(uint8_t *src, const int step,
289 const int stride, const int dmode,
290 const int lim_q1, const int lim_p1,
291 const int alpha,
292 const int beta, const int beta2,
293 const int chroma, const int edge)
294 {
295 int diff_p1p0[4], diff_q1q0[4], diff_p1p2[4], diff_q1q2[4];
296 int sum_p1p0 = 0, sum_q1q0 = 0, sum_p1p2 = 0, sum_q1q2 = 0;
297 uint8_t *ptr;
298 int flag_strong0 = 1, flag_strong1 = 1;
299 int filter_p1, filter_q1;
300 int i;
301 int lims;
302
303 for(i = 0, ptr = src; i < 4; i++, ptr += stride){
304 diff_p1p0[i] = ptr[-2*step] - ptr[-1*step];
305 diff_q1q0[i] = ptr[ 1*step] - ptr[ 0*step];
306 sum_p1p0 += diff_p1p0[i];
307 sum_q1q0 += diff_q1q0[i];
308 }
309 filter_p1 = FFABS(sum_p1p0) < (beta<<2);
310 filter_q1 = FFABS(sum_q1q0) < (beta<<2);
311 if(!filter_p1 && !filter_q1)
312 return;
313
314 for(i = 0, ptr = src; i < 4; i++, ptr += stride){
315 diff_p1p2[i] = ptr[-2*step] - ptr[-3*step];
316 diff_q1q2[i] = ptr[ 1*step] - ptr[ 2*step];
317 sum_p1p2 += diff_p1p2[i];
318 sum_q1q2 += diff_q1q2[i];
319 }
320
321 if(edge){
322 flag_strong0 = filter_p1 && (FFABS(sum_p1p2) < beta2);
323 flag_strong1 = filter_q1 && (FFABS(sum_q1q2) < beta2);
324 }else{
325 flag_strong0 = flag_strong1 = 0;
326 }
327
328 lims = filter_p1 + filter_q1 + ((lim_q1 + lim_p1) >> 1) + 1;
329 if(flag_strong0 && flag_strong1){ /* strong filtering */
330 for(i = 0; i < 4; i++, src += stride){
331 int sflag, p0, q0, p1, q1;
332 int t = src[0*step] - src[-1*step];
333
334 if(!t) continue;
335 sflag = (alpha * FFABS(t)) >> 7;
336 if(sflag > 1) continue;
337
338 p0 = (25*src[-3*step] + 26*src[-2*step]
339 + 26*src[-1*step]
340 + 26*src[ 0*step] + 25*src[ 1*step] + rv40_dither_l[dmode + i]) >> 7;
341 q0 = (25*src[-2*step] + 26*src[-1*step]
342 + 26*src[ 0*step]
343 + 26*src[ 1*step] + 25*src[ 2*step] + rv40_dither_r[dmode + i]) >> 7;
344 if(sflag){
345 p0 = av_clip(p0, src[-1*step] - lims, src[-1*step] + lims);
346 q0 = av_clip(q0, src[ 0*step] - lims, src[ 0*step] + lims);
347 }
348 p1 = (25*src[-4*step] + 26*src[-3*step]
349 + 26*src[-2*step]
350 + 26*p0 + 25*src[ 0*step] + rv40_dither_l[dmode + i]) >> 7;
351 q1 = (25*src[-1*step] + 26*q0
352 + 26*src[ 1*step]
353 + 26*src[ 2*step] + 25*src[ 3*step] + rv40_dither_r[dmode + i]) >> 7;
354 if(sflag){
355 p1 = av_clip(p1, src[-2*step] - lims, src[-2*step] + lims);
356 q1 = av_clip(q1, src[ 1*step] - lims, src[ 1*step] + lims);
357 }
358 src[-2*step] = p1;
359 src[-1*step] = p0;
360 src[ 0*step] = q0;
361 src[ 1*step] = q1;
362 if(!chroma){
363 src[-3*step] = (25*src[-1*step] + 26*src[-2*step] + 51*src[-3*step] + 26*src[-4*step] + 64) >> 7;
364 src[ 2*step] = (25*src[ 0*step] + 26*src[ 1*step] + 51*src[ 2*step] + 26*src[ 3*step] + 64) >> 7;
365 }
366 }
367 }else if(filter_p1 && filter_q1){
368 for(i = 0; i < 4; i++, src += stride)
369 rv40_weak_loop_filter(src, step, 1, 1, alpha, beta, lims, lim_q1, lim_p1,
370 diff_p1p0[i], diff_q1q0[i], diff_p1p2[i], diff_q1q2[i]);
371 }else{
372 for(i = 0; i < 4; i++, src += stride)
373 rv40_weak_loop_filter(src, step, filter_p1, filter_q1,
374 alpha, beta, lims>>1, lim_q1>>1, lim_p1>>1,
375 diff_p1p0[i], diff_q1q0[i], diff_p1p2[i], diff_q1q2[i]);
376 }
377 }
378
379 static void rv40_v_loop_filter(uint8_t *src, int stride, int dmode,
380 int lim_q1, int lim_p1,
381 int alpha, int beta, int beta2, int chroma, int edge){
382 rv40_adaptive_loop_filter(src, 1, stride, dmode, lim_q1, lim_p1,
383 alpha, beta, beta2, chroma, edge);
384 }
385 static void rv40_h_loop_filter(uint8_t *src, int stride, int dmode,
386 int lim_q1, int lim_p1,
387 int alpha, int beta, int beta2, int chroma, int edge){
388 rv40_adaptive_loop_filter(src, stride, 1, dmode, lim_q1, lim_p1,
389 alpha, beta, beta2, chroma, edge);
390 }
391
288 /** 392 /**
289 * Initialize decoder. 393 * Initialize decoder.
290 */ 394 */
291 static av_cold int rv40_decode_init(AVCodecContext *avctx) 395 static av_cold int rv40_decode_init(AVCodecContext *avctx)
292 { 396 {