# HG changeset patch # User michaelni # Date 1018145012 0 # Node ID 8cf5507e6ca5014c1244a74158608207ae943778 # Parent ac677a84d5df5ba74c80e95e28f62db3da58227c mpeg4 mpeg quantizer support diff -r ac677a84d5df -r 8cf5507e6ca5 dsputil.c --- a/dsputil.c Sat Apr 06 22:29:37 2002 +0000 +++ b/dsputil.c Sun Apr 07 02:03:32 2002 +0000 @@ -47,6 +47,8 @@ extern UINT16 default_intra_matrix[64]; extern UINT16 default_non_intra_matrix[64]; +extern UINT16 ff_mpeg4_default_intra_matrix[64]; +extern UINT16 ff_mpeg4_default_non_intra_matrix[64]; UINT8 zigzag_direct[64] = { 0, 1, 8, 16, 9, 2, 3, 10, @@ -953,6 +955,8 @@ } block_permute(default_intra_matrix); block_permute(default_non_intra_matrix); + block_permute(ff_mpeg4_default_intra_matrix); + block_permute(ff_mpeg4_default_non_intra_matrix); } build_zigzag_end(); diff -r ac677a84d5df -r 8cf5507e6ca5 h263.c --- a/h263.c Sat Apr 06 22:29:37 2002 +0000 +++ b/h263.c Sun Apr 07 02:03:32 2002 +0000 @@ -624,17 +624,14 @@ } if (val >= 0) { - val--; - code = (val >> bit_size) + 1; - bits = val & (range - 1); sign = 0; } else { val = -val; - val--; - code = (val >> bit_size) + 1; - bits = val & (range - 1); sign = 1; } + val--; + code = (val >> bit_size) + 1; + bits = val & (range - 1); put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign); if (bit_size > 0) { @@ -728,7 +725,7 @@ { int level, uni_code, uni_len; - for(level=-255; level<256; level++){ + for(level=-256; level<256; level++){ int size, v, l; /* find number of bits */ size = 0; @@ -2509,7 +2506,57 @@ } // FIXME a bunch of grayscale shape things - if(get_bits1(&s->gb)) printf("Quant-Type not supported\n"); /* vol_quant_type */ //FIXME + + if(get_bits1(&s->gb)){ /* vol_quant_type */ + int i, j, v; + /* load default matrixes */ + for(i=0; i<64; i++){ + v= ff_mpeg4_default_intra_matrix[i]; + s->intra_matrix[i]= v; + s->chroma_intra_matrix[i]= v; + + v= ff_mpeg4_default_non_intra_matrix[i]; + s->non_intra_matrix[i]= v; + s->chroma_non_intra_matrix[i]= v; + } + + /* load custom intra matrix */ + if(get_bits1(&s->gb)){ + for(i=0; i<64; i++){ + v= get_bits(&s->gb, 8); + if(v==0) break; + + j= zigzag_direct[i]; + s->intra_matrix[j]= v; + s->chroma_intra_matrix[j]= v; + } + } + + /* load custom non intra matrix */ + if(get_bits1(&s->gb)){ + for(i=0; i<64; i++){ + v= get_bits(&s->gb, 8); + if(v==0) break; + + j= zigzag_direct[i]; + s->non_intra_matrix[j]= v; + s->chroma_non_intra_matrix[j]= v; + } + + /* replicate last value */ + for(; i<64; i++){ + j= zigzag_direct[i]; + s->non_intra_matrix[j]= v; + s->chroma_non_intra_matrix[j]= v; + } + } + + s->dct_unquantize= s->dct_unquantize_mpeg; + + // FIXME a bunch of grayscale shape things + }else + s->dct_unquantize= s->dct_unquantize_h263; + if(vo_ver_id != 1) s->quarter_sample= get_bits1(&s->gb); else s->quarter_sample=0; diff -r ac677a84d5df -r 8cf5507e6ca5 i386/mpegvideo_mmx.c --- a/i386/mpegvideo_mmx.c Sat Apr 06 22:29:37 2002 +0000 +++ b/i386/mpegvideo_mmx.c Sun Apr 07 02:03:32 2002 +0000 @@ -440,11 +440,9 @@ void MPV_common_init_mmx(MpegEncContext *s) { if (mm_flags & MM_MMX) { - if (s->out_format == FMT_H263) - s->dct_unquantize = dct_unquantize_h263_mmx; - else - s->dct_unquantize = dct_unquantize_mpeg1_mmx; - + s->dct_unquantize_h263 = dct_unquantize_h263_mmx; + s->dct_unquantize_mpeg = dct_unquantize_mpeg1_mmx; + draw_edges = draw_edges_mmx; if(mm_flags & MM_MMXEXT){ diff -r ac677a84d5df -r 8cf5507e6ca5 mpeg4data.h --- a/mpeg4data.h Sat Apr 06 22:29:37 2002 +0000 +++ b/mpeg4data.h Sun Apr 07 02:03:32 2002 +0000 @@ -122,3 +122,27 @@ {0, 0}, {0, 0}, }; + +/* these matrixes will be permuted for the idct */ +INT16 ff_mpeg4_default_intra_matrix[64] = { + 8, 17, 18, 19, 21, 23, 25, 27, + 17, 18, 19, 21, 23, 25, 27, 28, + 20, 21, 22, 23, 24, 26, 28, 30, + 21, 22, 23, 24, 26, 28, 30, 32, + 22, 23, 24, 26, 28, 30, 32, 35, + 23, 24, 26, 28, 30, 32, 35, 38, + 25, 26, 28, 30, 32, 35, 38, 41, + 27, 28, 30, 32, 35, 38, 41, 45, +}; + +INT16 ff_mpeg4_default_non_intra_matrix[64] = { + 16, 17, 18, 19, 20, 21, 22, 23, + 17, 18, 19, 20, 21, 22, 23, 24, + 18, 19, 20, 21, 22, 23, 24, 25, + 19, 20, 21, 22, 23, 24, 26, 27, + 20, 21, 22, 23, 25, 26, 27, 28, + 21, 22, 23, 24, 26, 27, 28, 30, + 22, 23, 24, 26, 27, 28, 30, 31, + 23, 24, 25, 27, 28, 30, 31, 33, +}; + diff -r ac677a84d5df -r 8cf5507e6ca5 mpegvideo.c --- a/mpegvideo.c Sat Apr 06 22:29:37 2002 +0000 +++ b/mpegvideo.c Sun Apr 07 02:03:32 2002 +0000 @@ -110,14 +110,18 @@ int c_size, i; UINT8 *pict; - if (s->out_format == FMT_H263) - s->dct_unquantize = dct_unquantize_h263_c; - else - s->dct_unquantize = dct_unquantize_mpeg1_c; + s->dct_unquantize_h263 = dct_unquantize_h263_c; + s->dct_unquantize_mpeg = dct_unquantize_mpeg1_c; #ifdef HAVE_MMX MPV_common_init_mmx(s); #endif + //setup default unquantizers (mpeg4 might change it later) + if(s->out_format == FMT_H263) + s->dct_unquantize = s->dct_unquantize_h263; + else + s->dct_unquantize = s->dct_unquantize_mpeg; + s->mb_width = (s->width + 15) / 16; s->mb_height = (s->height + 15) / 16; s->mb_num = s->mb_width * s->mb_height; diff -r ac677a84d5df -r 8cf5507e6ca5 mpegvideo.h --- a/mpegvideo.h Sat Apr 06 22:29:37 2002 +0000 +++ b/mpegvideo.h Sun Apr 07 02:03:32 2002 +0000 @@ -309,7 +309,11 @@ DCTELEM intra_block[6][64] __align8; DCTELEM inter_block[6][64] __align8; DCTELEM inter4v_block[6][64] __align8; - void (*dct_unquantize)(struct MpegEncContext *s, + void (*dct_unquantize_mpeg)(struct MpegEncContext *s, + DCTELEM *block, int n, int qscale); + void (*dct_unquantize_h263)(struct MpegEncContext *s, + DCTELEM *block, int n, int qscale); + void (*dct_unquantize)(struct MpegEncContext *s, // unquantizer to use (mpeg4 can use both) DCTELEM *block, int n, int qscale); } MpegEncContext;