)]}'
{
  "log": [
    {
      "commit": "13bcfa0ea8556f355b7bfa9158a473a1723c442b",
      "tree": "b0b05634b32b563846f1c90ab3a530915641473b",
      "parents": [
        "8f126544519961bb3d5afe83455f4caf5d312d05"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Fri Oct 23 11:46:54 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Fri Oct 23 11:46:54 2026 -0700"
      },
      "message": "Better modulo counter cm-\u003eframe_presentation_time\n\npts64 % modulus is negative when pts64 is negative. Although pts64 may\nnever be negative, it is better to avoid this issue by switching to the\nexpression pts64 \u0026 (modulus - 1). This works because modulus is a power\nof 2.\n\nBug: b:444969593\nChange-Id: I9b8b3a677d593c3b0bfc692795f598d06592eac8\n"
    },
    {
      "commit": "8f126544519961bb3d5afe83455f4caf5d312d05",
      "tree": "ad7f84fce8191481f92e9f4c15253b9251da6063",
      "parents": [
        "4b76512ba1612e624f8944784c0484f10a65e204"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Wed Oct 21 12:35:39 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Wed Oct 21 15:34:56 2026 -0700"
      },
      "message": "Set cm-\u003eframe_presentation_time as modulo counter\n\nSet cm-\u003eframe_presentation_time as a module counter according to the AV1\nspecification. Section 6.8.24. Temporal point info semantics says:\n\n  The syntax element is signaled as a fixed length unsigned integer with\n  a length in bits given by frame_presentation_time_length_minus_1 + 1.\n  The frame_presentation_time is the remainder of a modulo\n  1 \u003c\u003c (frame_presentation_time_length_minus_1 + 1) counter.\n\nBug: b:444969593\nChange-Id: Iee4784f135236732194664998b72c11b391e3a06\n"
    },
    {
      "commit": "4b76512ba1612e624f8944784c0484f10a65e204",
      "tree": "1eb1c5ed81a5d3d3984d3e5cbe08e6dc2bb93775",
      "parents": [
        "628b60f00fe61a7cd90d809bca793e1024664190"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Wed Oct 21 10:59:35 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Wed Oct 21 12:41:32 2026 -0700"
      },
      "message": "Guard Avg16x16IntegerOverflow test w/ HIGHBITDEPTH\n\nGuard the EncodeAPI.Avg16x16IntegerOverflow test with\nCONFIG_AV1_HIGHBITDEPTH because it requires 12-bit support.\n\nUse ASSERT_EQ on the aom_codec_enc_init() call because the test should\nnot proceed further if aom_codec_enc_init() fails.\n\nBug: oss-fuzz:572842743\nChange-Id: I6e7dd9393cd46dcc3ef33055524fa29b269e322d\n"
    },
    {
      "commit": "628b60f00fe61a7cd90d809bca793e1024664190",
      "tree": "bd7532c34e49e85fea941e0623594b3e92c8cfe6",
      "parents": [
        "fb357ae8aca6ae49811719e0ccbde37fd77e031e"
      ],
      "author": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Wed Oct 21 17:35:18 2026 +0000"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Wed Oct 21 12:06:12 2026 -0700"
      },
      "message": "Only check 32-bit pts bound when decoder model timing is used\n\nIn av1_encode_strategy(), cm-\u003eframe_presentation_time is a 32-bit field\nonly written to the bitstream in write_tu_pts_info() when\nseq_params-\u003edecoder_model_info_present_flag \u003d\u003d 1 and\nseq_params-\u003etiming_info.equal_picture_interval \u003d\u003d 0.\n\nPreviously, av1_encode_strategy() unconditionally converted the 64-bit\nrelative timestamp (*time_stamp) to timebase units and returned\nAOM_CODEC_ERROR if pts64 \u003e UINT32_MAX, even when decoder model timing\ninfo was not enabled (the default). In long-running real-time encoding\nsessions using a 90 kHz RTP clock timebase (g_timebase \u003d {1, 90000}),\nthe relative timestamp exceeds UINT32_MAX after ~13.26 hours (2^32 /\n90000 seconds), causing aom_codec_encode() to fail with AOM_CODEC_ERROR.\n\nGuard the UINT32_MAX check and cm-\u003eframe_presentation_time assignment\nbehind decoder_model_info_present_flag \u0026\u0026 !equal_picture_interval,\nmatching write_tu_pts_info() in bitstream.c.\n\nBug: b:444969593\nChange-Id: I4585e844318ec341742f35407461825a9023b2c4\n"
    },
    {
      "commit": "fb357ae8aca6ae49811719e0ccbde37fd77e031e",
      "tree": "880223cfa7051b294d32800c0bcb29828f8ca292",
      "parents": [
        "5ef10cee81dc97b393c3b353ea60710187793d59"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Wed Oct 21 16:14:19 2026 +0200"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Wed Oct 21 10:45:58 2026 -0700"
      },
      "message": "rtc: Reset the IntraBC flag in setup_planes\n\nsetup_planes() builds the superblock prediction for the variance\npartitioning with the mode info of the superblock. Nonrd doesn\u0027t clear\nthe mode info between frames. e161f898a0 reset the fields this\nprediction reads, but not use_intrabc, so after a key frame coded with\nIntraBC the flag can still be set. The prediction then takes the\nIntraBC path and copies from the frame being coded instead of LAST.\nThose pixels are either not coded yet or being coded by another\nthread, so the partition depends on thread timing and on the thread\ncount.\n\nClear use_intrabc with the other fields.\n\nThe new AVxEncoderThreadRTIntraBCTest codes screendata.y4m with\nIntraBC, 2x2 tiles and row mt at speeds 7 to 11, and checks that 1, 2\nand 4 threads give the same output. It fails at every speed without\nthe fix and passes with it, in realtime only and default builds, on\narm and x86.\n\nOn a 2558x1372 screen recording at 4 threads with an active map,\nslower threads gave a stream that differed by 1 byte in two frames.\nWith the fix all 6 runs give the same stream. Encodes without IntraBC\nare bit exact.\n\nChange-Id: Iccd0c25edc6696a5ec57fa74740db64778c89349\n"
    },
    {
      "commit": "5ef10cee81dc97b393c3b353ea60710187793d59",
      "tree": "794f58a70082351e9b74bc74ad65f4afff8f58f9",
      "parents": [
        "483ff213fc8d8e0785958578ac85e0eaeefc91a8"
      ],
      "author": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Tue Oct 20 22:17:07 2026 +0000"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Wed Oct 21 09:49:41 2026 -0700"
      },
      "message": "rtc-svc: Fix initial avg_frame_qindex for VBR mode\n\nIn av1_init_layer_context(), initialize lp_rc-\u003eavg_frame_qindex[INTER_FRAME]\nand lp_rc-\u003eavg_frame_qindex[KEY_FRAME] to\n(lrc-\u003eworst_quality + lrc-\u003ebest_quality) / 2 when rc_cfg.mode \u003d\u003d AOM_VBR,\nmatching av1_primary_rc_init().\n\nPreviously, avg_frame_qindex was initialized to lrc-\u003eworst_quality even\nin VBR mode. In the tests in the issue below (L1T2 and L1T3), the AV1\nencoder defaults to VBR mode and uses fixed SVC mode. Prior to commit\nb7cd5ffb57 (\"rtc-svc: Fix refresh and unused ref_idx in\nset_ref_frame_config\"), refresh_frame.golden_frame was inadvertently set\nto 1 on TL0 inter frames, which boosted quality via get_gf_active_quality()\nand masked the worst_quality initialization. After b7cd5ffb57 set\ngolden_frame to 0 on TL0 frames, rc_pick_q_and_bounds_no_stats() used\ninter_minq[avg_frame_qindex[INTER_FRAME]] for active_best_quality,\nclamping frame Q near worst_quality (QP 53) and causing the SVC frame validation tests to fail.\n\nBug: b:575597357\nChange-Id: I3617f304efa08726eac2220bf66d0abf81b8119c\n"
    },
    {
      "commit": "483ff213fc8d8e0785958578ac85e0eaeefc91a8",
      "tree": "8cb621ecbcc046337954de269cbd3c8f7c231ce1",
      "parents": [
        "4096df61f9f86fbe3ab57f750e8b19ce3c4ba627"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Sat Oct 17 16:42:25 2026 +0200"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Wed Oct 21 09:42:47 2026 -0700"
      },
      "message": "rtc: Reset low variance flags per superblock\n\nx-\u003epart_search_info.variance_low is set only by\nav1_choose_var_based_partitioning(), but nonrd mode search reads it\nfor every block through force_skip_low_temp_var to decide whether to\nsearch GOLDEN, and NEWMV on 64x64 blocks. Superblocks with a fixed\npartition, such as those with a skip segment or the fixed 32x32\npartition for high motion screen content, don\u0027t run the variance\npartitioning, so their blocks read the flags of an earlier\nsuperblock. Each thread starts the frame with a copy of the main\nthread\u0027s state, so with row mt the flags depend on thread timing.\n\nClear the flags at the start of every superblock.\n\nChecked with row mt at 4 threads in a realtime only build, on arm and\nx86. An ROI map that skips segment 0 in every superblock, 640x480\ncamera, speed 9: 2 different streams in 30 runs before, 1 after. A\n720p camera clip at speed 11 without a map: up to 3 streams in 12\nruns before, 1 after. A 1080p screen recording with fast window\nmotion and an active map: 2 streams in 16 runs before, 1 after.\n\nAt 1 thread screen content is bit exact. Camera clips can change a\nlittle, because 1 thread read stale flags too. The new\nROIMapThreadTest checks that 1, 2 and 4 threads give the same output.\n\nChange-Id: I81f749afededbedc1b9950b27f99c0cbfd23e8a5\n"
    },
    {
      "commit": "4096df61f9f86fbe3ab57f750e8b19ce3c4ba627",
      "tree": "68633a5892a53f4eb9010124fbbecfff4cad150e",
      "parents": [
        "d81c970e4d89a8a0935902b86f787a88619906f2"
      ],
      "author": {
        "name": "Alejandro Pacheco",
        "email": "alepacheco99@gmail.com",
        "time": "Tue Oct 20 00:22:58 2026 +0200"
      },
      "committer": {
        "name": "Jerome Jiang",
        "email": "jianj@google.com",
        "time": "Tue Oct 20 13:56:02 2026 -0400"
      },
      "message": "Use the allocated stride for the coefficient buffer\n\nav1_alloc_txb_buf() sizes coeff_buffer_base for the forced maximum\nframe width at allocation time, but av1_get_cb_coeff_buffer() computes\nthe stride from the current oxcf forced_max_frame_width. Raising\ng_forced_max_frame_width with aom_codec_enc_config_set() without\nchanging the frame size does not reallocate the buffer, so the stride\ngrows and the offsets for later superblock rows point past the end of\nthe buffer (heap buffer overflow read in\nav1_update_and_record_txb_context()).\n\nStore the stride when the buffer is allocated, reset it when the buffer\nis freed, and use it in av1_get_cb_coeff_buffer().\n\nThe new tests raise the forced maximum frame size after the first frame\nin realtime and good quality mode. ASan reports a heap buffer overflow\nwithout the fix.\n\nBug: 573358005\nChange-Id: I8c1784a059848b973a8e2430311428ccaac61fc5\n"
    },
    {
      "commit": "d81c970e4d89a8a0935902b86f787a88619906f2",
      "tree": "eca9a9d344ca33fa0284ab8c9d17a43c745f8335",
      "parents": [
        "9440aeedd097343b763dfe1c75af72c99f4a3175"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Sat Oct 17 07:55:30 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Oct 20 09:34:24 2026 -0700"
      },
      "message": "Fix integer overflow when accumulating avg_16x16\n\nFix the following UBSan error by declaring the avg_16x16 array as\nint64_t instead of int:\n\naom/av1/encoder/var_based_part.c:1180:42: runtime error:\nsigned integer overflow: 1538995776 + 789353984 cannot be represented in\ntype \u0027int\u0027\n\nFix the following UBSan error by performing the multiplication in\nint64_t instead of uint32_t:\n\nav1/encoder/var_based_part.c:111:17: runtime error:\nunsigned integer overflow: 256 * 43468404 cannot be represented in type\n\u0027uint32_t\u0027 (aka \u0027unsigned int\u0027)\n\nI only fixed the symptom. I did not look into whether there was a deeper\nproblem.\n\nTested: test_libaom --gtest_filter\u003dEncodeAPI.Avg16x16IntegerOverflow\n\nBug: oss-fuzz:572842743\nChange-Id: Iae452cc0ec5bf3f06b298ccbe839b8be5e8d6a3b\n"
    },
    {
      "commit": "9440aeedd097343b763dfe1c75af72c99f4a3175",
      "tree": "988b00c410ba1273c1835f720e298e183db472d5",
      "parents": [
        "4a8ea86713ded9624a0632c8644370cef4b6ef21"
      ],
      "author": {
        "name": "Ranjit Kumar Tulabandu",
        "email": "ranjit.tulabandu@ittiam.com",
        "time": "Thu Oct 15 20:08:28 2026 +0530"
      },
      "committer": {
        "name": "Yunqing Wang",
        "email": "yunqingwang@google.com",
        "time": "Mon Oct 19 14:41:37 2026 -0700"
      },
      "message": "Prune interintra search using top smooth interintra RD\n\nThis CL tracks the top N estimated RD Costs for smooth\ninterintra mode per coding unit. If the current estimated\nRD cost of smooth interintra mode exceeds the Nth-best cost,\ninterintra mode is skipped. The speed feature\nskip_interintra_using_top_smooth_rd_lvl configures N\u003d2 for\nspeed 1 and N\u003d1 for speed 2.\n\nEncoder performance results averaged over all resolutions are\nas follows:\n   Instruction Count          BD-Rate Loss(%)\ncpu   Reduction(%)   avg.psnr  ssim    vmaf   vmaf_neg  uvq_1p5\n 1        4.162       0.0686  0.0924  0.044    0.0492   0.2235\n 2        2.752       0.0511  0.0589  0.0144   0.06     0.6322\n\nSTATS_CHANGED for speed \u003d 1,2\n\nChange-Id: Iddc646028e011068a9f48aa5cf46cd040e9bcb3c\n"
    },
    {
      "commit": "4a8ea86713ded9624a0632c8644370cef4b6ef21",
      "tree": "538a7666649e98c978ef2a84d4e4b2e5f497a650",
      "parents": [
        "33b6f7d5e8be35e4a176cd7a19447b469c500d28"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Sat Oct 10 19:42:31 2026 +0200"
      },
      "committer": {
        "name": "Jerome Jiang",
        "email": "jianj@google.com",
        "time": "Mon Oct 19 10:29:40 2026 -0700"
      },
      "message": "Remove the per SB exit check in loop filter rows\n\nIn the horizontal pass, av1_thread_loop_filter_rows() locked the shared\njob_mutex for every superblock only to read lf_mt_exit. With row\nmultithreading every worker takes that lock thousands of times per frame\nand the workers wait on each other.\n\nOn error, av1_set_vert_loop_filter_done() now writes LF_SYNC_EXIT into\nthe column counter of every row, under the row mutex, and wakes the\nwaiting workers. sync_read() already holds that mutex, so it reports\nthe exit and the horizontal pass stops. sync_write() keeps the larger\nvalue, so the exit value stays.\n\nThis applies to every multithreaded loop filter run, in the encoder and\nthe decoder. The output does not change.\n\nEncode time saved, screen recordings at RT speed 11 with 64x64\nsuperblocks, aq mode 0 and the loop filter on every frame, median of\npaired runs. 0.0% is within the noise. With the default 128x128\nsuperblocks or when cyclic refresh turns the loop filter off, the\nchange is much smaller.\n\n                              2 thr   4 thr   8 thr  12 thr\n  Apple M3 Pro, macOS\n    2560x1440, active map      0.0%    8.3%   10.7%    7.1%\n    2559x1372, active map      3.5%    6.5%    8.1%    6.9%\n    2560x1440, no map          0.0%    0.0%    4.1%    8.8%\n    2559x1372, no map          0.0%    0.0%    5.4%    8.5%\n  Ryzen 9 5900X, Windows\n    2560x1440, active map      0.0%    0.0%    4.2%    4.6%\n    2559x1372, active map      0.0%    0.0%    3.1%    3.9%\n    2560x1440, no map          0.0%    0.0%    3.5%    4.0%\n    2559x1372, no map          0.0%    0.0%    2.2%    2.4%\n\nChange-Id: I7278541d130e13433ed7cdc2c931332fd183df20\n"
    },
    {
      "commit": "33b6f7d5e8be35e4a176cd7a19447b469c500d28",
      "tree": "2835e9c948d04ac27c817f50ef2feaf32de03f06",
      "parents": [
        "5d7dc4b2b95c2b2fa7879699b782971c491348ef"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Mon Oct 12 09:15:42 2026 +0200"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Mon Oct 19 10:06:08 2026 -0700"
      },
      "message": "Match the decoder\u0027s prev segment map on resize\n\nThe encoder took cm-\u003elast_frame_seg_map from the previous frame\nwhatever its size. After a frame size change it read that map with the\nnew mi_cols, past its end when the previous frame was smaller, and\nbuilds with asserts could stop on segment_id \u003c MAX_SEGMENTS in\nget_segment_id(). When the map isn\u0027t updated on that frame, the\nencoder also took the segment ids from it, while the decoder uses\nsegment 0 for every block, so the stream fails to decode.\n\nUse the previous map only when its size matches, like the decoder.\nWhen the map isn\u0027t updated and there is no previous map, clear the\nframe\u0027s map as the decoder does, so the next frame predicts from the\nsame map.\n\nThe new test sets an active map once and codes one frame at half\nsize. Without this change every case fails to decode.\n\nChange-Id: Ia41c857cfbc1f94bff97fa47a0c4469c06aa2095\n"
    },
    {
      "commit": "5d7dc4b2b95c2b2fa7879699b782971c491348ef",
      "tree": "28c5df1f2580f0121d304f78c4c529ee4c188170",
      "parents": [
        "7d61ce8d764648a443363f3dbbc20dcf111a85f0"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Wed Oct 14 15:05:53 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Sun Oct 18 18:16:17 2026 -0700"
      },
      "message": "Add a placeholder for next version in CHANGELOG\n\nThis allows us to start describing changes in the next libaom release.\n\nNote: The second word in this line must not start with \"v\", otherwise\nbuild/cmake/version.pl will parse the second word as the current\nversion.\n\nChange-Id: Iafc1317249e71e68b9f78617445b814a5dd5504e\n"
    },
    {
      "commit": "7d61ce8d764648a443363f3dbbc20dcf111a85f0",
      "tree": "4c865755edc34f328427346c5108d90e36d7654a",
      "parents": [
        "a01bb1dddef8acf39a330dfc21b313518ad47576"
      ],
      "author": {
        "name": "clang-format",
        "email": "noreply@google.com",
        "time": "Sat Oct 03 17:36:53 2026 -0700"
      },
      "committer": {
        "name": "James Zern",
        "email": "jzern@google.com",
        "time": "Fri Oct 16 16:54:58 2026 -0700"
      },
      "message": "apply clang-format-21\n\n(Debian clang-format version 21.1.8 (3))\n\nNo options in .clang-format needed to be updated.\n`ConstructorInitializerAllOnOneLineOrOnePerLine` is deprecated, but\nstill functional.\n\nBug: 569277013\nChange-Id: Ia3c4d1536311febad5e1fe703bad5e941c342dce\n"
    },
    {
      "commit": "a01bb1dddef8acf39a330dfc21b313518ad47576",
      "tree": "7db05558c953e9cfd85656671f12fedc68195bf2",
      "parents": [
        "394f9f7df624e4268fd8c894ead9f059d279e480"
      ],
      "author": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Fri Oct 16 03:58:41 2026 +0000"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Fri Oct 16 05:08:50 2026 +0000"
      },
      "message": "rtc: Clamp forced NEWMV vectors in handle_inter_mode_nonrd\n\nIn handle_inter_mode_nonrd(), when NEWMV reuses the superblock motion\nvector (x-\u003esb_me_mv, searched relative to (0, 0)) or an inter-layer SVC\nmotion vector (force_mv_inter_layer), search_new_mv() is bypassed. As a\nresult, the motion vector was not constrained relative to the block\u0027s\nreference MV predictor (ref_mv), allowing |mv - ref_mv| to exceed MV_MAX\n(MV_CLASS_10) during bitstream encoding, and leaving rate_mv at 0.\n\nClamp the forced NEWMV motion vector to SubpelMvLimits around ref_mv,\nskip NEWMV if the clamped vector equals ref_mv, and compute rate_mv\nvia av1_mv_bit_cost().\n\nUnittest added.\n\nBug: 574032795\nChange-Id: Ib688ce9b4a852a12ba755a281ab532332ffa6126\n"
    },
    {
      "commit": "394f9f7df624e4268fd8c894ead9f059d279e480",
      "tree": "2b6feb6eb908817392d3c626207b538e86589ec0",
      "parents": [
        "5cc71c7f89ec9b85a50fec006885a23027f9d95d"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Thu Oct 15 11:48:36 2026 +0200"
      },
      "committer": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Thu Oct 15 20:15:19 2026 +0200"
      },
      "message": "Add SSE2 and AVX2 palette centroid kernels\n\nAdd SSE2 and AVX2 versions of av1_calc_centroids_dim1(). They work the\nsame way as the Neon version: the leftover pixels in C first, then one\npass for each pair of centroids over 16 pixels at a time, a single pass\nfor the last centroid when k is odd, and the same empty cluster\nfallback and rounding as C.\n\nA byte compare on the indices gives the pixels of the centroid. The\nmask is widened to 16 bits, the data is masked and added up in 32 bit\nlanes with madd, and the mask itself is added up in 16 bit lanes for\nthe count. Neither can overflow for n up to 32768, and all sums are\nexact integers, so the result equals C. The test now also checks the\nSSE2 and AVX2 versions against C.\n\nOn a Ryzen 9 5900X with MSVC, the kernel is 2.2 to 6.1 times faster\nwith SSE2 and 2.5 to 7.8 times faster with AVX2 for 64 and 256 pixel\nblocks. On 2560x1440 screen recordings the encoder takes 1.5% to 2.4%\nless time.\n\nChange-Id: I914c0a83b83bb4f58d0a73c263bc6e68791c6f92\n"
    },
    {
      "commit": "5cc71c7f89ec9b85a50fec006885a23027f9d95d",
      "tree": "5fe13cc84e517940534f55ae53e27d767c503984",
      "parents": [
        "71ccfafa26cd4f69aed50aecb8d7ddcdaec22a4a"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Thu Oct 15 19:37:24 2026 +0200"
      },
      "committer": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Thu Oct 15 19:37:24 2026 +0200"
      },
      "message": "Add a Neon version of the k-means centroid step\n\nThe centroid step of av1_k_means() was a static C function. Its loop\nupdates one counter and one sum per pixel, and when neighboring pixels\npick the same color each update waits on the store of the one before.\n\nMove it into RTCD as av1_calc_centroids_dim1() and dim2(), the same\nway as av1_calc_indices, and add a Neon version for dim1 that counts\nand sums two centroids per pass, 16 pixels per step. The empty cluster\nfallback and the rounding are the same as in C, so the output does not\nchange. Add a test that checks the Neon version against C.\n\nOn real palette inputs the Neon version is 3.9 to 4.8 times faster. On\n2560x1440 screen recordings the encoder uses up to 5.5% fewer cycles.\n\nChange-Id: I3b5e8e2c2a4e9358875377ab3297aa2f5a6c63fa\n"
    },
    {
      "commit": "71ccfafa26cd4f69aed50aecb8d7ddcdaec22a4a",
      "tree": "0db750c0aa18eb6aaba6c82feae601f8cfcebd4e",
      "parents": [
        "337454c2c41b0878a6ce24c53c03eb26592a624f"
      ],
      "author": {
        "name": "Samuthirika",
        "email": "samuthirika.s@ittiam.com",
        "time": "Fri Sep 18 18:04:52 2026 +0530"
      },
      "committer": {
        "name": "Yunqing Wang",
        "email": "yunqingwang@google.com",
        "time": "Wed Oct 14 15:36:06 2026 -0700"
      },
      "message": "Disable compound prediction in TPL for speed 1\n\nThe CL extends the TPL sf setting \u0027allow_compound_pred \u003d 0\u0027\nfrom speed 2 to speed 1.\n\nEncoder performance results averaged over all resolutions are\nas follows:\n   Instruction Count          BD-Rate Loss(%)\ncpu   Reduction(%)   avg.psnr  ssim    vmaf   vmaf_neg  uvq_1p5\n 1       3.371       -0.0988  0.1752  0.0371  -0.0065   0.1989\n\nSTATS_CHANGED for speed \u003d 1\n\nChange-Id: I8ba693a52685137b561c82b50b4d671365a362b6\n"
    },
    {
      "commit": "337454c2c41b0878a6ce24c53c03eb26592a624f",
      "tree": "2e8beebba577a079a31f3f2114237b7415a225a7",
      "parents": [
        "9f2b2beb14ade7b4592cbc79621fcb2e00ebdeb5"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Tue Oct 13 11:11:35 2026 +0200"
      },
      "committer": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Wed Oct 14 21:13:32 2026 +0200"
      },
      "message": "rtc: Fix the map returned by AV1E_GET_ACTIVEMAP\n\nav1_get_active_map() kept the VP9 layout. It walked mi_rows \u003e\u003e 2 by\nmi_cols \u003e\u003e 2 blocks but read enc_seg.map at mi (2 * r, 2 * c), which is\nthe VP9 8x8 mi grid. In AV1 a 16x16 block is 4x4 mi, so each block was\nread from the wrong place. The loop bounds also round down, so when the\nframe ends halfway through a 16x16 block (mi_cols or mi_rows % 4 \u003d\u003d 2)\nthe last column or row was never read and kept its memset value.\n\nenc_seg.map is also the wrong source. av1_apply_active_map() only copies\nthe map into it at encode time, so a get right after a set returns old\ncontent (all active before the first frame). With aq 3, cyclic refresh\nwrites the coded segment ids back into it, so after a frame it no longer\nmatches the map that was set.\n\nRead cpi-\u003eactive_map.map instead, with the same indexing as\nav1_set_active_map(). The getter now returns the map the application\nset, not the segment map of the last frame. Every mi of a 16x16 block\nholds the same value there, so the top left mi is enough. When the map\nis off, for example after a key frame, all blocks still read as active.\n\nAdd GetActiveMapTest. It sets an asymmetric map on a 200x136 frame, so\nthe last column and row are partial, mirrors it on odd frames, and\nchecks the get after each set and after each inter frame.\n\nRepro before this change: 208x144 or 200x136, speed 9, aq 0 or 3, the\nleft 6 of 13 block columns inactive plus a few blocks on the last row\nand column. Every get returned 23 to 61 of 117 blocks wrong, in both a\ndefault and a CONFIG_REALTIME_ONLY build.\n\nChange-Id: Ic1ed075396e506d62cb697e980770560bbce3624\n"
    },
    {
      "commit": "9f2b2beb14ade7b4592cbc79621fcb2e00ebdeb5",
      "tree": "04d5fcab0144c61deffb08bd6625a1df9539a0fa",
      "parents": [
        "e1a1942e2dcb4ae5154a6ec8d9f78e4089cc3487"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Mon Oct 12 13:03:58 2026 +0200"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Wed Oct 14 11:34:05 2026 -0700"
      },
      "message": "rtc: Signal one CDEF strength when both are 0\n\nWith skip_cdef_sb on, av1_pick_cdef_from_qp() signals two CDEF\nstrengths: the one picked from q, and 0 for the blocks that skip CDEF.\nWhen the strength picked from q is 0 too, the second entry adds\nnothing, but the frame still sets cdef_bits to 1. Every 64x64 unit with\ncoded residual then spends a bit on its strength index, and the decoder\nruns CDEF over the whole frame, because it only skips CDEF when\ncdef_bits is 0 and the first strengths are 0.\n\nThis is the usual case for screen content at speed 11 at low and medium\nq. On two 2560x1440 screen recordings at qindex 32 to 52, every frame\nhad both strengths at 0.\n\nSignal a single strength of 0 instead. The decoded frames stay the\nsame. On those recordings the stream is 0.07% to 0.18% smaller, and\nthe libaom decoder skips CDEF. Its CPU time drops by 1% to 4.5% in 7 of\n8 runs (4:2:0 and 4:4:4, 1 and 4 encoder threads) and rises 0.7% in the\neighth.\n\nChange-Id: I4ffcd85e15483ff5040176794e01f755f890ab51\n"
    },
    {
      "commit": "e1a1942e2dcb4ae5154a6ec8d9f78e4089cc3487",
      "tree": "a900102450f27efda64f9fbcb076becae8f310d8",
      "parents": [
        "b7cd5ffb57a80883551a69be9fec05e5f4520eb0"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Sat Oct 10 19:42:31 2026 +0200"
      },
      "committer": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Wed Oct 14 17:34:34 2026 +0200"
      },
      "message": "rtc: Skip loop filter on mostly inactive frames\n\nAt speed 10 and up, screen content skips the loop filter when more\nthan thresh_active_maps_skip_lf_cdef (90) percent of the blocks are\ninactive. The check sits in av1_cyclic_refresh_disable_lf_cdef(), and\nav1_pick_filter_level() only calls that with aq mode 3. With any other\naq mode, an active map never gets the skip.\n\nMove the active map check into av1_pick_filter_level() so it applies to\nevery aq mode. The cyclic refresh checks still need aq mode 3 and run in\nthe same order, so aq mode 3 output does not change. Rename\nav1_cyclic_refresh_disable_lf_cdef() to av1_cyclic_refresh_disable_lf(),\nsince it no longer has anything to do with CDEF.\n\nTo see it, encode screen content at speed 11 with aq mode 0 and a map\nthat marks over 90% of the blocks inactive. The loop filter now runs on\nnone of those frames.\n\nTested on two 2560x1440 screen recordings with an active map from frame\ndiffs (speed 11, aq 0, q 8 to 13, VBR). 94% and 80% of the frames are\nover the threshold. With 4 threads the encoder uses 9.6 to 12.2% fewer\ncycles on the static recording and about 4% fewer on the other one, and\nthe decoder 12 to 29% fewer. Size grows 0.2 to 1.0% on the static\nrecording and stays the same on the other one. With a fixed 5% active\nmap, the BD rate on the active area is +0.04% and +1.1%.\n\nChange-Id: I4f1455beaaba69518b8aa3dd611f4f2ffae6b75e\n"
    },
    {
      "commit": "b7cd5ffb57a80883551a69be9fec05e5f4520eb0",
      "tree": "2bd2d765e1aad5ee4d7bbbb1b1b797168d5984c7",
      "parents": [
        "d6e868f44e202eb917503e2e850d7219575878f6"
      ],
      "author": {
        "name": "Erik Språng",
        "email": "sprang@google.com",
        "time": "Thu Oct 08 09:39:43 2026 +0200"
      },
      "committer": {
        "name": "Erik Språng",
        "email": "sprang@google.com",
        "time": "Wed Oct 14 00:03:26 2026 -0700"
      },
      "message": "rtc-svc: Fix refresh and unused ref_idx in set_ref_frame_config\n\nWith AV1E_SET_SVC_REF_FRAME_CONFIG, refresh[] is indexed by buffer slot\nand the ref_idx[] entries of unused references are don\u0027t-cares, but:\n\n- A slot was only refreshed, and its refresh tracked, if a ref_idx[]\n  entry pointed to it.\n- Refreshing a slot that an unused reference pointed to (e.g. slot 0\n  in a zero-initialized config) could make the frame a golden/altref\n  update, which affects rate control and RD decisions.\n- All seven references are signaled, and decoders reject frames with\n  a reference of invalid size, e.g. from another spatial layer. With\n  one spatial layer and no order hints, the bitstream writer replaced\n  unused references, but the encoder did not, which could break frame\n  size signaling.\n\nBuild the refresh mask from refresh[], only classify refreshes of used\nreferences, and without order hints, remap unused references to the\nfirst used one in the encoder instead of the bitstream writer. With\norder hints, unused references also affect decoding (e.g. temporal MV\nprojection), so they are left as configured.\n\nOnly encoders using set_ref_frame_config, directly or via fixed SVC\nmode, are affected. For the affected svc_encoder_rtc layering modes,\nBD-rate changes have no consistent direction (mean -0.02%).\n\nAlso update the aom_svc_ref_frame_config_t comments in aomcx.h to\ndescribe the new behavior.\n\nBug: webrtc:496266459\nChange-Id: I2bb6a2274c0a441af54709928edec6a4f8661be0\n"
    },
    {
      "commit": "d6e868f44e202eb917503e2e850d7219575878f6",
      "tree": "dbd90c1f6fc273720a9c4aa4ac0c9feedc0ff91f",
      "parents": [
        "3ed2cbebb758ac7619cc94b33ffafcbcaefc6283"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Wed Oct 07 12:26:59 2026 +0200"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Tue Oct 13 16:51:32 2026 -0700"
      },
      "message": "rtc: Keep the active map across SVC layer restore\n\nWith SVC, av1_restore_layer_context() copies the layer rate control\nstate into cpi-\u003erc during encode. The active map control runs before\nthat, so the copy overwrites percent_blocks_inactive with the layer\nvalue, which is always 0. av1_apply_active_map() then sees no inactive\nblocks and turns the map off. The active map never works with temporal\nlayers.\n\nKeep percent_blocks_inactive across the restore, like frames_since_key.\nOnly do it with one spatial layer. The map is stored at full\nresolution, and lower spatial layers would read it with their own\nmi_cols, so spatial SVC keeps the map off as before.\n\nAdd ActiveMapSvcTest. With every block inactive, each frame after the\nkey frame should be under 200 bytes. Without the fix the L1T2 cases\nfail with frames of 269 to 3354 bytes.\n\nChange-Id: I051668f84117eec91daf08acbda96b8727d17b12\n"
    },
    {
      "commit": "3ed2cbebb758ac7619cc94b33ffafcbcaefc6283",
      "tree": "15c0e12831a383868823d947e8971f6c1c3c62ca",
      "parents": [
        "f931b30a90071d03b710be9ed61d7413f8c369a4"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Fri Oct 09 18:25:28 2026 +0200"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Tue Oct 13 15:13:17 2026 -0700"
      },
      "message": "rtc: Copy inactive superblocks with whole rows\n\nIn the nonrd path a skip segment superblock is coded as one GLOBALMV\nblock with a zero motion vector, so its prediction is a plain copy of\nthe reference. encode_superblock() built it block by block and plane\nby plane through av1_enc_build_inter_predictor(). On screen\nrecordings with a mostly inactive map, that copy was the top encoder\nfunction in profiles and took 10 to 30 percent of the single thread\nencode time. Copying tall, narrow blocks is slow on memory: a 1440p\nI420 frame takes 0.62 ms in 64x64 blocks and 0.25 ms in whole rows.\n\nWhen a superblock row starts, copy each run of skip segment\nsuperblocks from its reference with whole rows. encode_superblock()\nthen skips the prediction build for these blocks. A block that is not\na zero motion vector copy of the same reference still builds its\nprediction over the copy. The copy is limited to 8 bit buffers and to\nunscaled references with identity global motion. Frames without a\nskip segment, like cyclic refresh frames, skip the row pass.\n\nThe output does not change. Two 2560x1440 screen recordings, speed\n11, screen content, an active map from frame differences, Apple M3\nPro: encoder cycles per frame drop by 6 to 18 percent with 1 thread\nand by 4 to 12 percent with 4 threads and row mt.\n\nChange-Id: I9f7070aed11927a0d9aae4ab851bafaaadcc3563\n"
    },
    {
      "commit": "f931b30a90071d03b710be9ed61d7413f8c369a4",
      "tree": "a7727853894239659bb3814a7d7702989ad2ddf2",
      "parents": [
        "b57fd4438bf9db9c48b6c9743e7bcdc53ad9aac8"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Tue Oct 13 16:48:51 2026 +0200"
      },
      "committer": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Tue Oct 13 16:48:51 2026 +0200"
      },
      "message": "Decode to 8-bit in IntraBC border test\n\nEncodeAPI.IntraBCMultiThreadBorderExtension compares the MD5 of the\nencoder reconstruction with the decoder output. With\nFORCE_HIGHBITDEPTH_DECODING\u003d1 the decoder returns 16-bit images for an\n8-bit stream, but the reconstruction stays 8-bit. MD5::Add() hashes 2\nbytes per sample for high bitdepth images, so the hashes never match\nand every frame fails, including the key frame.\n\nSet allow_lowbitdepth in the test decoder config, like\nencode_test_driver.cc does.\n\nChange-Id: Ifb490e7c41c2b79673216bf370a9e918dc3d3e14\n"
    },
    {
      "commit": "b57fd4438bf9db9c48b6c9743e7bcdc53ad9aac8",
      "tree": "3bf5ceb4d920d12a895fe0441047651be20fdc39",
      "parents": [
        "3ca3bea9a39ba0d3d6f49b8433d78ee8dcaa762d"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Sun Oct 11 10:09:20 2026 +0200"
      },
      "committer": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Mon Oct 12 22:22:08 2026 +0200"
      },
      "message": "rtc: Fix nonrd IntraBC DV range regression\n\nRegression from 4a527cabbb (\"rtc: Implement intrabc for nonrd\npickmode\"). av1_search_intrabc_nonrd() sets the search limits to the\ntile bounds, which drops the MV range clamp from\nav1_make_default_fullpel_ms_params(). On frames wider or taller than\n2048 pixels the hash search can then return a DV of 2048 pixels or more.\n\nThe DV cost lookup in mv_cost() indexes the dv_costs table with the\ndifference to the reference DV. For such a DV the index is outside the\ntable, which is a heap buffer overflow read. The cost then comes from\nwhatever memory follows the table, so the output is not deterministic.\nIf the far DV wins, the encoder writes a DV the decoder rejects as\ninvalid, or asserts in av1_get_mv_class() when the difference to the\nreference DV needs more than MV_CLASS_10.\n\nCall av1_set_mv_search_range() after setting the tile bounds, as the rd\nIntraBC search does. Add tests with a far copy to the left, above and\nabove right. The above right one is reported by ASan as a heap buffer\noverflow without the fix.\n\nChange-Id: I1cbd0ef09ab764e7424b679393985262ab7f4fbc\n"
    },
    {
      "commit": "3ca3bea9a39ba0d3d6f49b8433d78ee8dcaa762d",
      "tree": "fe47c1475e7a64d3a306375ff28b09345bef2653",
      "parents": [
        "fb718313902eaf2be17e86cc158374dfd3fc2a06"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Mon Oct 12 14:03:44 2026 +0200"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Mon Oct 12 12:52:33 2026 -0700"
      },
      "message": "Extend IntraBC frame borders with 2+ threads\n\nWith IntraBC on and 2 or more threads, the encoder\u0027s reconstruction\nstops matching the decoder output from the first inter frame after an\nIntraBC frame until the next key frame. The encoder codes each of\nthose frames against references the decoder doesn\u0027t have, so the\ndecoded video drifts.\n\nInter frames that point past the frame edge read the border of the\nreference frame. On IntraBC frames the encoder skips\nloopfilter_frame(), so CDEF never runs. extend_frame_borders() still\nasks extend_borders_mt() whether the CDEF workers already extended the\nborders, and the MOD_CDEF case only checks is_cdef_used(). With 2 or\nmore threads it returns 1, so nothing extends the borders and they\nkeep stale pixels. The decoder pads out of frame references per block,\nso it isn\u0027t affected.\n\nReturn 0 for MOD_CDEF on IntraBC frames, so extend_frame_borders()\nextends the borders itself.\n\nThe new test pans a screen texture after an IntraBC key frame at 2\nthreads and compares the encoder reconstruction with the decoder\noutput. Without this change frames 1 to 4 differ.\n\nChange-Id: I2359bba7ac07b40cc7aedd5ebe57c3cbad16743e\n"
    },
    {
      "commit": "fb718313902eaf2be17e86cc158374dfd3fc2a06",
      "tree": "43074af304b419abd4d21e48e74c6fda3f578b88",
      "parents": [
        "415a98a147b854e71b1f73604e0ab62a80d769f3"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Sun Oct 11 06:34:50 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Mon Oct 12 10:23:51 2026 -0700"
      },
      "message": "Add double casts to silence MSVC C4244 warnings\n\naom\\av1\\encoder\\pickrst.c(1195): warning C4244: \u0027initializing\u0027:\nconversion from \u0027int64_t\u0027 to \u0027const double\u0027, possible loss of data\n\nThe double type has a 53-bit significand precision, so a loss of\nprecision is expected when a large int64_t value is converted to double.\n\nBug: oss-fuzz:566951534\nChange-Id: I863901c448f0b1aec64dfc41f1078e64116ebafd\n"
    },
    {
      "commit": "415a98a147b854e71b1f73604e0ab62a80d769f3",
      "tree": "d5ec543e02826a81e9132d73e4178ad34db0db11",
      "parents": [
        "513ccb13696c76acc434bb4c02a8c1b4886f5174"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Wed Oct 07 15:35:04 2026 +0200"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Mon Oct 12 08:40:15 2026 -0700"
      },
      "message": "rtc: Fix selective CDF when cyclic refresh is off\n\nselective_disable_cdf_rtc() keeps CDF updates on while\ncounter_encode_maxq_scene_change is below 30. The counter only moves\non frames that apply cyclic refresh. If cyclic refresh stays off, the\ncounter never reaches 30 and CDF updates run on every frame. An active\nmap with most blocks inactive does this, since percent_refresh scales\ndown to 0. In the default build every CDF update also rebuilds the\ncoefficient, mode and MV cost tables per superblock, so speed 11 camera\ncontent gets slower with an active map than without one.\n\nWhen an active map is set and cyclic refresh is off on the frame,\ncheck frames_since_scene_change instead. Streams without an active\nmap don\u0027t change.\n\nSpeed 11, camera content, aq 3, CBR, 1 thread, 300 frames, active map\nwith 3% of the blocks active. Encoder instructions, default build:\n\n  niklas_1280_720_30 at 1000 kbps: 22.7G before, 9.6G after\n  niklas_640_480_30 at 500 kbps: 8.3G before, 3.6G after\n  hantro_collage_w352h288 at 300 kbps: 3.7G before, 1.9G after\n\nThe realtime only build gains 3% to 5%, since it doesn\u0027t update cost\ntables per superblock. BD rate on the active area over 4 rates is 1.2%\nto 2.5% worse. Without an active map, selective_cdf_update already\ncosts 0.9% to 1.8% against CDF updates on every frame, so this is the\nsame trade.\n\nChange-Id: I1d833fcf44aaaa5e5ac715d02b36fdc01a2d6a22\n"
    },
    {
      "commit": "513ccb13696c76acc434bb4c02a8c1b4886f5174",
      "tree": "77cc42981dafb0d3842b1c37699315166c2fcb70",
      "parents": [
        "e161f898a072dc02b5327cd4e1b5ced4c6b93456"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Tue Oct 06 21:48:02 2026 +0200"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Mon Oct 12 08:39:56 2026 -0700"
      },
      "message": "rtc: Add nonrd mode setup for segment skip blocks\n\nFix an encoder assert for skip segments that use GOLDEN_FRAME or\nALTREF_FRAME as their reference. An ROI map that sets skip and a\nGOLDEN or ALTREF reference on the same segment hits it.\n\nIn nonrd, SEG_LVL_SKIP blocks went through the full mode search with\nforce_zeromv_skip_for_blk set. There the SEG_LVL_SKIP check allows\nonly GLOBALMV on LAST_FRAME, and the SEG_LVL_REF_FRAME check allows\nonly the segment reference. With a GOLDEN or ALTREF skip segment no\nmode is left, so the block keeps the default NEARESTMV on LAST_FRAME\nand write_ref_frames() asserts that the reference matches the\nsegment. Without asserts the encoder predicts from LAST_FRAME while\nthe decoder infers GLOBALMV on the segment reference, so their\nreconstructions differ.\n\nAdd av1_nonrd_pick_inter_mode_sb_seg_skip() and use it for these\nblocks, in place of the TODO in pick_sb_modes_nonrd(). It sets what\nthe decoder infers: GLOBALMV, the segment reference or LAST_FRAME,\nthe global motion vector and skip. The motion mode is still coded for\nthese blocks, so its inputs, the overlappable neighbor count and\nnum_proj_ref, are derived the same way the decoder does it.\n\nOther effects: with an active map the encoder runs about 2 percent\nfewer instructions. The output changes only for SEG_LVL_SKIP blocks.\nAt speed 7 fewer inactive pixels change, because the zero cost makes\nthe partition search keep inactive children split. Skip blocks no\nlonger update the adaptive rd thresholds and are no longer passed to\nthe temporal denoiser. With the denoiser on, quality in active areas\nat speed 7 did not change.\n\nExtend InactiveAreaTest with camera content and add RoiSkipGoldenRef,\nwhich uses a skip segment with GOLDEN_FRAME. Without this change 36\nof its 40 cases hit the assert in write_ref_frames(). The camera\ncontent runs cover the motion mode inputs.\n\nChange-Id: I3dfa5e3e64cdbcf3f1e0d4fadfd7080239f889ef\n"
    },
    {
      "commit": "e161f898a072dc02b5327cd4e1b5ced4c6b93456",
      "tree": "d1f9ed4508e4f65815adb7edcbd891106ab00629",
      "parents": [
        "8fbd65b2f354e1d7059f8b1899f3f0373d1b3e2a"
      ],
      "author": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Fri Oct 09 15:15:11 2026 +0000"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Mon Oct 12 08:39:30 2026 -0700"
      },
      "message": "rtc: Fix uninitialized mi fields in setup_planes\n\nIn setup_planes(), mi-\u003eref_frame, mi-\u003ebsize, mi-\u003emv[0].as_int, and\nmi-\u003einterp_filters were only initialized inside if (use_last_ref). When\nLAST_FRAME is not used as a reference (use_last_ref \u003d\u003d 0) after a\nresolution change, mi-\u003emv[0].as_int could retain INVALID_MV from\nalloc_mi(). In addition, in set_ref_frame_for_partition(), if\nGOLDEN_FRAME and ALTREF_FRAME had equal SADs (*y_sad_g \u003d\u003d *y_sad_alt),\nneither branch was taken, leaving mi-\u003emv[0].as_int as INVALID_MV and\ntriggering an out-of-bounds read in av1_enc_build_inter_predictor().\n\nInitialize the MB_MODE_INFO fields unconditionally in setup_planes(),\nand use \u003c\u003d when comparing *y_sad_g and *y_sad_alt in\nset_ref_frame_for_partition().\n\nUnittest added.\n\nBug: 567944558\nChange-Id: Ibe6873bd9646fd778930b73ab78d35735b64f242\n"
    },
    {
      "commit": "8fbd65b2f354e1d7059f8b1899f3f0373d1b3e2a",
      "tree": "011e211d2ef22fa6c4f79df6fb87227ff42b1643",
      "parents": [
        "6caf232e0792cd8b3f6dcb70fd6aa394724649cc",
        "af3dc9aadc793c1b00edc003e3fc19a44fdeb574"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Fri Oct 09 14:04:44 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Fri Oct 09 15:36:27 2026 -0700"
      },
      "message": "Merge tag \u0027v3.15.2\u0027 into main branch\n\nRelease v3.15.2\n\n2026-10-06 v3.15.2\n  This release is ABI compatible with the last release. See\n  https://aomedia.googlesource.com/aom/+log/v3.15.1..v3.15.2 for all the\n  commits in this release.\n\n  - Bug Fixes\n    * Bug 42302352: A larger frame is forced to be a key frame.\n    * Bug 555350218: libaom encoder allows frame width/height to be\n      different from max frame width/height when\n      reduced_still_picture_header is 1.\n    * Bug oss-fuzz:559019046: libaom:av1_enc_fuzzer: Bad-cast to\n      PixelLevelGradientInfocompute_gradient_info_sb in\n      av1_encode_sb_row.\n    * Bug oss-fuzz:566951534: Integer-overflow in linsolve_wiener.\n    * Bug 568044446: Fix stale search_site_config in IntraBC motion\n      search. Fix y_stride_src in init_motion_estimation().\n\nBug: 568453830\nChange-Id: Ieacad08602affe73dbafb12c5592878d0c55d74f\n"
    },
    {
      "commit": "6caf232e0792cd8b3f6dcb70fd6aa394724649cc",
      "tree": "0a1df2084471caa9bd1ad15d99758b2a434c94eb",
      "parents": [
        "9d092318ce97deb0e15a4b1067d06bcae0107216"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Wed Oct 07 16:12:49 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Fri Oct 09 14:50:31 2026 -0700"
      },
      "message": "Move internal func tests out of encode_api_test.cc\n\ntest/encode_api_test.cc, as the name suggests, tests the libaom\nencoder\u0027s public API. In commit 1aea664 and commit 46bd978, tests for\ninternal functions were added. Move these tests to the new\ntest/encode_internal_test.cc file.\n\nBug: b/558417547\nBug: b/558446054\nBug: b/558463892\nBug: b/558516408\nBug: b/558589747\nChange-Id: I597c1a188ecf0c7b3c3c52d65e7b38ccdbda7f90\n"
    },
    {
      "commit": "9d092318ce97deb0e15a4b1067d06bcae0107216",
      "tree": "190e625867c5eedae1550a88a3b5a8b506dd65b8",
      "parents": [
        "f4f8fb8639bacfd22266290d43362a367313ea29"
      ],
      "author": {
        "name": "Seonglae Cho",
        "email": "sungle3737@gmail.com",
        "time": "Thu Sep 10 21:53:48 2026 +0100"
      },
      "committer": {
        "name": "James Zern",
        "email": "jzern@google.com",
        "time": "Fri Oct 09 14:34:31 2026 -0700"
      },
      "message": "aom_img_set_rect: reject a flipped image\n\nSame as libvpx ca46065bc.\n\nChange-Id: Ic5c328f479e840a89766f748467fa55800cd1201\n"
    },
    {
      "commit": "f4f8fb8639bacfd22266290d43362a367313ea29",
      "tree": "064c37f80c00c6239cfaaf12b1c167ebbaa66c0d",
      "parents": [
        "90f1e4283b16f72d6f8c248a794351f248a3288e"
      ],
      "author": {
        "name": "Erik Språng",
        "email": "sprang@google.com",
        "time": "Fri Oct 09 10:28:17 2026 +0200"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Fri Oct 09 08:08:52 2026 -0700"
      },
      "message": "rtc: Only enable nonrd compound ref for comp pair\n\nPreviously, when compound prediction was enabled via\nAV1E_SET_SVC_REF_FRAME_COMP_PRED, sf-\u003ert_sf.use_comp_ref_nonrd was set\nto 1 even on frames where LAST_FRAME or the corresponding second\nreference (GOLDEN_FRAME, LAST2_FRAME, ALTREF_FRAME) was not active. This\ncaused single-reference frames to enter the REFERENCE_MODE_SELECT and\nSWITCHABLE interpolation filter paths.\n\nRequire LAST_FRAME as well as the paired second reference for each\nsf-\u003ert_sf.ref_frame_comp_nonrd[i] entry, and set\nsf-\u003ert_sf.use_comp_ref_nonrd to the logical OR of the three active\ncompound pair flags.\n\nBug: webrtc:496266459\nTAG\u003dagy\nCONV\u003de59647f0-f168-45b8-b962-aa515b0000cc\nChange-Id: I74d1262ff452d50347e0281d452719b207ec2a94\n"
    },
    {
      "commit": "90f1e4283b16f72d6f8c248a794351f248a3288e",
      "tree": "57216fad045b62c39301266cab0682770aae2a2f",
      "parents": [
        "d53e6d0b14568ddbd36ad7354bfb9a59a127346e"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Wed Oct 07 08:41:48 2026 +0200"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Fri Oct 09 07:36:52 2026 -0700"
      },
      "message": "rtc: Clear cyclic refresh q deltas when it is off\n\nWhen cyclic refresh is off and an active map is set,\nav1_cyclic_refresh_setup() keeps segmentation enabled for the inactive\nsegment. It leaves the ALT_Q deltas of the boost segments in place and\ndoesn\u0027t set update_data, so every frame copies the old deltas from its\nprimary reference frame.\n\nRate control keeps lowering q while the deltas stay the same. Once\nbase q drops to the size of the delta, the boost segments reach\nqindex 0 and become lossless. Nonrd doesn\u0027t support lossless segments,\nso the encoder hits the tx size assert in encode_block_inter() or\nwrites a stream the decoder rejects or decodes differently.\n\nDisable the deltas when cyclic refresh is off and signal the change.\nCheck the primary reference frame too. It may not be the last encoded\nframe, for example when a frame doesn\u0027t refresh LAST.\n\nAdd InactiveAreaTest.ActiveMapSetOnce. It sets a small active map once\nand lets q drop. Without this change it hits the assert at speeds 9 to 11\nwith aq 3, and crashes in builds without asserts.\n\nChange-Id: I42cab25f25017851c3b941025c61c49ca1ffd3a0\n"
    },
    {
      "commit": "d53e6d0b14568ddbd36ad7354bfb9a59a127346e",
      "tree": "820da6d42c9999bfe735ae648302d16562097e81",
      "parents": [
        "ef2ac20fe987f8a0b7aa675f7644239a9b6cb6e7"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Thu Oct 08 13:11:19 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Thu Oct 08 14:57:16 2026 -0700"
      },
      "message": "Include \u003ccstring\u003e for memset()\n\nChange-Id: I0f4b7773ade684efdc6686afb1c69c96300edf64\n"
    },
    {
      "commit": "ef2ac20fe987f8a0b7aa675f7644239a9b6cb6e7",
      "tree": "215f4051bd309bcb0d1466160927ecc4c3b97560",
      "parents": [
        "996a070f5637088ef0326816227d0e6e2d4b98b1"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Wed Oct 07 11:00:49 2026 +0200"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Thu Oct 08 14:13:26 2026 -0700"
      },
      "message": "rtc: Restore num_proj_ref after a rejected merge\n\ndirect_partition_merging() calls find_predictors() on the top left\nblock to test the merge, and find_predictors() sets num_proj_ref to 1.\nWhen the merge is rejected, the block keeps that 1 instead of the\nsample count from pickmode.\n\nThe bitstream writer reads num_proj_ref in motion_mode_allowed(). If\nthe real count is 0, the encoder writes a motion_mode symbol, but the\ndecoder computes the count itself and reads an obmc symbol. Decoding\nfails from that frame on.\n\nIt only happens with warped motion allowed, camera content, speed 8\nor higher and a frame without CDF updates.\n\nRestore num_proj_ref after a rejected merge. Add RTMotionModeTest. It\nfails without the fix with a decode error on frame 83.\n\nChange-Id: I12b17e7e0e23e597fe2324a1045b7dcfa5d7fda9\n"
    },
    {
      "commit": "996a070f5637088ef0326816227d0e6e2d4b98b1",
      "tree": "c6a4cba8deeac7d12d6c281bd29e3f949e1ec39e",
      "parents": [
        "a024e0fb06e99f2c44e705a29fbe1074fa96774d"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Thu Oct 08 09:23:14 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Thu Oct 08 09:23:14 2026 -0700"
      },
      "message": "Include av1/common/scale.h for struct scale_factors\n\nFix a ClangTidy misc-include-cleaner warning:\n  no header providing \"scale_factors\" is directly included\n\nChange-Id: I2a52c4e54b6a7de46eb091bed28351eb5fc022a2\n"
    },
    {
      "commit": "a024e0fb06e99f2c44e705a29fbe1074fa96774d",
      "tree": "1f8771dd939beb9bcfed9b3db0a417c213d468e4",
      "parents": [
        "03db2d12d2a87e30ff0df611153ad1eed5667e31"
      ],
      "author": {
        "name": "Ihor Buhaiov",
        "email": "freedbrt@gmail.com",
        "time": "Tue Oct 06 17:24:23 2026 +0200"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Wed Oct 07 14:25:30 2026 -0700"
      },
      "message": "rtc: Reset skipped segment only when inferred\n\nav1_cyclic_reset_segment_skip() moves skipped blocks to the predicted\nsegment to match the decoder. The decoder only infers it when the map\nis updated and segment ids follow the skip flag. With the active map,\nsegment 7 has SEG_LVL_SKIP, so neither holds and the reset does harm.\n\nInactive blocks leave segment 7, lose its loop filter deltas and get\ndeblocked again on every frame. Skipped active blocks can enter\nsegment 7, where the decoder infers GLOBALMV and LAST_FRAME, which\nbreaks the stream.\n\nReset only when the decoder infers the segment. This also covers ROI\nskip segments. Add InactiveAreaTest, which fails on main without this\nchange.\n\nChange-Id: Ibd325fcb3d7a48e103f3317632a80c6a6ca87aeb\n"
    },
    {
      "commit": "03db2d12d2a87e30ff0df611153ad1eed5667e31",
      "tree": "141948e9e1b72cc50f84d93c5d527853f48685e3",
      "parents": [
        "4cea455cabe16fabad4a8020b4dee269d157f0ef"
      ],
      "author": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Wed Oct 07 10:06:18 2026 -0700"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Wed Oct 07 10:26:45 2026 -0700"
      },
      "message": "Fix to nightly failure from unittest setting\n\nFix to test NonrdBlockYrdRateOverflow:\nlosseless setting requires aq-mode\u003d0, whereas default\nfor realtime is aq-mode\u003d3.\n\nvalidate_config() requires aq_mode \u003d\u003d 0 when lossless \u003d\u003d 1,\nso setting AV1E_SET_LOSSLESS without first setting AV1E_SET_AQ_MODE\nto 0 failed in realtime-only builds.\n\nBug: 568565869\nChange-Id: I9e43765ed07a460dea9cfe4ba809685549ad3f1b\n"
    },
    {
      "commit": "af3dc9aadc793c1b00edc003e3fc19a44fdeb574",
      "tree": "3e0fa46717a3a60d9f451aed66f49d4897b80fb7",
      "parents": [
        "d080fa233b0cdaa74f69aee81d5367da46ea1ddd"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Oct 06 15:19:36 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Oct 06 22:34:52 2026 -0700"
      },
      "message": "Update CHANGELOG for v3.15.2\n\nBug: 568453830\nChange-Id: Iaa9accfedfe482fa17d2b10d79915da06318467f\n"
    },
    {
      "commit": "4cea455cabe16fabad4a8020b4dee269d157f0ef",
      "tree": "63fe050c49977b634fd90132355cf1a8722188b6",
      "parents": [
        "a3bbf1482fe2746d9ca940bec932e807fa14e94d"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Oct 06 13:27:15 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Oct 06 16:17:44 2026 -0700"
      },
      "message": "Fix one scaled ref index in compound motion search\n\nhttps://aomedia-review.googlesource.com/c/aom/+/169472 corrected scaled\nref indices in compound motion search, but it missed one index.\n\nBug: 570668340\nChange-Id: I58b557d2824ccf72c941bb850fe5546d10349670\n"
    },
    {
      "commit": "a3bbf1482fe2746d9ca940bec932e807fa14e94d",
      "tree": "f51d07a2b145be1ee9d1ce6dcd63690ddbfe9a18",
      "parents": [
        "eeb9dcca9835bfb5d17846a5e2f905413969013f"
      ],
      "author": {
        "name": "Cherma Rajan A",
        "email": "cherma.rajan@ittiam.com",
        "time": "Mon Sep 28 13:57:49 2026 +0530"
      },
      "committer": {
        "name": "Yunqing Wang",
        "email": "yunqingwang@google.com",
        "time": "Tue Oct 06 14:49:33 2026 -0700"
      },
      "message": "Avoid complete TPL evaluation in shorten gf interval decision\n\nFor gop_length_decision_method \u003d 1, complete TPL is performed\nwhen sub-gop size is not determined by performing on fewer layer\nframes (i.e, ARF, base + 1 and base + 2 frames).\nTo simplify the design, this patch removes the second call of TPL\nfrom gop_length_decision_method \u003d 1. This patch also removes\ngop_length_decision_method \u003d 0 as it was unused.\n\n     Enc. Instr.            BD-Rate Loss(%)\ncpu  Reduction(%) avg.psnr  ovr.psnr   ssim     vmaf   vmaf_neg\n 0      0.312       0.0256   0.0240   0.0252   0.0420    0.0393\n 1      0.681       0.0267   0.0251   0.0219   0.0259    0.0292\n 2      0.376       0.0173   0.0144   0.0183   0.0262    0.0199\n 3      0.402       0.0148   0.0140   0.0096   0.0329    0.0134\n 4      0.416       0.0280   0.0351   0.0398   0.0504    0.0362\n\nSTATS_CHANGED for speed 0 to 4.\n\nChange-Id: I326c238c7693f892ac5b08a5c5c03b346a530cba\n"
    },
    {
      "commit": "d080fa233b0cdaa74f69aee81d5367da46ea1ddd",
      "tree": "da587eb41c09744e727980a8a3a0b7596157d527",
      "parents": [
        "fa6b080f6815bdcbcd20c1f5630301669fb528c0"
      ],
      "author": {
        "name": "Yuan Tong",
        "email": "tongyuan200097@gmail.com",
        "time": "Thu Sep 24 23:22:37 2026 +0800"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Oct 06 14:48:15 2026 -0700"
      },
      "message": "Allow upscaling without forcing keyframes for GOOD_QUALITY\n\nThe remaining blockers after\nhttps://aomedia-review.googlesource.com/c/aom/+/216241 are only 2 bugs\nin the heavy motion search routines.\n\nThey can be detected and verified by running the updated test case using\n`test_libaom --gtest_filter\u003d*AV1ResolutionChange.RandomInput*` under\nASAN.\n\nChange-Id: Iab55db677c793092fe2eb1bcf640d4534de08dd4\n(cherry picked from commit 4a1378d726fbe71d1ae9b59be0e76bbf48d1f396)\n"
    },
    {
      "commit": "fa6b080f6815bdcbcd20c1f5630301669fb528c0",
      "tree": "785a7827047cd3dce4d32174d80ab6f76ad937da",
      "parents": [
        "b271794619d0b12a4c5051c71716a372923008c5"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Fri Sep 25 15:37:46 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Oct 06 14:45:59 2026 -0700"
      },
      "message": "Simplify ref_yv12[2] in av1_joint_motion_search()\n\nA careful analysis shows that the ref_yv12[2] array in\nav1_joint_motion_search() can be replaced by a single variable\norig_yv12, like the orig_yv12 variable in\nav1_compound_single_motion_search().\n\nOnly xd-\u003eplane[plane].pre[0] needs to be backed up and restored, so a\nsingle variable (orig_yv12) suffices.\n\nChange-Id: I46a0ac488678ce617f74580ed12eddc1e56b6f39\n(cherry picked from commit 34c31c532e45dda358a955a2fbd4d4a8d5c4ad66)\n"
    },
    {
      "commit": "b271794619d0b12a4c5051c71716a372923008c5",
      "tree": "199ea9618bb55178355edac8a7d91c046e706453",
      "parents": [
        "af52815f9a917cf23cce19f128626e591c0ad546"
      ],
      "author": {
        "name": "Erik Språng",
        "email": "sprang@google.com",
        "time": "Tue Sep 01 18:43:23 2026 +0200"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Oct 06 14:32:09 2026 -0700"
      },
      "message": "Allow dynamic upscaling across frames without forcing keyframes\n\nAV1 reference frame scaling supports up to 16x upscaling and 2x\ndownscaling from reference frames. However, when dynamic resolution\nchanges were configured with g_forced_max_frame_width/height in single-\nlayer realtime mode, encoder_set_config was forcing a keyframe\nwhenever new dimensions exceeded the last coded width/height.\n\nThis CL enables dynamic upscaling without forcing keyframes:\n1. In single-pass realtime mode without lookahead (g_lag_in_frames \u003d\u003d 0\n   and g_pass \u003d\u003d AOM_RC_ONE_PASS), and with the maximum frame size\n   declared up front via g_forced_max_frame_width/height, removes\n   keyframe forcing for upscaled dimensions in encoder_set_config as\n   long as reference frame scaling constraints are met. The forced\n   maximum frame size is required since it is what makes the internal\n   buffers large enough for the upscaled frame; without it they are\n   only sized for the current frame size.\n2. Sizes internal buffers (compressor data allocation, segmentation\n   maps, cyclic refresh, active maps, and transform coefficient buffers)\n   using forced_max_frame_width/height when specified, preventing\n   out-of-bounds access upon upscaling.\n3. Updates set_bitstream_level_tier to compute the Sequence Header\n   operating point level index using seq-\u003emax_frame_width/height,\n   ensuring the level\u0027s MaxPicSize accommodates the maximum sequence\n   resolution.\n4. Adds unit tests in test/forced_max_frame_width_height_test.cc to\n   verify dynamic upscaling up to 16x without keyframes and level\n   index calculation.\n5. Updates AV1ResolutionChange.RandomInput, which asserted that every\n   resolution change produces a keyframe. All the resolution changes it\n   performs are in fact within the reference frame scaling limits, so in\n   realtime mode they are now coded as inter frames that scale their\n   references. The test now verifies that behaviour, and that the other\n   modes still force a keyframe.\n\nThis fix will allow us to re-enable the `ReferenceFrameScaling` test\ncase in\nhttps://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/api/video_codecs/test/video_encoder_functional_unittest.cc\n\nBug: webrtc:496266459\nChange-Id: Iee39e485db367e29b7d918ebd0708be72cb69bfe\n(cherry picked from commit bc384518c76b41b0bc2662e11a17e6bf01ecea08)\n"
    },
    {
      "commit": "eeb9dcca9835bfb5d17846a5e2f905413969013f",
      "tree": "441dcd94fca0d51446704e76b5aec9b8d992255c",
      "parents": [
        "4a1378d726fbe71d1ae9b59be0e76bbf48d1f396"
      ],
      "author": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Tue Oct 06 04:05:28 2026 +0000"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Tue Oct 06 14:09:36 2026 -0700"
      },
      "message": "Fix rate overflow in av1_block_yrd()\n\nIn av1_block_yrd() and av1_block_yrd_idtx(), the unscaled coefficient\nrate accumulated across transform blocks can exceed INT_MAX \u003e\u003e 11 on\nlarge partitions in lossless or low-quantizer realtime mode, causing a\nsigned 32-bit integer overflow when shifted left by\n2 + AV1_PROB_COST_SHIFT.\n\nCompute the shifted rate in int64_t and clamp to INT_MAX / 2 in\nav1_block_yrd(), av1_block_yrd_idtx(), and av1_estimate_block_intra().\n\nUnittest added.\n\nBug: 568565869\nChange-Id: I8ef2e6cfcd6efed37f13f5ad7f343effacde9065\n"
    },
    {
      "commit": "4a1378d726fbe71d1ae9b59be0e76bbf48d1f396",
      "tree": "f002a31d210cbb741049374bce5fc40d7df1b552",
      "parents": [
        "b10eed72ebc006292fa26d5f132bf03ef66e7a04"
      ],
      "author": {
        "name": "Yuan Tong",
        "email": "tongyuan200097@gmail.com",
        "time": "Thu Sep 24 23:22:37 2026 +0800"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Oct 06 09:47:19 2026 -0700"
      },
      "message": "Allow upscaling without forcing keyframes for GOOD_QUALITY\n\nThe remaining blockers after\nhttps://aomedia-review.googlesource.com/c/aom/+/216241 are only 2 bugs\nin the heavy motion search routines.\n\nThey can be detected and verified by running the updated test case using\n`test_libaom --gtest_filter\u003d*AV1ResolutionChange.RandomInput*` under\nASAN.\n\nChange-Id: Iab55db677c793092fe2eb1bcf640d4534de08dd4\n"
    },
    {
      "commit": "b10eed72ebc006292fa26d5f132bf03ef66e7a04",
      "tree": "eab4d413b052809d2fb786d7474cdbb5d8a765ef",
      "parents": [
        "494ba40f1cf5dfc0a945b941f2b31006a4b494ad"
      ],
      "author": {
        "name": "Cheng Chen",
        "email": "chengchen@google.com",
        "time": "Thu Oct 01 15:32:24 2026 -0700"
      },
      "committer": {
        "name": "Cheng Chen",
        "email": "chengchen@google.com",
        "time": "Mon Oct 05 13:09:03 2026 -0700"
      },
      "message": "Don\u0027t allow global motion to be enabled after the first frame\n\nGlobal motion search needs an image pyramid in every source and\nreference frame buffer, but pyramids are only allocated while global\nmotion is enabled, and existing buffers are not reallocated when the\nsetting changes. So enabling global motion after the first frame,\neither with AV1E_SET_ENABLE_GLOBAL_MOTION or implicitly by changing\nlarge_scale_tile from 1 to 0 with aom_codec_enc_config_set(), caused\nan assertion failure in av1_encode_frame() in debug builds:\n\n  Assertion `buf-\u003ebuf.y_pyramid\u0027 failed.\n\n\nand a NULL pointer dereference in aom_compute_pyramid() in release\nbuilds.\n\nOnce the first frame has been received (i.e., the lookahead has been\ncreated), ignore requests to enable global motion. Global motion can\nstill be disabled. Check the primary compressor\u0027s state so that all\ncompressors sharing the lookahead and frame buffers agree, including\nany created after the first frame (e.g., by AV1E_SET_FP_MT).\n\nAdd tests to test/encode_api_test.cc.\n\nBug:565488030\n\nChange-Id: Id3255978dcf17a5c98f08a28da0e7e7692915b4d\n"
    },
    {
      "commit": "af52815f9a917cf23cce19f128626e591c0ad546",
      "tree": "9518e7f69f9e61aecf677ec583895fe3295e270e",
      "parents": [
        "ab7db4094b64397873a0e151e223c84f66bf5fe8"
      ],
      "author": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Thu Oct 01 21:57:11 2026 +0000"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Mon Oct 05 11:00:19 2026 -0700"
      },
      "message": "Fix y_stride_src in init_motion_estimation()\n\nFix y_stride_src in init_motion_estimation() to\nderive it from cpi-\u003eunscaled_source when available\ninstead of lookahead-\u003ebuf[0], which can hold a stale\nstride from an earlier slot.\n\nAlso check fpf_y_stride when determining whether\nsearch_site_cfg should be updated.\n\nUnittest added.\n\nBug: 568044446\nChange-Id: I4601459b461d1fc3af354863c4760a31a5277c62\n(cherry picked from commit 12e2b14964e3390dabd08f8d70a752cc905409b2)\n"
    },
    {
      "commit": "494ba40f1cf5dfc0a945b941f2b31006a4b494ad",
      "tree": "268b7487e3ab8d4b64fab1bda2659f99b4d73d63",
      "parents": [
        "12e2b14964e3390dabd08f8d70a752cc905409b2"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Fri Oct 02 15:57:58 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Mon Oct 05 10:48:58 2026 -0700"
      },
      "message": "Assert ret val of av1_lookahead_peek() is not null\n\nIn av1_init_parallel_frame_context(), assert the return value of the\nav1_lookahead_peek() call is not null.\n\nFix Coverity defect CID 564383 Dereference null return value.\n\nCoverity is apparently affected by the two new av1_lookahead_peek()\ncalls added in\nhttps://aomedia-review.googlesource.com/c/aom/+/216821. That CL did not\nmodify the av1_lookahead_peek() function. However, it checks the return\nvalues of both av1_lookahead_peek() calls.\n\nChange-Id: I529e96a034d7f2050741094d31be14c057c1bd73\n"
    },
    {
      "commit": "12e2b14964e3390dabd08f8d70a752cc905409b2",
      "tree": "b3afa5c68875ca568b657a04ab3a481483ed1c20",
      "parents": [
        "f9faa216c560b609f1b9a4711db62422000af7f8"
      ],
      "author": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Thu Oct 01 21:57:11 2026 +0000"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Mon Oct 05 10:41:21 2026 -0700"
      },
      "message": "Fix y_stride_src in init_motion_estimation()\n\nFix y_stride_src in init_motion_estimation() to\nderive it from cpi-\u003eunscaled_source when available\ninstead of lookahead-\u003ebuf[0], which can hold a stale\nstride from an earlier slot.\n\nAlso check fpf_y_stride when determining whether\nsearch_site_cfg should be updated.\n\nUnittest added.\n\nBug: 568044446\nChange-Id: I4601459b461d1fc3af354863c4760a31a5277c62\n"
    },
    {
      "commit": "f9faa216c560b609f1b9a4711db62422000af7f8",
      "tree": "991a4a2151d7dafd5ab24b94f92a7442e4829c71",
      "parents": [
        "38bf46ed4aa3929741b1707b29d7ace135b35910"
      ],
      "author": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Tue Sep 29 22:54:09 2026 +0000"
      },
      "committer": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Mon Oct 05 10:01:31 2026 -0700"
      },
      "message": "Tweak AC coefficients in trellis optimization for noise patterns\n\nBug: 548701298\nChange-Id: I44c268180d5a60a067cc1ed3c74264fbbdb25064\n"
    },
    {
      "commit": "38bf46ed4aa3929741b1707b29d7ace135b35910",
      "tree": "c245b6eca77cc730bb693814d7aef4ab5b2d4175",
      "parents": [
        "9469625e62a151a18f6ab0f3f2850cc4ad9cc9e5"
      ],
      "author": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Mon Sep 28 17:16:08 2026 +0000"
      },
      "committer": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Mon Oct 05 10:01:20 2026 -0700"
      },
      "message": "Adjust RD cost using sub-block local variance energy disparity\n\nBug: 548701298\n\nChange-Id: Ie226f28763e79aec5347708563485fb2611df02d\n"
    },
    {
      "commit": "ab7db4094b64397873a0e151e223c84f66bf5fe8",
      "tree": "fcc0d71c239be6b0b4bde47fda7f029eb698d79f",
      "parents": [
        "5b9573b5a663ceb51cf1a6f94db2a4b9937e7d2c"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Thu Oct 01 18:57:48 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Fri Oct 02 21:40:27 2026 -0700"
      },
      "message": "linsolve_wiener: Fix integer overflows with double\n\nFix integer overflows in linsolve_wiener() by switching to\ndouble-precision floating point numbers.\n\nBug: oss-fuzz:566951534\nChange-Id: I64b0e9631c85144111dd8adb64a06cc4a61cbfc3\n(cherry picked from commit 9469625e62a151a18f6ab0f3f2850cc4ad9cc9e5)\n"
    },
    {
      "commit": "9469625e62a151a18f6ab0f3f2850cc4ad9cc9e5",
      "tree": "5c27b4038154c7664cf14c0f59cbc5e9cb89a3f9",
      "parents": [
        "18cb9b53f59290810828a72d89730d932cc301bc"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Thu Oct 01 18:57:48 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Fri Oct 02 19:05:37 2026 -0700"
      },
      "message": "linsolve_wiener: Fix integer overflows with double\n\nFix integer overflows in linsolve_wiener() by switching to\ndouble-precision floating point numbers.\n\nBug: oss-fuzz:566951534\nChange-Id: I64b0e9631c85144111dd8adb64a06cc4a61cbfc3\n"
    },
    {
      "commit": "18cb9b53f59290810828a72d89730d932cc301bc",
      "tree": "efc65be23b2002831b1ea5d93c7b3aab2014c4bd",
      "parents": [
        "e80624b5ed070d8e88a39ea78cae60d25a65adba"
      ],
      "author": {
        "name": "Cheng Chen",
        "email": "chengchen@google.com",
        "time": "Mon Sep 28 16:08:46 2026 -0700"
      },
      "committer": {
        "name": "Cheng Chen",
        "email": "chengchen@google.com",
        "time": "Fri Oct 02 17:15:24 2026 -0700"
      },
      "message": "Correctly allocate restoration buffer size\n\nAdjust the condition when to allocate the restoration buffer size,\nsuch that is could reallocate when the frame size is changed.\n\nBug:565488030\n\nChange-Id: I319cb6e8bf8a285c349a431c4caa4f38e35305b5\n"
    },
    {
      "commit": "5b9573b5a663ceb51cf1a6f94db2a4b9937e7d2c",
      "tree": "8193f38f4a0896db81e40a2044f9b40cb429bf16",
      "parents": [
        "51c3d8cfd8f441ae94a751c800a384a4a741c486"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Thu Oct 01 14:28:54 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Thu Oct 01 14:28:54 2026 -0700"
      },
      "message": "Update CHANGELOG and library version for v3.15.2\n\nBug: 568453830\nChange-Id: I0d3950fce5ea7fecd0d099227bb20f2c5a19faf0\n"
    },
    {
      "commit": "e80624b5ed070d8e88a39ea78cae60d25a65adba",
      "tree": "e8287eb79d22ff2ed4f96702f4031b39f4532ae7",
      "parents": [
        "ae410fe8b7bd45f3cf61dc8f112dc783e2a08089"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Wed Sep 30 21:33:59 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Wed Sep 30 21:33:59 2026 -0700"
      },
      "message": "Replace a memcpy call with struct copy\n\nChange-Id: I431c537bb4bef85e7500271dd545d693e9d07f4b\n"
    },
    {
      "commit": "51c3d8cfd8f441ae94a751c800a384a4a741c486",
      "tree": "9d4eced474a23793aebd908f7bd25c2c1cd72aec",
      "parents": [
        "1dfb7a15e0ed0933ae3b51c1315e106bbe914947"
      ],
      "author": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Thu Oct 01 00:08:11 2026 +0000"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Wed Sep 30 20:56:28 2026 -0700"
      },
      "message": "Fix stale search_site_config in IntraBC motion search\n\nUse av1_get_search_site_config() in rd_pick_intrabc_mode_sb()\nand av1_search_intrabc_nonrd() instead of reading\nsearch_site_cfg[SS_CFG_LOOKAHEAD] directly, and also\ncheck y_stride_src in init_motion_estimation().\n\nFix is suggested by Yuan Tong.\nUnittests written by Yuan Tong.\n\nBug: 568044446\nChange-Id: Id25d82bed48b4fa4bdcc2175af4e6448e2ab05fc\n(cherry picked from commit ae410fe8b7bd45f3cf61dc8f112dc783e2a08089)\n"
    },
    {
      "commit": "ae410fe8b7bd45f3cf61dc8f112dc783e2a08089",
      "tree": "8bcd37b0d5fe0c58d0181d97bd4719787858b563",
      "parents": [
        "34c31c532e45dda358a955a2fbd4d4a8d5c4ad66"
      ],
      "author": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Thu Oct 01 00:08:11 2026 +0000"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Wed Sep 30 18:24:52 2026 -0700"
      },
      "message": "Fix stale search_site_config in IntraBC motion search\n\nUse av1_get_search_site_config() in rd_pick_intrabc_mode_sb()\nand av1_search_intrabc_nonrd() instead of reading\nsearch_site_cfg[SS_CFG_LOOKAHEAD] directly, and also\ncheck y_stride_src in init_motion_estimation().\n\nFix is suggested by Yuan Tong.\nUnittests written by Yuan Tong.\n\nBug: 568044446\nChange-Id: Id25d82bed48b4fa4bdcc2175af4e6448e2ab05fc\n"
    },
    {
      "commit": "1dfb7a15e0ed0933ae3b51c1315e106bbe914947",
      "tree": "c321cc62ab5a7b78340e8860d03eff776b542568",
      "parents": [
        "232361529a307af3312e3dced81f2543e0a1702c"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Mon Aug 31 13:54:08 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Sep 29 18:03:09 2026 -0700"
      },
      "message": "Check frame size is max when frame_size_override\u003d0\n\nIn write_frame_size(), if frame_size_override is 0, frame_width_minus_1\nand frame_height_minus_1 are omitted because they are inferred to be\nequal to the maximum frame width and height in the sequence header.\nReport an error if that is not the case.\n\nRemove a related assertion for reduced_still_picture_hdr\u003d1 in\nwrite_uncompressed_header_obu() because it is replaced by the error\nchecking in write_frame_size().\n\nBug: 555350218\nChange-Id: I24258517258a06f40df6f409ada19ed6d5d3629b\n(cherry picked from commit bfb51847fa03803b0b66467285966de0a143529e)\n"
    },
    {
      "commit": "34c31c532e45dda358a955a2fbd4d4a8d5c4ad66",
      "tree": "4be8aaf0d82d390570aefd0552dae1da1abe0deb",
      "parents": [
        "9f9c3f7475793f1a80fc8fb811dbff84549a91df"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Fri Sep 25 15:37:46 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Sep 29 15:37:52 2026 -0700"
      },
      "message": "Simplify ref_yv12[2] in av1_joint_motion_search()\n\nA careful analysis shows that the ref_yv12[2] array in\nav1_joint_motion_search() can be replaced by a single variable\norig_yv12, like the orig_yv12 variable in\nav1_compound_single_motion_search().\n\nOnly xd-\u003eplane[plane].pre[0] needs to be backed up and restored, so a\nsingle variable (orig_yv12) suffices.\n\nChange-Id: I46a0ac488678ce617f74580ed12eddc1e56b6f39\n"
    },
    {
      "commit": "232361529a307af3312e3dced81f2543e0a1702c",
      "tree": "ae435ef09df180802ebff595e56ff5a4113cd9e0",
      "parents": [
        "6258cbce5ab77d3dba64c03e75a8f087d2fc9769"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Fri Sep 25 17:20:06 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Mon Sep 28 10:42:51 2026 -0700"
      },
      "message": "Add a test for OSS-Fuzz Issue 559019046\n\nSuggested by Yuan Tong in\nhttps://github.com/AOMediaCodec/libavif/pull/1069#discussion_r4090282167\n\nBug: oss-fuzz:559019046\nChange-Id: I1f7e280a1ec7c80a63cf3dee21c880e7d6f2fb23\n(cherry picked from commit 9f9c3f7475793f1a80fc8fb811dbff84549a91df)\n"
    },
    {
      "commit": "9f9c3f7475793f1a80fc8fb811dbff84549a91df",
      "tree": "24c738725b284c6895c2d39cc7b91af5627742d9",
      "parents": [
        "0dbfa9f9384d8c7f0ede5d1812c7cb97073827fa"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Fri Sep 25 17:20:06 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Mon Sep 28 10:41:38 2026 -0700"
      },
      "message": "Add a test for OSS-Fuzz Issue 559019046\n\nSuggested by Yuan Tong in\nhttps://github.com/AOMediaCodec/libavif/pull/1069#discussion_r4090282167\n\nBug: oss-fuzz:559019046\nChange-Id: I1f7e280a1ec7c80a63cf3dee21c880e7d6f2fb23\n"
    },
    {
      "commit": "0dbfa9f9384d8c7f0ede5d1812c7cb97073827fa",
      "tree": "c4e992d603575ad1b1f35b6068934ef77d2bf06d",
      "parents": [
        "6181313122767d38752d938b565dec1c0abe1892"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Fri Sep 25 15:57:36 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Fri Sep 25 15:57:36 2026 -0700"
      },
      "message": "Change ref_yv12 to ptr in build_second_inter_pred\n\nIn build_second_inter_pred(), change the local variable ref_yv12 from a\nstruct to a const pointer to avoid a struct copy.\n\nChange-Id: Ibed5a465184cd3072b502351463ced31b1481c48\n"
    },
    {
      "commit": "6258cbce5ab77d3dba64c03e75a8f087d2fc9769",
      "tree": "e5775999bca41418f7680a32531e05aaae30e478",
      "parents": [
        "44d0a57786f432d933ff64b653347c66f4d0fa1d"
      ],
      "author": {
        "name": "Yunqing Wang",
        "email": "yunqingwang@google.com",
        "time": "Fri Sep 18 16:50:07 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Fri Sep 25 11:59:46 2026 -0700"
      },
      "message": "Fix pixel_gradient_info allocation\n\nIn very rare cases, the work thread data needs to be re-allocated, but\nthe condition in is_gradient_caching_for_hog_enabled() is not true.\nThus, this results in no pixel_gradient_info data allocated for work\nthreads and the memory write violation happens. This change fixes this\nissue.\n\nBug: b/559019046\nChange-Id: I38b2285aeffe1732239cb2401b61a3654f386896\n(cherry picked from commit f9a09995618828dba5a3f154f30d60779e4acd33)\n"
    },
    {
      "commit": "6181313122767d38752d938b565dec1c0abe1892",
      "tree": "c84fa82f41fedae7362ad30da16b5a4207359baf",
      "parents": [
        "67028e707e1e9bda5fbafedc37288448853aba45"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Thu Sep 24 09:20:27 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Thu Sep 24 14:32:34 2026 -0700"
      },
      "message": "Assert rd_stats* not null in motion_mode_rd()\n\nAssert the rd_stats, rd_stats_y, and rd_stats_uv parameters are not null\nin motion_mode_rd() and handle_inter_mode().\n\nFixes Coverity defect CID 564327 (Dereference after null check).\n\nChange-Id: I597fe549ecc07cd03628db2cb65c46a7a4682c84\n"
    },
    {
      "commit": "67028e707e1e9bda5fbafedc37288448853aba45",
      "tree": "01e3e566c468b0f0802e24709394b82f40707fd3",
      "parents": [
        "175070e28ab5d2dc5bf77338d7c7bc3044222b44"
      ],
      "author": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Thu Sep 24 11:36:38 2026 -0700"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Thu Sep 24 13:41:02 2026 -0700"
      },
      "message": "rtc: Remove redundant partition settings for realtime\n\nRealtime always uses VAR_BASED_PARTITION.\n\nBug: 565783014\nChange-Id: I60383a56468bc8e9beda9a5c7e4751d35c5d7b64\n"
    },
    {
      "commit": "175070e28ab5d2dc5bf77338d7c7bc3044222b44",
      "tree": "85f813cc06252af0b8ac785b5eadd54c3e48294c",
      "parents": [
        "c8aad2b43b92858bc95b534257109e9533c71036"
      ],
      "author": {
        "name": "Christopher Trask",
        "email": "ctrask@google.com",
        "time": "Wed Sep 16 19:45:16 2026 +0000"
      },
      "committer": {
        "name": "James Zern",
        "email": "jzern@google.com",
        "time": "Thu Sep 24 12:36:36 2026 -0700"
      },
      "message": "av1: Fix temporal filter SEGV on cancellation\n\nAdd defensive checks in av1_tf_info_filtering and encode_strategy.c to\nensure frames exist in the lookahead buffer before attempting temporal\nfiltering. This prevents a NULL pointer dereference when the encoder is\nforced to flush early during second-pass encoding.\n\nBug: b/465818130\nChange-Id: I51e517e46434059196999ce593aac4f3b632326f\n"
    },
    {
      "commit": "c8aad2b43b92858bc95b534257109e9533c71036",
      "tree": "b7f6d7552d397cb0093ae8607de4458170ee2415",
      "parents": [
        "7b6197cb8fdc1ce555a03d23a9d25242c61d38e6"
      ],
      "author": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Wed Sep 23 17:22:45 2026 +0000"
      },
      "committer": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Wed Sep 23 18:27:17 2026 +0000"
      },
      "message": "Fix Coverity defect CID 564327 in motion_mode_rd\n\nRemove the redundant conditional check when updating\nrd_stats_y-\u003eskip_txfm.\n\nFixes Coverity defect CID 564327 (Dereference after null check).\n\nChange-Id: I6edb3e1bf0edfd35b0e2adc292cb63511b682ac9\n"
    },
    {
      "commit": "7b6197cb8fdc1ce555a03d23a9d25242c61d38e6",
      "tree": "2dddd78a11d9fb838ec0410b3f9027bb960ee14c",
      "parents": [
        "b4ce2cd097b00921b0327bfb5f07b5f8361ade99"
      ],
      "author": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Wed Sep 23 13:54:16 2026 +0000"
      },
      "committer": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Wed Sep 23 14:28:25 2026 +0000"
      },
      "message": "Adjust real-time unit test thresholds\n\nFix nightly build failures\n\nChange-Id: I85c80ca556f50af030ac02deee66e99ea6f14709\n"
    },
    {
      "commit": "b4ce2cd097b00921b0327bfb5f07b5f8361ade99",
      "tree": "f18a9efd82b8f826e300499a91d78f198ee8f555",
      "parents": [
        "c729980efa7807dd0d7981e89d1677cd4ea85f1b",
        "44d0a57786f432d933ff64b653347c66f4d0fa1d"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Sep 22 14:46:04 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Sep 22 14:46:04 2026 -0700"
      },
      "message": "Merge tag \u0027v3.15.1\u0027 into main branch\n\nRelease v3.15.1\n\n2026-09-21 v3.15.1\n  This release is ABI compatible with the last release. See\n  https://aomedia.googlesource.com/aom/+log/v3.15.0..v3.15.1 for all the\n  commits in this release.\n\n  - Bug Fixes\n    * b:558679217: Tune VMAF mode regression\n\nBug: 564595707\nChange-Id: I5158b893f5112f7888844b51ccd0a6f10dfb5fa6\n"
    },
    {
      "commit": "c729980efa7807dd0d7981e89d1677cd4ea85f1b",
      "tree": "a7357a261e316a9dac839181bf6ea4f86e31985b",
      "parents": [
        "f9a09995618828dba5a3f154f30d60779e4acd33"
      ],
      "author": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Tue Sep 22 14:25:00 2026 +0000"
      },
      "committer": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Tue Sep 22 14:25:00 2026 +0000"
      },
      "message": "Adjust real-time PSNR threshold in end-to-end unit test\n\nLower the target PSNR for real-time mode in EndToEndTestLarge to\nresolve nightly unit test failures on 12-bit test vectors.\n\nCommit df49183d1a synchronized rd_stats-\u003eskip_txfm inside\nav1_txfm_search when choosing to skip transforms. This corrected the\nskip rate accounting in caller functions leading to more appropriate\nskip decisions.\n\nChange-Id: Ibcd245a25a6bbfd8387360792cb416609e1d0447\n"
    },
    {
      "commit": "44d0a57786f432d933ff64b653347c66f4d0fa1d",
      "tree": "1083b6eece30f9d8279a057b9cc05bded50c5ed8",
      "parents": [
        "3892a19d949dd19dee79f1172a65468939d1bd62"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Mon Sep 21 15:44:50 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Mon Sep 21 21:56:43 2026 -0700"
      },
      "message": "Update CHANGELOG and library version for v3.15.1\n\nBug: 564595707\nChange-Id: I3d5653194e9713ebbf305c6881593ef889d87cbb\n"
    },
    {
      "commit": "f9a09995618828dba5a3f154f30d60779e4acd33",
      "tree": "1fd1c01fbe0dceedc834199ff84e929f0348ff77",
      "parents": [
        "a39b3a41ef3a4dbd8618867262ae57cb282262e0"
      ],
      "author": {
        "name": "Yunqing Wang",
        "email": "yunqingwang@google.com",
        "time": "Fri Sep 18 16:50:07 2026 -0700"
      },
      "committer": {
        "name": "Yunqing Wang",
        "email": "yunqingwang@google.com",
        "time": "Mon Sep 21 09:45:49 2026 -0700"
      },
      "message": "Fix pixel_gradient_info allocation\n\nIn very rare cases, the work thread data needs to be re-allocated, but\nthe condition in is_gradient_caching_for_hog_enabled() is not true.\nThus, this results in no pixel_gradient_info data allocated for work\nthreads and the memory write violation happens. This change fixes this\nissue.\n\nBug: b/559019046\nChange-Id: I38b2285aeffe1732239cb2401b61a3654f386896\n"
    },
    {
      "commit": "a39b3a41ef3a4dbd8618867262ae57cb282262e0",
      "tree": "8d2c2ca69e7e6a9dbd52333a5ae6a90f909e563b",
      "parents": [
        "df49183d1a51d67eb2e6c12e3a256dd4a04e878b"
      ],
      "author": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Thu Sep 17 21:28:50 2026 +0000"
      },
      "committer": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Mon Sep 21 08:43:36 2026 -0700"
      },
      "message": "Add variance-aware RD cost penalties to avoid texture loss\n\nBias against skip/smooth/compound modes and large MV magnitude for low-to-mid\nvariance blocks in HBD sharpness 3 mode.\n\nBug: 548701298\nChange-Id: I8f39cd457acc9f0e3777ad389946a3f41e26dd9b\n"
    },
    {
      "commit": "df49183d1a51d67eb2e6c12e3a256dd4a04e878b",
      "tree": "acdcc94b024da66b0c679d4da0a1c91a714356d6",
      "parents": [
        "03afa68a2191752320db67e27d07115a5c5a4c7a"
      ],
      "author": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Thu Sep 17 21:28:29 2026 +0000"
      },
      "committer": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Mon Sep 21 08:43:30 2026 -0700"
      },
      "message": "Adjust transform search and skip decisions for HBD sharpness\n\nDisable pre-skip prediction when reconstructed variance drops below\nsource variance, and bias against skip txfm when skipping the transform\ncauses texutre loss.\n\nBug: 548701298\nChange-Id: Idd0298cf4f912880ec68c79f02c840677ae98dde\n"
    },
    {
      "commit": "03afa68a2191752320db67e27d07115a5c5a4c7a",
      "tree": "1f894f3183c752171b06e38d8f324dec25804b1a",
      "parents": [
        "84b0dd16528d804f546530d22d8f7f44f20fa6fc"
      ],
      "author": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Thu Sep 17 21:29:11 2026 +0000"
      },
      "committer": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Mon Sep 21 08:43:22 2026 -0700"
      },
      "message": "Smooth 2-pass rate control response and bit redistribution\n\nAllow over_shoot_pct \u003c\u003d 100 and unclamp pct_error for HBD sharpness 3\nmode to adapt more smoothly to high bitrate peaks.\nSuppress fast extra bit redistribution when currently overshooting\nto prevent inter-frame QP oscillations.\n\nBug: 548701298\nChange-Id: Iacdd96a988ea3ad97eae89a32400659d8f3e5794\n"
    },
    {
      "commit": "84b0dd16528d804f546530d22d8f7f44f20fa6fc",
      "tree": "985aa8ee2508e8c69e7c57459263acda5664920c",
      "parents": [
        "208e9c49dba9fe961251fbd0e9c0494d9b8dbe76"
      ],
      "author": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Thu Sep 17 21:27:25 2026 +0000"
      },
      "committer": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Mon Sep 21 08:43:13 2026 -0700"
      },
      "message": "Stabilize temporal filtering and TPL motion search for HBD\n\nFavor zero motion vector (0,0) in stationary/near-stationary regions\nduring temporal filtering motion search and TPL mode estimation.\nDisable sub-block motion estimation in temporal filtering and clamp\nfilter strength to 0 for low-contrast blocks when sharpness is 3.\n\nBug: 548701298\nChange-Id: Id5f1a8ed67a1b609159a15a969064419b053beab\n"
    },
    {
      "commit": "208e9c49dba9fe961251fbd0e9c0494d9b8dbe76",
      "tree": "ad5af9e2ccd828518251c4710744ab548b777914",
      "parents": [
        "1455a9744dab382804b0a32282dd166460508682"
      ],
      "author": {
        "name": "chendixi",
        "email": "chendixi@google.com",
        "time": "Thu Sep 17 13:07:14 2026 -0700"
      },
      "committer": {
        "name": "chendixi",
        "email": "chendixi@google.com",
        "time": "Thu Sep 17 13:07:14 2026 -0700"
      },
      "message": "av1/cx: support resize-mode in aom_codec_set_option\n\nExposes rc_resize_mode configuration via aom_codec_set_option(\"resize-mode\", ...)\nand adds unit test coverage in av1_key_value_api_test.\n\nBug: b/558826197\nChange-Id: I6868c09a7146c4dc1fcc1743abb2ba51da1fcaf4\n"
    },
    {
      "commit": "1455a9744dab382804b0a32282dd166460508682",
      "tree": "710970873a49012fb26c85e13a2b19804a898822",
      "parents": [
        "32345ff4d7f39b0d36149192b0fd8906ee7cb17f"
      ],
      "author": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Thu Sep 17 04:54:50 2026 +0000"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Thu Sep 17 04:59:13 2026 +0000"
      },
      "message": "rtc: Fix integer overflow in update_layer_buffer_level\n\nUse saturate_cast_double_to_int when computing the\ntarget bandwidth per frame in update_layer_buffer_level,\nav1_update_layer_context_change_config, and\nav1_update_temporal_layer_framerate. Also promote the\nsubtraction in update_layer_buffer_level to 64-bit signed\ninteger arithmetic.\n\nThis prevents signed integer overflow when target_bandwidth\nis very large and framerate is very low.\n\nBug: 560374698\nChange-Id: I4fc450bf81006154beb3ae4d0e007884e2d70cb2\n"
    },
    {
      "commit": "32345ff4d7f39b0d36149192b0fd8906ee7cb17f",
      "tree": "7311820c946445dd159615454f1476bc0cd55a26",
      "parents": [
        "5fe6dd82bc6112ccd395f0bff188796f01ed1249"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Wed Sep 16 12:18:36 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Wed Sep 16 16:20:25 2026 -0700"
      },
      "message": "Allow flow estimation on mismatched frame strides\n\nNow that aom_compute_flow_at_point uses the strides corresponding to the\nsrc and ref buffers, we can remove the requirement that the src and ref\nbuffers have the same stride in\nav1_compute_global_motion_feature_match(),\nav1_compute_global_motion_disflow(), and\nupdate_valid_ref_frames_for_gm().\n\nDelete the DisflowTest.MismatchedStrides test because mismatched strides\nare no longer an error condition for av1_compute_global_motion_disflow()\nand av1_compute_global_motion_feature_match().\n\nChange-Id: I8ec4fcd7c88d618b7b411e49622f8155d664ad95\n"
    },
    {
      "commit": "5fe6dd82bc6112ccd395f0bff188796f01ed1249",
      "tree": "05b1b57e972a1b65d32c9bd88b1ccaba1719cce1",
      "parents": [
        "40fa6ebbee34da25112a07f1e73268e777d55c2f"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Sep 15 11:27:28 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Wed Sep 16 16:20:25 2026 -0700"
      },
      "message": "Use correct strides in aom_compute_flow_at_point\n\nUse the strides corresponding to the src and ref buffers in\naom_compute_flow_at_point. Do not use the src stride for the ref\nbuffer.\n\nA follow-up to commit b5f92a8.\n\nChange-Id: Iad4b5575d30cb3c896c2d4f1aaa562c2b28335c2\n"
    },
    {
      "commit": "40fa6ebbee34da25112a07f1e73268e777d55c2f",
      "tree": "c41a6d0b8743de6d37d5476bf7650ba888c8f76c",
      "parents": [
        "bc384518c76b41b0bc2662e11a17e6bf01ecea08"
      ],
      "author": {
        "name": "David Sarkisyan",
        "email": "david@srkyn.com",
        "time": "Fri Sep 11 15:09:11 2026 -0400"
      },
      "committer": {
        "name": "James Zern",
        "email": "jzern@google.com",
        "time": "Wed Sep 16 12:17:32 2026 -0700"
      },
      "message": "Validate decoder tile selection against frame bounds\n\nThe decoder stores tile row and column controls before it knows the next\nframe dimensions. Validate them once the tile counts are available and\nbefore dispatching to any tile decoder. This prevents a one-past\nselection from reaching large-scale tile buffer parsing.\n\nAdd a focused regression for the invalid column case.\n\nSigned-off-by: David Sarkisyan \u003cdavid@srkyn.com\u003e\n\nChange-Id: I2175ced004328ab39e172a87a20839de151f058e\n"
    },
    {
      "commit": "bc384518c76b41b0bc2662e11a17e6bf01ecea08",
      "tree": "f82928564dab070e88fff2713d1fdde7ce90d11d",
      "parents": [
        "822f287f60cc99775d0293baa8f20dd8af88f2c4"
      ],
      "author": {
        "name": "Erik Språng",
        "email": "sprang@google.com",
        "time": "Tue Sep 01 18:43:23 2026 +0200"
      },
      "committer": {
        "name": "Erik Språng",
        "email": "sprang@google.com",
        "time": "Wed Sep 16 00:28:14 2026 -0700"
      },
      "message": "Allow dynamic upscaling across frames without forcing keyframes\n\nAV1 reference frame scaling supports up to 16x upscaling and 2x\ndownscaling from reference frames. However, when dynamic resolution\nchanges were configured with g_forced_max_frame_width/height in single-\nlayer realtime mode, encoder_set_config was forcing a keyframe\nwhenever new dimensions exceeded the last coded width/height.\n\nThis CL enables dynamic upscaling without forcing keyframes:\n1. In single-pass realtime mode without lookahead (g_lag_in_frames \u003d\u003d 0\n   and g_pass \u003d\u003d AOM_RC_ONE_PASS), and with the maximum frame size\n   declared up front via g_forced_max_frame_width/height, removes\n   keyframe forcing for upscaled dimensions in encoder_set_config as\n   long as reference frame scaling constraints are met. The forced\n   maximum frame size is required since it is what makes the internal\n   buffers large enough for the upscaled frame; without it they are\n   only sized for the current frame size.\n2. Sizes internal buffers (compressor data allocation, segmentation\n   maps, cyclic refresh, active maps, and transform coefficient buffers)\n   using forced_max_frame_width/height when specified, preventing\n   out-of-bounds access upon upscaling.\n3. Updates set_bitstream_level_tier to compute the Sequence Header\n   operating point level index using seq-\u003emax_frame_width/height,\n   ensuring the level\u0027s MaxPicSize accommodates the maximum sequence\n   resolution.\n4. Adds unit tests in test/forced_max_frame_width_height_test.cc to\n   verify dynamic upscaling up to 16x without keyframes and level\n   index calculation.\n5. Updates AV1ResolutionChange.RandomInput, which asserted that every\n   resolution change produces a keyframe. All the resolution changes it\n   performs are in fact within the reference frame scaling limits, so in\n   realtime mode they are now coded as inter frames that scale their\n   references. The test now verifies that behaviour, and that the other\n   modes still force a keyframe.\n\nThis fix will allow us to re-enable the `ReferenceFrameScaling` test\ncase in\nhttps://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/api/video_codecs/test/video_encoder_functional_unittest.cc\n\nBug: webrtc:496266459\nChange-Id: Iee39e485db367e29b7d918ebd0708be72cb69bfe\n"
    },
    {
      "commit": "822f287f60cc99775d0293baa8f20dd8af88f2c4",
      "tree": "92c323c35526c57dd837b9773319d59da5cc5531",
      "parents": [
        "06f068d1bc9f5159c6efb195ddf2f66e484ba511"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Sep 15 14:43:09 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Sep 15 17:39:45 2026 -0700"
      },
      "message": "Pass num_workers to enc_worker_hook() as arg2\n\nPass num_workers to enc_worker_hook() as the second parameter arg2. This\nallows enc_worker_hook() to avoid using cpi-\u003emt_info.num_workers, which\nis really the size of the cpi-\u003emt_info.workers array rather than the\ncurrent value of g_threads.\n\nRemove the saving and restoring of mt_info-\u003enum_workers around the\nav1_encode_tiles_mt(cpi) call in encode_frame_internal(). This\nworkaround is no longer necessary.\n\nA follow-up to commit 532ba44.\n\nBug: 558463888, 559075253, 559225640\nChange-Id: Idd5f9bef1e84b2e893699e997c307fe1fd1556c3\n"
    },
    {
      "commit": "06f068d1bc9f5159c6efb195ddf2f66e484ba511",
      "tree": "38f76326f00406217262f032ebb5f81aeb856791",
      "parents": [
        "7944536e9929d0c269409be4284c4c77ccac12b4"
      ],
      "author": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Tue Sep 15 11:42:02 2026 -0700"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Tue Sep 15 16:53:49 2026 -0700"
      },
      "message": "fix to nightly failure\n\nUse num_mod_workers[MOD_CDEF_SEARCH] for\ncdef search mt check.\n\nFailure in SmallWidthMultiThreaded was triggered via:\nhttps://aomedia-review.googlesource.com/c/aom/+/216501\n\nBug: 558463888, 559075253, 559225640\nChange-Id: I6f9ff430ce58a80674ae9883fa9a6431668245dc\n"
    },
    {
      "commit": "7944536e9929d0c269409be4284c4c77ccac12b4",
      "tree": "2ca3972d827c438a30e2adc64c0f32a0be3dece7",
      "parents": [
        "0a5ce88769eaedfd3893557f3e081f47a4c139f1"
      ],
      "author": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Sep 15 10:07:08 2026 -0700"
      },
      "committer": {
        "name": "Wan-Teh Chang",
        "email": "wtc@google.com",
        "time": "Tue Sep 15 15:22:16 2026 -0700"
      },
      "message": "Make av1/encoder/allintra_vis.h safe for C++\n\nA follow-up to commit 46bd978.\n\nBug: b/558417547\nBug: b/558463892\nBug: b/558516408\nBug: b/558589747\nTAG\u003dwtc\n\nChange-Id: Ic91a4f7c8569c0042ce4faae46774e2b1e278329\n"
    },
    {
      "commit": "0a5ce88769eaedfd3893557f3e081f47a4c139f1",
      "tree": "f50c394ff1f695db4e78b56c8adb538e5ffca888",
      "parents": [
        "45f1839d867c0623ce8945c0717d233a93d2f150"
      ],
      "author": {
        "name": "Yunqing Wang",
        "email": "yunqingwang@google.com",
        "time": "Tue Sep 15 11:54:45 2026 -0700"
      },
      "committer": {
        "name": "Yunqing Wang",
        "email": "yunqingwang@google.com",
        "time": "Tue Sep 15 13:40:55 2026 -0700"
      },
      "message": "Add back deprecated values for API compatibility\n\nChange-Id: Iadb4a057a4b27011bc9f555768ff02b43ac28673\n"
    },
    {
      "commit": "45f1839d867c0623ce8945c0717d233a93d2f150",
      "tree": "a71e10edb90b9e9a0c4d7822cefc52b3a1e9d53a",
      "parents": [
        "4778e8c745476f35d0a10a16dab15df9a1d14635"
      ],
      "author": {
        "name": "Yunqing Wang",
        "email": "yunqingwang@google.com",
        "time": "Fri Sep 11 16:02:59 2026 -0700"
      },
      "committer": {
        "name": "Yunqing Wang",
        "email": "yunqingwang@google.com",
        "time": "Tue Sep 15 11:44:19 2026 -0700"
      },
      "message": "Consolidate and remove tune for VMAF with pre-processing\n\nThe option \"--tune\u003dvmaf_with_preprocessing\" is almost a subset of\n\"--tune\u003dvmaf\" and also has a similar performance. Consolidate these\n2 options and remove vmaf_with_preprocessing one.\n\nBug: 560267484\nChange-Id: I423180f986b3f288a39f1431147a8454834e82aa\n"
    },
    {
      "commit": "4778e8c745476f35d0a10a16dab15df9a1d14635",
      "tree": "a77b7fe721de35a411fd6e476afd6dddb0ed0c17",
      "parents": [
        "bc219b07946fd52d3caa97221807ec084c18668b"
      ],
      "author": {
        "name": "Yunqing Wang",
        "email": "yunqingwang@google.com",
        "time": "Fri Sep 11 13:15:17 2026 -0700"
      },
      "committer": {
        "name": "Yunqing Wang",
        "email": "yunqingwang@google.com",
        "time": "Tue Sep 15 11:44:06 2026 -0700"
      },
      "message": "Remove tune for VMAF without pre-processing\n\nRemoved the option \"--tune\u003dvmaf_without_preprocessing\", which\ndoesn\u0027t perform well.\n\nBug: 560267484\n\nChange-Id: I9eaa9cfa853a97667ecadf59ee9cab6c5830bbf7\n"
    },
    {
      "commit": "bc219b07946fd52d3caa97221807ec084c18668b",
      "tree": "757b456db965ff1a5459edadf6bfa89dbb58712d",
      "parents": [
        "46bd978472725e7f0b55f5a8809848c45c012f4f"
      ],
      "author": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Tue Sep 15 16:40:26 2026 +0000"
      },
      "committer": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Tue Sep 15 11:22:12 2026 -0700"
      },
      "message": "Remove redundant checks in av1_compute_global_motion_disflow\n\nRemove duplicate image dimension and corner count checks in\nav1_compute_global_motion_disflow() that were inadvertently added\nduring a merge conflict resolution.\n\nCoverity-defect: CID 564107 (Logically dead code)\nChange-Id: I35b0acfdea4d4802f0cdeaae8f22d24c2fd9df4e\n"
    },
    {
      "commit": "46bd978472725e7f0b55f5a8809848c45c012f4f",
      "tree": "1f6fc6e1c660d55a187d8ecba575479b3800c877",
      "parents": [
        "037ca0e8863b171cc284390c7f1a845a6b2d7f4f"
      ],
      "author": {
        "name": "Cheng Chen",
        "email": "chengchen@google.com",
        "time": "Fri Sep 11 11:54:53 2026 -0700"
      },
      "committer": {
        "name": "Cheng Chen",
        "email": "chengchen@google.com",
        "time": "Tue Sep 15 08:46:42 2026 -0700"
      },
      "message": "Fix integer overflow and bounds checks in allintra\n\n1. Remove narrowing (int) casts in get_satd() and get_sse() to avoid\n   signed integer overflow when accumulating high-bitdepth or large\n   superblock SATD/SSE values.\n2. Guard against negative row/col indices and zero mb_count in\n   get_satd(), get_sse(), get_max_scale(), get_window_wiener_var(),\n   and get_rate_guided_quantizer().\n\nBug: b/558417547\nBug: b/558463892\nBug: b/558516408\nBug: b/558589747\nTAG\u003dagy\n\nChange-Id: I29fad3393f1c4383aa2a6c203674375a90be5fda\n"
    },
    {
      "commit": "037ca0e8863b171cc284390c7f1a845a6b2d7f4f",
      "tree": "1f88f45c5a1572e5f03d6ee9498c95315546195e",
      "parents": [
        "1aea66455a5e7f29619cb118cd2643715971a366"
      ],
      "author": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Mon Sep 14 21:08:57 2026 +0000"
      },
      "committer": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Mon Sep 14 16:05:04 2026 -0700"
      },
      "message": "Fix integer overflow in av1_caq_select_segment\n\nIn av1_caq_select_segment(), sb64_target_rate * xmis * ymis was\nevaluated using 32-bit signed integer arithmetic before being cast\nto int64_t. When sb64_target_rate is large, this causes signed\ninteger overflow.\n\nCast sb64_target_rate to int64_t before multiplying with xmis and ymis,\nand declare target_rate as int64_t to prevent overflow when num / denom\nexceeds INT_MAX.\n\nBug: 559079132\nChange-Id: Ifde1ae6acef26f2320d23eab13a47222fb287619\n"
    },
    {
      "commit": "1aea66455a5e7f29619cb118cd2643715971a366",
      "tree": "0393687348a94c740418e1fa75e6744fa9bf89d5",
      "parents": [
        "532ba44931cc110121e0a1a410412f3ab70e2200"
      ],
      "author": {
        "name": "Cheng Chen",
        "email": "chengchen@google.com",
        "time": "Wed Sep 09 12:14:08 2026 -0700"
      },
      "committer": {
        "name": "Cheng Chen",
        "email": "chengchen@google.com",
        "time": "Mon Sep 14 11:37:19 2026 -0700"
      },
      "message": "Clamp intra predictor neighbor pixel counts\n\nWhen predicting subblocks near or beyond frame boundaries (where\nmb_to_bottom_edge or mb_to_right_edge is negative), xr + txwpx,\nyd + txhpx, xr, and yd can evaluate to negative numbers. Using\nAOMMIN(txhpx, yd + txhpx) yields a negative n_left_px, triggering\nassert(n_left_px \u003e\u003d 0) in build_intra_predictors_common().\n\nUse clamp(..., 0, ...) to ensure n_top_px, n_left_px, n_topright_px,\nand n_bottomleft_px are always non-negative.\n\nBug: b/558446054\nTAG\u003dagy\n\nChange-Id: I746e612a44d8e9e0f83c1d3c3b47870cd459a80f\n"
    },
    {
      "commit": "532ba44931cc110121e0a1a410412f3ab70e2200",
      "tree": "0af3f2162eb777eaf8026142bd7fb5c87b7d06d9",
      "parents": [
        "023743a7d78d9c7d33390c5c45b35495ea013a21"
      ],
      "author": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Thu Sep 10 03:33:45 2026 +0000"
      },
      "committer": {
        "name": "Marco Paniconi",
        "email": "marpan@google.com",
        "time": "Mon Sep 14 09:37:58 2026 -0700"
      },
      "message": "Fix to encoding worker count mismatch in tile mt\n\nWhen row_mt \u003d\u003d 0 and the number of threads is dynamically reduced,\nmt_info-\u003enum_workers could retain the larger thread pool capacity\nallocated previously while mt_info-\u003enum_mod_workers[MOD_ENC] reflects\nthe lower active worker count.\n\nIn encode_frame_internal(), check num_workers using\nmt_info-\u003enum_mod_workers[MOD_ENC] rather than mt_info-\u003enum_workers,\nand update mt_info-\u003enum_workers before calling av1_encode_tiles_mt()\nso that enc_worker_hook() advances tile index with the correct stride.\nThis prevents skipping tiles when thread count is reduced and fixes\na crash in bitstream packing.\n\nThis fixes the three issues below.\n\nUnittests added.\n\nBug: 558463888, 559075253, 559225640\n\nChange-Id: Ieb8f8ac409458c0be7af2f9daaa567a87c644519\n"
    },
    {
      "commit": "023743a7d78d9c7d33390c5c45b35495ea013a21",
      "tree": "1244552bbd510547a40503811d55b8672452a346",
      "parents": [
        "b5f92a845464db51123572b9b52fcabfc530e06b"
      ],
      "author": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Wed Sep 09 18:06:00 2026 +0000"
      },
      "committer": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Sat Sep 12 15:43:56 2026 +0000"
      },
      "message": "Fix memcpy-param-overlap in disflow flow-field border filling\n\nIn fill_flow_field_borders() and upscale_flow_component(), ensure that\nthe copy length does not exceed stride before copying row borders, and\nuse memmove() instead of memcpy() to prevent undefined behavior if\nsource and destination ranges overlap.\n\nIt also fixed heap-buffer-overflow on dynamic resolution change - update\ncpi-\u003eframe_info in av1_update_frame_size() and track allocation sizes\nfor mb_weber_stats and mb_delta_q, reallocating them when dimensions increase.\n\nBug: 558524775\n\nChange-Id: Id0df83fbcf4b9ec7f9efe441875c8d54e6eb0efe\n"
    },
    {
      "commit": "b5f92a845464db51123572b9b52fcabfc530e06b",
      "tree": "bba81006051c196901f2d444a95fa6e620767f43",
      "parents": [
        "b7926e61f11b6393d5178805fb6a85b1d8f25daf"
      ],
      "author": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Thu Sep 10 00:06:05 2026 +0000"
      },
      "committer": {
        "name": "Lin Zheng",
        "email": "linzhen@google.com",
        "time": "Fri Sep 11 12:19:51 2026 -0700"
      },
      "message": "Disallow global motion estimation on mismatched frame strides\n\nIn the case of dynamic resolution changes, the source frame and\nreference frames may have identical crop dimensions but different\nborder paddings and strides.\n\nBecause optical flow computation takes a single stride parameter for both\nbuffers, evaluating optical flow across buffers with mismatched strides\ncauses out-of-bounds row indexing and memory corruption.\n\nThis patch:\n1. Adds stride checks in av1_compute_global_motion_disflow and\n   av1_compute_global_motion_feature_match to safely return false when\n   layer 0 strides differ.\n2. Checks ref_buf[frame]-\u003ey_stride \u003d\u003d cpi-\u003esource-\u003ey_stride in\n   update_valid_ref_frames_for_gm() so mismatched reference frames\n   are skipped for global motion search.\n3. Adds a unit test in DisflowTest.MismatchedStrides covering both\n   disflow and corner match algorithms.\n\nBug: aomedia:559075256\nChange-Id: If79b7d8705bb839c88e1d2f2d168af993b7a8b77\n"
    }
  ],
  "next": "3892a19d949dd19dee79f1172a65468939d1bd62"
}
