Commit Graph

3397 Commits

Author SHA1 Message Date
Jingning Han
e69461593d Merge "Enable dual buffer rd search and encoding scheme" 2013-11-12 18:11:41 -08:00
Dmitry Kovalev
919eeef5c8 Merge "Calculating transform block offsets (x and y) only once." 2013-11-12 16:57:30 -08:00
Dmitry Kovalev
73a5cbeba4 Merge "Using max_tx_size instead of bsize when possible." 2013-11-12 16:54:30 -08:00
Dmitry Kovalev
3a2ea76469 Merge "Moving {sb, mb, b, ab}_index from MACROBLOCKD to MACROBLOCK." 2013-11-12 15:59:28 -08:00
Dmitry Kovalev
58b004ff64 Merge "Adding const to tree pointer inside vp9_extra_bit struct." 2013-11-12 15:48:07 -08:00
Johann
8dd3905163 Merge "Added optimized vp9_idct32x32_34_add_dspr2" 2013-11-12 15:30:00 -08:00
Dmitry Kovalev
20f34ff0db Adding const to tree pointer inside vp9_extra_bit struct.
Change-Id: I60e02fa3de930ff1f969687ab5af93dee40d86ad
2013-11-12 14:21:15 -08:00
Dmitry Kovalev
ed5a993a97 Calculating transform block offsets (x and y) only once.
Change-Id: I4b5106bdc08fd4551339b968c13428a8f43122e2
2013-11-12 13:55:13 -08:00
Yunqing Wang
ce89309b45 Use 1D array to store super block filter levels
As Jim suggested, 1D array was used to store filter levels instead
of 2D array. This used shift_y in setup_mask directly, and saved
few cycles.

