Mercurial > libavcodec.hg
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) |