mirror of https://git.ffmpeg.org/ffmpeg.git
mpeg4 mpeg quantizer support
Originally committed as revision 381 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
e1a9dbffed
commit
3bf43d42ed
|
@ -47,6 +47,8 @@ UINT32 squareTbl[512];
|
||||||
|
|
||||||
extern UINT16 default_intra_matrix[64];
|
extern UINT16 default_intra_matrix[64];
|
||||||
extern UINT16 default_non_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] = {
|
UINT8 zigzag_direct[64] = {
|
||||||
0, 1, 8, 16, 9, 2, 3, 10,
|
0, 1, 8, 16, 9, 2, 3, 10,
|
||||||
|
@ -953,6 +955,8 @@ void dsputil_init(void)
|
||||||
}
|
}
|
||||||
block_permute(default_intra_matrix);
|
block_permute(default_intra_matrix);
|
||||||
block_permute(default_non_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();
|
build_zigzag_end();
|
||||||
|
|
|
@ -624,17 +624,14 @@ static void h263_encode_motion(MpegEncContext * s, int val)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (val >= 0) {
|
if (val >= 0) {
|
||||||
val--;
|
|
||||||
code = (val >> bit_size) + 1;
|
|
||||||
bits = val & (range - 1);
|
|
||||||
sign = 0;
|
sign = 0;
|
||||||
} else {
|
} else {
|
||||||
val = -val;
|
val = -val;
|
||||||
|
sign = 1;
|
||||||
|
}
|
||||||
val--;
|
val--;
|
||||||
code = (val >> bit_size) + 1;
|
code = (val >> bit_size) + 1;
|
||||||
bits = val & (range - 1);
|
bits = val & (range - 1);
|
||||||
sign = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
|
put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
|
||||||
if (bit_size > 0) {
|
if (bit_size > 0) {
|
||||||
|
@ -728,7 +725,7 @@ static void init_uni_dc_tab()
|
||||||
{
|
{
|
||||||
int level, uni_code, uni_len;
|
int level, uni_code, uni_len;
|
||||||
|
|
||||||
for(level=-255; level<256; level++){
|
for(level=-256; level<256; level++){
|
||||||
int size, v, l;
|
int size, v, l;
|
||||||
/* find number of bits */
|
/* find number of bits */
|
||||||
size = 0;
|
size = 0;
|
||||||
|
@ -2509,7 +2506,57 @@ int mpeg4_decode_picture_header(MpegEncContext * s)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME a bunch of grayscale shape things
|
// 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)
|
if(vo_ver_id != 1)
|
||||||
s->quarter_sample= get_bits1(&s->gb);
|
s->quarter_sample= get_bits1(&s->gb);
|
||||||
else s->quarter_sample=0;
|
else s->quarter_sample=0;
|
||||||
|
|
|
@ -440,10 +440,8 @@ void unused_var_warning_killer(){
|
||||||
void MPV_common_init_mmx(MpegEncContext *s)
|
void MPV_common_init_mmx(MpegEncContext *s)
|
||||||
{
|
{
|
||||||
if (mm_flags & MM_MMX) {
|
if (mm_flags & MM_MMX) {
|
||||||
if (s->out_format == FMT_H263)
|
s->dct_unquantize_h263 = dct_unquantize_h263_mmx;
|
||||||
s->dct_unquantize = dct_unquantize_h263_mmx;
|
s->dct_unquantize_mpeg = dct_unquantize_mpeg1_mmx;
|
||||||
else
|
|
||||||
s->dct_unquantize = dct_unquantize_mpeg1_mmx;
|
|
||||||
|
|
||||||
draw_edges = draw_edges_mmx;
|
draw_edges = draw_edges_mmx;
|
||||||
|
|
||||||
|
|
|
@ -122,3 +122,27 @@ static const UINT16 pixel_aspect[16][2]={
|
||||||
{0, 0},
|
{0, 0},
|
||||||
{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;
|
int c_size, i;
|
||||||
UINT8 *pict;
|
UINT8 *pict;
|
||||||
|
|
||||||
if (s->out_format == FMT_H263)
|
s->dct_unquantize_h263 = dct_unquantize_h263_c;
|
||||||
s->dct_unquantize = dct_unquantize_h263_c;
|
s->dct_unquantize_mpeg = dct_unquantize_mpeg1_c;
|
||||||
else
|
|
||||||
s->dct_unquantize = dct_unquantize_mpeg1_c;
|
|
||||||
|
|
||||||
#ifdef HAVE_MMX
|
#ifdef HAVE_MMX
|
||||||
MPV_common_init_mmx(s);
|
MPV_common_init_mmx(s);
|
||||||
#endif
|
#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_width = (s->width + 15) / 16;
|
||||||
s->mb_height = (s->height + 15) / 16;
|
s->mb_height = (s->height + 15) / 16;
|
||||||
s->mb_num = s->mb_width * s->mb_height;
|
s->mb_num = s->mb_width * s->mb_height;
|
||||||
|
|
|
@ -309,7 +309,11 @@ typedef struct MpegEncContext {
|
||||||
DCTELEM intra_block[6][64] __align8;
|
DCTELEM intra_block[6][64] __align8;
|
||||||
DCTELEM inter_block[6][64] __align8;
|
DCTELEM inter_block[6][64] __align8;
|
||||||
DCTELEM inter4v_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);
|
DCTELEM *block, int n, int qscale);
|
||||||
} MpegEncContext;
|
} MpegEncContext;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue