GitHub PullRequestReviewCommentEvent at 2014-10-08 12:01:57
Repository: webrtc
Actor: KaptenJansson
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/GoogleChrome/webrtc/pulls/comments/18577122","id":18577122,"diff_hunk":"@@ -0,0 +1,174 @@\n+/*\n+ *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.\n+ *\n+ *  Use of this source code is governed by a BSD-style license\n+ *  that can be found in the LICENSE file in the root of the source\n+ *  tree.\n+ */\n+\n+/* More information about these options at jshint.com/docs/options */\n+/* jshint browser: true, camelcase: true, curly: true, devel: true, eqeqeq: true, forin: false, globalstrict: true, quotmark: single, undef: true, unused: strict */\n+\n+'use strict';\n+\n+// Test spec\n+// 1. TODO: Enumerate cameras.\n+// 2. Try opening the (a) camera in VGA.\n+// 3. TODO: Try camera in other resolutions, particularly HD.\n+// 4. TODO: Translate gum failures to user friendly messages, using\n+//   MediaStreamError.name in { NotSupportedError, PermissionDeniedError,\n+//   ConstrainNotSatisfiedError, OverconstrainedError, NotFoundError,\n+//   AbortError, SourceUnavailableError }.\n+// 4.Check that the MediaStreamTrack associated with the camera looks good.\n+// 4.a Capture for a couple of seconds and monitor the events on the\n+//   MediaStreamTrack: onEnded(), onMute(), onUnmute().\n+// 4.b If onEnded() fires, reportFatal() is called (e.g. camera is unplugged).\n+// 4.c We keep a local |isMuted| state during the capture period (4.a) to check\n+//   it at the end. (TODO: local isMuted can be deprecated once\n+//   mediaStreamTrack.muted property is wired up in Chrome).\n+// 4.d After the wait period we check that the video tag where the |stream| is\n+//   plugged in has the appropriate width and height.\n+// 4.e We also check that all frames were non-near-black.\n+// 5. Tear down the |stream|. TODO: this should be done in the test harness.\n+\n+function CamCaptureTest() {\n+  this.isMuted = false;\n+  this.stream = null;\n+  this.testActive = false;\n+  this.numBlackFrames = 0;\n+  this.blackFrameThreshold = 3;\n+  this.constraints = {\n+    video: { mandatory: { minWidth: 1280, minHeight: 720} }\n+  };\n+};\n+\n+addTestSuite('CamCaptureTest', function() {\n+  var test = new CamCaptureTest();\n+  test.run();\n+});\n+\n+CamCaptureTest.prototype = {\n+  run: function() {\n+    doGetUserMedia(this.constraints, this.gotStream.bind(this));\n+  },\n+\n+  gotStream: function(stream) {\n+    this.stream = stream;\n+    this.setupVideo();\n+    if (this.checkVideoTracks(stream)) {\n+      this.checkVideoStart(stream);\n+    }\n+    attachMediaStream(this.video, stream);\n+    reportInfo('Checking if your camera is delivering frames for five ' +\n+               'seconds...');\n+    this.setupCanvas();\n+    setTimeout(function() { this.checkVideoFinish(this.video); }.bind(this),\n+        5000);\n+  },\n+\n+  checkVideoTracks: function(stream) {\n+    reportSuccess(\"getUserMedia succeeded.\");\n+    var tracks = stream.getVideoTracks();\n+    if (tracks.length < 1) {\n+      return reportFatal('No video track in returned stream.');\n+    }\n+    var videoTrack = tracks[0];\n+    reportSuccess('Video track exists with label = ' + videoTrack.label);\n+    this.testActive = true;\n+    return true;\n+  },\n+\n+  checkVideoStart: function(stream) {\n+    var videoTrack = stream.getVideoTracks()[0];\n+    videoTrack.onended = function() {\n+      reportError('Video track ended, camera stopped working');\n+    }\n+    videoTrack.onmute = function() {\n+      reportError('Your camera reported itself as muted.');\n+      // MediaStreamTrack.muted property is not wired up in Chrome yet, checking\n+      // isMuted local state.\n+      this.isMuted = true;\n+    }\n+    videoTrack.onunmute = function() {\n+      this.isMuted = false;\n+    }\n+  },\n+\n+  checkVideoFinish: function(video) {\n+    assertEquals(this.constraints.video.mandatory.minWidth,\n+        video.videoWidth, 'Incorrect width', 'Width OK');\n+    assertEquals(this.constraints.video.mandatory.minHeight,\n+        video.videoHeight, 'Incorrect height', 'Height OK');\n+    if (this.stream.getVideoTracks()[0].readyState !== 'ended') {\n+      assertEquals(false, this.isMuted, 'Your camera reported ' +\n+                   'itself as muted! It is probably not delivering frames. ' +\n+                   'Please try another webcam.', 'Camera is delivering frames');\n+    }\n+    // Check: amount of near-black frames should be 0.\n+    assertEquals(this.numBlackFrames, 0, 'Your camera seems to be ' +\n+                 'delivering near-black frames. This might be all right or ' +\n+                 'it could be a symptom of a camera in a bad state; if it\\'s ' +\n+                 'a USB WebCam, try plugging it out and in again.', 'Camera ' +\n+                 'is sending non-black frames.');\n+    this.stream.getVideoTracks()[0].onended = null;\n+    this.testActive = false;\n+    this.stream.getVideoTracks()[0].stop();\n+    testSuiteFinished();\n+  },\n+\n+setupVideo: function() {\n+    this.video = document.createElement('video');\n+    this.video.width = this.constraints.video.mandatory.minWidth;\n+    this.video.height = this.constraints.video.mandatory.minHeight;\n+    this.video.setAttribute('autoplay','');\n+    this.video.setAttribute('muted','');\n+  },\n+\n+  setupCanvas: function() {\n+    this.canvas = document.createElement('canvas');\n+    this.canvas.width = this.video.width;\n+    this.canvas.height = this.video.height;\n+    this.context = this.canvas.getContext('2d');\n+    this.video.addEventListener('play', function() {\n+        this.draw(this.video, this.context, this.canvas.width,\n+        this.canvas.height);}.bind(this), false);\n+    var imageData = this.context.getImageData(0, 0, this.canvas.width,\n+        this.canvas.height);\n+    this.checkForBlackFrame(imageData.data, imageData.data.length,\n+        this.numBlackFrames);\n+  },\n+\n+  draw: function(video, context, width, height) {\n+    if (this.video.ended) {\n+      return false;\n+    }\n+    if (this.testActive) {\n+      setTimeout(function () {\n+        this.draw(this.video, this.context, this.width,\n+            this.height)}.bind(this), 20);\n+    };\n+    this.context.drawImage(this.video, 0, 0, this.canvas.width,\n+        this.canvas.height);\n+  },\n+\n+  checkForBlackFrame: function(data, length, numBlackFrames) {","path":"samples/web/content/testrtc/js/camtest.js","position":null,"original_position":154,"commit_id":"54afcd5de776397bcfec39c967e4769d9d2beb83","original_commit_id":"4a5db26c5f3a8d1fc0c1daeb8d1c7cfbfcabb531","user":{"login":"KaptenJansson","id":5872605,"avatar_url":"https://avatars.githubusercontent.com/u/5872605?v=2","gravatar_id":"","url":"https://api.github.com/users/KaptenJansson","html_url":"https://github.com/KaptenJansson","followers_url":"https://api.github.com/users/KaptenJansson/followers","following_url":"https://api.github.com/users/KaptenJansson/following{/other_user}","gists_url":"https://api.github.com/users/KaptenJansson/gists{/gist_id}","starred_url":"https://api.github.com/users/KaptenJansson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KaptenJansson/subscriptions","organizations_url":"https://api.github.com/users/KaptenJansson/orgs","repos_url":"https://api.github.com/users/KaptenJansson/repos","events_url":"https://api.github.com/users/KaptenJansson/events{/privacy}","received_events_url":"https://api.github.com/users/KaptenJansson/received_events","type":"User","site_admin":false},"body":"Done!","created_at":"2014-10-08T12:01:57Z","updated_at":"2014-10-08T12:01:57Z","html_url":"https://github.com/GoogleChrome/webrtc/pull/129#discussion_r18577122","pull_request_url":"https://api.github.com/repos/GoogleChrome/webrtc/pulls/129","_links":{"self":{"href":"https://api.github.com/repos/GoogleChrome/webrtc/pulls/comments/18577122"},"html":{"href":"https://github.com/GoogleChrome/webrtc/pull/129#discussion_r18577122"},"pull_request":{"href":"https://api.github.com/repos/GoogleChrome/webrtc/pulls/129"}}},"pull_request":{"url":"https://api.github.com/repos/GoogleChrome/webrtc/pulls/129","id":22271371,"html_url":"https://github.com/GoogleChrome/webrtc/pull/129","diff_url":"https://github.com/GoogleChrome/webrtc/pull/129.diff","patch_url":"https://github.com/GoogleChrome/webrtc/pull/129.patch","issue_url":"https://api.github.com/repos/GoogleChrome/webrtc/issues/129","number":129,"state":"open","locked":false,"title":"Camera Open test","user":{"login":"KaptenJansson","id":5872605,"avatar_url":"https://avatars.githubusercontent.com/u/5872605?v=2","gravatar_id":"","url":"https://api.github.com/users/KaptenJansson","html_url":"https://github.com/KaptenJansson","followers_url":"https://api.github.com/users/KaptenJansson/followers","following_url":"https://api.github.com/users/KaptenJansson/following{/other_user}","gists_url":"https://api.github.com/users/KaptenJansson/gists{/gist_id}","starred_url":"https://api.github.com/users/KaptenJansson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KaptenJansson/subscriptions","organizations_url":"https://api.github.com/users/KaptenJansson/orgs","repos_url":"https://api.github.com/users/KaptenJansson/repos","events_url":"https://api.github.com/users/KaptenJansson/events{/privacy}","received_events_url":"https://api.github.com/users/KaptenJansson/received_events","type":"User","site_admin":false},"body":"Adds a base for the camera test.\r\nI've setup the basic canvas functions while mcasas@ did the pixel checking logic.\r\n\r\nThe pixel checking logic needs some tweaking as I've noticed it does not always detect near black pixels.\r\n\r\nMore is planned as noted in the TODO list in the top of the camtest.js file.\r\n\r\nCreating this pull request from a clean branch due to messing up the previous pull request in terms of commits etc.","created_at":"2014-10-06T08:59:40Z","updated_at":"2014-10-08T12:01:57Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ef97b84a545b7586ac5eae608614482bd71810ef","assignee":{"login":"juberti","id":1821693,"avatar_url":"https://avatars.githubusercontent.com/u/1821693?v=2","gravatar_id":"","url":"https://api.github.com/users/juberti","html_url":"https://github.com/juberti","followers_url":"https://api.github.com/users/juberti/followers","following_url":"https://api.github.com/users/juberti/following{/other_user}","gists_url":"https://api.github.com/users/juberti/gists{/gist_id}","starred_url":"https://api.github.com/users/juberti/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/juberti/subscriptions","organizations_url":"https://api.github.com/users/juberti/orgs","repos_url":"https://api.github.com/users/juberti/repos","events_url":"https://api.github.com/users/juberti/events{/privacy}","received_events_url":"https://api.github.com/users/juberti/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/GoogleChrome/webrtc/pulls/129/commits","review_comments_url":"https://api.github.com/repos/GoogleChrome/webrtc/pulls/129/comments","review_comment_url":"https://api.github.com/repos/GoogleChrome/webrtc/pulls/comments/{number}","comments_url":"https://api.github.com/repos/GoogleChrome/webrtc/issues/129/comments","statuses_url":"https://api.github.com/repos/GoogleChrome/webrtc/statuses/54afcd5de776397bcfec39c967e4769d9d2beb83","head":{"label":"GoogleChrome:cameratest","ref":"cameratest","sha":"54afcd5de776397bcfec39c967e4769d9d2beb83","user":{"login":"GoogleChrome","id":1778935,"avatar_url":"https://avatars.githubusercontent.com/u/1778935?v=2","gravatar_id":"","url":"https://api.github.com/users/GoogleChrome","html_url":"https://github.com/GoogleChrome","followers_url":"https://api.github.com/users/GoogleChrome/followers","following_url":"https://api.github.com/users/GoogleChrome/following{/other_user}","gists_url":"https://api.github.com/users/GoogleChrome/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleChrome/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleChrome/subscriptions","organizations_url":"https://api.github.com/users/GoogleChrome/orgs","repos_url":"https://api.github.com/users/GoogleChrome/repos","events_url":"https://api.github.com/users/GoogleChrome/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleChrome/received_events","type":"Organization","site_admin":false},"repo":{"id":12970971,"name":"webrtc","full_name":"GoogleChrome/webrtc","owner":{"login":"GoogleChrome","id":1778935,"avatar_url":"https://avatars.githubusercontent.com/u/1778935?v=2","gravatar_id":"","url":"https://api.github.com/users/GoogleChrome","html_url":"https://github.com/GoogleChrome","followers_url":"https://api.github.com/users/GoogleChrome/followers","following_url":"https://api.github.com/users/GoogleChrome/following{/other_user}","gists_url":"https://api.github.com/users/GoogleChrome/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleChrome/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleChrome/subscriptions","organizations_url":"https://api.github.com/users/GoogleChrome/orgs","repos_url":"https://api.github.com/users/GoogleChrome/repos","events_url":"https://api.github.com/users/GoogleChrome/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleChrome/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/GoogleChrome/webrtc","description":"WebRTC demos and samples","fork":false,"url":"https://api.github.com/repos/GoogleChrome/webrtc","forks_url":"https://api.github.com/repos/GoogleChrome/webrtc/forks","keys_url":"https://api.github.com/repos/GoogleChrome/webrtc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GoogleChrome/webrtc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GoogleChrome/webrtc/teams","hooks_url":"https://api.github.com/repos/GoogleChrome/webrtc/hooks","issue_events_url":"https://api.github.com/repos/GoogleChrome/webrtc/issues/events{/number}","events_url":"https://api.github.com/repos/GoogleChrome/webrtc/events","assignees_url":"https://api.github.com/repos/GoogleChrome/webrtc/assignees{/user}","branches_url":"https://api.github.com/repos/GoogleChrome/webrtc/branches{/branch}","tags_url":"https://api.github.com/repos/GoogleChrome/webrtc/tags","blobs_url":"https://api.github.com/repos/GoogleChrome/webrtc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GoogleChrome/webrtc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GoogleChrome/webrtc/git/refs{/sha}","trees_url":"https://api.github.com/repos/GoogleChrome/webrtc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GoogleChrome/webrtc/statuses/{sha}","languages_url":"https://api.github.com/repos/GoogleChrome/webrtc/languages","stargazers_url":"https://api.github.com/repos/GoogleChrome/webrtc/stargazers","contributors_url":"https://api.github.com/repos/GoogleChrome/webrtc/contributors","subscribers_url":"https://api.github.com/repos/GoogleChrome/webrtc/subscribers","subscription_url":"https://api.github.com/repos/GoogleChrome/webrtc/subscription","commits_url":"https://api.github.com/repos/GoogleChrome/webrtc/commits{/sha}","git_commits_url":"https://api.github.com/repos/GoogleChrome/webrtc/git/commits{/sha}","comments_url":"https://api.github.com/repos/GoogleChrome/webrtc/comments{/number}","issue_comment_url":"https://api.github.com/repos/GoogleChrome/webrtc/issues/comments/{number}","contents_url":"https://api.github.com/repos/GoogleChrome/webrtc/contents/{+path}","compare_url":"https://api.github.com/repos/GoogleChrome/webrtc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GoogleChrome/webrtc/merges","archive_url":"https://api.github.com/repos/GoogleChrome/webrtc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GoogleChrome/webrtc/downloads","issues_url":"https://api.github.com/repos/GoogleChrome/webrtc/issues{/number}","pulls_url":"https://api.github.com/repos/GoogleChrome/webrtc/pulls{/number}","milestones_url":"https://api.github.com/repos/GoogleChrome/webrtc/milestones{/number}","notifications_url":"https://api.github.com/repos/GoogleChrome/webrtc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GoogleChrome/webrtc/labels{/name}","releases_url":"https://api.github.com/repos/GoogleChrome/webrtc/releases{/id}","created_at":"2013-09-20T10:40:23Z","updated_at":"2014-10-08T08:31:35Z","pushed_at":"2014-10-08T12:00:43Z","git_url":"git://github.com/GoogleChrome/webrtc.git","ssh_url":"git@github.com:GoogleChrome/webrtc.git","clone_url":"https://github.com/GoogleChrome/webrtc.git","svn_url":"https://github.com/GoogleChrome/webrtc","homepage":"http://googlechrome.github.io/webrtc/","size":7230,"stargazers_count":369,"watchers_count":369,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":194,"mirror_url":null,"open_issues_count":36,"forks":194,"open_issues":36,"watchers":369,"default_branch":"master"}},"base":{"label":"GoogleChrome:master","ref":"master","sha":"948683ad87d4e10439ff069a8b351f4fa20a3930","user":{"login":"GoogleChrome","id":1778935,"avatar_url":"https://avatars.githubusercontent.com/u/1778935?v=2","gravatar_id":"","url":"https://api.github.com/users/GoogleChrome","html_url":"https://github.com/GoogleChrome","followers_url":"https://api.github.com/users/GoogleChrome/followers","following_url":"https://api.github.com/users/GoogleChrome/following{/other_user}","gists_url":"https://api.github.com/users/GoogleChrome/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleChrome/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleChrome/subscriptions","organizations_url":"https://api.github.com/users/GoogleChrome/orgs","repos_url":"https://api.github.com/users/GoogleChrome/repos","events_url":"https://api.github.com/users/GoogleChrome/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleChrome/received_events","type":"Organization","site_admin":false},"repo":{"id":12970971,"name":"webrtc","full_name":"GoogleChrome/webrtc","owner":{"login":"GoogleChrome","id":1778935,"avatar_url":"https://avatars.githubusercontent.com/u/1778935?v=2","gravatar_id":"","url":"https://api.github.com/users/GoogleChrome","html_url":"https://github.com/GoogleChrome","followers_url":"https://api.github.com/users/GoogleChrome/followers","following_url":"https://api.github.com/users/GoogleChrome/following{/other_user}","gists_url":"https://api.github.com/users/GoogleChrome/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleChrome/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleChrome/subscriptions","organizations_url":"https://api.github.com/users/GoogleChrome/orgs","repos_url":"https://api.github.com/users/GoogleChrome/repos","events_url":"https://api.github.com/users/GoogleChrome/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleChrome/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/GoogleChrome/webrtc","description":"WebRTC demos and samples","fork":false,"url":"https://api.github.com/repos/GoogleChrome/webrtc","forks_url":"https://api.github.com/repos/GoogleChrome/webrtc/forks","keys_url":"https://api.github.com/repos/GoogleChrome/webrtc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GoogleChrome/webrtc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GoogleChrome/webrtc/teams","hooks_url":"https://api.github.com/repos/GoogleChrome/webrtc/hooks","issue_events_url":"https://api.github.com/repos/GoogleChrome/webrtc/issues/events{/number}","events_url":"https://api.github.com/repos/GoogleChrome/webrtc/events","assignees_url":"https://api.github.com/repos/GoogleChrome/webrtc/assignees{/user}","branches_url":"https://api.github.com/repos/GoogleChrome/webrtc/branches{/branch}","tags_url":"https://api.github.com/repos/GoogleChrome/webrtc/tags","blobs_url":"https://api.github.com/repos/GoogleChrome/webrtc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GoogleChrome/webrtc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GoogleChrome/webrtc/git/refs{/sha}","trees_url":"https://api.github.com/repos/GoogleChrome/webrtc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GoogleChrome/webrtc/statuses/{sha}","languages_url":"https://api.github.com/repos/GoogleChrome/webrtc/languages","stargazers_url":"https://api.github.com/repos/GoogleChrome/webrtc/stargazers","contributors_url":"https://api.github.com/repos/GoogleChrome/webrtc/contributors","subscribers_url":"https://api.github.com/repos/GoogleChrome/webrtc/subscribers","subscription_url":"https://api.github.com/repos/GoogleChrome/webrtc/subscription","commits_url":"https://api.github.com/repos/GoogleChrome/webrtc/commits{/sha}","git_commits_url":"https://api.github.com/repos/GoogleChrome/webrtc/git/commits{/sha}","comments_url":"https://api.github.com/repos/GoogleChrome/webrtc/comments{/number}","issue_comment_url":"https://api.github.com/repos/GoogleChrome/webrtc/issues/comments/{number}","contents_url":"https://api.github.com/repos/GoogleChrome/webrtc/contents/{+path}","compare_url":"https://api.github.com/repos/GoogleChrome/webrtc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GoogleChrome/webrtc/merges","archive_url":"https://api.github.com/repos/GoogleChrome/webrtc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GoogleChrome/webrtc/downloads","issues_url":"https://api.github.com/repos/GoogleChrome/webrtc/issues{/number}","pulls_url":"https://api.github.com/repos/GoogleChrome/webrtc/pulls{/number}","milestones_url":"https://api.github.com/repos/GoogleChrome/webrtc/milestones{/number}","notifications_url":"https://api.github.com/repos/GoogleChrome/webrtc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GoogleChrome/webrtc/labels{/name}","releases_url":"https://api.github.com/repos/GoogleChrome/webrtc/releases{/id}","created_at":"2013-09-20T10:40:23Z","updated_at":"2014-10-08T08:31:35Z","pushed_at":"2014-10-08T12:00:43Z","git_url":"git://github.com/GoogleChrome/webrtc.git","ssh_url":"git@github.com:GoogleChrome/webrtc.git","clone_url":"https://github.com/GoogleChrome/webrtc.git","svn_url":"https://github.com/GoogleChrome/webrtc","homepage":"http://googlechrome.github.io/webrtc/","size":7230,"stargazers_count":369,"watchers_count":369,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":194,"mirror_url":null,"open_issues_count":36,"forks":194,"open_issues":36,"watchers":369,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/GoogleChrome/webrtc/pulls/129"},"html":{"href":"https://github.com/GoogleChrome/webrtc/pull/129"},"issue":{"href":"https://api.github.com/repos/GoogleChrome/webrtc/issues/129"},"comments":{"href":"https://api.github.com/repos/GoogleChrome/webrtc/issues/129/comments"},"review_comments":{"href":"https://api.github.com/repos/GoogleChrome/webrtc/pulls/129/comments"},"review_comment":{"href":"https://api.github.com/repos/GoogleChrome/webrtc/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/GoogleChrome/webrtc/pulls/129/commits"},"statuses":{"href":"https://api.github.com/repos/GoogleChrome/webrtc/statuses/54afcd5de776397bcfec39c967e4769d9d2beb83"}}}}