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;