)]}'
{
  "log": [
    {
      "commit": "2e997cd17b3ee4351bf1cfab99e6ff9d82500107",
      "tree": "14c6ca040570be10cdd108e63b9ce78943eb06c2",
      "parents": [
        "ffe7a9238cc6e585590ff80834aa6f822a198833",
        "e42e82092f6a46df4c1eebc0e67fa1fdd6788696"
      ],
      "author": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Mon Mar 24 15:10:56 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Mon Mar 24 15:10:56 2025 +0000"
      },
      "message": "Upgrade iamf_tools to e42e82092f6a46df4c1eebc0e67fa1fdd6788696\n\nThis project was upgraded with external_updater.\nUsage: tools/external_updater/updater.sh update external/iamf_tools\nFor more info, check https://cs.android.com/android/platform/superproject/main/+/main:tools/external_updater/README.md\n\nBug: 388336285\nTest: TreeHugger\nChange-Id: I26bb4762aa7508ea05e87aafb92d7a4e761a6ae0\n"
    },
    {
      "commit": "e42e82092f6a46df4c1eebc0e67fa1fdd6788696",
      "tree": "f42185e757b0af2df9c7d6e89836c051fba30782",
      "parents": [
        "9d5eef8c99455c1488b009a35a15c9d947fe006f"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Fri Mar 21 19:57:47 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Mon Mar 24 09:32:17 2025 -0400"
      },
      "message": "Add API ability to specify the sample size of the output.\n\nWith this CL, the caller can set the output to int16 (default to int32).\n\nAlso the output is copied to a caller-specified output buffer.\n\nPiperOrigin-RevId: 739340104\n"
    },
    {
      "commit": "9d5eef8c99455c1488b009a35a15c9d947fe006f",
      "tree": "58e72159cd904e71c981fabe4cd388fbdd6e882a",
      "parents": [
        "eff99b9e3b66753a2d2f3af04375791f17b9d0f4"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Fri Mar 21 19:29:03 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Mon Mar 24 09:31:53 2025 -0400"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 739333310\n"
    },
    {
      "commit": "eff99b9e3b66753a2d2f3af04375791f17b9d0f4",
      "tree": "22ea38e5a0ed1bc65c3cc5fc81beff7d8505a11a",
      "parents": [
        "2c38ea888b5d138f86bd3ac89727cf95ad593285"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Fri Mar 21 19:27:24 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Mon Mar 24 09:31:27 2025 -0400"
      },
      "message": "Remove unused trimming arguments for WritePcmFrameToBuffer\n\nPiperOrigin-RevId: 739332968\n"
    },
    {
      "commit": "2c38ea888b5d138f86bd3ac89727cf95ad593285",
      "tree": "00493de6ae169f4bc5c1e3a29846b571fddf2cc2",
      "parents": [
        "9845cc551e5042bd5bd6676215c03f5206cd6913"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 21 18:34:44 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 21 18:36:17 2025 -0400"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 739318585\n"
    },
    {
      "commit": "9845cc551e5042bd5bd6676215c03f5206cd6913",
      "tree": "b11968a3b63866d7e52a1d3ce16a341f37d18f5f",
      "parents": [
        "05682892be5aeedfbdf1520e250e649d17052aba"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 21 14:38:39 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 21 14:54:31 2025 -0400"
      },
      "message": "`MixPresentationObu`: Remove redundant `num*` fields.\n\n  - These fields serve no real purpose to hold. Instead of trying to synchronize their state, we can simply remove and infer them from the size of the vectors.\n  - On proto-\u003einternal:\n    - Infer based on the size of the associated repeated field.\n    - Remove further usage of the deprecated proto fields. Except for tests that demonstrate they ignored.\n  - On read:\n    - Local variable determines how many elements to read.\n  - On write:\n    - Infer based on the size of the vector.\n  - In tests:\n    - Tests that used to set it, now do not need to do so. It is implied by the size of the vector.\n    - Tests that EXPECT can compare vs. the size of the vector.\n\nPiperOrigin-RevId: 739248612\n"
    },
    {
      "commit": "05682892be5aeedfbdf1520e250e649d17052aba",
      "tree": "135e31a077ab648ff4fdedba92bf3c4e21f4826b",
      "parents": [
        "266f41cdc5ef60e1f2c5adaf317f9be509cb029e"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Fri Mar 21 14:00:15 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 21 14:54:08 2025 -0400"
      },
      "message": "Implement `IamfDecoder::GetOutputLayout()`.\n\nThis allows the user to query which output layout will be used to render the audio, as it might be different than what they requested if the desired layout was not found in the mix presentations of the descriptors. This can only be called after the descriptors have been processed.\n\nPiperOrigin-RevId: 739237169\n"
    },
    {
      "commit": "266f41cdc5ef60e1f2c5adaf317f9be509cb029e",
      "tree": "ee6de570be370d8042f75bc808ee8df6b5d8541a",
      "parents": [
        "8d3f808b590a3f4087a7e305725fae988554cf87"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Fri Mar 21 13:43:51 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 21 14:53:43 2025 -0400"
      },
      "message": "Add conversion from internal layout type to api output layout type.\n\nPiperOrigin-RevId: 739231662\n"
    },
    {
      "commit": "8d3f808b590a3f4087a7e305725fae988554cf87",
      "tree": "c7bea7ed618df8b125aedcaf3c140e217227a7fb",
      "parents": [
        "c29915841bcdb578ef18df09c5abfd78678df190"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Fri Mar 21 13:19:59 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 21 14:53:20 2025 -0400"
      },
      "message": "Add an `output_layout` parameter to `ObuProcessor::CreateForRendering()` and `ObuProcessor::InitializeForRendering()`. This allows us to record the actual layout that will be used, once we\u0027ve looked through the descriptors and checked whether the user selected layout is a viable option.\n\nIn a subsequent cl, we will propagate this up in order to tell the user of the IamfDecoder which layout will be used.\n\nPiperOrigin-RevId: 739223468\n"
    },
    {
      "commit": "c29915841bcdb578ef18df09c5abfd78678df190",
      "tree": "37e27094c1265c1da17538b12b7b62d1a85d6900",
      "parents": [
        "4f32e0a550c74bf304f33ccf2c0a5b9e32d0bfc7"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Thu Mar 20 16:44:56 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 21 10:18:07 2025 -0400"
      },
      "message": "Mark API iamf_decoder_fuzz_test as Linux-only\n\nThe fuzz test library currently is Linux-only.\n\nPiperOrigin-RevId: 738925260\n"
    },
    {
      "commit": "4f32e0a550c74bf304f33ccf2c0a5b9e32d0bfc7",
      "tree": "72818c2b9c1ba4308bfee924803203fb73cbc2a7",
      "parents": [
        "23d43334f7755cd48033c484b968a69e20cf7c93"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Thu Mar 20 14:56:52 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 21 10:17:44 2025 -0400"
      },
      "message": "Add requested_layout input arg to both Create() functions in IamfDecoder. This allows us to support user-specified layouts at creation time.\n\nPiperOrigin-RevId: 738887828\n"
    },
    {
      "commit": "23d43334f7755cd48033c484b968a69e20cf7c93",
      "tree": "ccef6edb7c38633461f58217f0ff8091ca07925f",
      "parents": [
        "2aeb1631a0c102b603c2e5fa324a7c4e5df71c11"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Wed Mar 19 17:20:30 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 21 10:17:22 2025 -0400"
      },
      "message": "Add selection criteria for choosing a layout and mix presentation to render. We first search for an exact match between a users desired layout and the layouts available in the mix presentations. If we succeed then that becomes the playback layout and mix presentation to render. If there is no exact match, then we default to the first layout within the first mix presentation.\n\nPiperOrigin-RevId: 738537571\n"
    },
    {
      "commit": "2aeb1631a0c102b603c2e5fa324a7c4e5df71c11",
      "tree": "1e7de256c204f8b1eda3f5ef67b01590b9090eb2",
      "parents": [
        "e7603edee273d79f2902c55178c87345b8e75e45"
      ],
      "author": {
        "name": "yero",
        "email": "yero@google.com",
        "time": "Wed Mar 19 09:26:19 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 21 10:17:00 2025 -0400"
      },
      "message": "Reduces logging in the demixing module\n\nPiperOrigin-RevId: 738371336\n"
    },
    {
      "commit": "e7603edee273d79f2902c55178c87345b8e75e45",
      "tree": "c2e52db94c97d29e50a233536097c6368621a3d2",
      "parents": [
        "7f16f28267cc3d32f801de97756dd85e27ad57bf"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Tue Mar 18 14:07:25 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Mar 19 10:26:31 2025 -0400"
      },
      "message": "Update mix presentation filtering function to return all supported mix presentations rather than just the first one.\n\nPiperOrigin-RevId: 738073357\n"
    },
    {
      "commit": "7f16f28267cc3d32f801de97756dd85e27ad57bf",
      "tree": "3d1fd1aab8212efe8a1913b9def6808603c4eec7",
      "parents": [
        "46e3492d0db1cd1b575f17139a569c65c58747eb"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Tue Mar 18 13:14:28 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Mar 19 10:26:14 2025 -0400"
      },
      "message": "Update iamf_decoder to ensure that Decode() exits after processing descriptors for the first time to allow the user a chance to perform any desired configurations. Any temporal units pushed in the initial Decode() call will be held and processed once Decode() is called again.\n\nPiperOrigin-RevId: 738052270\n"
    },
    {
      "commit": "46e3492d0db1cd1b575f17139a569c65c58747eb",
      "tree": "a3d8d3bff2a297c9f1c9136f844cccf917f68ea1",
      "parents": [
        "de33dfb62a1abd9e46454e1e1ba753a3afa29530"
      ],
      "author": {
        "name": "yero",
        "email": "yero@google.com",
        "time": "Tue Mar 18 09:52:08 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Mar 19 10:25:50 2025 -0400"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 737987416\n"
    },
    {
      "commit": "de33dfb62a1abd9e46454e1e1ba753a3afa29530",
      "tree": "8f6e1d0a5c97273efb220e8f5e4a5744ccf88b22",
      "parents": [
        "a3d8d2f014543e09e5ee08c2237aef67e050ade1"
      ],
      "author": {
        "name": "yero",
        "email": "yero@google.com",
        "time": "Tue Mar 18 03:33:35 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Mar 19 10:25:28 2025 -0400"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 737896687\n"
    },
    {
      "commit": "a3d8d2f014543e09e5ee08c2237aef67e050ade1",
      "tree": "3657d095032edd2b0a21dc7e24706c78273aeaf1",
      "parents": [
        "0857a0a21e33f7bc36e29abef39c8cf72b7fd2cb"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Mon Mar 17 16:14:00 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Mar 19 10:25:07 2025 -0400"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 737726816\n"
    },
    {
      "commit": "0857a0a21e33f7bc36e29abef39c8cf72b7fd2cb",
      "tree": "e2281eeb035088c65283fd40af4ef6c320f77c63",
      "parents": [
        "c5aa05029b5443a51d86580472de98ec02e1b112"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Mon Mar 17 15:46:40 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Mar 19 10:24:50 2025 -0400"
      },
      "message": "`TemporalUnitView`: provides the end_timestamp.\n\nPiperOrigin-RevId: 737717066\n"
    },
    {
      "commit": "c5aa05029b5443a51d86580472de98ec02e1b112",
      "tree": "2682841e73ead82f7b5ac784b8bbe68c29719ae5",
      "parents": [
        "57362d64e6f1a9242608d9f8e8db62bd04b78c1c"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Mon Mar 17 15:33:51 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Mar 19 10:24:32 2025 -0400"
      },
      "message": "Add a more flexible util to create LPCM codec configs.\n\nPiperOrigin-RevId: 737712971\n"
    },
    {
      "commit": "57362d64e6f1a9242608d9f8e8db62bd04b78c1c",
      "tree": "2226ef24ace38dc302b9aa9c342a62ecd91ad03c",
      "parents": [
        "a8ae249e93f255b01ffaf9ff59b0a28658d02397"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Fri Mar 14 14:12:27 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Mar 19 10:24:07 2025 -0400"
      },
      "message": "Create fuzz tests for iamf_decoder.h interface\n\nPiperOrigin-RevId: 736923949\n"
    },
    {
      "commit": "a8ae249e93f255b01ffaf9ff59b0a28658d02397",
      "tree": "5cf73da9c1201300399aae5636dca1de8afec009",
      "parents": [
        "7cca7a09d7cb081d0eb0cf5c64746e95e5de65c1"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Fri Mar 14 13:25:30 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Mar 19 10:23:40 2025 -0400"
      },
      "message": "Defensively set insufficient_data to be false\n\nPiperOrigin-RevId: 736907379\n"
    },
    {
      "commit": "7cca7a09d7cb081d0eb0cf5c64746e95e5de65c1",
      "tree": "9d69f5bdd1f527775d672a1c11804a65c7d38c85",
      "parents": [
        "15302771411e6bf423346cccfa6ba1e76c15c44a"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Fri Mar 14 13:21:31 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Mar 19 10:23:17 2025 -0400"
      },
      "message": "Small tweaks to the API interface and iamf_decoder.cc\n\n- Make OutputFileBitDepth an enum class\n- Remove unused includes\n\nPiperOrigin-RevId: 736905844\n"
    },
    {
      "commit": "15302771411e6bf423346cccfa6ba1e76c15c44a",
      "tree": "ad0a3868724694a71b8dfe9c1f394a04ab91f917",
      "parents": [
        "14c5c5f038d0a006dafb382fe9fd5c83baf72b10"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 14 12:22:00 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 14 12:48:41 2025 -0400"
      },
      "message": "Harden and split `DemixingModule::DemixAudioSamples` into two functions.\n\n  - This class is used in different contexts. In some contexts we want the \"original\" audio samples (before lossy encoding), in other contexts we want the\n\"decoded\" audio sample (after lossy encoding).\n    - Add docs references these two contexts.\n  - Split and rename the function, so the two modes can be used differently.\n    - In lieu of \"unused\" output arguments.\n    - Forbid the usage of `DemixOriginalAudioSamples`, when in \"reconstruction\" only mode.\n  - Update output arg based on `StatusOr`.\n    - Removes reference-based output args and any assumptions about their state.\n\nPiperOrigin-RevId: 736886116\n"
    },
    {
      "commit": "14c5c5f038d0a006dafb382fe9fd5c83baf72b10",
      "tree": "9774670b78781078ee2d0bd63d03f251c4408af5",
      "parents": [
        "ac45e4aa4ff05bbbb3f278bde49ebfe2e64321a7"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 14 12:15:27 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 14 12:48:06 2025 -0400"
      },
      "message": "Stamp build info in MacOS and Linux\n\n  - Using https://bazel.build/docs/user-manual#workspace-status, we can run a script and determine key-value pairs.\n    - Mimic the `STABLE_GIT_COMMIT` example, named `BUILD_CHANGELIST`.\n  - Implement a special library with `linkstamp`, to convert this preprocessor define to a string.\n    - `linkstamp` limits library dependencies (including stdlib), write a c-style `build_info.{cc,h}` to convert `BUILD_CHANGELIST` to a string for the rest of the code to use.\n  - `MixPresentationGenerator` stamps this into the mix presentation (E.g GitHub/iamf-tools@abcdef0123 if the commit hash is found, or GitHub/iamf-tools@unknown otherwise)\n    - TODO b/388577499: Implement an analog of `git_status_command.sh` for Windows (as of this CL it safely should fallback to @unknown).\n\nPiperOrigin-RevId: 736884361\n"
    },
    {
      "commit": "ac45e4aa4ff05bbbb3f278bde49ebfe2e64321a7",
      "tree": "99045d3fdc4c2059f17db35551e215d880c1e1fe",
      "parents": [
        "6a9fc32ab64d25ccbaf358435e143c0ce66436b1"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Wed Mar 12 12:29:25 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 14 10:24:07 2025 -0400"
      },
      "message": "ObuSequencer: Introduce `UpdateDescriptorObusAndClose`.\n\n  - Motivation:\n    - b/274135982: Allows retroactively updating the measured loudness without holding the entire IA Sequence, or knowing it beforehand.\n    - Update the `total_samples_per_stream` for FLAC codec configs.\n  - Implementation:\n    - `ObuSequencerIamf` exploits the check that the descriptors are the same size, to rewrite the file in place.\n    - This works well with the planned use cases, return `UnimplementedError` in case we have a use for the other cases.\n\nPiperOrigin-RevId: 736159557\n"
    },
    {
      "commit": "6a9fc32ab64d25ccbaf358435e143c0ce66436b1",
      "tree": "45700b6be985691889479a548e245dd1d8055072",
      "parents": [
        "b851e19f68e46505e45b7c1fa272371229f17406"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Wed Mar 12 11:26:54 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 14 10:23:47 2025 -0400"
      },
      "message": "Deprecate `PickAndPlace` in favor of a new iterative `ObuSequencer` interface.\n\n  - Break out `{PushDescriptorObus, PushTemporalUnit, Close, Abort}` from `PickAndPlace`.\n    - b/397637224: Still has TODOs, like a hook to update the descriptors (e.g. finalize loudness).\n    - Adjust some virtual functions to be `*Derived`. This allows base to manage state, such as forbidding duplicate calls, before dispatching to the virtual functions.\n  - Deprecate `PickAndPlace` and static functions, which now primarily uses the interface in a public.\n  - Many new tests are derived from a related `PickAndPlace`\n    - Existing `PickAndPlace` tests prove the new interface does not change meaningfully change behavior.\n    - New tests have more granular observations.\n    - Forking these tests faciliate dropping `PickAndPlace` and all related tests in the future (without losing coverage).\n  - Drive-bys:\n    - `PickAndPlace` behavior tweak: Use a default `num_samples_per_frame` from 0 to 1024, for trivial IA sequences. We prefer plausible defaults.\n    - `TemporalUnitView` exposes `start_timestamp_`.\n\nPiperOrigin-RevId: 736141242\n"
    },
    {
      "commit": "b851e19f68e46505e45b7c1fa272371229f17406",
      "tree": "ceb02a3ea05d31460232802056e4bfbe1b1a05c7",
      "parents": [
        "752845711460dce6dc4ceb07ca03870ab8d69a04"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Wed Mar 12 10:17:46 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 14 10:23:28 2025 -0400"
      },
      "message": "Log the entire Mix Presention OBU after finalization. Also log omitted `mix_presentation_tags`.\n\n  - Generally this is useful, but it also helps debug b/388577499 work.\n\nPiperOrigin-RevId: 736122237\n"
    },
    {
      "commit": "752845711460dce6dc4ceb07ca03870ab8d69a04",
      "tree": "e46fe8b05dabbbb9075ffc61e4e150933651e5aa",
      "parents": [
        "f5f20cd6a6e90a062eff24b173e948810fe039ea"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Mon Mar 10 15:53:19 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 14 10:22:53 2025 -0400"
      },
      "message": "Add support for an arbitrary streaming use case.\n\nProcessTemporalUnit changes:\n- The conditions for ending a temporal unit are updated to reflect that we do not know if the end of a chunk of data means that a temporal unit is complete in the streaming case.\n- An output std::optional\u003cTemporalUnit\u003e has also been added to neatly contain the previous output args - this is only filled if the ending conditions are true.\n\nProcessAllTemporalUnits is updated to use this accordingly. All other uses of ProcessTemporalUnit are updated as well - this works for Youtube.\n\nPiperOrigin-RevId: 735480310\n"
    },
    {
      "commit": "f5f20cd6a6e90a062eff24b173e948810fe039ea",
      "tree": "575451ea4defa987db7d203a17270c4dcf21430a",
      "parents": [
        "822154612b39fd68e191d0f02c289ea725c9972f"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Mon Mar 10 13:52:13 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 14 10:22:23 2025 -0400"
      },
      "message": "Add test coverage for ProcessTemporalUnit which was previously missing.\n\nThis covers end of sequence, new timestamp, and temporal delimiter conditions to finalize a temporal unit.\n\nSubsequent cls will change the behavior of this function, so it is helpful to add these tests now to confirm the current behavior.\n\nPiperOrigin-RevId: 735437650\n"
    },
    {
      "commit": "822154612b39fd68e191d0f02c289ea725c9972f",
      "tree": "7052ab5d4bd75b6cc6378073f5370fe62da04e08",
      "parents": [
        "98a55bdb438f412c476faf7979db8db648df5929"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Mon Mar 10 13:01:25 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 14 10:22:07 2025 -0400"
      },
      "message": "`mix_presentation.proto`: Deprecate several `num*` fields.\n\n  - Similar to the rationale of AOMediaCodec/iamf_tools@d6e92ac9, these fields are useless and hold no real information and only serve to make the proto more complicated.\n  - In the future this facilitates removing the internal `MixPresentationObu::num_tags_` state.\n\nPiperOrigin-RevId: 735417861\n"
    },
    {
      "commit": "98a55bdb438f412c476faf7979db8db648df5929",
      "tree": "5cc882c875db5360bea4c6eef081c02efa6be1d4",
      "parents": [
        "7260deff0a9e0a1a4388422bfac2707b8ed015f6"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Mon Mar 10 11:02:53 2025 -0400"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 14 10:21:49 2025 -0400"
      },
      "message": "Clean up obsolete TODOs about mixing audio to a common format.\n\n  - The spec confusingly states rules for how to handle multiple Codec Config OBUs with different sample rates, while forbidding multiple Codec Config OBUs all profiles.\n  - Since this case is forbidden by all IAMF v1.1.0 profiles, leave a comment and return `UnimplementedError`. Instead of an unactionable TODO.\n  - If the spec adds profiles which allows multiple Codec Config OBUs with different sample rates in the future, we will quickly discover the `UnimplementedError` and decide how to handle it.\n\nPiperOrigin-RevId: 735377289\n"
    },
    {
      "commit": "7260deff0a9e0a1a4388422bfac2707b8ed015f6",
      "tree": "52662e39fc66b3696b6cb43421720a228683950d",
      "parents": [
        "612bf29777031b1d154a0126ba5ffe7b3b7a3c0f"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Fri Mar 07 15:18:59 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Mar 14 10:21:21 2025 -0400"
      },
      "message": "Implement \u0027lookahead\u0027 behavior in ProcessTemporalUnitObu.\n\nThis checks that there is enough data in the buffer to read the obu before attempting to read it, which allows us to signal via continue_processing \u003d false that there is not enough data instead of erroring out (previous behavior).\n\nPiperOrigin-RevId: 734647816\n"
    },
    {
      "commit": "ffe7a9238cc6e585590ff80834aa6f822a198833",
      "tree": "0d5d72125a489bae2aacc09a775b012534145b2a",
      "parents": [
        "bf55736df0b04fda9d6bd63bc3305fb63755c537",
        "9b60e4ae0fc4a534fcf0d86e20cf22e39c72be29"
      ],
      "author": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Fri Mar 07 08:16:14 2025 -0800"
      },
      "committer": {
        "name": "Automerger Merge Worker",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Fri Mar 07 08:16:14 2025 -0800"
      },
      "message": "Fill out rest of build rule for iamf_tools am: 9b60e4ae0f\n\nOriginal change: https://android-review.googlesource.com/c/platform/external/iamf_tools/+/3528255\n\nChange-Id: I7072a9e8b392311110d59629cc47aafac7cb397c\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "bf55736df0b04fda9d6bd63bc3305fb63755c537",
      "tree": "4bdb79c2d7769633f93c4b995e693d15cb35d5a2",
      "parents": [
        "27a7d3d2f9b11836a97672fdd946d5eeebb451b8",
        "9854a1940eabb223ef8bbc6911d9d61c642b25d2"
      ],
      "author": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Thu Mar 06 20:38:38 2025 -0800"
      },
      "committer": {
        "name": "Automerger Merge Worker",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Thu Mar 06 20:38:38 2025 -0800"
      },
      "message": "Merge \"Upgrade iamf_tools to 612bf29777031b1d154a0126ba5ffe7b3b7a3c0f\" into main am: 9854a1940e\n\nOriginal change: https://android-review.googlesource.com/c/platform/external/iamf_tools/+/3528296\n\nChange-Id: I5fa0156a55ac99e590b10eac68b8b5c10e26a67b\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "9b60e4ae0fc4a534fcf0d86e20cf22e39c72be29",
      "tree": "0d5d72125a489bae2aacc09a775b012534145b2a",
      "parents": [
        "9854a1940eabb223ef8bbc6911d9d61c642b25d2"
      ],
      "author": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Thu Mar 06 20:36:43 2025 -0800"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Thu Mar 06 20:36:43 2025 -0800"
      },
      "message": "Fill out rest of build rule for iamf_tools\n\nWith this CL, the decoder in iamf_tools/iamf/api/decoder/iamf_decoder.h is \navailable.\n\nBug: 388336285\nChange-Id: I31353c67bd62fb6f3b1607c9066de66723ad94b3\n"
    },
    {
      "commit": "9854a1940eabb223ef8bbc6911d9d61c642b25d2",
      "tree": "4bdb79c2d7769633f93c4b995e693d15cb35d5a2",
      "parents": [
        "27a7d3d2f9b11836a97672fdd946d5eeebb451b8",
        "cc6761904f031a63fbf87961f56b518b32a3293c"
      ],
      "author": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Thu Mar 06 20:21:31 2025 -0800"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Mar 06 20:21:31 2025 -0800"
      },
      "message": "Merge \"Upgrade iamf_tools to 612bf29777031b1d154a0126ba5ffe7b3b7a3c0f\" into main"
    },
    {
      "commit": "cc6761904f031a63fbf87961f56b518b32a3293c",
      "tree": "4bdb79c2d7769633f93c4b995e693d15cb35d5a2",
      "parents": [
        "fc477a32eb8ffb804446e7ac10f662c0be005264",
        "612bf29777031b1d154a0126ba5ffe7b3b7a3c0f"
      ],
      "author": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Thu Mar 06 15:49:36 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Thu Mar 06 15:49:36 2025 +0000"
      },
      "message": "Upgrade iamf_tools to 612bf29777031b1d154a0126ba5ffe7b3b7a3c0f\n\nThis project was upgraded with external_updater.\nUsage: tools/external_updater/updater.sh update external/iamf_tools\nFor more info, check https://cs.android.com/android/platform/superproject/main/+/main:tools/external_updater/README.md\n\nBug: 388336285\nTest: TreeHugger\nChange-Id: I43ba3126f268d6bfc1220d5d52c4763c0468309b\n"
    },
    {
      "commit": "612bf29777031b1d154a0126ba5ffe7b3b7a3c0f",
      "tree": "a7b0eb779ee15731d413faaed5e3c4825119d730",
      "parents": [
        "92c262749b891427b9b191839faf712443b47285"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Thu Mar 06 15:11:06 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Thu Mar 06 15:16:20 2025 +0000"
      },
      "message": "Remove redundant range check in ValidateInRange\n\nError triggered:\nnon-void function does not return a value in all control paths\n\nPiperOrigin-RevId: 734130673\n"
    },
    {
      "commit": "92c262749b891427b9b191839faf712443b47285",
      "tree": "838a7b983158f12e4406f77809d553b1b14c4c19",
      "parents": [
        "23766cab19b68da0d1a5f7b87e0273da523e7209"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Thu Mar 06 15:09:32 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Thu Mar 06 15:16:07 2025 +0000"
      },
      "message": "Remove AAC library include when DISABLE_AAC define is defined\n\nPiperOrigin-RevId: 734130204\n"
    },
    {
      "commit": "23766cab19b68da0d1a5f7b87e0273da523e7209",
      "tree": "9b7f55b86b24dc013dca138a80f625e0e2aaddc7",
      "parents": [
        "dde7dd2206c6c6a552e96a35403ea01473ac2a8d"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Thu Mar 06 15:08:00 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Thu Mar 06 15:15:56 2025 +0000"
      },
      "message": "Fix warning about class/struct mismatch for DecoderState\n\nThe `DecoderState` is forward declared as a class but then defined as a struct which produced this warning:\n\n\"\"\"\nerror: \u0027DecoderState\u0027 defined as a struct here but previously declared as a class; this is valid, but may result in linker errors under the Microsoft C++ ABI [-Werror,-Wmismatched-tags]\n\"\"\"\nPiperOrigin-RevId: 734129694\n"
    },
    {
      "commit": "dde7dd2206c6c6a552e96a35403ea01473ac2a8d",
      "tree": "5c438a02f24a7b268a3794a2937ed6566421a0ad",
      "parents": [
        "0e0c206684acb4fd2716ef7f3673d3f75e7cd83c"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Thu Mar 06 15:06:22 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Thu Mar 06 15:15:39 2025 +0000"
      },
      "message": "Fill in api::OutputLayout with all loudspeaker layouts\n\nThe api::IamfDecoder::ConfigureOutputLayout method still returns an \u0027unimplemented\u0027 error for all values.\n\nPiperOrigin-RevId: 734129093\n"
    },
    {
      "commit": "27a7d3d2f9b11836a97672fdd946d5eeebb451b8",
      "tree": "926eb451cd94feb4b9cf4c9b8058a7c6a15721d9",
      "parents": [
        "f3411156731e432c4bd268d6fb9517c124cd42ba",
        "fc477a32eb8ffb804446e7ac10f662c0be005264"
      ],
      "author": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 14:05:12 2025 -0800"
      },
      "committer": {
        "name": "Automerger Merge Worker",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Wed Mar 05 14:05:12 2025 -0800"
      },
      "message": "Upgrade iamf_tools to 0e0c206684acb4fd2716ef7f3673d3f75e7cd83c am: fc477a32eb\n\nOriginal change: https://android-review.googlesource.com/c/platform/external/iamf_tools/+/3527192\n\nChange-Id: I532fa16259b74777d8c4c06ba0e7b907c8a5bbfb\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "fc477a32eb8ffb804446e7ac10f662c0be005264",
      "tree": "926eb451cd94feb4b9cf4c9b8058a7c6a15721d9",
      "parents": [
        "78bb12ff1313770eda75005a14ece4cdc8ba3f95",
        "0e0c206684acb4fd2716ef7f3673d3f75e7cd83c"
      ],
      "author": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 19:46:50 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 19:46:50 2025 +0000"
      },
      "message": "Upgrade iamf_tools to 0e0c206684acb4fd2716ef7f3673d3f75e7cd83c\n\nThis project was upgraded with external_updater.\nUsage: tools/external_updater/updater.sh update external/iamf_tools\nFor more info, check https://cs.android.com/android/platform/superproject/main/+/main:tools/external_updater/README.md\n\nBug: 388336285\nTest: TreeHugger\nChange-Id: Ic0dd20cf5bca98c938cd2e42660406a2da8c50f5\n"
    },
    {
      "commit": "0e0c206684acb4fd2716ef7f3673d3f75e7cd83c",
      "tree": "941028418b2059e7207fb4c58534435d6a18b959",
      "parents": [
        "8488581a9270717e1fdbfa998c19fe5f348277e5"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Wed Mar 05 12:59:15 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Mar 05 13:02:03 2025 -0500"
      },
      "message": "Fix Windows bug where stray files could be leftover after failure.\n\n  - Close the file handle, before deleting the file.\n  - b/397637224: The redesign (in progress) had an accidental regression on Windows.\n\nPiperOrigin-RevId: 733773464\n"
    },
    {
      "commit": "8488581a9270717e1fdbfa998c19fe5f348277e5",
      "tree": "afa1c28aed233e7c48ff66cac24d0cea2d0c8a33",
      "parents": [
        "2f4b3f5f7ba814b70c02b5c6b3298db4eef1316f"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 15:29:34 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 16:06:15 2025 +0000"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 733726170\n"
    },
    {
      "commit": "2f4b3f5f7ba814b70c02b5c6b3298db4eef1316f",
      "tree": "2f55a39f1ad9aa1a6df259f132d54ebf5a298154",
      "parents": [
        "45b954765c63f48c635339fd2c615bf4bdeb41c3"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 14:50:14 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 16:06:06 2025 +0000"
      },
      "message": "Create api/conversion dir and conversion util for Layouts\n\nPiperOrigin-RevId: 733714723\n"
    },
    {
      "commit": "45b954765c63f48c635339fd2c615bf4bdeb41c3",
      "tree": "bbaf336a538c1575be870b320672446f1ee67713",
      "parents": [
        "aa4a842591a413239e03e9683b1b1dc2b08245b8"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 14:36:23 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 16:05:55 2025 +0000"
      },
      "message": "Create api/types.h for the types that can be provided/returned from IamfDecoder\n\nThere are only three, but in the future we could split the file if needed.\n\nAlso remove the BitDepth which is not used (and the Configure method is not defined).\n\nNext step is to create conversion methods for these API types to internal types.\n\nPiperOrigin-RevId: 733711008\n"
    },
    {
      "commit": "aa4a842591a413239e03e9683b1b1dc2b08245b8",
      "tree": "b2ea598c0e9b7bfc7318a7a66ed0158d6afa93c9",
      "parents": [
        "2fadd95b69e20129d711d1c088ce6105677ba710"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Wed Mar 05 14:33:18 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 16:05:40 2025 +0000"
      },
      "message": "Refactor `ObuBase::PickAndPlace` to be concrete, and dispatch to abstract functions.\n\n  - `PickAndPlace` not gathers top-level statistics and delegates the packing to virtual `PushSerializedDescriptorObus` and `PushSerializedTemporalUnit` functions.\n  - Notably, the the concrete `ObuSequencer`s no longer directly depend on \"internal OBUs\".\n  - Now this functionality can be tested with a `MockObuSequencer`.\n  - End-to-end use of `PickAndPlace` should behave the same, except some functions are hardened.\n  - Hide the deprecated `GenerateTemporalUnitMap` as an implementation detail. It has now outside users, it will eventually be entirely obsolete when `PickAndPlace` is removed.\n  - Future plan:\n    - This sets the internal to groundwork to expose an iterative API to sequence OBUs, and retire the memory-intensive `PickAndPlace`.\n\nPiperOrigin-RevId: 733710072\n"
    },
    {
      "commit": "2fadd95b69e20129d711d1c088ce6105677ba710",
      "tree": "b4e361531d1e670c6575b5bc193480d3c4840921",
      "parents": [
        "751e3d550e453c9021c3bde525e275c22461e11b"
      ],
      "author": {
        "name": "yero",
        "email": "yero@google.com",
        "time": "Wed Mar 05 14:10:46 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 16:05:25 2025 +0000"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 733703749\n"
    },
    {
      "commit": "751e3d550e453c9021c3bde525e275c22461e11b",
      "tree": "e1107e92a473fc4f5e9ca41bc890bdd2ba2db9e3",
      "parents": [
        "fce36c3bacd44c5c341a1911a633ab16dca20eb5"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 14:05:30 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 16:05:14 2025 +0000"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 733702380\n"
    },
    {
      "commit": "fce36c3bacd44c5c341a1911a633ab16dca20eb5",
      "tree": "adca236a5c837f47be60c6eafcfceb9692d6fdf2",
      "parents": [
        "0cf2ecb742549c25610bdb1d6c13514539d62e7e"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Tue Mar 04 19:55:51 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 16:05:01 2025 +0000"
      },
      "message": "Move iamf_decoder into api/decoder subfolder\n\nPiperOrigin-RevId: 733413185\n"
    },
    {
      "commit": "0cf2ecb742549c25610bdb1d6c13514539d62e7e",
      "tree": "6a58ce0075b3750407cb9f5aa59565e6a79aa6b0",
      "parents": [
        "385c356527cc20ca29c548078cd1afb547224f75"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Tue Mar 04 18:28:26 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 16:04:49 2025 +0000"
      },
      "message": "Port usage of `TemporalUnit` to `TemporalUnitView`.\n\n  - Remove some redundant checks and obsolete tests on `WriteTemporalUnit`, since it\u0027s impossible to create a view to pass to them with those features invalid.\n  - Prefer the simpler `TemporalUnitView::Create` when the holder expects/requires to have one temporal unit. Previous usage was awkward to call  `ObuSequencerBase::GenerateTemporalUnitMap`, and check that it only had one.\n  - Discourage further use of `ObuSequencerBase::GenerateTemporalUnitMap`, which is unsuitable for production code, since it requires all temporal units to be help in memory.\n\nPiperOrigin-RevId: 733379277\n"
    },
    {
      "commit": "385c356527cc20ca29c548078cd1afb547224f75",
      "tree": "5dde97e8081b37a5eea3641d4bf1d5afa05ef212",
      "parents": [
        "22c56e41fea1b22dab77c96cb30a9f28631758c6"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Tue Mar 04 17:18:25 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 16:04:35 2025 +0000"
      },
      "message": "Implement `TemporalUnitView` and make temporal unit logic stricter.\n\n  - The new view is significantly more sanitized, and it guarentees the holder has a valid temporal unit.\n  - Intended to supersede `ObuSequencerBase::TemporalUnit` in the near future, which will allow dropping validation logic in that class implementation.\n  - The pointer-based factory is intended to adapt to `ObuSequencer::PickAndPlace`, until it is deprecated.\n  - The container-based factory is intended to adapt to other usages, where the holder knows they have one temporal unit.\n  - b/332956880: In the future, this view is intended to be extended to accept a custom comparator, to use when ordering the OBUs in the view.\n\nPiperOrigin-RevId: 733354817\n"
    },
    {
      "commit": "22c56e41fea1b22dab77c96cb30a9f28631758c6",
      "tree": "22abba557998898b3fd4ea8cfc05e70366d53725",
      "parents": [
        "5806a8146c50a68dc8462efb90d3789cb7987678"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Tue Mar 04 16:13:47 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Mar 05 16:04:20 2025 +0000"
      },
      "message": "Improve `CodecId` debugging/logging string.\n\n  - Now when logging the `CodecConfigObu`, the output looks like \"codec_id\u003d 0x6970636d ( LPCM )\".\n\nPiperOrigin-RevId: 733334839\n"
    },
    {
      "commit": "5806a8146c50a68dc8462efb90d3789cb7987678",
      "tree": "dba810f223801b9068f575b1b2ac100be2a982fe",
      "parents": [
        "7f929be0558ccb1c6d7ccc1cfac164f31736343f"
      ],
      "author": {
        "name": "flim",
        "email": "flim@google.com",
        "time": "Fri Feb 28 15:10:46 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 28 16:12:48 2025 -0500"
      },
      "message": "docs: Document how to use MP4Box with IAMF, including an example.\n\nPiperOrigin-RevId: 732217330\n"
    },
    {
      "commit": "7f929be0558ccb1c6d7ccc1cfac164f31736343f",
      "tree": "e1488cd3e6e1a3a633997f1973310fd8a85c3955",
      "parents": [
        "285e1242f4d2f06fc6a217db3f6adf91baabe440"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 28 09:04:05 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 28 09:06:07 2025 -0500"
      },
      "message": "By default, insert a tag describing the build information.\n\n  - Previous default:\n    - `include_mix_presentation_tags \u003d\u003d false` omitted tags. This is natural for strict Simple or Base profile behavior. It also distinguishes absence from \"zero tags are present\" case.\n  - New default:\n    - Automatically get a tag describing the build information.\n    - Old mode is accessible by flipping this switch. See pre-existing `MixPresentationTagsPresenceTest/MixPresentationTagsArePresentOrAbsent` for modes and details and rationale.\n    - We need this to be default in order to be useful.\n  - Force `testdata/*.proto` files to to old behavior\n    - It seems controverisal for the \"official test vectors\" to use extension features.\n    - We also generally like the test vectors generally to be stable. Not \"contracted\" to be stable, but changing them every time the commit hash changes will lose this property.\n  -  Intentionally leave b/388577499 open; adding the git commit hash is in scope of this new field.\n\nPiperOrigin-RevId: 732110235\n"
    },
    {
      "commit": "285e1242f4d2f06fc6a217db3f6adf91baabe440",
      "tree": "f929c7d1489fb48e67c2103cc48edcae892794aa",
      "parents": [
        "8e89431db36f3748daf355ca55bd2939629ee446"
      ],
      "author": {
        "name": "yero",
        "email": "yero@google.com",
        "time": "Thu Feb 27 15:48:50 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 28 09:05:40 2025 -0500"
      },
      "message": "Removes `PerIdParamMetadata`\n\n- Moves relevant information to the param definitions themselves.\n- Param definitions are stored in a map whose value type is the variant\n  of all supported param definition types.\n  - Defines a `param_definition_variant` type for this.\n  - Previously stored as `const ParamDefintion*`, which historically gave us\n    headache dealing with pointer validity. Now they are stored by-value.\n- Param definitions are responsible of creating their corresponding parameter\n  data. E.g. demixing param definition \"creates\" demixing info parameter data.\n\nPiperOrigin-RevId: 731829959\n"
    },
    {
      "commit": "8e89431db36f3748daf355ca55bd2939629ee446",
      "tree": "22f9d5b6f62d2d48cd6db215c5577965ba468c0f",
      "parents": [
        "646a5e577316894221d79a53f4e8a2e6dc216dc5"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 26 12:27:21 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 26 16:36:24 2025 -0500"
      },
      "message": "Break out `SerializeObusExpectOk`.\n\n  - Mostly used at higher level tests to check the ordering and presence of OBUs after serialization.\n  - This pattern was used in several tests, standardize it to the dominant pattern.\n  - Add missing `MockObu`. Preferring to keep it in `obu/tests`, close to `ObuBase`.\n\nPiperOrigin-RevId: 731347270\n"
    },
    {
      "commit": "646a5e577316894221d79a53f4e8a2e6dc216dc5",
      "tree": "bbc719488c5906c78c74269e83e7c8b445d382a3",
      "parents": [
        "1b21e977c0c6dc5f40f6e7caa47beed3823822b9"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 26 11:44:32 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 26 16:36:02 2025 -0500"
      },
      "message": "Remove `ValidateAndGetCommonTrim`, which was used only in tests.\n\n  - This function is no longer used, after regular code stopped holding all audio frames.\n  - Instead of migrating this to test only code, it seems better to just update the few existing tests to directly check for the expected pre-skip.\n\nPiperOrigin-RevId: 731332817\n"
    },
    {
      "commit": "1b21e977c0c6dc5f40f6e7caa47beed3823822b9",
      "tree": "cedb2cc3ca15f3d4025d5b92b1aecdd76efe0185",
      "parents": [
        "3536c28bfe12dd0d58d55d982fb442ddffa21751"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 26 10:25:57 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 26 11:19:02 2025 -0500"
      },
      "message": "Fix bad default bitrate setting; let `fdk_aac` automatically determine it.\n\n  - §2.9.1 of [doc](https://android.googlesource.com/platform/external/aac/+/refs/heads/main/documentation/aacEncoder.pdf) recommends 1.5 bits per sample.\n  - `AACENC_BITRATE` should be configured based on the bitrate in bits of the entire stream. The existing equation was off by a factor of `num_samples_per_frame`.\n  - Opt to just simplify the code by relying on the automatic calculation documented in https://android.googlesource.com/platform/external/aac/+/refs/heads/main/libAACenc/include/aacenc_lib.h#384.\n  - Fixes very poor default bitrate settings noted in AOMediaCodec/iamf-tools#25.\n  - Leave the issue open, because we can/should allow the same types of bitrate controls as we have for Opus.\n\nPiperOrigin-RevId: 731308993\n"
    },
    {
      "commit": "3536c28bfe12dd0d58d55d982fb442ddffa21751",
      "tree": "4de4eb4baccce66d422e4f0ad08dfdfcd0de110e",
      "parents": [
        "1c1fe481d689d29ba878bb88003ce9dcc85d1075"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Tue Feb 25 21:33:56 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Feb 26 14:32:38 2025 +0000"
      },
      "message": "No public description\n\nPiperOrigin-RevId: 731010115\n"
    },
    {
      "commit": "1c1fe481d689d29ba878bb88003ce9dcc85d1075",
      "tree": "b0a5c1f669ef10afa794b3fef40be6d7e25dea82",
      "parents": [
        "061d531d8f41a9bb4901974f1a44e6408397fa92"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Tue Feb 25 20:24:50 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Feb 26 14:32:27 2025 +0000"
      },
      "message": "Implement `GlobalTimingModule::Create`, harden move semantics.\n\n  - Use a factory function, instead of construct and `Initialize` pattern.\n  - Some modules hold it by reference.\n    - Delete the move constructor, and have the factory wrap it in `std::unique_ptr`.\n    - b/390150766: Improvement because it is now impossible to invalidate the reference by moving to underlying object; moving the pointer is safe.\n  - It felt unnecessary to further wrap this in `absl::StatusOr`.\n\nPiperOrigin-RevId: 730984795\n"
    },
    {
      "commit": "061d531d8f41a9bb4901974f1a44e6408397fa92",
      "tree": "ee6ac22f6542e00bc341a038fba0a8f792513aa0",
      "parents": [
        "5c9f8524c006a4eb42928475794413ce866dfbfe"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Tue Feb 25 18:47:35 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Feb 26 14:32:16 2025 +0000"
      },
      "message": "Refactor `global_timing_module_test`.\n\n  - The test class now holds some arguments helpful for using the class, but is otherwise much flatter.\n  - Flatten some tests. But leave the ones that hold and interact with OBUs as part of the text fixture.\n  - Fill in some coverage gaps.\n    - `GetGlobalAudioFrameTimestamp` which had no coverage.\n    - `Initialize`: Add more failure coverage.\n    - Add some coverage for results after failure.\n\nPiperOrigin-RevId: 730946576\n"
    },
    {
      "commit": "5c9f8524c006a4eb42928475794413ce866dfbfe",
      "tree": "be8e0fcae968b58da2c8b7fb44bb339f134020b9",
      "parents": [
        "f84e8447fc6ed4b68852fb25f1b28d4542bda04c"
      ],
      "author": {
        "name": "yero",
        "email": "yero@google.com",
        "time": "Mon Feb 24 22:32:19 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Feb 26 14:32:00 2025 +0000"
      },
      "message": "Fixes a bug where the size of `recon_gain_elements` !\u003d number of layers\n\n- This happens when some `recon_gain_is_present_flags[i]` is false.\n  - We forgot to push some null value into `recon_gain_elements` in this case.\n  - Modified `ReconGainInfoParameterData::recon_gain_elements` to hold an\n    optional `ReconGainElement` to be able to represent such null value.\n- Adds tests that would have caught this.\n- Drive-by: removes a constructor of `ReconGainInfoParameterData` that takes\n  in recon gain elements, which is used only in tests. Opts to directly access\n  the public field instead.\n\nPiperOrigin-RevId: 730598640\n"
    },
    {
      "commit": "f3411156731e432c4bd268d6fb9517c124cd42ba",
      "tree": "9013ae7d53b3ae1da64eea03f7e59322e1ea0435",
      "parents": [
        "7f45842daa5d9aadab0a9bf0708667eed755f889",
        "78bb12ff1313770eda75005a14ece4cdc8ba3f95"
      ],
      "author": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Mon Feb 24 14:42:13 2025 -0800"
      },
      "committer": {
        "name": "Automerger Merge Worker",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Mon Feb 24 14:42:13 2025 -0800"
      },
      "message": "Upgrade iamf_tools to f84e8447fc6ed4b68852fb25f1b28d4542bda04c am: 78bb12ff13\n\nOriginal change: https://android-review.googlesource.com/c/platform/external/iamf_tools/+/3506076\n\nChange-Id: I2e17ff48674c06d2f3668bf3786e690a30c0fe01\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "78bb12ff1313770eda75005a14ece4cdc8ba3f95",
      "tree": "9013ae7d53b3ae1da64eea03f7e59322e1ea0435",
      "parents": [
        "8fc4464200217f01871ae2c61f4ddba05d57ff66",
        "f84e8447fc6ed4b68852fb25f1b28d4542bda04c"
      ],
      "author": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Mon Feb 24 20:16:11 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Mon Feb 24 20:16:11 2025 +0000"
      },
      "message": "Upgrade iamf_tools to f84e8447fc6ed4b68852fb25f1b28d4542bda04c\n\nThis project was upgraded with external_updater.\nUsage: tools/external_updater/updater.sh update external/iamf_tools\nFor more info, check https://cs.android.com/android/platform/superproject/main/+/main:tools/external_updater/README.md\n\nBug: 388336285\nTest: TreeHugger\nChange-Id: I85b70f2beb77dece4ce5643d675b46d665c1d112\n"
    },
    {
      "commit": "f84e8447fc6ed4b68852fb25f1b28d4542bda04c",
      "tree": "e8f7e9c1f7a8f576f4f499b338633c3ee99e3c5f",
      "parents": [
        "74f767b5043d38e9724921997e89693664f60e38"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 21 09:45:29 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 21 09:47:28 2025 -0500"
      },
      "message": "Fix broken MacOS build.\n\n  - Keep the `void` use case, the main motivation here is that adapts to proto setters.\n  - If `absl::Status` case comes up we figure out how to write something portable.\n\nPiperOrigin-RevId: 729512102\n"
    },
    {
      "commit": "74f767b5043d38e9724921997e89693664f60e38",
      "tree": "49dc81dacec6e2e58324a1a38e664638eab58d22",
      "parents": [
        "3d0c7ce3ce89f56077313d5398ef14b46569d459"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 21 08:44:39 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 21 08:53:11 2025 -0500"
      },
      "message": "Change `WriteUint8Vector` to `WriteUint8Span` in WriteBitBuffer.\n\nPiperOrigin-RevId: 729496846\n"
    },
    {
      "commit": "3d0c7ce3ce89f56077313d5398ef14b46569d459",
      "tree": "8c0d51dabadd7065e5501684c6ed7e3c6d0c44b1",
      "parents": [
        "a814b62d0cc5df738a5a28d3a30ce35331eb2f6d"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 21 08:32:40 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 21 08:42:57 2025 -0500"
      },
      "message": "`MixPresentationGenerator`: Add an option to add a tag describing the build information.\n\n  - b/388577499:\n    - Update internal components to support appending build information.\n    - Right now the tag is simple: {\"iamf_encoder\" : \"iamf-tools\"}.\n    - Tests are written assuming a prefix, but will pass if we add a suffix with other info (e.g. commit hash, clean/dirty).\n    - This CL just adds \"internal\" support without actually exposing a way to use it end-to-end.\n  - Add a parameterized tests to show how to access different combinations of {tags absent, tags present with only user-provided tags, tags present with build information}.\n  - To make this feature useful, we switch it on by default in the future. Most tests will have it enabled. Except some specific tests which relied on exact tags matching the requests.\n\nPiperOrigin-RevId: 729494047\n"
    },
    {
      "commit": "a814b62d0cc5df738a5a28d3a30ce35331eb2f6d",
      "tree": "806f665b99698d134797bc258202d45da04ad054",
      "parents": [
        "3e619570ecea74ba4310d41afcf33391907a118d"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 21 08:32:30 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 21 08:42:36 2025 -0500"
      },
      "message": "Add `SetFromMap`.\n\n  - Similar to other map lookup functions. But directly call a user-provided setter.\n  - After lookup, the user-provided setter is called. If it returns `absl::Status`, the error being forwarded. Or for convenience the setter can return `void`.\n  - It will be convenient near other `proto_to_obu`-type conversions, where we can forward the proto setter directly.\n  - Use in `IaSequenceHeaderMetadataGenerator`.\n  - Drive-by:\n    - Give more descriptive names to nearby template args.\n\nPiperOrigin-RevId: 729494008\n"
    },
    {
      "commit": "3e619570ecea74ba4310d41afcf33391907a118d",
      "tree": "666f5155c9565b5e58b4a27b9b775ec423a9709b",
      "parents": [
        "f8297471eefdba7bde0bd0930c9bcc89a4ac5c16"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 21 08:26:47 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 21 08:42:15 2025 -0500"
      },
      "message": "Change `StreamBasedReadBuffer::PushBytes` to take a span.\n\n  - Note the internals copy the data. No lifetime issues are possible.\n  - This saves `decoder_api` from making extra copies every time data is pushed to adapt to the interface.\n\nPiperOrigin-RevId: 729492614\n"
    },
    {
      "commit": "f8297471eefdba7bde0bd0930c9bcc89a4ac5c16",
      "tree": "f9f741569610c77910c63684a0f78c1b93447234",
      "parents": [
        "d61f89a358963191b093adc0507f6404088a93bd"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 21 08:16:08 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 21 08:41:54 2025 -0500"
      },
      "message": "`ObuSequencer`: Split out `ObuSequencerBase/ObuSequencerIamf`.\n\n  - b/397637224: This class needs a bit of overhaul. Split out the implementation from the base first.\n\nPiperOrigin-RevId: 729490238\n"
    },
    {
      "commit": "d61f89a358963191b093adc0507f6404088a93bd",
      "tree": "49869ef9c90382d1ec587c06d4fed36274f29041",
      "parents": [
        "d92be1979858bea3a39f9740a81d8245c2a3674d"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Thu Feb 20 13:26:42 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 21 08:41:28 2025 -0500"
      },
      "message": "Implement IamfDecoder::Flush.\n\nIn order to support this, we add a new state_ enum which tracks the state of the decoder. It ensures that Decode cannot be called after a call to flush has been made. Flush is designed to be continually called until it signals it has output all remaining temporal units.\n\nPiperOrigin-RevId: 729162659\n"
    },
    {
      "commit": "7f45842daa5d9aadab0a9bf0708667eed755f889",
      "tree": "06d940bdbd0bf3ffdd64e86771c96848d18c1473",
      "parents": [
        "745bba0bf82249cba163306c638e4532b9f98212",
        "8fc4464200217f01871ae2c61f4ddba05d57ff66"
      ],
      "author": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Thu Feb 20 07:35:34 2025 -0800"
      },
      "committer": {
        "name": "Automerger Merge Worker",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Thu Feb 20 07:35:34 2025 -0800"
      },
      "message": "Create initial Android.bp with build rule for iamf_tools. am: 8fc4464200\n\nOriginal change: https://android-review.googlesource.com/c/platform/external/iamf_tools/+/3497279\n\nChange-Id: I31bcdb53217b046535de5266c42b782a8c3a4258\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "d92be1979858bea3a39f9740a81d8245c2a3674d",
      "tree": "1718e848c7b7758aa5a271886fc53c21c5130af8",
      "parents": [
        "0d08b38bdd0c8af851fe6734302f4e834f4bc1ee"
      ],
      "author": {
        "name": "yero",
        "email": "yero@google.com",
        "time": "Wed Feb 19 17:20:35 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 19 19:12:53 2025 -0500"
      },
      "message": "Parameter Block OBU to hold a constant reference of per-ID metadata\n\n- This disallows setting values via `ParameterBlockObu` when\n  `param_definition_mode \u003d\u003d 0`.\n  - This is more sensible, because `param_definition_mode \u003d\u003d 0` means the\n    values are defined in the param defintion (shared by all parameter blocks\n    with the same ID) and not in individual parameter blocks.\n  - None of the existing test vectors depend on this ability, which is\n    rightfully so.\n\nPiperOrigin-RevId: 728814894\n"
    },
    {
      "commit": "0d08b38bdd0c8af851fe6734302f4e834f4bc1ee",
      "tree": "97303842ade804f758b00ae0ab6680a066c5160b",
      "parents": [
        "baf63e5e90bf98969924a4f070ac20ec86ff6fcb"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Wed Feb 19 15:31:08 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 19 19:12:33 2025 -0500"
      },
      "message": "Implement GetOutputTemporalUnit().\n\nThis function returns the first temporal unit that was decoded. Because of this, we update the data structure which holds the rendered pcm samples to be a queue on the outermost layer, where each element represents a decoded temporal unit. This gives us O(1) time complexity on the querying of temporal units.\n\nPiperOrigin-RevId: 728772932\n"
    },
    {
      "commit": "8fc4464200217f01871ae2c61f4ddba05d57ff66",
      "tree": "06d940bdbd0bf3ffdd64e86771c96848d18c1473",
      "parents": [
        "05e8a35e7b0e910eb52d459ef069984db33048b4"
      ],
      "author": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Feb 19 15:39:00 2025 -0800"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Feb 19 15:39:00 2025 -0800"
      },
      "message": "Create initial Android.bp with build rule for iamf_tools.\n\nChange-Id: Iaa3f1d6e8fcaa00577802215c00907a7c47cf176\n"
    },
    {
      "commit": "baf63e5e90bf98969924a4f070ac20ec86ff6fcb",
      "tree": "ea603498f92b1c6a405e716dd38b1a2bee75edfd",
      "parents": [
        "e0b17bebb543e19e2f68fd1a5b2ffef581c94c17"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Wed Feb 19 15:07:10 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 19 15:12:18 2025 -0500"
      },
      "message": "Add IsTemporalUnitAvailable function.\n\nThis a convenience function provided to users to call in a while loop condition in order to know when they should stop querying for output temporal units.\n\nPiperOrigin-RevId: 728764403\n"
    },
    {
      "commit": "e0b17bebb543e19e2f68fd1a5b2ffef581c94c17",
      "tree": "ae79de5ac6f1044c267037f0b8493dd21f68d08f",
      "parents": [
        "6069869f7f19a98bc535fe31b0cbff5d72fba8f3"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Wed Feb 19 15:00:22 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 19 15:11:57 2025 -0500"
      },
      "message": "Add logic to decode temporal units in IamfDecoder::Decode. This implementation handles streams in which temporal units are always whole; it notably does not handle cases in which Decode() receives a partial temporal unit. This case is complicated and we currently don\u0027t have the proper underlying code to support this at this level. Subsequent cls will fix this issue.\n\nPiperOrigin-RevId: 728761230\n"
    },
    {
      "commit": "6069869f7f19a98bc535fe31b0cbff5d72fba8f3",
      "tree": "bfcc680d1d4f3e10c0c33653b4be524c8bcfdfb4",
      "parents": [
        "1e52a47cd739e938f0e24ded5a4a1a66ae53b165"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Wed Feb 19 14:49:51 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 19 14:51:03 2025 -0500"
      },
      "message": "Add initial IamfDecoder::Decode implementation.\n\nThis first cl adds the creation of an obu processor through the processing of descriptor obus. Subsequent cls will add implementation for processing of temporal units as well.\n\nPiperOrigin-RevId: 728757354\n"
    },
    {
      "commit": "1e52a47cd739e938f0e24ded5a4a1a66ae53b165",
      "tree": "fc29a914ef5c4fa80d1232e2bafbf1e835623f14",
      "parents": [
        "d6e92ac9f6081792bae1c29e3bb2b3f6e02791e8"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 19 09:36:05 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 19 09:37:46 2025 -0500"
      },
      "message": "Tweak build files to support directly loading `rules_cc`.\n\nPiperOrigin-RevId: 728648594\n"
    },
    {
      "commit": "d6e92ac9f6081792bae1c29e3bb2b3f6e02791e8",
      "tree": "3ef3c72613cffcf3ed7f2e9834a54eab574bdeaf",
      "parents": [
        "2ea5d8d9868cad6bb757e7cfd002a25b19ae7305"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 19 09:32:37 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 19 09:37:30 2025 -0500"
      },
      "message": "`MixPresentationGenerator`: Infer `num_tags` instead of requiring user input to match.\n\n  - b/397462369 This signal is pretty useless:\n    - When it matches the number of `tags`, then encoding would succeed.\n    - When it did not match the number of `tags`, then encoding would fail.\n    - Therefore, it is redundant with the number of `tags`, we can simply infer the correct value.\n    - N.b.: \"zero\" vs. \"absent\" tags case are distinguished via `include_mix_presentation_tags` (`CopiesMixPresentationTagsWithZeroTags` vs `IgnoresTagsWhenSetIncludeMixPresentationTagsIsFalse`).\n  - Motivation (b/388577499):\n    - In the future, the encoder may start inserting custom tags automatically.\n    - Avoid complicating behavior (what would `num_tags` represent at the proto layer, if the encoder adds implicit ones).\n    - Dropping the field means we can simply ignore and not care about the answer to this question - all we care is that the generated OBU has the final correct value.\n  - Tests:\n    - Add coverage that a poorly set `num_tags` is now ignored.\n    - Backfill test coverage when there are more than 255 tags (spec max).\n\nPiperOrigin-RevId: 728647443\n"
    },
    {
      "commit": "2ea5d8d9868cad6bb757e7cfd002a25b19ae7305",
      "tree": "e0c3813cc2bbe97bd4a02a3bfd7fcdef816857f4",
      "parents": [
        "00708c926766582220886eeade5226283a995b02"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Tue Feb 18 15:34:14 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 19 09:37:02 2025 -0500"
      },
      "message": "`ObuProcessor`: Log status in all paths where creation fails.\n\n  - Since the interface returns `std::unique_ptr`, we need to log the status or else it is lost.\n\nPiperOrigin-RevId: 728317055\n"
    },
    {
      "commit": "00708c926766582220886eeade5226283a995b02",
      "tree": "54b561c47df2d77cabda2e3386c89db50e04421f",
      "parents": [
        "a99a2e40cddbda038508005176cabb3c81e4e196"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Tue Feb 18 13:06:15 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Tue Feb 18 13:06:54 2025 -0500"
      },
      "message": "Fix broken Apple Clang \u003c 16.0.0 build: Avoid using parenthesized initialization of aggregates.\n\n  - `AudioElementParam` is an aggregate, which can only be initialized with parentheses in C++20. This is not well supported on MacOS/Apple Clang.\n  - b/338638106: Similar issue has shown up before, but now the most recent Apple Clang builds are claimed to support it (https://en.cppreference.com/w/cpp/compiler_support/20).\n  - Don\u0027t bump Apple Clang version for this; avoid the syntax for now.\n\nPiperOrigin-RevId: 728256265\n"
    },
    {
      "commit": "a99a2e40cddbda038508005176cabb3c81e4e196",
      "tree": "19405c864f7e7f1d1457c6fe654b5aa926d59f07",
      "parents": [
        "18011febb0ef4ccf0d13bca1e6850842210404da"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Tue Feb 18 10:11:18 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Tue Feb 18 10:19:42 2025 -0500"
      },
      "message": "Add a placeholder `EncoderControlMetadata` and a slot for one in `UserMetadata`.\n\n  - This CL simply introduces the slot for future \"bitstream\" controlling metadata.\n    - Label some fields in `TestVectorMetadata` that ideally would have been in and should migrate to `EncoderControlMetadata`.\n    - Annotate some which have pre-existing plans to update. They can naturally migrate when being updated.\n  - `TestVectorMetadata`: Prefer putting future metadata here which is useful to tag and describe conformance tests (e.g. b/384960137 info).\n  - `EncoderControlMetadata`: Prefer putting future knobs to control encoding features (e.g. b/388577499, b/309461674, b/390392510).\n\nPiperOrigin-RevId: 728196218\n"
    },
    {
      "commit": "18011febb0ef4ccf0d13bca1e6850842210404da",
      "tree": "3961f234924c8c0772835542a01a77778bd51e0e",
      "parents": [
        "b468d0da21548d61802c84c630934b9c8999b00f"
      ],
      "author": {
        "name": "yero",
        "email": "yero@google.com",
        "time": "Mon Feb 17 01:17:30 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Tue Feb 18 10:19:21 2025 -0500"
      },
      "message": "Removes RTTI by storing variants of `ParamDefinition`s in `AudioElementParam`\n\n- Customized cloning and comparison methods are no longer needed, because\n  the default copy constructor and `operator\u003d\u003d()` just work.\n- Also removes `param_definition_type` from various places, because the\n  same information is stored inside the parameter definition, which is\n  accessible through the added `GetType()` method.\n- [Drive-by] Renames obu_with_data_generator_tests.cc to\n  obu_with_data_generator_test.cc (losing the trailing \"s\"), and make it\n  a test target instead of a library.\n\nPiperOrigin-RevId: 727713472\n"
    },
    {
      "commit": "b468d0da21548d61802c84c630934b9c8999b00f",
      "tree": "a89ce52c57fc37e5519faded06156546f9c4bd31",
      "parents": [
        "715a73be2a8449461a9262ad053366cba9161611"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Fri Feb 14 16:20:31 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Tue Feb 18 10:13:30 2025 -0500"
      },
      "message": "Remove unused `FlacDecoder::flac_decoder_config_`.\n\n  - Simplify, since it was not even used. Which decouples the class and tests from `CodecConfigObu`.\n  - Hold `DecoderBase::num_samples_per_channel` as a `uint32_t`, to avoid a static cast. Aligns better with the same concept in `CocecConfigObu::GetNumSamplesPerFrame`\n  - Style fixes on existing tests.\n\nPiperOrigin-RevId: 727041458\n"
    },
    {
      "commit": "745bba0bf82249cba163306c638e4532b9f98212",
      "tree": "1e0d487b7ca00bbb741c0eb0123ae151d22f3178",
      "parents": [
        "b631ef3bfee5b96e8b68b8fac54ae0fc2df0cd3e",
        "05e8a35e7b0e910eb52d459ef069984db33048b4"
      ],
      "author": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Feb 12 16:33:35 2025 -0800"
      },
      "committer": {
        "name": "Automerger Merge Worker",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Wed Feb 12 16:33:35 2025 -0800"
      },
      "message": "Upgrade iamf_tools to 715a73be2a8449461a9262ad053366cba9161611 am: 05e8a35e7b\n\nOriginal change: https://android-review.googlesource.com/c/platform/external/iamf_tools/+/3491724\n\nChange-Id: I3e3d682f38317d721f727bf8934183d8ca4b8a33\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "05e8a35e7b0e910eb52d459ef069984db33048b4",
      "tree": "1e0d487b7ca00bbb741c0eb0123ae151d22f3178",
      "parents": [
        "39f0709cae87370fa3fbe0cb80866088243cea9d",
        "715a73be2a8449461a9262ad053366cba9161611"
      ],
      "author": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Feb 12 21:07:57 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Feb 12 21:07:57 2025 +0000"
      },
      "message": "Upgrade iamf_tools to 715a73be2a8449461a9262ad053366cba9161611\n\nThis project was upgraded with external_updater.\nUsage: tools/external_updater/updater.sh update external/iamf_tools\nFor more info, check https://cs.android.com/android/platform/superproject/main/+/main:tools/external_updater/README.md\n\nBug: 388336285\nTest: TreeHugger\nChange-Id: I86722f596aa69cd3724c644686bb0ca7b2c272dc\n"
    },
    {
      "commit": "715a73be2a8449461a9262ad053366cba9161611",
      "tree": "408f1d464dd782807204ac84de24fd4892bfe288",
      "parents": [
        "66151279b3f27c8d764fe607a5a4c50c6a86c9b3"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Wed Feb 12 15:09:42 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 12 15:17:09 2025 -0500"
      },
      "message": "Further removal of unused proto includes and build deps\n\nPiperOrigin-RevId: 726146469\n"
    },
    {
      "commit": "66151279b3f27c8d764fe607a5a4c50c6a86c9b3",
      "tree": "b3ab1c739e041a7ee580e8f348b980a38b438cb6",
      "parents": [
        "f0eeda011c84b76c4dbf1aa62263529afbb79c2f"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 12 15:03:55 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Wed Feb 12 15:16:50 2025 -0500"
      },
      "message": "Warn that some ADM conversions are experimental, and update stale README.\n\n  - b/394088855: Pass over stale `README.md` and warn about b/392958726.\n  - Reword rationale:\n    - Reword ADM to IAMF conversion section. The tool doesn\u0027t \"convert to IAMF\"; protos and wav files are an `iamf-tools` interface, but not really IAMF.\n    - Add a note that this is accessible at the top-level encoder. Unless a user cares about the intermediate output, they rarely will need `adm_to_user_metadata_main`.\n    - b/392958726: Add a warning that some encoding are experimental.\n    - Update example build command to work from any directory.\n    - Update stale prerequisites.\n    - Add a bit more detail about about which types of audio elements go through which paths.\n\nPiperOrigin-RevId: 726144292\n"
    },
    {
      "commit": "f0eeda011c84b76c4dbf1aa62263529afbb79c2f",
      "tree": "e0c3b98c751dcd34ae0a3456ab19c0be78b5ec53",
      "parents": [
        "d2fc40b9d05eb9cdb9a9e0fc77dc33bbdc86c265"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Wed Feb 12 14:41:51 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Feb 12 15:12:27 2025 +0000"
      },
      "message": "Clean up some proto includes and dependencies\n\n- Remove from decoders where unused.\n- Remove from demixing_module where no longer used (recent change)\n- Add explicit includes for downmixing_reconstruction_util and its test\n\nPiperOrigin-RevId: 726034579\n"
    },
    {
      "commit": "d2fc40b9d05eb9cdb9a9e0fc77dc33bbdc86c265",
      "tree": "8e10d154a335efebf13dc22f3ae0dcbef150ae40",
      "parents": [
        "c194a22b00463688e4c28159e099bcfff809ed97"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Wed Feb 12 14:40:06 2025 +0000"
      },
      "committer": {
        "name": "Trevor Knight",
        "email": "trevork@google.com",
        "time": "Wed Feb 12 15:12:11 2025 +0000"
      },
      "message": "Move Finalize utils from AudioElementGenerator to ObuWithDataGenerator\n\nThis leaves the proto-dependency in AudioElementGenerator.\n\nPiperOrigin-RevId: 726034009\n"
    },
    {
      "commit": "c194a22b00463688e4c28159e099bcfff809ed97",
      "tree": "db51065d4d7119c617445191817871b21d2d255d",
      "parents": [
        "b0ae3e6263c8c033b48eb04260d4a9a8ffe79ad5"
      ],
      "author": {
        "name": "jwcullen",
        "email": "jwcullen@google.com",
        "time": "Tue Feb 11 14:30:15 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Tue Feb 11 14:49:36 2025 -0500"
      },
      "message": "Fix botched `absl::flat_hash_map\u003cKey,Value\u003e::emplace` call.\n\nPiperOrigin-RevId: 725708935\n"
    },
    {
      "commit": "b0ae3e6263c8c033b48eb04260d4a9a8ffe79ad5",
      "tree": "7616ab125cc865659fcdba8f17faaa6a90c03184",
      "parents": [
        "7ae60a1676db3766c54cbb606c13e3694e2aa637"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Tue Feb 11 14:01:43 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Tue Feb 11 14:49:16 2025 -0500"
      },
      "message": "Fix comment formatting which didn\u0027t get applied properly.\n\nPiperOrigin-RevId: 725697435\n"
    },
    {
      "commit": "7ae60a1676db3766c54cbb606c13e3694e2aa637",
      "tree": "c75f40eddd96287beb4f33485e41f594c82e95f6",
      "parents": [
        "fa7ec417145a15454855cbd8e6609f90444c312f"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Tue Feb 11 13:18:32 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Tue Feb 11 13:44:21 2025 -0500"
      },
      "message": "Pull the dependency on protobuf out of the DemixingModule\n\nThe DemixingModule is used for both encoding and decoding, but for decoding, we don\u0027t want to depend on protobuf.\n\nThis CL moves the conversion from protobuf UserMetadata out of the class and into a new util.\n\nPiperOrigin-RevId: 725680089\n"
    },
    {
      "commit": "fa7ec417145a15454855cbd8e6609f90444c312f",
      "tree": "bd18717db3ac43088305e55138eda84d9e1775aa",
      "parents": [
        "9a60e9aca0b617868e85567505d486f02f74b934"
      ],
      "author": {
        "name": "trevork",
        "email": "trevork@google.com",
        "time": "Tue Feb 11 13:13:36 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Tue Feb 11 13:44:00 2025 -0500"
      },
      "message": "Small proto_utils clean up\n\nPiperOrigin-RevId: 725678082\n"
    },
    {
      "commit": "9a60e9aca0b617868e85567505d486f02f74b934",
      "tree": "fb45dd4dfd2763631448e00f9ba85364904960d5",
      "parents": [
        "398fd3bad621a9f58bd2e100d5426debe16666f2"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Tue Feb 11 12:45:18 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Tue Feb 11 13:43:40 2025 -0500"
      },
      "message": "Surface outputted pcm samples from the renderer to the top-level of the obu processor.\n\nIn order to do this, we also store the target layout information when we create the renderer as well; this information is then used to call GetPostProcessedSamplesAsSpan.\n\nIn the case that wav writers are used, the new output argument has no effect and will be empty; we update the call in api/google/iamf_decoder to pass in this unused arg.\n\nPiperOrigin-RevId: 725667048\n"
    },
    {
      "commit": "398fd3bad621a9f58bd2e100d5426debe16666f2",
      "tree": "69144817a4cbc5c205df9fa7b5a4d4f6da20aa56",
      "parents": [
        "7b6cf43e49c011842eea444eb43d395202a98cdc"
      ],
      "author": {
        "name": "Googler",
        "email": "copybara-servicebot@google.com",
        "time": "Mon Feb 10 13:13:47 2025 -0500"
      },
      "committer": {
        "name": "Joseph Cullen",
        "email": "jwcullen@google.com",
        "time": "Tue Feb 11 13:43:22 2025 -0500"
      },
      "message": "Remove dependency on wav writing in obu processor.\n\nThis is necessary so the iterative decoder can use this class appropriately, since in the iterative case, we do not do any wav writing, as samples are processed and delivered to the client as is.\n\nThis cl updates the obu processor to take in a SampleProcessorFactory instead of creating a WavWriter, which allows for the removal of the wav writer dependency from this module.\n\nThe behavior of the processor remains unchanged. Two tests that check the overriding of bit depths for a wav file are removed, since they are no longer in scope of this module - this feature is tested in the rendering mix presentation finalizer.\n\nPiperOrigin-RevId: 725259810\n"
    }
  ],
  "next": "7b6cf43e49c011842eea444eb43d395202a98cdc"
}
