)]}'
{
  "log": [
    {
      "commit": "855255d89fe0a14abe796355bebb64031ec6ff47",
      "tree": "3be08ced466c2d23baa78c22effcae34cee605fd",
      "parents": [
        "079f09c6ca4148d8e640e34ec03a3eb4fb3507cc"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Apr 09 14:25:48 2012 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Apr 10 12:34:07 2012 -0700"
      },
      "message": "audio preprocessing: added static factory method\n\nAdded static methods to check availability and create audio preprocessing\neffects.\n\nChange-Id: I945e97fe41912ff8880befacaba162a08b5a1267\n"
    },
    {
      "commit": "079f09c6ca4148d8e640e34ec03a3eb4fb3507cc",
      "tree": "bf789fd8321728a7c5e2094c632e3ea522999dab",
      "parents": [
        "d1404465df624a66e9f80b2957bf18624a91df7a",
        "59f482764e346a5c5ac118ee1f7b24da645c2559"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Apr 09 08:39:05 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Apr 09 08:39:05 2012 -0700"
      },
      "message": "Merge \"Added support for USB audio devices\""
    },
    {
      "commit": "59f482764e346a5c5ac118ee1f7b24da645c2559",
      "tree": "db34c5faaf30daecdbae082961fc71501adeec2d",
      "parents": [
        "85d9e02094a0eefe21b949effb5e7c8f042c92c8"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Apr 05 19:42:21 2012 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Apr 06 18:24:48 2012 -0700"
      },
      "message": "Added support for USB audio devices\n\nTwo types of USB audio devices are defined:\n- USB audio device: the audio device in USB device mode while\nthe Android device is in USB host mode.\n- USB audio accessory: the audio device in USB host mode while\nthe Android device is in USB device mode.\n\nRenamed intents for analog and digital docks to avoid confusion:\n - ACTION_USB_ANLG_HEADSET_PLUG to ACTION_ANALOG_AUDIO_DOCK_PLUG\n - ACTION_USB_DGTL_HEADSET_PLUG to ACTION_DIGITAL_AUDIO_DOCK_PLUG\n\nFactorized code in AudioService broadcast receiver.\n\nChange-Id: I1b6d0257a9d68ecb9495c78c98bac8c67fec7891\n"
    },
    {
      "commit": "9e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274b",
      "tree": "9f31591f10f0df1c33e508abf90ca3ce2b6d4778",
      "parents": [
        "335a6625b6540ad21feaeae3a4f593f86e200019"
      ],
      "author": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Fri Apr 06 12:14:47 2012 -0700"
      },
      "committer": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Fri Apr 06 12:14:47 2012 -0700"
      },
      "message": "New JAVA API to support submitting encrypted buffers of input data.\n\nChange-Id: Ib0df9a9427b4580946179860495b26f743558597\nrelated-to-bug: 6275919\n"
    },
    {
      "commit": "1c35d117f01b5a6f66b82c57eb29350f16694070",
      "tree": "81c73d0e9f51efa2cb59450c338e36bfaf240953",
      "parents": [
        "d9966c4c21c9d3a49454b1267e43907e0256a414",
        "db9b114b2e1f9c2034c3cd6df00245b039d90c28"
      ],
      "author": {
        "name": "Justin Koh",
        "email": "justinkoh@google.com",
        "time": "Thu Apr 05 10:43:06 2012 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Thu Apr 05 10:43:06 2012 -0700"
      },
      "message": "am db9b114b: Merge \"Adds flag argument to setMasterMute.\" into ics-aah\n\n* commit \u0027db9b114b2e1f9c2034c3cd6df00245b039d90c28\u0027:\n  Adds flag argument to setMasterMute.\n"
    },
    {
      "commit": "8fa23393e9f9de1c65a45f49463e745de498c557",
      "tree": "3d342ca9c7fd7773a809e6d4130a36854f3d4c33",
      "parents": [
        "cde8aae955f2c1074a840074a9f586f95c3f61f7",
        "a79edb72333ceda76c73166acef139c8668ee829"
      ],
      "author": {
        "name": "Yu Shan Emily Lau",
        "email": "yslau@google.com",
        "time": "Wed Apr 04 21:20:54 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Apr 04 21:20:54 2012 -0700"
      },
      "message": "Merge \"Insert the 2 seconds before test start to workaround the race conditon for requesting the surface.\""
    },
    {
      "commit": "a79edb72333ceda76c73166acef139c8668ee829",
      "tree": "9997b42add8a0bd437206291bb48972ed57f2a2f",
      "parents": [
        "e252077d254c84b0e5e86123055ff0b9ab51cd04"
      ],
      "author": {
        "name": "Yu Shan Emily Lau",
        "email": "yslau@google.com",
        "time": "Wed Apr 04 21:17:04 2012 -0700"
      },
      "committer": {
        "name": "Yu Shan Emily Lau",
        "email": "yslau@google.com",
        "time": "Wed Apr 04 21:17:04 2012 -0700"
      },
      "message": "Insert the 2 seconds before test start to\nworkaround the race conditon for requesting\nthe surface.\n\nChange-Id: Ic8ba358400492860b0d38fc71468ea4bb4d3d7bd\n"
    },
    {
      "commit": "0273af55cf68d54d26d154b44d105d40fed79701",
      "tree": "ec0eccd6c8da00ab601defb36ec45ec20870922c",
      "parents": [
        "bff6a514da978644f1cdf6e5bdd6f93353b74572"
      ],
      "author": {
        "name": "Justin Koh",
        "email": "justinkoh@google.com",
        "time": "Wed Apr 04 18:29:50 2012 -0700"
      },
      "committer": {
        "name": "Justin Koh",
        "email": "justinkoh@google.com",
        "time": "Wed Apr 04 18:40:36 2012 -0700"
      },
      "message": "Adds flag argument to setMasterMute.\n\nAdds flag argument to setMasterMute. This allows third parties to edit it\nwithout showing the UI, for example.\n\nTESTED \u003d runs on Tungsten.\n\nChange-Id: Idfd99a2476e60059cd93c9dfe07d03a389c3f5f5\n"
    },
    {
      "commit": "75cf9e19a575c28c200c02c0ab6f83bb79f5c50d",
      "tree": "5611be08eaa29d58ea531f5e4b82599e9332cdc3",
      "parents": [
        "b96785c197b1bd3c53e81ac49bd7570614711c2f"
      ],
      "author": {
        "name": "Justin Koh",
        "email": "justinkoh@google.com",
        "time": "Wed Apr 04 15:27:37 2012 -0700"
      },
      "committer": {
        "name": "Justin Koh",
        "email": "justinkoh@google.com",
        "time": "Wed Apr 04 15:27:37 2012 -0700"
      },
      "message": "Fix the build.\n\nChange-Id: Ibe818df8f360837688f12533cf0ac22ef89a8439\n"
    },
    {
      "commit": "5ac69a23e07abdc848d14d9a4ea9bf8054b88730",
      "tree": "9d842ceafcdd15d7b077ddc3f47c2d7b074b60cc",
      "parents": [
        "24fea55ebb8bcb9e17f3009a80172cb6ee46947d",
        "6a8096d7d56ce4c65318f283ef666993f3020745"
      ],
      "author": {
        "name": "Justin Koh",
        "email": "justinkoh@google.com",
        "time": "Wed Apr 04 14:54:19 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Apr 04 14:54:19 2012 -0700"
      },
      "message": "Merge \"resolved conflicts for merge of bff6a514 to master\""
    },
    {
      "commit": "6a8096d7d56ce4c65318f283ef666993f3020745",
      "tree": "81f7d3b6065a28f60c019ee646cca8b1904f028b",
      "parents": [
        "1da8f00a4cc3554b1501f60932e44b5ca56a5e7e",
        "bff6a514da978644f1cdf6e5bdd6f93353b74572"
      ],
      "author": {
        "name": "Justin Koh",
        "email": "justinkoh@google.com",
        "time": "Wed Apr 04 14:50:27 2012 -0700"
      },
      "committer": {
        "name": "Justin Koh",
        "email": "justinkoh@google.com",
        "time": "Wed Apr 04 14:50:32 2012 -0700"
      },
      "message": "resolved conflicts for merge of bff6a514 to master\n\nChange-Id: I741d5ab8ed0ce25a27330ffb55ba210534d11c3d\n"
    },
    {
      "commit": "e313f721ad97ad44666dd066a891acb4ddfa8ab3",
      "tree": "09e8cd5038752374b94fe1fdfed0ad99256f3dd8",
      "parents": [
        "038d1663e6eb9b0ed8394220530a9bf86b8d8b73"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Wed Apr 04 14:09:49 2012 -0700"
      },
      "committer": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Wed Apr 04 14:27:00 2012 -0700"
      },
      "message": "Store video width/height when scanning\n\nb/5820120\n\nChange-Id: If2faf554bbf49b341d2634915ba98c1efd70574e\n"
    },
    {
      "commit": "8240d9239d9aabed75c49f9d4d69fd8a5fe4c899",
      "tree": "dfd2281e3754fa3df237ff69b88a5a91a0dbb014",
      "parents": [
        "cf15200ddb9148dfd27b039cbc30b86620e7c018"
      ],
      "author": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Wed Apr 04 14:06:32 2012 -0700"
      },
      "committer": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Wed Apr 04 14:06:32 2012 -0700"
      },
      "message": "New Crypto JAVA class to facilitate decryption via MediaCodec.\n\nChange-Id: Ic4e395faa84f003793c2804f2badabab9e7f1034\nrelated-to-bug: 6275919\n"
    },
    {
      "commit": "bff6a514da978644f1cdf6e5bdd6f93353b74572",
      "tree": "61e933f90d3ff9144135bcee65943b7b41666b75",
      "parents": [
        "f499a0722b329fd8954c43cb39ab6fbba23cfee4",
        "57978ed86286a33d5b1a0fd000ca3406ba9d87b3"
      ],
      "author": {
        "name": "Justin Koh",
        "email": "justinkoh@google.com",
        "time": "Wed Apr 04 09:45:27 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Apr 04 09:45:27 2012 -0700"
      },
      "message": "Merge \"Persists the master mute volume setting.\" into ics-aah"
    },
    {
      "commit": "57978ed86286a33d5b1a0fd000ca3406ba9d87b3",
      "tree": "a62eb053940537c0bc25dda1fc5388bc89452ad0",
      "parents": [
        "ade335016e6864ddf203f4d1b31b895985da55e7"
      ],
      "author": {
        "name": "Justin Koh",
        "email": "justinkoh@google.com",
        "time": "Tue Apr 03 17:37:58 2012 -0700"
      },
      "committer": {
        "name": "Justin Koh",
        "email": "justinkoh@google.com",
        "time": "Tue Apr 03 17:37:58 2012 -0700"
      },
      "message": "Persists the master mute volume setting.\n\nPersists the master mute volume setting across reboots.\n\nTESTED \u003d runs on Tungsten.\n\nChange-Id: I9628b9369ca528b22413f62a9e7d697bae61d8ac\n"
    },
    {
      "commit": "c0c4a20c0fe56c2b64e4adb2df3f30d7eb62abaf",
      "tree": "82e2b83c5fac7f0cbf2b113a06d0055c5e9d9edd",
      "parents": [
        "f91dcb6ec5352322deccb6484c66419c7ab03c5a",
        "a72a06f37ecdd615fb2a29faed99c7f128196211"
      ],
      "author": {
        "name": "Jason Noguchi",
        "email": "jnoguchi@google.com",
        "time": "Tue Apr 03 17:37:10 2012 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Tue Apr 03 17:37:10 2012 -0700"
      },
      "message": "am a72a06f3: am f5693a6a: am a784b3de: Fix build break introduced by missing parenthesis in camera stress test.\n\n* commit \u0027a72a06f37ecdd615fb2a29faed99c7f128196211\u0027:\n  Fix build break introduced by missing parenthesis in camera stress test.\n"
    },
    {
      "commit": "f5693a6a50d2806ef5a4fd30929539e941dfa069",
      "tree": "47962f1a22f402705ee00d4c856a5575487c24c5",
      "parents": [
        "5a894a35cc822aa1d12fd824815f91664c1237dd",
        "a784b3dea15dd0dfedfe25552b87fbb92a5eea52"
      ],
      "author": {
        "name": "Jason Noguchi",
        "email": "jnoguchi@google.com",
        "time": "Tue Apr 03 17:31:00 2012 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Tue Apr 03 17:31:00 2012 -0700"
      },
      "message": "am a784b3de: Fix build break introduced by missing parenthesis in camera stress test.\n\n* commit \u0027a784b3dea15dd0dfedfe25552b87fbb92a5eea52\u0027:\n  Fix build break introduced by missing parenthesis in camera stress test.\n"
    },
    {
      "commit": "f499a0722b329fd8954c43cb39ab6fbba23cfee4",
      "tree": "17c3f09f561c4ad08a598328ae5830c450701848",
      "parents": [
        "24748143afd155c14661031bcdacf28c890403a2",
        "a784b3dea15dd0dfedfe25552b87fbb92a5eea52"
      ],
      "author": {
        "name": "Jason Noguchi",
        "email": "jnoguchi@google.com",
        "time": "Tue Apr 03 17:30:55 2012 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Tue Apr 03 17:30:55 2012 -0700"
      },
      "message": "am a784b3de: Fix build break introduced by missing parenthesis in camera stress test.\n\n* commit \u0027a784b3dea15dd0dfedfe25552b87fbb92a5eea52\u0027:\n  Fix build break introduced by missing parenthesis in camera stress test.\n"
    },
    {
      "commit": "a784b3dea15dd0dfedfe25552b87fbb92a5eea52",
      "tree": "7f086f8677a8ba6fb0cc2052b59cbfb303e9fc99",
      "parents": [
        "43562ecf434092308765e2c31377c46612ba61bb"
      ],
      "author": {
        "name": "Jason Noguchi",
        "email": "jnoguchi@google.com",
        "time": "Tue Apr 03 17:01:50 2012 -0700"
      },
      "committer": {
        "name": "Jason Noguchi",
        "email": "jnoguchi@google.com",
        "time": "Tue Apr 03 17:01:50 2012 -0700"
      },
      "message": "Fix build break introduced by missing parenthesis in camera stress test.\n\nChange-Id: I8da9321a7674dbbe48cc0c214c0b043fbce8eeab\n"
    },
    {
      "commit": "b7cc80d8f3f60f0e1f645e6487913aa2d6a32d0b",
      "tree": "9228653717a734c0845d6982b22ba4d663010e7c",
      "parents": [
        "6756f74d81808ef9fc0cdab3c8848723122587c1",
        "a5408a8c75a2839f1b0704f024cc4e523830c128"
      ],
      "author": {
        "name": "Jason Noguchi",
        "email": "jnoguchi@google.com",
        "time": "Tue Apr 03 16:32:40 2012 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Tue Apr 03 16:32:40 2012 -0700"
      },
      "message": "am a5408a8c: am 34a4e519: am 6e6d8df5: Merge \"Adding camera zoom test to mediaframework stress suite.\" into ics-mr1\n\n* commit \u0027a5408a8c75a2839f1b0704f024cc4e523830c128\u0027:\n  Adding camera zoom test to mediaframework stress suite.\n"
    },
    {
      "commit": "34a4e519b298941760c1d6797142a9ebca003627",
      "tree": "82b47a5c2598fd76240eced4e4f23600cd24a9be",
      "parents": [
        "ad5789c6dcad930f1fce34685b7ca84df4d68e90",
        "6e6d8df5d0ad0f97be8344c78aa4d70dadceb9a8"
      ],
      "author": {
        "name": "Jason Noguchi",
        "email": "jnoguchi@google.com",
        "time": "Tue Apr 03 15:32:34 2012 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Tue Apr 03 15:32:34 2012 -0700"
      },
      "message": "am 6e6d8df5: Merge \"Adding camera zoom test to mediaframework stress suite.\" into ics-mr1\n\n* commit \u00276e6d8df5d0ad0f97be8344c78aa4d70dadceb9a8\u0027:\n  Adding camera zoom test to mediaframework stress suite.\n"
    },
    {
      "commit": "e371ed8de54c42d2e0b8aa3fb7196670ff5ae9ee",
      "tree": "515e54ec2bfabd4ebb5f7a65801d9825f31803c8",
      "parents": [
        "fcdf5217e0b43d119af0da30ff0066317154819d",
        "6e6d8df5d0ad0f97be8344c78aa4d70dadceb9a8"
      ],
      "author": {
        "name": "Jason Noguchi",
        "email": "jnoguchi@google.com",
        "time": "Tue Apr 03 15:32:30 2012 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Tue Apr 03 15:32:30 2012 -0700"
      },
      "message": "am 6e6d8df5: Merge \"Adding camera zoom test to mediaframework stress suite.\" into ics-mr1\n\n* commit \u00276e6d8df5d0ad0f97be8344c78aa4d70dadceb9a8\u0027:\n  Adding camera zoom test to mediaframework stress suite.\n"
    },
    {
      "commit": "6e6d8df5d0ad0f97be8344c78aa4d70dadceb9a8",
      "tree": "7e7ab0111a1945baf47941fa6b1b2d4f38e5c429",
      "parents": [
        "0687c83032219656fa4ff64ca28dd28fd15ca748",
        "41d88d5f58ede432c7574c55b388dc390b08dc3b"
      ],
      "author": {
        "name": "Jason Noguchi",
        "email": "jnoguchi@google.com",
        "time": "Tue Apr 03 15:30:22 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Apr 03 15:30:22 2012 -0700"
      },
      "message": "Merge \"Adding camera zoom test to mediaframework stress suite.\" into ics-mr1"
    },
    {
      "commit": "991c8733c3b990b88edf5cf223aebe3d1c71b7f0",
      "tree": "da65c36e86899dc9dc8bae346086ac998048688c",
      "parents": [
        "b52d99e1886878049b67364fa6beeebf838ab104",
        "0e97fc248eaea7b4c95053618ddedf0af638110e"
      ],
      "author": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Tue Apr 03 14:27:35 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Apr 03 14:27:35 2012 -0700"
      },
      "message": "Merge \"More DRM/crypto support.\""
    },
    {
      "commit": "0e97fc248eaea7b4c95053618ddedf0af638110e",
      "tree": "bbc77815591f6f4ffecc7e42e55a7bab89c9049e",
      "parents": [
        "4a727e342134f409c2cf7cf2f77dbe9c15128337"
      ],
      "author": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Tue Apr 03 13:32:16 2012 -0700"
      },
      "committer": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Tue Apr 03 14:16:07 2012 -0700"
      },
      "message": "More DRM/crypto support.\n\nrelated-to-bug: 6275919\nChange-Id: I9179c03f1f91f939afcb3b1c6514a200bf586c93\n"
    },
    {
      "commit": "b5f2088c8ebc3d880dac2141df19a57053b7bae0",
      "tree": "05bf08e33796dc03b574c5973fd848599fdea2c3",
      "parents": [
        "69ccdbd78a6dbcf32d6f734d238e5eaaa606a85f",
        "7f71d01c2927ab3f2cb7e4ca8b526f863e86f345"
      ],
      "author": {
        "name": "Mike Lockwood",
        "email": "lockwood@google.com",
        "time": "Tue Apr 03 11:54:11 2012 -0700"
      },
      "committer": {
        "name": "Mike Lockwood",
        "email": "lockwood@google.com",
        "time": "Tue Apr 03 11:54:11 2012 -0700"
      },
      "message": "Merge commit \u00277f71d01\u0027\n"
    },
    {
      "commit": "3e29718d34eba7c6c455fa6bb622856fe651876e",
      "tree": "eb7fa6fda101dc6b5f8b8ae2d0a537567998ceea",
      "parents": [
        "e75e81268291469b371f6ade5bc8927956fe5289",
        "830ad08fe4a8a63ada0f6b6cbb9d76e4762e61c7"
      ],
      "author": {
        "name": "Mike Lockwood",
        "email": "lockwood@google.com",
        "time": "Tue Apr 03 11:50:08 2012 -0700"
      },
      "committer": {
        "name": "Mike Lockwood",
        "email": "lockwood@google.com",
        "time": "Tue Apr 03 11:50:08 2012 -0700"
      },
      "message": "Merge commit \u0027830ad08\u0027\n"
    },
    {
      "commit": "4a727e342134f409c2cf7cf2f77dbe9c15128337",
      "tree": "7ba8718a00d7fc3729f92d6317374bc090997a6f",
      "parents": [
        "1cd5f0d42b99e91b2acac4fc414fd1d69d110a9e",
        "dc912ed9c6f1a0812bd07e5a24600c5b438a54bb"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Tue Apr 03 08:37:07 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Apr 03 08:37:07 2012 -0700"
      },
      "message": "Merge \"Support audio/ogg mimetype\""
    },
    {
      "commit": "dc912ed9c6f1a0812bd07e5a24600c5b438a54bb",
      "tree": "978f86396b0f13c625220fad9fdd9bda61d87549",
      "parents": [
        "1d6013357847983180a317e2acaf807bde8b7ea7"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Mon Apr 02 16:00:44 2012 -0700"
      },
      "committer": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Mon Apr 02 16:00:44 2012 -0700"
      },
      "message": "Support audio/ogg mimetype\n\naudio/ogg has been the official mimetype for ogg vorbis audio for\na while now, so we should support it.\n\nb/5824157\n\nChange-Id: Ica86bdb3099a10785f1da9c3413284f3e11dc27e\n"
    },
    {
      "commit": "3caba517253d1703fc29b50740c4567b932279fb",
      "tree": "6575f02c10318c4b1d8418cd02584a6ba4cdb8c3",
      "parents": [
        "5789537c5d0a3691c25f5876008bf0904b6e157e"
      ],
      "author": {
        "name": "Justin Koh",
        "email": "justinkoh@google.com",
        "time": "Mon Apr 02 15:32:18 2012 -0700"
      },
      "committer": {
        "name": "Justin Koh",
        "email": "justinkoh@google.com",
        "time": "Mon Apr 02 15:46:56 2012 -0700"
      },
      "message": "Broadcast mastervolume regardless of change.\n\nBroadcast mastervolume intents regardless of whether the system changed the\nvolume. This fixes the bug where the volume LEDs stop getting updates.\n\nTESTED \u003d runs on Tungsten.\n\nChange-Id: Id363da3f825934fd7785ed3d3e436f74e657b7e6\n"
    },
    {
      "commit": "5a04bf395514a9342dd26af519b88f4b3e309eb9",
      "tree": "d54a10176d38444301522d412d48f5e916375380",
      "parents": [
        "0424716328a7d0f7bb794d24f7481a76be08d379"
      ],
      "author": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Thu Mar 29 16:41:38 2012 -0700"
      },
      "committer": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Mon Apr 02 15:43:42 2012 -0700"
      },
      "message": "New API to query available codecs and their capabilities.\n\nChange-Id: I448ba443a96d8fee2bc9179750d57362ed31d9d9\n"
    },
    {
      "commit": "3d275af3c3996f80816142628c380f79a9606c51",
      "tree": "7c361d1b1c426596e8474b3078802cf00331a28c",
      "parents": [
        "18a38b9f41fa818cccc50a7fd372c694a9c8149a",
        "505e5c8859f596ed58489be565d6e029314b2ac8"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Mar 30 16:00:26 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Mar 30 16:00:26 2012 -0700"
      },
      "message": "Merge \"implemented synchronous audio capture\""
    },
    {
      "commit": "18a38b9f41fa818cccc50a7fd372c694a9c8149a",
      "tree": "224a32b07b7cdcaceb0cd15dd1947bbc59b97225",
      "parents": [
        "7784d151c1a8ba78b4ebb8b16a572c1c5f96f940",
        "7ae82ce1fd54103bb87b8a0593a4228c94b1d6f9"
      ],
      "author": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Fri Mar 30 15:55:58 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Mar 30 15:55:58 2012 -0700"
      },
      "message": "Merge \"Removed obsolete opencore related comments\""
    },
    {
      "commit": "6ef1eedac77977a4979a293499767e17ed3a4e03",
      "tree": "302a1c009403819ba750566d45bedb1b83be3f82",
      "parents": [
        "b0b8df4a20990c0554ce40f63454e88f5c57dc1f",
        "872e7b7073fad8295e6314c73b87d7cb3f85d39c"
      ],
      "author": {
        "name": "Chih-Chung Chang",
        "email": "chihchung@google.com",
        "time": "Fri Mar 30 02:50:07 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Mar 30 02:50:07 2012 -0700"
      },
      "message": "Merge \"Fix b/5353417 Images downloaded from browser are showing incorrect details (Time is shown as dec 31 1969)\""
    },
    {
      "commit": "505e5c8859f596ed58489be565d6e029314b2ac8",
      "tree": "d65193ee590857873a384437f7ee2cf6032e8467",
      "parents": [
        "f31af709159e180d392fd32efb96a026e998e76a"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Mar 29 15:19:36 2012 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Mar 29 19:48:40 2012 -0700"
      },
      "message": "implemented synchronous audio capture\n\nAdded the infrastructure to support the synchronization of playback and\ncapture actions on specific events.\nThe first requirement for this feature is to synchronize the audio capture\nstart with the full rendering of a given audio content.\nThe applications can further be extended to other use cases\n(synchronized playback start...) by adding new synchronization events and\nnew synchronous control methods on player or recorders.\n\nAlso added a method to query the audio session from a ToneGenerator.\n\nChange-Id: I4e47f5108c7cbbd3bd334a7fad9b3b6c5ba55d88\n"
    },
    {
      "commit": "7ae82ce1fd54103bb87b8a0593a4228c94b1d6f9",
      "tree": "a94b4d06fe0ba2dd54ef8186c29b6059d2eab647",
      "parents": [
        "f3fda6962a4bf0d9defebb648065e502b0c10737"
      ],
      "author": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Thu Mar 29 10:08:39 2012 -0700"
      },
      "committer": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Thu Mar 29 10:44:36 2012 -0700"
      },
      "message": "Removed obsolete opencore related comments\n\nChange-Id: Ia05a889ea54a8f38d126508ffdcd09fe2a263538\n"
    },
    {
      "commit": "830ad08fe4a8a63ada0f6b6cbb9d76e4762e61c7",
      "tree": "fdbba31a2967482bd62e61d4076e4b674637080d",
      "parents": [
        "f9f27197eb8732dad8cac15c9c30880489fab425",
        "45edba1b8b0377dfe70a4f2b0afb0f04dd8e1ee9"
      ],
      "author": {
        "name": "RoboErik",
        "email": "epastern@google.com",
        "time": "Wed Mar 28 15:04:32 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Mar 28 15:04:32 2012 -0700"
      },
      "message": "Merge \"b/6232528 Reduce volume persist delay to 500ms\" into ics-aah"
    },
    {
      "commit": "ba4d0433319393d626d2169683209e4956a087e2",
      "tree": "96912a08fd6fdc796c384a2a7a13b16e69c4bb2b",
      "parents": [
        "d927a1d99630c05ff773f0e9e8791ca9a965e020"
      ],
      "author": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Wed Mar 28 11:03:25 2012 -0700"
      },
      "committer": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Wed Mar 28 11:03:25 2012 -0700"
      },
      "message": "frameworks base Android.mk file changes\n\nChange-Id: I7459b9e959a60751b8fa6e0d893cb2c820c064ce\n"
    },
    {
      "commit": "d927a1d99630c05ff773f0e9e8791ca9a965e020",
      "tree": "760f8a19e317d68f937eda312efab59200880ecd",
      "parents": [
        "f9c1f9935b349fe1a3f27be4462026dd212f8b78"
      ],
      "author": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Wed Mar 28 10:42:44 2012 -0700"
      },
      "committer": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Wed Mar 28 10:42:44 2012 -0700"
      },
      "message": "Deleted the media, camera, drm related files since they are relocated\n\nChange-Id: I9bc5573ee07e30b305b5b879023aa9ec69e10b91\n"
    },
    {
      "commit": "45edba1b8b0377dfe70a4f2b0afb0f04dd8e1ee9",
      "tree": "2e6663e56007d330ac3951dbc183ebf825c8ae53",
      "parents": [
        "0f6cb4500209adaa446656d39d8a625ac969893b"
      ],
      "author": {
        "name": "RoboErik",
        "email": "epastern@google.com",
        "time": "Tue Mar 27 17:54:36 2012 -0700"
      },
      "committer": {
        "name": "RoboErik",
        "email": "epastern@google.com",
        "time": "Tue Mar 27 17:54:36 2012 -0700"
      },
      "message": "b/6232528 Reduce volume persist delay to 500ms\n\nChange-Id: I45c32da0a1089ce8bc865e12b51c069a6db28fd4\n"
    },
    {
      "commit": "65953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9",
      "tree": "bfb7ea73b90f23cd135b68b090a72ef8b947ee90",
      "parents": [
        "80e4ee46008d2817dc0496e0cf8c9470c6851755"
      ],
      "author": {
        "name": "Marius Renn",
        "email": "renn@google.com",
        "time": "Tue Mar 27 10:44:45 2012 -0700"
      },
      "committer": {
        "name": "Marius Renn",
        "email": "renn@google.com",
        "time": "Tue Mar 27 10:44:45 2012 -0700"
      },
      "message": "Multi-Project Commit: Move of filterfw out of system/media (2 of 7)\n\nThis is part of the multi-project commit to move the filter-framework\nfrom system/media/mca to frameworks/base/media/mca.\n\nNote that the filter-framework will soon be replaced with a refactored\nversion currently under API review (also to go under frameworks/base).\nThis move is done now to unblock the PDK efforts.\n\nChange-Id: I9f42be5a12a9e8157512be11f04e38e4548970be\n"
    },
    {
      "commit": "be587b52c73ab01c115feca4710a219b2eb42a18",
      "tree": "6c27030984bf03612bdda2ac472d0aa578405d3c",
      "parents": [
        "0f6cb4500209adaa446656d39d8a625ac969893b",
        "1f763f7c72ee1d9688f30ff3ddd5e930f01597fb"
      ],
      "author": {
        "name": "Jason Simmons",
        "email": "jsimmons@google.com",
        "time": "Tue Mar 27 09:50:08 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Mar 27 09:50:08 2012 -0700"
      },
      "message": "Merge \"Do not call stop() on the MediaSource if it hasn\u0027t been started.\" into ics-aah"
    },
    {
      "commit": "872e7b7073fad8295e6314c73b87d7cb3f85d39c",
      "tree": "52868a19579bb62e2375ed9c9c1bea642e10ab79",
      "parents": [
        "5571ffdd9d419e3b1e050501e6f8dbfb04159b5d"
      ],
      "author": {
        "name": "Ray Chen",
        "email": "raychen@google.com",
        "time": "Tue Mar 27 23:37:41 2012 +0800"
      },
      "committer": {
        "name": "Ray Chen",
        "email": "raychen@google.com",
        "time": "Tue Mar 27 23:37:41 2012 +0800"
      },
      "message": "Fix b/5353417 Images downloaded from browser are showing incorrect details (Time is shown as dec 31 1969)\n\nMediaScanner sets DATE_TAKEN with EXIF\u0027s datetime tag value. When this information is not available,\nExifInterface will simply return -1 which is accidentally used by MediaScanner.\n\nAdding a check to avoid it so MediaProvider can calculate the date taken from last modified time instead.\n\nChange-Id: I305b93a6c5602cbb9f97c3bbd384d358bda030c6\n"
    },
    {
      "commit": "1f763f7c72ee1d9688f30ff3ddd5e930f01597fb",
      "tree": "007387017b349987b2a500f910fce048c160827e",
      "parents": [
        "2b16bf6bdbae150a3aa0da51361e3ea9e63fd3c2"
      ],
      "author": {
        "name": "Jason Simmons",
        "email": "jsimmons@google.com",
        "time": "Mon Mar 26 19:12:37 2012 -0700"
      },
      "committer": {
        "name": "Jason Simmons",
        "email": "jsimmons@google.com",
        "time": "Mon Mar 26 19:12:37 2012 -0700"
      },
      "message": "Do not call stop() on the MediaSource if it hasn\u0027t been started.\n\nThe MediaSource\u0027s destructor will take care of stopping the source.\n\nBug: 6232094\nChange-Id: Iace6c11ded666e7ac7066aa9d493d1b644e4b92d\n"
    },
    {
      "commit": "0821013609e39587e433cc22ab7aab9fb810d3a7",
      "tree": "3139c3df187df004a9f7fa5e2be4391c4499daae",
      "parents": [
        "b3e2e24f789d41d6c38b8ad4c252cf9f6e2122d8"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Sat Mar 24 14:06:45 2012 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Mar 26 12:24:52 2012 -0700"
      },
      "message": "stagefright: compile without chromium for pdk builds\n\nChange-Id: I7d85e04fb9f0caa8460a111ca6181bba6f6497ac\n"
    },
    {
      "commit": "b3e2e24f789d41d6c38b8ad4c252cf9f6e2122d8",
      "tree": "3db78e2b9860b33fc0a75cdd9e3ddba2f97410db",
      "parents": [
        "61bf87428c0f3366d0c4ec203ff96331b7ec3546",
        "9b8e496f4d143280deff137c5f30ca8907bc28db"
      ],
      "author": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Mon Mar 26 11:43:06 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Mar 26 11:43:06 2012 -0700"
      },
      "message": "Merge \"Provisional support for secure decryption of media streams.\""
    },
    {
      "commit": "61bf87428c0f3366d0c4ec203ff96331b7ec3546",
      "tree": "70debe75d06519c3689dcc1eb65412141572723b",
      "parents": [
        "dcbe048f4df9735c8d22f5a801c582cadcf35539",
        "6e43c1b51b567e7628a4442dc76e7a0e691a67ba"
      ],
      "author": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Mon Mar 26 11:41:21 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Mar 26 11:41:21 2012 -0700"
      },
      "message": "Merge \"Removed code related to simulator build in TimedEventQueue to get rid of the dependency on jni.h\""
    },
    {
      "commit": "a561965842d0737d0781dc03b72d88802025cd1c",
      "tree": "ec931e70596e5b6dbd5954694e7fd76b505efb44",
      "parents": [
        "383c4b3e63b02dfb348db7504af0efefa7b6a682",
        "b4605663882a9472b2e8915c851de899b14a27a5"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Mar 26 11:27:41 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Mar 26 11:27:41 2012 -0700"
      },
      "message": "Merge \"fix visualizer inactivity detection\""
    },
    {
      "commit": "9b8e496f4d143280deff137c5f30ca8907bc28db",
      "tree": "f6136e4a5bf55c67ac721f1fc94b8d6aadc0fa6f",
      "parents": [
        "7061b5ffb37ea15f235effa1faaf22bb1750c7f5"
      ],
      "author": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Mon Mar 26 11:13:27 2012 -0700"
      },
      "committer": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Mon Mar 26 11:24:04 2012 -0700"
      },
      "message": "Provisional support for secure decryption of media streams.\n\nChange-Id: Ib3982a9c960bfdb0cb7e1b174440b141b194cfbe\n"
    },
    {
      "commit": "383c4b3e63b02dfb348db7504af0efefa7b6a682",
      "tree": "a175275540540538a95ebf26fbc24d75d88317a0",
      "parents": [
        "56ca534e65427bdefb7674060f5faa94539b6995",
        "f5e18125498b768d4528e4d1c19533c2b16f338b"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Mar 26 11:23:49 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Mar 26 11:23:49 2012 -0700"
      },
      "message": "Merge \"reorganize SoundPool and JetPlayer code.\""
    },
    {
      "commit": "56ca534e65427bdefb7674060f5faa94539b6995",
      "tree": "14a6e9891916e5154ab159120f2632697bea0d7e",
      "parents": [
        "eba00ce996d6646f558f25890f0a551de8e7ecf7",
        "fe6ecdae580efef872df6f1d6b4e22db70afee20"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Mon Mar 26 11:22:29 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Mar 26 11:22:29 2012 -0700"
      },
      "message": "Merge changes Ib4d0e0c0,Iea8f4a23\n\n* changes:\n  libmedia: remove skia include\n  stagefright: remove dependency on skia\n"
    },
    {
      "commit": "6e43c1b51b567e7628a4442dc76e7a0e691a67ba",
      "tree": "8179ec6e1a742c38bdd624a90ff8a20aca2eb8bc",
      "parents": [
        "a026b48972316d05a75b6dde883be39b1e046891"
      ],
      "author": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Mon Mar 26 10:51:59 2012 -0700"
      },
      "committer": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Mon Mar 26 11:18:35 2012 -0700"
      },
      "message": "Removed code related to simulator build in TimedEventQueue to get rid of the dependency on jni.h\n\no related-to-bug: 6214141\n\nChange-Id: I548d84a9888be884d3903dc9dea9235258792165\n"
    },
    {
      "commit": "b4605663882a9472b2e8915c851de899b14a27a5",
      "tree": "7b1afad2be9db1f46821f0f76881b75babbc3331",
      "parents": [
        "2e842a58ebbc3a8a0599dfb0c19d7cda7ed21e5f"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Mar 23 15:35:48 2012 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Mar 26 11:05:25 2012 -0700"
      },
      "message": "fix visualizer inactivity detection\n\nCurrent method implemented by the visualizer to detect that audioflinger has\nstopped providing audio buffers does not work if the application\nreads pcm captures too fast.\n\nThe fix consist in implementing a method based on real time measurement only.\nOne drawback is that the new method makes use of system calls that add some\noverhead to the process and capture functions.\n\nChange-Id: I53bd596b856f1cc7f0f47e08413af3335227100b\n"
    },
    {
      "commit": "f5e18125498b768d4528e4d1c19533c2b16f338b",
      "tree": "f86eceeef1fbda2032eb708de15aa15ee37dc4a6",
      "parents": [
        "9321ad6a7567a28116f15240688d474993539922"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Mar 26 10:47:22 2012 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Mar 26 10:54:41 2012 -0700"
      },
      "message": "reorganize SoundPool and JetPlayer code.\n\nReorganize SoundPool and JetPlayer code to be ready for the\ncreation of libmedia_native.\n\nSplit SoundPool between libsoundpool (JNI) and libmedia(sound pool implementation).\nRemove dependencies on nativehelper/jni.h from JetPlayer.\n\nChange-Id: I130c6014173b714329929dd82c5dfb70b757a610\n"
    },
    {
      "commit": "7061b5ffb37ea15f235effa1faaf22bb1750c7f5",
      "tree": "05a6922fbcd8489f93b799f2bf8fb8720e88fe3d",
      "parents": [
        "4acee00352b6c420f235c9b35010849ceaa9fc14",
        "c164faa8314c110d417b653b9926de4803bb2dda"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Mon Mar 26 07:36:41 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Mar 26 07:36:41 2012 -0700"
      },
      "message": "Merge \"Speed up playlist processing\""
    },
    {
      "commit": "39581f92482e000af2fe0575843d0752d164f9ae",
      "tree": "a5e25c538fc7e781e8d9e400b94914c7c80b851f",
      "parents": [
        "9ea03b9f29f6ec28ba4ced36c84328f48828f86d",
        "84569cc4e106ff4d6c6855b46e546572c5dda6b2"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Mar 26 07:16:37 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Mar 26 07:16:37 2012 -0700"
      },
      "message": "Merge \"IAudioFlinger::createTrack and openRecord flags\""
    },
    {
      "commit": "fe6ecdae580efef872df6f1d6b4e22db70afee20",
      "tree": "f324211fca2cab2c7dd41e00344680a9a02a6824",
      "parents": [
        "7c424a34d7d242e989170f63f6dff07fe3f078ad"
      ],
      "author": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Sat Mar 24 16:09:29 2012 -0700"
      },
      "committer": {
        "name": "Colin Cross",
        "email": "ccross@android.com",
        "time": "Sat Mar 24 23:34:44 2012 -0700"
      },
      "message": "libmedia: remove skia include\n\nskia is not used in this file, remove the unnecessary include.\n\nChange-Id: Ib4d0e0c0090c6b37ff8cfb816c0d8ba82a9638a4\n"
    },
    {
      "commit": "209cfdf4f6daf9c2959a3d1eef5544121c79c664",
      "tree": "b100ad98ba8ea7d41c8d8b6069c6aff8c63df46b",
      "parents": [
        "3b3a5b100b2ec63d8f6511b655c74f629b7d1981"
      ],
      "author": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Sat Mar 24 10:48:40 2012 -0700"
      },
      "committer": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Sat Mar 24 10:59:14 2012 -0700"
      },
      "message": "Remove JNI in LOCAL_C_INCLUDE from non-JNI related Android.mk files.\n\no related-to-bug: 6214141\n\nChange-Id: Ic88d1732b3e014af47532a0809e01f6086e8464d\n"
    },
    {
      "commit": "3b3a5b100b2ec63d8f6511b655c74f629b7d1981",
      "tree": "f012006b3eac20607e853f6345bb95a0ed8f201e",
      "parents": [
        "d4577c0c29f8e38a34d1aeac59803b37769af790",
        "6e3bceef9c0fcc82881fd88e98b299ce0371bbfa"
      ],
      "author": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Sat Mar 24 09:57:06 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Sat Mar 24 09:57:06 2012 -0700"
      },
      "message": "Merge \"VideoEditorMain.h is moved to /frameworks/av/libvideoeditor and thus can be deleted.\""
    },
    {
      "commit": "6e3bceef9c0fcc82881fd88e98b299ce0371bbfa",
      "tree": "040e72b7bfb888f06285305581cc80b78efb31b1",
      "parents": [
        "0aa4713e47a53377720a043cf1b043ce31cb73da"
      ],
      "author": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Sat Mar 24 09:36:34 2012 -0700"
      },
      "committer": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Sat Mar 24 09:42:59 2012 -0700"
      },
      "message": "VideoEditorMain.h is moved to /frameworks/av/libvideoeditor and thus can be deleted.\n\no this is to resolve undesirable dependency of /frameworks/av/libvideoeditor on /frameworks/base/media/jni\no related-to-bug: 6214141\n\nChange-Id: I62d08a7789ecb34d35cd22d2e6f68c3510c9bd90\n"
    },
    {
      "commit": "660b014daa639424e1a0bca299c5a8abfa14411c",
      "tree": "543736808c3f5849bfc59b751b3caeb72dcdbf11",
      "parents": [
        "a6deda436baf0df70438b0d9d795bb420b120114",
        "003a7569745640d700c318a463385ca5feb08728"
      ],
      "author": {
        "name": "Yu Shan Emily Lau",
        "email": "yslau@google.com",
        "time": "Fri Mar 23 18:53:18 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Mar 23 18:53:18 2012 -0700"
      },
      "message": "Merge \"Insert 2 seconds wait in each test case setup. This is the work around for the surface request race condition.\""
    },
    {
      "commit": "003a7569745640d700c318a463385ca5feb08728",
      "tree": "9c5378151cd218d5a247b34985f6bbba26af5743",
      "parents": [
        "b7b3894a8e960aacf941f08b97834e1c87aefe48"
      ],
      "author": {
        "name": "Yu Shan Emily Lau",
        "email": "yslau@google.com",
        "time": "Thu Mar 22 18:46:18 2012 -0700"
      },
      "committer": {
        "name": "Yu Shan Emily Lau",
        "email": "yslau@google.com",
        "time": "Fri Mar 23 17:58:49 2012 -0700"
      },
      "message": "Insert 2 seconds wait in each test case setup.\nThis is the work around for the surface request race\ncondition.\n\nChange-Id: Iaf8be12cfe4eb70d0a309ad875f38427181ac4b4\n"
    },
    {
      "commit": "c164faa8314c110d417b653b9926de4803bb2dda",
      "tree": "35cb3ae226e1b663d07e710fa2205339268432e5",
      "parents": [
        "da9deca7bab75f39a236d04b9e43d9da833ce4a0"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Fri Mar 23 16:04:58 2012 -0700"
      },
      "committer": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Fri Mar 23 16:37:50 2012 -0700"
      },
      "message": "Speed up playlist processing\n\nThe recent removal of the cache from MediaScanner (commit 58ef68905d67e356eb)\nslowed down processing of playlists, in some cases significantly, due to every\nline in a playlist prompting a query that looped over the entire audio table.\n\nWith this change, the query is only done once instead of for every line,\nand the code starts iterating over the Cursor starting near the point of\nthe last match, instead of from the start. The latter is especially helpful\nwhen the entire query result is too large to fit in a CursorWindow, since\nit reduces the number of times that sqlite has to perform an offset query\nunder the hood to refil the window.\n\nChange-Id: I9fea990b3b8c86571384de2122708fb7e809c355\n"
    },
    {
      "commit": "a945aad739fbe8b3c212ce5aa0bbc5d8c021612d",
      "tree": "6cef91575f96c942fe1207ee90a6b4da30ab80a9",
      "parents": [
        "243806cfeb72e46b39994b2ec3b0908fc7fcc973",
        "eb3be2d8c543168bf6daa97e8187a62678e6be11"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Mar 23 14:06:00 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Mar 23 14:06:00 2012 -0700"
      },
      "message": "Merge \"Revert \"Split libmedia into libmedia and libmedia_native\"\""
    },
    {
      "commit": "eb3be2d8c543168bf6daa97e8187a62678e6be11",
      "tree": "32f9b27b66b9953800c5e44fc1858b473cdf5c2a",
      "parents": [
        "0a3edd38df0743dcc7091bb7ebf29e7e7dadc7cb"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Mar 23 14:05:52 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Mar 23 14:05:52 2012 -0700"
      },
      "message": "Revert \"Split libmedia into libmedia and libmedia_native\"\n\nThis reverts commit 0a3edd38df0743dcc7091bb7ebf29e7e7dadc7cb"
    },
    {
      "commit": "0f6cb4500209adaa446656d39d8a625ac969893b",
      "tree": "feb8c53ee930726018d9b36e524708abaa249d13",
      "parents": [
        "2b16bf6bdbae150a3aa0da51361e3ea9e63fd3c2"
      ],
      "author": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Fri Mar 23 11:24:32 2012 -0700"
      },
      "committer": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Fri Mar 23 11:24:32 2012 -0700"
      },
      "message": "LibAAH_RTP: Release TX Group on error.\n\nImmedately release any TX group a player is holding upon entering the\nerror state.  Once in the error state, the only way out for a media\nplayer it to be completely reset (destroying the player at the\ntx_player level of things).  There is really no point in holding on to\na tx group once the player is in the error state.\n\nChange-Id: If5442a32e012b5596789078b0790ed73fa842629\n"
    },
    {
      "commit": "2b16bf6bdbae150a3aa0da51361e3ea9e63fd3c2",
      "tree": "27a837b6b034327cd7c4aed66a3946b3348be085",
      "parents": [
        "96fecb7f6b74176c0fad7bfa2c7ae9b80e1770cc"
      ],
      "author": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Wed Mar 21 17:57:43 2012 -0700"
      },
      "committer": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Fri Mar 23 11:00:38 2012 -0700"
      },
      "message": "LibAAH_RTP: Fix handling of PCM format changes.\n\nWhen an audio decoder signals a format change, we were destroying our\nrenderer so that a new one could be created with the new format, but\nwe were not updating our internal format state variables with the new\nformat information.\n\nThis fixes issues with AAC audio with SBR extensions; in particular\ncontent coming from Pandora.  Pandora audio is currently being\ndelivered as AAC-LC decoding to 22.05 KHz, but with an SBR layer which\ngives 44.1 KHz.  Whether or not you are going to get 22.05 or 44.1\ndepends on if your decoder supports SBR (\"High Efficiency\" profile).\nStagefright does not parse the extension sample rate present in the\nESDS; instead it reports the sample rate of the base stream (22050 in\nthis case).  Its only when the decoder decides it can handle SBR that\nyou get a chance to discover that the content is actually 44.1,\ninformation it delivers via a format change status code during read.\n\nSigned-off-by: John Grossman \u003cjohngro@google.com\u003e\nChange-Id: I78fb89b4356004d7834629ccc82ca99c4cc7954a\n"
    },
    {
      "commit": "6f64c90c84483d108da2d2572e3be44377e6a79e",
      "tree": "86648b6aab1cb84b3dcc1594e38a3845c5c02970",
      "parents": [
        "2e842a58ebbc3a8a0599dfb0c19d7cda7ed21e5f"
      ],
      "author": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Fri Mar 23 08:39:04 2012 -0700"
      },
      "committer": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Fri Mar 23 08:39:04 2012 -0700"
      },
      "message": "Fix the file mimetype reported by the mpeg4 extractor.\n\nChange-Id: I72474c17757dba5867f55b0e99e76e9e4e32ce7b\nrelated-to-bug: 6217289\n"
    },
    {
      "commit": "798cda73e173d69f7be51aa9123cd1917bfd5d59",
      "tree": "baa8afdc57528d6d89e63cb5cb7d7939cc91209e",
      "parents": [
        "19c9d98e90a45fb50caf68a0dc4ad699f2af6c37"
      ],
      "author": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Thu Mar 22 18:03:13 2012 -0700"
      },
      "committer": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Thu Mar 22 19:11:43 2012 -0700"
      },
      "message": "Change Android.mk file to use the new location after /frameworks/media/libvideoeditor source files are moved\n\no related-to-bug: 6214141\n\nChange-Id: Ic9f07a8558e944237ccaba4f756fcab59f84e78f\n"
    },
    {
      "commit": "41d88d5f58ede432c7574c55b388dc390b08dc3b",
      "tree": "9d352aaaab8fc81fc9507025e053e7c5a2a06130",
      "parents": [
        "941ff38d05f1d870df224ac329d16ab2207b94a1"
      ],
      "author": {
        "name": "Jason Noguchi",
        "email": "jnoguchi@google.com",
        "time": "Tue Feb 21 15:09:48 2012 -0800"
      },
      "committer": {
        "name": "Jason Noguchi",
        "email": "jnoguchi@google.com",
        "time": "Thu Mar 22 17:52:03 2012 -0700"
      },
      "message": "Adding camera zoom test to mediaframework stress suite.\n\nChange-Id: I3ee72156f42cf189ff1d0bd469f83b938a6b87ff\n"
    },
    {
      "commit": "6c798970ccb8759d1e613b57111daa8da0ab44c7",
      "tree": "aeef6b4b676e3b74ca2c93a6c00df3446cf1c032",
      "parents": [
        "24b082f87e96c00d5c17d60c735423900be40e70"
      ],
      "author": {
        "name": "Lei Zhang",
        "email": "rzhang@google.com",
        "time": "Fri Mar 02 11:40:12 2012 -0800"
      },
      "committer": {
        "name": "Mike Lockwood",
        "email": "lockwood@google.com",
        "time": "Thu Mar 22 15:09:18 2012 -0700"
      },
      "message": "Add batch volume adjust support to adjustMasterVolume() in AudioManager and\nAudioService.\n\nChange-Id: I09b1dfc93f14ca836e1ba2a400c00caed01fd541\n"
    },
    {
      "commit": "24b082f87e96c00d5c17d60c735423900be40e70",
      "tree": "a2e26d005cceb3a1f584826934f78f09faf42b0e",
      "parents": [
        "c1c0ced6698978cb4226148a422503fdac6b59b5"
      ],
      "author": {
        "name": "RoboErik",
        "email": "epastern@google.com",
        "time": "Fri Feb 24 14:21:16 2012 -0800"
      },
      "committer": {
        "name": "Mike Lockwood",
        "email": "lockwood@google.com",
        "time": "Thu Mar 22 15:09:12 2012 -0700"
      },
      "message": "Fix Audio ramping code\n\nThe audio ramping was being ignored and we were always adjusting\nby the same amount.\n\nChange-Id: Id4a6587fd488132816ae26776c0f798782470b1d\n"
    },
    {
      "commit": "4355b001cb736d4aa312231ce129506a3c7f6808",
      "tree": "d0a164a4f4a2b81659a73043e65a786656c2ea4a",
      "parents": [
        "3558486c138fa18d9156486b80a5c8f3297f59c1",
        "8686938aa51a8c0005120f242cb187c25fe7bcb2"
      ],
      "author": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Thu Mar 22 14:00:53 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Mar 22 14:00:53 2012 -0700"
      },
      "message": "Merge \"Use NuPlayer for media playback everywhere\""
    },
    {
      "commit": "8686938aa51a8c0005120f242cb187c25fe7bcb2",
      "tree": "7627e6c766af410bf88aa180d53b549834934651",
      "parents": [
        "af0c843672322af3e7af8d684fc3375ef9291843"
      ],
      "author": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Tue Sep 20 15:39:58 2011 -0700"
      },
      "committer": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Thu Mar 22 13:18:08 2012 -0700"
      },
      "message": "Use NuPlayer for media playback everywhere\n\nif media.stagefright.use-nuplayer is set to true.\n\nChange-Id: Ibb217e7d7d5195b7feeea557554fe78e1585744c\n"
    },
    {
      "commit": "6becc5a811c74a20e72eb8e81fdc5d21361d2d7f",
      "tree": "98e527bd683e8c928e10589f1beec23ffa78dabc",
      "parents": [
        "7d4f7e35bcf1b80da1f9fffaff052b0940596521"
      ],
      "author": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Thu Mar 22 11:26:45 2012 -0700"
      },
      "committer": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Thu Mar 22 11:30:09 2012 -0700"
      },
      "message": "LibAAH_RTP: Fix an issue which crept in during code review.\n\nFix a mistake which came in as part of a merge conflict resolution\nduring code review of the recent unicast mode refactor of LibAAH_RTP.\nNop packet which were supposed to carry TS transformations for the\npause state accidentally got flagged as Flush operations.  The flush\npacket successfully carried the TS transformation, but also had the\nundesired side effect of constantly flushing the stream.\n\nChange-Id: I4c6aa0043fc274a1d7e880ed1d19cf277f22194b\nSigned-off-by: John Grossman \u003cjohngro@google.com\u003e\n"
    },
    {
      "commit": "bf30911bf1894506793fccea24deca2e9208b3b4",
      "tree": "a479a90fce6bee5b635f53f6215c6ae726df6893",
      "parents": [
        "b909b6a1481b9832ede549d17e2e4478bbdd2efe",
        "2333a27ee528e97400d41838696258f29aa48688"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Mar 22 11:06:49 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Mar 22 11:06:49 2012 -0700"
      },
      "message": "Merge \"Remove enforceFrameCount\""
    },
    {
      "commit": "da9deca7bab75f39a236d04b9e43d9da833ce4a0",
      "tree": "da55de4303ab3e4a2e32c70e9fc539dbc3da5745",
      "parents": [
        "222dfc784e5c5b4eb6a4770b9f46fe96eecbd65d"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Wed Mar 21 13:36:07 2012 -0700"
      },
      "committer": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Thu Mar 22 10:06:03 2012 -0700"
      },
      "message": "Support gapless playback for mp3 and m4a\n\nGapless playback for appropriately tagged mp3 and m4a files.\nCurrently this is implemented in OMXCodec, which most players\nuse, but should be easy to support in other players as well by\nusing the SkipCutBuffer utility class.\n\nChange-Id: I748c669adc1cfbe5ee9a7dea2fad945d48882551\n"
    },
    {
      "commit": "222dfc784e5c5b4eb6a4770b9f46fe96eecbd65d",
      "tree": "d8a6aeb27027e1e8442ad38710bf1dfe0f772fa0",
      "parents": [
        "20a75451d10dbb6efdfb6a2bb3a4903f87ff58ec",
        "0a3edd38df0743dcc7091bb7ebf29e7e7dadc7cb"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Mar 22 07:14:27 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Mar 22 07:14:27 2012 -0700"
      },
      "message": "Merge \"Split libmedia into libmedia and libmedia_native\""
    },
    {
      "commit": "0a3edd38df0743dcc7091bb7ebf29e7e7dadc7cb",
      "tree": "7af4c71e4beec7cf0ee70cc538c5d3439f665300",
      "parents": [
        "004f9bac41e762b52e28ade469c057f6f0e833d2"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 21 09:08:11 2012 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 21 15:45:29 2012 -0700"
      },
      "message": "Split libmedia into libmedia and libmedia_native\n\nThis is still in the old location\n\nChange-Id: Ic1be549b5b607cfd519cb4cecc581624510a4ee1\n"
    },
    {
      "commit": "2333a27ee528e97400d41838696258f29aa48688",
      "tree": "29f127d908ad6409920482c839cb1aaa11e32f41",
      "parents": [
        "004f9bac41e762b52e28ade469c057f6f0e833d2"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Mar 19 12:16:56 2012 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 21 15:41:02 2012 -0700"
      },
      "message": "Remove enforceFrameCount\n\nIt was only used to decide whether to issue a warning.\nThe warning was issued the first time track was created but\nnot at re-creation.  Now it is a verbose message every time,\nnot a warning since it happens all the time with key clicks on A2DP.\n\nChange-Id: I9d39f53c0a7eb84b666e55b1b76ff830cf8f37ba\n"
    },
    {
      "commit": "3e6792232aa0ce3e650eaa03529c9eb2fe023ca9",
      "tree": "5cd926e608dbe3e3b5e1986bd48051961f29303b",
      "parents": [
        "63b9e973e53476db36eb9cb9f14f0e5c0805d0bd",
        "d0a524fb5946dbe4f27df2c235435e6f1bf805ae"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Wed Mar 21 15:12:44 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Mar 21 15:12:44 2012 -0700"
      },
      "message": "Merge \"Add MetaData::dumpToLog\""
    },
    {
      "commit": "d0a524fb5946dbe4f27df2c235435e6f1bf805ae",
      "tree": "afc3052ec081f95b22d990bffb5aef75867fcdc3",
      "parents": [
        "8fca15f1f2273fa429e58f783d0970251d0942e5"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Wed Mar 21 12:27:00 2012 -0700"
      },
      "committer": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Wed Mar 21 15:00:27 2012 -0700"
      },
      "message": "Add MetaData::dumpToLog\n\nUtility method for dumping the content of a MetaData object to the log.\n\nChange-Id: I2d91b991e1d9fed2215e8995a73c2b1854205074\n"
    },
    {
      "commit": "092bae63f14eac9538a5d4e60a528af255471a6f",
      "tree": "ee57327c615ff4f3a645de2a159fe787a829285b",
      "parents": [
        "fa9ea48ddf0d75ff9e8556299fa0e0c1fe436f6d"
      ],
      "author": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Mon Mar 19 16:04:18 2012 -0700"
      },
      "committer": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Wed Mar 21 14:01:47 2012 -0700"
      },
      "message": "LibAAH_RTP: Properly handle EOS conditions.\n\nEOS was being treated as a flush operation which was causing problems.\nIn particular, the transmitter was delcaring that playback was\ncomplete early (by the clock lead time of the system, which was 1\nsecond in this case).  Also, the receiver was treating the EOS message\njust like the flush message, immediately destroying the substreams\nassociated with the program without letting them play out first.\n\nChange the transmitter to send the EOS message like it always does,\nbut have it wait until the media time of the last sample has arrived\nbefore reporting playback complete to the app level of things.\n\nOn the receiver side of things, don\u0027t treat the EOS message like the\nflush message.  Instead, have the EOS message simply put the substream\ninto EOS mode, allowing it to signal EOS to its decoder and shut off\nthe isAboutToUnderflow hack.\n\nChange-Id: Ibe3ac01044373f83edb7a5f4b70478bd78c16d11\n"
    },
    {
      "commit": "fa9ea48ddf0d75ff9e8556299fa0e0c1fe436f6d",
      "tree": "e4ff5591e204a0f5e464b908b243dd7f8777426f",
      "parents": [
        "2921612dc827073c8484316f9abd21e67285ee00"
      ],
      "author": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Mon Mar 19 11:20:02 2012 -0700"
      },
      "committer": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Wed Mar 21 12:12:31 2012 -0700"
      },
      "message": "LibAAH_RTP: Get rid of PipeEvent\n\nBionic/Android support eventfd, so there is really no reason to have\nPipeEvent around any more.  This change gets rid of it in LibAAH_RTP\nand replaces it with eventfds.\n\nChange-Id: I841fcb71bf5015d521d7517c69f44eac0ea92278\nSigned-off-by: John Grossman \u003cjohngro@google.com\u003e\n"
    },
    {
      "commit": "2921612dc827073c8484316f9abd21e67285ee00",
      "tree": "60bafa3d84c8c187bb623a8540f55dc3ddee5867",
      "parents": [
        "06938878d3fd9f66d87518f690f1770d1e7a33da"
      ],
      "author": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Sun Mar 18 16:35:36 2012 -0700"
      },
      "committer": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Wed Mar 21 12:12:28 2012 -0700"
      },
      "message": "LibAAH_RTP: Add unicast mode support to the RXPlayer\n\nAdd support for unicast mode to the AAH RXPlayer.  At the API level,\nthings should be pretty simple.  To use unicast mode, instead of\npassing the multicast address and port in the data source URL, just\npass the unicast address and port of the transmitters command and\ncontrol port.  For example, instead of\n\naahRX://224.128.60.5:8867\n\none might instead pass\n\naahRX://192.168.63.5:55476\n\nChange-Id: I7b40716983d7a91def86dcf40f093dda4255aae3\nSigned-off-by: John Grossman \u003cjohngro@google.com\u003e\n"
    },
    {
      "commit": "06938878d3fd9f66d87518f690f1770d1e7a33da",
      "tree": "f8c13d081ea60e45f03cb6dd194abc374b901756",
      "parents": [
        "42a6382f1e318fab8a4ee2cd3a8e77fc158a5744"
      ],
      "author": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Sat Mar 17 17:05:50 2012 -0700"
      },
      "committer": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Wed Mar 21 12:10:41 2012 -0700"
      },
      "message": "LibAAH_RTP: Fix a stuttering audio bug.\n\nFix a bug discovered while working on adding unicast mode to the TX/RX\nplayers.  Also some general cleanup/consolidation regarding timeout\ncode.\n\nThe bug went like this.  When a TX player had hit EOS, it would send\nan EOS command payload to its receivers.  Later, when application\nlevel code shutdown and cleaned up the player, it would send another.\nIn situations where there is massive packet loss, there is a chance\nthat not only did both of the EOS packets get dropped, but that they\nnever got filled in by the retry algorithm because the receiver gave\nup on the RTP gap due to an aboutToUnderflow situation in at least one\nof its active substreams.\n\nWhen this happens, there are two major problems.  First, all of the\nsubstreams associated with the TX player which has now gone away have\nbecome effectively leaked.  They will only get cleaned up if the\nentire RTP stream (the TX Group) goes away for 10 seconds or more, or\nwhen the RX Player itself is reset by application level code or a\nfatal error.  These substreams are holding decoder and renderer\nresources which are probably in very short supply, which is a Bad\nThing.\n\nSecond, there is now at least one substream in the RX player which is\nnever going to receive another payload (its TX player source is gone),\nbut is still considered to be active by the rx player.  Assuming that\nthis substream\u0027s program was in the play state when the track ended,\nthere is now at least one substream which is always\n\"aboutToUnderflow\".  From here on out, when the retry algorithm is\nattempting to decide whether or not it has the time to attempt to fill\nin a gap in the muxed RTP sequence, it always decides that it does not\nhave the time because of the orphaned substream which is stuck in its\nabout to underflow state.  This effectively means that the retry\nalgorithm is completely shut off until the rx player gets reset\nsomehow (something which does not happen during normal operation).\nSince the environment had to be extremely lossy to trigger this chain\nof events in the first place, and its probably no better now, your\nplayback is just going to be chock full of gaps which produces\nhorrible stuttering in the presentation stage of the system.\n\nTwo new failsafes have been introduced to keep the double EOS drop\nfrom causing this.  First, a timeout has been introduced on the\nsubstream level, in addition to the already existing RTP level\ntimeout.  If a substream fails to receive an activity for 10 seconds\n(same timeout as the master RTP timeout), it will be automatically\nflushed and purged.\n\nSecond, the nature of the master RTP timeout on the transmitter side\nhas been changed.  Instead of just sending an empty NOP command packet\nto indicate that the main RTP stream is still alive, the transmitter\nnow sends a new time of command packet; the Active Program Update\npacket.  This packet contains a list of all the active program ID\nattached to this TX group.  Upon receiving one of these APU packets,\nRX players reset the inactivity timers for all substreams which are\nmembers of the programs listed in the packet, but they also\nimmediately purge any substreams associated with programs not present\nin the APU.\n\nBetween the two of these, no matter how nasty and selective the packet\nsmashing gremlins in your system happen to be, substreams will always\neventually clean up and avoid getting stuck in a perma-stutter\nsituation.\n\nAlso in this CL:\n+ Extract some common utility code into a utils.cpp file so that it\n  can be shared across the library.\n+ Stop using custom timeout logic in the RXPlayer.  Instead, use the\n  common Timeout helper class in utils.cpp.\n\nSigned-off-by: John Grossman \u003cjohngro@google.com\u003e\nChange-Id: I350869942074f2cae020f719c2911d9092ba8055\n"
    },
    {
      "commit": "42a6382f1e318fab8a4ee2cd3a8e77fc158a5744",
      "tree": "e67b32e025d95acc9a3a46e8b460dd4752877945",
      "parents": [
        "79314de091b2845b2678c3c166a0014f3976d865"
      ],
      "author": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Wed Mar 14 18:37:14 2012 -0700"
      },
      "committer": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Wed Mar 21 12:02:37 2012 -0700"
      },
      "message": "LibAAH_RTP: Refactor TXGroup code, add unicast mode.\n\nSignificantly refactor the TXGroup code to allow transmit groups to\noperate in a unicast fanout mode in addition to the traditional pure\nmulticast mode.  Important changes include...\n\n+ Each transmit group active in the system now has its own socket to\n  send and receive traffic on.  In the past, this socket was used to\n  listen for retry requests from clients.  Now it is also used to\n  listen for group membership reports (IGMPv3 style) from unicast\n  clients.  Having an individual socket per transmit group allows\n  unicast clients to join the group needing only the IP address and\n  port of the transmitters socket, and not needing any additional\n  \"group id\" to be sent to the client beforehand.\n+ Setup for the transmitter is now slightly different.  As before, to\n  setup for multicast mode, a user can call setRetransmitEndpoint\n  passing an IPv4 multicast address and specific port to transmit to.\n  It used to also be the case that a user could pass a specific\n  unicast address and port to transmit to as well.  This is no longer\n  allowed.  Instead, to operate in unicast mode, a user passes 0.0.0.0\n  (IPADDR_ANY) as the IP address.  In addition, they need to pass\n  either 0 for a port to create a new unicast mode TX group, or they\n  need to pass a specific port to cause the player to attempt to use\n  an existing unicast mode TX group.  The specific port should be the\n  command and control port of the TX group which was bound to when the\n  group was originally created.\n+ A magic invoke was added to allow clients to fetch the command and\n  control port on which a TX Player\u0027s TX Group is listening.\n\nThe API described above is most likely temporary and should eventually\nbe replaced with one where TX groups are formal top level objects with\ntheir own independent interface and life-cycle management.\n\nSigned-off-by: John Grossman \u003cjohngro@google.com\u003e\nChange-Id: Ib4e9737c10660d36c50f1825c9824fff5390b1c7\n"
    },
    {
      "commit": "ceb0909bc2c9427f4b5a2c8cad219cdb73577956",
      "tree": "5a4a9cae46b92653c93aa728227be488ac20a7d1",
      "parents": [
        "6d332c514805798a9a545999e7f0d6d83a6a35d1",
        "eb473f3627b8ae3e658e2e68849776967413a033"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Wed Mar 21 10:16:55 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Mar 21 10:16:55 2012 -0700"
      },
      "message": "Merge \"Parse gapless info from mp4 files\""
    },
    {
      "commit": "79314de091b2845b2678c3c166a0014f3976d865",
      "tree": "946ef43933adf6c4803a1808b564e8a6b6b6b0f2",
      "parents": [
        "5490256b53cad3147f652fe163d35ca404800068"
      ],
      "author": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Tue Mar 13 14:02:14 2012 -0700"
      },
      "committer": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Wed Mar 21 09:52:04 2012 -0700"
      },
      "message": "LibAAH_RTP: Change names to prepare for refactor.\n\nRename AAH_TXSender to AAH_TXGroup in preparation for refactoring to\nsupport unicast retransmission.\n\nSigned-off-by: John Grossman \u003cjohngro@google.com\u003e\nChange-Id: I3984db27d1c61c6155d5d7cb9c38eead421b9249\n"
    },
    {
      "commit": "eb473f3627b8ae3e658e2e68849776967413a033",
      "tree": "fc5d13ee71df64855409eea80e0be8669413650f",
      "parents": [
        "8fca15f1f2273fa429e58f783d0970251d0942e5"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Tue Mar 20 10:05:06 2012 -0700"
      },
      "committer": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Wed Mar 21 09:50:53 2012 -0700"
      },
      "message": "Parse gapless info from mp4 files\n\nChange-Id: I4c83d4e12e996dc29708268e68a4bb74b368c6f3\n"
    },
    {
      "commit": "652e18d896870c6733412b63c4c99657cc60946e",
      "tree": "d81efb3f4ba65d1a4b9e95cd462fd4eb21c98eaf",
      "parents": [
        "32d72b2f538673466f6e0ebf01886412e803dc4f",
        "76b6c0c1f57f5b6b5b5d46f0a835a3c36f48b7f3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 21 07:24:21 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Mar 21 07:24:21 2012 -0700"
      },
      "message": "Merge \"Update comments\""
    },
    {
      "commit": "32d72b2f538673466f6e0ebf01886412e803dc4f",
      "tree": "167ad9eaf5aeaf25a60ea337b89b10dca4d23e60",
      "parents": [
        "85b51b8ae39a4aa3181d92e171baa86437475c0c",
        "f743e1f6abdb018fc58c467cdf35cbb8b81cf8c4"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 21 07:22:40 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Mar 21 07:22:40 2012 -0700"
      },
      "message": "Merge \"Whitespace\""
    },
    {
      "commit": "abcc868f3a21b3f6f228b8580212848658ef4c2f",
      "tree": "3716841bd158348a0fa10569e275ce93a46de032",
      "parents": [
        "5217d2a8d3946cff65e7b0558eb5fe3c908f747a",
        "56aeeb8d7a7abf0b1d14a4191bc01cf63c7fc9ff"
      ],
      "author": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Tue Mar 20 18:53:29 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Mar 20 18:53:29 2012 -0700"
      },
      "message": "Merge \"Handling end times of subtitles.\""
    },
    {
      "commit": "56aeeb8d7a7abf0b1d14a4191bc01cf63c7fc9ff",
      "tree": "2e2128e32c88a6c8fb80ba20961f49c5ff05d268",
      "parents": [
        "ab750c5e29afa8543a067bf05f502b1fa6748216"
      ],
      "author": {
        "name": "Insun Kang",
        "email": "insun@google.com",
        "time": "Wed Mar 14 08:16:35 2012 +0900"
      },
      "committer": {
        "name": "Insun Kang",
        "email": "insun@google.com",
        "time": "Wed Mar 21 10:44:04 2012 +0900"
      },
      "message": "Handling end times of subtitles.\n\nChange-Id: Ic19ec8980d0a2bf9f265d375cd56e638a2460af8\n"
    },
    {
      "commit": "dd5bd2981d6c45bf24ac949474819171ef406f13",
      "tree": "5e25f872cc4ec7fa887ee07e5903e58ce5d3750c",
      "parents": [
        "3a382b58c89090a0051a58a8255e681f7266835d",
        "7306a388cbb961154e534f37d8f5126112df6cab"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Tue Mar 20 10:08:52 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Mar 20 10:08:52 2012 -0700"
      },
      "message": "Merge \"Move COM tag parsing to constructor\""
    },
    {
      "commit": "7306a388cbb961154e534f37d8f5126112df6cab",
      "tree": "2e7922a99ee24a08c5ecf23ce2a5b7d2566e6933",
      "parents": [
        "2ed77701f908f63e072abd0e7eb1c4af61f9347f"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Tue Mar 20 09:48:02 2012 -0700"
      },
      "committer": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Tue Mar 20 09:48:02 2012 -0700"
      },
      "message": "Move COM tag parsing to constructor\n\nChange-Id: Icfcf05655ca98ccccad4f94834770c2f4098a764\n"
    },
    {
      "commit": "54fa7254838748c4149f4e340f479fc4e3b2357d",
      "tree": "f97e85512bec47cbfcf5b7e6532031f59fcc447e",
      "parents": [
        "b2e822fc2ac87703ac12d062add62408574cbf7c",
        "2ed77701f908f63e072abd0e7eb1c4af61f9347f"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Tue Mar 20 09:15:05 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Mar 20 09:15:05 2012 -0700"
      },
      "message": "Merge \"Parse mp3 encoder padding/delay\""
    },
    {
      "commit": "2ed77701f908f63e072abd0e7eb1c4af61f9347f",
      "tree": "ac0d43e3863cfaa544a46c3916bfc54630319f3d",
      "parents": [
        "4fc769e9dfd1e859a960b49102e48ed9f0d8ff38"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Mon Mar 19 13:49:43 2012 -0700"
      },
      "committer": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Tue Mar 20 08:46:11 2012 -0700"
      },
      "message": "Parse mp3 encoder padding/delay\n\nGet the mp3 encoder padding and delay from a XING frame or iTunSMPB tag.\n\nChange-Id: Icde598c8857d7e7c187a718f478ee9799d6a1b8a\n"
    },
    {
      "commit": "485932f6afa1541caa9429835ef44a928e7ddfb1",
      "tree": "6dfff95ea3c158c1208d0deaa6485e94bec66cb6",
      "parents": [
        "09f5aededa1568f59bbe014ce5199ebca35a93b8",
        "c59d1a8f0ccbf8d95c8f29cfe9d955d081807fc9"
      ],
      "author": {
        "name": "Wu-cheng Li",
        "email": "wuchengli@google.com",
        "time": "Mon Mar 19 19:25:56 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Mar 19 19:25:56 2012 -0700"
      },
      "message": "Merge \"Do not set camera preview display if the surface is null.\""
    },
    {
      "commit": "f743e1f6abdb018fc58c467cdf35cbb8b81cf8c4",
      "tree": "cc01c648f5b8b7bd10f852dde7037c98f6e0066e",
      "parents": [
        "bf02b984738f6be5cc2e2d66b12aff7af99eb79e"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 14 12:56:26 2012 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Mar 19 17:53:33 2012 -0700"
      },
      "message": "Whitespace\n\nFix indentation, and add blank lines in key places for clarity\n\nChange-Id: I57a0a8142394f83203161aa9b8aa9276abf3ed7c\n"
    }
  ],
  "next": "4d3f82e8d99558551b876ad075ad999cb92f5327"
}
