Originally committed as revision 381 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
| @@ -47,6 +47,8 @@ UINT32 squareTbl[512]; | |||
| 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 @@ void dsputil_init(void) | |||
| } | |||
| 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(); | |||
| @@ -624,17 +624,14 @@ static void h263_encode_motion(MpegEncContext * s, int val) | |||
| } | |||
| 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 @@ static void init_uni_dc_tab() | |||
| { | |||
| 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 @@ int mpeg4_decode_picture_header(MpegEncContext * s) | |||
| } | |||
| // 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; | |||
| @@ -440,11 +440,9 @@ void unused_var_warning_killer(){ | |||
| 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){ | |||
| @@ -122,3 +122,27 @@ static const UINT16 pixel_aspect[16][2]={ | |||
| {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, | |||
| }; | |||
| @@ -110,14 +110,18 @@ int MPV_common_init(MpegEncContext *s) | |||
| 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; | |||
| @@ -309,7 +309,11 @@ typedef struct MpegEncContext { | |||
| 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; | |||