GetBitContext gb;
PutBitContext pb;
uint64_t rc_stat[256][2];
+ uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
int version;
int width, height;
int chroma_h_shift, chroma_v_shift;
return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF];
}
-static av_always_inline av_flatten void put_symbol_inline(RangeCoder *c, uint8_t *state, int v, int is_signed, uint64_t rc_stat[256][2]){
+static av_always_inline av_flatten void put_symbol_inline(RangeCoder *c, uint8_t *state, int v, int is_signed, uint64_t rc_stat[256][2], uint64_t rc_stat2[32][2]){
int i;
#define put_rac(C,S,B) \
do{\
if(rc_stat){\
rc_stat[*(S)][B]++;\
+ rc_stat2[(S)-state][B]++;\
}\
put_rac(C,S,B);\
}while(0)
}
static void av_noinline put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
- put_symbol_inline(c, state, v, is_signed, NULL);
+ put_symbol_inline(c, state, v, is_signed, NULL, NULL);
}
static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed){
if(s->ac){
if(s->flags & CODEC_FLAG_PASS1){
- put_symbol_inline(c, p->state[context], diff, 1, s->rc_stat);
+ put_symbol_inline(c, p->state[context], diff, 1, s->rc_stat, s->rc_stat2[p->quant_table_index][context]);
}else{
- put_symbol_inline(c, p->state[context], diff, 1, NULL);
+ put_symbol_inline(c, p->state[context], diff, 1, NULL, NULL);
}
}else{
if(context == 0) run_mode=1;
return -1;
#define STATS_OUT_SIZE 1024*30
- if(avctx->flags & CODEC_FLAG_PASS1)
+ if(avctx->flags & CODEC_FLAG_PASS1){
avctx->stats_out= av_mallocz(STATS_OUT_SIZE);
+ for(i=0; i<s->quant_table_count; i++){
+ for(j=0; j<s->slice_count; j++){
+ FFV1Context *sf= s->slice_context[j];
+ av_assert0(!sf->rc_stat2[i]);
+ sf->rc_stat2[i]= av_mallocz(s->context_count[i]*sizeof(*sf->rc_stat2[i]));
+ if(!sf->rc_stat2[i])
+ return AVERROR(ENOMEM);
+ }
+ }
+ }
return 0;
}
}
av_freep(&avctx->stats_out);
+ for(j=0; j<s->quant_table_count; j++){
+ for(i=0; i<s->slice_count; i++){
+ FFV1Context *sf= s->slice_context[i];
+ av_freep(&sf->rc_stat2[j]);
+ }
+ }
return 0;
}