2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
14 #include "entropymode.h"
15 #include "systemdependent.h"
20 extern unsigned int active_section
;
23 static void encode_mvcomponent(
26 const struct mv_context
*mvc
29 const vp8_prob
*p
= mvc
->prob
;
30 const int x
= v
< 0 ? -v
: v
;
32 if (x
< mvnum_short
) // Small
34 vp8_write(w
, 0, p
[mvpis_short
]);
35 vp8_treed_write(w
, vp8_small_mvtree
, p
+ MVPshort
, x
, 3);
38 return; // no sign bit
44 vp8_write(w
, 1, p
[mvpis_short
]);
47 vp8_write(w
, (x
>> i
) & 1, p
[MVPbits
+ i
]);
51 i
= mvlong_width
- 1; /* Skip bit 3, which is sometimes implicit */
54 vp8_write(w
, (x
>> i
) & 1, p
[MVPbits
+ i
]);
59 vp8_write(w
, (x
>> 3) & 1, p
[MVPbits
+ 3]);
62 vp8_write(w
, v
< 0, p
[MVPsign
]);
65 static int max_mv_r
= 0;
66 static int max_mv_c
= 0;
68 void vp8_encode_motion_vector(vp8_writer
*w
, const MV
*mv
, const MV_CONTEXT
*mvc
)
73 if (abs(mv
->row
>> 1) > max_mv_r
)
75 FILE *f
= fopen("maxmv.stt", "a");
76 max_mv_r
= abs(mv
->row
>> 1);
77 fprintf(f
, "New Mv Row Max %6d\n", (mv
->row
>> 1));
79 if ((abs(mv
->row
) / 2) != max_mv_r
)
80 fprintf(f
, "MV Row conversion error %6d\n", abs(mv
->row
) / 2);
85 if (abs(mv
->col
>> 1) > max_mv_c
)
87 FILE *f
= fopen("maxmv.stt", "a");
88 fprintf(f
, "New Mv Col Max %6d\n", (mv
->col
>> 1));
89 max_mv_c
= abs(mv
->col
>> 1);
95 encode_mvcomponent(w
, mv
->row
>> 1, &mvc
[0]);
96 encode_mvcomponent(w
, mv
->col
>> 1, &mvc
[1]);
100 static unsigned int cost_mvcomponent(const int v
, const struct mv_context
*mvc
)
102 const vp8_prob
*p
= mvc
->prob
;
103 const int x
= v
; //v<0? -v:v;
108 cost
= vp8_cost_zero(p
[mvpis_short
])
109 + vp8_treed_cost(vp8_small_mvtree
, p
+ MVPshort
, x
, 3);
117 cost
= vp8_cost_one(p
[mvpis_short
]);
120 cost
+= vp8_cost_bit(p
[MVPbits
+ i
], (x
>> i
) & 1);
124 i
= mvlong_width
- 1; /* Skip bit 3, which is sometimes implicit */
127 cost
+= vp8_cost_bit(p
[MVPbits
+ i
], (x
>> i
) & 1);
132 cost
+= vp8_cost_bit(p
[MVPbits
+ 3], (x
>> 3) & 1);
135 return cost
; // + vp8_cost_bit( p [MVPsign], v < 0);
137 //#define M_LOG2_E 0.693147180559945309417
138 //#define log2f(x) (log (x) / (float) M_LOG2_E)
140 void vp8_build_component_cost_table(int *mvcost
[2], int *mvsadcost
[2], const MV_CONTEXT
*mvc
, int mvc_flag
[2])
142 int i
= 1; //-mv_max;
143 unsigned int cost0
= 0;
144 unsigned int cost1
= 0;
146 vp8_clear_system_state();
148 mvsadcost
[0] [0] = 300;
149 mvsadcost
[1] [0] = 300;
153 double z
= 256 * (2 * (log2f(2 * i
) + .6));
154 mvsadcost
[0][i
] = (int) z
;
155 mvsadcost
[1][i
] = (int) z
;
156 mvsadcost
[0][-i
] = (int) z
;
157 mvsadcost
[1][-i
] = (int) z
;
159 while (++i
<= mv_max
);
167 mvcost
[0] [0] = cost_mvcomponent(0, &mvc
[0]);
171 //mvcost [0] [i] = cost_mvcomponent( i, &mvc[0]);
172 cost0
= cost_mvcomponent(i
, &mvc
[0]);
174 mvcost
[0] [i
] = cost0
+ vp8_cost_zero(mvc
[0].prob
[MVPsign
]);
175 mvcost
[0] [-i
] = cost0
+ vp8_cost_one(mvc
[0].prob
[MVPsign
]);
177 while (++i
<= mv_max
);
184 mvcost
[1] [0] = cost_mvcomponent(0, &mvc
[1]);
188 //mvcost [1] [i] = cost_mvcomponent( i, mvc[1]);
189 cost1
= cost_mvcomponent(i
, &mvc
[1]);
191 mvcost
[1] [i
] = cost1
+ vp8_cost_zero(mvc
[1].prob
[MVPsign
]);
192 mvcost
[1] [-i
] = cost1
+ vp8_cost_one(mvc
[1].prob
[MVPsign
]);
194 while (++i
<= mv_max
);
201 mvcost [0] [i] = cost_mvcomponent( i, mvc[0]);
202 mvcost [1] [i] = cost_mvcomponent( i, mvc[1]);
204 while( ++i <= mv_max);
209 // Motion vector probability table update depends on benefit.
210 // Small correction allows for the fact that an update to an MV probability
211 // may have benefit in subsequent frames as well as the current one.
213 #define MV_PROB_UPDATE_CORRECTION -1
216 __inline
static void calc_prob(vp8_prob
*p
, const unsigned int ct
[2])
218 const unsigned int tot
= ct
[0] + ct
[1];
222 const vp8_prob x
= ((ct
[0] * 255) / tot
) & -2;
229 const unsigned int ct
[2],
230 vp8_prob
*const cur_p
,
231 const vp8_prob new_p
,
232 const vp8_prob update_p
,
236 const int cur_b
= vp8_cost_branch(ct
, *cur_p
);
237 const int new_b
= vp8_cost_branch(ct
, new_p
);
238 const int cost
= 7 + MV_PROB_UPDATE_CORRECTION
+ ((vp8_cost_one(update_p
) - vp8_cost_zero(update_p
) + 128) >> 8);
240 if (cur_b
- new_b
> cost
)
243 vp8_write(w
, 1, update_p
);
244 vp8_write_literal(w
, new_p
>> 1, 7);
249 vp8_write(w
, 0, update_p
);
252 static void write_component_probs(
254 struct mv_context
*cur_mvc
,
255 const struct mv_context
*default_mvc_
,
256 const struct mv_context
*update_mvc
,
257 const unsigned int events
[MVvals
],
262 vp8_prob
*Pcur
= cur_mvc
->prob
;
263 const vp8_prob
*default_mvc
= default_mvc_
->prob
;
264 const vp8_prob
*Pupdate
= update_mvc
->prob
;
265 unsigned int is_short_ct
[2], sign_ct
[2];
267 unsigned int bit_ct
[mvlong_width
] [2];
269 unsigned int short_ct
[mvnum_short
];
270 unsigned int short_bct
[mvnum_short
-1] [2];
272 vp8_prob Pnew
[MVPcount
];
275 vp8_copy_array(Pnew
, default_mvc
, MVPcount
);
277 vp8_zero(is_short_ct
)
286 const int c
= events
[mv_max
];
288 is_short_ct
[0] += c
; // Short vector
289 short_ct
[0] += c
; // Magnitude distribution
292 //j: 1 ~ mv_max (1023)
298 const int c1
= events
[mv_max
+ j
]; //positive
299 const int c2
= events
[mv_max
- j
]; //negative
300 const int c
= c1
+ c2
;
308 is_short_ct
[0] += c
; // Short vector
309 short_ct
[a
] += c
; // Magnitude distribution
313 int k
= mvlong_width
- 1;
314 is_short_ct
[1] += c
; // Long vector
316 /* bit 3 not always encoded. */
318 bit_ct
[k
] [(a
>> k
) & 1] += c
;
323 while (++j
<= mv_max
);
332 const int c = events [mv_max + j];
345 is_short_ct [0] += c; // Short vector
346 short_ct [a] += c; // Magnitude distribution
350 int k = mvlong_width - 1;
351 is_short_ct [1] += c; // Long vector
353 // bit 3 not always encoded.
356 bit_ct [k] [(a >> k) & 1] += c;
359 } while( ++j <= mv_max);
363 calc_prob(Pnew
+ mvpis_short
, is_short_ct
);
365 calc_prob(Pnew
+ MVPsign
, sign_ct
);
368 vp8_prob p
[mvnum_short
- 1]; /* actually only need branch ct */
371 vp8_tree_probs_from_distribution(
372 8, vp8_small_mvencodings
, vp8_small_mvtree
,
373 p
, short_bct
, short_ct
,
378 calc_prob(Pnew
+ MVPshort
+ j
, short_bct
[j
]);
380 while (++j
< mvnum_short
- 1);
387 calc_prob(Pnew
+ MVPbits
+ j
, bit_ct
[j
]);
389 while (++j
< mvlong_width
);
392 update(w
, is_short_ct
, Pcur
+ mvpis_short
, Pnew
[mvpis_short
], *Pupdate
++, updated
);
394 update(w
, sign_ct
, Pcur
+ MVPsign
, Pnew
[MVPsign
], *Pupdate
++, updated
);
397 const vp8_prob
*const new_p
= Pnew
+ MVPshort
;
398 vp8_prob
*const cur_p
= Pcur
+ MVPshort
;
404 update(w
, short_bct
[j
], cur_p
+ j
, new_p
[j
], *Pupdate
++, updated
);
406 while (++j
< mvnum_short
- 1);
410 const vp8_prob
*const new_p
= Pnew
+ MVPbits
;
411 vp8_prob
*const cur_p
= Pcur
+ MVPbits
;
417 update(w
, bit_ct
[j
], cur_p
+ j
, new_p
[j
], *Pupdate
++, updated
);
419 while (++j
< mvlong_width
);
423 void vp8_write_mvprobs(VP8_COMP
*cpi
)
425 vp8_writer
*const w
= & cpi
->bc
;
426 MV_CONTEXT
*mvc
= cpi
->common
.fc
.mvc
;
427 int flags
[2] = {0, 0};
431 write_component_probs(
432 w
, &mvc
[0], &vp8_default_mv_context
[0], &vp8_mv_update_probs
[0], cpi
->MVcount
[0], 0, &flags
[0]
434 write_component_probs(
435 w
, &mvc
[1], &vp8_default_mv_context
[1], &vp8_mv_update_probs
[1], cpi
->MVcount
[1], 1, &flags
[1]
438 if (flags
[0] || flags
[1])
439 vp8_build_component_cost_table(cpi
->mb
.mvcost
, cpi
->mb
.mvsadcost
, (const MV_CONTEXT
*) cpi
->common
.fc
.mvc
, flags
);