comparison vc1.c @ 3521:ae749c2da968 libavcodec

Support grayscale decoding.
author kostya
date Sat, 29 Jul 2006 03:05:29 +0000
parents a48c957d0377
children 5de1edac254e
comparison
equal deleted inserted replaced
3520:a48c957d0377 3521:ae749c2da968
889 dsp->put_pixels_clamped(block[1], Y + 8, ys); 889 dsp->put_pixels_clamped(block[1], Y + 8, ys);
890 Y += ys * 8; 890 Y += ys * 8;
891 dsp->put_pixels_clamped(block[2], Y, ys); 891 dsp->put_pixels_clamped(block[2], Y, ys);
892 dsp->put_pixels_clamped(block[3], Y + 8, ys); 892 dsp->put_pixels_clamped(block[3], Y + 8, ys);
893 893
894 dsp->put_pixels_clamped(block[4], v->s.dest[1], us); 894 if(!(v->s.flags & CODEC_FLAG_GRAY)) {
895 dsp->put_pixels_clamped(block[5], v->s.dest[2], vs); 895 dsp->put_pixels_clamped(block[4], v->s.dest[1], us);
896 dsp->put_pixels_clamped(block[5], v->s.dest[2], vs);
897 }
896 } 898 }
897 899
898 /** Do motion compensation over 1 macroblock 900 /** Do motion compensation over 1 macroblock
899 * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c 901 * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c
900 */ 902 */
932 uvsrc_y = clip(uvsrc_y, -8, s->mb_height * 8); 934 uvsrc_y = clip(uvsrc_y, -8, s->mb_height * 8);
933 935
934 srcY += src_y * s->linesize + src_x; 936 srcY += src_y * s->linesize + src_x;
935 srcU += uvsrc_y * s->uvlinesize + uvsrc_x; 937 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
936 srcV += uvsrc_y * s->uvlinesize + uvsrc_x; 938 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
939
940 /* for grayscale we should not try to read from unknown area */
941 if(s->flags & CODEC_FLAG_GRAY) {
942 srcU = s->edge_emu_buffer + 18 * s->linesize;
943 srcV = s->edge_emu_buffer + 18 * s->linesize;
944 }
937 945
938 if((v->mv_mode == MV_PMODE_INTENSITY_COMP) 946 if((v->mv_mode == MV_PMODE_INTENSITY_COMP)
939 || (unsigned)src_x > s->h_edge_pos - (mx&3) - 16 947 || (unsigned)src_x > s->h_edge_pos - (mx&3) - 16
940 || (unsigned)src_y > s->v_edge_pos - (my&3) - 16){ 948 || (unsigned)src_y > s->v_edge_pos - (my&3) - 16){
941 uint8_t *uvbuf= s->edge_emu_buffer + 18 * s->linesize; 949 uint8_t *uvbuf= s->edge_emu_buffer + 18 * s->linesize;
991 if(!v->rnd) 999 if(!v->rnd)
992 dsp->put_qpel_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize); 1000 dsp->put_qpel_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize);
993 else 1001 else
994 dsp->put_no_rnd_qpel_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize); 1002 dsp->put_no_rnd_qpel_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize);
995 } 1003 }
1004
1005 if(s->flags & CODEC_FLAG_GRAY) return;
996 /* Chroma MC always uses qpel blilinear */ 1006 /* Chroma MC always uses qpel blilinear */
997 uvdxy = ((uvmy & 3) << 2) | (uvmx & 3); 1007 uvdxy = ((uvmy & 3) << 2) | (uvmx & 3);
998 if(!v->rnd){ 1008 if(!v->rnd){
999 dsp->put_qpel_pixels_tab[1][uvdxy](s->dest[1], srcU, s->uvlinesize); 1009 dsp->put_qpel_pixels_tab[1][uvdxy](s->dest[1], srcU, s->uvlinesize);
1000 dsp->put_qpel_pixels_tab[1][uvdxy](s->dest[2], srcV, s->uvlinesize); 1010 dsp->put_qpel_pixels_tab[1][uvdxy](s->dest[2], srcV, s->uvlinesize);
1078 int i, idx, tx = 0, ty = 0; 1088 int i, idx, tx = 0, ty = 0;
1079 int mvx[4], mvy[4], intra[4]; 1089 int mvx[4], mvy[4], intra[4];
1080 static const int count[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4}; 1090 static const int count[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
1081 1091
1082 if(!v->s.last_picture.data[0])return; 1092 if(!v->s.last_picture.data[0])return;
1093 if(s->flags & CODEC_FLAG_GRAY) return;
1083 1094
1084 for(i = 0; i < 4; i++) { 1095 for(i = 0; i < 4; i++) {
1085 mvx[i] = s->mv[0][i][0]; 1096 mvx[i] = s->mv[0][i][0];
1086 mvy[i] = s->mv[0][i][1]; 1097 mvy[i] = s->mv[0][i][1];
1087 intra[i] = v->mb_type[0][s->block_index[i]]; 1098 intra[i] = v->mb_type[0][s->block_index[i]];
2563 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; 2574 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
2564 if(i == 1 || i == 3 || s->mb_x) 2575 if(i == 1 || i == 3 || s->mb_x)
2565 v->c_avail = v->mb_type[0][s->block_index[i] - 1]; 2576 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
2566 2577
2567 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset); 2578 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
2579 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
2568 vc1_inv_trans(s->block[i], 8, 8); 2580 vc1_inv_trans(s->block[i], 8, 8);
2569 for(j = 0; j < 64; j++) s->block[i][j] += 128; 2581 for(j = 0; j < 64; j++) s->block[i][j] += 128;
2570 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); 2582 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
2571 /* TODO: proper loop filtering */ 2583 /* TODO: proper loop filtering */
2572 if(v->pq >= 9 && v->overlap) { 2584 if(v->pq >= 9 && v->overlap) {
2577 } 2589 }
2578 } else if(val) { 2590 } else if(val) {
2579 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block); 2591 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block);
2580 if(!v->ttmbf && ttmb < 8) ttmb = -1; 2592 if(!v->ttmbf && ttmb < 8) ttmb = -1;
2581 first_block = 0; 2593 first_block = 0;
2582 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); 2594 if((i<4) || !(s->flags & CODEC_FLAG_GRAY))
2595 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
2583 } 2596 }
2584 } 2597 }
2585 } 2598 }
2586 else //Skipped 2599 else //Skipped
2587 { 2600 {
2664 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; 2677 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
2665 if(i == 1 || i == 3 || s->mb_x) 2678 if(i == 1 || i == 3 || s->mb_x)
2666 v->c_avail = v->mb_type[0][s->block_index[i] - 1]; 2679 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
2667 2680
2668 vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant, (i&4)?v->codingset2:v->codingset); 2681 vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant, (i&4)?v->codingset2:v->codingset);
2682 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
2669 vc1_inv_trans(s->block[i], 8, 8); 2683 vc1_inv_trans(s->block[i], 8, 8);
2670 for(j = 0; j < 64; j++) s->block[i][j] += 128; 2684 for(j = 0; j < 64; j++) s->block[i][j] += 128;
2671 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); 2685 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
2672 /* TODO: proper loop filtering */ 2686 /* TODO: proper loop filtering */
2673 if(v->pq >= 9 && v->overlap) { 2687 if(v->pq >= 9 && v->overlap) {
2678 } 2692 }
2679 } else if(is_coded[i]) { 2693 } else if(is_coded[i]) {
2680 status = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block); 2694 status = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block);
2681 if(!v->ttmbf && ttmb < 8) ttmb = -1; 2695 if(!v->ttmbf && ttmb < 8) ttmb = -1;
2682 first_block = 0; 2696 first_block = 0;
2683 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); 2697 if((i<4) || !(s->flags & CODEC_FLAG_GRAY))
2698 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
2684 } 2699 }
2685 } 2700 }
2686 return status; 2701 return status;
2687 } 2702 }
2688 else //Skipped MB 2703 else //Skipped MB
2827 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]]; 2842 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
2828 if(i == 1 || i == 3 || s->mb_x) 2843 if(i == 1 || i == 3 || s->mb_x)
2829 v->c_avail = v->mb_type[0][s->block_index[i] - 1]; 2844 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
2830 2845
2831 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset); 2846 vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
2847 if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
2832 vc1_inv_trans(s->block[i], 8, 8); 2848 vc1_inv_trans(s->block[i], 8, 8);
2833 for(j = 0; j < 64; j++) s->block[i][j] += 128; 2849 for(j = 0; j < 64; j++) s->block[i][j] += 128;
2834 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); 2850 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
2835 /* TODO: proper loop filtering */ 2851 /* TODO: proper loop filtering */
2836 if(v->pq >= 9 && v->overlap) { 2852 if(v->pq >= 9 && v->overlap) {
2841 } 2857 }
2842 } else if(val) { 2858 } else if(val) {
2843 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block); 2859 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block);
2844 if(!v->ttmbf && ttmb < 8) ttmb = -1; 2860 if(!v->ttmbf && ttmb < 8) ttmb = -1;
2845 first_block = 0; 2861 first_block = 0;
2846 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); 2862 if((i<4) || !(s->flags & CODEC_FLAG_GRAY))
2863 s->dsp.add_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
2847 } 2864 }
2848 } 2865 }
2849 } 2866 }
2850 2867
2851 /** Decode blocks of I-frame 2868 /** Decode blocks of I-frame
2926 vc1_put_block(v, s->block); 2943 vc1_put_block(v, s->block);
2927 if(v->pq >= 9 && v->overlap) { /* XXX: do proper overlapping insted of loop filter */ 2944 if(v->pq >= 9 && v->overlap) { /* XXX: do proper overlapping insted of loop filter */
2928 if(!s->first_slice_line) { 2945 if(!s->first_slice_line) {
2929 vc1_v_overlap(s->dest[0], s->linesize, 0); 2946 vc1_v_overlap(s->dest[0], s->linesize, 0);
2930 vc1_v_overlap(s->dest[0] + 8, s->linesize, 0); 2947 vc1_v_overlap(s->dest[0] + 8, s->linesize, 0);
2931 vc1_v_overlap(s->dest[1], s->uvlinesize, s->mb_y&1); 2948 if(!(s->flags & CODEC_FLAG_GRAY)) {
2932 vc1_v_overlap(s->dest[2], s->uvlinesize, s->mb_y&1); 2949 vc1_v_overlap(s->dest[1], s->uvlinesize, s->mb_y&1);
2950 vc1_v_overlap(s->dest[2], s->uvlinesize, s->mb_y&1);
2951 }
2933 } 2952 }
2934 vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 1); 2953 vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 1);
2935 vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1); 2954 vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1);
2936 if(s->mb_x) { 2955 if(s->mb_x) {
2937 vc1_h_overlap(s->dest[0], s->linesize, 0); 2956 vc1_h_overlap(s->dest[0], s->linesize, 0);
2938 vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 0); 2957 vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 0);
2939 vc1_h_overlap(s->dest[1], s->uvlinesize, s->mb_x&1); 2958 if(!(s->flags & CODEC_FLAG_GRAY)) {
2940 vc1_h_overlap(s->dest[2], s->uvlinesize, s->mb_x&1); 2959 vc1_h_overlap(s->dest[1], s->uvlinesize, s->mb_x&1);
2960 vc1_h_overlap(s->dest[2], s->uvlinesize, s->mb_x&1);
2961 }
2941 } 2962 }
2942 vc1_h_overlap(s->dest[0] + 8, s->linesize, 1); 2963 vc1_h_overlap(s->dest[0] + 8, s->linesize, 1);
2943 vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1); 2964 vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1);
2944 } 2965 }
2945 2966
3077 VC1Context *v = avctx->priv_data; 3098 VC1Context *v = avctx->priv_data;
3078 MpegEncContext *s = &v->s; 3099 MpegEncContext *s = &v->s;
3079 GetBitContext gb; 3100 GetBitContext gb;
3080 3101
3081 if (!avctx->extradata_size || !avctx->extradata) return -1; 3102 if (!avctx->extradata_size || !avctx->extradata) return -1;
3082 avctx->pix_fmt = PIX_FMT_YUV420P; 3103 if (!(avctx->flags & CODEC_FLAG_GRAY))
3104 avctx->pix_fmt = PIX_FMT_YUV420P;
3105 else
3106 avctx->pix_fmt = PIX_FMT_GRAY8;
3083 v->s.avctx = avctx; 3107 v->s.avctx = avctx;
3084 avctx->flags |= CODEC_FLAG_EMU_EDGE; 3108 avctx->flags |= CODEC_FLAG_EMU_EDGE;
3085 v->s.flags |= CODEC_FLAG_EMU_EDGE; 3109 v->s.flags |= CODEC_FLAG_EMU_EDGE;
3086 3110
3087 if(ff_h263_decode_init(avctx) < 0) 3111 if(ff_h263_decode_init(avctx) < 0)