Commit 62959862 authored by Michael Niedermayer's avatar Michael Niedermayer

faster vlc table selection

Originally committed as revision 848 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 2141dc37
...@@ -60,11 +60,12 @@ static int msmpeg4_decode_motion(MpegEncContext * s, ...@@ -60,11 +60,12 @@ static int msmpeg4_decode_motion(MpegEncContext * s,
static void msmpeg4v2_encode_motion(MpegEncContext * s, int val); static void msmpeg4v2_encode_motion(MpegEncContext * s, int val);
static void init_h263_dc_for_msmpeg4(void); static void init_h263_dc_for_msmpeg4(void);
static inline void msmpeg4_memsetw(short *tab, int val, int n); static inline void msmpeg4_memsetw(short *tab, int val, int n);
static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra);
extern UINT32 inverse[256]; extern UINT32 inverse[256];
#ifdef DEBUG #ifdef DEBUG
int intra_count = 0; int intra_count = 0;
int frame_count = 0; int frame_count = 0;
...@@ -72,6 +73,8 @@ int frame_count = 0; ...@@ -72,6 +73,8 @@ int frame_count = 0;
#include "msmpeg4data.h" #include "msmpeg4data.h"
static int rl_length[2][NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2];
#ifdef STATS #ifdef STATS
const char *st_names[ST_NB] = { const char *st_names[ST_NB] = {
...@@ -187,7 +190,6 @@ static void common_init(MpegEncContext * s) ...@@ -187,7 +190,6 @@ static void common_init(MpegEncContext * s)
wmv1_scantable[i][k]= block_permute_op(j); wmv1_scantable[i][k]= block_permute_op(j);
} }
} }
} }
} }
...@@ -236,6 +238,20 @@ void ff_msmpeg4_encode_init(MpegEncContext *s) ...@@ -236,6 +238,20 @@ void ff_msmpeg4_encode_init(MpegEncContext *s)
init_mv_table(&mv_tables[1]); init_mv_table(&mv_tables[1]);
for(i=0;i<NB_RL_TABLES;i++) for(i=0;i<NB_RL_TABLES;i++)
init_rl(&rl_table[i]); init_rl(&rl_table[i]);
for(i=0; i<NB_RL_TABLES; i++){
int level;
for(level=0; level<=MAX_LEVEL; level++){
int run;
for(run=0; run<=MAX_RUN; run++){
int last;
for(last=0; last<2; last++){
rl_length[0][i][level][run][last]= get_size_of_code(s, &rl_table[ i], last, run, level,0);
rl_length[1][i][level][run][last]= get_size_of_code(s, &rl_table[ i], last, run, level,1);
}
}
}
}
} }
} }
...@@ -285,8 +301,7 @@ static void find_best_tables(MpegEncContext * s) ...@@ -285,8 +301,7 @@ static void find_best_tables(MpegEncContext * s)
int i; int i;
int best =-1, best_size =9999999; int best =-1, best_size =9999999;
int chroma_best=-1, best_chroma_size=9999999; int chroma_best=-1, best_chroma_size=9999999;
int last_size=0;
for(i=0; i<3; i++){ for(i=0; i<3; i++){
int level; int level;
int chroma_size=0; int chroma_size=0;
...@@ -300,20 +315,22 @@ static void find_best_tables(MpegEncContext * s) ...@@ -300,20 +315,22 @@ static void find_best_tables(MpegEncContext * s)
int run; int run;
for(run=0; run<=MAX_RUN; run++){ for(run=0; run<=MAX_RUN; run++){
int last; int last;
const int last_size= size + chroma_size;
for(last=0; last<2; last++){ for(last=0; last<2; last++){
int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last]; int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last];
int intra_luma_count = s->ac_stats[1][0][level][run][last]; int intra_luma_count = s->ac_stats[1][0][level][run][last];
int intra_chroma_count= s->ac_stats[1][1][level][run][last]; int intra_chroma_count= s->ac_stats[1][1][level][run][last];
if(s->pict_type==I_TYPE){ if(s->pict_type==I_TYPE){
size += intra_luma_count *get_size_of_code(s, &rl_table[ i], last, run, level,1); size += intra_luma_count *rl_length[1][i ][level][run][last];
chroma_size+= intra_chroma_count*get_size_of_code(s, &rl_table[3+i], last, run, level,1); chroma_size+= intra_chroma_count*rl_length[1][i+3][level][run][last];
}else{ }else{
size+= intra_luma_count *get_size_of_code(s, &rl_table[ i], last, run, level,1) size+= intra_luma_count *rl_length[1][i ][level][run][last]
+intra_chroma_count*get_size_of_code(s, &rl_table[3+i], last, run, level,1) +intra_chroma_count*rl_length[1][i+3][level][run][last]
+inter_count *get_size_of_code(s, &rl_table[3+i], last, run, level,0); +inter_count *rl_length[0][i+3][level][run][last];
} }
} }
if(last_size == size+chroma_size) break;
} }
} }
if(size<best_size){ if(size<best_size){
...@@ -325,6 +342,7 @@ static void find_best_tables(MpegEncContext * s) ...@@ -325,6 +342,7 @@ static void find_best_tables(MpegEncContext * s)
chroma_best= i; chroma_best= i;
} }
} }
// printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n", // printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n",
// s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size); // s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size);
...@@ -952,6 +970,7 @@ static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int ...@@ -952,6 +970,7 @@ static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int
sign = 1; sign = 1;
level = -level; level = -level;
} }
if(level<=MAX_LEVEL && run<=MAX_RUN){ if(level<=MAX_LEVEL && run<=MAX_RUN){
s->ac_stats[s->mb_intra][n>3][level][run][last]++; s->ac_stats[s->mb_intra][n>3][level][run][last]++;
} }
......
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