├── .github └── workflows │ ├── go.yml │ └── lint.yml ├── .gitignore ├── .golangci.yml ├── .goreleaser.yml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── README.md ├── docker-compose.yml ├── generate.sh ├── go.mod ├── go.sum ├── main.go └── webrtc_rtclog ├── rtc_event_log.pb.go └── rtc_event_log.proto /.github/workflows/go.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | tags: 8 | - 'v*.*.*' 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | name: webrtc-log-parser 14 | steps: 15 | 16 | - name: Set up Go 17 | uses: actions/setup-go@v2 18 | with: 19 | go-version: 1.14 20 | id: go 21 | 22 | - name: Check out code into the Go module directory 23 | uses: actions/checkout@v2 24 | 25 | - name: Get dependencies 26 | run: | 27 | go mod download 28 | 29 | - name: GoReleaser 30 | uses: goreleaser/goreleaser-action@master 31 | with: 32 | args: release 33 | env: 34 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 35 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: Linters 2 | 3 | on: pull_request 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | name: golangci-lint 9 | steps: 10 | 11 | - name: Check out code into the Go module directory 12 | uses: actions/checkout@v2 13 | 14 | - name: Run linter 15 | uses: actions-contrib/golangci-lint@v1 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | 3 | *.test 4 | 5 | vendor/ 6 | 7 | .env* 8 | 9 | bin/ 10 | .idea 11 | 12 | /gohack 13 | -------------------------------------------------------------------------------- /.golangci.yml: -------------------------------------------------------------------------------- 1 | run: 2 | # timeout for analysis, e.g. 30s, 5m, default is 1m 3 | deadline: 1m 4 | 5 | # include test files or not, default is true 6 | tests: true 7 | 8 | # by default isn't set. If set we pass it to "go list -mod={option}". From "go help modules": 9 | # If invoked with -mod=readonly, the go command is disallowed from the implicit 10 | # automatic updating of go.mod described above. Instead, it fails when any changes 11 | # to go.mod are needed. This setting is most useful to check that go.mod does 12 | # not need updates, such as in a continuous integration and testing system. 13 | # If invoked with -mod=vendor, the go command assumes that the vendor 14 | # directory holds the correct copies of dependencies and ignores 15 | # the dependency descriptions in go.mod. 16 | # modules-download-mode: readonly 17 | 18 | # https://github.com/golangci/golangci-lint#enabled-by-default-linters 19 | linters: 20 | enable: 21 | - deadcode 22 | - errcheck 23 | - goconst 24 | - goimports 25 | - golint 26 | - gosec 27 | - govet 28 | - ineffassign 29 | - prealloc 30 | - scopelint 31 | - staticcheck 32 | - structcheck 33 | - typecheck 34 | - unparam 35 | - varcheck 36 | enable-all: false 37 | 38 | # all available settings of specific linters 39 | linters-settings: 40 | govet: 41 | # report about shadowed variables 42 | check-shadowing: true 43 | 44 | issues: 45 | # List of regexps of issue texts to exclude, empty list by default. 46 | # But independently from this option we use default exclude patterns, 47 | # it can be disabled by `exclude-use-default: false`. To list all 48 | # excluded by default patterns execute `golangci-lint run --help` 49 | exclude: 50 | - "declaration of \"err\" shadows declaration at" 51 | # proto generated files contain underscore names 52 | - "don't use underscores in Go names; type Event_ExtendedRtcpPacket should be EventExtendedRtcpPacket" 53 | # needed because we're using znly/protoc docker image 54 | - "package github.com/golang/protobuf/proto is deprecated" 55 | 56 | # Maximum issues count per one linter. Set to 0 to disable. Default is 50. 57 | max-per-linter: 0 58 | 59 | # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. 60 | max-same-issues: 0 61 | -------------------------------------------------------------------------------- /.goreleaser.yml: -------------------------------------------------------------------------------- 1 | archives: 2 | - replacements: 3 | darwin: Darwin 4 | linux: Linux 5 | windows: Windows 6 | 386: i386 7 | amd64: x86_64 8 | 9 | checksum: 10 | name_template: 'checksums.txt' 11 | 12 | snapshot: 13 | name_template: "{{ .Tag }}-next" 14 | 15 | changelog: 16 | sort: asc 17 | filters: 18 | exclude: 19 | - '^docs:' 20 | - '^test:' 21 | 22 | builds: 23 | - binary: webrtc-log-parser 24 | id: chrome-webrtc-packet-log-parser 25 | goos: 26 | - darwin 27 | - windows 28 | - linux 29 | - freebsd 30 | goarch: 31 | - amd64 32 | - 386 33 | env: 34 | - CGO_ENABLED=0 35 | flags: 36 | - -mod=readonly -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Release Notes 2 | 3 | ## v0.0.3 / 2020-05-27 4 | - Update README.md 5 | - Update CHANGELOG.md 6 | 7 | ## v0.0.2 / 2020-05-25 8 | - Add github ci and goreleaser to be able to build binaries 9 | - Add CONTRIBUTING.md 10 | - Add CHANGELOG.md 11 | - Add .golangci.yml 12 | 13 | ## v0.0.1 / 2020-05-18 14 | - Publish first working parser -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Contributions are welcome in the form of merge requests/issues. Please alway run `go mod tidy` before submitting a merge request. -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM znly/protoc 2 | 3 | ENV GOMPLATE_VERSION=2.6.0 4 | 5 | RUN apk add --no-cache wget ca-certificates bash 6 | 7 | ADD generate.sh . 8 | 9 | RUN chmod +x generate.sh 10 | 11 | VOLUME /tmp/proto 12 | 13 | # Remove entrypoint set in parent container 14 | ENTRYPOINT [] 15 | 16 | CMD ["./generate.sh"] 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Linters](https://github.com/proemergotech/chrome-webrtc-packet-log-parser/workflows/Linters/badge.svg) 2 | 3 | # chrome-webrtc-packet-log-parser 4 | 5 | ### Project status 6 | 7 | At this point the project is primerly intended to be used by checking it out and modifying main.go, however you can also use it by downloading the binaries from releases. 8 | 9 | ### Overview 10 | Go command-line application to make chrome generated webrtc `diagnostic packet and event recording` human readable. 11 | For more information see [here](https://tokbox.com/blog/how-to-get-a-webrtc-diagnostic-recording-from-chrome-49/). 12 | 13 | 14 | To regenerate proto files, call `docker-compose up` in this directory. 15 | 16 | ### How to execute 17 | `go run main.go ` 18 | 19 | Example output: 20 | ```bash 21 | $ go run main.go webrtc_event_log_20200514_1817_191_3.log 22 | webrtc_event_log_20200514_1817_191_3.log opened 23 | 0: null 24 | 1: {"AudioReceiverConfig":{"remote_ssrc":1063824803,"local_ssrc":4195875351}} 25 | 2: {"VideoReceiverConfig":{"remote_ssrc":1721891724,"local_ssrc":1,"rtcp_mode":2,"remb":false,"rtx_map":[{"payload_type":96,"config":{"rtx_ssrc":574331814,"rtx_payload_type":97}},{"payload_type":98,"config":{"rtx_ssrc":574331814,"rtx_payload_type":99}},{"payload_type":100,"config":{"rtx_ssrc":574331814,"rtx_payload_type":101}},{"payload_type":102,"config":{"rtx_ssrc":574331814,"rtx_payload_type":103}},{"payload_type":104,"config":{"rtx_ssrc":574331814,"rtx_payload_type":105}},{"payload_type":106,"config":{"rtx_ssrc":574331814,"rtx_payload_type":107}},{"payload_type":108,"config":{"rtx_ssrc":574331814,"rtx_payload_type":109}}],"decoders":[{"name":"VP8","payload_type":96},{"name":"VP9","payload_type":98},{"name":"VP9","payload_type":100},{"name":"H264","payload_type":102},{"name":"H264","payload_type":104},{"name":"H264","payload_type":106},{"name":"H264","payload_type":108}]}} 26 | 3: {"AudioReceiverConfig":{"remote_ssrc":1063824803,"local_ssrc":4195875351,"header_extensions":[{"name":"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01","id":3},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time","id":2},{"name":"urn:ietf:params:rtp-hdrext:sdes:mid","id":4},{"name":"urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id","id":6},{"name":"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id","id":5},{"name":"urn:ietf:params:rtp-hdrext:ssrc-audio-level","id":1}]}} 27 | 4: {"AudioSenderConfig":{"ssrc":2997831384,"header_extensions":[{"name":"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01","id":3},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time","id":2},{"name":"urn:ietf:params:rtp-hdrext:sdes:mid","id":4},{"name":"urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id","id":6},{"name":"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id","id":5},{"name":"urn:ietf:params:rtp-hdrext:ssrc-audio-level","id":1}]}} 28 | 5: {"AudioReceiverConfig":{"remote_ssrc":1063824803,"local_ssrc":2997831384,"header_extensions":[{"name":"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01","id":3},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time","id":2},{"name":"urn:ietf:params:rtp-hdrext:sdes:mid","id":4},{"name":"urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id","id":6},{"name":"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id","id":5},{"name":"urn:ietf:params:rtp-hdrext:ssrc-audio-level","id":1}]}} 29 | 6: {"VideoReceiverConfig":{"remote_ssrc":1721891724,"local_ssrc":1,"rtcp_mode":2,"remb":false,"rtx_map":[{"payload_type":98,"config":{"rtx_ssrc":574331814,"rtx_payload_type":99}},{"payload_type":100,"config":{"rtx_ssrc":574331814,"rtx_payload_type":101}},{"payload_type":96,"config":{"rtx_ssrc":574331814,"rtx_payload_type":97}},{"payload_type":102,"config":{"rtx_ssrc":574331814,"rtx_payload_type":122}},{"payload_type":127,"config":{"rtx_ssrc":574331814,"rtx_payload_type":121}},{"payload_type":125,"config":{"rtx_ssrc":574331814,"rtx_payload_type":107}},{"payload_type":108,"config":{"rtx_ssrc":574331814,"rtx_payload_type":109}}],"header_extensions":[{"name":"http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07","id":8},{"name":"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01","id":3},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time","id":2},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/color-space","id":9},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/playout-delay","id":12},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/video-content-type","id":11},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/video-timing","id":7},{"name":"urn:3gpp:video-orientation","id":13},{"name":"urn:ietf:params:rtp-hdrext:sdes:mid","id":4},{"name":"urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id","id":6},{"name":"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id","id":5},{"name":"urn:ietf:params:rtp-hdrext:toffset","id":14}],"decoders":[{"name":"VP9","payload_type":98},{"name":"VP9","payload_type":100},{"name":"VP8","payload_type":96},{"name":"H264","payload_type":102},{"name":"H264","payload_type":127},{"name":"H264","payload_type":125},{"name":"H264","payload_type":108}]}} 30 | 7: {"VideoSenderConfig":{"ssrcs":[3527308836],"header_extensions":[{"name":"http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07","id":8},{"name":"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01","id":3},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time","id":2},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/color-space","id":9},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/playout-delay","id":12},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/video-content-type","id":11},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/video-timing","id":7},{"name":"urn:3gpp:video-orientation","id":13},{"name":"urn:ietf:params:rtp-hdrext:sdes:mid","id":4},{"name":"urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id","id":6},{"name":"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id","id":5}],"rtx_ssrcs":[657777563],"rtx_payload_type":99,"encoder":{"name":"VP9","payload_type":98}}} 31 | 8: {"VideoReceiverConfig":{"remote_ssrc":1721891724,"local_ssrc":3527308836,"rtcp_mode":2,"remb":false,"rtx_map":[{"payload_type":98,"config":{"rtx_ssrc":574331814,"rtx_payload_type":99}},{"payload_type":100,"config":{"rtx_ssrc":574331814,"rtx_payload_type":101}},{"payload_type":96,"config":{"rtx_ssrc":574331814,"rtx_payload_type":97}},{"payload_type":102,"config":{"rtx_ssrc":574331814,"rtx_payload_type":122}},{"payload_type":127,"config":{"rtx_ssrc":574331814,"rtx_payload_type":121}},{"payload_type":125,"config":{"rtx_ssrc":574331814,"rtx_payload_type":107}},{"payload_type":108,"config":{"rtx_ssrc":574331814,"rtx_payload_type":109}}],"header_extensions":[{"name":"http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07","id":8},{"name":"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01","id":3},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time","id":2},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/color-space","id":9},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/playout-delay","id":12},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/video-content-type","id":11},{"name":"http://www.webrtc.org/experiments/rtp-hdrext/video-timing","id":7},{"name":"urn:3gpp:video-orientation","id":13},{"name":"urn:ietf:params:rtp-hdrext:sdes:mid","id":4},{"name":"urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id","id":6},{"name":"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id","id":5},{"name":"urn:ietf:params:rtp-hdrext:toffset","id":14}],"decoders":[{"name":"VP9","payload_type":98},{"name":"VP9","payload_type":100},{"name":"VP8","payload_type":96},{"name":"H264","payload_type":102},{"name":"H264","payload_type":127},{"name":"H264","payload_type":125},{"name":"H264","payload_type":108}]}} 32 | 9: {"AudioPlayoutEvent":{"local_ssrc":1063824803}} 33 | 10: {"IceCandidatePairConfig":{"config_type":0,"candidate_pair_id":110362309,"local_candidate_type":0,"local_relay_protocol":4,"local_network_type":0,"local_address_family":0,"remote_candidate_type":0,"remote_address_family":0,"candidate_pair_protocol":0}} 34 | 11: {"IceCandidatePairConfig":{"config_type":0,"candidate_pair_id":3617290008,"local_candidate_type":0,"local_relay_protocol":4,"local_network_type":0,"local_address_family":0,"remote_candidate_type":0,"remote_address_family":0,"candidate_pair_protocol":0}} 35 | 12: {"IceCandidatePairConfig":{"config_type":0,"candidate_pair_id":527797281,"local_candidate_type":0,"local_relay_protocol":4,"local_network_type":0,"local_address_family":0,"remote_candidate_type":0,"remote_address_family":0,"candidate_pair_protocol":0}} 36 | 37 | ... 38 | 39 | 38765: {"AudioPlayoutEvent":{"local_ssrc":1063824803}} 40 | 38766: {"RtpPacket":{"incoming":false,"packet_length":79,"header":"kG9iZR5IWCmyr0bYvt4AAiLAm6ZAMBDR"}} 41 | 38767: {"AudioPlayoutEvent":{"local_ssrc":1063824803}} 42 | 38768: {"LossBasedBweUpdate":{"bitrate_bps":5687408,"fraction_loss":0,"total_packets":0}} 43 | 38769: {"RtpPacket":{"incoming":false,"packet_length":1081,"header":"kHw0xU4p977SPnYkvt4AAiLApeMxNGUA"}} 44 | 38770: {"RtpPacket":{"incoming":false,"packet_length":1081,"header":"kHw0xk4p977SPnYkvt4AAiLApeMxNGYA"}} 45 | 38771: {"RtpPacket":{"incoming":false,"packet_length":1081,"header":"kHw0x04p977SPnYkvt4AAiLApeMxNGcA"}} 46 | 38772: {"RtpPacket":{"incoming":false,"packet_length":1081,"header":"kHw0yE4p977SPnYkvt4AAiLApeMxNGgA"}} 47 | 38773: {"AudioPlayoutEvent":{"local_ssrc":1063824803}} 48 | 38774: {"RtpPacket":{"incoming":false,"packet_length":1081,"header":"kHw0yU4p977SPnYkvt4AAiLAqwIxNGkA"}} 49 | 38775: {"RtpPacket":{"incoming":false,"packet_length":1081,"header":"kHw0yk4p977SPnYkvt4AAiLAqwIxNGoA"}} 50 | 38776: {"RtpPacket":{"incoming":false,"packet_length":1081,"header":"kHw0y04p977SPnYkvt4AAiLAqwIxNGsA"}} 51 | 38777: {"RtpPacket":{"incoming":false,"packet_length":1082,"header":"kHw0zE4p977SPnYkvt4AAiLAqwIxNGwA"}} 52 | ``` 53 | 54 | ### License 55 | 56 | [MIT](LICENSE) -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.0" 2 | 3 | services: 4 | generate: 5 | build: . 6 | volumes: 7 | - ./webrtc_rtclog:/tmp/proto 8 | -------------------------------------------------------------------------------- /generate.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | rm -f /tmp/proto/rtc_event_log* 6 | 7 | wget -q -O - https://chromium.googlesource.com/external/webrtc/+/refs/heads/master/logging/rtc_event_log/rtc_event_log.proto?format=TEXT | base64 -d > /tmp/proto/rtc_event_log.proto 8 | 9 | cd /tmp/proto && protoc --proto_path=/tmp/proto --go_out=plugins=unmarshaler_all:. /tmp/proto/rtc_event_log.proto 10 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/proemergotech/chrome-webrtc-packet-log-parser 2 | 3 | go 1.14 4 | 5 | require ( 6 | github.com/golang/protobuf v1.4.0 7 | github.com/pion/rtcp v1.2.2-0.20200519064703-3d3fdf29276f 8 | github.com/pion/rtp v1.5.3 9 | ) 10 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 2 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 3 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 4 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 5 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 6 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 7 | github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ= 8 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 9 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 10 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 11 | github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= 12 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 13 | github.com/pion/rtcp v1.2.2-0.20200519064703-3d3fdf29276f h1:DlPoWPYVjMova1iE1KF7mB8itFAgpNJLKu59jYeqXzU= 14 | github.com/pion/rtcp v1.2.2-0.20200519064703-3d3fdf29276f/go.mod h1:zGhIv0RPRF0Z1Wiij22pUt5W/c9fevqSzT4jje/oK7I= 15 | github.com/pion/rtp v1.5.3 h1:5OPyxyTa1zclKP6mOaQFuxbslGEekIdnqGu9iR2Hvg4= 16 | github.com/pion/rtp v1.5.3/go.mod h1:bg60AL5GotNOlYZsqycbhDtEV3TkfbpXG0KBiUq29Mg= 17 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 18 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 19 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 20 | github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= 21 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= 22 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 23 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 24 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 25 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 26 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 27 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 28 | google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw= 29 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 30 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 31 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 32 | gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= 33 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 34 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "fmt" 6 | "io/ioutil" 7 | "log" 8 | "os" 9 | "reflect" 10 | 11 | "github.com/golang/protobuf/proto" 12 | pionRtcp "github.com/pion/rtcp" 13 | pionRtp "github.com/pion/rtp" 14 | 15 | "github.com/proemergotech/chrome-webrtc-packet-log-parser/webrtc_rtclog" 16 | ) 17 | 18 | type ExtendedPacket struct { 19 | pionRtcp.Packet 20 | Type string 21 | } 22 | type ExtendedRtpPacket struct { 23 | pionRtp.Packet 24 | Type string `json:"type"` 25 | Error string `json:"error,omitempty"` 26 | } 27 | 28 | type ExtendedRtcpPacket struct { 29 | *webrtc_rtclog.RtcpPacket 30 | Packets []ExtendedPacket `json:"packets"` 31 | Error string `json:"error,omitempty"` 32 | } 33 | 34 | type Event_ExtendedRtcpPacket struct { 35 | RtcpPacket *ExtendedRtcpPacket 36 | } 37 | 38 | func main() { 39 | args := os.Args[1:] 40 | path := args[0] 41 | 42 | file, err := os.Open(path) 43 | if err != nil { 44 | log.Fatal("error while opening file", err) 45 | } 46 | defer file.Close() 47 | fmt.Printf("%s opened\n", path) 48 | 49 | content, err := ioutil.ReadAll(file) 50 | if err != nil { 51 | log.Fatal("error while opening file", err) 52 | } 53 | 54 | eventStream := &webrtc_rtclog.EventStream{} 55 | target := reflect.New(reflect.TypeOf(eventStream).Elem()).Interface().(proto.Message) 56 | err = proto.Unmarshal(content, target) 57 | if err != nil { 58 | log.Fatal("error decoding response", err) 59 | } 60 | 61 | eventStream = target.(*webrtc_rtclog.EventStream) 62 | 63 | for i, event := range eventStream.Stream { 64 | if event != nil && event.Type != nil { 65 | switch *event.Type { 66 | case webrtc_rtclog.Event_RTCP_EVENT: 67 | rtcpPacket := event.GetRtcpPacket() 68 | if rtcpPacket == nil { 69 | continue 70 | } 71 | 72 | var unmarshalError string 73 | packets, err := pionRtcp.Unmarshal(rtcpPacket.PacketData) 74 | if err != nil { 75 | unmarshalError = err.Error() 76 | } 77 | 78 | extendedPackets := make([]ExtendedPacket, 0, len(packets)) 79 | for _, packet := range packets { 80 | extendedPackets = append(extendedPackets, ExtendedPacket{ 81 | Packet: packet, 82 | Type: reflect.ValueOf(packet).Type().String(), 83 | }) 84 | } 85 | 86 | extendedEventSubtype := Event_ExtendedRtcpPacket{ 87 | RtcpPacket: &ExtendedRtcpPacket{ 88 | RtcpPacket: rtcpPacket, 89 | Packets: extendedPackets, 90 | Error: unmarshalError, 91 | }, 92 | } 93 | 94 | b, err := json.Marshal(extendedEventSubtype) 95 | if err != nil { 96 | log.Fatal("error while marshaling event", err) 97 | return 98 | } 99 | fmt.Printf("%d: %s\n", i, string(b)) 100 | case webrtc_rtclog.Event_RTP_EVENT: 101 | rtpPacket := event.GetRtpPacket() 102 | if rtpPacket == nil { 103 | continue 104 | } 105 | 106 | extendedRtpPacket := ExtendedRtpPacket{ 107 | Type: webrtc_rtclog.MediaType_name[int32(rtpPacket.GetType())], 108 | Packet: pionRtp.Packet{ 109 | Header: pionRtp.Header{}, 110 | Payload: rtpPacket.XXX_unrecognized, 111 | }, 112 | } 113 | err := extendedRtpPacket.Header.Unmarshal(rtpPacket.Header) 114 | if err != nil { 115 | extendedRtpPacket.Error = err.Error() 116 | } 117 | 118 | b, err := json.Marshal(extendedRtpPacket) 119 | if err != nil { 120 | log.Fatal("error while marshaling event", err) 121 | } 122 | fmt.Printf("%d: %s\n", i, string(b)) 123 | default: 124 | b, err := json.Marshal(event.Subtype) 125 | if err != nil { 126 | log.Fatal("error while marshaling event", err) 127 | } 128 | fmt.Printf("%d: %s\n", i, string(b)) 129 | } 130 | } 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /webrtc_rtclog/rtc_event_log.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // source: rtc_event_log.proto 3 | 4 | /* 5 | Package webrtc_rtclog is a generated protocol buffer package. 6 | 7 | It is generated from these files: 8 | rtc_event_log.proto 9 | 10 | It has these top-level messages: 11 | EventStream 12 | Event 13 | RtpPacket 14 | RtcpPacket 15 | AudioPlayoutEvent 16 | LossBasedBweUpdate 17 | DelayBasedBweUpdate 18 | VideoReceiveConfig 19 | DecoderConfig 20 | RtpHeaderExtension 21 | RtxConfig 22 | RtxMap 23 | VideoSendConfig 24 | EncoderConfig 25 | AudioReceiveConfig 26 | AudioSendConfig 27 | AudioNetworkAdaptation 28 | BweProbeCluster 29 | BweProbeResult 30 | AlrState 31 | IceCandidatePairConfig 32 | IceCandidatePairEvent 33 | */ 34 | package webrtc_rtclog 35 | 36 | import proto "github.com/golang/protobuf/proto" 37 | import fmt "fmt" 38 | import math "math" 39 | 40 | // Reference imports to suppress errors if they are not otherwise used. 41 | var _ = proto.Marshal 42 | var _ = fmt.Errorf 43 | var _ = math.Inf 44 | 45 | // This is a compile-time assertion to ensure that this generated file 46 | // is compatible with the proto package it is being compiled against. 47 | // A compilation error at this line likely means your copy of the 48 | // proto package needs to be updated. 49 | const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package 50 | 51 | type MediaType int32 52 | 53 | const ( 54 | MediaType_ANY MediaType = 0 55 | MediaType_AUDIO MediaType = 1 56 | MediaType_VIDEO MediaType = 2 57 | MediaType_DATA MediaType = 3 58 | ) 59 | 60 | var MediaType_name = map[int32]string{ 61 | 0: "ANY", 62 | 1: "AUDIO", 63 | 2: "VIDEO", 64 | 3: "DATA", 65 | } 66 | var MediaType_value = map[string]int32{ 67 | "ANY": 0, 68 | "AUDIO": 1, 69 | "VIDEO": 2, 70 | "DATA": 3, 71 | } 72 | 73 | func (x MediaType) Enum() *MediaType { 74 | p := new(MediaType) 75 | *p = x 76 | return p 77 | } 78 | func (x MediaType) String() string { 79 | return proto.EnumName(MediaType_name, int32(x)) 80 | } 81 | func (x *MediaType) UnmarshalJSON(data []byte) error { 82 | value, err := proto.UnmarshalJSONEnum(MediaType_value, data, "MediaType") 83 | if err != nil { 84 | return err 85 | } 86 | *x = MediaType(value) 87 | return nil 88 | } 89 | func (MediaType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } 90 | 91 | // The different types of events that can occur, the UNKNOWN_EVENT entry 92 | // is added in case future EventTypes are added, in that case old code will 93 | // receive the new events as UNKNOWN_EVENT. 94 | type Event_EventType int32 95 | 96 | const ( 97 | Event_UNKNOWN_EVENT Event_EventType = 0 98 | Event_LOG_START Event_EventType = 1 99 | Event_LOG_END Event_EventType = 2 100 | Event_RTP_EVENT Event_EventType = 3 101 | Event_RTCP_EVENT Event_EventType = 4 102 | Event_AUDIO_PLAYOUT_EVENT Event_EventType = 5 103 | Event_LOSS_BASED_BWE_UPDATE Event_EventType = 6 104 | Event_DELAY_BASED_BWE_UPDATE Event_EventType = 7 105 | Event_VIDEO_RECEIVER_CONFIG_EVENT Event_EventType = 8 106 | Event_VIDEO_SENDER_CONFIG_EVENT Event_EventType = 9 107 | Event_AUDIO_RECEIVER_CONFIG_EVENT Event_EventType = 10 108 | Event_AUDIO_SENDER_CONFIG_EVENT Event_EventType = 11 109 | Event_AUDIO_NETWORK_ADAPTATION_EVENT Event_EventType = 16 110 | Event_BWE_PROBE_CLUSTER_CREATED_EVENT Event_EventType = 17 111 | Event_BWE_PROBE_RESULT_EVENT Event_EventType = 18 112 | Event_ALR_STATE_EVENT Event_EventType = 19 113 | Event_ICE_CANDIDATE_PAIR_CONFIG Event_EventType = 20 114 | Event_ICE_CANDIDATE_PAIR_EVENT Event_EventType = 21 115 | ) 116 | 117 | var Event_EventType_name = map[int32]string{ 118 | 0: "UNKNOWN_EVENT", 119 | 1: "LOG_START", 120 | 2: "LOG_END", 121 | 3: "RTP_EVENT", 122 | 4: "RTCP_EVENT", 123 | 5: "AUDIO_PLAYOUT_EVENT", 124 | 6: "LOSS_BASED_BWE_UPDATE", 125 | 7: "DELAY_BASED_BWE_UPDATE", 126 | 8: "VIDEO_RECEIVER_CONFIG_EVENT", 127 | 9: "VIDEO_SENDER_CONFIG_EVENT", 128 | 10: "AUDIO_RECEIVER_CONFIG_EVENT", 129 | 11: "AUDIO_SENDER_CONFIG_EVENT", 130 | 16: "AUDIO_NETWORK_ADAPTATION_EVENT", 131 | 17: "BWE_PROBE_CLUSTER_CREATED_EVENT", 132 | 18: "BWE_PROBE_RESULT_EVENT", 133 | 19: "ALR_STATE_EVENT", 134 | 20: "ICE_CANDIDATE_PAIR_CONFIG", 135 | 21: "ICE_CANDIDATE_PAIR_EVENT", 136 | } 137 | var Event_EventType_value = map[string]int32{ 138 | "UNKNOWN_EVENT": 0, 139 | "LOG_START": 1, 140 | "LOG_END": 2, 141 | "RTP_EVENT": 3, 142 | "RTCP_EVENT": 4, 143 | "AUDIO_PLAYOUT_EVENT": 5, 144 | "LOSS_BASED_BWE_UPDATE": 6, 145 | "DELAY_BASED_BWE_UPDATE": 7, 146 | "VIDEO_RECEIVER_CONFIG_EVENT": 8, 147 | "VIDEO_SENDER_CONFIG_EVENT": 9, 148 | "AUDIO_RECEIVER_CONFIG_EVENT": 10, 149 | "AUDIO_SENDER_CONFIG_EVENT": 11, 150 | "AUDIO_NETWORK_ADAPTATION_EVENT": 16, 151 | "BWE_PROBE_CLUSTER_CREATED_EVENT": 17, 152 | "BWE_PROBE_RESULT_EVENT": 18, 153 | "ALR_STATE_EVENT": 19, 154 | "ICE_CANDIDATE_PAIR_CONFIG": 20, 155 | "ICE_CANDIDATE_PAIR_EVENT": 21, 156 | } 157 | 158 | func (x Event_EventType) Enum() *Event_EventType { 159 | p := new(Event_EventType) 160 | *p = x 161 | return p 162 | } 163 | func (x Event_EventType) String() string { 164 | return proto.EnumName(Event_EventType_name, int32(x)) 165 | } 166 | func (x *Event_EventType) UnmarshalJSON(data []byte) error { 167 | value, err := proto.UnmarshalJSONEnum(Event_EventType_value, data, "Event_EventType") 168 | if err != nil { 169 | return err 170 | } 171 | *x = Event_EventType(value) 172 | return nil 173 | } 174 | func (Event_EventType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1, 0} } 175 | 176 | type DelayBasedBweUpdate_DetectorState int32 177 | 178 | const ( 179 | DelayBasedBweUpdate_BWE_NORMAL DelayBasedBweUpdate_DetectorState = 0 180 | DelayBasedBweUpdate_BWE_UNDERUSING DelayBasedBweUpdate_DetectorState = 1 181 | DelayBasedBweUpdate_BWE_OVERUSING DelayBasedBweUpdate_DetectorState = 2 182 | ) 183 | 184 | var DelayBasedBweUpdate_DetectorState_name = map[int32]string{ 185 | 0: "BWE_NORMAL", 186 | 1: "BWE_UNDERUSING", 187 | 2: "BWE_OVERUSING", 188 | } 189 | var DelayBasedBweUpdate_DetectorState_value = map[string]int32{ 190 | "BWE_NORMAL": 0, 191 | "BWE_UNDERUSING": 1, 192 | "BWE_OVERUSING": 2, 193 | } 194 | 195 | func (x DelayBasedBweUpdate_DetectorState) Enum() *DelayBasedBweUpdate_DetectorState { 196 | p := new(DelayBasedBweUpdate_DetectorState) 197 | *p = x 198 | return p 199 | } 200 | func (x DelayBasedBweUpdate_DetectorState) String() string { 201 | return proto.EnumName(DelayBasedBweUpdate_DetectorState_name, int32(x)) 202 | } 203 | func (x *DelayBasedBweUpdate_DetectorState) UnmarshalJSON(data []byte) error { 204 | value, err := proto.UnmarshalJSONEnum(DelayBasedBweUpdate_DetectorState_value, data, "DelayBasedBweUpdate_DetectorState") 205 | if err != nil { 206 | return err 207 | } 208 | *x = DelayBasedBweUpdate_DetectorState(value) 209 | return nil 210 | } 211 | func (DelayBasedBweUpdate_DetectorState) EnumDescriptor() ([]byte, []int) { 212 | return fileDescriptor0, []int{6, 0} 213 | } 214 | 215 | // Compound mode is described by RFC 4585 and reduced-size 216 | // RTCP mode is described by RFC 5506. 217 | type VideoReceiveConfig_RtcpMode int32 218 | 219 | const ( 220 | VideoReceiveConfig_RTCP_COMPOUND VideoReceiveConfig_RtcpMode = 1 221 | VideoReceiveConfig_RTCP_REDUCEDSIZE VideoReceiveConfig_RtcpMode = 2 222 | ) 223 | 224 | var VideoReceiveConfig_RtcpMode_name = map[int32]string{ 225 | 1: "RTCP_COMPOUND", 226 | 2: "RTCP_REDUCEDSIZE", 227 | } 228 | var VideoReceiveConfig_RtcpMode_value = map[string]int32{ 229 | "RTCP_COMPOUND": 1, 230 | "RTCP_REDUCEDSIZE": 2, 231 | } 232 | 233 | func (x VideoReceiveConfig_RtcpMode) Enum() *VideoReceiveConfig_RtcpMode { 234 | p := new(VideoReceiveConfig_RtcpMode) 235 | *p = x 236 | return p 237 | } 238 | func (x VideoReceiveConfig_RtcpMode) String() string { 239 | return proto.EnumName(VideoReceiveConfig_RtcpMode_name, int32(x)) 240 | } 241 | func (x *VideoReceiveConfig_RtcpMode) UnmarshalJSON(data []byte) error { 242 | value, err := proto.UnmarshalJSONEnum(VideoReceiveConfig_RtcpMode_value, data, "VideoReceiveConfig_RtcpMode") 243 | if err != nil { 244 | return err 245 | } 246 | *x = VideoReceiveConfig_RtcpMode(value) 247 | return nil 248 | } 249 | func (VideoReceiveConfig_RtcpMode) EnumDescriptor() ([]byte, []int) { 250 | return fileDescriptor0, []int{7, 0} 251 | } 252 | 253 | type BweProbeResult_ResultType int32 254 | 255 | const ( 256 | BweProbeResult_SUCCESS BweProbeResult_ResultType = 0 257 | BweProbeResult_INVALID_SEND_RECEIVE_INTERVAL BweProbeResult_ResultType = 1 258 | BweProbeResult_INVALID_SEND_RECEIVE_RATIO BweProbeResult_ResultType = 2 259 | BweProbeResult_TIMEOUT BweProbeResult_ResultType = 3 260 | ) 261 | 262 | var BweProbeResult_ResultType_name = map[int32]string{ 263 | 0: "SUCCESS", 264 | 1: "INVALID_SEND_RECEIVE_INTERVAL", 265 | 2: "INVALID_SEND_RECEIVE_RATIO", 266 | 3: "TIMEOUT", 267 | } 268 | var BweProbeResult_ResultType_value = map[string]int32{ 269 | "SUCCESS": 0, 270 | "INVALID_SEND_RECEIVE_INTERVAL": 1, 271 | "INVALID_SEND_RECEIVE_RATIO": 2, 272 | "TIMEOUT": 3, 273 | } 274 | 275 | func (x BweProbeResult_ResultType) Enum() *BweProbeResult_ResultType { 276 | p := new(BweProbeResult_ResultType) 277 | *p = x 278 | return p 279 | } 280 | func (x BweProbeResult_ResultType) String() string { 281 | return proto.EnumName(BweProbeResult_ResultType_name, int32(x)) 282 | } 283 | func (x *BweProbeResult_ResultType) UnmarshalJSON(data []byte) error { 284 | value, err := proto.UnmarshalJSONEnum(BweProbeResult_ResultType_value, data, "BweProbeResult_ResultType") 285 | if err != nil { 286 | return err 287 | } 288 | *x = BweProbeResult_ResultType(value) 289 | return nil 290 | } 291 | func (BweProbeResult_ResultType) EnumDescriptor() ([]byte, []int) { 292 | return fileDescriptor0, []int{18, 0} 293 | } 294 | 295 | type IceCandidatePairConfig_IceCandidatePairConfigType int32 296 | 297 | const ( 298 | IceCandidatePairConfig_ADDED IceCandidatePairConfig_IceCandidatePairConfigType = 0 299 | IceCandidatePairConfig_UPDATED IceCandidatePairConfig_IceCandidatePairConfigType = 1 300 | IceCandidatePairConfig_DESTROYED IceCandidatePairConfig_IceCandidatePairConfigType = 2 301 | IceCandidatePairConfig_SELECTED IceCandidatePairConfig_IceCandidatePairConfigType = 3 302 | ) 303 | 304 | var IceCandidatePairConfig_IceCandidatePairConfigType_name = map[int32]string{ 305 | 0: "ADDED", 306 | 1: "UPDATED", 307 | 2: "DESTROYED", 308 | 3: "SELECTED", 309 | } 310 | var IceCandidatePairConfig_IceCandidatePairConfigType_value = map[string]int32{ 311 | "ADDED": 0, 312 | "UPDATED": 1, 313 | "DESTROYED": 2, 314 | "SELECTED": 3, 315 | } 316 | 317 | func (x IceCandidatePairConfig_IceCandidatePairConfigType) Enum() *IceCandidatePairConfig_IceCandidatePairConfigType { 318 | p := new(IceCandidatePairConfig_IceCandidatePairConfigType) 319 | *p = x 320 | return p 321 | } 322 | func (x IceCandidatePairConfig_IceCandidatePairConfigType) String() string { 323 | return proto.EnumName(IceCandidatePairConfig_IceCandidatePairConfigType_name, int32(x)) 324 | } 325 | func (x *IceCandidatePairConfig_IceCandidatePairConfigType) UnmarshalJSON(data []byte) error { 326 | value, err := proto.UnmarshalJSONEnum(IceCandidatePairConfig_IceCandidatePairConfigType_value, data, "IceCandidatePairConfig_IceCandidatePairConfigType") 327 | if err != nil { 328 | return err 329 | } 330 | *x = IceCandidatePairConfig_IceCandidatePairConfigType(value) 331 | return nil 332 | } 333 | func (IceCandidatePairConfig_IceCandidatePairConfigType) EnumDescriptor() ([]byte, []int) { 334 | return fileDescriptor0, []int{20, 0} 335 | } 336 | 337 | type IceCandidatePairConfig_IceCandidateType int32 338 | 339 | const ( 340 | IceCandidatePairConfig_LOCAL IceCandidatePairConfig_IceCandidateType = 0 341 | IceCandidatePairConfig_STUN IceCandidatePairConfig_IceCandidateType = 1 342 | IceCandidatePairConfig_PRFLX IceCandidatePairConfig_IceCandidateType = 2 343 | IceCandidatePairConfig_RELAY IceCandidatePairConfig_IceCandidateType = 3 344 | IceCandidatePairConfig_UNKNOWN_CANDIDATE_TYPE IceCandidatePairConfig_IceCandidateType = 4 345 | ) 346 | 347 | var IceCandidatePairConfig_IceCandidateType_name = map[int32]string{ 348 | 0: "LOCAL", 349 | 1: "STUN", 350 | 2: "PRFLX", 351 | 3: "RELAY", 352 | 4: "UNKNOWN_CANDIDATE_TYPE", 353 | } 354 | var IceCandidatePairConfig_IceCandidateType_value = map[string]int32{ 355 | "LOCAL": 0, 356 | "STUN": 1, 357 | "PRFLX": 2, 358 | "RELAY": 3, 359 | "UNKNOWN_CANDIDATE_TYPE": 4, 360 | } 361 | 362 | func (x IceCandidatePairConfig_IceCandidateType) Enum() *IceCandidatePairConfig_IceCandidateType { 363 | p := new(IceCandidatePairConfig_IceCandidateType) 364 | *p = x 365 | return p 366 | } 367 | func (x IceCandidatePairConfig_IceCandidateType) String() string { 368 | return proto.EnumName(IceCandidatePairConfig_IceCandidateType_name, int32(x)) 369 | } 370 | func (x *IceCandidatePairConfig_IceCandidateType) UnmarshalJSON(data []byte) error { 371 | value, err := proto.UnmarshalJSONEnum(IceCandidatePairConfig_IceCandidateType_value, data, "IceCandidatePairConfig_IceCandidateType") 372 | if err != nil { 373 | return err 374 | } 375 | *x = IceCandidatePairConfig_IceCandidateType(value) 376 | return nil 377 | } 378 | func (IceCandidatePairConfig_IceCandidateType) EnumDescriptor() ([]byte, []int) { 379 | return fileDescriptor0, []int{20, 1} 380 | } 381 | 382 | type IceCandidatePairConfig_Protocol int32 383 | 384 | const ( 385 | IceCandidatePairConfig_UDP IceCandidatePairConfig_Protocol = 0 386 | IceCandidatePairConfig_TCP IceCandidatePairConfig_Protocol = 1 387 | IceCandidatePairConfig_SSLTCP IceCandidatePairConfig_Protocol = 2 388 | IceCandidatePairConfig_TLS IceCandidatePairConfig_Protocol = 3 389 | IceCandidatePairConfig_UNKNOWN_PROTOCOL IceCandidatePairConfig_Protocol = 4 390 | ) 391 | 392 | var IceCandidatePairConfig_Protocol_name = map[int32]string{ 393 | 0: "UDP", 394 | 1: "TCP", 395 | 2: "SSLTCP", 396 | 3: "TLS", 397 | 4: "UNKNOWN_PROTOCOL", 398 | } 399 | var IceCandidatePairConfig_Protocol_value = map[string]int32{ 400 | "UDP": 0, 401 | "TCP": 1, 402 | "SSLTCP": 2, 403 | "TLS": 3, 404 | "UNKNOWN_PROTOCOL": 4, 405 | } 406 | 407 | func (x IceCandidatePairConfig_Protocol) Enum() *IceCandidatePairConfig_Protocol { 408 | p := new(IceCandidatePairConfig_Protocol) 409 | *p = x 410 | return p 411 | } 412 | func (x IceCandidatePairConfig_Protocol) String() string { 413 | return proto.EnumName(IceCandidatePairConfig_Protocol_name, int32(x)) 414 | } 415 | func (x *IceCandidatePairConfig_Protocol) UnmarshalJSON(data []byte) error { 416 | value, err := proto.UnmarshalJSONEnum(IceCandidatePairConfig_Protocol_value, data, "IceCandidatePairConfig_Protocol") 417 | if err != nil { 418 | return err 419 | } 420 | *x = IceCandidatePairConfig_Protocol(value) 421 | return nil 422 | } 423 | func (IceCandidatePairConfig_Protocol) EnumDescriptor() ([]byte, []int) { 424 | return fileDescriptor0, []int{20, 2} 425 | } 426 | 427 | type IceCandidatePairConfig_AddressFamily int32 428 | 429 | const ( 430 | IceCandidatePairConfig_IPV4 IceCandidatePairConfig_AddressFamily = 0 431 | IceCandidatePairConfig_IPV6 IceCandidatePairConfig_AddressFamily = 1 432 | IceCandidatePairConfig_UNKNOWN_ADDRESS_FAMILY IceCandidatePairConfig_AddressFamily = 2 433 | ) 434 | 435 | var IceCandidatePairConfig_AddressFamily_name = map[int32]string{ 436 | 0: "IPV4", 437 | 1: "IPV6", 438 | 2: "UNKNOWN_ADDRESS_FAMILY", 439 | } 440 | var IceCandidatePairConfig_AddressFamily_value = map[string]int32{ 441 | "IPV4": 0, 442 | "IPV6": 1, 443 | "UNKNOWN_ADDRESS_FAMILY": 2, 444 | } 445 | 446 | func (x IceCandidatePairConfig_AddressFamily) Enum() *IceCandidatePairConfig_AddressFamily { 447 | p := new(IceCandidatePairConfig_AddressFamily) 448 | *p = x 449 | return p 450 | } 451 | func (x IceCandidatePairConfig_AddressFamily) String() string { 452 | return proto.EnumName(IceCandidatePairConfig_AddressFamily_name, int32(x)) 453 | } 454 | func (x *IceCandidatePairConfig_AddressFamily) UnmarshalJSON(data []byte) error { 455 | value, err := proto.UnmarshalJSONEnum(IceCandidatePairConfig_AddressFamily_value, data, "IceCandidatePairConfig_AddressFamily") 456 | if err != nil { 457 | return err 458 | } 459 | *x = IceCandidatePairConfig_AddressFamily(value) 460 | return nil 461 | } 462 | func (IceCandidatePairConfig_AddressFamily) EnumDescriptor() ([]byte, []int) { 463 | return fileDescriptor0, []int{20, 3} 464 | } 465 | 466 | type IceCandidatePairConfig_NetworkType int32 467 | 468 | const ( 469 | IceCandidatePairConfig_ETHERNET IceCandidatePairConfig_NetworkType = 0 470 | IceCandidatePairConfig_LOOPBACK IceCandidatePairConfig_NetworkType = 1 471 | IceCandidatePairConfig_WIFI IceCandidatePairConfig_NetworkType = 2 472 | IceCandidatePairConfig_VPN IceCandidatePairConfig_NetworkType = 3 473 | IceCandidatePairConfig_CELLULAR IceCandidatePairConfig_NetworkType = 4 474 | IceCandidatePairConfig_UNKNOWN_NETWORK_TYPE IceCandidatePairConfig_NetworkType = 5 475 | ) 476 | 477 | var IceCandidatePairConfig_NetworkType_name = map[int32]string{ 478 | 0: "ETHERNET", 479 | 1: "LOOPBACK", 480 | 2: "WIFI", 481 | 3: "VPN", 482 | 4: "CELLULAR", 483 | 5: "UNKNOWN_NETWORK_TYPE", 484 | } 485 | var IceCandidatePairConfig_NetworkType_value = map[string]int32{ 486 | "ETHERNET": 0, 487 | "LOOPBACK": 1, 488 | "WIFI": 2, 489 | "VPN": 3, 490 | "CELLULAR": 4, 491 | "UNKNOWN_NETWORK_TYPE": 5, 492 | } 493 | 494 | func (x IceCandidatePairConfig_NetworkType) Enum() *IceCandidatePairConfig_NetworkType { 495 | p := new(IceCandidatePairConfig_NetworkType) 496 | *p = x 497 | return p 498 | } 499 | func (x IceCandidatePairConfig_NetworkType) String() string { 500 | return proto.EnumName(IceCandidatePairConfig_NetworkType_name, int32(x)) 501 | } 502 | func (x *IceCandidatePairConfig_NetworkType) UnmarshalJSON(data []byte) error { 503 | value, err := proto.UnmarshalJSONEnum(IceCandidatePairConfig_NetworkType_value, data, "IceCandidatePairConfig_NetworkType") 504 | if err != nil { 505 | return err 506 | } 507 | *x = IceCandidatePairConfig_NetworkType(value) 508 | return nil 509 | } 510 | func (IceCandidatePairConfig_NetworkType) EnumDescriptor() ([]byte, []int) { 511 | return fileDescriptor0, []int{20, 4} 512 | } 513 | 514 | type IceCandidatePairEvent_IceCandidatePairEventType int32 515 | 516 | const ( 517 | IceCandidatePairEvent_CHECK_SENT IceCandidatePairEvent_IceCandidatePairEventType = 0 518 | IceCandidatePairEvent_CHECK_RECEIVED IceCandidatePairEvent_IceCandidatePairEventType = 1 519 | IceCandidatePairEvent_CHECK_RESPONSE_SENT IceCandidatePairEvent_IceCandidatePairEventType = 2 520 | IceCandidatePairEvent_CHECK_RESPONSE_RECEIVED IceCandidatePairEvent_IceCandidatePairEventType = 3 521 | ) 522 | 523 | var IceCandidatePairEvent_IceCandidatePairEventType_name = map[int32]string{ 524 | 0: "CHECK_SENT", 525 | 1: "CHECK_RECEIVED", 526 | 2: "CHECK_RESPONSE_SENT", 527 | 3: "CHECK_RESPONSE_RECEIVED", 528 | } 529 | var IceCandidatePairEvent_IceCandidatePairEventType_value = map[string]int32{ 530 | "CHECK_SENT": 0, 531 | "CHECK_RECEIVED": 1, 532 | "CHECK_RESPONSE_SENT": 2, 533 | "CHECK_RESPONSE_RECEIVED": 3, 534 | } 535 | 536 | func (x IceCandidatePairEvent_IceCandidatePairEventType) Enum() *IceCandidatePairEvent_IceCandidatePairEventType { 537 | p := new(IceCandidatePairEvent_IceCandidatePairEventType) 538 | *p = x 539 | return p 540 | } 541 | func (x IceCandidatePairEvent_IceCandidatePairEventType) String() string { 542 | return proto.EnumName(IceCandidatePairEvent_IceCandidatePairEventType_name, int32(x)) 543 | } 544 | func (x *IceCandidatePairEvent_IceCandidatePairEventType) UnmarshalJSON(data []byte) error { 545 | value, err := proto.UnmarshalJSONEnum(IceCandidatePairEvent_IceCandidatePairEventType_value, data, "IceCandidatePairEvent_IceCandidatePairEventType") 546 | if err != nil { 547 | return err 548 | } 549 | *x = IceCandidatePairEvent_IceCandidatePairEventType(value) 550 | return nil 551 | } 552 | func (IceCandidatePairEvent_IceCandidatePairEventType) EnumDescriptor() ([]byte, []int) { 553 | return fileDescriptor0, []int{21, 0} 554 | } 555 | 556 | // This is the main message to dump to a file, it can contain multiple event 557 | // messages, but it is possible to append multiple EventStreams (each with a 558 | // single event) to a file. 559 | // This has the benefit that there's no need to keep all data in memory. 560 | type EventStream struct { 561 | Stream []*Event `protobuf:"bytes,1,rep,name=stream" json:"stream,omitempty"` 562 | XXX_unrecognized []byte `json:"-"` 563 | } 564 | 565 | func (m *EventStream) Reset() { *m = EventStream{} } 566 | func (m *EventStream) String() string { return proto.CompactTextString(m) } 567 | func (*EventStream) ProtoMessage() {} 568 | func (*EventStream) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } 569 | 570 | func (m *EventStream) GetStream() []*Event { 571 | if m != nil { 572 | return m.Stream 573 | } 574 | return nil 575 | } 576 | 577 | type Event struct { 578 | // required - Elapsed wallclock time in us since the start of the log. 579 | TimestampUs *int64 `protobuf:"varint,1,opt,name=timestamp_us,json=timestampUs" json:"timestamp_us,omitempty"` 580 | // required - Indicates the type of this event 581 | Type *Event_EventType `protobuf:"varint,2,opt,name=type,enum=webrtc.rtclog.Event_EventType" json:"type,omitempty"` 582 | // Types that are valid to be assigned to Subtype: 583 | // *Event_RtpPacket 584 | // *Event_RtcpPacket 585 | // *Event_AudioPlayoutEvent 586 | // *Event_LossBasedBweUpdate 587 | // *Event_DelayBasedBweUpdate 588 | // *Event_VideoReceiverConfig 589 | // *Event_VideoSenderConfig 590 | // *Event_AudioReceiverConfig 591 | // *Event_AudioSenderConfig 592 | // *Event_AudioNetworkAdaptation 593 | // *Event_ProbeCluster 594 | // *Event_ProbeResult 595 | // *Event_AlrState 596 | // *Event_IceCandidatePairConfig 597 | // *Event_IceCandidatePairEvent 598 | Subtype isEvent_Subtype `protobuf_oneof:"subtype"` 599 | XXX_unrecognized []byte `json:"-"` 600 | } 601 | 602 | func (m *Event) Reset() { *m = Event{} } 603 | func (m *Event) String() string { return proto.CompactTextString(m) } 604 | func (*Event) ProtoMessage() {} 605 | func (*Event) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } 606 | 607 | type isEvent_Subtype interface { 608 | isEvent_Subtype() 609 | } 610 | 611 | type Event_RtpPacket struct { 612 | RtpPacket *RtpPacket `protobuf:"bytes,3,opt,name=rtp_packet,json=rtpPacket,oneof"` 613 | } 614 | type Event_RtcpPacket struct { 615 | RtcpPacket *RtcpPacket `protobuf:"bytes,4,opt,name=rtcp_packet,json=rtcpPacket,oneof"` 616 | } 617 | type Event_AudioPlayoutEvent struct { 618 | AudioPlayoutEvent *AudioPlayoutEvent `protobuf:"bytes,5,opt,name=audio_playout_event,json=audioPlayoutEvent,oneof"` 619 | } 620 | type Event_LossBasedBweUpdate struct { 621 | LossBasedBweUpdate *LossBasedBweUpdate `protobuf:"bytes,6,opt,name=loss_based_bwe_update,json=lossBasedBweUpdate,oneof"` 622 | } 623 | type Event_DelayBasedBweUpdate struct { 624 | DelayBasedBweUpdate *DelayBasedBweUpdate `protobuf:"bytes,7,opt,name=delay_based_bwe_update,json=delayBasedBweUpdate,oneof"` 625 | } 626 | type Event_VideoReceiverConfig struct { 627 | VideoReceiverConfig *VideoReceiveConfig `protobuf:"bytes,8,opt,name=video_receiver_config,json=videoReceiverConfig,oneof"` 628 | } 629 | type Event_VideoSenderConfig struct { 630 | VideoSenderConfig *VideoSendConfig `protobuf:"bytes,9,opt,name=video_sender_config,json=videoSenderConfig,oneof"` 631 | } 632 | type Event_AudioReceiverConfig struct { 633 | AudioReceiverConfig *AudioReceiveConfig `protobuf:"bytes,10,opt,name=audio_receiver_config,json=audioReceiverConfig,oneof"` 634 | } 635 | type Event_AudioSenderConfig struct { 636 | AudioSenderConfig *AudioSendConfig `protobuf:"bytes,11,opt,name=audio_sender_config,json=audioSenderConfig,oneof"` 637 | } 638 | type Event_AudioNetworkAdaptation struct { 639 | AudioNetworkAdaptation *AudioNetworkAdaptation `protobuf:"bytes,16,opt,name=audio_network_adaptation,json=audioNetworkAdaptation,oneof"` 640 | } 641 | type Event_ProbeCluster struct { 642 | ProbeCluster *BweProbeCluster `protobuf:"bytes,17,opt,name=probe_cluster,json=probeCluster,oneof"` 643 | } 644 | type Event_ProbeResult struct { 645 | ProbeResult *BweProbeResult `protobuf:"bytes,18,opt,name=probe_result,json=probeResult,oneof"` 646 | } 647 | type Event_AlrState struct { 648 | AlrState *AlrState `protobuf:"bytes,19,opt,name=alr_state,json=alrState,oneof"` 649 | } 650 | type Event_IceCandidatePairConfig struct { 651 | IceCandidatePairConfig *IceCandidatePairConfig `protobuf:"bytes,20,opt,name=ice_candidate_pair_config,json=iceCandidatePairConfig,oneof"` 652 | } 653 | type Event_IceCandidatePairEvent struct { 654 | IceCandidatePairEvent *IceCandidatePairEvent `protobuf:"bytes,21,opt,name=ice_candidate_pair_event,json=iceCandidatePairEvent,oneof"` 655 | } 656 | 657 | func (*Event_RtpPacket) isEvent_Subtype() {} 658 | func (*Event_RtcpPacket) isEvent_Subtype() {} 659 | func (*Event_AudioPlayoutEvent) isEvent_Subtype() {} 660 | func (*Event_LossBasedBweUpdate) isEvent_Subtype() {} 661 | func (*Event_DelayBasedBweUpdate) isEvent_Subtype() {} 662 | func (*Event_VideoReceiverConfig) isEvent_Subtype() {} 663 | func (*Event_VideoSenderConfig) isEvent_Subtype() {} 664 | func (*Event_AudioReceiverConfig) isEvent_Subtype() {} 665 | func (*Event_AudioSenderConfig) isEvent_Subtype() {} 666 | func (*Event_AudioNetworkAdaptation) isEvent_Subtype() {} 667 | func (*Event_ProbeCluster) isEvent_Subtype() {} 668 | func (*Event_ProbeResult) isEvent_Subtype() {} 669 | func (*Event_AlrState) isEvent_Subtype() {} 670 | func (*Event_IceCandidatePairConfig) isEvent_Subtype() {} 671 | func (*Event_IceCandidatePairEvent) isEvent_Subtype() {} 672 | 673 | func (m *Event) GetSubtype() isEvent_Subtype { 674 | if m != nil { 675 | return m.Subtype 676 | } 677 | return nil 678 | } 679 | 680 | func (m *Event) GetTimestampUs() int64 { 681 | if m != nil && m.TimestampUs != nil { 682 | return *m.TimestampUs 683 | } 684 | return 0 685 | } 686 | 687 | func (m *Event) GetType() Event_EventType { 688 | if m != nil && m.Type != nil { 689 | return *m.Type 690 | } 691 | return Event_UNKNOWN_EVENT 692 | } 693 | 694 | func (m *Event) GetRtpPacket() *RtpPacket { 695 | if x, ok := m.GetSubtype().(*Event_RtpPacket); ok { 696 | return x.RtpPacket 697 | } 698 | return nil 699 | } 700 | 701 | func (m *Event) GetRtcpPacket() *RtcpPacket { 702 | if x, ok := m.GetSubtype().(*Event_RtcpPacket); ok { 703 | return x.RtcpPacket 704 | } 705 | return nil 706 | } 707 | 708 | func (m *Event) GetAudioPlayoutEvent() *AudioPlayoutEvent { 709 | if x, ok := m.GetSubtype().(*Event_AudioPlayoutEvent); ok { 710 | return x.AudioPlayoutEvent 711 | } 712 | return nil 713 | } 714 | 715 | func (m *Event) GetLossBasedBweUpdate() *LossBasedBweUpdate { 716 | if x, ok := m.GetSubtype().(*Event_LossBasedBweUpdate); ok { 717 | return x.LossBasedBweUpdate 718 | } 719 | return nil 720 | } 721 | 722 | func (m *Event) GetDelayBasedBweUpdate() *DelayBasedBweUpdate { 723 | if x, ok := m.GetSubtype().(*Event_DelayBasedBweUpdate); ok { 724 | return x.DelayBasedBweUpdate 725 | } 726 | return nil 727 | } 728 | 729 | func (m *Event) GetVideoReceiverConfig() *VideoReceiveConfig { 730 | if x, ok := m.GetSubtype().(*Event_VideoReceiverConfig); ok { 731 | return x.VideoReceiverConfig 732 | } 733 | return nil 734 | } 735 | 736 | func (m *Event) GetVideoSenderConfig() *VideoSendConfig { 737 | if x, ok := m.GetSubtype().(*Event_VideoSenderConfig); ok { 738 | return x.VideoSenderConfig 739 | } 740 | return nil 741 | } 742 | 743 | func (m *Event) GetAudioReceiverConfig() *AudioReceiveConfig { 744 | if x, ok := m.GetSubtype().(*Event_AudioReceiverConfig); ok { 745 | return x.AudioReceiverConfig 746 | } 747 | return nil 748 | } 749 | 750 | func (m *Event) GetAudioSenderConfig() *AudioSendConfig { 751 | if x, ok := m.GetSubtype().(*Event_AudioSenderConfig); ok { 752 | return x.AudioSenderConfig 753 | } 754 | return nil 755 | } 756 | 757 | func (m *Event) GetAudioNetworkAdaptation() *AudioNetworkAdaptation { 758 | if x, ok := m.GetSubtype().(*Event_AudioNetworkAdaptation); ok { 759 | return x.AudioNetworkAdaptation 760 | } 761 | return nil 762 | } 763 | 764 | func (m *Event) GetProbeCluster() *BweProbeCluster { 765 | if x, ok := m.GetSubtype().(*Event_ProbeCluster); ok { 766 | return x.ProbeCluster 767 | } 768 | return nil 769 | } 770 | 771 | func (m *Event) GetProbeResult() *BweProbeResult { 772 | if x, ok := m.GetSubtype().(*Event_ProbeResult); ok { 773 | return x.ProbeResult 774 | } 775 | return nil 776 | } 777 | 778 | func (m *Event) GetAlrState() *AlrState { 779 | if x, ok := m.GetSubtype().(*Event_AlrState); ok { 780 | return x.AlrState 781 | } 782 | return nil 783 | } 784 | 785 | func (m *Event) GetIceCandidatePairConfig() *IceCandidatePairConfig { 786 | if x, ok := m.GetSubtype().(*Event_IceCandidatePairConfig); ok { 787 | return x.IceCandidatePairConfig 788 | } 789 | return nil 790 | } 791 | 792 | func (m *Event) GetIceCandidatePairEvent() *IceCandidatePairEvent { 793 | if x, ok := m.GetSubtype().(*Event_IceCandidatePairEvent); ok { 794 | return x.IceCandidatePairEvent 795 | } 796 | return nil 797 | } 798 | 799 | // XXX_OneofFuncs is for the internal use of the proto package. 800 | func (*Event) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { 801 | return _Event_OneofMarshaler, _Event_OneofUnmarshaler, _Event_OneofSizer, []interface{}{ 802 | (*Event_RtpPacket)(nil), 803 | (*Event_RtcpPacket)(nil), 804 | (*Event_AudioPlayoutEvent)(nil), 805 | (*Event_LossBasedBweUpdate)(nil), 806 | (*Event_DelayBasedBweUpdate)(nil), 807 | (*Event_VideoReceiverConfig)(nil), 808 | (*Event_VideoSenderConfig)(nil), 809 | (*Event_AudioReceiverConfig)(nil), 810 | (*Event_AudioSenderConfig)(nil), 811 | (*Event_AudioNetworkAdaptation)(nil), 812 | (*Event_ProbeCluster)(nil), 813 | (*Event_ProbeResult)(nil), 814 | (*Event_AlrState)(nil), 815 | (*Event_IceCandidatePairConfig)(nil), 816 | (*Event_IceCandidatePairEvent)(nil), 817 | } 818 | } 819 | 820 | func _Event_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { 821 | m := msg.(*Event) 822 | // subtype 823 | switch x := m.Subtype.(type) { 824 | case *Event_RtpPacket: 825 | b.EncodeVarint(3<<3 | proto.WireBytes) 826 | if err := b.EncodeMessage(x.RtpPacket); err != nil { 827 | return err 828 | } 829 | case *Event_RtcpPacket: 830 | b.EncodeVarint(4<<3 | proto.WireBytes) 831 | if err := b.EncodeMessage(x.RtcpPacket); err != nil { 832 | return err 833 | } 834 | case *Event_AudioPlayoutEvent: 835 | b.EncodeVarint(5<<3 | proto.WireBytes) 836 | if err := b.EncodeMessage(x.AudioPlayoutEvent); err != nil { 837 | return err 838 | } 839 | case *Event_LossBasedBweUpdate: 840 | b.EncodeVarint(6<<3 | proto.WireBytes) 841 | if err := b.EncodeMessage(x.LossBasedBweUpdate); err != nil { 842 | return err 843 | } 844 | case *Event_DelayBasedBweUpdate: 845 | b.EncodeVarint(7<<3 | proto.WireBytes) 846 | if err := b.EncodeMessage(x.DelayBasedBweUpdate); err != nil { 847 | return err 848 | } 849 | case *Event_VideoReceiverConfig: 850 | b.EncodeVarint(8<<3 | proto.WireBytes) 851 | if err := b.EncodeMessage(x.VideoReceiverConfig); err != nil { 852 | return err 853 | } 854 | case *Event_VideoSenderConfig: 855 | b.EncodeVarint(9<<3 | proto.WireBytes) 856 | if err := b.EncodeMessage(x.VideoSenderConfig); err != nil { 857 | return err 858 | } 859 | case *Event_AudioReceiverConfig: 860 | b.EncodeVarint(10<<3 | proto.WireBytes) 861 | if err := b.EncodeMessage(x.AudioReceiverConfig); err != nil { 862 | return err 863 | } 864 | case *Event_AudioSenderConfig: 865 | b.EncodeVarint(11<<3 | proto.WireBytes) 866 | if err := b.EncodeMessage(x.AudioSenderConfig); err != nil { 867 | return err 868 | } 869 | case *Event_AudioNetworkAdaptation: 870 | b.EncodeVarint(16<<3 | proto.WireBytes) 871 | if err := b.EncodeMessage(x.AudioNetworkAdaptation); err != nil { 872 | return err 873 | } 874 | case *Event_ProbeCluster: 875 | b.EncodeVarint(17<<3 | proto.WireBytes) 876 | if err := b.EncodeMessage(x.ProbeCluster); err != nil { 877 | return err 878 | } 879 | case *Event_ProbeResult: 880 | b.EncodeVarint(18<<3 | proto.WireBytes) 881 | if err := b.EncodeMessage(x.ProbeResult); err != nil { 882 | return err 883 | } 884 | case *Event_AlrState: 885 | b.EncodeVarint(19<<3 | proto.WireBytes) 886 | if err := b.EncodeMessage(x.AlrState); err != nil { 887 | return err 888 | } 889 | case *Event_IceCandidatePairConfig: 890 | b.EncodeVarint(20<<3 | proto.WireBytes) 891 | if err := b.EncodeMessage(x.IceCandidatePairConfig); err != nil { 892 | return err 893 | } 894 | case *Event_IceCandidatePairEvent: 895 | b.EncodeVarint(21<<3 | proto.WireBytes) 896 | if err := b.EncodeMessage(x.IceCandidatePairEvent); err != nil { 897 | return err 898 | } 899 | case nil: 900 | default: 901 | return fmt.Errorf("Event.Subtype has unexpected type %T", x) 902 | } 903 | return nil 904 | } 905 | 906 | func _Event_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { 907 | m := msg.(*Event) 908 | switch tag { 909 | case 3: // subtype.rtp_packet 910 | if wire != proto.WireBytes { 911 | return true, proto.ErrInternalBadWireType 912 | } 913 | msg := new(RtpPacket) 914 | err := b.DecodeMessage(msg) 915 | m.Subtype = &Event_RtpPacket{msg} 916 | return true, err 917 | case 4: // subtype.rtcp_packet 918 | if wire != proto.WireBytes { 919 | return true, proto.ErrInternalBadWireType 920 | } 921 | msg := new(RtcpPacket) 922 | err := b.DecodeMessage(msg) 923 | m.Subtype = &Event_RtcpPacket{msg} 924 | return true, err 925 | case 5: // subtype.audio_playout_event 926 | if wire != proto.WireBytes { 927 | return true, proto.ErrInternalBadWireType 928 | } 929 | msg := new(AudioPlayoutEvent) 930 | err := b.DecodeMessage(msg) 931 | m.Subtype = &Event_AudioPlayoutEvent{msg} 932 | return true, err 933 | case 6: // subtype.loss_based_bwe_update 934 | if wire != proto.WireBytes { 935 | return true, proto.ErrInternalBadWireType 936 | } 937 | msg := new(LossBasedBweUpdate) 938 | err := b.DecodeMessage(msg) 939 | m.Subtype = &Event_LossBasedBweUpdate{msg} 940 | return true, err 941 | case 7: // subtype.delay_based_bwe_update 942 | if wire != proto.WireBytes { 943 | return true, proto.ErrInternalBadWireType 944 | } 945 | msg := new(DelayBasedBweUpdate) 946 | err := b.DecodeMessage(msg) 947 | m.Subtype = &Event_DelayBasedBweUpdate{msg} 948 | return true, err 949 | case 8: // subtype.video_receiver_config 950 | if wire != proto.WireBytes { 951 | return true, proto.ErrInternalBadWireType 952 | } 953 | msg := new(VideoReceiveConfig) 954 | err := b.DecodeMessage(msg) 955 | m.Subtype = &Event_VideoReceiverConfig{msg} 956 | return true, err 957 | case 9: // subtype.video_sender_config 958 | if wire != proto.WireBytes { 959 | return true, proto.ErrInternalBadWireType 960 | } 961 | msg := new(VideoSendConfig) 962 | err := b.DecodeMessage(msg) 963 | m.Subtype = &Event_VideoSenderConfig{msg} 964 | return true, err 965 | case 10: // subtype.audio_receiver_config 966 | if wire != proto.WireBytes { 967 | return true, proto.ErrInternalBadWireType 968 | } 969 | msg := new(AudioReceiveConfig) 970 | err := b.DecodeMessage(msg) 971 | m.Subtype = &Event_AudioReceiverConfig{msg} 972 | return true, err 973 | case 11: // subtype.audio_sender_config 974 | if wire != proto.WireBytes { 975 | return true, proto.ErrInternalBadWireType 976 | } 977 | msg := new(AudioSendConfig) 978 | err := b.DecodeMessage(msg) 979 | m.Subtype = &Event_AudioSenderConfig{msg} 980 | return true, err 981 | case 16: // subtype.audio_network_adaptation 982 | if wire != proto.WireBytes { 983 | return true, proto.ErrInternalBadWireType 984 | } 985 | msg := new(AudioNetworkAdaptation) 986 | err := b.DecodeMessage(msg) 987 | m.Subtype = &Event_AudioNetworkAdaptation{msg} 988 | return true, err 989 | case 17: // subtype.probe_cluster 990 | if wire != proto.WireBytes { 991 | return true, proto.ErrInternalBadWireType 992 | } 993 | msg := new(BweProbeCluster) 994 | err := b.DecodeMessage(msg) 995 | m.Subtype = &Event_ProbeCluster{msg} 996 | return true, err 997 | case 18: // subtype.probe_result 998 | if wire != proto.WireBytes { 999 | return true, proto.ErrInternalBadWireType 1000 | } 1001 | msg := new(BweProbeResult) 1002 | err := b.DecodeMessage(msg) 1003 | m.Subtype = &Event_ProbeResult{msg} 1004 | return true, err 1005 | case 19: // subtype.alr_state 1006 | if wire != proto.WireBytes { 1007 | return true, proto.ErrInternalBadWireType 1008 | } 1009 | msg := new(AlrState) 1010 | err := b.DecodeMessage(msg) 1011 | m.Subtype = &Event_AlrState{msg} 1012 | return true, err 1013 | case 20: // subtype.ice_candidate_pair_config 1014 | if wire != proto.WireBytes { 1015 | return true, proto.ErrInternalBadWireType 1016 | } 1017 | msg := new(IceCandidatePairConfig) 1018 | err := b.DecodeMessage(msg) 1019 | m.Subtype = &Event_IceCandidatePairConfig{msg} 1020 | return true, err 1021 | case 21: // subtype.ice_candidate_pair_event 1022 | if wire != proto.WireBytes { 1023 | return true, proto.ErrInternalBadWireType 1024 | } 1025 | msg := new(IceCandidatePairEvent) 1026 | err := b.DecodeMessage(msg) 1027 | m.Subtype = &Event_IceCandidatePairEvent{msg} 1028 | return true, err 1029 | default: 1030 | return false, nil 1031 | } 1032 | } 1033 | 1034 | func _Event_OneofSizer(msg proto.Message) (n int) { 1035 | m := msg.(*Event) 1036 | // subtype 1037 | switch x := m.Subtype.(type) { 1038 | case *Event_RtpPacket: 1039 | s := proto.Size(x.RtpPacket) 1040 | n += proto.SizeVarint(3<<3 | proto.WireBytes) 1041 | n += proto.SizeVarint(uint64(s)) 1042 | n += s 1043 | case *Event_RtcpPacket: 1044 | s := proto.Size(x.RtcpPacket) 1045 | n += proto.SizeVarint(4<<3 | proto.WireBytes) 1046 | n += proto.SizeVarint(uint64(s)) 1047 | n += s 1048 | case *Event_AudioPlayoutEvent: 1049 | s := proto.Size(x.AudioPlayoutEvent) 1050 | n += proto.SizeVarint(5<<3 | proto.WireBytes) 1051 | n += proto.SizeVarint(uint64(s)) 1052 | n += s 1053 | case *Event_LossBasedBweUpdate: 1054 | s := proto.Size(x.LossBasedBweUpdate) 1055 | n += proto.SizeVarint(6<<3 | proto.WireBytes) 1056 | n += proto.SizeVarint(uint64(s)) 1057 | n += s 1058 | case *Event_DelayBasedBweUpdate: 1059 | s := proto.Size(x.DelayBasedBweUpdate) 1060 | n += proto.SizeVarint(7<<3 | proto.WireBytes) 1061 | n += proto.SizeVarint(uint64(s)) 1062 | n += s 1063 | case *Event_VideoReceiverConfig: 1064 | s := proto.Size(x.VideoReceiverConfig) 1065 | n += proto.SizeVarint(8<<3 | proto.WireBytes) 1066 | n += proto.SizeVarint(uint64(s)) 1067 | n += s 1068 | case *Event_VideoSenderConfig: 1069 | s := proto.Size(x.VideoSenderConfig) 1070 | n += proto.SizeVarint(9<<3 | proto.WireBytes) 1071 | n += proto.SizeVarint(uint64(s)) 1072 | n += s 1073 | case *Event_AudioReceiverConfig: 1074 | s := proto.Size(x.AudioReceiverConfig) 1075 | n += proto.SizeVarint(10<<3 | proto.WireBytes) 1076 | n += proto.SizeVarint(uint64(s)) 1077 | n += s 1078 | case *Event_AudioSenderConfig: 1079 | s := proto.Size(x.AudioSenderConfig) 1080 | n += proto.SizeVarint(11<<3 | proto.WireBytes) 1081 | n += proto.SizeVarint(uint64(s)) 1082 | n += s 1083 | case *Event_AudioNetworkAdaptation: 1084 | s := proto.Size(x.AudioNetworkAdaptation) 1085 | n += proto.SizeVarint(16<<3 | proto.WireBytes) 1086 | n += proto.SizeVarint(uint64(s)) 1087 | n += s 1088 | case *Event_ProbeCluster: 1089 | s := proto.Size(x.ProbeCluster) 1090 | n += proto.SizeVarint(17<<3 | proto.WireBytes) 1091 | n += proto.SizeVarint(uint64(s)) 1092 | n += s 1093 | case *Event_ProbeResult: 1094 | s := proto.Size(x.ProbeResult) 1095 | n += proto.SizeVarint(18<<3 | proto.WireBytes) 1096 | n += proto.SizeVarint(uint64(s)) 1097 | n += s 1098 | case *Event_AlrState: 1099 | s := proto.Size(x.AlrState) 1100 | n += proto.SizeVarint(19<<3 | proto.WireBytes) 1101 | n += proto.SizeVarint(uint64(s)) 1102 | n += s 1103 | case *Event_IceCandidatePairConfig: 1104 | s := proto.Size(x.IceCandidatePairConfig) 1105 | n += proto.SizeVarint(20<<3 | proto.WireBytes) 1106 | n += proto.SizeVarint(uint64(s)) 1107 | n += s 1108 | case *Event_IceCandidatePairEvent: 1109 | s := proto.Size(x.IceCandidatePairEvent) 1110 | n += proto.SizeVarint(21<<3 | proto.WireBytes) 1111 | n += proto.SizeVarint(uint64(s)) 1112 | n += s 1113 | case nil: 1114 | default: 1115 | panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) 1116 | } 1117 | return n 1118 | } 1119 | 1120 | type RtpPacket struct { 1121 | // required - True if the packet is incoming w.r.t. the user logging the data 1122 | Incoming *bool `protobuf:"varint,1,opt,name=incoming" json:"incoming,omitempty"` 1123 | Type *MediaType `protobuf:"varint,2,opt,name=type,enum=webrtc.rtclog.MediaType" json:"type,omitempty"` 1124 | // required - The size of the packet including both payload and header. 1125 | PacketLength *uint32 `protobuf:"varint,3,opt,name=packet_length,json=packetLength" json:"packet_length,omitempty"` 1126 | // required - The RTP header only. 1127 | Header []byte `protobuf:"bytes,4,opt,name=header" json:"header,omitempty"` 1128 | // optional - The probe cluster id. 1129 | ProbeClusterId *int32 `protobuf:"varint,5,opt,name=probe_cluster_id,json=probeClusterId" json:"probe_cluster_id,omitempty"` 1130 | XXX_unrecognized []byte `json:"-"` 1131 | } 1132 | 1133 | func (m *RtpPacket) Reset() { *m = RtpPacket{} } 1134 | func (m *RtpPacket) String() string { return proto.CompactTextString(m) } 1135 | func (*RtpPacket) ProtoMessage() {} 1136 | func (*RtpPacket) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } 1137 | 1138 | func (m *RtpPacket) GetIncoming() bool { 1139 | if m != nil && m.Incoming != nil { 1140 | return *m.Incoming 1141 | } 1142 | return false 1143 | } 1144 | 1145 | func (m *RtpPacket) GetType() MediaType { 1146 | if m != nil && m.Type != nil { 1147 | return *m.Type 1148 | } 1149 | return MediaType_ANY 1150 | } 1151 | 1152 | func (m *RtpPacket) GetPacketLength() uint32 { 1153 | if m != nil && m.PacketLength != nil { 1154 | return *m.PacketLength 1155 | } 1156 | return 0 1157 | } 1158 | 1159 | func (m *RtpPacket) GetHeader() []byte { 1160 | if m != nil { 1161 | return m.Header 1162 | } 1163 | return nil 1164 | } 1165 | 1166 | func (m *RtpPacket) GetProbeClusterId() int32 { 1167 | if m != nil && m.ProbeClusterId != nil { 1168 | return *m.ProbeClusterId 1169 | } 1170 | return 0 1171 | } 1172 | 1173 | type RtcpPacket struct { 1174 | // required - True if the packet is incoming w.r.t. the user logging the data 1175 | Incoming *bool `protobuf:"varint,1,opt,name=incoming" json:"incoming,omitempty"` 1176 | Type *MediaType `protobuf:"varint,2,opt,name=type,enum=webrtc.rtclog.MediaType" json:"type,omitempty"` 1177 | // required - The whole packet including both payload and header. 1178 | PacketData []byte `protobuf:"bytes,3,opt,name=packet_data,json=packetData" json:"packet_data,omitempty"` 1179 | XXX_unrecognized []byte `json:"-"` 1180 | } 1181 | 1182 | func (m *RtcpPacket) Reset() { *m = RtcpPacket{} } 1183 | func (m *RtcpPacket) String() string { return proto.CompactTextString(m) } 1184 | func (*RtcpPacket) ProtoMessage() {} 1185 | func (*RtcpPacket) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } 1186 | 1187 | func (m *RtcpPacket) GetIncoming() bool { 1188 | if m != nil && m.Incoming != nil { 1189 | return *m.Incoming 1190 | } 1191 | return false 1192 | } 1193 | 1194 | func (m *RtcpPacket) GetType() MediaType { 1195 | if m != nil && m.Type != nil { 1196 | return *m.Type 1197 | } 1198 | return MediaType_ANY 1199 | } 1200 | 1201 | func (m *RtcpPacket) GetPacketData() []byte { 1202 | if m != nil { 1203 | return m.PacketData 1204 | } 1205 | return nil 1206 | } 1207 | 1208 | type AudioPlayoutEvent struct { 1209 | // TODO(ivoc): Rename, we currently use the "remote" ssrc, i.e. identifying 1210 | // the receive stream, while local_ssrc identifies the send stream, if any. 1211 | // required - The SSRC of the audio stream associated with the playout event. 1212 | LocalSsrc *uint32 `protobuf:"varint,2,opt,name=local_ssrc,json=localSsrc" json:"local_ssrc,omitempty"` 1213 | XXX_unrecognized []byte `json:"-"` 1214 | } 1215 | 1216 | func (m *AudioPlayoutEvent) Reset() { *m = AudioPlayoutEvent{} } 1217 | func (m *AudioPlayoutEvent) String() string { return proto.CompactTextString(m) } 1218 | func (*AudioPlayoutEvent) ProtoMessage() {} 1219 | func (*AudioPlayoutEvent) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } 1220 | 1221 | func (m *AudioPlayoutEvent) GetLocalSsrc() uint32 { 1222 | if m != nil && m.LocalSsrc != nil { 1223 | return *m.LocalSsrc 1224 | } 1225 | return 0 1226 | } 1227 | 1228 | type LossBasedBweUpdate struct { 1229 | // required - Bandwidth estimate (in bps) after the update. 1230 | BitrateBps *int32 `protobuf:"varint,1,opt,name=bitrate_bps,json=bitrateBps" json:"bitrate_bps,omitempty"` 1231 | // required - Fraction of lost packets since last receiver report 1232 | // computed as floor( 256 * (#lost_packets / #total_packets) ). 1233 | // The possible values range from 0 to 255. 1234 | FractionLoss *uint32 `protobuf:"varint,2,opt,name=fraction_loss,json=fractionLoss" json:"fraction_loss,omitempty"` 1235 | // TODO(terelius): Is this really needed? Remove or make optional? 1236 | // required - Total number of packets that the BWE update is based on. 1237 | TotalPackets *int32 `protobuf:"varint,3,opt,name=total_packets,json=totalPackets" json:"total_packets,omitempty"` 1238 | XXX_unrecognized []byte `json:"-"` 1239 | } 1240 | 1241 | func (m *LossBasedBweUpdate) Reset() { *m = LossBasedBweUpdate{} } 1242 | func (m *LossBasedBweUpdate) String() string { return proto.CompactTextString(m) } 1243 | func (*LossBasedBweUpdate) ProtoMessage() {} 1244 | func (*LossBasedBweUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } 1245 | 1246 | func (m *LossBasedBweUpdate) GetBitrateBps() int32 { 1247 | if m != nil && m.BitrateBps != nil { 1248 | return *m.BitrateBps 1249 | } 1250 | return 0 1251 | } 1252 | 1253 | func (m *LossBasedBweUpdate) GetFractionLoss() uint32 { 1254 | if m != nil && m.FractionLoss != nil { 1255 | return *m.FractionLoss 1256 | } 1257 | return 0 1258 | } 1259 | 1260 | func (m *LossBasedBweUpdate) GetTotalPackets() int32 { 1261 | if m != nil && m.TotalPackets != nil { 1262 | return *m.TotalPackets 1263 | } 1264 | return 0 1265 | } 1266 | 1267 | type DelayBasedBweUpdate struct { 1268 | // required - Bandwidth estimate (in bps) after the update. 1269 | BitrateBps *int32 `protobuf:"varint,1,opt,name=bitrate_bps,json=bitrateBps" json:"bitrate_bps,omitempty"` 1270 | // required - The state of the overuse detector. 1271 | DetectorState *DelayBasedBweUpdate_DetectorState `protobuf:"varint,2,opt,name=detector_state,json=detectorState,enum=webrtc.rtclog.DelayBasedBweUpdate_DetectorState" json:"detector_state,omitempty"` 1272 | XXX_unrecognized []byte `json:"-"` 1273 | } 1274 | 1275 | func (m *DelayBasedBweUpdate) Reset() { *m = DelayBasedBweUpdate{} } 1276 | func (m *DelayBasedBweUpdate) String() string { return proto.CompactTextString(m) } 1277 | func (*DelayBasedBweUpdate) ProtoMessage() {} 1278 | func (*DelayBasedBweUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } 1279 | 1280 | func (m *DelayBasedBweUpdate) GetBitrateBps() int32 { 1281 | if m != nil && m.BitrateBps != nil { 1282 | return *m.BitrateBps 1283 | } 1284 | return 0 1285 | } 1286 | 1287 | func (m *DelayBasedBweUpdate) GetDetectorState() DelayBasedBweUpdate_DetectorState { 1288 | if m != nil && m.DetectorState != nil { 1289 | return *m.DetectorState 1290 | } 1291 | return DelayBasedBweUpdate_BWE_NORMAL 1292 | } 1293 | 1294 | // TODO(terelius): Video and audio streams could in principle share SSRC, 1295 | // so identifying a stream based only on SSRC might not work. 1296 | // It might be better to use a combination of SSRC and media type 1297 | // or SSRC and port number, but for now we will rely on SSRC only. 1298 | type VideoReceiveConfig struct { 1299 | // required - Synchronization source (stream identifier) to be received. 1300 | RemoteSsrc *uint32 `protobuf:"varint,1,opt,name=remote_ssrc,json=remoteSsrc" json:"remote_ssrc,omitempty"` 1301 | // required - Sender SSRC used for sending RTCP (such as receiver reports). 1302 | LocalSsrc *uint32 `protobuf:"varint,2,opt,name=local_ssrc,json=localSsrc" json:"local_ssrc,omitempty"` 1303 | // required - RTCP mode to use. 1304 | RtcpMode *VideoReceiveConfig_RtcpMode `protobuf:"varint,3,opt,name=rtcp_mode,json=rtcpMode,enum=webrtc.rtclog.VideoReceiveConfig_RtcpMode" json:"rtcp_mode,omitempty"` 1305 | // required - Receiver estimated maximum bandwidth. 1306 | Remb *bool `protobuf:"varint,4,opt,name=remb" json:"remb,omitempty"` 1307 | // Map from video RTP payload type -> RTX config. 1308 | RtxMap []*RtxMap `protobuf:"bytes,5,rep,name=rtx_map,json=rtxMap" json:"rtx_map,omitempty"` 1309 | // RTP header extensions used for the received stream. 1310 | HeaderExtensions []*RtpHeaderExtension `protobuf:"bytes,6,rep,name=header_extensions,json=headerExtensions" json:"header_extensions,omitempty"` 1311 | // List of decoders associated with the stream. 1312 | Decoders []*DecoderConfig `protobuf:"bytes,7,rep,name=decoders" json:"decoders,omitempty"` 1313 | XXX_unrecognized []byte `json:"-"` 1314 | } 1315 | 1316 | func (m *VideoReceiveConfig) Reset() { *m = VideoReceiveConfig{} } 1317 | func (m *VideoReceiveConfig) String() string { return proto.CompactTextString(m) } 1318 | func (*VideoReceiveConfig) ProtoMessage() {} 1319 | func (*VideoReceiveConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } 1320 | 1321 | func (m *VideoReceiveConfig) GetRemoteSsrc() uint32 { 1322 | if m != nil && m.RemoteSsrc != nil { 1323 | return *m.RemoteSsrc 1324 | } 1325 | return 0 1326 | } 1327 | 1328 | func (m *VideoReceiveConfig) GetLocalSsrc() uint32 { 1329 | if m != nil && m.LocalSsrc != nil { 1330 | return *m.LocalSsrc 1331 | } 1332 | return 0 1333 | } 1334 | 1335 | func (m *VideoReceiveConfig) GetRtcpMode() VideoReceiveConfig_RtcpMode { 1336 | if m != nil && m.RtcpMode != nil { 1337 | return *m.RtcpMode 1338 | } 1339 | return VideoReceiveConfig_RTCP_COMPOUND 1340 | } 1341 | 1342 | func (m *VideoReceiveConfig) GetRemb() bool { 1343 | if m != nil && m.Remb != nil { 1344 | return *m.Remb 1345 | } 1346 | return false 1347 | } 1348 | 1349 | func (m *VideoReceiveConfig) GetRtxMap() []*RtxMap { 1350 | if m != nil { 1351 | return m.RtxMap 1352 | } 1353 | return nil 1354 | } 1355 | 1356 | func (m *VideoReceiveConfig) GetHeaderExtensions() []*RtpHeaderExtension { 1357 | if m != nil { 1358 | return m.HeaderExtensions 1359 | } 1360 | return nil 1361 | } 1362 | 1363 | func (m *VideoReceiveConfig) GetDecoders() []*DecoderConfig { 1364 | if m != nil { 1365 | return m.Decoders 1366 | } 1367 | return nil 1368 | } 1369 | 1370 | // Maps decoder names to payload types. 1371 | type DecoderConfig struct { 1372 | // required 1373 | Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` 1374 | // required 1375 | PayloadType *int32 `protobuf:"varint,2,opt,name=payload_type,json=payloadType" json:"payload_type,omitempty"` 1376 | XXX_unrecognized []byte `json:"-"` 1377 | } 1378 | 1379 | func (m *DecoderConfig) Reset() { *m = DecoderConfig{} } 1380 | func (m *DecoderConfig) String() string { return proto.CompactTextString(m) } 1381 | func (*DecoderConfig) ProtoMessage() {} 1382 | func (*DecoderConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } 1383 | 1384 | func (m *DecoderConfig) GetName() string { 1385 | if m != nil && m.Name != nil { 1386 | return *m.Name 1387 | } 1388 | return "" 1389 | } 1390 | 1391 | func (m *DecoderConfig) GetPayloadType() int32 { 1392 | if m != nil && m.PayloadType != nil { 1393 | return *m.PayloadType 1394 | } 1395 | return 0 1396 | } 1397 | 1398 | // Maps RTP header extension names to numerical IDs. 1399 | type RtpHeaderExtension struct { 1400 | // required 1401 | Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` 1402 | // required 1403 | Id *int32 `protobuf:"varint,2,opt,name=id" json:"id,omitempty"` 1404 | XXX_unrecognized []byte `json:"-"` 1405 | } 1406 | 1407 | func (m *RtpHeaderExtension) Reset() { *m = RtpHeaderExtension{} } 1408 | func (m *RtpHeaderExtension) String() string { return proto.CompactTextString(m) } 1409 | func (*RtpHeaderExtension) ProtoMessage() {} 1410 | func (*RtpHeaderExtension) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } 1411 | 1412 | func (m *RtpHeaderExtension) GetName() string { 1413 | if m != nil && m.Name != nil { 1414 | return *m.Name 1415 | } 1416 | return "" 1417 | } 1418 | 1419 | func (m *RtpHeaderExtension) GetId() int32 { 1420 | if m != nil && m.Id != nil { 1421 | return *m.Id 1422 | } 1423 | return 0 1424 | } 1425 | 1426 | // RTX settings for incoming video payloads that may be received. 1427 | // RTX is disabled if there's no config present. 1428 | type RtxConfig struct { 1429 | // required - SSRC to use for the RTX stream. 1430 | RtxSsrc *uint32 `protobuf:"varint,1,opt,name=rtx_ssrc,json=rtxSsrc" json:"rtx_ssrc,omitempty"` 1431 | // required - Payload type to use for the RTX stream. 1432 | RtxPayloadType *int32 `protobuf:"varint,2,opt,name=rtx_payload_type,json=rtxPayloadType" json:"rtx_payload_type,omitempty"` 1433 | XXX_unrecognized []byte `json:"-"` 1434 | } 1435 | 1436 | func (m *RtxConfig) Reset() { *m = RtxConfig{} } 1437 | func (m *RtxConfig) String() string { return proto.CompactTextString(m) } 1438 | func (*RtxConfig) ProtoMessage() {} 1439 | func (*RtxConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } 1440 | 1441 | func (m *RtxConfig) GetRtxSsrc() uint32 { 1442 | if m != nil && m.RtxSsrc != nil { 1443 | return *m.RtxSsrc 1444 | } 1445 | return 0 1446 | } 1447 | 1448 | func (m *RtxConfig) GetRtxPayloadType() int32 { 1449 | if m != nil && m.RtxPayloadType != nil { 1450 | return *m.RtxPayloadType 1451 | } 1452 | return 0 1453 | } 1454 | 1455 | type RtxMap struct { 1456 | // required 1457 | PayloadType *int32 `protobuf:"varint,1,opt,name=payload_type,json=payloadType" json:"payload_type,omitempty"` 1458 | // required 1459 | Config *RtxConfig `protobuf:"bytes,2,opt,name=config" json:"config,omitempty"` 1460 | XXX_unrecognized []byte `json:"-"` 1461 | } 1462 | 1463 | func (m *RtxMap) Reset() { *m = RtxMap{} } 1464 | func (m *RtxMap) String() string { return proto.CompactTextString(m) } 1465 | func (*RtxMap) ProtoMessage() {} 1466 | func (*RtxMap) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } 1467 | 1468 | func (m *RtxMap) GetPayloadType() int32 { 1469 | if m != nil && m.PayloadType != nil { 1470 | return *m.PayloadType 1471 | } 1472 | return 0 1473 | } 1474 | 1475 | func (m *RtxMap) GetConfig() *RtxConfig { 1476 | if m != nil { 1477 | return m.Config 1478 | } 1479 | return nil 1480 | } 1481 | 1482 | type VideoSendConfig struct { 1483 | // Synchronization source (stream identifier) for outgoing stream. 1484 | // One stream can have several ssrcs for e.g. simulcast. 1485 | // At least one ssrc is required. 1486 | Ssrcs []uint32 `protobuf:"varint,1,rep,name=ssrcs" json:"ssrcs,omitempty"` 1487 | // RTP header extensions used for the outgoing stream. 1488 | HeaderExtensions []*RtpHeaderExtension `protobuf:"bytes,2,rep,name=header_extensions,json=headerExtensions" json:"header_extensions,omitempty"` 1489 | // List of SSRCs for retransmitted packets. 1490 | RtxSsrcs []uint32 `protobuf:"varint,3,rep,name=rtx_ssrcs,json=rtxSsrcs" json:"rtx_ssrcs,omitempty"` 1491 | // required if rtx_ssrcs is used - Payload type for retransmitted packets. 1492 | RtxPayloadType *int32 `protobuf:"varint,4,opt,name=rtx_payload_type,json=rtxPayloadType" json:"rtx_payload_type,omitempty"` 1493 | // required - Encoder associated with the stream. 1494 | Encoder *EncoderConfig `protobuf:"bytes,5,opt,name=encoder" json:"encoder,omitempty"` 1495 | XXX_unrecognized []byte `json:"-"` 1496 | } 1497 | 1498 | func (m *VideoSendConfig) Reset() { *m = VideoSendConfig{} } 1499 | func (m *VideoSendConfig) String() string { return proto.CompactTextString(m) } 1500 | func (*VideoSendConfig) ProtoMessage() {} 1501 | func (*VideoSendConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } 1502 | 1503 | func (m *VideoSendConfig) GetSsrcs() []uint32 { 1504 | if m != nil { 1505 | return m.Ssrcs 1506 | } 1507 | return nil 1508 | } 1509 | 1510 | func (m *VideoSendConfig) GetHeaderExtensions() []*RtpHeaderExtension { 1511 | if m != nil { 1512 | return m.HeaderExtensions 1513 | } 1514 | return nil 1515 | } 1516 | 1517 | func (m *VideoSendConfig) GetRtxSsrcs() []uint32 { 1518 | if m != nil { 1519 | return m.RtxSsrcs 1520 | } 1521 | return nil 1522 | } 1523 | 1524 | func (m *VideoSendConfig) GetRtxPayloadType() int32 { 1525 | if m != nil && m.RtxPayloadType != nil { 1526 | return *m.RtxPayloadType 1527 | } 1528 | return 0 1529 | } 1530 | 1531 | func (m *VideoSendConfig) GetEncoder() *EncoderConfig { 1532 | if m != nil { 1533 | return m.Encoder 1534 | } 1535 | return nil 1536 | } 1537 | 1538 | // Maps encoder names to payload types. 1539 | type EncoderConfig struct { 1540 | // required 1541 | Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` 1542 | // required 1543 | PayloadType *int32 `protobuf:"varint,2,opt,name=payload_type,json=payloadType" json:"payload_type,omitempty"` 1544 | XXX_unrecognized []byte `json:"-"` 1545 | } 1546 | 1547 | func (m *EncoderConfig) Reset() { *m = EncoderConfig{} } 1548 | func (m *EncoderConfig) String() string { return proto.CompactTextString(m) } 1549 | func (*EncoderConfig) ProtoMessage() {} 1550 | func (*EncoderConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } 1551 | 1552 | func (m *EncoderConfig) GetName() string { 1553 | if m != nil && m.Name != nil { 1554 | return *m.Name 1555 | } 1556 | return "" 1557 | } 1558 | 1559 | func (m *EncoderConfig) GetPayloadType() int32 { 1560 | if m != nil && m.PayloadType != nil { 1561 | return *m.PayloadType 1562 | } 1563 | return 0 1564 | } 1565 | 1566 | type AudioReceiveConfig struct { 1567 | // required - Synchronization source (stream identifier) to be received. 1568 | RemoteSsrc *uint32 `protobuf:"varint,1,opt,name=remote_ssrc,json=remoteSsrc" json:"remote_ssrc,omitempty"` 1569 | // required - Sender SSRC used for sending RTCP (such as receiver reports). 1570 | LocalSsrc *uint32 `protobuf:"varint,2,opt,name=local_ssrc,json=localSsrc" json:"local_ssrc,omitempty"` 1571 | // RTP header extensions used for the received audio stream. 1572 | HeaderExtensions []*RtpHeaderExtension `protobuf:"bytes,3,rep,name=header_extensions,json=headerExtensions" json:"header_extensions,omitempty"` 1573 | XXX_unrecognized []byte `json:"-"` 1574 | } 1575 | 1576 | func (m *AudioReceiveConfig) Reset() { *m = AudioReceiveConfig{} } 1577 | func (m *AudioReceiveConfig) String() string { return proto.CompactTextString(m) } 1578 | func (*AudioReceiveConfig) ProtoMessage() {} 1579 | func (*AudioReceiveConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } 1580 | 1581 | func (m *AudioReceiveConfig) GetRemoteSsrc() uint32 { 1582 | if m != nil && m.RemoteSsrc != nil { 1583 | return *m.RemoteSsrc 1584 | } 1585 | return 0 1586 | } 1587 | 1588 | func (m *AudioReceiveConfig) GetLocalSsrc() uint32 { 1589 | if m != nil && m.LocalSsrc != nil { 1590 | return *m.LocalSsrc 1591 | } 1592 | return 0 1593 | } 1594 | 1595 | func (m *AudioReceiveConfig) GetHeaderExtensions() []*RtpHeaderExtension { 1596 | if m != nil { 1597 | return m.HeaderExtensions 1598 | } 1599 | return nil 1600 | } 1601 | 1602 | type AudioSendConfig struct { 1603 | // required - Synchronization source (stream identifier) for outgoing stream. 1604 | Ssrc *uint32 `protobuf:"varint,1,opt,name=ssrc" json:"ssrc,omitempty"` 1605 | // RTP header extensions used for the outgoing audio stream. 1606 | HeaderExtensions []*RtpHeaderExtension `protobuf:"bytes,2,rep,name=header_extensions,json=headerExtensions" json:"header_extensions,omitempty"` 1607 | XXX_unrecognized []byte `json:"-"` 1608 | } 1609 | 1610 | func (m *AudioSendConfig) Reset() { *m = AudioSendConfig{} } 1611 | func (m *AudioSendConfig) String() string { return proto.CompactTextString(m) } 1612 | func (*AudioSendConfig) ProtoMessage() {} 1613 | func (*AudioSendConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } 1614 | 1615 | func (m *AudioSendConfig) GetSsrc() uint32 { 1616 | if m != nil && m.Ssrc != nil { 1617 | return *m.Ssrc 1618 | } 1619 | return 0 1620 | } 1621 | 1622 | func (m *AudioSendConfig) GetHeaderExtensions() []*RtpHeaderExtension { 1623 | if m != nil { 1624 | return m.HeaderExtensions 1625 | } 1626 | return nil 1627 | } 1628 | 1629 | type AudioNetworkAdaptation struct { 1630 | // Bit rate that the audio encoder is operating at. 1631 | BitrateBps *int32 `protobuf:"varint,1,opt,name=bitrate_bps,json=bitrateBps" json:"bitrate_bps,omitempty"` 1632 | // Frame length that each encoded audio packet consists of. 1633 | FrameLengthMs *int32 `protobuf:"varint,2,opt,name=frame_length_ms,json=frameLengthMs" json:"frame_length_ms,omitempty"` 1634 | // Packet loss fraction that the encoder's forward error correction (FEC) is 1635 | // optimized for. 1636 | UplinkPacketLossFraction *float32 `protobuf:"fixed32,3,opt,name=uplink_packet_loss_fraction,json=uplinkPacketLossFraction" json:"uplink_packet_loss_fraction,omitempty"` 1637 | // Whether forward error correction (FEC) is turned on or off. 1638 | EnableFec *bool `protobuf:"varint,4,opt,name=enable_fec,json=enableFec" json:"enable_fec,omitempty"` 1639 | // Whether discontinuous transmission (DTX) is turned on or off. 1640 | EnableDtx *bool `protobuf:"varint,5,opt,name=enable_dtx,json=enableDtx" json:"enable_dtx,omitempty"` 1641 | // Number of audio channels that each encoded packet consists of. 1642 | NumChannels *uint32 `protobuf:"varint,6,opt,name=num_channels,json=numChannels" json:"num_channels,omitempty"` 1643 | XXX_unrecognized []byte `json:"-"` 1644 | } 1645 | 1646 | func (m *AudioNetworkAdaptation) Reset() { *m = AudioNetworkAdaptation{} } 1647 | func (m *AudioNetworkAdaptation) String() string { return proto.CompactTextString(m) } 1648 | func (*AudioNetworkAdaptation) ProtoMessage() {} 1649 | func (*AudioNetworkAdaptation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } 1650 | 1651 | func (m *AudioNetworkAdaptation) GetBitrateBps() int32 { 1652 | if m != nil && m.BitrateBps != nil { 1653 | return *m.BitrateBps 1654 | } 1655 | return 0 1656 | } 1657 | 1658 | func (m *AudioNetworkAdaptation) GetFrameLengthMs() int32 { 1659 | if m != nil && m.FrameLengthMs != nil { 1660 | return *m.FrameLengthMs 1661 | } 1662 | return 0 1663 | } 1664 | 1665 | func (m *AudioNetworkAdaptation) GetUplinkPacketLossFraction() float32 { 1666 | if m != nil && m.UplinkPacketLossFraction != nil { 1667 | return *m.UplinkPacketLossFraction 1668 | } 1669 | return 0 1670 | } 1671 | 1672 | func (m *AudioNetworkAdaptation) GetEnableFec() bool { 1673 | if m != nil && m.EnableFec != nil { 1674 | return *m.EnableFec 1675 | } 1676 | return false 1677 | } 1678 | 1679 | func (m *AudioNetworkAdaptation) GetEnableDtx() bool { 1680 | if m != nil && m.EnableDtx != nil { 1681 | return *m.EnableDtx 1682 | } 1683 | return false 1684 | } 1685 | 1686 | func (m *AudioNetworkAdaptation) GetNumChannels() uint32 { 1687 | if m != nil && m.NumChannels != nil { 1688 | return *m.NumChannels 1689 | } 1690 | return 0 1691 | } 1692 | 1693 | type BweProbeCluster struct { 1694 | // required - The id of this probe cluster. 1695 | Id *int32 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"` 1696 | // required - The bitrate in bps that this probe cluster is meant to probe. 1697 | BitrateBps *int32 `protobuf:"varint,2,opt,name=bitrate_bps,json=bitrateBps" json:"bitrate_bps,omitempty"` 1698 | // required - The minimum number of packets used to probe the given bitrate. 1699 | MinPackets *uint32 `protobuf:"varint,3,opt,name=min_packets,json=minPackets" json:"min_packets,omitempty"` 1700 | // required - The minimum number of bytes used to probe the given bitrate. 1701 | MinBytes *uint32 `protobuf:"varint,4,opt,name=min_bytes,json=minBytes" json:"min_bytes,omitempty"` 1702 | XXX_unrecognized []byte `json:"-"` 1703 | } 1704 | 1705 | func (m *BweProbeCluster) Reset() { *m = BweProbeCluster{} } 1706 | func (m *BweProbeCluster) String() string { return proto.CompactTextString(m) } 1707 | func (*BweProbeCluster) ProtoMessage() {} 1708 | func (*BweProbeCluster) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } 1709 | 1710 | func (m *BweProbeCluster) GetId() int32 { 1711 | if m != nil && m.Id != nil { 1712 | return *m.Id 1713 | } 1714 | return 0 1715 | } 1716 | 1717 | func (m *BweProbeCluster) GetBitrateBps() int32 { 1718 | if m != nil && m.BitrateBps != nil { 1719 | return *m.BitrateBps 1720 | } 1721 | return 0 1722 | } 1723 | 1724 | func (m *BweProbeCluster) GetMinPackets() uint32 { 1725 | if m != nil && m.MinPackets != nil { 1726 | return *m.MinPackets 1727 | } 1728 | return 0 1729 | } 1730 | 1731 | func (m *BweProbeCluster) GetMinBytes() uint32 { 1732 | if m != nil && m.MinBytes != nil { 1733 | return *m.MinBytes 1734 | } 1735 | return 0 1736 | } 1737 | 1738 | type BweProbeResult struct { 1739 | // required - The id of this probe cluster. 1740 | Id *int32 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"` 1741 | // required - The result of this probing attempt. 1742 | Result *BweProbeResult_ResultType `protobuf:"varint,2,opt,name=result,enum=webrtc.rtclog.BweProbeResult_ResultType" json:"result,omitempty"` 1743 | // optional - but required if result == SUCCESS. The resulting bitrate in bps. 1744 | BitrateBps *int32 `protobuf:"varint,3,opt,name=bitrate_bps,json=bitrateBps" json:"bitrate_bps,omitempty"` 1745 | XXX_unrecognized []byte `json:"-"` 1746 | } 1747 | 1748 | func (m *BweProbeResult) Reset() { *m = BweProbeResult{} } 1749 | func (m *BweProbeResult) String() string { return proto.CompactTextString(m) } 1750 | func (*BweProbeResult) ProtoMessage() {} 1751 | func (*BweProbeResult) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } 1752 | 1753 | func (m *BweProbeResult) GetId() int32 { 1754 | if m != nil && m.Id != nil { 1755 | return *m.Id 1756 | } 1757 | return 0 1758 | } 1759 | 1760 | func (m *BweProbeResult) GetResult() BweProbeResult_ResultType { 1761 | if m != nil && m.Result != nil { 1762 | return *m.Result 1763 | } 1764 | return BweProbeResult_SUCCESS 1765 | } 1766 | 1767 | func (m *BweProbeResult) GetBitrateBps() int32 { 1768 | if m != nil && m.BitrateBps != nil { 1769 | return *m.BitrateBps 1770 | } 1771 | return 0 1772 | } 1773 | 1774 | type AlrState struct { 1775 | // required - If we are in ALR or not. 1776 | InAlr *bool `protobuf:"varint,1,opt,name=in_alr,json=inAlr" json:"in_alr,omitempty"` 1777 | XXX_unrecognized []byte `json:"-"` 1778 | } 1779 | 1780 | func (m *AlrState) Reset() { *m = AlrState{} } 1781 | func (m *AlrState) String() string { return proto.CompactTextString(m) } 1782 | func (*AlrState) ProtoMessage() {} 1783 | func (*AlrState) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } 1784 | 1785 | func (m *AlrState) GetInAlr() bool { 1786 | if m != nil && m.InAlr != nil { 1787 | return *m.InAlr 1788 | } 1789 | return false 1790 | } 1791 | 1792 | type IceCandidatePairConfig struct { 1793 | // required 1794 | ConfigType *IceCandidatePairConfig_IceCandidatePairConfigType `protobuf:"varint,1,opt,name=config_type,json=configType,enum=webrtc.rtclog.IceCandidatePairConfig_IceCandidatePairConfigType" json:"config_type,omitempty"` 1795 | // required 1796 | CandidatePairId *uint32 `protobuf:"varint,2,opt,name=candidate_pair_id,json=candidatePairId" json:"candidate_pair_id,omitempty"` 1797 | // required 1798 | LocalCandidateType *IceCandidatePairConfig_IceCandidateType `protobuf:"varint,3,opt,name=local_candidate_type,json=localCandidateType,enum=webrtc.rtclog.IceCandidatePairConfig_IceCandidateType" json:"local_candidate_type,omitempty"` 1799 | // required 1800 | LocalRelayProtocol *IceCandidatePairConfig_Protocol `protobuf:"varint,4,opt,name=local_relay_protocol,json=localRelayProtocol,enum=webrtc.rtclog.IceCandidatePairConfig_Protocol" json:"local_relay_protocol,omitempty"` 1801 | // required 1802 | LocalNetworkType *IceCandidatePairConfig_NetworkType `protobuf:"varint,5,opt,name=local_network_type,json=localNetworkType,enum=webrtc.rtclog.IceCandidatePairConfig_NetworkType" json:"local_network_type,omitempty"` 1803 | // required 1804 | LocalAddressFamily *IceCandidatePairConfig_AddressFamily `protobuf:"varint,6,opt,name=local_address_family,json=localAddressFamily,enum=webrtc.rtclog.IceCandidatePairConfig_AddressFamily" json:"local_address_family,omitempty"` 1805 | // required 1806 | RemoteCandidateType *IceCandidatePairConfig_IceCandidateType `protobuf:"varint,7,opt,name=remote_candidate_type,json=remoteCandidateType,enum=webrtc.rtclog.IceCandidatePairConfig_IceCandidateType" json:"remote_candidate_type,omitempty"` 1807 | // required 1808 | RemoteAddressFamily *IceCandidatePairConfig_AddressFamily `protobuf:"varint,8,opt,name=remote_address_family,json=remoteAddressFamily,enum=webrtc.rtclog.IceCandidatePairConfig_AddressFamily" json:"remote_address_family,omitempty"` 1809 | // required 1810 | CandidatePairProtocol *IceCandidatePairConfig_Protocol `protobuf:"varint,9,opt,name=candidate_pair_protocol,json=candidatePairProtocol,enum=webrtc.rtclog.IceCandidatePairConfig_Protocol" json:"candidate_pair_protocol,omitempty"` 1811 | XXX_unrecognized []byte `json:"-"` 1812 | } 1813 | 1814 | func (m *IceCandidatePairConfig) Reset() { *m = IceCandidatePairConfig{} } 1815 | func (m *IceCandidatePairConfig) String() string { return proto.CompactTextString(m) } 1816 | func (*IceCandidatePairConfig) ProtoMessage() {} 1817 | func (*IceCandidatePairConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } 1818 | 1819 | func (m *IceCandidatePairConfig) GetConfigType() IceCandidatePairConfig_IceCandidatePairConfigType { 1820 | if m != nil && m.ConfigType != nil { 1821 | return *m.ConfigType 1822 | } 1823 | return IceCandidatePairConfig_ADDED 1824 | } 1825 | 1826 | func (m *IceCandidatePairConfig) GetCandidatePairId() uint32 { 1827 | if m != nil && m.CandidatePairId != nil { 1828 | return *m.CandidatePairId 1829 | } 1830 | return 0 1831 | } 1832 | 1833 | func (m *IceCandidatePairConfig) GetLocalCandidateType() IceCandidatePairConfig_IceCandidateType { 1834 | if m != nil && m.LocalCandidateType != nil { 1835 | return *m.LocalCandidateType 1836 | } 1837 | return IceCandidatePairConfig_LOCAL 1838 | } 1839 | 1840 | func (m *IceCandidatePairConfig) GetLocalRelayProtocol() IceCandidatePairConfig_Protocol { 1841 | if m != nil && m.LocalRelayProtocol != nil { 1842 | return *m.LocalRelayProtocol 1843 | } 1844 | return IceCandidatePairConfig_UDP 1845 | } 1846 | 1847 | func (m *IceCandidatePairConfig) GetLocalNetworkType() IceCandidatePairConfig_NetworkType { 1848 | if m != nil && m.LocalNetworkType != nil { 1849 | return *m.LocalNetworkType 1850 | } 1851 | return IceCandidatePairConfig_ETHERNET 1852 | } 1853 | 1854 | func (m *IceCandidatePairConfig) GetLocalAddressFamily() IceCandidatePairConfig_AddressFamily { 1855 | if m != nil && m.LocalAddressFamily != nil { 1856 | return *m.LocalAddressFamily 1857 | } 1858 | return IceCandidatePairConfig_IPV4 1859 | } 1860 | 1861 | func (m *IceCandidatePairConfig) GetRemoteCandidateType() IceCandidatePairConfig_IceCandidateType { 1862 | if m != nil && m.RemoteCandidateType != nil { 1863 | return *m.RemoteCandidateType 1864 | } 1865 | return IceCandidatePairConfig_LOCAL 1866 | } 1867 | 1868 | func (m *IceCandidatePairConfig) GetRemoteAddressFamily() IceCandidatePairConfig_AddressFamily { 1869 | if m != nil && m.RemoteAddressFamily != nil { 1870 | return *m.RemoteAddressFamily 1871 | } 1872 | return IceCandidatePairConfig_IPV4 1873 | } 1874 | 1875 | func (m *IceCandidatePairConfig) GetCandidatePairProtocol() IceCandidatePairConfig_Protocol { 1876 | if m != nil && m.CandidatePairProtocol != nil { 1877 | return *m.CandidatePairProtocol 1878 | } 1879 | return IceCandidatePairConfig_UDP 1880 | } 1881 | 1882 | type IceCandidatePairEvent struct { 1883 | // required 1884 | EventType *IceCandidatePairEvent_IceCandidatePairEventType `protobuf:"varint,1,opt,name=event_type,json=eventType,enum=webrtc.rtclog.IceCandidatePairEvent_IceCandidatePairEventType" json:"event_type,omitempty"` 1885 | // required 1886 | CandidatePairId *uint32 `protobuf:"varint,2,opt,name=candidate_pair_id,json=candidatePairId" json:"candidate_pair_id,omitempty"` 1887 | XXX_unrecognized []byte `json:"-"` 1888 | } 1889 | 1890 | func (m *IceCandidatePairEvent) Reset() { *m = IceCandidatePairEvent{} } 1891 | func (m *IceCandidatePairEvent) String() string { return proto.CompactTextString(m) } 1892 | func (*IceCandidatePairEvent) ProtoMessage() {} 1893 | func (*IceCandidatePairEvent) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } 1894 | 1895 | func (m *IceCandidatePairEvent) GetEventType() IceCandidatePairEvent_IceCandidatePairEventType { 1896 | if m != nil && m.EventType != nil { 1897 | return *m.EventType 1898 | } 1899 | return IceCandidatePairEvent_CHECK_SENT 1900 | } 1901 | 1902 | func (m *IceCandidatePairEvent) GetCandidatePairId() uint32 { 1903 | if m != nil && m.CandidatePairId != nil { 1904 | return *m.CandidatePairId 1905 | } 1906 | return 0 1907 | } 1908 | 1909 | func init() { 1910 | proto.RegisterType((*EventStream)(nil), "webrtc.rtclog.EventStream") 1911 | proto.RegisterType((*Event)(nil), "webrtc.rtclog.Event") 1912 | proto.RegisterType((*RtpPacket)(nil), "webrtc.rtclog.RtpPacket") 1913 | proto.RegisterType((*RtcpPacket)(nil), "webrtc.rtclog.RtcpPacket") 1914 | proto.RegisterType((*AudioPlayoutEvent)(nil), "webrtc.rtclog.AudioPlayoutEvent") 1915 | proto.RegisterType((*LossBasedBweUpdate)(nil), "webrtc.rtclog.LossBasedBweUpdate") 1916 | proto.RegisterType((*DelayBasedBweUpdate)(nil), "webrtc.rtclog.DelayBasedBweUpdate") 1917 | proto.RegisterType((*VideoReceiveConfig)(nil), "webrtc.rtclog.VideoReceiveConfig") 1918 | proto.RegisterType((*DecoderConfig)(nil), "webrtc.rtclog.DecoderConfig") 1919 | proto.RegisterType((*RtpHeaderExtension)(nil), "webrtc.rtclog.RtpHeaderExtension") 1920 | proto.RegisterType((*RtxConfig)(nil), "webrtc.rtclog.RtxConfig") 1921 | proto.RegisterType((*RtxMap)(nil), "webrtc.rtclog.RtxMap") 1922 | proto.RegisterType((*VideoSendConfig)(nil), "webrtc.rtclog.VideoSendConfig") 1923 | proto.RegisterType((*EncoderConfig)(nil), "webrtc.rtclog.EncoderConfig") 1924 | proto.RegisterType((*AudioReceiveConfig)(nil), "webrtc.rtclog.AudioReceiveConfig") 1925 | proto.RegisterType((*AudioSendConfig)(nil), "webrtc.rtclog.AudioSendConfig") 1926 | proto.RegisterType((*AudioNetworkAdaptation)(nil), "webrtc.rtclog.AudioNetworkAdaptation") 1927 | proto.RegisterType((*BweProbeCluster)(nil), "webrtc.rtclog.BweProbeCluster") 1928 | proto.RegisterType((*BweProbeResult)(nil), "webrtc.rtclog.BweProbeResult") 1929 | proto.RegisterType((*AlrState)(nil), "webrtc.rtclog.AlrState") 1930 | proto.RegisterType((*IceCandidatePairConfig)(nil), "webrtc.rtclog.IceCandidatePairConfig") 1931 | proto.RegisterType((*IceCandidatePairEvent)(nil), "webrtc.rtclog.IceCandidatePairEvent") 1932 | proto.RegisterEnum("webrtc.rtclog.MediaType", MediaType_name, MediaType_value) 1933 | proto.RegisterEnum("webrtc.rtclog.Event_EventType", Event_EventType_name, Event_EventType_value) 1934 | proto.RegisterEnum("webrtc.rtclog.DelayBasedBweUpdate_DetectorState", DelayBasedBweUpdate_DetectorState_name, DelayBasedBweUpdate_DetectorState_value) 1935 | proto.RegisterEnum("webrtc.rtclog.VideoReceiveConfig_RtcpMode", VideoReceiveConfig_RtcpMode_name, VideoReceiveConfig_RtcpMode_value) 1936 | proto.RegisterEnum("webrtc.rtclog.BweProbeResult_ResultType", BweProbeResult_ResultType_name, BweProbeResult_ResultType_value) 1937 | proto.RegisterEnum("webrtc.rtclog.IceCandidatePairConfig_IceCandidatePairConfigType", IceCandidatePairConfig_IceCandidatePairConfigType_name, IceCandidatePairConfig_IceCandidatePairConfigType_value) 1938 | proto.RegisterEnum("webrtc.rtclog.IceCandidatePairConfig_IceCandidateType", IceCandidatePairConfig_IceCandidateType_name, IceCandidatePairConfig_IceCandidateType_value) 1939 | proto.RegisterEnum("webrtc.rtclog.IceCandidatePairConfig_Protocol", IceCandidatePairConfig_Protocol_name, IceCandidatePairConfig_Protocol_value) 1940 | proto.RegisterEnum("webrtc.rtclog.IceCandidatePairConfig_AddressFamily", IceCandidatePairConfig_AddressFamily_name, IceCandidatePairConfig_AddressFamily_value) 1941 | proto.RegisterEnum("webrtc.rtclog.IceCandidatePairConfig_NetworkType", IceCandidatePairConfig_NetworkType_name, IceCandidatePairConfig_NetworkType_value) 1942 | proto.RegisterEnum("webrtc.rtclog.IceCandidatePairEvent_IceCandidatePairEventType", IceCandidatePairEvent_IceCandidatePairEventType_name, IceCandidatePairEvent_IceCandidatePairEventType_value) 1943 | } 1944 | 1945 | func init() { proto.RegisterFile("rtc_event_log.proto", fileDescriptor0) } 1946 | 1947 | var fileDescriptor0 = []byte{ 1948 | // 2329 bytes of a gzipped FileDescriptorProto 1949 | 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0xdd, 0x6e, 0xdb, 0xc8, 1950 | 0x15, 0x16, 0x25, 0xcb, 0x96, 0x8e, 0x2c, 0x99, 0x1e, 0x5b, 0x8e, 0x9c, 0x6c, 0xfe, 0xb8, 0x6d, 1951 | 0x61, 0x04, 0x85, 0x91, 0x7a, 0x17, 0xc1, 0x16, 0xfd, 0x5b, 0x4a, 0xa4, 0x63, 0x22, 0xb4, 0xc8, 1952 | 0x0e, 0x29, 0xbb, 0x2e, 0xb0, 0x60, 0x69, 0x72, 0xe2, 0xb0, 0x91, 0x48, 0x81, 0xa4, 0x12, 0x1b, 1953 | 0xbd, 0x68, 0xfb, 0x00, 0xbd, 0x2d, 0xd0, 0xbb, 0x5e, 0xf4, 0x41, 0xfa, 0x16, 0xbd, 0xed, 0x13, 1954 | 0xf4, 0xb2, 0xd7, 0xc5, 0xcc, 0x90, 0xb4, 0x7e, 0x98, 0x3a, 0x9b, 0xdd, 0x1b, 0x89, 0x73, 0xe6, 1955 | 0xcc, 0x37, 0xe7, 0x9c, 0x39, 0x73, 0x7e, 0x06, 0x76, 0xe2, 0xd4, 0x73, 0xc8, 0x3b, 0x12, 0xa6, 1956 | 0xce, 0x38, 0xba, 0x3a, 0x9c, 0xc6, 0x51, 0x1a, 0xa1, 0xf6, 0x7b, 0x72, 0x19, 0xa7, 0xde, 0x61, 1957 | 0x9c, 0x7a, 0xe3, 0xe8, 0x4a, 0xfa, 0x19, 0xb4, 0x54, 0xca, 0x61, 0xa5, 0x31, 0x71, 0x27, 0xe8, 1958 | 0xc7, 0xb0, 0x9e, 0xb0, 0xaf, 0x9e, 0xf0, 0xa4, 0x76, 0xd0, 0x3a, 0xda, 0x3d, 0x5c, 0x60, 0x3f, 1959 | 0x64, 0xbc, 0x38, 0xe3, 0x91, 0xfe, 0xd2, 0x81, 0x3a, 0xa3, 0xa0, 0xa7, 0xb0, 0x99, 0x06, 0x13, 1960 | 0x92, 0xa4, 0xee, 0x64, 0xea, 0xcc, 0x92, 0x9e, 0xf0, 0x44, 0x38, 0xa8, 0xe1, 0x56, 0x41, 0x1b, 1961 | 0x25, 0xe8, 0x08, 0xd6, 0xd2, 0x9b, 0x29, 0xe9, 0x55, 0x9f, 0x08, 0x07, 0x9d, 0xa3, 0x47, 0x65, 1962 | 0xc0, 0xfc, 0xd7, 0xbe, 0x99, 0x12, 0xcc, 0x78, 0xd1, 0x4f, 0x01, 0xe2, 0x74, 0xea, 0x4c, 0x5d, 1963 | 0xef, 0x2d, 0x49, 0x7b, 0xb5, 0x27, 0xc2, 0x41, 0xeb, 0xa8, 0xb7, 0xb4, 0x12, 0xa7, 0x53, 0x93, 1964 | 0xcd, 0x9f, 0x54, 0x70, 0x33, 0xce, 0x07, 0xe8, 0xe7, 0xd0, 0x8a, 0x53, 0xaf, 0x58, 0xbb, 0xc6, 1965 | 0xd6, 0xee, 0xaf, 0xac, 0xf5, 0x6e, 0x17, 0x43, 0x5c, 0x8c, 0x10, 0x86, 0x1d, 0x77, 0xe6, 0x07, 1966 | 0x91, 0x33, 0x1d, 0xbb, 0x37, 0xd1, 0x2c, 0xe5, 0x66, 0xec, 0xd5, 0x19, 0xca, 0x93, 0x25, 0x14, 1967 | 0x99, 0x72, 0x9a, 0x9c, 0x91, 0x69, 0x70, 0x52, 0xc1, 0xdb, 0xee, 0x32, 0x11, 0x9d, 0x41, 0x77, 1968 | 0x1c, 0x25, 0x89, 0x73, 0xe9, 0x26, 0xc4, 0x77, 0x2e, 0xdf, 0x13, 0x67, 0x36, 0xf5, 0xdd, 0x94, 1969 | 0xf4, 0xd6, 0x19, 0xea, 0xd3, 0x25, 0x54, 0x3d, 0x4a, 0x92, 0x3e, 0x65, 0xed, 0xbf, 0x27, 0x23, 1970 | 0xc6, 0x78, 0x52, 0xc1, 0x68, 0xbc, 0x42, 0x45, 0x17, 0xb0, 0xe7, 0x93, 0xb1, 0x7b, 0xb3, 0x0a, 1971 | 0xbc, 0xc1, 0x80, 0xa5, 0x25, 0x60, 0x85, 0x32, 0xaf, 0x20, 0xef, 0xf8, 0xab, 0x64, 0x74, 0x0e, 1972 | 0xdd, 0x77, 0x81, 0x4f, 0x22, 0x27, 0x26, 0x1e, 0x09, 0xde, 0x91, 0xd8, 0xf1, 0xa2, 0xf0, 0x75, 1973 | 0x70, 0xd5, 0x6b, 0x94, 0x8a, 0x7c, 0x46, 0x79, 0x31, 0x67, 0x1d, 0x30, 0x46, 0x0a, 0xfc, 0x6e, 1974 | 0x8e, 0x1a, 0x73, 0x32, 0x32, 0x81, 0x93, 0x9d, 0x84, 0x84, 0xfe, 0x2d, 0x6c, 0x93, 0xc1, 0x3e, 1975 | 0x2a, 0x83, 0xb5, 0x48, 0xe8, 0x17, 0x98, 0xdb, 0xef, 0x72, 0x52, 0x81, 0x78, 0x0e, 0x5d, 0x7e, 1976 | 0x62, 0xcb, 0xa2, 0x42, 0xa9, 0xa8, 0xec, 0xcc, 0x56, 0x44, 0x75, 0xe7, 0xa8, 0x73, 0xa2, 0x72, 1977 | 0xe0, 0x45, 0x51, 0x5b, 0xa5, 0xa2, 0x32, 0xd8, 0x45, 0x51, 0xdd, 0x9c, 0x54, 0x20, 0xba, 0xd0, 1978 | 0xe3, 0x88, 0x21, 0x49, 0xdf, 0x47, 0xf1, 0x5b, 0xc7, 0xf5, 0xdd, 0x69, 0xea, 0xa6, 0x41, 0x14, 1979 | 0xf6, 0x44, 0x06, 0xfb, 0xc3, 0x32, 0xd8, 0x21, 0xe7, 0x96, 0x0b, 0xe6, 0x93, 0x0a, 0xde, 0x73, 1980 | 0x4b, 0x67, 0x90, 0x0a, 0xed, 0x69, 0x1c, 0x5d, 0x12, 0xc7, 0x1b, 0xcf, 0x92, 0x94, 0xc4, 0xbd, 1981 | 0xed, 0x52, 0x71, 0xfb, 0xef, 0x89, 0x49, 0xd9, 0x06, 0x9c, 0xeb, 0xa4, 0x82, 0x37, 0xa7, 0x73, 1982 | 0x63, 0xd4, 0x07, 0x3e, 0x76, 0x62, 0x92, 0xcc, 0xc6, 0x69, 0x0f, 0x31, 0x94, 0x87, 0x1f, 0x40, 1983 | 0xc1, 0x8c, 0xe9, 0xa4, 0x82, 0x5b, 0xd3, 0xdb, 0x21, 0x7a, 0x01, 0x4d, 0x77, 0x1c, 0x3b, 0x49, 1984 | 0x4a, 0x3d, 0x72, 0x87, 0x01, 0xdc, 0x5b, 0x56, 0x6f, 0x1c, 0x5b, 0x29, 0x77, 0xc3, 0x86, 0x9b, 1985 | 0x7d, 0xa3, 0x4b, 0xd8, 0x0f, 0x3c, 0xe2, 0x78, 0x6e, 0xe8, 0x07, 0xd4, 0x19, 0x9d, 0xa9, 0x1b, 1986 | 0x14, 0xd6, 0xdf, 0x2d, 0x35, 0x93, 0xe6, 0x91, 0x41, 0xce, 0x6e, 0xba, 0x41, 0x5c, 0x1c, 0xc2, 1987 | 0x5e, 0x50, 0x3a, 0x83, 0x1c, 0xe8, 0x95, 0xec, 0xc1, 0xef, 0x7a, 0x97, 0x6d, 0xf1, 0x83, 0x3b, 1988 | 0xb6, 0xc8, 0xef, 0x7b, 0x37, 0x28, 0x9b, 0x90, 0xfe, 0x5d, 0x83, 0x66, 0x11, 0xd4, 0xd0, 0x36, 1989 | 0xb4, 0x47, 0xc3, 0x57, 0x43, 0xe3, 0x7c, 0xe8, 0xa8, 0x67, 0xea, 0xd0, 0x16, 0x2b, 0xa8, 0x0d, 1990 | 0x4d, 0xdd, 0x78, 0xe9, 0x58, 0xb6, 0x8c, 0x6d, 0x51, 0x40, 0x2d, 0xd8, 0xa0, 0x43, 0x75, 0xa8, 1991 | 0x88, 0x55, 0x3a, 0x87, 0x6d, 0x33, 0x63, 0xad, 0xa1, 0x0e, 0x00, 0xb6, 0x07, 0xf9, 0x78, 0x0d, 1992 | 0xdd, 0x83, 0x1d, 0x79, 0xa4, 0x68, 0x86, 0x63, 0xea, 0xf2, 0x85, 0x31, 0xb2, 0xb3, 0x89, 0x3a, 1993 | 0xda, 0x87, 0xae, 0x6e, 0x58, 0x96, 0xd3, 0x97, 0x2d, 0x55, 0x71, 0xfa, 0xe7, 0xaa, 0x33, 0x32, 1994 | 0x15, 0xd9, 0x56, 0xc5, 0x75, 0x74, 0x1f, 0xf6, 0x14, 0x55, 0x97, 0x2f, 0x56, 0xe7, 0x36, 0xd0, 1995 | 0x63, 0x78, 0x70, 0xa6, 0x29, 0xaa, 0xe1, 0x60, 0x75, 0xa0, 0x6a, 0x67, 0x2a, 0x76, 0x06, 0xc6, 1996 | 0xf0, 0x58, 0x7b, 0x99, 0xe1, 0x36, 0xd0, 0x43, 0xd8, 0xe7, 0x0c, 0x96, 0x3a, 0x54, 0x96, 0xa7, 1997 | 0x9b, 0x74, 0x3d, 0x97, 0xa7, 0x7c, 0x3d, 0xd0, 0xf5, 0x9c, 0xa1, 0x6c, 0x7d, 0x0b, 0x49, 0xf0, 1998 | 0x88, 0x4f, 0x0f, 0x55, 0xfb, 0xdc, 0xc0, 0xaf, 0x1c, 0x59, 0x91, 0x4d, 0x5b, 0xb6, 0x35, 0x23, 1999 | 0x37, 0x97, 0x88, 0x3e, 0x87, 0xc7, 0x54, 0x66, 0x13, 0x1b, 0x7d, 0xd5, 0x19, 0xe8, 0x23, 0xcb, 2000 | 0xa6, 0x38, 0x58, 0x95, 0x6d, 0x55, 0xc9, 0x98, 0xb6, 0xa9, 0x92, 0xb7, 0x4c, 0x58, 0xb5, 0x46, 2001 | 0x7a, 0x6e, 0x1b, 0x84, 0x76, 0x60, 0x4b, 0xd6, 0x31, 0xb5, 0xb7, 0xad, 0x66, 0xc4, 0x1d, 0x2a, 2002 | 0x98, 0x36, 0x50, 0x9d, 0x81, 0x3c, 0x54, 0x34, 0x6a, 0x0c, 0xc7, 0x94, 0xb5, 0x5c, 0x3c, 0x71, 2003 | 0x17, 0x7d, 0x06, 0xbd, 0x92, 0x69, 0xbe, 0xb8, 0xdb, 0x6f, 0xc2, 0x46, 0x32, 0xbb, 0xa4, 0xe9, 2004 | 0x4a, 0xfa, 0xa7, 0x00, 0xcd, 0x22, 0x1d, 0xa1, 0xfb, 0xd0, 0x08, 0x42, 0x2f, 0x9a, 0x04, 0xe1, 2005 | 0x15, 0xcb, 0x87, 0x0d, 0x5c, 0x8c, 0xd1, 0xf3, 0x85, 0x64, 0xb8, 0x9c, 0xd2, 0x4e, 0x89, 0x1f, 2006 | 0xb8, 0xd4, 0x63, 0xfa, 0xd5, 0x9e, 0x90, 0xa5, 0xc2, 0xcf, 0xa1, 0xcd, 0x53, 0x99, 0x33, 0x26, 2007 | 0xe1, 0x55, 0xfa, 0x86, 0x65, 0xc3, 0x36, 0xde, 0xe4, 0x44, 0x9d, 0xd1, 0xd0, 0x1e, 0xac, 0xbf, 2008 | 0x21, 0xae, 0x4f, 0x62, 0x96, 0xef, 0x36, 0x71, 0x36, 0x42, 0x07, 0x20, 0x2e, 0x84, 0x03, 0x27, 2009 | 0xf0, 0x59, 0x2e, 0xab, 0xe3, 0xce, 0xfc, 0x7d, 0xd7, 0x7c, 0xe9, 0x0f, 0x00, 0xb7, 0x49, 0xf1, 2010 | 0x7b, 0x56, 0xe1, 0x31, 0xb4, 0x32, 0x15, 0x7c, 0x37, 0x75, 0x99, 0x02, 0x9b, 0x18, 0x38, 0x49, 2011 | 0x71, 0x53, 0x57, 0x3a, 0x82, 0xed, 0x95, 0x5c, 0x8a, 0x1e, 0x02, 0x8c, 0x23, 0xcf, 0x1d, 0x3b, 2012 | 0x49, 0x12, 0x7b, 0x6c, 0xb7, 0x36, 0x6e, 0x32, 0x8a, 0x95, 0xc4, 0x9e, 0xf4, 0x47, 0x40, 0xab, 2013 | 0x99, 0x92, 0x6e, 0x75, 0x19, 0xa4, 0x31, 0xbd, 0xd2, 0x97, 0x53, 0x5e, 0x8e, 0xd4, 0x31, 0x64, 2014 | 0xa4, 0xfe, 0x34, 0xa1, 0xe6, 0x7c, 0x1d, 0xbb, 0x1e, 0x0d, 0x96, 0x0e, 0xcd, 0xa9, 0x19, 0xf0, 2015 | 0x66, 0x4e, 0xa4, 0x98, 0x94, 0x29, 0x8d, 0x52, 0x77, 0x9c, 0x15, 0x11, 0x09, 0x13, 0xb9, 0x8e, 2016 | 0x37, 0x19, 0x91, 0x9b, 0x28, 0x91, 0xfe, 0x25, 0xc0, 0x4e, 0x49, 0x4a, 0xbd, 0x5b, 0x84, 0x73, 2017 | 0xe8, 0xf8, 0x24, 0x25, 0x5e, 0x1a, 0xe5, 0xd1, 0x91, 0x9b, 0xf2, 0xf9, 0xdd, 0xf9, 0xfa, 0x50, 2018 | 0xc9, 0x16, 0xb2, 0x50, 0x89, 0xdb, 0xfe, 0xfc, 0x50, 0x3a, 0x86, 0xf6, 0xc2, 0x3c, 0x8d, 0x1c, 2019 | 0xf4, 0x42, 0x0c, 0x0d, 0x7c, 0x2a, 0xeb, 0x62, 0x05, 0x21, 0xe8, 0xb0, 0x9b, 0x4f, 0x6f, 0xe1, 2020 | 0xc8, 0xd2, 0x86, 0x2f, 0x45, 0x81, 0xc6, 0x26, 0x4a, 0x33, 0xce, 0x72, 0x52, 0x55, 0xfa, 0x7b, 2021 | 0x0d, 0xd0, 0x6a, 0x4a, 0xa7, 0x8a, 0xc5, 0x64, 0x12, 0xa5, 0x84, 0x9f, 0x88, 0xc0, 0x0c, 0x07, 2022 | 0x9c, 0x44, 0x8f, 0xe4, 0x8e, 0x13, 0x43, 0x2f, 0xa1, 0xc9, 0x2a, 0xb3, 0x49, 0xe4, 0x13, 0x66, 2023 | 0xd1, 0xce, 0xd1, 0xb3, 0x3b, 0x0b, 0x09, 0x56, 0xaa, 0x9d, 0x46, 0x3e, 0xc1, 0x8d, 0x38, 0xfb, 2024 | 0x42, 0x08, 0xd6, 0x62, 0x32, 0xb9, 0x64, 0xbe, 0xde, 0xc0, 0xec, 0x1b, 0x1d, 0xc2, 0x46, 0x9c, 2025 | 0x5e, 0x3b, 0x13, 0x77, 0xda, 0xab, 0xb3, 0x0a, 0xb6, 0xbb, 0x52, 0xf2, 0x5d, 0x9f, 0xba, 0x53, 2026 | 0xbc, 0x1e, 0xb3, 0x7f, 0x34, 0x84, 0x6d, 0x7e, 0x47, 0x1c, 0x72, 0x9d, 0x92, 0x30, 0x09, 0xa2, 2027 | 0x30, 0xe9, 0xad, 0xb3, 0x95, 0x4f, 0x57, 0x0b, 0xcd, 0x13, 0xc6, 0xaa, 0xe6, 0x9c, 0x58, 0x7c, 2028 | 0xb3, 0x48, 0x48, 0xd0, 0x57, 0xd0, 0xf0, 0x89, 0x17, 0xf9, 0x24, 0x4e, 0x7a, 0x1b, 0x0c, 0xe6, 2029 | 0xb3, 0x95, 0xe3, 0x64, 0xd3, 0x5c, 0x2d, 0x5c, 0x70, 0x4b, 0x5f, 0x40, 0x23, 0xd7, 0x91, 0x1e, 2030 | 0x06, 0x0b, 0xf5, 0x03, 0xe3, 0xd4, 0x34, 0x46, 0x43, 0x45, 0x14, 0xd0, 0x2e, 0x88, 0x8c, 0x84, 2031 | 0x55, 0x65, 0x34, 0x50, 0x15, 0x4b, 0xfb, 0xad, 0x2a, 0x56, 0xf9, 0x51, 0xcf, 0xe1, 0x51, 0x9b, 2032 | 0x84, 0xee, 0x84, 0xb0, 0x53, 0x69, 0x62, 0xf6, 0x4d, 0x8b, 0xf3, 0xa9, 0x7b, 0x33, 0x8e, 0x5c, 2033 | 0xdf, 0x29, 0x6e, 0x6c, 0x1d, 0xb7, 0x32, 0x1a, 0xbd, 0xa4, 0xd2, 0x57, 0x80, 0x56, 0xd5, 0x2b, 2034 | 0x05, 0xeb, 0x40, 0x35, 0xf0, 0x33, 0x88, 0x6a, 0xe0, 0x4b, 0x26, 0x0d, 0x79, 0xd7, 0xd9, 0xee, 2035 | 0xfb, 0xd0, 0xa0, 0xd6, 0x9f, 0xf3, 0x0b, 0x7a, 0x1a, 0xec, 0xd4, 0x0f, 0x40, 0xa4, 0x53, 0x25, 2036 | 0x82, 0x74, 0xe2, 0xf4, 0xda, 0x9c, 0x93, 0xe5, 0x1b, 0x58, 0xe7, 0x87, 0xb4, 0x22, 0xb8, 0xb0, 2037 | 0x22, 0x38, 0x7a, 0x0e, 0xeb, 0x59, 0x49, 0x50, 0xfd, 0x40, 0x77, 0x90, 0xc9, 0x86, 0x33, 0x3e, 2038 | 0xe9, 0xbf, 0x02, 0x6c, 0x2d, 0x55, 0x94, 0x68, 0x17, 0xea, 0x54, 0xe6, 0x84, 0x75, 0x3d, 0x6d, 2039 | 0xcc, 0x07, 0xe5, 0xbe, 0x51, 0xfd, 0x74, 0xdf, 0x78, 0x40, 0x1d, 0x9f, 0x5b, 0x87, 0x86, 0x12, 2040 | 0xba, 0x53, 0x23, 0x33, 0x4f, 0x52, 0x6a, 0x9f, 0xb5, 0x32, 0xfb, 0xa0, 0x17, 0xb0, 0x41, 0x42, 2041 | 0x76, 0xe6, 0x59, 0x3f, 0xb2, 0xec, 0x61, 0x6a, 0x38, 0xef, 0x61, 0x39, 0x33, 0xf5, 0x95, 0x85, 2042 | 0x99, 0x4f, 0xf5, 0x95, 0x7f, 0x08, 0x80, 0x56, 0xcb, 0xe7, 0xef, 0x1c, 0x16, 0x4a, 0xad, 0x5d, 2043 | 0xfb, 0x64, 0x6b, 0x4b, 0x33, 0xd8, 0x5a, 0xaa, 0xc6, 0xa9, 0xc2, 0x73, 0xb2, 0xb1, 0xef, 0xef, 2044 | 0xfb, 0x90, 0xa5, 0x3f, 0x57, 0x61, 0xaf, 0xbc, 0x5c, 0xbf, 0x3b, 0x23, 0xfc, 0x08, 0xb6, 0x5e, 2045 | 0xc7, 0xee, 0x84, 0x64, 0x29, 0xde, 0x99, 0x24, 0x99, 0xfd, 0xdb, 0x8c, 0xcc, 0x93, 0xfc, 0x69, 2046 | 0x82, 0x7e, 0x01, 0x0f, 0x66, 0xd3, 0x71, 0x10, 0xbe, 0x75, 0xf2, 0x92, 0x80, 0xf6, 0x95, 0x79, 2047 | 0xea, 0x62, 0x31, 0xb5, 0x8a, 0x7b, 0x9c, 0x85, 0xa7, 0x29, 0x9a, 0xce, 0x8e, 0xb3, 0x79, 0x7a, 2048 | 0x10, 0x24, 0x74, 0x2f, 0xc7, 0xc4, 0x79, 0x4d, 0xbc, 0x2c, 0x7a, 0x36, 0x39, 0xe5, 0x98, 0x78, 2049 | 0x73, 0xd3, 0x7e, 0x7a, 0xcd, 0x5c, 0xac, 0x98, 0x56, 0xd2, 0x6b, 0xea, 0x21, 0xe1, 0x6c, 0xe2, 2050 | 0x78, 0x6f, 0xdc, 0x30, 0x24, 0xe3, 0x84, 0x75, 0xaf, 0x6d, 0xdc, 0x0a, 0x67, 0x93, 0x41, 0x46, 2051 | 0x92, 0xfe, 0x24, 0xc0, 0xd6, 0x52, 0x6b, 0x91, 0xc5, 0x0d, 0x21, 0x8f, 0x1b, 0xcb, 0xc6, 0xa8, 2052 | 0xae, 0x18, 0xe3, 0x31, 0xb4, 0x26, 0x41, 0xb8, 0x90, 0x7a, 0xdb, 0x18, 0x26, 0x41, 0x98, 0x25, 2053 | 0x5e, 0x7a, 0x9d, 0x28, 0xc3, 0xe5, 0x4d, 0x4a, 0x12, 0xa6, 0x45, 0x1b, 0x37, 0x26, 0x41, 0xd8, 2054 | 0xa7, 0x63, 0xe9, 0x3f, 0x02, 0x74, 0x16, 0xfb, 0x92, 0x15, 0x09, 0xbe, 0x86, 0xf5, 0xac, 0xad, 2055 | 0xe1, 0x79, 0xf7, 0xe0, 0xff, 0xb6, 0x35, 0x87, 0xfc, 0x8f, 0x3d, 0x4e, 0x64, 0xeb, 0x96, 0x75, 2056 | 0xa8, 0x2d, 0xeb, 0x20, 0x05, 0x00, 0xb7, 0xcb, 0x68, 0x71, 0x6f, 0x8d, 0x06, 0x03, 0xd5, 0xb2, 2057 | 0xc4, 0x0a, 0x7a, 0x0a, 0x0f, 0xb5, 0xe1, 0x99, 0xac, 0x6b, 0x0a, 0x2b, 0x87, 0xf3, 0xa2, 0xd9, 2058 | 0xd1, 0x86, 0xb6, 0x8a, 0xcf, 0x64, 0x5d, 0x14, 0xd0, 0x23, 0xb8, 0x5f, 0xca, 0x82, 0x69, 0x4d, 2059 | 0x2c, 0x56, 0x29, 0x9e, 0xad, 0x9d, 0xaa, 0xc6, 0xc8, 0x16, 0x6b, 0xd2, 0x53, 0x68, 0xe4, 0x6d, 2060 | 0x14, 0xea, 0xc2, 0x7a, 0x10, 0x3a, 0xee, 0x38, 0xce, 0x8a, 0xb6, 0x7a, 0x10, 0xca, 0xe3, 0x58, 2061 | 0xfa, 0x2b, 0xc0, 0x5e, 0x79, 0x8b, 0x84, 0x5c, 0x68, 0xf1, 0xf0, 0x78, 0x1b, 0x68, 0x3b, 0x47, 2062 | 0x5f, 0x7f, 0x54, 0x7b, 0xf5, 0x01, 0x32, 0x33, 0x14, 0x78, 0xc5, 0x37, 0x7a, 0x06, 0xdb, 0x4b, 2063 | 0x7d, 0x56, 0x96, 0x47, 0xda, 0x78, 0xcb, 0x9b, 0x5f, 0xaf, 0xf9, 0xe8, 0x0d, 0xec, 0xf2, 0x50, 2064 | 0x71, 0xbb, 0x82, 0xc9, 0xc5, 0xab, 0x85, 0x17, 0xdf, 0x5e, 0x2e, 0x26, 0x0d, 0x62, 0x98, 0x0b, 2065 | 0x34, 0xf4, 0xbb, 0x7c, 0xa7, 0x98, 0x3d, 0xa1, 0xb0, 0x37, 0x32, 0x2f, 0x1a, 0x33, 0x7f, 0xea, 2066 | 0x1c, 0x1d, 0x7e, 0xdc, 0x4e, 0x66, 0xb6, 0x2a, 0xdb, 0x01, 0x53, 0xa8, 0x9c, 0x86, 0x1c, 0xe0, 2067 | 0xd4, 0xa2, 0xdb, 0x67, 0x9a, 0xd4, 0x19, 0xfe, 0x4f, 0x3e, 0x0e, 0x3f, 0x0b, 0x25, 0x4c, 0x09, 2068 | 0x91, 0x81, 0xcd, 0x51, 0x10, 0xc9, 0x55, 0x70, 0x7d, 0x3f, 0x26, 0x34, 0x10, 0xb8, 0x93, 0x60, 2069 | 0x7c, 0xc3, 0x2e, 0x66, 0xe7, 0xe8, 0x8b, 0x8f, 0xdb, 0x42, 0xe6, 0x6b, 0x8f, 0xd9, 0xd2, 0x4c, 2070 | 0x8f, 0x05, 0x1a, 0xfa, 0x3d, 0x74, 0xb3, 0xf8, 0xbe, 0x74, 0x28, 0x1b, 0xdf, 0xe9, 0x50, 0x76, 2071 | 0x38, 0xe8, 0xe2, 0xa9, 0x5c, 0x15, 0x7b, 0x2d, 0xe9, 0xd4, 0xf8, 0x74, 0x9d, 0xb2, 0x8d, 0x16, 2072 | 0x95, 0x7a, 0x0d, 0xf7, 0x96, 0x9c, 0xb2, 0xf0, 0x80, 0xe6, 0x27, 0x79, 0x40, 0x77, 0xc1, 0x95, 2073 | 0x73, 0xb2, 0xf4, 0x6b, 0xb8, 0xff, 0xe1, 0x6b, 0x82, 0x9a, 0x50, 0x97, 0x15, 0x45, 0x55, 0xc4, 2074 | 0x0a, 0xbd, 0xd3, 0xbc, 0x21, 0xa7, 0x35, 0x5f, 0x1b, 0x9a, 0x8a, 0x6a, 0xd9, 0xd8, 0xb8, 0x50, 2075 | 0x15, 0xb1, 0x8a, 0x36, 0xa1, 0x61, 0xa9, 0xba, 0x3a, 0xa0, 0x93, 0x35, 0xe9, 0x02, 0xc4, 0x65, 2076 | 0x63, 0x52, 0x20, 0xdd, 0x18, 0xb0, 0x1a, 0xbf, 0x01, 0x6b, 0x96, 0x3d, 0x1a, 0x8a, 0x02, 0x25, 2077 | 0x9a, 0xf8, 0x58, 0xff, 0x8d, 0x58, 0xa5, 0x9f, 0x98, 0xb6, 0xff, 0x62, 0x8d, 0x36, 0xc9, 0xf9, 2078 | 0x5b, 0xc4, 0x6d, 0x63, 0x6b, 0x5f, 0x98, 0xaa, 0xb8, 0x26, 0xbd, 0x84, 0x46, 0xe1, 0xbe, 0x1b, 2079 | 0x50, 0x1b, 0x29, 0xa6, 0x58, 0xa1, 0x1f, 0xf6, 0xc0, 0x14, 0x05, 0x04, 0xb0, 0x6e, 0x59, 0x3a, 2080 | 0xfd, 0xae, 0x32, 0xa2, 0x6e, 0x89, 0x35, 0x5a, 0x9e, 0xe6, 0x70, 0x26, 0x36, 0x6c, 0x63, 0x60, 2081 | 0xe8, 0xe2, 0x9a, 0xf4, 0x2b, 0x68, 0x2f, 0xda, 0xbb, 0x01, 0x6b, 0x9a, 0x79, 0xf6, 0x25, 0x97, 2082 | 0x4f, 0x33, 0xcf, 0x5e, 0x88, 0xc2, 0xbc, 0x24, 0xb2, 0xa2, 0x60, 0xd5, 0xb2, 0x9c, 0x63, 0xf9, 2083 | 0x54, 0xd3, 0x2f, 0xc4, 0xaa, 0xe4, 0x43, 0x6b, 0xde, 0xd5, 0x37, 0xa1, 0xa1, 0xda, 0x27, 0x2a, 2084 | 0x1e, 0xaa, 0xb6, 0x58, 0xa1, 0x23, 0xdd, 0x30, 0xcc, 0xbe, 0x3c, 0x78, 0x25, 0x0a, 0x14, 0xf0, 2085 | 0x5c, 0x3b, 0xd6, 0xb8, 0x50, 0x67, 0xe6, 0x50, 0xac, 0x51, 0x86, 0x81, 0xaa, 0xeb, 0x23, 0x5d, 2086 | 0xc6, 0xe2, 0x1a, 0xea, 0xc1, 0x6e, 0xbe, 0x4f, 0xfe, 0xc2, 0xc0, 0xf4, 0xad, 0x4b, 0x7f, 0xab, 2087 | 0x42, 0xb7, 0xf4, 0x61, 0x07, 0x7d, 0x03, 0xc0, 0x1f, 0xd0, 0xe7, 0xc2, 0xe2, 0x2f, 0x3f, 0xe6, 2088 | 0x49, 0xa8, 0x9c, 0xca, 0x3c, 0xbe, 0x49, 0x8a, 0x07, 0xa1, 0x6f, 0x11, 0x13, 0xa5, 0x19, 0xec, 2089 | 0x7f, 0x10, 0x93, 0x76, 0x78, 0x83, 0x13, 0x75, 0xf0, 0x8a, 0x26, 0x0a, 0x9b, 0x77, 0x78, 0x7c, 2090 | 0x9c, 0xe5, 0x0c, 0xea, 0x4d, 0xf7, 0x60, 0x27, 0xa7, 0x59, 0xa6, 0x31, 0xb4, 0x54, 0xce, 0x5c, 2091 | 0x45, 0x0f, 0xe0, 0xde, 0xd2, 0x44, 0xb1, 0xaa, 0xf6, 0xec, 0x4b, 0x68, 0x16, 0xbd, 0x3c, 0xb5, 2092 | 0xac, 0x3c, 0xbc, 0x10, 0x2b, 0xcc, 0x63, 0x47, 0x8a, 0x66, 0x70, 0xf7, 0x62, 0xaf, 0x42, 0x62, 2093 | 0x95, 0x1e, 0x81, 0x22, 0xdb, 0xb2, 0x58, 0xeb, 0x57, 0x4f, 0x6a, 0xff, 0x0b, 0x00, 0x00, 0xff, 2094 | 0xff, 0x87, 0xc5, 0xe3, 0x1f, 0x7f, 0x18, 0x00, 0x00, 2095 | } 2096 | -------------------------------------------------------------------------------- /webrtc_rtclog/rtc_event_log.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | option optimize_for = LITE_RUNTIME; 3 | package webrtc.rtclog; 4 | 5 | enum MediaType { 6 | ANY = 0; 7 | AUDIO = 1; 8 | VIDEO = 2; 9 | DATA = 3; 10 | } 11 | 12 | // This is the main message to dump to a file, it can contain multiple event 13 | // messages, but it is possible to append multiple EventStreams (each with a 14 | // single event) to a file. 15 | // This has the benefit that there's no need to keep all data in memory. 16 | message EventStream { 17 | repeated Event stream = 1; 18 | } 19 | 20 | message Event { 21 | // required - Elapsed wallclock time in us since the start of the log. 22 | optional int64 timestamp_us = 1; 23 | 24 | // The different types of events that can occur, the UNKNOWN_EVENT entry 25 | // is added in case future EventTypes are added, in that case old code will 26 | // receive the new events as UNKNOWN_EVENT. 27 | enum EventType { 28 | UNKNOWN_EVENT = 0; 29 | LOG_START = 1; 30 | LOG_END = 2; 31 | RTP_EVENT = 3; 32 | RTCP_EVENT = 4; 33 | AUDIO_PLAYOUT_EVENT = 5; 34 | LOSS_BASED_BWE_UPDATE = 6; 35 | DELAY_BASED_BWE_UPDATE = 7; 36 | VIDEO_RECEIVER_CONFIG_EVENT = 8; 37 | VIDEO_SENDER_CONFIG_EVENT = 9; 38 | AUDIO_RECEIVER_CONFIG_EVENT = 10; 39 | AUDIO_SENDER_CONFIG_EVENT = 11; 40 | AUDIO_NETWORK_ADAPTATION_EVENT = 16; 41 | BWE_PROBE_CLUSTER_CREATED_EVENT = 17; 42 | BWE_PROBE_RESULT_EVENT = 18; 43 | ALR_STATE_EVENT = 19; 44 | ICE_CANDIDATE_PAIR_CONFIG = 20; 45 | ICE_CANDIDATE_PAIR_EVENT = 21; 46 | } 47 | 48 | // required - Indicates the type of this event 49 | optional EventType type = 2; 50 | 51 | oneof subtype { 52 | // required if type == RTP_EVENT 53 | RtpPacket rtp_packet = 3; 54 | 55 | // required if type == RTCP_EVENT 56 | RtcpPacket rtcp_packet = 4; 57 | 58 | // required if type == AUDIO_PLAYOUT_EVENT 59 | AudioPlayoutEvent audio_playout_event = 5; 60 | 61 | // required if type == LOSS_BASED_BWE_UPDATE 62 | LossBasedBweUpdate loss_based_bwe_update = 6; 63 | 64 | // required if type == DELAY_BASED_BWE_UPDATE 65 | DelayBasedBweUpdate delay_based_bwe_update = 7; 66 | 67 | // required if type == VIDEO_RECEIVER_CONFIG_EVENT 68 | VideoReceiveConfig video_receiver_config = 8; 69 | 70 | // required if type == VIDEO_SENDER_CONFIG_EVENT 71 | VideoSendConfig video_sender_config = 9; 72 | 73 | // required if type == AUDIO_RECEIVER_CONFIG_EVENT 74 | AudioReceiveConfig audio_receiver_config = 10; 75 | 76 | // required if type == AUDIO_SENDER_CONFIG_EVENT 77 | AudioSendConfig audio_sender_config = 11; 78 | 79 | // required if type == AUDIO_NETWORK_ADAPTATION_EVENT 80 | AudioNetworkAdaptation audio_network_adaptation = 16; 81 | 82 | // required if type == BWE_PROBE_CLUSTER_CREATED_EVENT 83 | BweProbeCluster probe_cluster = 17; 84 | 85 | // required if type == BWE_PROBE_RESULT_EVENT 86 | BweProbeResult probe_result = 18; 87 | 88 | // required if type == ALR_STATE_EVENT 89 | AlrState alr_state = 19; 90 | 91 | // required if type == ICE_CANDIDATE_PAIR_CONFIG 92 | IceCandidatePairConfig ice_candidate_pair_config = 20; 93 | 94 | // required if type == ICE_CANDIDATE_PAIR_EVENT 95 | IceCandidatePairEvent ice_candidate_pair_event = 21; 96 | } 97 | } 98 | 99 | message RtpPacket { 100 | // required - True if the packet is incoming w.r.t. the user logging the data 101 | optional bool incoming = 1; 102 | 103 | optional MediaType type = 2 [deprecated = true]; 104 | 105 | // required - The size of the packet including both payload and header. 106 | optional uint32 packet_length = 3; 107 | 108 | // required - The RTP header only. 109 | optional bytes header = 4; 110 | 111 | // optional - The probe cluster id. 112 | optional int32 probe_cluster_id = 5; 113 | 114 | // Do not add code to log user payload data without a privacy review! 115 | } 116 | 117 | message RtcpPacket { 118 | // required - True if the packet is incoming w.r.t. the user logging the data 119 | optional bool incoming = 1; 120 | 121 | optional MediaType type = 2 [deprecated = true]; 122 | 123 | // required - The whole packet including both payload and header. 124 | optional bytes packet_data = 3; 125 | } 126 | 127 | message AudioPlayoutEvent { 128 | // TODO(ivoc): Rename, we currently use the "remote" ssrc, i.e. identifying 129 | // the receive stream, while local_ssrc identifies the send stream, if any. 130 | // required - The SSRC of the audio stream associated with the playout event. 131 | optional uint32 local_ssrc = 2; 132 | } 133 | 134 | message LossBasedBweUpdate { 135 | // required - Bandwidth estimate (in bps) after the update. 136 | optional int32 bitrate_bps = 1; 137 | 138 | // required - Fraction of lost packets since last receiver report 139 | // computed as floor( 256 * (#lost_packets / #total_packets) ). 140 | // The possible values range from 0 to 255. 141 | optional uint32 fraction_loss = 2; 142 | 143 | // TODO(terelius): Is this really needed? Remove or make optional? 144 | // required - Total number of packets that the BWE update is based on. 145 | optional int32 total_packets = 3; 146 | } 147 | 148 | message DelayBasedBweUpdate { 149 | enum DetectorState { 150 | BWE_NORMAL = 0; 151 | BWE_UNDERUSING = 1; 152 | BWE_OVERUSING = 2; 153 | } 154 | 155 | // required - Bandwidth estimate (in bps) after the update. 156 | optional int32 bitrate_bps = 1; 157 | 158 | // required - The state of the overuse detector. 159 | optional DetectorState detector_state = 2; 160 | } 161 | 162 | // TODO(terelius): Video and audio streams could in principle share SSRC, 163 | // so identifying a stream based only on SSRC might not work. 164 | // It might be better to use a combination of SSRC and media type 165 | // or SSRC and port number, but for now we will rely on SSRC only. 166 | message VideoReceiveConfig { 167 | // required - Synchronization source (stream identifier) to be received. 168 | optional uint32 remote_ssrc = 1; 169 | // required - Sender SSRC used for sending RTCP (such as receiver reports). 170 | optional uint32 local_ssrc = 2; 171 | 172 | // Compound mode is described by RFC 4585 and reduced-size 173 | // RTCP mode is described by RFC 5506. 174 | enum RtcpMode { 175 | RTCP_COMPOUND = 1; 176 | RTCP_REDUCEDSIZE = 2; 177 | } 178 | // required - RTCP mode to use. 179 | optional RtcpMode rtcp_mode = 3; 180 | 181 | // required - Receiver estimated maximum bandwidth. 182 | optional bool remb = 4; 183 | 184 | // Map from video RTP payload type -> RTX config. 185 | repeated RtxMap rtx_map = 5; 186 | 187 | // RTP header extensions used for the received stream. 188 | repeated RtpHeaderExtension header_extensions = 6; 189 | 190 | // List of decoders associated with the stream. 191 | repeated DecoderConfig decoders = 7; 192 | } 193 | 194 | // Maps decoder names to payload types. 195 | message DecoderConfig { 196 | // required 197 | optional string name = 1; 198 | 199 | // required 200 | optional int32 payload_type = 2; 201 | } 202 | 203 | // Maps RTP header extension names to numerical IDs. 204 | message RtpHeaderExtension { 205 | // required 206 | optional string name = 1; 207 | 208 | // required 209 | optional int32 id = 2; 210 | } 211 | 212 | // RTX settings for incoming video payloads that may be received. 213 | // RTX is disabled if there's no config present. 214 | message RtxConfig { 215 | // required - SSRC to use for the RTX stream. 216 | optional uint32 rtx_ssrc = 1; 217 | 218 | // required - Payload type to use for the RTX stream. 219 | optional int32 rtx_payload_type = 2; 220 | } 221 | 222 | message RtxMap { 223 | // required 224 | optional int32 payload_type = 1; 225 | 226 | // required 227 | optional RtxConfig config = 2; 228 | } 229 | 230 | message VideoSendConfig { 231 | // Synchronization source (stream identifier) for outgoing stream. 232 | // One stream can have several ssrcs for e.g. simulcast. 233 | // At least one ssrc is required. 234 | repeated uint32 ssrcs = 1; 235 | 236 | // RTP header extensions used for the outgoing stream. 237 | repeated RtpHeaderExtension header_extensions = 2; 238 | 239 | // List of SSRCs for retransmitted packets. 240 | repeated uint32 rtx_ssrcs = 3; 241 | 242 | // required if rtx_ssrcs is used - Payload type for retransmitted packets. 243 | optional int32 rtx_payload_type = 4; 244 | 245 | // required - Encoder associated with the stream. 246 | optional EncoderConfig encoder = 5; 247 | } 248 | 249 | // Maps encoder names to payload types. 250 | message EncoderConfig { 251 | // required 252 | optional string name = 1; 253 | 254 | // required 255 | optional int32 payload_type = 2; 256 | } 257 | 258 | message AudioReceiveConfig { 259 | // required - Synchronization source (stream identifier) to be received. 260 | optional uint32 remote_ssrc = 1; 261 | 262 | // required - Sender SSRC used for sending RTCP (such as receiver reports). 263 | optional uint32 local_ssrc = 2; 264 | 265 | // RTP header extensions used for the received audio stream. 266 | repeated RtpHeaderExtension header_extensions = 3; 267 | } 268 | 269 | message AudioSendConfig { 270 | // required - Synchronization source (stream identifier) for outgoing stream. 271 | optional uint32 ssrc = 1; 272 | 273 | // RTP header extensions used for the outgoing audio stream. 274 | repeated RtpHeaderExtension header_extensions = 2; 275 | } 276 | 277 | message AudioNetworkAdaptation { 278 | // Bit rate that the audio encoder is operating at. 279 | optional int32 bitrate_bps = 1; 280 | 281 | // Frame length that each encoded audio packet consists of. 282 | optional int32 frame_length_ms = 2; 283 | 284 | // Packet loss fraction that the encoder's forward error correction (FEC) is 285 | // optimized for. 286 | optional float uplink_packet_loss_fraction = 3; 287 | 288 | // Whether forward error correction (FEC) is turned on or off. 289 | optional bool enable_fec = 4; 290 | 291 | // Whether discontinuous transmission (DTX) is turned on or off. 292 | optional bool enable_dtx = 5; 293 | 294 | // Number of audio channels that each encoded packet consists of. 295 | optional uint32 num_channels = 6; 296 | } 297 | 298 | message BweProbeCluster { 299 | // required - The id of this probe cluster. 300 | optional int32 id = 1; 301 | 302 | // required - The bitrate in bps that this probe cluster is meant to probe. 303 | optional int32 bitrate_bps = 2; 304 | 305 | // required - The minimum number of packets used to probe the given bitrate. 306 | optional uint32 min_packets = 3; 307 | 308 | // required - The minimum number of bytes used to probe the given bitrate. 309 | optional uint32 min_bytes = 4; 310 | } 311 | 312 | message BweProbeResult { 313 | // required - The id of this probe cluster. 314 | optional int32 id = 1; 315 | 316 | enum ResultType { 317 | SUCCESS = 0; 318 | INVALID_SEND_RECEIVE_INTERVAL = 1; 319 | INVALID_SEND_RECEIVE_RATIO = 2; 320 | TIMEOUT = 3; 321 | } 322 | 323 | // required - The result of this probing attempt. 324 | optional ResultType result = 2; 325 | 326 | // optional - but required if result == SUCCESS. The resulting bitrate in bps. 327 | optional int32 bitrate_bps = 3; 328 | } 329 | 330 | message AlrState { 331 | // required - If we are in ALR or not. 332 | optional bool in_alr = 1; 333 | } 334 | 335 | message IceCandidatePairConfig { 336 | enum IceCandidatePairConfigType { 337 | ADDED = 0; 338 | UPDATED = 1; 339 | DESTROYED = 2; 340 | SELECTED = 3; 341 | } 342 | 343 | enum IceCandidateType { 344 | LOCAL = 0; 345 | STUN = 1; 346 | PRFLX = 2; 347 | RELAY = 3; 348 | UNKNOWN_CANDIDATE_TYPE = 4; 349 | } 350 | 351 | enum Protocol { 352 | UDP = 0; 353 | TCP = 1; 354 | SSLTCP = 2; 355 | TLS = 3; 356 | UNKNOWN_PROTOCOL = 4; 357 | } 358 | 359 | enum AddressFamily { 360 | IPV4 = 0; 361 | IPV6 = 1; 362 | UNKNOWN_ADDRESS_FAMILY = 2; 363 | } 364 | 365 | enum NetworkType { 366 | ETHERNET = 0; 367 | LOOPBACK = 1; 368 | WIFI = 2; 369 | VPN = 3; 370 | CELLULAR = 4; 371 | UNKNOWN_NETWORK_TYPE = 5; 372 | } 373 | 374 | // required 375 | optional IceCandidatePairConfigType config_type = 1; 376 | 377 | // required 378 | optional uint32 candidate_pair_id = 2; 379 | 380 | // required 381 | optional IceCandidateType local_candidate_type = 3; 382 | 383 | // required 384 | optional Protocol local_relay_protocol = 4; 385 | 386 | // required 387 | optional NetworkType local_network_type = 5; 388 | 389 | // required 390 | optional AddressFamily local_address_family = 6; 391 | 392 | // required 393 | optional IceCandidateType remote_candidate_type = 7; 394 | 395 | // required 396 | optional AddressFamily remote_address_family = 8; 397 | 398 | // required 399 | optional Protocol candidate_pair_protocol = 9; 400 | } 401 | 402 | message IceCandidatePairEvent { 403 | enum IceCandidatePairEventType { 404 | CHECK_SENT = 0; 405 | CHECK_RECEIVED = 1; 406 | CHECK_RESPONSE_SENT = 2; 407 | CHECK_RESPONSE_RECEIVED = 3; 408 | } 409 | 410 | // required 411 | optional IceCandidatePairEventType event_type = 1; 412 | 413 | // required 414 | optional uint32 candidate_pair_id = 2; 415 | } 416 | --------------------------------------------------------------------------------