Commit ef5b1b5a authored by Juanjo's avatar Juanjo

- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.

- Bug fix H.263+ AIC tables.
- Warning fixes.

Originally committed as revision 431 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 95c79a24
This diff is collapsed.
...@@ -125,45 +125,73 @@ static RLTable rl_inter = { ...@@ -125,45 +125,73 @@ static RLTable rl_inter = {
inter_level, inter_level,
}; };
/* table used for Advanced INTRA Coding, just RUN and LEVEL change */ const UINT16 intra_vlc_aic[103][2] = {
const INT8 inter_level_aic[102] = { { 0x2, 2 }, { 0x6, 3 }, { 0xe, 4 }, { 0xc, 5 },
1, 1, 1, 1, 1, 1, 1, 1, { 0xd, 5 }, { 0x10, 6 }, { 0x11, 6 }, { 0x12, 6 },
1, 3, 2, 1, 2, 2, 4, 5, { 0x16, 7 }, { 0x1b, 8 }, { 0x20, 9 }, { 0x21, 9 },
6, 7, 3, 2, 3, 4, 5, 2, { 0x1a, 9 }, { 0x1b, 9 }, { 0x1c, 9 }, { 0x1d, 9 },
3, 4, 2, 3, 1, 2, 25, 1, { 0x1e, 9 }, { 0x1f, 9 }, { 0x23, 11 }, { 0x22, 11 },
2, 24, 8, 2, 7, 4, 6, 1, { 0x57, 12 }, { 0x56, 12 }, { 0x55, 12 }, { 0x54, 12 },
9, 23, 2, 3, 1, 10, 12, 11, { 0x53, 12 }, { 0xf, 4 }, { 0x14, 6 }, { 0x14, 7 },
18, 17, 16, 15, 14, 13, 20, 19, { 0x1e, 8 }, { 0xf, 10 }, { 0x21, 11 }, { 0x50, 12 },
22, 21, 1, 1, 1, 1, 1, 1, { 0xb, 5 }, { 0x15, 7 }, { 0xe, 10 }, { 0x9, 10 },
1, 2, 1, 1, 1, 3, 1, 1, { 0x15, 6 }, { 0x1d, 8 }, { 0xd, 10 }, { 0x51, 12 },
1, 1, 1, 1, 1, 4, 1, 1, { 0x13, 6 }, { 0x23, 9 }, { 0x7, 11 }, { 0x17, 7 },
1, 1, 2, 2, 6, 5, 2, 2, { 0x22, 9 }, { 0x52, 12 }, { 0x1c, 8 }, { 0xc, 10 },
3, 7, 3, 4, 9, 8, 1, 1, { 0x1f, 8 }, { 0xb, 10 }, { 0x25, 9 }, { 0xa, 10 },
1, 2, 2, 2, 3, 10, { 0x24, 9 }, { 0x6, 11 }, { 0x21, 10 }, { 0x20, 10 },
{ 0x8, 10 }, { 0x20, 11 }, { 0x7, 4 }, { 0xc, 6 },
{ 0x10, 7 }, { 0x13, 8 }, { 0x11, 9 }, { 0x12, 9 },
{ 0x4, 10 }, { 0x27, 11 }, { 0x26, 11 }, { 0x5f, 12 },
{ 0xf, 6 }, { 0x13, 9 }, { 0x5, 10 }, { 0x25, 11 },
{ 0xe, 6 }, { 0x14, 9 }, { 0x24, 11 }, { 0xd, 6 },
{ 0x6, 10 }, { 0x5e, 12 }, { 0x11, 7 }, { 0x7, 10 },
{ 0x13, 7 }, { 0x5d, 12 }, { 0x12, 7 }, { 0x5c, 12 },
{ 0x14, 8 }, { 0x5b, 12 }, { 0x15, 8 }, { 0x1a, 8 },
{ 0x19, 8 }, { 0x18, 8 }, { 0x17, 8 }, { 0x16, 8 },
{ 0x19, 9 }, { 0x15, 9 }, { 0x16, 9 }, { 0x18, 9 },
{ 0x17, 9 }, { 0x4, 11 }, { 0x5, 11 }, { 0x58, 12 },
{ 0x59, 12 }, { 0x5a, 12 }, { 0x3, 7 },
}; };
const INT8 inter_run_aic[102] = { const INT8 intra_run_aic[102] = {
0, 1, 3, 5, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0,
11, 4, 9, 13, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 0, 3, 2, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
3, 0, 5, 5, 2, 6, 0, 4, 0, 1, 1, 1, 1, 1, 1, 1,
7, 0, 0, 8, 0, 2, 0, 12, 2, 2, 2, 2, 3, 3, 3, 3,
0, 0, 2, 1, 6, 0, 0, 0, 4, 4, 4, 5, 5, 5, 6, 6,
0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 8, 8, 9, 9, 10, 11,
0, 0, 0, 14, 20, 1, 19, 2, 12, 13, 0, 0, 0, 0, 0, 0,
3, 0, 5, 6, 4, 0, 9, 10, 0, 0, 0, 0, 1, 1, 1, 1,
11, 12, 13, 8, 7, 0, 17, 18, 2, 2, 2, 3, 3, 3, 4, 4,
16, 15, 2, 1, 0, 0, 4, 3, 5, 5, 6, 6, 7, 7, 8, 9,
1, 0, 2, 1, 0, 0, 21, 22, 10, 11, 12, 13, 14, 15, 16, 17,
23, 7, 6, 5, 3, 0, 18, 19, 20, 21, 22, 23,
};
const INT8 intra_level_aic[102] = {
1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24,
25, 1, 2, 3, 4, 5, 6, 7,
1, 2, 3, 4, 1, 2, 3, 4,
1, 2, 3, 1, 2, 3, 1, 2,
1, 2, 1, 2, 1, 2, 1, 1,
1, 1, 1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 1, 2, 3, 4,
1, 2, 3, 1, 2, 3, 1, 2,
1, 2, 1, 2, 1, 2, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1,
}; };
static RLTable rl_intra_aic = { static RLTable rl_intra_aic = {
102, 102,
58, 58,
inter_vlc, intra_vlc_aic,
inter_run_aic, intra_run_aic,
inter_level_aic, intra_level_aic,
}; };
static const UINT16 h263_format[8][2] = { static const UINT16 h263_format[8][2] = {
...@@ -174,4 +202,3 @@ static const UINT16 h263_format[8][2] = { ...@@ -174,4 +202,3 @@ static const UINT16 h263_format[8][2] = {
{ 704, 576 }, { 704, 576 },
{ 1408, 1152 }, { 1408, 1152 },
}; };
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
static int h263_decode_init(AVCodecContext *avctx) static int h263_decode_init(AVCodecContext *avctx)
{ {
MpegEncContext *s = avctx->priv_data; MpegEncContext *s = avctx->priv_data;
int i;
s->avctx = avctx; s->avctx = avctx;
s->out_format = FMT_H263; s->out_format = FMT_H263;
......
...@@ -557,12 +557,12 @@ void MPV_common_init_mmx(MpegEncContext *s) ...@@ -557,12 +557,12 @@ void MPV_common_init_mmx(MpegEncContext *s)
s->dct_unquantize_mpeg1 = dct_unquantize_mpeg1_mmx; s->dct_unquantize_mpeg1 = dct_unquantize_mpeg1_mmx;
s->dct_unquantize_mpeg2 = dct_unquantize_mpeg2_mmx; s->dct_unquantize_mpeg2 = dct_unquantize_mpeg2_mmx;
draw_edges = draw_edges_mmx; draw_edges = draw_edges_mmx;
if(mm_flags & MM_MMXEXT){ if(mm_flags & MM_MMXEXT){
dct_quantize= dct_quantize_MMX2; dct_quantize= dct_quantize_MMX2;
}else{ } else {
dct_quantize= dct_quantize_MMX; dct_quantize= dct_quantize_MMX;
} }
} }
} }
...@@ -48,6 +48,7 @@ static int RENAME(dct_quantize)(MpegEncContext *s, ...@@ -48,6 +48,7 @@ static int RENAME(dct_quantize)(MpegEncContext *s,
else else
q = s->c_dc_scale; q = s->c_dc_scale;
/* note: block[0] is assumed to be positive */ /* note: block[0] is assumed to be positive */
if (!s->h263_aic) {
#if 1 #if 1
asm volatile ( asm volatile (
"xorl %%edx, %%edx \n\t" "xorl %%edx, %%edx \n\t"
...@@ -65,6 +66,10 @@ static int RENAME(dct_quantize)(MpegEncContext *s, ...@@ -65,6 +66,10 @@ static int RENAME(dct_quantize)(MpegEncContext *s,
: "%edx" : "%edx"
); );
#endif #endif
} else
/* For AIC we skip quant/dequant of INTRADC */
level = block[0];
block[0]=0; //avoid fake overflow block[0]=0; //avoid fake overflow
// temp_block[0] = (block[0] + (q >> 1)) / q; // temp_block[0] = (block[0] + (q >> 1)) / q;
last_non_zero_p1 = 1; last_non_zero_p1 = 1;
......
...@@ -32,8 +32,8 @@ ...@@ -32,8 +32,8 @@
#define ROW_SHIFT 11 #define ROW_SHIFT 11
#define COL_SHIFT 20 // 6 #define COL_SHIFT 20 // 6
static uint64_t __attribute__((aligned(8))) wm1010= 0xFFFF0000FFFF0000ULL; static const uint64_t __attribute__((aligned(8))) wm1010= 0xFFFF0000FFFF0000ULL;
static uint64_t __attribute__((aligned(8))) d40000= 0x0000000000040000ULL; static const uint64_t __attribute__((aligned(8))) d40000= 0x0000000000040000ULL;
static int16_t __attribute__((aligned(8))) temp[64]; static int16_t __attribute__((aligned(8))) temp[64];
static int16_t __attribute__((aligned(8))) coeffs[]= { static int16_t __attribute__((aligned(8))) coeffs[]= {
1<<(ROW_SHIFT-1), 0, 1<<(ROW_SHIFT-1), 0, 1<<(ROW_SHIFT-1), 0, 1<<(ROW_SHIFT-1), 0,
...@@ -63,12 +63,12 @@ static int16_t __attribute__((aligned(8))) coeffs[]= { ...@@ -63,12 +63,12 @@ static int16_t __attribute__((aligned(8))) coeffs[]= {
C3, -C1, C3, -C1 C3, -C1, C3, -C1
}; };
#if 0
static void unused_var_killer(){ static void unused_var_killer(){
int a= wm1010 + d40000; int a= wm1010 + d40000;
temp[0]=a; temp[0]=a;
} }
#if 0
static void inline idctCol (int16_t * col, int16_t *input) static void inline idctCol (int16_t * col, int16_t *input)
{ {
#undef C0 #undef C0
......
...@@ -449,6 +449,7 @@ int MPV_encode_init(AVCodecContext *avctx) ...@@ -449,6 +449,7 @@ int MPV_encode_init(AVCodecContext *avctx)
s->rtp_payload_size = 1200; s->rtp_payload_size = 1200;
s->h263_plus = 1; s->h263_plus = 1;
s->unrestricted_mv = 1; s->unrestricted_mv = 1;
s->h263_aic = 1;
/* These are just to be sure */ /* These are just to be sure */
s->umvplus = 0; s->umvplus = 0;
...@@ -542,7 +543,7 @@ int MPV_encode_init(AVCodecContext *avctx) ...@@ -542,7 +543,7 @@ int MPV_encode_init(AVCodecContext *avctx)
} }
/* precompute matrix */ /* precompute matrix */
/* for mjpeg, we do include qscale in the matrix */ /* for mjpeg, we do include qscale in the matrix */
if (s->out_format != FMT_MJPEG) { if (s->out_format != FMT_MJPEG) {
convert_matrix(s->q_intra_matrix, s->q_intra_matrix16, s->q_intra_matrix16_bias, convert_matrix(s->q_intra_matrix, s->q_intra_matrix16, s->q_intra_matrix16_bias,
s->intra_matrix, s->intra_quant_bias); s->intra_matrix, s->intra_quant_bias);
...@@ -1338,8 +1339,8 @@ static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index ...@@ -1338,8 +1339,8 @@ static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index
int i; int i;
const int maxlevel= s->max_qcoeff; const int maxlevel= s->max_qcoeff;
const int minlevel= s->min_qcoeff; const int minlevel= s->min_qcoeff;
for(i=0; i<=last_index; i++){ for(i=0;i<=last_index; i++){
const int j = zigzag_direct[i]; const int j = zigzag_direct[i];
int level = block[j]; int level = block[j];
...@@ -1441,6 +1442,9 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y) ...@@ -1441,6 +1442,9 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
/* DCT & quantize */ /* DCT & quantize */
if (s->h263_pred && s->msmpeg4_version!=2) { if (s->h263_pred && s->msmpeg4_version!=2) {
h263_dc_scale(s); h263_dc_scale(s);
} else if (s->h263_aic) {
s->y_dc_scale = 2*s->qscale;
s->c_dc_scale = 2*s->qscale;
} else { } else {
/* default quantization values */ /* default quantization values */
s->y_dc_scale = 8; s->y_dc_scale = 8;
...@@ -1450,14 +1454,16 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y) ...@@ -1450,14 +1454,16 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
for(i=0;i<6;i++) { for(i=0;i<6;i++) {
int overflow; int overflow;
s->block_last_index[i] = dct_quantize(s, s->block[i], i, 8, &overflow); s->block_last_index[i] = dct_quantize(s, s->block[i], i, 8, &overflow);
if(overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]); if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
} }
}else{ }else{
for(i=0;i<6;i++) { for(i=0;i<6;i++) {
int overflow; int overflow;
s->block_last_index[i] = dct_quantize(s, s->block[i], i, s->qscale, &overflow); s->block_last_index[i] = dct_quantize(s, s->block[i], i, s->qscale, &overflow);
// FIXME we could decide to change to quantizer instead of clipping // FIXME we could decide to change to quantizer instead of clipping
if(overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]); // JS: I don't think that would be a good idea it could lower quality instead
// of improve it. Just INTRADC clipping deserves changes in quantizer
if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
} }
} }
...@@ -2018,12 +2024,16 @@ static int dct_quantize_c(MpegEncContext *s, ...@@ -2018,12 +2024,16 @@ static int dct_quantize_c(MpegEncContext *s,
block_permute(block); block_permute(block);
if (s->mb_intra) { if (s->mb_intra) {
if (n < 4) if (!s->h263_aic) {
q = s->y_dc_scale; if (n < 4)
else q = s->y_dc_scale;
q = s->c_dc_scale; else
q = q << 3; q = s->c_dc_scale;
q = q << 3;
} else
/* For AIC we skip quant/dequant of INTRADC */
q = 1 << 3;
/* note: block[0] is assumed to be positive */ /* note: block[0] is assumed to be positive */
block[0] = (block[0] + (q >> 1)) / q; block[0] = (block[0] + (q >> 1)) / q;
i = 1; i = 1;
......
...@@ -337,7 +337,6 @@ static int rv10_decode_picture_header(MpegEncContext *s) ...@@ -337,7 +337,6 @@ static int rv10_decode_picture_header(MpegEncContext *s)
static int rv10_decode_init(AVCodecContext *avctx) static int rv10_decode_init(AVCodecContext *avctx)
{ {
MpegEncContext *s = avctx->priv_data; MpegEncContext *s = avctx->priv_data;
int i;
static int done; static int done;
// s->avctx= avctx; // s->avctx= avctx;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment