Mercurial > libavcodec.hg
comparison vc1.c @ 3450:906c58dcb6ea libavcodec
Use overlap filter instead of loop filter.
author | kostya |
---|---|
date | Sun, 09 Jul 2006 02:47:09 +0000 |
parents | ec6096b1ab04 |
children | 45724ba8d666 |
comparison
equal
deleted
inserted
replaced
3449:ec6096b1ab04 | 3450:906c58dcb6ea |
---|---|
823 dst++; | 823 dst++; |
824 } | 824 } |
825 } | 825 } |
826 } | 826 } |
827 | 827 |
828 /** Apply overlap transform | 828 /** Apply overlap transform to vertical edge |
829 * @todo optimize | 829 * @todo optimize |
830 * @todo move to DSPContext | 830 * @todo move to DSPContext |
831 */ | 831 */ |
832 static void vc1_overlap_block(MpegEncContext *s, DCTELEM block[64], int n, int do_hor, int do_vert) | |
833 { | |
834 int i; | |
835 | |
836 if(do_hor) { //TODO | |
837 } | |
838 if(do_vert) { //TODO | |
839 } | |
840 | |
841 for(i = 0; i < 64; i++) | |
842 block[i] += 128; | |
843 } | |
844 | |
845 | |
846 static void vc1_v_overlap(uint8_t* src, int stride) | 832 static void vc1_v_overlap(uint8_t* src, int stride) |
847 { | 833 { |
848 int i; | 834 int i; |
849 int a, b, c, d; | 835 int a, b, c, d; |
850 for(i = 0; i < 8; i++) { | 836 for(i = 0; i < 8; i++) { |
859 src[stride] = clip_uint8((a + 7*d + 3) >> 3); | 845 src[stride] = clip_uint8((a + 7*d + 3) >> 3); |
860 src++; | 846 src++; |
861 } | 847 } |
862 } | 848 } |
863 | 849 |
850 /** Apply overlap transform to horizontal edge | |
851 * @todo optimize | |
852 * @todo move to DSPContext | |
853 */ | |
864 static void vc1_h_overlap(uint8_t* src, int stride) | 854 static void vc1_h_overlap(uint8_t* src, int stride) |
865 { | 855 { |
866 int i; | 856 int i; |
867 int a, b, c, d; | 857 int a, b, c, d; |
868 for(i = 0; i < 8; i++) { | 858 for(i = 0; i < 8; i++) { |
2448 for(j = 0; j < 64; j++) block[i][j] += 128; | 2438 for(j = 0; j < 64; j++) block[i][j] += 128; |
2449 s->dsp.put_pixels_clamped(block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); | 2439 s->dsp.put_pixels_clamped(block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); |
2450 /* TODO: proper loop filtering */ | 2440 /* TODO: proper loop filtering */ |
2451 if(v->pq >= 9 && v->overlap) { | 2441 if(v->pq >= 9 && v->overlap) { |
2452 if(v->a_avail) | 2442 if(v->a_avail) |
2453 s->dsp.h263_v_loop_filter(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), s->y_dc_scale); | 2443 vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); |
2454 if(v->c_avail) | 2444 if(v->c_avail) |
2455 s->dsp.h263_h_loop_filter(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), s->y_dc_scale); | 2445 vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); |
2456 } | 2446 } |
2457 } else if(val) { | 2447 } else if(val) { |
2458 vc1_decode_p_block(v, block[i], i, mquant, ttmb, first_block); | 2448 vc1_decode_p_block(v, block[i], i, mquant, ttmb, first_block); |
2459 if(!v->ttmbf && ttmb < 8) ttmb = -1; | 2449 if(!v->ttmbf && ttmb < 8) ttmb = -1; |
2460 first_block = 0; | 2450 first_block = 0; |
2544 for(j = 0; j < 64; j++) block[i][j] += 128; | 2534 for(j = 0; j < 64; j++) block[i][j] += 128; |
2545 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); | 2535 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); |
2546 /* TODO: proper loop filtering */ | 2536 /* TODO: proper loop filtering */ |
2547 if(v->pq >= 9 && v->overlap) { | 2537 if(v->pq >= 9 && v->overlap) { |
2548 if(v->a_avail) | 2538 if(v->a_avail) |
2549 s->dsp.h263_v_loop_filter(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), s->y_dc_scale); | 2539 vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); |
2550 if(v->c_avail) | 2540 if(v->c_avail) |
2551 s->dsp.h263_h_loop_filter(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), s->y_dc_scale); | 2541 vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); |
2552 } | 2542 } |
2553 } else if(is_coded[i]) { | 2543 } else if(is_coded[i]) { |
2554 status = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block); | 2544 status = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block); |
2555 if(!v->ttmbf && ttmb < 8) ttmb = -1; | 2545 if(!v->ttmbf && ttmb < 8) ttmb = -1; |
2556 first_block = 0; | 2546 first_block = 0; |
2580 | 2570 |
2581 /** Decode blocks of I-frame | 2571 /** Decode blocks of I-frame |
2582 */ | 2572 */ |
2583 static void vc1_decode_i_blocks(VC1Context *v) | 2573 static void vc1_decode_i_blocks(VC1Context *v) |
2584 { | 2574 { |
2585 int k; | 2575 int k, j; |
2586 MpegEncContext *s = &v->s; | 2576 MpegEncContext *s = &v->s; |
2587 int cbp, val; | 2577 int cbp, val; |
2588 uint8_t *coded_val; | 2578 uint8_t *coded_val; |
2589 int mb_pos; | 2579 int mb_pos; |
2590 | 2580 |
2647 | 2637 |
2648 vc1_decode_i_block(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2); | 2638 vc1_decode_i_block(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2); |
2649 | 2639 |
2650 vc1_inv_trans(s->block[k], 8, 8); | 2640 vc1_inv_trans(s->block[k], 8, 8); |
2651 if(v->pq >= 9 && v->overlap) { | 2641 if(v->pq >= 9 && v->overlap) { |
2652 vc1_overlap_block(s, s->block[k], k, (s->mb_y || k>1), (s->mb_x || (k != 0 && k != 2))); | 2642 for(j = 0; j < 64; j++) s->block[k][j] += 128; |
2653 } | 2643 } |
2654 } | 2644 } |
2655 | 2645 |
2656 vc1_put_block(v, s->block); | 2646 vc1_put_block(v, s->block); |
2657 if(v->pq >= 9 && v->overlap) { /* XXX: do proper overlapping insted of loop filter */ | 2647 if(v->pq >= 9 && v->overlap) { /* XXX: do proper overlapping insted of loop filter */ |
2658 if(s->mb_y) { | 2648 if(!s->first_slice_line) { |
2659 s->dsp.h263_v_loop_filter(s->dest[0], s->linesize, s->y_dc_scale); | 2649 vc1_v_overlap(s->dest[0], s->linesize); |
2660 s->dsp.h263_v_loop_filter(s->dest[0] + 8, s->linesize, s->y_dc_scale); | 2650 vc1_v_overlap(s->dest[0] + 8, s->linesize); |
2661 s->dsp.h263_v_loop_filter(s->dest[1], s->uvlinesize, s->y_dc_scale); | 2651 vc1_v_overlap(s->dest[1], s->uvlinesize); |
2662 s->dsp.h263_v_loop_filter(s->dest[2], s->uvlinesize, s->y_dc_scale); | 2652 vc1_v_overlap(s->dest[2], s->uvlinesize); |
2663 } | 2653 } |
2664 s->dsp.h263_v_loop_filter(s->dest[0] + 8 * s->linesize, s->linesize, s->y_dc_scale); | 2654 vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize); |
2665 s->dsp.h263_v_loop_filter(s->dest[0] + 8 * s->linesize + 8, s->linesize, s->y_dc_scale); | 2655 vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize); |
2666 if(s->mb_x) { | 2656 if(s->mb_x) { |
2667 s->dsp.h263_h_loop_filter(s->dest[0], s->linesize, s->y_dc_scale); | 2657 vc1_h_overlap(s->dest[0], s->linesize); |
2668 s->dsp.h263_h_loop_filter(s->dest[0] + 8 * s->linesize, s->linesize, s->y_dc_scale); | 2658 vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize); |
2669 s->dsp.h263_h_loop_filter(s->dest[1], s->uvlinesize, s->y_dc_scale); | 2659 vc1_h_overlap(s->dest[1], s->uvlinesize); |
2670 s->dsp.h263_h_loop_filter(s->dest[2], s->uvlinesize, s->y_dc_scale); | 2660 vc1_h_overlap(s->dest[2], s->uvlinesize); |
2671 } | 2661 } |
2672 s->dsp.h263_h_loop_filter(s->dest[0] + 8, s->linesize, s->y_dc_scale); | 2662 vc1_h_overlap(s->dest[0] + 8, s->linesize); |
2673 s->dsp.h263_h_loop_filter(s->dest[0] + 8 * s->linesize + 8, s->linesize, s->y_dc_scale); | 2663 vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize); |
2674 } | 2664 } |
2675 | 2665 |
2676 if(get_bits_count(&s->gb) > v->bits) { | 2666 if(get_bits_count(&s->gb) > v->bits) { |
2677 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits); | 2667 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits); |
2678 return; | 2668 return; |