2024-10-24 v3.11.0
  This release includes perceptual quality improvements, binary size reduction
  under certain configurations and many bug fixes. This release changes the
  default encoder configuration for the AOM_USAGE_REALTIME mode. This release
  is ABI compatible with the last release.

  - Perceptual Quality Improvements
    * Visual quality improvements for RTC screen content
      * Higher quality on scene or slide changes
      * Faster quality ramp-up for static content after scene change
      * Quality improvements for screen content with active maps

  - Speedup
    * Added and improved Neon SIMD paths for dynamic frame scaling with ~1.5%
      overall encoding speedup.

  - Other Improvements
    * Binary size reduction: 10% compared with last release, with
      CONFIG_REALTIME_ONLY enabled, CONFIG_AV1_DECODER and
      CONFIG_AV1_HIGHBITDEPTH disabled.
    * Update default_extra_cfg for CONFIG_REALTIME_ONLY to provide proper RTC
      defaults settings
    * Change the default valuess of the following encoder config options in the
      AOM_USAGE_REALTIME mode:
      *  rc_overshoot_pct and rc_undershoot_pct are changed from 25 to 50
      *  rc_buf_sz is changed from 6000 to 1000
      *  rc_buf_initial_sz is changed from 4000 to 600
      *  rc_buf_optimal_sz is changed from 5000 to 600

  - Bug Fixes
    * aomedia:363016123: rtc: Fix setting of intra-only frame for
      set_ref_frame_config and add checks
    * aomedia:42302583: rtc: Fix for artifacts for screen with active_maps
    * b:365088425: rtc: Allow for lower-QP on scene/slide changes
    * b:367285382: Fix to encoder quality max-out too early for screen
    * b:362936830: rtc: Allow QP to decrease more aggressively for static
      content
    * b:361617762: Clamp the calculation of sb64_target_rate to INT_MAX
    * chromium:362123224: rtc-svc: Reset ref_map_idx for references not used
    * chromium:367892770: Fix to possible integer overflow in reset_rc
    * webrtc:369633254: rtc-svc: Fix to reset ref_idx for svc
    * Fix exit condition in rate correction update

2024-08-27 v3.10.0
  This release includes new codec interfaces, compression efficiency and
  perceptual improvements, speedup and memory optimizations and many bug
  fixes. This release is ABI compatible with the last release.

  The definitions of the internal macros AOM_INLINE and AOM_FORCE_INLINE
  have been removed from the public header aom/aom_integer.h.

  - New Features
    * New codec controls:
      * AV1E_SET_AUTO_TILES
      * AV1E_GET_HIGH_MOTION_CONTENT_SCREEN_RTC
      * AV1E_SET_POSTENCODE_DROP_RTC: Post encode frame drop feature.
      * AV1E_SET_MAX_CONSEC_FRAME_DROP_MS_CBR
    * New key-value pair for aom_codec_set_option():
      * "auto-tiles": equivalent to the new codec control
        AV1E_SET_AUTO_TILES.

  - Deprecated Features
    * Deprecated codec control:
      * AV1E_SET_MAX_CONSEC_FRAME_DROP_CBR: Use the new codec control
        AV1E_SET_MAX_CONSEC_FRAME_DROP_MS_CBR instead.
    * The sframe_mode field in the aom_codec_enc_cfg_t struct is not
      implemented.

  - Compression Efficiency Improvements
    * BD-rate gain of 0.7 - 1.3% (by enabling global motion tool) for
      speed 5 and speed 6 with ~5% encode time increase.
    * RTC speed 11 video: ~3-5% BD-rate gain for VGA and QVGA.

  - Perceptual Quality Improvements
    * RTC quality improvements for slide changes and scrolling content.

  - Speedup and Memory Optimizations
    * RTC screen content speedups:
      * ~2x speedup for high motion content for speed 11.
      * ~2x speedup on key frame coding for speed >= 10.
    * Arm: Significant uplifts in speed in this release (vs v3.9.1) have
      come from tuning the various convolutions according to filter size
      (doing 8-tap when only 2-tap is required is inefficient) and also
      deploying Armv8.6 USMMLA instructions in 6-tap and 12-tap standard
      bitdepth convolutions.
      * Standard bitdepth RTC:
        * speed 5: +5%
        * speed 6: +4%
        * speed 7: +5%
        * speed 8: +4%
        * speed 9: +6%
        * speed 10: +6%
      * Standard bitdepth VoD:
        * speed 0: +9%
        * speed 1: +12%
        * speed 2: +9%
        * speed 3: +3%
        * speed 4: +3%
        * speed 5: -9% (expected due to global motion changes)
        * speed 6: -3% (expected due to global motion changes)
      * High bitdepth VoD:
        * speed 0: +4%
        * speed 1: +19%
        * speed 2: +23%
        * speed 3: +1%
        * speed 4: +1%
        * speed 5: -8% (expected due to global motion changes)
        * speed 6: -3% (expected due to global motion changes)
      * Standard bitdepth 2x1 horizontal super-resolution/scaling
        encoding: +101%

  - Other Improvements
    * Reduce bit rate overshoot on slide content.

  - Bug Fixes
    * rtc: Bug fix for active_maps with sb_size=128.
    * b:343429036: rtc: Fix source_sad setting near boundary.
    * Fix to QP for temporal enhancement after key frame.
    * b:343429192: rtc: Condition QP adjustment on rc->q_1/2_frame > 0.

2024-06-07 v3.8.3
  This release includes several bug fixes. This release is ABI
  compatible with the last release. See
  https://aomedia.googlesource.com/aom/+log/v3.8.2..v3.8.3 for all the
  commits in this release.

  - Bug Fixes
    * aomedia:2754, aomedia:3567: Ensure thread stack size is at least
      256 KB
    * aomedia:3382, chromium:339877165: update codec config after
      svc/scale controls (CVE-2024-5493)
    * aomedia:3561: libaom-3.8.2 armv7 Android build failed
    * aomedia:3580: Allow g_timebase.num to be greater than
      g_timebase.den
    * Arm SVE build fixes.
    * av1_block_error_lp_neon: fix block_size param type

