summaryrefslogtreecommitdiff
path: root/vp8/encoder/rdopt.c
AgeCommit message (Collapse)Author
2011-02-11Merge remote branch 'internal/upstream' into HEADJohn Koleszar
2011-02-10Merge "Improve motion search in real-time mode"Yunqing Wang
2011-02-10Merge remote branch 'internal/upstream' into HEADJohn Koleszar
Conflicts: vp8/decoder/onyxd_int.h Change-Id: Id9aa577f03e37b4f406ba3b593c3c4330812a49e
2011-02-10Improve motion search in real-time modeYunqing Wang
Applied better MV prediction in real-time mode, which improves the encoding quality. Used quarter-pixel search instead of iterative sub-pixel search for speed >=5 to improve encoding performance. Tests on the test set showed: 1. For speed=-5, quality improvement: 1.7% on AvgPSNR and 2.1% on SSIM, performance improvement: 3.6% (This counts in the performance lose caused by MV prediction calculation in "Improve MV prediction in vp8_pick_inter_mode() for speed>3"). 2. For speed=-8, quality improvement: 2.1% on AvgPSNR and 2.5% on SSIM. but, 6.9% performance decrease because of MV prediction calculation. This should be improved later. Change-Id: I349a96c452bd691081d8c8e3e54419e7f477bebd
2011-02-08Added early breakout for vp8_rd_pick_intra4x4mby_modesScott LaVarnway
Improved performance of good quality, speed 0 (3% average) with no average quality loss. Change-Id: Ica34473f99bd74260eaebde6b132185e09e3c09d
2011-02-07Merge remote branch 'internal/upstream' into HEADJohn Koleszar
2011-02-07Fix link error in real-time modeYunqing Wang
make vp8_mv_pred() and vp8_cal_sad() available in real-time mode. Change-Id: I71dbae241b486ba943458dcbae552ec4a51689d3
2011-02-05Merge remote branch 'origin/master' into experimentalJohn Koleszar
Change-Id: Ib487cbd7b214a6e3f13180bc0e5dcb792d8a406e
2011-02-04Merge "Improve MV prediction in vp8_pick_inter_mode() for speed>3"Yunqing Wang
2011-02-04Merge remote branch 'origin/master' into experimentalJohn Koleszar
Change-Id: I242ca4854cb21f3d63efb979bd6ecc9f06f67f33
2011-02-02Merge remote branch 'origin/master' into experimentalJohn Koleszar
Change-Id: I585615400697b77c50dd05480616f868f2637aa7
2011-02-01Zero out block mv when an intra mode is selectedScott LaVarnway
instead of each time mode is tested. Change-Id: Ief0f5586dafde54cc14d348dcecdacb182e7c1d5
2011-02-01Removed unnecessary B_MODE_INFO memset.Scott LaVarnway
Change-Id: I2bcef6a8e47f88542861fd1356631ca934e2a0e7
2011-02-01Merge remote branch 'origin/master' into experimentalJohn Koleszar
Change-Id: Id1d4bbe257cd126bb5f44347b896ddb659724f0b
2011-01-31Merge "change the threshold of DC check for encode breakout"Yaowu Xu
2011-01-31Merge remote branch 'origin/master' into experimentalJohn Koleszar
Conflicts: configure Change-Id: I18c2292256d2387ff09da209aa9cf6891e1864a0
2011-01-28change the threshold of DC check for encode breakoutYaowu Xu
Previously, the DC check is to make sure there is no code-able DC shift for quantizer Q0, which has been verified rather conservative. This commit changes the criteria to have two components, DC and AC, to address the conservativeness. First, it checks if all AC energy is enough to contribute a single non-zero quantized AC coefficient. Second, for DC, the decision to skip further considers two possible scenarios: 1. There is no code-able 2nd order DC coefficient at all; 2 The residue is relatively flat, but the uniform DC change is very small, i.e. less than 1/2 gray level per pixel. Comparing to previous criteria, the new criteria is about 10% to 15% faster in encoding time with a very small quality loss. (threshold ~1000 and quality range 33db-45db) It should be noted that this commit enables "automatic" static threshold for encodebreakout if a non-zero small value is passed in to encoder. Change-Id: I0f77719a1ac2c2dfddbd950d84920df374515ce3
2011-01-28Improve MV prediction in vp8_pick_inter_mode() for speed>3Yunqing Wang
Applied same method used in vp8_rd_pick_inter_mode() to improve the accuracy of MV prediction. Change-Id: Ia50ae26208b18482695601f32febd99fe89fbc17
2011-01-28Merge remote branch 'origin/master' into experimentalJohn Koleszar
Conflicts: vp8/encoder/rdopt.c Change-Id: Ic17907df70fff45c9e766b5d0cbab0c5f1a1095f
2011-01-28Inconsistent distortion metric in vp8_rd_pick_intra_mbuv_modePaul Wilkins
This function was using a variance metric compared to and SSE metric in other places (eg. vp8_rd_inter_uv) Change-Id: I9109fcc5a13bca9db1d7ead500fe14999ab233eb
2011-01-27warning: pointer targets differ in signednessJohann
vp8/encoder/rdopt.c:728: warning: pointer targets in passing argument 3 of 'macro_block_yrd' differ in signedness vp8/encoder/rdopt.c:541: note: expected 'int *' but argument is of type 'unsigned int *' distortion is signed when calling macro_block_yrd is both other cases, as well as for RDCOST Change-Id: I5e22358b7da76a116f498793253aac8099cb3461
2011-01-27Merge "Remove copies of same functions"Yunqing Wang
2011-01-27Merge "Refine motion vector prediction for NEWMV mode"Yunqing Wang
2011-01-26Remove copies of same functionsYunqing Wang
Reduce the code size. Change-Id: I2e1998557a3c8776e262c442fd758c25e17aff7a
2011-01-26Rationalize vp8_rd_pick_intra16x16mby_mode()Paul Wilkins
Use the function macro_block_yrd() to calculate error and distortion in keeping with what is done for inter frames. The old code was using a variance metric for once case and an SSE function for measuring distortion in the other case. The function vp8_encode_intra16x16mbyrd() is no longer used. Change-Id: Ic228cb00a78ff637f4365b43f58fbe5a9273d36f
2011-01-25cap the best quantizer for 2nd order DCYaowu Xu
This commit also removes artificial RDMULT cap for low quantizers. The intention is to address some abnormal behavior of mode selections at the low quantizer end, where many macroblocks were coded with SPLITMV with all partitions using same motion vector including (0,0). This change improves the compression quality substantially for high quality encodings in both PSNR and SSIM terms. Overall effect on mid/low rate range is also positive for all metrics, but smaller in magnitude. Change-Id: I864b29c4bd9ff610d2545fa94a19cc7e80c02667
2011-01-25Refine motion vector prediction for NEWMV modeYunqing Wang
Adjust checking points in motion vector prediction to better cover possible movements, and get a better prediction. Tests on test clips showed a 0.1% improvement in SSIM, and no change in PSNR and performance. Change-Id: Ifdab05d35e10faea1445c61bb73debf888c9d2f8
2011-01-25Merge remote branch 'origin/master' into experimentalJohn Koleszar
Change-Id: I3dd6219db4126c1ad526c7877ad1ce49c496155f
2011-01-24Added vp8_update_zbin_extraScott LaVarnway
vp8cx_mb_init_quantizer was being called for every mode checked in vp8_rd_pick_inter_mode. zbin_extra is the only value that really needs to be recalculated. This calculation is disabled when using the fast quantizer for mode selection. This gave a small performance boost (~.5% to 1%). Note: This needs to be verified with segmentation_enabled. Change-Id: I62716a870b3c82b4a998bdf95130ff0b02106f1e
2011-01-19experiment extending the quantizer rangeYaowu Xu
Prior to this change, VP8 min quantizer is 4, which caps the highest quality around 51DB. This experimental change extends the min quantizer to 1, removes the cap and allows the highest quality to be around ~73DB, consistent with the fdct/idct round trip error. To test this change, at configure time use options: --enable-experimental --enable-extend_qrange The following is a brief log of changes in each of the patch sets patch set 1: In this commit, the quantization/dequantization constants are kept unchanged, instead scaling factor 4 is rolled into fdct/idct. Fixed Q0 encoding tests on mobile: Before: 9560.567kbps Overall PSNR:50.255DB VPXSSIM:98.288 Now: 18035.774kbps Overall PSNR:73.022DB VPXSSIM:99.991 patch set 2: regenerated dc/ac quantizer lookup tables based on the scaling factor rolled in the fdct/idct. Also slightly extended the range towards the high quantizer end. patch set 3: slightly tweaked the quantizer tables and generated bits_per_mb table based on Paul's suggestions. patch set 4: fix a typo in idct, re-calculated tables relating active max Q to active min Q patch set 5: added rdmult lookup table based on Q patch set 6: fix rdmult scale: dct coefficient has scaled up by 4 patch set 7: make transform coefficients to be within 16bits patch set 8: normalize 2nd order quantizers patch set 9: fix mis-spellings patch set 10: change the configure script and macros to allow experimental code to be enabled at configure time with --enable-extend_qrange patch set 11: rebase for merge Change-Id: Ib50641ddd44aba2a52ed890222c309faa31cc59c
2011-01-14Testing of modes with Alt Ref framePaul Wilkins
Previously when a frame was being overlaid on a previously coded alt ref frame we only checked the alt ref 0,0 mode. Where there is a possibility that the alt ref buffer is a filtered frame we should allow the other prediction modes as normal or at the least allow use of the last frame buffer. Change-Id: I4d6227223d125c96b4f3066ec6ec9484fee7768c
2011-01-14Experimental change to help with ARNR problem.Paul Wilkins
Allow use of other reference frames for the ARF overlay frame when ARNR filtering is enabled Change-Id: Icd6a9fb38977a88fbe7cc9b9c18198eb454c0273
2011-01-11Moved ref frame calculationsScott LaVarnway
Moved ref frame calculations to outside of the mode_index loop. Change-Id: I06103fc7e8af88b54b84443acf6691d29b1272ac
2011-01-11Add no_skip_block4x4_search flag in SPLITMV modeYunqing Wang
Add a flag to always enable block4x4 search for speed=0 (good quality) to guarantee no quality loss for speed0. Change-Id: Ie04bbc25f7e6a33a7bfa30e05775d33148731c81
2011-01-10Fix bug in motion searchYunqing Wang
The maximum possible MV in 1/8 pel units is (1<<11), which could cause mvcost out of its range that is 1023. Change maximum possible MV in 1/8 pel units to (1<<11)-8 will fix this problem. Change-Id: I5788ed1de773f66658c14f225fb4ab5b1679b74b
2011-01-07Removed cpi->target_bits_per_mbScott LaVarnway
cpi->target_bits_per_mb is currently not being used, so delete it. Also removed other unused code in rdopt.c. Change-Id: I98449f9030bcd2f15451d9b7a3b9b93dd1409923
2010-12-28Adjust MV borders for SPLITMV modeYunqing Wang
Add limits to avoid MV going out of range. Change-Id: I8a5deb40bf393488d29f694b5a56804d578e68b5
2010-12-28Merge "Modify motion estimation for SPLITMV mode"Yunqing Wang
2010-12-28Modify motion estimation for SPLITMV modeYunqing Wang
1. Search for block8x16/block16x8 uses block8x8's search results. 2. Check block4x4 only if block8x8 is chosen. (This hurts quality, which will be improved in another check-in.) 3. In block4x4 search, the previous block's result is used as MV predictor for next block. This change improves performance. Change-Id: I9dc089007ca08129fb6c11fe7692777ebb8647b0
2010-12-23adjusted sad_per_bit to correlate with quantizerYaowu Xu
Re-calibrated sad_per_bit16 and sad_per_bit4 tables to linearly correlated to quantizer values, these two variables are used in motion search for costing motion vectors. This change has an small positive effect on compression. Change-Id: Ic9b5ea6fb8d5078ef663ba4899db019cc51f4166
2010-12-16Changed segmentation check orderScott LaVarnway
In SPLITMV, the 8x8 segment will be checked first. If the 8x8 rd is better than the best, we check the other segments. Otherwise bail. Adjustments to the thresh_mult were necessary to make up for the initial quality loss. The performance improved by 20% (average) for good quality, speed 0 and speed 1, while the overall quality remained the same. Change-Id: I717aef401323c8a254fba3e9777d2a316c774cc3
2010-12-16Adjusted breakout RD for SPLITMVScott LaVarnway
vp8_rd_pick_best_mbsegmentation looks at y only. The new breakout does not include the frame cost, the prob_skip_false cost, or the uv rate. Performance improved by a few percent and the quality remained the same. Change-Id: I94ff013998ac51e8ecce7130870f7b6600758e15
2010-12-14Fix a bug in motion search code(2)Yunqing Wang
This fix added MV range checks for NEWMV mode as suggested by Jim. To reduce unnecessary MV range checks, I tried Yaowu's suggestion. Update UMV borders in NEWMV mode to also cover MV range check. Also, in this way, every MV that is valid gets checked in diamond search function. Change-Id: I95a89ce0daf6f178c454448f13d4249f19b30f3a
2010-12-14Fix a bug in motion search codeYunqing Wang
The MV's range is 256. Since the new motion search uses a different starting MV than the center ref MV, a MV range checking needs to be done to avoid corruption. Change-Id: I8ae0721d1bd203639e13891e2e54a2e87276f306
2010-12-09fix uninitialized read in encode breakoutJohn Koleszar
Change I3430820 performed an uninitialized read when encode_breakout == 0, since the sum and sse wouldn't be set: if(x->encode_breakout) VARIANCE_INVOKE(..., get16x16var)(..., &sum, &sse); if (cpi->active_map_enabled && x->active_ptr[0] == 0) { ... } else if (sse < x->encode_breakout) Change-Id: I915eb76d1227b4b6d1137a0dedf2c143860098a2
2010-12-08Merge "vp8e - static threshold play"Yaowu Xu
2010-12-08Merge "vp8e - remove unnecessary variance calc"Yaowu Xu
2010-12-07vp8e - static threshold playJim Bankoski
Realized no need for new assembly code sum is already calculated. Change-Id: Ie2d94feb4b7c1f77c5359bca29b66228e41638c9
2010-12-06vp8_rd_pick_best_mbsegmentation code restructureScott LaVarnway
Moved the code from the segmentation loop into a function which is now called for each segment. This will allow us to change the segment order checking more easily. Change-Id: I9510d26f0acae5a73043fcca8f1984b121d3e052
2010-12-06Merge "Improve MV prediction accuracy to achieve performance gain"Scott LaVarnway