1. 20 May, 2015 1 commit
    • paulwilkins's avatar
      Fix issues with mixed ARF and GF groups. · ade9693a
      paulwilkins authored
      This patch addresses two issues that can occur when the
      encoder chooses to use a mixture of ARF and GF groups.
      
      The first issue relates to a failure to reset the "ARF active" flag
      correctly when transitioning from coding ARF groups to coding
      GF groups. This caused some golden frames to be  encoded
      with an incorrect bit rate target as if they were ARF overlay frames.
      
      The second issue relates to the encoding of a single short GF group
      just before a key frame.  Where the last group before a key frame
      is an ARF group we expect the final frame before the key frame  to
      be an low data rate overlay frame. However, when the last  group
      is a GF group, the final frame before the key frame should be a normal
      frame with a normal bit allocation. This issue had the potential to cause
      a single poorly coded frame just before a key frame. If that key frame
      were a forced key frame rather than a real scene cut, this might cause
      pulsing.
      
      Change-Id: Idf1eb5eaf63a231495a74de7899236e1ead9fb00
      ade9693a
  2. 15 May, 2015 1 commit
  3. 13 May, 2015 1 commit
    • Johann's avatar
      Relocate memory operations for common code · 1d7ccd53
      Johann authored
      With the sad functions, and hopefully the variance functions soon,
      moving to the vpx_dsp location, place the defines used in the
      reference C code in a common location.
      
      Change-Id: I4c8ce7778eb38a0a3ee674d2f1c488eda01cfeca
      1d7ccd53
  4. 01 May, 2015 1 commit
    • paulwilkins's avatar
      Adjust ARF min and max interval. · e0786c28
      paulwilkins authored
      Previously limit on max interval  set to 0.5 seconds.
      Though this helped some low frame rate material it
      appears to be a bit too aggressive for some 24 and 25 fps
      content. This patch relaxes the limit to 0.75 seconds.
      
      The patch also adds a new minimum interval variable
      to replace the current hard wired value. This allows us
      to impose a limit on the maximum number of primary
      arfs per second for high frame rate (e.g. 50 & 60fps)
      content. This is to address concerns regarding playback
      performance on some platforms if there is a high base
      frame rate and very frequent arfs.
      
      Change-Id: I373e8b6b2a8ef522eced6c6d2cceb234ff763fcf
      e0786c28
  5. 21 Apr, 2015 2 commits
    • Scott LaVarnway's avatar
      Revert "Remove mi_grid_* structures." · 8b17f7f4
      Scott LaVarnway authored
      (see I3a05cf1610679fed26e0b2eadd315a9ae91afdd6)
      
      For the test clip used, the decoder performance improved by ~2%.
      This is also an intermediate step towards adding back the
      mode_info streams.
      
      Change-Id: Idddc4a3f46e4180fbebddc156c4bbf177d5c2e0d
      8b17f7f4
    • paulwilkins's avatar
      Modified test for auto key frame detection. · 3606b781
      paulwilkins authored
      The existing test was triggering a lot of false positives on some types
      of animated material with very plain backgrounds. These were triggering
      code designed to catch key frames in letter box format clips.
      
      This patch tightens up the criteria and imposes a minimum requirement
      on the % blocks coded intra in the first pass and the ratio between the
      % coded intra and the modified inter % after discounting neutral (flat)
      blocks that are coded equally well either way.
      
      On a particular problem animation clip this change eliminated a large
      number of false positives including some cases where the old code
      selected kf several times in a row. Marginal false negatives are less
      damaging typically to compression and in the problem clip there are now
      a couple of cases where "visual" scene cuts are ignored because of well
      correlated content across the scene cut.
      
      Replaced some magic numbers related to this with #defines and added
      explanatory comments.
      
      Change-Id: Ia3d304ac60eb7e4323e3817eaf83b4752cd63ecf
      3606b781
  6. 16 Apr, 2015 1 commit
    • paulwilkins's avatar
      Limit arf interval for low fpf clips. · effd974b
      paulwilkins authored
      This patch limits  the maximum arf interval length to
      approximately half a second. In some low fps animations in
      particular the existing code was selecting an overly long interval
      which was hurting visual quality. For a sample problem test clip
      (360P animation , 15fps, ~200Kbit/s) this change also improved
      metrics by >0.5 db.
      
      There may be some clips where this hurts metrics a little, but the
      worst case impact visually is likely to be less than having an
      interval that is much too long. On more normal material at 24
      fps or higher, the impact is likely to be nil/minimal.
      
      Change-Id: Id8b57413931a670c861213ea91d7cc596375a297
      effd974b
  7. 07 Apr, 2015 1 commit
    • Debargha Mukherjee's avatar
      Improve accuracy of rate control in CQ mode · 60bd744c
      Debargha Mukherjee authored
      Modifies a special handling that improves rate control accuracy in
      the constrained quality mode, when the undershoot and overshoot
      limits are set tighter.
      
      Change-Id: If62103f0ef3ed1cac92807400678c93da50cf046
      60bd744c
  8. 23 Mar, 2015 1 commit
    • paulwilkins's avatar
      Enable group adaptive max q by default. · 691ec45b
      paulwilkins authored
      Set the GF group adaptive max Q compile flag to 1 by default.
      
      This change has a quite big visual impact in some clips and also
      contributes to tighter rate control.
      
      For short test clips that have consistent content the impact is
      quite small on metrics but for more varied long form clips there is
      a drop in overal psnr but a sharp rise in average psnr caused by
      greater expenditure on some easier sections and tighter rate clipping
      in hard sections.
      
      In chunck'ed encodes some of the effect will already be present due
      to the independent rate control in each chunk but this change takes
      the control down to a smaller scale.
      
      yt hd +10.67%, - 3.77%, -1.56%
      yt +9.654%, - 3.6%, - 1.82%
      std hd +0.25%, -0.85%, -0.42%
      derf +0.25%, - 1.1%. - 0.87%
      
      Change-Id: Ibbc39b800d99d053939f4c6712d715124082843e
      691ec45b
  9. 20 Mar, 2015 1 commit
    • paulwilkins's avatar
      Revised rd adjustment for variance. · 7e234b92
      paulwilkins authored
      Revised adjustment for rd based on source complexity.
      Two cases:
      
      1) Bias against low variance intra predictors
      when the actual source variance is higher.
      
      2) When the source variance is very low to give a slight
      bias against predictors that might introduce false texture
      or features.
      
      The impact on metrics of this change across the test sets is
      small and mixed.
      
      derf -0.073%, -0.049%, -0.291%
      std hd -0.093%, -0.1%, -0.557%
      yt  +0.186%, +0.04%, - 0.074%
      ythd +0.625%, + 0.563%, +0.584%
      
      Medium to strong psycho-visual improvements in some
      problem clips.
      
      This feature and intra weight on GF group length now
      turned on by default.
      
      Change-Id: Idefc8b633a7b7bc56c42dbe19f6b2f872d73851e
      7e234b92
  10. 11 Mar, 2015 1 commit
    • paulwilkins's avatar
      Shorten GF/arf interval in hard scenes. · b29c48b0
      paulwilkins authored
      This patch accounts in the first pass stats for blocks that
      while not coded as intra, are complex and have an intra error /
      best error ratio below a threshold.
      
      The modification shortens the GF arf interval for a particular
      class of content that contains a lot of blocks matching the
      above criteria. (In one short problem test sequence the average
      interval dropped from about 14-15 to 10-11)
      
      The change results in small net gains in metrics results for the
      Yt(~0.2%) and yt-hd (~0.5%) sets and is approximately neutral
      for the other test sets.
      
      The change is currently shielded by a flag and off by default
      pending verification that it does not cause other regressions
      in tests on a wider YT test set.
      
      Change-Id: I6b803daa6a4ac09a6f428fb3a18be1ecedd974b7
      b29c48b0
  11. 09 Mar, 2015 1 commit
    • paulwilkins's avatar
      Allow q adjustment for VPX_CQ and VPX_CBR. · 2cff9c4e
      paulwilkins authored
      Adjustment previously only enabled in VBR mode.
      
      This patch allows adjustment of min and max q for CBR
      and adjustment of max q only for CQ mode.
      
      Change-Id: Id5e583f3d50453cd544fc57249acacd946457482
      2cff9c4e
  12. 04 Mar, 2015 2 commits
    • Adrian Grange's avatar
      Small rationalization of code in vp9_first_pass · fed9e1fe
      Adrian Grange authored
      Change-Id: I87cc0e038171c60a957298827e312fead500f7fb
      fed9e1fe
    • Adrian Grange's avatar
      Make encoder buffer allocation dynamic · 3807dd82
      Adrian Grange authored
      Frame buffers are now allocated dynamically on-demand.
      
      Entries in the reference frame map, cm->ref_frame_map,
      may now be set to -1 (INVALID_IDX) to indicate that
      there is not a valid reference buffer in that "slot".
      
      All slots in the reference frame map are now initialized
      to the empty state (-1) and each buffer is initialized
      to have a reference count of 0.
      
      Change-Id: Id1afe98de98db4ae8b2dfefed7889c3b28c68582
      3807dd82
  13. 23 Feb, 2015 1 commit
    • paulwilkins's avatar
      Account for rate error in GF group Q calculation. · 8d7f53f0
      paulwilkins authored
      When GF group adaptive maxQ is enabled this patch accounts
      somewhat for accumulated error in the rate control.
      
      This improves accuracy quite a bit on many clips especially
      when there is  overshoot.
      
      Examples when the overshoot and undershoot command line
      parameters are set to 100:
      
      Hall @ 1200 overshoot is reduced from 67-24%.
      Akiyo @ 400 undershoot is reduced from 28%-15%.
      
      Setting a lower value for undershoot or overshoot still
      reduces the error further.
      
      Impact on metrics is mixed with some gains in average psnr
      but generally a little lower (e.g. 0.5%) on overall and ssim.
      
      The GF group adaptation is still off by default in this patch.
      Compared to with the head, enabling this mode now gives
      big average psnr gains on the YT sets (e.g. YT_HD >11.2%),
      a drop in overall PSNR (YT-HD 3.9%) and a smaller drop or
      neutral for SSIM.
      
      Change-Id: If4b32cd0740d3fb941317b374f9c2951954eee90
      8d7f53f0
  14. 19 Feb, 2015 1 commit
  15. 10 Feb, 2015 1 commit
    • Adrian Grange's avatar
      Auto-adaptive encoder frame resizing logic · 23ebacdb
      Adrian Grange authored
      Note: This feature is still in development.
      
      Add an option for the encoder to decide the resolution
      at which to encode each frame.
      
      Each KF/GF/ARF goup is tested to see if it would be
      better encoded at a lower resolution. At present, each
      KF/GF/ARF is coded first at full-size and if the coded
      size exceeds a threshold (twice target data rate) at
      the maximum active Q then the entire group is encoded
      at lower resolution.
      
      This feature is enabled in vpxenc by setting:
        --resize-allowed=1
      
      In addition, if the vpxenc command line also specifies
      valid frame dimensions using:
        --resize-width=XXXX & --resize_height=YYYY
      then *all* frames will be encoded at this resolution.
      
      Change-Id: I13f341e0a82512f9e84e144e0f3b5aed8a65402b
      23ebacdb
  16. 31 Jan, 2015 1 commit
    • hkuang's avatar
      Try again to merge branch 'frame-parallel' into master branch. · be6aeada
      hkuang authored
      In frame parallel decode, libvpx decoder decodes several frames on all
      cpus in parallel fashion. If not being flushed, it will only return frame
      when all the cpus are busy. If getting flushed, it will return all the
      frames in the decoder. Compare with current serial decode mode in which
      libvpx decoder is idle between decode calls, libvpx decoder is busy
      between decode calls.
      
      Current frame parallel decode will only speed up the decoding for frame
      parallel encoded videos. For non frame parallel encoded videos, frame
      parallel decode is slower than serial decode due to lack of loopfilter
      worker thread.
      
      There are still some known issues that need to be addressed. For example:
      decode frame parallel videos with segmentation enabled is not right sometimes.
      
      * frame-parallel:
        Add error handling for frame parallel decode and unit test for that.
        Fix a bug in frame parallel decode and add a unit test for that.
        Add two test vectors to test frame pa...
      be6aeada
  17. 26 Jan, 2015 1 commit
    • Paul Wilkins's avatar
      Adjust active maxq for GF groups. · fd070220
      Paul Wilkins authored
      Currently disabled by default: enabled using
      #define GROUP_ADAPTIVE_MAXQ
      
      In this patch the active max Q is adjusted for each GF
      group based on the vbr bit allocation and raw first pass
      group error.
      
      This will tend to give a lower q for easy sections
      and a higher value for very hard sections. As such it is
      expected to improve quality in some of the easier
      sections where quality issues have been reported.
      
      This change tends to hurt overall psnr but help
      average psnr. SSIM also shows a small gain.
      
      Average results for derf, yt, std-hd and yt-hd test sets were
      as follows (%change for average psnr, overal psnr and ssim):-
      
      derf +0.291, - 0.252, -0.021
      yt +6.466, -1.436, +0.552
      std-hd +0.490, +0.014, +0.380
      yt-hd +5.565, - 1.573, +0.099
      
      Change-Id: Icc015499cebbf2a45054a05e8e31f3dfb43f944a
      fd070220
  18. 23 Jan, 2015 1 commit
  19. 21 Jan, 2015 1 commit
    • Paul Wilkins's avatar
      Bug when last group before forced key frame is short. · 0bff1efc
      Paul Wilkins authored
      Just before a forced key frame we often get a foreshortened
      arf/gf group. In such a case, we do not want to update
      rc->last_boosted_qindex, which is used to define the Q range
      for the forced key frame itself.
      
      This gives a small average metrics gain for the YT and YT-HD sets
      (eg. YT SSIM +0.141%).
      
      Change-Id: Ie06698bc4f249e87183b8f8fb27ff8f3fde216d9
      0bff1efc
  20. 25 Nov, 2014 1 commit
    • Yunqing Wang's avatar
      vp9_ethread: modify VP9_COMP structure · edbd61e1
      Yunqing Wang authored
      This patch modified struct VP9_COMP. Created a struct ThreadData
      to include data that need to be copied for each thread. In
      multiple thread case, one thread processes one tile. all threads
      share one copy of VP9_COMP,
      (refer to VP9_COMP *cpi in the code)
      but each thread has its own copy of ThreadData,
      (refer to ThreadData *td in the code).
      Therefore, within the scope of encode_tiles(), both cpi and td
      need to be passed as function parameters.
      
      In single thread case, the FRAME_COUNTS pointer in ThreadData
      points to "counts" in VP9_COMMON.
      
      Change-Id: Ib37908b2d8e2c0f4f9c18f38017df5ce60e8b13e
      edbd61e1
  21. 21 Nov, 2014 1 commit
    • Paul Wilkins's avatar
      Add adaptive midpoint for AQ1. · fc47c5d6
      Paul Wilkins authored
      Make the midpoint variance used in AQ mode 1 segmentation
      depend on the overall complexity of the frame in two pass.
      
      Change-Id: I452814ec57f7a32352e41bb250e78066abe952dd
      fc47c5d6
  22. 20 Nov, 2014 2 commits
  23. 14 Nov, 2014 1 commit
  24. 13 Nov, 2014 2 commits
    • Adrian Grange's avatar
      Prepare for dynamic frame resizing in the recode loop · 0d085ebc
      Adrian Grange authored
      Prepare for the introduction of frame-size change
      logic into the recode loop.
      
      Separated the speed dependent features into
      separate static and dynamic parts, the latter being
      those features that are dependent on the frame size.
      
      Change-Id: Ia693e28c5cf069a1a7bf12e49ecf83e440e1d313
      0d085ebc
    • Paul Wilkins's avatar
      Fix 32 bit build emms problem. · b9c4f9a7
      Paul Wilkins authored
      Add extra vp9_clear_system_state() calls to fix
      double / mmx issue introduced into first pass
      code for 32 bit builds.
      
      Change-Id: I84cd2986b80d83650a091ab25c43755efeb82e03
      b9c4f9a7
  25. 07 Nov, 2014 1 commit
    • Paul Wilkins's avatar
      AQ1 - remove first pass weights. · 31b6d7c1
      Paul Wilkins authored
      Removed redundant weighting function tied for AQ1 from first
      pass code.
      
      Improvment in baseline AQ1 results:-
      Derf  opsnr +0.142% SSIm +0.258%
      YT  opsnr +0.173% SSIm +0.3%
      
      Change-Id: I16ef91caf2d7f302cd5940cc5e2626d48ebcb212
      31b6d7c1
  26. 06 Nov, 2014 1 commit
    • Paul Wilkins's avatar
      Add intra complexity and brightness weight to first pass. · 5e935126
      Paul Wilkins authored
      The aim of this patch is to apply a positive weighting to
      frames that have a significant number of blocks that are
      of low spatial complexity and are dark. The rationale behind
      this is that artifacts tend to be more visible in such frames.
      
      In this patch the weight is only applied in regard to the distribution
      of bits between frames. Hence if all the frames share similar
      characteristics (as is the case for most of our short test clips) there
      will be little or no net effect.
      
      However, the effect can be seen on some longer form test content.
      
      For example Tears of steel baseline test:
      2323.09 Kbit/s opsnr 39.915 ssim 74.729
      With this patch:-
      2213.34 Kbit/s opsnr 39.963 ssim 74.808
      (Sligtly better metrics and about 5% smaller)
      
      The weighting may well need some further tuning along side changes
      to the aq modes.
      
      Change-Id: Ieced379bca03938166ab87b2b97f55d94948904c
      5e935126
  27. 28 Oct, 2014 1 commit
    • Paul Wilkins's avatar
      Relax maximum Q for extreme overshoot. · 422d7bc9
      Paul Wilkins authored
      Added code to relax the active maximum Q in response
      to extreme local overshoot to reduce bandwidth peaks.
      
      The impact is small in metrics terms, but it this helps reduce
      bandwidth spikes and overall overshoot in a number of
      clips in our tests sets (especially the YT test set).
      
      In particular this should help prevent very big spikes where a clip
      is mainly easy but has a short hard section. In such a case a choice
      of maximum Q for the clip as a whole may allow us to hit the overall
      target rate but give some extreme spikes. The chunked encoding in YT
      mitigates this problem but it can show up where a longer clip is
      coded as a single chunk.
      
      Change-Id: I213d09950ccb8489d10adf00fda1e53235b39203
      422d7bc9
  28. 23 Oct, 2014 1 commit
    • Adrian Grange's avatar
      Move frame re-sizing into the recode loop · 65753eeb
      Adrian Grange authored
      The point at which frames are scaled to their
      coded dimensions is moved into the re-code loop.
      
      This is in preparation for a further patch that
      will add logic into the re-code loop to reduce
      the coded frame size if the encoder is struggling
      to hit the target data rate at the native frame
      size.
      
      Change-Id: Ie4131f5ec6fb93148879f6ce96123296442bf2d1
      65753eeb
  29. 17 Oct, 2014 1 commit
    • Paul Wilkins's avatar
      Alter adjustment of two pass GF/ARF boost with Q. · f0c3da93
      Paul Wilkins authored
      Delete gfboost_qadjust() and move Q based adjustment
      into calc_frame_boost(). Also remove clamping. Making
      the adjustment here means that it influences not just the
      boost level but also the selection of the GF/ARF interval.
      
      This change gives a small average gain in PSNR but
      larger gains in SSIM, especially for harder std-hd set (1.5%)
      
      Change-Id: I3aa81b8feccaeff93d915e19fb9cf5cd64c86327
      f0c3da93
  30. 16 Oct, 2014 3 commits
    • Minghai Shang's avatar
      [spatial svc]Another workaround to avoid using prev_mi · 68b550f5
      Minghai Shang authored
      We encode a empty invisible frame in front of the base layer frame to
      avoid using prev_mi. Since there's a restriction for reference frame
      scaling factor, we have to make it smaller and smaller gradually until
      its size is 16x16.
      
      Change remerged.
      
      Change-Id: I9efab38bba7da86e056fbe8f663e711c5df38449
      68b550f5
    • Paul Wilkins's avatar
      Revert "Move input frame scaling into the recode loop" · d5130af5
      Paul Wilkins authored
      This reverts commit 452dc215.
      
      This change has introduced a significant quality regression on content
      with forced key frames. (e.g. the YT and yt-hd set). It is most
      noticeable in static content where the kf bits dominate. Here, despite
      key frames being apparently coded at the same Q, there is a drop in all
      metrics of ~20% (e.g clXR and BFa0).
      
      Change-Id: Iba14cc61778c0846fa0a59c33c55a9fc49512cb4
      d5130af5
    • Paul Wilkins's avatar
      Revert "[spatial svc]Another workaround to avoid using prev_mi" · 46803296
      Paul Wilkins authored
      This reverts commit c113457a.
      
      Temporary revert to allow clean revert of another commit.
      
      Change-Id: Ia9b7b755e6c48e1b6e383329f121fef175a24b27
      46803296
  31. 14 Oct, 2014 2 commits
    • Minghai Shang's avatar
      [spatial svc]Another workaround to avoid using prev_mi · c113457a
      Minghai Shang authored
      We encode a empty invisible frame in front of the base layer frame to
      avoid using prev_mi. Since there's a restriction for reference frame
      scaling factor, we have to make it smaller and smaller gradually until
      its size is 16x16.
      Change-Id: I60b680314e33a60b4093cafc296465ee18169c19
      c113457a
    • Adrian Grange's avatar
      Move input frame scaling into the recode loop · 452dc215
      Adrian Grange authored
      Move the point at which input frames are scaled
      into the recode loop. This will allow us to change
      the coded frame size dynamically in response
      to previous attempts to encode the frame at a
      higher resolution.
      
      A following patch will implement a scheme for
      resizing the frame in the recode loop.
      
      Change-Id: I6a59c02d6ac1626512edad6de8b60063b79433e6
      452dc215
  32. 13 Oct, 2014 2 commits
    • Paul Wilkins's avatar
      Clamp rate error estimate. · 6dbb9e4d
      Paul Wilkins authored
      Add back clamp which ensures that the Q adaptation
      is turned off when the over_shoot_pct and under_shoot_pct
      parameters are set to 100.
      
      Change-Id: Id0161b114d39a3029cd3eb28020caab0c3914922
      6dbb9e4d
    • Paul Wilkins's avatar
      Add adaptation option for VBR. · f7f0eaa5
      Paul Wilkins authored
      Allow min and maxQ to creep when the undershoot
      or overshoot exceeds thresholds controlled by the
      command line under_shoot_pct and over_shoot_pct
      values.
      
      Default is 100%,100% which ~disables adaptation.
      
      Derf results for example undershoot% / overshoot%:-
      
      Head:- Mean abs (%rate error) = 14.4%
      
      This check in:-
      25%/25% - Mean abs (%rate error) = 6.7%
                        PSNR hit -1% SSIM -0.1%
      
      5% / 5%  - Mean abs (%rate error) = 2.2%
                       PSNR hit -3.3% SSIM - 1.1%
      
      Most of the remaining error and most of the quality hit is
      at extreme data rates. The adaptation code still has an
      exception for material that is in effect static so that we
      don't over adjust and over spend on YT slide show type
      content.
      
      (Rebase of If25a2449a415449c150acff23df713e9598d64c9
      to resolve a auto-merge error)
      
      Change-Id: Iec4e1613ef0d067454751d8220edb7058dfbd816
      f7f0eaa5