2024-06-05 v3.9.1
  This release includes several bug fixes. This release is ABI
  compatible with the last release. See
  https://aomedia.googlesource.com/aom/+log/v3.9.0..v3.9.1 for all the
  commits in this release.

  - Bug Fixes
    * aomedia:2754, aomedia:3567: Ensure thread stack size is at least
      256 KB
    * b:330639949, oss-fuzz:68195: Increase scaling in linsolve_wiener
    * Fix high target data rate overflow.
    * aomedia:3509: Fix two UBSan errors in av1_rc_update_framerate()
    * aomedia:3382, chromium:339877165: update codec config after
      svc/scale controls (CVE-2024-5493)
    * aomedia:3561: libaom-3.8.2 armv7 Android build failed
    * aomedia:3571: {,highbd_}intrapred_neon.c: Avoid over-reads in z1
      and z3 preds
    * aomedia:3578: libaom-3.9.0 undefined reference to
      `aom_sub_pixel_variance16xh_ssse3'
    * aomedia:3579: Use round for RC calculations in cyclic_refresh
    * aomedia:3580: Allow g_timebase.num to be greater than
      g_timebase.den
    * oss-fuzz:68774: libaom:av1_dec_fuzzer: Segv on unknown address in
      od_ec_dec_init
    * Arm SVE build fixes.
    * av1_block_error_lp_neon: fix block_size param type
    * av1_block_error_lp_sve: fix block_size param type

2024-04-09 v3.9.0
  This release includes new codec interfaces, compression efficiency and
  perceptual improvements, speedup for RTC for both video and screen content,
  and many bug fixes. This release is ABI compatible with the previous release.

  - New Features
    * New codec control
      * AV1E_SET_SVC_FRAME_DROP_MODE is added to configure the SVC encoder to
        only drop spatial layers or the whole superframe.
    * Active Map is fixed and tested for RTC.
    * CONFIG_QUANT_MATRIX is added to disable quantization matrices when aom
      decoder is disabled with CONFIG_AV1_DECODER. Reduces ~10% binary size when
      both are disabled.
    * libwebm is updated to libwebm-1.0.0.31-1-gaffd7f4.

  - Compression Efficiency Improvements
    * RTC encoding improvements
      * 1-2% BD-rate gain for screen content with temporal layers; 5% BD-rate
        gain on scrolling content.

  - Perceptual Quality Improvements
    * For RTC screen content
      * Reduced color artifacts for RTC screen content
      * Visual quality improved for scene changes for SVC with quality layers.
      * Removed visual artifacts for speed 11

  - Speedups:
    * RTC Speed 11: aggressive speedup setting added for video mode,
      resolutions <= VGA: ~30% faster than speed 10.
    * 5-9% speed up for high bit-depth encoding with good mode on Arm, half of
      which comes from SVE/SVE2 optimizations.

  - Other improvements
    * Further improvements to global motion estimation.
    * Documented minimum required SIMD support: SSE4.1 on x86, Neon on Arm.
    * Remove unneeded SIMD functions, saving >100 KiB from binary size.
    * Cleaned up and improved pattern_search.
    * Added end-to-end c vs SIMD bit-exactness test.
    * Added config flag to calc psnr using libvmaf peak: use a slightly
      different peak value for PSNR (1020 and 2040 for 10- and 12-bit)

  - Bug Fixes
    * Fuzzing bug fixes
      * b/329485898 Null-dereference WRITE in av1_cdef_frame_mt
      * b/329810149 Null-dereference WRITE in av1_cdef_copy_sb8_16
      * b/329813868 Ill in av1_cdef_frame_mt
      * chromium:327882824 Null-dereference WRITE in av1_cdef_init_fb_row
      * b/330014723 Null-dereference WRITE in
        cdef_copy_rect8_16bit_to_16bit_avx2
      * b/310455204 Null-dereference WRITE in prepare_enc_workers
      * b/314858909 Heap-buffer-overflow in aom_variance64x64_avx2
      * oss-fuzz:67132 av1_dec_fuzzer: ASSERT: (pbi->tile_count_minus_1 + 1) <=
        (pbi->output_frame_width_in_tiles_minus_1 + 1)
      * oss-fuzz:67058 av1_dec_fuzzer: ASSERT: i == 0 || tile_w == *w
      * oss-fuzz:67161 av1_dec_fuzzer: ASSERT: i == 0 || tile_h == *h
      * oss-fuzz:67059 av1_dec_fuzzer: Crash in mem_get_varsize
      * oss-fuzz:67162 av1_dec_fuzzer: Use-of-uninitialized-value in
        od_ec_decode_bool_q15
      * oss-fuzz:67184 av1_dec_fuzzer: Heap-buffer-overflow in od_ec_dec_init
      * oss-fuzz:67216 av1_dec_fuzzer: Heap-buffer-overflow in
        od_ec_dec_normalize
      * oss-fuzz:67055 av1_dec_fuzzer: Heap-buffer-overflow in
        get_ls_tile_buffers
    * libaom library
      * aomedia:3510 Large value of duration could cause encoder overflow
      * chromium:328105513 Fix build conflicts between Abseil and libaom/libvpx
        in Win ARM64 builds
      * aomedia:3544 AV1/SharpnessTestLarge.SharpnessPSNRTest failures after
        59c592bb8
      * aomedia:3531 Exception encountered with PSNR calculation
      * aomedia:3541 Can not compile correctly by CYGWIN
      * chromium:41482688 heap-buffer-overflow write in vpx_img_read()
        (tools_common.c) with VPX_IMG_FMT_NV12
      * aomedia:3521 Assertion failures on Arm in CNNTest.* in
        av1_cnn_convolve_no_maxpool_padding_valid_2x2_neon and
        av1_cnn_convolve_no_maxpool_padding_valid_5x5_neon
      * aomedia:3486 C vs NEON mismatch in AV1 encoder
      * aomedia:3536 Over write in highbd_dr_prediction_z3_upsample1_neon()
      * aomedia:3276 Significant progress on ensuring all allocations are
        checked
      * aomedia:3491 heap-buffer-overflow encoding frames of size 256x256,
        512x512 in good quality usage mode using 4 threads
      * aomedia:3322 PSNR number discrepancy
      * aomedia:3493 Cmake generates garbage symbols for libaom_srcs.gni
      * aomedia:3478 GCC 12.2.0 emits a -Wstringop-overflow warning on
        aom/av1/encoder/motion_search_facade.c
      * aomedia:3484 C vs NEON mismatch in AV1 encoder for high-bitdepth case

2024-03-08 v3.8.2
  This release includes several bug fixes. This release is ABI
  compatible with the last release. See
  https://aomedia.googlesource.com/aom/+log/v3.8.1..v3.8.2 for all the
  commits in this release.

  - Bug Fixes
    * aomedia:3523: SIGFPE in av1_twopass_postencode_update()
      pass2_strategy.c:4261.
    * aomedia:3535, b/317646516: Over reads in aom_convolve_copy_neon().
    * aomedia:3543: invalid feature modifier when compiling
      aom_dsp/arm/aom_convolve8_neon_i8mm.c on Debian 10 with arm64
      architecture.
    * aomedia:3545: Failed to parse configurations due to inconsistent
      elements between two arrays "av1_ctrl_args" and "av1_arg_ctrl_map"
      in aomenc.c.
    * oss-fuzz:66474, b/319140742: Integer-overflow in search_wiener.
    * Zero initialize an array in cdef search.

2024-01-17 v3.8.1
  This release includes several bug fixes. This release is ABI
  compatible with the last release. See
  https://aomedia.googlesource.com/aom/+log/v3.8.0..v3.8.1 for all the
  commits in this release.

  - Bug Fixes
    * aomedia:3520: get_cubic_kernel_dbl: Assertion `0 <= x && x < 1'
      failed.
    * aomedia:3526: alloc_compressor_data() is called during every
      aom_codec_control() call on the encoder.
    * aomedia:3527: aom/av1/encoder/mcomp.c:1810: av1_full_pixel_search:
      Assertion `ms_params->ms_buffers.ref->width ==
      ms_params->ms_buffers.src->width' failed.
    * aomedia:3534: libaom encoder crashed by AOM_USAGE_ALL_INTRA and
      AOM_EFLAG_NO_REF_LAST flags.
    * b/310455204: Recreate workers if necessary.
    * b/310548198: Update frame size in actual encoding.
    * b/314858909: Do not use adaptive error estimate.
    * Fix a hang of cmake on arm64 macOS with cmake 3.27.0 or later.

2024-01-18 v3.7.2
  This release includes three bug fixes. This release is ABI compatible
  with the last release. See
  https://aomedia.googlesource.com/aom/+log/v3.7.1..v3.7.2 for all the
  commits in this release.

  - Bug Fixes
    * aomedia:3520: get_cubic_kernel_dbl: Assertion `0 <= x && x < 1'
      failed.
    * aomedia:3526: alloc_compressor_data() is called during every
      aom_codec_control() call on the encoder. Note that this partially
      reverts the fix for bug aomedia:3349.
    * b/310457427 and b/310766628: Only use rec_sse in CBR mode.
    * Fix a hang of cmake on arm64 macOS with cmake 3.27.0 or later.

