1. 07 Dec, 2011 1 commit
    • Paul Wilkins's avatar
      Minor fixes: · 79774d10
      Paul Wilkins authored
      fixed issues caused by conflicts between two experiments.
      
      Change-Id: I56a9bd69493e4850c121ea057a6233c55777c2a5
      79774d10
  2. 06 Dec, 2011 2 commits
    • Ronald S. Bultje's avatar
      Dual 16x16 inter prediction. · 60cb39da
      Ronald S. Bultje authored
      This patch introduces the concept of dual inter16x16 prediction. A
      16x16 inter-predicted macroblock can use 2 references instead of 1,
      where both references use the same mvmode (new, near/est, zero). In the
      case of newmv, this means that two MVs are coded instead of one. The
      frame can be encoded in 3 ways: all MBs single-prediction, all MBs dual
      prediction, or per-MB single/dual prediction selection ("hybrid"), in
      which case a single bit is coded per-MB to indicate whether the MB uses
      single or dual inter prediction.
      
      In the future, we can (maybe?) get further gains by mixing this with
      Adrian's 32x32 work, per-segment dual prediction settings, or adding
      support for dual splitmv/8x8mv inter prediction.
      
      Gain (on derf-set, CQ mode) is ~2.8% (SSIM) or ~3.6% (glb PSNR). Most
      gain is at medium/high bitrates, but there's minor gains at low bitrates
      also. Output was confirmed to match between encoder and decoder.
      
      Note for optimization people: this patch introduces a 2nd version of
      16x16/8x8 sixtap/bilin functions, which does an avg instead of a
      store. They may want to look and make sure this is implemented to
      their satisfaction so we can optimize it best in the future.
      
      Change-ID: I59dc84b07cbb3ccf073ac0f756d03d294cb19281
      60cb39da
    • Paul Wilkins's avatar
      Some further QIndex issues with extended Q · b4ad9b5d
      Paul Wilkins authored
      Resolved or factored out some further issues with Q index.
      Put in a 3rd order polynomial instead of less accurate power function
      as the best fit on gf and kf boost adjustment.
      Added avg_q value to use instead of ni_av_qi.
      Compute segment delta Q values based on avg_q.
      Fixed bug in adjust_maxq_qrange().
      
      The extended range Q on the derf set, using standard data rates
      (which do not extend high enough to get big benefits) still show
      a shortfall of between 0.5 and 1% though so there would appear to
      be further issues that need to be tracked down.
      
      Change-Id: Icfd49b9f401906ba487ef1bef7d397048295d959
      b4ad9b5d
  3. 02 Dec, 2011 2 commits
    • Yaowu Xu's avatar
      enabled 8x8 intra prediction modes on inter frames · a8fbab86
      Yaowu Xu authored
      This commit enabled the usage of 8x8 intra prediction modes on inter
      frames. There are a few TODO items related to this: 1)baseline entropy
      need be calibrated; 2)cost of UV need to be done more properly rather
      than using decision only relying on Y; 3)Threshold for allowing picking
      8x8 intra prediction should be lowered to lower than the B_PRED.
      
      Even with all the TODOs, tests showed consistent gain on derf set ~0.1%
      (PSNR:0.08% and SSIM:0.14%). It is assumed that 8x8 intra prediction
      will help more on large resolution clips, especially with above TODOs
      addressed.
      
      Change-Id: I398ada49dfc32575cfab962a569c2885111ae3ba
      a8fbab86
    • Paul Wilkins's avatar
      Further work on extended Q range. · 8487a68b
      Paul Wilkins authored
      Fixed some further QIndex related issues and replaced some tables
      (eg zbin and rounding)
      
      Also Added function (currently disabled by default) to populate the
      main AC and DC quantizer tables. Using the original AC range the
      resulting computed DC values give behavior broadly comparable
      on the DERF set. That is not to say that the equations will hold good
      over a more extended range. The purpose of this code is to make it
      easier to experiment with further alterations to the Q range and distribution
      of Q values plus the relative weights given to AC and DC.
      
      The function find_fp_qindex() ensures that changes to the Q tables
      are reflected in the value passed in to the first pass code.
      
      Slight experimental adjustment to static segment Q offset.
      
      Change-Id: I36186267d55dfc2a3d565d0cff7218ef300d1cd5
      8487a68b
  4. 29 Nov, 2011 1 commit
    • Paul Wilkins's avatar
      Further work on extended Q range. · 99df6bb6
      Paul Wilkins authored
      Fixed bug in firspass.c call to vp8_initialize_rd_consts()
      
      This was passing in vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q)
       instead of (cm->base_qindex + cm->y1dc_delta_q).
      
      It just so happens that for the value 26 used for cm->base_qindex in the
      unextended Q case,  the two give similar results. However, when using
      the extended Q range the two are very different.
      
      Also added more stats output and partly disabled another broken feature.
      
      Change-Id: Iddf6cf5ea8467c44b7c133f38e629f6ba6f2581e
      99df6bb6
  5. 28 Nov, 2011 1 commit
    • Yaowu Xu's avatar
      changed find_near_mvs search to include a mb from last frame · 643238a3
      Yaowu Xu authored
      This is an experiment to include a mv contribution from last frame to
      nearest and near mv definition. Initial test showed some small though
      consistent gain.
      
      latest patch slightly better result ~.13%-~.18%.
      
      TODO: the entropy used to encode the mode choice, i.e. the mv counts
      based conditional distribution of modes should be re-collected to
      reflect this change, it is expected that there is some further gain
      from that.
      
      Change-Id: Ief1e284a36d8aa56b49ae5b360c91419ec494fa4
      643238a3
  6. 23 Nov, 2011 1 commit
    • Paul Wilkins's avatar
      Further resolution of QIndex LUTS; · a0b7db22
      Paul Wilkins authored
      This commit resolves further QIndex look up tables to facilitate
      experimentation with the quantizer range.
      
      In some cases  rather than remove the look up tables completely
      I have created functions that are called once  to populate them
      using a formulaic approach base on the actual quantizer.
      
      The use of these functions based on best fit of data from the original
      tables does affect the results on some clips but across the derf test
      set the effect was broadly neutral.
      
      Change-Id: I8baa61c97ce87dc09a6340d56fdeb681b9345793
      a0b7db22
  7. 22 Nov, 2011 2 commits
    • Adrian Grange's avatar
      Remove redundant code (lf_or_gf and frame_lf_or_gf) · 08491b86
      Adrian Grange authored
      Removed unused variables lf_or_gf and frame_lf_or_gf.
      
      Change-Id: I88692cd7d53e532d303c4525ee4667c1ecea3026
      08491b86
    • Paul Wilkins's avatar
      Removal of Qindex LUTS. · d39b5d05
      Paul Wilkins authored
      One of the problems arising when tweaking or adjusting the quantizer
      tables is that there are a lot of look up tables that depend on the QINDEX.
      Any adjustment to the link between QINDEX and real quantizer therefore tends
      to break aspects of for example the rate control.
      
      In this check in I have replaced several of the look up tables with functions that
      approximate the same results as the old Q luts but use a formulaic approach
      based on real Q values rather than QIndex. This should hopefully make it easier
      to experiment with changes to the Q tables without always having to go through
      and hand optimize a set of look up tables. Once things stabilize we may choose
      to re-instate luts for the sake of performance.
      
      Patch 2:
          Addressed Ronald's comments.
          vp8_init_me_luts() Added so luts only initialized once.
      
      Change-Id: Ic80db2212d2fd01e08e8cb5c7dca1fda1102be57
      d39b5d05
  8. 21 Nov, 2011 1 commit
    • Paul Wilkins's avatar
      CONFIG_T8X8 experiment.: · 4f792921
      Paul Wilkins authored
      Block the selection of 4x4 modes in key frames if 8x8 is selected.
      
      Change-Id: Ie5729ec22a999d9a1996f020bd4b941e29514992
      4f792921
  9. 09 Nov, 2011 2 commits
    • Paul Wilkins's avatar
      T8x8 experiment merge. · 07892531
      Paul Wilkins authored
      For ease of testing and merging experiments I have
      removed in line code in encode_frame() that assigns
      MBs to be t8x8 or t4x4 coded segments and have
      moved the decision point and segment setup to
      the init_seg_features0 test function.
      
      Keeping everything in one place helps make sure
      for now that experiments using segmentation are
      not fighting each other.
      
      Also made sure mode selection code can't choose 4x4
      modes if t8x8 is selected.
      
      Patch2: In init_seg_features() add checks
      for SEG_LVL_TRANSFORM active.
      
      Change-Id: Ia1767edd99b78510011d4251539f9bc325842e3a
      07892531
    • Paul Wilkins's avatar
      Segmentation feature logic fix. · ac2ab02d
      Paul Wilkins authored
      Bug fix to logic in vp8_pick_inter_mode() and
      vp8_rd_pick_inter_mode().
      
      The block on the use of segment features
      for the cm->refresh_alt_ref_frame case
      was just for testing and is not correct.
      
      The special case code for alt ref can
      be re-enabled as an else clause.
      
      Change-Id: Ic9b57cdb5f04ea7737032b8fb953d84d7717b3ce
      ac2ab02d
  10. 08 Nov, 2011 1 commit
    • Paul Wilkins's avatar
      Segment signaling of TX size · a9df4183
      Paul Wilkins authored
      Initial attempt at using new segment feature signaling
      to indicate 4x4 or 8x8 transform.
      
      needs --enable-experimental --enable-t8x8
      
      Note this is work in progress.
      
      Change-Id: Ib160d46a5d810307bfcbc79853ce1a65b5b870b7
      a9df4183
  11. 04 Nov, 2011 1 commit
    • Paul Wilkins's avatar
      Segment Feature Data Access · a258bba1
      Paul Wilkins authored
      No change to functionality or output.
      
      Updates to the segment feature data structure now all done
      through functions such as set_segdata() and get_segdata()
      in seg_common.c.
      
      The reason for this is to make changing the structures (if needed)
      and debug easier.
      
      In addition it provides a single location for subsequent addition
      of range and validity checks. For  example valid combination of
      mode and reference frame.
      
      Change-Id: I2e866505562db4e4cb6f17a472b25b4465f01add
      a258bba1
  12. 03 Nov, 2011 1 commit
    • Paul Wilkins's avatar
      Segment Features. Removal of #ifdefs · a10a268e
      Paul Wilkins authored
      Removal of configure #ifdefs so that segment features
      always available. Removal of code supporting old
      segment feature method.
      
      Still a good deal of tidying up to do.
      
      Change-Id: I397855f086f8c09ab1fae0a5f65d9e06d2e3e39f
      a10a268e
  13. 02 Nov, 2011 1 commit
    • Paul Wilkins's avatar
      Segmentation: Reference frames · 87ff8620
      Paul Wilkins authored
      Modify reference frame segmentation so that ONE or MORE
      reference frames may be marked as a available for a given
      segment.
      
      Fixed bugs relating to segment coding of INTRA and some
      INTER modes at the segment level.
      
      Modified Q boost for static areas based on ambient average Q.
      
      Strong results now on clips with significant static areas.
      (some data points in derf set as high as 9% and some static &
      slide show type content in YT set > 20%)
      
      Change-Id: Ia79f912efa84b977f35a23683ae3643251e24f0c
      87ff8620
  14. 24 Oct, 2011 1 commit
    • Paul Wilkins's avatar
      Further segment feature extensions. · 01ce04bc
      Paul Wilkins authored
      This quite large check in includes the following:
      
      Merge in some code from Ronald (mbgraph.c) that scans a Gf/arf group.
      This is used as a basis for a simple segmentation for the normal frames
      in a gf/arf group. This code also uses satd functions from Yaowu.
      
      Adds functionality for coding the latest possible position of an EOB for
      blocks in the segment. (Currently 0-15 only, hence just for 4x4 dct).
      Where the EOB position is 0 this acts like "skip" and the normal coding
      of skip at the per mb level is disabled.
      
      Added functions (seg_common.c) for setting and reading segment feature
      elements. These may want to be optimized away at some point but while the
      mecahnism is in a state of flux they provide a single location for making
      changes and keep things a bit cleaner.
      
      This is still proof of concept code. Currently the tested feature set:-
      
      Quantizer,
      Loop Filter level,
      Reference frame,
      Prediction Mode,
      EOB end stop.
      
      TBD:-
      
      Add functions for setting and reading the feature data with range
      and validity checking.
      
      Handling of signed and unsigned feature data. At the moment all is assumed
      to be signed and a sign bit is coded but many cannot be negative.
      
      Correct handling of EOB feature with intra coded blocks.
      
      Testing/trapping of legal/illegal ref frame and mode combinations.
      
      Transform size switch plus merge and test with 8c8 DCT work
      
      Merge and test with Sumans Segmenation coding optimizations
      
      Change-Id: Iee12e83661c7abbd1e0ce6810915eb4ec35e2d8e
      01ce04bc
  15. 30 Sep, 2011 1 commit
    • Paul Wilkins's avatar
      Segment coding of mode and reference frame. · 156b221a
      Paul Wilkins authored
      Proof of concept test code that encodes mode and reference
      frame data at the segment level.
      
      Decode-able bit stream but some issues not yet resolved.
      As it this helps a little on a couple of clips but hurts on most as
      the basis for segmentation is unsound.
      
      To build and test, configure with
      --enable-experimental --enable-segfeatures
      
      Change-Id: I22a60774f69273523fb152db8c31f4b10b07c7f4
      156b221a
  16. 16 Sep, 2011 2 commits
    • Yaowu Xu's avatar
      enable selecting&transmitting to for intra mode entropy · 1d44e7ce
      Yaowu Xu authored
      This commit added a 3 bit index to the bitstream, the index is used to
      look into the intra mode coding entropy context table. The commit uses
      the mode stats to calculate the cost of transmitting modes using 8
      possible entropy distributions, and selects the distribution that
      provides the lowest cost to do the actual mode coding.
      
      Initial test show this provides additional .2%~.3% gain over quantizer
      adaptive intra mode coding. So the adaptive intra mode coding provides
      a total of .5%(psnr) to .6% gain(ssim) combined for all-key-encoding
      
      To build and test, configure with
      --enable-experimental --enable-qimode
      
      Change-Id: I7c41cd8bfb352bc1fe7c5da1848a58faea5ed74a
      1d44e7ce
    • Yaowu Xu's avatar
      add 8x8 intra prediction modes · ca6b85aa
      Yaowu Xu authored
      Patch 1 to Patch 3 is an initial implementation of 8x8 intra prediction
      modes, here are with the following assumptions:
      a. 8x8 has 4 prediction modes DC, H, V and TM
      b. UV 4x4 block use the same mode as corresponding 8x8 area
      c. i8x8 modes are enabled for key frame only for now
      Patch 4:
      d. removed debug code from previous patches
      Patch 5:
      e. added stats code to collect entropy stats and further cleaned up
      Patch 6:
      f. changed mode stats code to collect finer stats of modes
      Patch 7:
      g. normalized i8x8 modes distribution to total at 256 (8bits).
      Patch 8:
      h. fixed a bug in decoder and removed debug printf output.
      Patch 9:
      i. more cleanups to address paul's comment
      Patch 10:
      j. messy rebase/merges to bring the commit up to date.
      
      Tests on HD clips encoded with all key frame showing consistent gain
      on all clips and all metrics:~0.5%(psnr) and 0.6%(ssim):
      http://www.corp.google.com/~yaowu/no_crawl/i8x8hd_allkey_fixedq.html
      
      To build and test, configure with:
      --enable-experimental --enable-i8x8
      
      Change-Id: I9813fe07ae48cab5fdb5d904bca022514ad01e7f
      ca6b85aa
  17. 24 Aug, 2011 1 commit
    • Scott LaVarnway's avatar
      Removed bmi copy to/from BLOCKD · b870947d
      Scott LaVarnway authored
      for SPLITMV and B_PRED modes.  Modified code to use the bmi
      found in mode_info_context instead of BLOCKD.  On the decode
      side, the uvmvs are calculated only when required, instead of
      every macroblock.  This is WIP. (bmi should eventually be
      removed from BLOCKD)
      Small performance gains noticed for RT encodes and decodes.(VGA)
      
      Change-Id: I2ed7f0fd5ca733655df684aa82da575c77a973e7
      b870947d
  18. 27 Jul, 2011 2 commits
    • Yunqing Wang's avatar
      Preload reference area in sub-pixel motion search (real-time mode) · 2f2302f8
      Yunqing Wang authored
      This change implemented same idea in change "Preload reference area
      to an intermediate buffer in sub-pixel motion search." The changes
      were made to vp8_find_best_sub_pixel_step() and vp8_find_best_half
      _pixel_step() functions which are called when speed >= 5. Test
      result (using tulip clip):
      
      1. On Core2 Quad machine(Linux)
      rt mode, speed (-5 ~ -8), encoding speed gain: 2% ~ 3%
      rt mode, speed (-9 ~ -11), encoding speed gain: 1% ~ 2%
      rt mode, speed (-12 ~ -14), no noticeable encoding speed gain
      
      2. On Xeon machine(Linux)
      Test on speed (-5 ~ -14) didn't show noticeable speed change.
      
      Change-Id: I21bec2d6e7fbe541fcc0f4c0366bbdf3e2076aa2
      2f2302f8
    • Yunqing Wang's avatar
      Fix range checks in motion search · bde2afbe
      Yunqing Wang authored
      There were some situations that the start motion vectors were
      out of range. This fix adjusted range checks to make sure they
      are checked and clamped.
      
      Change-Id: Ife83b7fed0882bba6d1fa559b6e63c054fd5065d
      bde2afbe
  19. 26 Jul, 2011 1 commit
  20. 21 Jul, 2011 1 commit
    • Yaowu Xu's avatar
      fix more merge issues · 8c31484e
      Yaowu Xu authored
      With this fix, the experimental branch now builds and encodes correctly
      with the following two configure options respectively:
      --enable-experimental --enable-t8x8
      --enable-experimental
      
      Change-Id: I3147c33c503fe713a85fd371e4f1a974805778bf
      8c31484e
  21. 20 Jul, 2011 1 commit
  22. 08 Jul, 2011 2 commits
  23. 30 Jun, 2011 1 commit
    • Yunqing Wang's avatar
      Bug fix in motion vector limit calculation · b7480454
      Yunqing Wang authored
      Motion vector limits are calculated using right shifts, which
      could give wrong results for negative numbers. James Berry's
      test on one clip showed encoder produced some artifacts. This
      change fixed that.
      
      Change-Id: I035fc02280b10455b7f6eb388f7c2e33b796b018
      b7480454
  24. 28 Jun, 2011 1 commit
    • John Koleszar's avatar
      Use MAX_ENTROPY_TOKENS and ENTROPY_NODES more consistently · b32da7c3
      John Koleszar authored
      There were many instances in the code of vp8_coef_tokens and
      vp8_coef_tokens-1, which was a preprocessor macro despite the naming
      convention. Replace these with MAX_ENTROPY_TOKENS and ENTROPY_NODES,
      respectively.
      
      Change-Id: I72c4f6c7634c94e1fa066cd511471e5592c748da
      b32da7c3
  25. 23 Jun, 2011 2 commits
    • Yunqing Wang's avatar
      Copy macroblock data to a buffer before encoding it · 0d87098e
      Yunqing Wang authored
      I got this idea from Pascal (Thanks). Before encoding a macroblock,
      copy it to a 16x16 buffer, and then read source data from there
      instead. This will help keep the source data in cache, and help
      with the performance.
      
      Change-Id: Id05f4cb601299150511d59dcba0ae62c49b5b757
      0d87098e
    • Yaowu Xu's avatar
      fix build issues for experimental branch · 7793b386
      Yaowu Xu authored
      experimental branch build was broken from some merge artifacts, this
      commit fixes those issues to enable the experimental branch to build.
      
      Change-Id: Ic52b2d2f1d1b80abb7ecaa4c0927bcf887ac0c2a
      7793b386
  26. 20 Jun, 2011 1 commit
    • Yaowu Xu's avatar
      adjusting the calculation of errorperbit · 10ed60dc
      Yaowu Xu authored
      RDMULT/RDDIV defines a bit worth of distortion in term of sum squared
      difference. This has also been used as errorperbit in subpixel motion
      search, where the distortions computed as variance of the difference.
      The variance of differences is different from sum squared differences
      by amount of DC squared. Typically, for inter predicted MBs, this
      difference averages around 10% between the two distortion, so this patch
      introduces a 110% constant in deriving errorperbit from RDMULT/RDDIV.
      
      Test on CIF set shows small but positive gain on overall PSNR (.03%)
      and SSIM (.07%), overall impact on average PSNR is 0.
      
      Change-Id: I95425f922d037b4d96083064a10c7cdd4948ee62
      10ed60dc
  27. 13 Jun, 2011 1 commit
  28. 08 Jun, 2011 1 commit
  29. 07 Jun, 2011 1 commit
    • Yaowu Xu's avatar
      adjust sad per bit constants · 221e00ea
      Yaowu Xu authored
      While investigating the effect of DC values on SAD and SSE in motion
      estimation, a side finding indicates the two table of constants need
      be adjusted. The adjustment was done by multiplying old constants by
      90% with rounding. Also absorb the 1/2 scaling constant into the two
      tables. Refer to change Ifa285c3e for background of the 1/2 factor.
      
      Cif set test showed a very small gain on all metric.
      
      Change-Id: I04333527a823371175dd46cb04a817e5b9a8b752
      221e00ea
  30. 06 Jun, 2011 1 commit
    • Yaowu Xu's avatar
      remove redundant functions · d4700731
      Yaowu Xu authored
      The encoder defined about 4 set of similar functions to calculate sum,
      variance or sse or a combination of them. This commit removed one set
      of these functions, get8x8var and get16x16var, where calls to the later
      function are replaced with var16x16 by using the fact on a 16x16 MB:
          variance == sse - sum*sum/256
      
      Change-Id: I803eabd1fb3ab177780a40338cbd596dffaed267
      d4700731
  31. 02 Jun, 2011 1 commit
    • Scott LaVarnway's avatar
      Removed B_MODE_INFO · 773768ae
      Scott LaVarnway authored
      Declared the bmi in BLOCKD as a union instead of B_MODE_INFO.
      Then removed B_MODE_INFO completely.
      
      Change-Id: Ieb7469899e265892c66f7aeac87b7f2bf38e7a67
      773768ae
  32. 01 Jun, 2011 1 commit
    • Yaowu Xu's avatar
      further clean up of errorperbit and sadperbit · 5b2fb329
      Yaowu Xu authored
      this commit makes the usage errorperbit and sadperbit consistent for
      encoding modes and passes. Removed all different magic weight factors
      associated with errorperbit. Now 1/2 is used for both sadperbit16 and
      sadperbit4, the /2 operation is merged into initializations of the 2
      variables.
      
      Tests on cif set show .23%, 0.18% and 0.19% gain by avg psnr, overall
      psnr and ssim respectively.
      
      Change-Id: Ifa285c3e065ce0a5a77addfc9f95aabf54ee270d
      5b2fb329