Change-Id: If61ab298784861f1806b1cd396d4e4e2e0f097b9
2013-11-12 12:07:57 -08:00
Deb Mukherjee
a33a84b11a Merge "Removes conditional statements from band getting" 2013-11-12 11:22:21 -08:00
Johann
e72d49a97a Use lowercase 'b' to branch
iOS doesn't recognize B:
bad instruction `B idct32_pass_loop'

Change-Id: I3cf6aede4639f1d9efa97f7962fa287ba6feaaef
2013-11-12 10:41:06 -08:00
Yunqing Wang
17322275dd Merge "Rewrite filter_selectively_horiz for parallel loopfiltering" 2013-11-12 10:20:49 -08:00
Yunqing Wang
7989768766 Merge "Improve loopfilter function" 2013-11-12 10:19:56 -08:00
Deb Mukherjee
5ade423774 Removes conditional statements from band getting
Implements scan order to band map with arrays in both the encoder
and decoder to remove conditional statements.

Encoding seems to be about 1% faster at speed 0, tested on football.
Decoding seems to be about 0.5-1% faster on a set of 25 videos.

Change-Id: Idb233ca0b9e0efd790e30880642e8717e1c5c8dd
2013-11-12 10:13:27 -08:00
Dmitry Kovalev
e5ed605f01 Merge "Removing redundant assignment." 2013-11-11 18:37:22 -08:00
Dmitry Kovalev
50f97cf7fb Removing function pointers from inter prediction.
Removing foreach_predicted_block_visitor and calling build_inter_predictors
directly.

Change-Id: I11bb3c872b99b47c2680b01b0dbcc01c558c4a2b
2013-11-11 18:37:00 -08:00
Jingning Han
34b6abefa2 Enable dual buffer rd search and encoding scheme
This commit enables the dual buffer rate-distortion optimization
and encoding scheme. It stacks the original transform coefficients,
quantized levels, and reconstructed coefficients, in the rate-
distortion optimization search process, hence eliminates the need
to re-run residual generation, forward transform, and quantization
in the encoding stage.

Change-Id: I011bfad3a59a380a869ee552e91dae0394ec492e
2013-11-11 18:32:55 -08:00
Jingning Han
e5741c56d1 Merge "Allocate dual buffer sets for encoding" 2013-11-11 18:00:57 -08:00
Dmitry Kovalev
42b1f62085 Removing redundant assignment.
xd->mi_8x8 is assigned inside set_offsets() for each prediction block.

Change-Id: I20e5974a9eaf105e5a04fc7f99b7a93bd50e3d0a
2013-11-11 17:39:43 -08:00
Dmitry Kovalev
3740d67d76 Syncing write_modes_{b, sb} implementation with decode_modes_{b, sb}.
Change-Id: Iaee740ec3bfb2b5328c24f4641c285e5a4a046dc
2013-11-11 17:29:31 -08:00
Yunqing Wang
b45438181c Rewrite filter_selectively_horiz for parallel loopfiltering
Added loop filter mask checking, and made the caller function
ready for implementation of parallel loopfiltering in horizontal
direction.

Next, we need to go through the loopfilter functions (both c and
optimized versions), and provide 16-byte wide loopfiltering for
each filter type.

Change-Id: Ifef47e7ef9086ebc2fd6ca7ede8f27c9bbf79e66
2013-11-11 17:06:01 -08:00
Dmitry Kovalev
4e39d530f0 Merge "Cleaning up joint_motion_search function." 2013-11-11 16:34:39 -08:00
Jingning Han
3b3aea6834 Allocate dual buffer sets for encoding
Allocate memory space of dual buffer sets that store the coeff, qcoeff,
dqcoeff, and eobs. Connect the pointers of macroblock_plane and
macroblockd_plane to the actual buffer in use accordingly.

Change-Id: I2f0b5f482ca879fae39095013eaf8901db20a5a4
2013-11-11 16:24:39 -08:00
Dmitry Kovalev
14f2cf1757 Cleaning up joint_motion_search function.
Change-Id: I70a0878b23bda0ac3ff8733b4c96d5c636bc551c
2013-11-11 16:04:02 -08:00
Dmitry Kovalev
3551e25099 Moving {sb, mb, b, ab}_index from MACROBLOCKD to MACROBLOCK.
We use {sb, mb, b, ab}_index only inside encoder, so moving them into
appropriate data structure.

Change-Id: Ib5c1036716354d9d321e11a60c1634c1cb8f9716
2013-11-11 15:58:57 -08:00
Jingning Han
d8b4c79270 Decouple macroblockd_plane buffer usage
Make the macroblockd_plane contain dynamic buffer pointers instead
static pointers to the memory space allocated therein. The decoder
uses the buffer allocated in pbi, while encoder will use a dual
buffer approach for rate-distortion optimization search.

Change-Id: Ie6f24be2dcda35df7c15b4014e5ccf236fb3f76c
2013-11-11 15:26:10 -08:00
Dmitry Kovalev
94d4add1f7 Replacing raster_block with block in the encoder.
We only used "ib" to call get_scan() function, which in turn calls
get_tx_type_4x4() function. The latter one only needs block index if
bsize < BLOCK_8X8 -- under that condition raster_block == block.

Change-Id: I697306a0c3cf937acdd4f5e623d4367c5acc0b2f
2013-11-11 15:18:48 -08:00
hkuang
c689a126ed Fix a bug in the assembly code.
Change-Id: Ic416e3f8a11e82ee298e6f709b2119a9ddf1e2f8
2013-11-11 12:49:12 -08:00
Dmitry Kovalev
ec8128e27f Merge "Replacing (raster_block >> tx_size) with (block >> (tx_size << 1))." 2013-11-11 12:27:42 -08:00
Dmitry Kovalev
c53a9c70fb Merge "Localizing NEARESTMV special cases in the code." 2013-11-11 11:12:06 -08:00
Dmitry Kovalev
f6baa62cd8 Merge "Cleaning up vp9_quantize_b_c() function." 2013-11-11 11:02:32 -08:00
Dmitry Kovalev
3aa4b42a35 Merge "Cleaning up read_mv_probs() function." 2013-11-11 11:01:35 -08:00
Dmitry Kovalev
974a27131e Merge "Adding read_reference_mode() function." 2013-11-11 11:00:51 -08:00
Yaowu Xu
af2559c0d6 Merge "[BITSTREAM]Fix row tile mode_info pointer setup" 2013-11-09 13:59:19 -08:00
Yaowu Xu
cae7e0741a [BITSTREAM]Fix row tile mode_info pointer setup
This commit fixes the assignment of mode_info pointer per tile. It
makes recognition of tiles in both row and column formats and properly
arrange the use of mode_info.

The bug was first introduced in
I6226456dd11f275fa991e4a7a930549da6675915
https://gerrit.chromium.org/gerrit/#/c/67492/

Change-Id: Ie12cd209f53241513728c461ee3d7b9599ddb860
2013-11-08 22:06:53 -08:00
Yaowu Xu
ee1e4e645a Merge "Correct a couple of typos" 2013-11-08 16:17:38 -08:00
Dmitry Kovalev
22a001988b Optimizing set_contexts() function.
Inlining set_contexts_on_border() into set_contexts(). The only difference
is the additional check that "has_eob != 0" in addition to
"xd->mb_to_right_edge < 0" and "xd->mb_to_right_edge < 0". If has_eob == 0
then memset does the right thing and works faster.

Change-Id: I5206f767d729f758b14c667592b7034df4837d0e
2013-11-08 12:44:56 -08:00
Yaowu Xu
a596975eb6 Correct a couple of typos
Change-Id: Ic470c6c9ce27b615c9645b9cb0d67526417bc374
2013-11-08 12:43:51 -08:00
Yunqing Wang
e731b2ba2c Merge "Improve vp9_idct4x4_1_add_sse2" 2013-11-08 12:00:36 -08:00
Yunqing Wang
49cf335e7f Improve loopfilter function
This patch continued the work done in "Rewrite loop_filter_info_n
struct"(commit:00dbd369c70270428d56da6d15ea5486fc821c52) to further
improve loopfilter function.

1. Instead of storing pointers to thresholds, store loopfilter
levels within 64x64 SB;
2. Since loopfilter levels are already calculated in setup_mask,
we don't need call build_lfi to look up them again. Just save
loopfilter levels in setup_mask.
3. Reorganized and simplified filter_block_plane().

Tests showed a ~0.8% decoder speedup.

Change-Id: I723c7779738bbc2afcb9afa2c6f78580ee6c3af7
2013-11-08 11:48:31 -08:00
Yaowu Xu
814112d0f6 Merge "Disable zeroblock forcing for lossless coding mode" 2013-11-08 11:11:39 -08:00
Dmitry Kovalev
614effc0f6 Merge "Unifying tile decoding for both direct and inverse tile order." 2013-11-08 10:59:02 -08:00
Yaowu Xu
a4a5a210cb Disable zeroblock forcing for lossless coding mode
This to make sure that prediction residue always get coded in lossless
mode.

This commit also fixed lossless unit test

Change-Id: I537726ee55328d4e4cf0a0196393a67e12bfcde1
2013-11-08 10:32:44 -08:00
Yunqing Wang
283427c053 Merge "Remove TEXTREL from 32bit encoder" 2013-11-08 08:26:30 -08:00
Paul Wilkins
0ed606fd40 Merge "Removed unused rate parameter." 2013-11-08 04:24:51 -08:00
Dmitry Kovalev
d28f30ef4e Replacing (raster_block >> tx_size) with (block >> (tx_size << 1)).
The new expression is much more logical than previous one. Surprisingly
both expressions give exactly the same set of dependent values
-- have_top, have_left, have_right -- in vp9_predict_intra_block.

Change-Id: I63eb1b592b8c37883b3a0dbb1f3daa271e446109
2013-11-07 15:26:57 -08:00
hkuang
a6462990e6 Merge "Add back vp9_short_idct32x32_1_add_neon which is deleted in cleanup I63df79a13cf62aa2c9360a7a26933c100f9ebda3." 2013-11-07 14:42:29 -08:00
Yunqing Wang
d7289658fb Remove TEXTREL from 32bit encoder
This patch fixed the issue reported in "Issue 655: remove textrel's
from 32-bit vp9 encoder". The set of vp9_subpel_variance functions
that used x86inc.asm ABI didn't build correctly for 32bit PIC. The
fix was carefully done under the situation that there was not
enough registers.

After the change, we got
$ eu-findtextrel libvpx.so
eu-findtextrel: no text relocations reported in 'libvpx.so'

Change-Id: I1b176311dedaf48eaee0a1e777588043c97cea82
2013-11-07 13:39:40 -08:00
Jingning Han
abdefeaa89 Merge "Fix the variable naming in encode_block" 2013-11-07 11:39:04 -08:00
Deb Mukherjee
6cf3b98ac2 Merge "Miscelleneous changes in detokenize for speed" 2013-11-07 09:40:07 -08:00
Jingning Han
e91d770511 Fix the variable naming in encode_block
The term x represents macroblock pointer across encode_block. Change
the two local variable names to avoid confusion.

Change-Id: Ic732e73023525d673c0a678ed2708ac1edf5a3f9
2013-11-07 08:59:14 -08:00
Paul Wilkins
84b3b03705 Removed unused rate parameter.
Change-Id: I6e4a266fdbad1d222eb45d45b67bbb82d091821a
2013-11-07 09:59:45 +00:00
Dmitry Kovalev
672ba3ddf5 Unifying tile decoding for both direct and inverse tile order.
Now tile decoding consists of two stages:
1. Find tile buffer start and its size, put this info into tile_buffers.
2. Decode each tile based on information from tile_buffers.

It seems that stage 1 can also be reused by multithreaded tile decoder.

Change-Id: If0cdaefdd6d10bb41c63561346c9ae4cfac081dd
2013-11-06 18:15:33 -08:00
Ivan Maltz
741c14fcf0 Merge "Move SVC per-frame loop from sample app into libvpx proper" 2013-11-06 17:24:05 -08:00
Dmitry Kovalev
af36c1f2e7 Merge "Using pd->dqcoeff instead of pd->qcoeff in the decoder." 2013-11-06 16:59:57 -08:00
Dmitry Kovalev
a1dc97beb1 Using pd->dqcoeff instead of pd->qcoeff in the decoder.
It is more logical to use dqcoeff buffer to put there *dequantized*
transform coefficients (inside inverse_transform_block and
decode_coefs functions). Dequantization happens inside WRITE_COEF_CONTINUE
macro.

qcoeff buffer should be only used in the encoder for *quantized*
transform coefficients.

Change-Id: Ifd54bef272bbf5311ced6669c4f1079f998af5d7
2013-11-06 16:14:45 -08:00
Ivan Maltz
1ed0e1beb5 Move SVC per-frame loop from sample app into libvpx proper
SVC multiple layer per frame encoding is invoked with vpx_svc_init and
vpx_svc_encode. These interfaces are designed to be invoked from ffmpeg.
Additional improvements:
- make dummy frame handling a bit more explicit
- fixed bug with single layer encodes
- track individual frame sizes and psnrs instead of averages
- parameterized quantizer, 16th scalefactors, more logging,
- enabled single layer encodes to generate baseline
- include new mode for 3 layer I frame with 5 total layers

Change-Id: I46cfa600d102e208c6af8acd6132e0cc25cda8d4
2013-11-06 14:49:27 -08:00
Dmitry Kovalev
bfdfeb62a7 Merge "Replacing mi_{width,height}_log2 with num_8x8_blocks_{wide,high}_lookup." 2013-11-06 14:18:33 -08:00
Dmitry Kovalev
7b011c5467 Replacing mi_{width,height}_log2 with num_8x8_blocks_{wide,high}_lookup.
Change-Id: I04c55daef89bca2b85cb7db0850f9b052abc5a7c
2013-11-06 13:34:23 -08:00
Deb Mukherjee
e52d3efe8a Merge "Removes stack allocation of token_cache" 2013-11-06 13:12:47 -08:00
Yaowu Xu
2f4bade348 Merge "Missing _ means no sse3 for vp9_h_predictor_32x32." 2013-11-06 13:04:28 -08:00
Deb Mukherjee
8810db303c Removes stack allocation of token_cache
Removes stack-allocation of token_cache in the tokenize
function in the encoder.

Change-Id: Ifdbab76dc2b23384da0080d2e9390533e489db8c
2013-11-06 11:50:27 -08:00
Yaowu Xu
103c4603d2 Merge "optimize decode_bool operation" 2013-11-06 10:25:52 -08:00
Paul Wilkins
0c39318a8b Missing _ means no sse3 for vp9_h_predictor_32x32.
Error in script means vp9_h_predictor_32x32 sse3 version
is not enabled.

Change-Id: Ia43672740da1ecdfb7fcd420490ef424b04accc4
2013-11-06 13:57:55 +00:00
Dmitry Kovalev
d54ff9dc3d Cleaning up vp9_quantize_b_c() function.
Change-Id: I42c75530a8c9cff68480657f074131e6b60d9fca
2013-11-05 17:41:56 -08:00
Dmitry Kovalev
4a96e64dc2 Using max_tx_size instead of bsize when possible.
Change-Id: I246364bc4270ca13aefb4bc3445bcf102b3170dc
2013-11-05 17:36:43 -08:00
Yaowu Xu
278856319b Simply a macro
Change-Id: I1c0c1b92aab33b1e4321b8e584a934fe58e0b324
2013-11-05 17:13:00 -08:00
hkuang
6b16f63332 Add back vp9_short_idct32x32_1_add_neon which is deleted in
cleanup I63df79a13cf62aa2c9360a7a26933c100f9ebda3.

Change-Id: I034848cf05031618818f7df2e7f9c35102686948
2013-11-05 14:57:32 -08:00
Dmitry Kovalev
6c217d97df Adding read_reference_mode() function.
Change-Id: I517ad7e1a48910f0d2e95feacd23f143d28b42d6
2013-11-05 14:57:05 -08:00
Dmitry Kovalev
d172201403 Cleaning up read_mv_probs() function.
Change-Id: I7a1e88b5977076e22736c0d6af1d4dcc19d39a6a
2013-11-05 14:43:35 -08:00
Dmitry Kovalev
648e30bca6 Merge "Removing old code." 2013-11-05 14:28:43 -08:00
Dmitry Kovalev
815189613b Localizing NEARESTMV special cases in the code.
Removing special case handling from vp9_tree_probs_from_distribution(),
tree_merge_probs(), and vp9_tokens_from_tree_offset() functions. Replacing
inter_mode_offset() function with macro INTER_OFFSET which is used now for
vp9_inter_mode_tree definition.

Change-Id: Iff75a1499d460beb949ece543389c8754deaf178
2013-11-05 11:58:57 -08:00
Dmitry Kovalev
69cb7dc839 Merge "Unified approach for backward probability update." 2013-11-05 10:59:04 -08:00
Deb Mukherjee
551829d8f3 Miscelleneous changes in detokenize for speed
Changes to reduce branching in detokenization  in order
to improve decode speed.

Change-Id: I23a74d072cc14d99f6fc054c1e6a72021e777903
2013-11-05 10:27:36 -08:00
Deb Mukherjee
3a833ea38f token_cache changes in decoder
Removes stack-alocation of token_cache in decode_coefs function

Seems to achieve about 1% decode speed improvement as tested on
25 480p videos.

Change-Id: I8e7eb3361fa09d9654dfad0677a6d606701fdc6e
2013-11-05 09:32:58 -08:00
Deb Mukherjee
be8a4cbbdd Merge "Remove one shot q experiment" 2013-11-05 09:29:31 -08:00
Jingning Han
f3efb9903c Merge "Fix the use case of plane_block_idx in sub8x8 RD" 2013-11-05 09:27:05 -08:00
Jingning Han
4fc8320f4c Merge "Avoid mv cost check for invalid mv values" 2013-11-05 09:01:05 -08:00
Adrian Grange
a8260a38e0 Merge "Remove unused members from VP9_COMP" 2013-11-05 07:45:03 -08:00
Jingning Han
c2217f2238 Avoid mv cost check for invalid mv values
The compound inter prediction could potentially run with initial
motion vectors of invalid value and check the mv_cost, which triggers
overheap read. This commit resolves this issue by forcing a motion
vector value check for compound inter modes of both superblock and
sub8x8 block sizes.

Change-Id: I4f4fc19ce83c8272782bc382f12c82a3f03212fc
2013-11-04 19:01:42 -08:00
Yaowu Xu
9f37d89037 optimize decode_bool operation
Change-Id: I7fe44633d29046ddd38c88c00e8520d27ac748bf
2013-11-04 17:10:18 -08:00
Dmitry Kovalev
ac115a1f9a Removing old code.
Change-Id: Ie05cc5e2d8ce12eacdf482a8b75e5a6ce6f59f57
2013-11-04 16:38:15 -08:00
Dmitry Kovalev
c622e1d18f Unified approach for backward probability update.
Replacing update_mode_probs() and adapt_probs() with tree_merge_probs().

Change-Id: I50b2c968d67c9265f5216c700cbeba25fb014654
2013-11-04 16:12:29 -08:00
Dmitry Kovalev
dde8069e57 Splitting partition_probs array into two arrays.
We only update partition_probs for inter frames but they are constant
for key frames. It is not necessary to have constants inside frame
context and copy them every time. This change reduces FRAME_CONTEXT size
by at least 48 bytes.


Change-Id: If70a53be51043f37fe7d113853217937710932a7
2013-11-04 14:26:16 -08:00
Adrian Grange
44e25155f7 Remove unused members from VP9_COMP
Removed:
goldfreq, avg_encode_time, avg_pick_mode_time,
cpu_freq, interquantizer
member variables from VP9_COMP since they are no longer
used in the code.

Change-Id: I010a82c217d0da03c3f53d1858d3462190c12dcf
2013-11-04 12:32:17 -08:00
Adrian Grange
dd45530ee6 Merge "Remove unused member variables from VP9_COMP" 2013-11-04 11:39:23 -08:00
Dmitry Kovalev
dd209fae3a Merge "Removing 'new' probability calculation from convert_distribution()." 2013-11-04 11:14:58 -08:00
Adrian Grange
a0a6590e0f Remove unused member variables from VP9_COMP
Removed three members from the VP9_COMP data structure:
inter_zz_count, gf_bad_count, gf_update_recommended.

These were part of the VP8 real-time mode implementation
that was removed from the initial VP9 codecbase.

Change-Id: I866b083b88ef02c74837277d50ce532ca88492f3
2013-11-04 11:01:43 -08:00
Jingning Han
c96f94c63a Merge "Add second ref frame check back in rdcost hist" 2013-11-03 15:17:08 -08:00
Jingning Han
4efa6a0176 Fix the use case of plane_block_idx in sub8x8 RD
This commit fixes the use case of plane_block_idx, which determines
the plane (Y/U/V) index based on block index. When block idx >= 4 in
sub8x8 block loop, it should be of chroma components.

Change-Id: I072705aa7b35445524ac607089ca8ce54b7ba478
2013-11-03 11:19:33 -08:00
Jingning Han
2de7cbe980 Add second ref frame check back in rdcost hist
Update best_inter_rd and best_inter_ref_frame only in single ref
frame case.

Change-Id: Id56825b231a62d6852bd83811410c05a7569f715
2013-11-03 09:15:41 -08:00
James Zern
152181b25c Merge "vp9 ssse3 d207_predictor_32x32: add missing GLOBAL()" 2013-11-02 12:25:47 -07:00
James Zern
2d980b803a vp9 ssse3 d207_predictor_32x32: add missing GLOBAL()
removes a textrel for sh_b23456789abcdefff

Change-Id: I80cb9dfd8e49a0fe884c8ff76472275b3a00cb57
2013-11-01 20:33:22 -07:00
Dmitry Kovalev
df19c6b64c Removing 'new' probability calculation from convert_distribution().
We don't have to calculate 'new' probability in convert_distribution()
because it is enough to calculate only 'new' counters which could be used
to calculate probability if necessary. That's why removing a lot of unused
temporary probability arrays and reducing number of get_binary_prob()
calls.

Change-Id: I4e14eb7203d1ace61bbddefd6b9b6326be83ba63
2013-11-01 15:09:43 -07:00
Yaowu Xu
333345cd26 Merge "Convert filter kernel choice to lookup" 2013-11-01 13:43:09 -07:00
Yaowu Xu
0f76ba5523 Convert filter kernel choice to lookup
Also removed unused declaration related 6 tap filter

Change-Id: Ic17f516141d885157918505f4204081e4c951fad
2013-11-01 13:03:18 -07:00
Dmitry Kovalev
340b2b076e Merge "Cleanup. Adding const to function pointer arguments." 2013-11-01 10:57:03 -07:00
Dmitry Kovalev
5113d9c3c9 Merge "Cleaning up read_skip_coeff() function." 2013-11-01 10:56:55 -07:00
Yaowu Xu
a272530bf0 Two optimizations:
1. Reduced the size memset based on eob for 32x32 transform. The reset
of non-zero coefficient should probably go into where they are read in
inverse transform functions. (TODO)
2. Removed a redundant level of indirection.
vp9_iht4x4_add() checks transform type and call vp9_iht4x4_16_add()
for tranforms other than DCT_DCT. In this case, the DCT_DCT case
has been already handled here.

Change-Id: Iacbc77da761f0b308df5acea0f20c9add9f33d20
2013-11-01 07:24:07 -07:00
Yaowu Xu
f0446164fb Merge "simplify read_coef_prob()" 2013-11-01 06:59:17 -07:00