2023-11-30 v3.8.0
  This release includes new codec interfaces, compression efficiency and
  perceptual improvements, speedup and memory optimizations and many bug
  fixes. This release is ABI compatible with the last release.

  - New Features
    * New codec controls:
      * AV1E_SET_MAX_CONSEC_FRAME_DROP_CBR: Set the maximum number of
        consecutive frame drops allowed for the frame dropper in 1 pass
        CBR mode.
    * Run-time CPU feature detection for all Arm platforms:
      CRC, DotProd, I8MM and SVE CPU feature presence is detected at run
      time and code paths making use of these features are selected
      dynamically. These code paths provide meaningful performance gains
      for standard bitdepth RTC and VoD encoding: up to 10% and 20%
      respectively, over the Armv8.0-A baseline build.
    * RTC: Frame-dropper support added to the rate control library.
    * RTC Rate control improvements for low bitrate and for SVC.

  - Compression Efficiency Improvements
    * Improved accuracy of cost estimation for loop restoration and
      global motion.
    * Improved selection of loop restoration unit size - full search up
      to (non-realtime) speed 2, retuned static selection at higher
      speeds.
    * RTC Screen content mode: 3-5% bdrate gains across speeds 7 - 10.
    * Good-quality mode: 0.2 - 0.5% bdrate gains across speeds 1 - 4.

  - Perceptual Quality Improvements
    * RTC Screen: Improved visual quality for scrolling.
    * RTC: Improved color quality for both screen and video mode.

  - Speedup and Memory Optimizations
    * Good-quality, single-thread encoder speedups:
      o 15% improvement for speed 5.
      o 12% improvement for speed 6.
    * Arm standard bitdepth VoD (--good):
      o 8% speedup for speeds 0 and 1.
      o 20% speedup for speed 2.
      o 27% speedup for speed 3.
      o 30% speedup for speed 4.
      o 38% speedup for speeds 5 and 6.
    * Arm high bitdepth VoD (--good):
      o 206% speedup for speeds 0 and 1.
      o 180% speedup for speed 2.
      o 51% speedup for speeds 3 and 4.
      o 68% speedup for speed 5.
      o 72% speedup for speed 6.
    * RTC Screen content: 2-6% speedup across speeds 7-10.
    * RTC: 2-3% speedup for temporal layers.
    * RTC: Speedups to reference scaling in nonrd pickmode.
    * Good-quality mode: Simplified global motion estimation, saving
      ~1200 lines of code and 1KB of tables while improving quality.

  - Bug Fixes
    * Fixes to improve libaom stability in case of memory allocation
      failures.
    * Fixes to SIMD functions (x86 AVX2/SSE2 and ARM Neon).
    * b/310457427, b/310766628: Bug fixes to only use rec_sse in CBR
      mode.

2023-11-17 v3.7.1
  This release includes several bug fixes. This release is ABI
  compatible with the last release. See
  https://aomedia.googlesource.com/aom/+log/v3.7.0..v3.7.1 for all the
  commits in this release.

  - Bug Fixes
    * aomedia:3349: heap overflow when increasing resolution
    * aomedia:3478: GCC 12.2.0 emits a -Wstringop-overflow warning on
      aom/av1/encoder/motion_search_facade.c
    * aomedia:3489: Detect encoder and image high bit depth mismatch
    * aomedia:3491: heap-buffer-overflow on frame size change (CVE-2023-6879)
    * b/303023614:  Segfault at encoding time for high bit depth images

2023-08-10 v3.7.0
  This release includes new codec interfaces, compression efficiency and
  perceptual improvements, speedup and memory optimizations and many bug fixes.
  This release is ABI compatible with the last release.

  - New Features
    * New codec controls:
      * AV1E_SET_QUANTIZER_ONE_PASS: Set quantizer for each frame.
      * AV1E_ENABLE_RATE_GUIDE_DELTAQ: enable the rate distribution guided delta
        quantization in all intra mode. The "enable-rate-guide-deltaq" option is
        added for this control.
      * AV1E_SET_RATE_DISTRIBUTION_INFO: set the input file for rate
        distribution used in all intra mode. The "rate-distribution-info" option
        is added for this control.
      * AV1E_GET_LUMA_CDEF_STRENGTH
      * AV1E_SET_BITRATE_ONE_PASS_CBR
    * AOM_SCALING_MODE is extended to include 2/3 and 1/3 scaling.
    * aom_tune_metric is extended to include AOM_TUNE_VMAF_SALIENCY_MAP.
      The "tune" option is extended to include "vmaf_saliency_map".
    * SVC example encoder svc_encoder_rtc is able to use the rate control
      library.
    * Loopfilter level and CDEF filter level is supported by RTC rate control
      library.
    * New speed (--cpu-used) 11, intended for RTC screen sharing, added for
      faster encoding with ~3% bdrate loss with 16% IC (instruction count)
      speedup compared to speed 10.

  - Compression Efficiency Improvements
    * Improved VoD encoding performance
      * 0.1-0.6% BDrate gains for encoding speeds 2 to 6
      * Rate control accuracy improvement in VBR mode
    * RTC encoding improvements
      * Screen content mode: 10-19% BDrate gains for speeds 6 - 10
      * Temporal layers video mode, for speed 10:
        * 2 temporal layers on low resolutions: 13-15% BDrate gain
        * 3 temporal layers on VGA/HD: 3-4% BDrate gain

  - Perceptual Quality Improvements
    * Fixed multiple block and color artifacts for RTC screen content by
      * Incorporating color into RD cost for IDTX
      * Reducing thresholds for palette mode in non RD mode
      * Allowing more palette mode testing
    * Improved color sensitivity for altref in non-RD mode.
    * Reduced video flickering for temporal layer encoding.

  - Speedup and Memory Optimizations
    * Speed up the VoD encoder
      * 2-5% for encoding speed 2 to 4
      * 9-15% for encoding speed 5 to 6
      * ARM
        * Standard bitdepth
          * speed 5: +31%
          * speed 4: +2%
          * speed 3: +9%
          * speed 2: +157%
        * High bitdepth
          * speed 5: +85%
    * RTC speedups
      * Screen content mode
        * 15% IC speedup for speeds 6-8
        * ARM: 7% for speed 9, 3% for speed 10
      * Temporal layers video mode
        * 7% speedup for 3 temporal layers on VGA/HD, for speed 10
      * Single layer video
        * x86: 2% IC speedup for speeds 7-10
        * ARM: 2-4% speedup across speeds 5-10

  - Other improvements
    * VoD: Major improvements to global motion estimation, now enabled up to
      speed 4
    * RTC
      * Fixes to make lossless coding work.
      * Fixes to make frame dropper (--drop_frames) work for single and temporal
        layers.
      * Improvements to RPS (reference picture selection) recovery frames.
      * Improvements to rate control for temporal layers.
    * libwebm is updated to libwebm-1.0.0.29-9-g1930e3c

  - Bug Fixes
    * aomedia:3261 Assertion failed when encoding av1 with film grain and
      '--monochrome' flag
    * aomedia:3276 ensure all allocations are checked (partial fix)
    * aomedia:3451 The libaom library calls exit()
    * aomedia:3450 enable -Wshadow for C++ sources
    * aomedia:3449 Test Seg Faults After
      b459af3e345be402db052a143fcc5383d4b74cbd
    * aomedia:3416 prune unused symbols / restrict symbol visibility
    * aomedia:3443 Jenkins failure:
      UninstantiatedParameterizedTestSuite<EstimateNoiseTest>
    * aomedia:3434 realtime failures with CONFIG_BITSTREAM_DEBUG=1
    * aomedia:3433 DeltaqModeTest crash w/row_mt=0
    * aomedia:3429 Encoder crash when turn on both ExternalResize and
      g_threads > 2
    * aomedia:3438 Build failure with
      `-DSANITIZE=address -DBUILD_SHARED_LIBS=ON` when using clang.
    * aomedia:3435 Block artifacts when scrolling with AV1 in screen sharing
      scenarios
    * aomedia:3170 vmaf tune presets produce extreme glitches in one scene
    * aomedia:3401 Building shared libaom with MSVC results in a race condition
      with the export library
    * aomedia:3420 Floating point exception in av1_tpl_get_frame_importance()
    * aomedia:3424 heap-buffer-overflow in ScaleFilterCols_16_C() (SIGABRT)
    * aomedia:3417 examples/svc_encoder_rtc.c is using internal macros and
      functions
    * aomedia:3372 SEGV in assign_frame_buffer_p av1_common_int.h
    * aomedia:3130 'cpu-features.h' file not found on Android NDK 22
    * aomedia:3415 Encoder/decoder mismatch for svc_encoder_rtc running
      1 SL 3 TL
    * aomedia:3412 Lossless Mode Fails Loopback Bit Test
    * aomedia:3409 The use of AV1_VAR_OFFS in av1/encoder/var_based_part.c is
      incorrect for high bit depths
    * aomedia:3403 test_libaom fails with error message
      "feenableexcept() failed" on Linux arm
    * aomedia:3370 Random color block at fast motion area
    * aomedia:3393 Assertion failure in av1_convolve_2d_sr_c()
    * aomedia:3392 Strong artifacting for high bit-depth real-time
    * aomedia:3376 aomenc --threads=10 --deltaq-mode=3 crashes after
      "Allintra: multi-threading of calculating differential contrast"
    * aomedia:3380 Crashes and ASan and TSan errors in deltaq-mode=3
      multithreading code
    * chromium:1410766 heap-buffer-overflow in aom_yv12_copy_v_c
    * Cannot set level via AV1E_SET_TARGET_SEQ_LEVEL_IDX
    * Encoding failure due to the use of loop restoration with unintended use of
      lossless mode.
    * Signed integer overflow in scan_past_frames
    * Signed integer overflow in update_a_sep_sym
    * Flickering in AV1 1440p/2160p HDR transcodes
    * Fixed artifacts with screen share at encoder speed 10
    * Fixed prediction setup for IDTX

2023-05-08 v3.6.1
  This release includes several bug fixes. This release is ABI
  compatible with the last release. See
  https://aomedia.googlesource.com/aom/+log/v3.6.0..v3.6.1 for all the
  commits in this release.

  - Bug Fixes
    * aomedia:2871: Guard the support of the 7.x and 8.x levels for AV1
      under the CONFIG_CWG_C013 config flag, and only output the 7.x and
      8.x levels when explicitly requested.
    * aomedia:3382: Choose sb_size by ppi instead of svc.
    * aomedia:3384: Fix fullpel search limits.
    * aomedia:3388: Replace left shift of xq_active by multiplication.
    * aomedia:3389: Fix MV clamping in av1_mv_pred.
    * aomedia:3390: set_ld_layer_depth: cap max_layer_depth to
      MAX_ARF_LAYERS.
    * aomedia:3418: Fix MV clamping in av1_int_pro_motion_estimation.
    * aomedia:3429: Move lpf thread data init to lpf_pipeline_mt_init().
    * b:266719111: Fix undefined behavior in Arm Neon code.
    * b:269840681: nonrd_opt: align scan tables.
    * rtc: Fix is_key_frame setting in variance partition.
    * Build: Fix build with clang-cl and Visual Studio.
    * Build: Fix module definition file for MinGW/MSYS.

2023-02-03 v3.6.0
  This release includes compression efficiency and perceptual quality
  improvements, speedup and memory optimizations, and some new features.
  This release is ABI compatible with the last release.

  - New Features
    * New values 20-27 (corresponding to levels 7.0-7.3 and 8.0-8.3) for
      the encoder control AV1E_SET_TARGET_SEQ_LEVEL_IDX (note that the
      proposal to add the new levels are still in draft status). The
      original special value 24 (keep level stats only for level
      monitoring) is renumbered as 32.
    * New encoder control AV1E_SET_SKIP_POSTPROC_FILTERING to skip the
      application of post-processing filters on reconstructed frame in
      all intra mode.
    * New encoder option "kf-max-pyr-height": Maximum height of pyramid
      structure used for the GOP starting with a key frame (-1 to 5).
    * Make SVC work for screen content.
    * Rate control improvements to reduce frame-size spikes for screen
      content coding.
    * RISC-V architecture support with gcc toolchain.

  - Compression Efficiency Improvements
    * Peak compression efficiency in VOD setting is improved by 1%.
    * 0.7% - 2.2% RTC encoding BDrate gains for real time speed 8 to 10.
    * 15% RTC encoding BDrate gains for screen content speed 10.

  - Perceptual Quality Improvements
    * Resolved a visual quality issue that was reported for high
      resolution clips (2K) for speed 4 and above in VOD use case.
    * Visual quality improvements to screen content coding.
    * Quality improvements to temporal layer RTC coding.

  - Speedup and Memory Optimizations
    * RTC single-thread encoder speedup:
      o ~6% instruction count reduction for speed 5 and 6.
      o ~15% instruction count reduction for speed 7.
      o ~10% instruction count reduction for speed 8 to 10 (>=360p
        resolutions).
    * RTC multi-thread encoder speedup (beyond single-thread speedup):
      o 5-8% encode time reduction for speed 7 to 10.
    * RTC screen-content encoder speedup:
      o 11% instruction count reduction for speed 9 and 10 (>=720p
        resolutions).
    * ~5% reduction in heap memory requirements for RTC, speed 6 to 10.
    * AVIF:
      o 4-5% speedup for speed 9 in still-picture encoding mode.
      o 3-4% heap memory reduction in still-picture encoding mode for
        360p-720p resolutions with multiple threads.

  - Bug Fixes
    * Added a workaround for an AV1 specification bug which makes
      TRANSLATION type global motion models unusable.
    * Fixed AddressSanitizer global-buffer-overflow errors in
      av1/encoder/arm/neon/av1_fwd_txfm2d_neon.c.
    * Fixed AddressSanitizer heap-buffer-overflow error in
      av1_wiener_convolve_add_src_neon().
    * chromium:1393384 Avoid scene detection on spatial resize.
    * aomedia:3308 Remove color artifacts under high motion.
    * aomedia:3310 Avoid out of memory failures with Visual Studio 2017,
      2019, and 2022 for Win32 x86 builds.
    * aomedia:3346 Make SVC work properly for screen content.
    * aomedia:3348 Fix a bug where an uninitialized search_site is used.
    * aomedia:3365 Work around what seems like a Visual Studio 2022
      compiler optimization bug.
    * aomedia:3369 Incorrect PSNR values reported by libaom for 12-bit
      encode.

2022-08-31 v3.5.0
  This release is ABI compatible with the last one, including speedup and memory
  optimizations, and new APIs and features.

  - New Features
    * Support for frame parallel encode for larger number of threads. --fp-mt
      flag is available for all build configurations.
    * New codec control AV1E_GET_NUM_OPERATING_POINTS

  - Speedup and Memory Optimizations
    * Speed-up multithreaded encoding for good quality mode for larger number of
      threads through frame parallel encoding:
      o 30-34% encode time reduction for 1080p, 16 threads, 1x1 tile
        configuration (tile_rows x tile_columns)
      o 18-28% encode time reduction for 1080p, 16 threads, 2x4 tile
        configuration
      o 18-20% encode time reduction for 2160p, 32 threads, 2x4 tile
        configuration
    * 16-20% speed-up for speed=6 to 8 in still-picture encoding mode
    * 5-6% heap memory reduction for speed=6 to 10 in real-time encoding mode
    * Improvements to the speed for speed=7, 8 in real-time encoding mode
    * Improvements to the speed for speed=9, 10 in real-time screen encoding
      mode
    * Optimizations to improve multi-thread efficiency in real-time encoding
      mode
    * 10-15% speed up for SVC with temporal layers
    * SIMD optimizations:
      o Improve av1_quantize_fp_32x32_neon() 1.05x to 1.24x faster
      o Add aom_highbd_quantize_b{,_32x32,_64x64}_adaptive_neon() 3.15x to 5.6x
        faster than "C"
      o Improve av1_quantize_fp_64x64_neon() 1.17x to 1.66x faster
      o Add aom_quantize_b_avx2() 1.4x to 1.7x faster than aom_quantize_b_avx()
      o Add aom_quantize_b_32x32_avx2() 1.4x to 2.3x faster than
        aom_quantize_b_32x32_avx()
      o Add aom_quantize_b_64x64_avx2() 2.0x to 2.4x faster than
        aom_quantize_b_64x64_ssse3()
      o Add aom_highbd_quantize_b_32x32_avx2() 9.0x to 10.5x faster than
        aom_highbd_quantize_b_32x32_c()
      o Add aom_highbd_quantize_b_64x64_avx2() 7.3x to 9.7x faster than
        aom_highbd_quantize_b_64x64_c()
      o Improve aom_highbd_quantize_b_avx2() 1.07x to 1.20x faster
      o Improve av1_quantize_fp_avx2() 1.13x to 1.49x faster
      o Improve av1_quantize_fp_32x32_avx2() 1.07x to 1.54x faster
      o Improve av1_quantize_fp_64x64_avx2()  1.03x to 1.25x faster
      o Improve av1_quantize_lp_avx2() 1.07x to 1.16x faster

  - Bug fixes including but not limited to
    * aomedia:3206 Assert that skip_width > 0 for deconvolve function
    * aomedia:3278 row_mt enc: Delay top-right sync when intraBC is enabled
    * aomedia:3282 blend_a64_*_neon: fix bus error in armv7
    * aomedia:3283 FRAME_PARALLEL: Propagate border size to all cpis
    * aomedia:3283 RESIZE_MODE: Fix incorrect strides being used for motion
      search
    * aomedia:3286 rtc-svc: Fix to dynamic_enable spatial layers
    * aomedia:3289 rtc-screen: Fix to skipping inter-mode test in nonrd
    * aomedia:3289 rtc-screen: Fix for skip newmv on flat blocks
    * aomedia:3299 Fix build failure with CONFIG_TUNE_VMAF=1
    * aomedia:3296 Fix the conflict --enable-tx-size-search=0 with nonrd mode
      --enable-tx-size-search will be ignored in non-rd pick mode
    * aomedia:3304 Fix off-by-one error of max w/h in validate_config
    * aomedia:3306 Do not use pthread_setname_np on GNU/Hurd
    * aomedia:3325 row-multithreading produces invalid bitstream in some cases
    * chromium:1346938, chromium:1338114
    * compiler_flags.cmake: fix flag detection w/cmake 3.17-3.18.2
    * tools/*.py: update to python3
    * aom_configure.cmake: detect PIE and set CONFIG_PIC
    * test/simd_cmp_impl: use explicit types w/CompareSimd*
    * rtc: Fix to disable segm for aq-mode=3
    * rtc: Fix to color_sensitivity in variance partition
    * rtc-screen: Fix bsize in model rd computation for intra chroma
    * Fixes to ensure the correct behavior of the encoder algorithms (like
      segmentation, computation of statistics, etc.)

2022-06-17 v3.4.0
  This release includes compression efficiency and perceptual quality
  improvements, speedup and memory optimizations, and some new features.
  There are no ABI or API breaking changes in this release.

  - New Features
    * New --dist-metric flag with "qm-psnr" value to use quantization
      matrices in the distortion computation for RD search. The default
      value is "psnr".
    * New command line option "--auto-intra-tools-off=1" to make
      all-intra encoding faster for high bit rate under
      "--deltaq-mode=3" mode.
    * New rate control library aom_av1_rc for real-time hardware
      encoders. Supports CBR for both one spatial layer and SVC.
    * New image format AOM_IMG_FMT_NV12 can be used as input to the
      encoder. The presence of AOM_IMG_FMT_NV12 can be detected at
      compile time by checking if the macro AOM_HAVE_IMG_FMT_NV12 is
      defined.
    * New codec controls for the encoder:
      o AV1E_SET_AUTO_INTRA_TOOLS_OFF. Only in effect if
        --deltaq-mode=3.
      o AV1E_SET_RTC_EXTERNAL_RC
      o AV1E_SET_FP_MT. Only supported if libaom is built with
        -DCONFIG_FRAME_PARALLEL_ENCODE=1.
      o AV1E_GET_TARGET_SEQ_LEVEL_IDX
    * New key-value pairs for the key-value API:
      o --auto-intra-tools-off=0 (default) or 1. Only in effect if
        --deltaq-mode=3.
      o --strict-level-conformance=0 (default) or 1
      o --fp-mt=0 (default) or 1. Only supported if libaom is built
        with -DCONFIG_FRAME_PARALLEL_ENCODE=1.
    * New aomenc options (not supported by the key-value API):
      o --nv12

  - Compression Efficiency Improvements
    * Correctly calculate SSE for high bitdepth in skip mode, 0.2% to
      0.6% coding gain.
    * RTC at speed 9/10: BD-rate gain of ~4/5%
    * RTC screen content coding: many improvements for real-time screen
      at speed 10 (quality, speedup, and rate control), up to high
      resolutions (1080p).
    * RTC-SVC: fixes to make intra-only frames work for spatial layers.
    * RTC-SVC: quality improvements for temporal layers.
    * AV1 RT: A new passive rate control strategy for screen content, an
      average of 7.5% coding gain, with some clips of 20+%. The feature
      is turned off by default due to higher bit rate variation.

  - Perceptual Quality Improvements
    * RTC: Visual quality improvements for high speeds (9/10)
    * Improvements in coding quality for all intra mode

  - Speedup and Memory Optimizations
    * ~10% speedup in good quality mode encoding.
    * ~7% heap memory reduction in good quality encoding mode for speed
      5 and 6.
    * Ongoing improvements to intra-frame encoding performance on Arm
    * Faster encoding speed for "--deltaq-mode=3" mode.
    * ~10% speedup for speed 5/6, ~15% speedup for speed 7/8, and
      ~10% speedup for speed 9/10 in real time encoding mode
    * ~20% heap memory reduction in still-picture encoding mode for
      360p-720p resolutions with multiple threads
    * ~13% speedup for speed 6 and ~12% speedup for speed 9 in
      still-picture encoding mode.
    * Optimizations to improve multi-thread efficiency for still-picture
      encoding mode.

  - Bug Fixes
    * b/204460717: README.md: replace master with main
    * b/210677928: libaom disable_order is surprising for
      max_reference_frames=3
    * b/222461449: -DCONFIG_TUNE_BUTTERAUGLI=1 broken
    * b/227207606: write_greyscale writes incorrect chroma in highbd
      mode
    * b/229955363: Integer-overflow in linsolve_wiener
    * https://crbug.com/aomedia/2032
    * https://crbug.com/aomedia/2397
    * https://crbug.com/aomedia/2563
    * https://crbug.com/aomedia/2815
    * https://crbug.com/aomedia/3009
    * https://crbug.com/aomedia/3018
    * https://crbug.com/aomedia/3045
    * https://crbug.com/aomedia/3101
    * https://crbug.com/aomedia/3130
    * https://crbug.com/aomedia/3173
    * https://crbug.com/aomedia/3184
    * https://crbug.com/aomedia/3187
    * https://crbug.com/aomedia/3190
    * https://crbug.com/aomedia/3195
    * https://crbug.com/aomedia/3197
    * https://crbug.com/aomedia/3201
    * https://crbug.com/aomedia/3202
    * https://crbug.com/aomedia/3204
    * https://crbug.com/aomedia/3205
    * https://crbug.com/aomedia/3207
    * https://crbug.com/aomedia/3208
    * https://crbug.com/aomedia/3209
    * https://crbug.com/aomedia/3213
    * https://crbug.com/aomedia/3214
    * https://crbug.com/aomedia/3219
    * https://crbug.com/aomedia/3222
    * https://crbug.com/aomedia/3223
    * https://crbug.com/aomedia/3225
    * https://crbug.com/aomedia/3226
    * https://crbug.com/aomedia/3228
    * https://crbug.com/aomedia/3232
    * https://crbug.com/aomedia/3236
    * https://crbug.com/aomedia/3237
    * https://crbug.com/aomedia/3238
    * https://crbug.com/aomedia/3240
    * https://crbug.com/aomedia/3243
    * https://crbug.com/aomedia/3244
    * https://crbug.com/aomedia/3246
    * https://crbug.com/aomedia/3248
    * https://crbug.com/aomedia/3250
    * https://crbug.com/aomedia/3251
    * https://crbug.com/aomedia/3252
    * https://crbug.com/aomedia/3255
    * https://crbug.com/aomedia/3257
    * https://crbug.com/aomedia/3259
    * https://crbug.com/aomedia/3260
    * https://crbug.com/aomedia/3267
    * https://crbug.com/aomedia/3268
    * https://crbug.com/aomedia/3269
    * https://crbug.com/aomedia/3276
    * https://crbug.com/aomedia/3278
    * https://crbug.com/chromium/1290068
    * https://crbug.com/chromium/1303237
    * https://crbug.com/chromium/1304990
    * https://crbug.com/chromium/1321141
    * https://crbug.com/chromium/1321388
    * https://crbug.com/oss-fuzz/44846
    * https://crbug.com/oss-fuzz/44856
    * https://crbug.com/oss-fuzz/44862
    * https://crbug.com/oss-fuzz/44904
    * https://crbug.com/oss-fuzz/45056

2022-01-28 v3.3.0
  This release includes compression efficiency and perceptual quality
  improvements, speedup and memory optimizations, some new features, and
  several bug fixes.

  - New Features
    * AV1 RT: Introducing CDEF search level 5
    * Changed real time speed 4 to behave the same as real time speed 5
    * Add --deltaq-strength
    * rtc: Allow scene-change and overshoot detection for svc
    * rtc: Intra-only frame for svc
    * AV1 RT: Option 2 for codec control AV1E_SET_ENABLE_CDEF to disable
      CDEF on non-ref frames
    * New codec controls AV1E_SET_LOOPFILTER_CONTROL and
      AOME_GET_LOOPFILTER_LEVEL
    * Improvements to three pass encoding

  - Compression Efficiency Improvements
    * Overall compression gains: 0.6%

  - Perceptual Quality Improvements
    * Improves the perceptual quality of high QP encoding for delta-q mode 4
    * Auto select noise synthesis level for all intra

  - Speedup and Memory Optimizations
    * Added many SSE2 optimizations.
    * Good quality 2-pass encoder speedups:
      o Speed 2: 9%
      o Speed 3: 12.5%
      o Speed 4: 8%
      o Speed 5: 3%
      o Speed 6: 4%
    * Real time mode encoder speedups:
      o Speed 5: 2.6% BDRate gain, 4% speedup
      o Speed 6: 3.5% BDRate gain, 4% speedup
      o Speed 9: 1% BDRate gain, 3% speedup
      o Speed 10: 3% BDRate gain, neutral speedup
    * All intra encoding speedups (AVIF):
      o Single thread - speed 6: 8%
      o Single thread - speed 9: 15%
      o Multi thread(8) - speed 6: 14%
      o Multi thread(8) - speed 9: 34%

  - Bug Fixes
    * Issue 3163: Segmentation fault when using --enable-keyframe-filtering=2
    * Issue 2436: Integer overflow in av1_warp_affine_c()
    * Issue 3226: armv7 build failure due to gcc-11
    * Issue 3195: Bug report on libaom (AddressSanitizer: heap-buffer-overflow)
    * Issue 3191: Bug report on libaom (AddressSanitizer: SEGV on unknown
      address)
    * Issue 3176: Some SSE2/SADx4AvgTest.* tests fail on Windows
    * Issue 3175: Some SSE2/SADSkipTest.* tests fail on Windows

2021-10-13 v3.2.0
  This release includes compression efficiency and perceptual quality
  improvements, speedup and memory optimizations, as well as some new
  features.

  - New Features
    * Introduced speeds 7, 8, and 9 for all intra mode.
    * Introduced speed 10 for real time mode.
    * Introduced an API that allows external partition decisions.
    * SVC: added support for compound prediction.
    * SVC: added support for fixed SVC modes.

  - Compression Efficiency Improvements
    * Intra-mode search improvement.
    * Improved real time (RT) mode BDrate savings by ~5% (RT speed 5)
      and ~12% (RT speed 6). The improvement was measured on the video
      conference set.
    * Improved real time mode for nonrd path (speed 7, 8, 9): BDrate
      gains of ~3-5%.
    * Rate control and RD adjustments based on ML research in VP9.
      Gains of ~0.5-1.0% for HD.

  - Perceptual Quality Improvements
    * Added a new mode --deltaq-mode=3 to improve perceptual quality
      based on a differential contrast model for still images.
    * Added a new mode --deltaq-mode=4 to improve perceptual quality
      based on user rated cq_level data set for still images.
    * Weighting of some intra mode and partition size choices to better
      manage and retain texture.

  - Speedup and Memory Optimizations
    * Further improved 2-pass good quality encoder speed:
      o Speed 2 speedup: 18%
      o Speed 3 speedup: 22%
      o Speed 4 speedup: 37%
      o Speed 5 speedup: 30%
      o Speed 6 speedup: 20%
    * Optimized the real time encoder (measured on the video conference
      set):
      o RT speed 5 speedup: 110%
      o RT speed 6 speedup: 77%

  - Bug Fixes
    * Issue 3069: Fix one-pass mode keyframe placement off-by-one error.
    * Issue 3156: Fix a bug in av1_quantize_lp AVX2 optimization.

2021-09-29 v3.1.3
  This release includes several bug fixes.

  - Bug fixes:
    The following four cmake changes should help the people building
    libaom using MSVC.
      1. exports: use CMAKE_SHARED_LIBRARY_PREFIX to determine lib name
         https://aomedia-review.googlesource.com/c/aom/+/142342
      2. aom_install: Install lib dlls to bindir
         https://aomedia-review.googlesource.com/c/aom/+/146546
      3. aom_install: use relpath for install
         https://aomedia-review.googlesource.com/c/aom/+/146550
      4. aom_install: don't exclude msvc from install
         https://aomedia-review.googlesource.com/c/aom/+/146547

    aom/aom_encoder.h: remove configure option reference
    https://aomedia-review.googlesource.com/c/aom/+/146743

    Issue 3113: Tests for detecting chroma subsampling in
    av1_copy_and_extend_frame() do not work when y_width or y_height is
    1

    Issue 3115: image2yuvconfig() should calculate uv_crop_width and
    uv_crop_height from y_crop_width and y_crop_height

    Issue 3140: rc_overshoot_pct is documented as having a range of
    0-1000, but is range checked against 0-100

    Issue 3147: Build failure on Apple M1 arm64

2021-07-20 v3.1.2
  This release includes several bug fixes.

  - Bug fixes:
    exports.cmake: use APPLE and WIN32 and use def for mingw-w64
    https://aomedia-review.googlesource.com/c/aom/+/139882

    Issue 2993: Incorrect spatial_id when decoding base layer of
    multi-layer stream

    Issue 3080: Chroma Resampling by Encoder on Y4M Inputs Files Tagged
    as C420mpeg2

    Issue 3081: Use of uninitialized value $version_extra in
    concatenation (.) or string at aom/build/cmake/version.pl line 88.

2021-06-08 v3.1.1
  This release includes several bug fixes.

  - Bug fixes:
    Issue 2965: Cherry-picked the following four commits for the
    tune=butteraugli mode.
      1. Add libjxl to pkg_config if enabled:
         https://aomedia-review.googlesource.com/c/aom/+/136044
      2. Declare set_mb_butteraugli_rdmult_scaling static:
         https://aomedia-review.googlesource.com/c/aom/+/134506
      3. Add color range detection in tune=butteraugli mode:
         https://aomedia-review.googlesource.com/c/aom/+/135521
      4. Enable tune=butteraugli in all-intra mode:
         https://aomedia-review.googlesource.com/c/aom/+/136082

    Issue 3021: Fix vmaf model initialization error when not set to
    tune=vmaf

    Issue 3050: Compilation fails with -DCONFIG_TUNE_VMAF=1

    Issue 3054: Consistent crash on near-static screen content, keyframe
    related

2021-05-03 v3.1.0
  This release adds an "all intra" mode to the encoder, which significantly
  speeds up the encoding of AVIF still images at speed 6.

  - Upgrading:
    All intra mode for encoding AVIF still images and AV1 all intra videos:
    AOM_USAGE_ALL_INTRA (2) can be passed as the 'usage' argument to
    aom_codec_enc_config_default().

    New encoder control IDs added:
      - AV1E_SET_ENABLE_DIAGONAL_INTRA: Enable diagonal (D45 to D203) intra
        prediction modes (0: false, 1: true (default)). Also available as
        "enable-diagonal-intra" for the aom_codec_set_option() function.

    New aom_tune_metric enum value: AOM_TUNE_BUTTERAUGLI. The new aomenc option
    --tune=butteraugli was added to optimize the encoder's perceptual quality by
    optimizing the Butteraugli metric. Install libjxl (JPEG XL) and then pass
    -DCONFIG_TUNE_BUTTERAUGLI=1 to the cmake command to enable it.

    Addition of support for libvmaf 2.x.

  - Enhancements:
    Heap memory consumption for encoding AVIF still images is significantly
    reduced.

  - Bug fixes:
    Issue 2601: third_party/libaom fails licensecheck

    Issue 2950: Conditional expression for rc->this_key_frame_forced is always
    true in find_next_key_frame()

    Issue 2988: "make install" installs the aom.h header twice

    Issue 2992: Incorrectly printing the temporal_id twice in dump_obu tool

    Issue 2998:

    Issue 2999:

    Issue 3000:

2021-02-24 v3.0.0
  This release includes compression efficiency improvement, speed improvement
  for realtime mode, as well as some new APIs.

  - Upgrading:
    Support for PSNR calculation based on stream bit-depth.

    New encoder control IDs added:
      - AV1E_SET_ENABLE_RECT_TX
      - AV1E_SET_VBR_CORPUS_COMPLEXITY_LAP
      - AV1E_GET_BASELINE_GF_INTERVAL
      - AV1E_SET_ENABLE_DNL_DENOISING

    New decoder control IDs added:
      - AOMD_GET_FWD_KF_PRESENT
      - AOMD_GET_FRAME_FLAGS
      - AOMD_GET_ALTREF_PRESENT
      - AOMD_GET_TILE_INFO
      - AOMD_GET_SCREEN_CONTENT_TOOLS_INFO
      - AOMD_GET_STILL_PICTURE
      - AOMD_GET_SB_SIZE
      - AOMD_GET_SHOW_EXISTING_FRAME_FLAG
      - AOMD_GET_S_FRAME_INFO

    New aom_tune_content enum value: AOM_CONTENT_FILM

    New aom_tune_metric enum value: AOM_TUNE_VMAF_NEG_MAX_GAIN

    Coefficient and mode update can be turned off via
    AV1E_SET_{COEFF/MODE}_COST_UPD_FREQ.

    New key & value API added, available with aom_codec_set_option() function.

    Scaling API expanded to include 1/4, 3/4 and 1/8.

  - Enhancements:
    Better multithreading performance with realtime mode.

    New speed 9 setting for faster realtime encoding.

    Smaller binary size with low bitdepth and realtime only build.

    Temporal denoiser and its optimizations on x86 and Neon.

    Optimizations for scaling.

    Faster encoding with speed settings 2 to 6 for good encoding mode.

    Improved documentation throughout the library, with function level
    documentation, tree view and support for the dot tool.

  - Bug fixes:
    Aside from those mentioned in v2.0.1 and v2.0.2, this release includes the
    following bug fixes:

    Issue 2940: Segfault when encoding with --use-16bit-internal and --limit > 1

    Issue 2941: Decoder mismatch with --rt --bit-depth=10 and --cpu-used=8

    Issue 2895: mingw-w64 i686 gcc fails to build

    Issue 2874: Separate ssse3 functions from sse2 file.

2021-02-09 v2.0.2
  This release includes several bug fixes.

  - Bug fixes:
    Issue 2643: Modify the assertion in temporal filter intrinsics.

    Issue 2648: Fix unit test ThreadTestLarge.EncoderResultTest/49
    assertion failure.

    Issue 2869: Add -Wimplicit-function-declaration as C flag only.

    Issue 2878: Avoid memset in the av1_filter_intra_predictor module
    functions.

    Issue 2903: Fix a typo bug in apply_temporal_filter_planewise.

    Call av1_setup_frame_size() when dropping a frame in the
    encode_frame_to_data_rate() function in av1/encoder/encoder.c.

2020-11-25 v2.0.1
  This release includes two bug fixes.

  - Bug fixes:
    Issue 2723: Fix crash in chroma_check() when generating a monochrome
    encoded stream in real-time mode.

    Issue 2833: Fix crash on some input when reduced still picture header is
    used in real-time mode and speed >=7.

2020-05-07 v2.0.0 "Applejack"
  First official release of libaom.
  This release includes new real-time mode and SVC support.

  - Upgrading:
    AOM_SET_POSTPROC, AOM_CODEC_CAP_POSTPROC and AOM_CODEC_USE_POSTPROC are
    removed.

    AOM_SET_DBG_* is removed.

    Multi-resolution encoding is removed.

    put_frame and put_slice callbacks are removed.

  - Enhancements:
    Full-sweep document update for codec controls.

2018-06-28 v1.0.0
  AOMedia Codec Workgroup Approved version 1.0

2016-04-07 v0.1.0 "AOMedia Codec 1"
  This release is the first Alliance for Open Media codec.
