mirror of
https://github.com/pion/mediadevices.git
synced 2025-09-27 21:02:17 +08:00
Compare commits
10 Commits
fork-merge
...
v0.3.4
Author | SHA1 | Date | |
---|---|---|---|
![]() |
5ba49e03e7 | ||
![]() |
1250e06923 | ||
![]() |
651c847674 | ||
![]() |
3b2316081e | ||
![]() |
70261260cb | ||
![]() |
548cdac668 | ||
![]() |
79f9fc31f6 | ||
![]() |
1f92ea40da | ||
![]() |
4beb7e5a23 | ||
![]() |
9bb5755cd2 |
12
.github/workflows/ci.yaml
vendored
12
.github/workflows/ci.yaml
vendored
@@ -17,9 +17,9 @@ jobs:
|
|||||||
name: Linux Go ${{ matrix.go }}
|
name: Linux Go ${{ matrix.go }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v2
|
uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: ${{ matrix.go }}
|
go-version: ${{ matrix.go }}
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
@@ -43,9 +43,9 @@ jobs:
|
|||||||
name: Darwin Go ${{ matrix.go }}
|
name: Darwin Go ${{ matrix.go }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v2
|
uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: ${{ matrix.go }}
|
go-version: ${{ matrix.go }}
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
@@ -62,9 +62,9 @@ jobs:
|
|||||||
name: Check Licenses
|
name: Check Licenses
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v2
|
uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: '1.16'
|
go-version: '1.16'
|
||||||
- name: Installing go-licenses
|
- name: Installing go-licenses
|
||||||
|
2
.github/workflows/renovate-go-mod-fix.yaml
vendored
2
.github/workflows/renovate-go-mod-fix.yaml
vendored
@@ -9,7 +9,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: checkout
|
- name: checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 2
|
fetch-depth: 2
|
||||||
- name: fix
|
- name: fix
|
||||||
|
10
.idea/mediadevices.iml
generated
10
.idea/mediadevices.iml
generated
@@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module type="JAVA_MODULE" version="4">
|
|
||||||
<component name="Go" enabled="true" />
|
|
||||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
|
||||||
<exclude-output />
|
|
||||||
<content url="file://$MODULE_DIR$" />
|
|
||||||
<orderEntry type="inheritedJdk" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
6
.idea/misc.xml
generated
6
.idea/misc.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectRootManager">
|
|
||||||
<output url="file://$PROJECT_DIR$/out" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
8
.idea/modules.xml
generated
8
.idea/modules.xml
generated
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectModuleManager">
|
|
||||||
<modules>
|
|
||||||
<module fileurl="file://$PROJECT_DIR$/.idea/mediadevices.iml" filepath="$PROJECT_DIR$/.idea/mediadevices.iml" />
|
|
||||||
</modules>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
6
.idea/vcs.xml
generated
6
.idea/vcs.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
63
.idea/workspace.xml
generated
63
.idea/workspace.xml
generated
@@ -1,63 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="AutoImportSettings">
|
|
||||||
<option name="autoReloadType" value="SELECTIVE" />
|
|
||||||
</component>
|
|
||||||
<component name="ChangeListManager">
|
|
||||||
<list default="true" id="8804a8cb-7b92-421b-8786-b7715667b867" name="Changes" comment="">
|
|
||||||
<change afterPath="$PROJECT_DIR$/.idea/mediadevices.iml" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/go.mod" beforeDir="false" afterPath="$PROJECT_DIR$/go.mod" afterDir="false" />
|
|
||||||
</list>
|
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
|
||||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
|
||||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
|
||||||
</component>
|
|
||||||
<component name="GOROOT" url="file:///usr/local/opt/go/libexec" />
|
|
||||||
<component name="Git.Settings">
|
|
||||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
|
||||||
</component>
|
|
||||||
<component name="GoLibraries">
|
|
||||||
<option name="indexEntireGoPath" value="false" />
|
|
||||||
</component>
|
|
||||||
<component name="KubernetesApiPersistence">
|
|
||||||
<option name="context" value="crane-nts-0" />
|
|
||||||
<option name="namespace" value="default" />
|
|
||||||
</component>
|
|
||||||
<component name="ProjectId" id="25msmAX4e3Virjg5KBrchpLrlbl" />
|
|
||||||
<component name="ProjectViewState">
|
|
||||||
<option name="autoscrollFromSource" value="true" />
|
|
||||||
<option name="autoscrollToSource" value="true" />
|
|
||||||
<option name="hideEmptyMiddlePackages" value="true" />
|
|
||||||
<option name="showLibraryContents" value="true" />
|
|
||||||
</component>
|
|
||||||
<component name="PropertiesComponent">
|
|
||||||
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
|
|
||||||
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
|
|
||||||
<property name="WebServerToolWindowFactoryState" value="false" />
|
|
||||||
<property name="go.formatter.settings.were.checked" value="true" />
|
|
||||||
<property name="go.import.settings.migrated" value="true" />
|
|
||||||
<property name="go.sdk.automatically.set" value="true" />
|
|
||||||
</component>
|
|
||||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
|
||||||
<component name="TaskManager">
|
|
||||||
<task active="true" id="Default" summary="Default task">
|
|
||||||
<changelist id="8804a8cb-7b92-421b-8786-b7715667b867" name="Changes" comment="" />
|
|
||||||
<created>1646143753802</created>
|
|
||||||
<option name="number" value="Default" />
|
|
||||||
<option name="presentableId" value="Default" />
|
|
||||||
<updated>1646143753802</updated>
|
|
||||||
<workItem from="1646143757180" duration="56000" />
|
|
||||||
</task>
|
|
||||||
<servers />
|
|
||||||
</component>
|
|
||||||
<component name="TypeScriptGeneratedFilesManager">
|
|
||||||
<option name="version" value="3" />
|
|
||||||
</component>
|
|
||||||
<component name="VgoProject">
|
|
||||||
<integration-enabled>true</integration-enabled>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
@@ -13,7 +13,6 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4
|
|||||||
github.com/gen2brain/malgo v0.10.29 h1:bTYiUTUKJsEomNby+W0hgyLrOttUXIk4lTEnKA54iqM=
|
github.com/gen2brain/malgo v0.10.29 h1:bTYiUTUKJsEomNby+W0hgyLrOttUXIk4lTEnKA54iqM=
|
||||||
github.com/gen2brain/malgo v0.10.29/go.mod h1:zHSUNZAXfCeNsZou0RtQ6Zk7gDYLIcKOrUWtAdksnEs=
|
github.com/gen2brain/malgo v0.10.29/go.mod h1:zHSUNZAXfCeNsZou0RtQ6Zk7gDYLIcKOrUWtAdksnEs=
|
||||||
github.com/gen2brain/shm v0.0.0-20200228170931-49f9650110c5/go.mod h1:uF6rMu/1nvu+5DpiRLwusA6xB8zlkNoGzKn8lmYONUo=
|
github.com/gen2brain/shm v0.0.0-20200228170931-49f9650110c5/go.mod h1:uF6rMu/1nvu+5DpiRLwusA6xB8zlkNoGzKn8lmYONUo=
|
||||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
|
||||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||||
@@ -22,7 +21,6 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU
|
|||||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
|
||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
@@ -38,19 +36,18 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
|||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk=
|
github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk=
|
||||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||||
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
|
||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||||
github.com/onsi/ginkgo v1.16.1/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E=
|
github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
||||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||||
github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg=
|
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
|
||||||
github.com/pion/datachannel v1.4.21 h1:3ZvhNyfmxsAqltQrApLPQMhSFNA+aT87RqyCq4OXmf0=
|
github.com/pion/datachannel v1.4.21 h1:3ZvhNyfmxsAqltQrApLPQMhSFNA+aT87RqyCq4OXmf0=
|
||||||
github.com/pion/datachannel v1.4.21/go.mod h1:oiNyP4gHx2DIwRzX/MFyH0Rz/Gz05OgBlayAI2hAWjg=
|
github.com/pion/datachannel v1.4.21/go.mod h1:oiNyP4gHx2DIwRzX/MFyH0Rz/Gz05OgBlayAI2hAWjg=
|
||||||
github.com/pion/dtls/v2 v2.0.9 h1:7Ow+V++YSZQMYzggI0P9vLJz/hUFcffsfGMfT/Qy+u8=
|
github.com/pion/dtls/v2 v2.0.8 h1:reGe8rNIMfO/UAeFLqO61tl64t154Qfkr4U3Gzu1tsg=
|
||||||
github.com/pion/dtls/v2 v2.0.9/go.mod h1:O0Wr7si/Zj5/EBFlDzDd6UtVxx25CE1r7XM7BQKYQho=
|
github.com/pion/dtls/v2 v2.0.8/go.mod h1:QuDII+8FVvk9Dp5t5vYIMTo7hh7uBkra+8QIm7QGm10=
|
||||||
github.com/pion/ice/v2 v2.1.7 h1:FjgDfUNrVYTxQabJrkBX6ld12tvYbgzHenqPh3PJF6E=
|
github.com/pion/ice/v2 v2.0.16 h1:K6bzD8ef9vMKbGMTHaUweHXEyuNGnvr2zdqKoLKZPn0=
|
||||||
github.com/pion/ice/v2 v2.1.7/go.mod h1:kV4EODVD5ux2z8XncbLHIOtcXKtYXVgLVCeVqnpoeP0=
|
github.com/pion/ice/v2 v2.0.16/go.mod h1:SJNJzC27gDZoOW0UoxIoC8Hf2PDxG28hQyNdSexDu38=
|
||||||
github.com/pion/interceptor v0.0.12 h1:eC1iVneBIAQJEfaNAfDqAncJWhMDAnaXPRCJsltdokE=
|
github.com/pion/interceptor v0.0.12 h1:eC1iVneBIAQJEfaNAfDqAncJWhMDAnaXPRCJsltdokE=
|
||||||
github.com/pion/interceptor v0.0.12/go.mod h1:qzeuWuD/ZXvPqOnxNcnhWfkCZ2e1kwwslicyyPnhoK4=
|
github.com/pion/interceptor v0.0.12/go.mod h1:qzeuWuD/ZXvPqOnxNcnhWfkCZ2e1kwwslicyyPnhoK4=
|
||||||
github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
|
github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
|
||||||
@@ -63,8 +60,6 @@ github.com/pion/rtcp v1.2.6 h1:1zvwBbyd0TeEuuWftrd/4d++m+/kZSeiguxU61LFWpo=
|
|||||||
github.com/pion/rtcp v1.2.6/go.mod h1:52rMNPWFsjr39z9B9MhnkqhPLoeHTv1aN63o/42bWE0=
|
github.com/pion/rtcp v1.2.6/go.mod h1:52rMNPWFsjr39z9B9MhnkqhPLoeHTv1aN63o/42bWE0=
|
||||||
github.com/pion/rtp v1.6.2 h1:iGBerLX6JiDjB9NXuaPzHyxHFG9JsIEdgwTC0lp5n/U=
|
github.com/pion/rtp v1.6.2 h1:iGBerLX6JiDjB9NXuaPzHyxHFG9JsIEdgwTC0lp5n/U=
|
||||||
github.com/pion/rtp v1.6.2/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko=
|
github.com/pion/rtp v1.6.2/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko=
|
||||||
github.com/pion/rtp v1.6.5 h1:o2cZf8OascA5HF/b0PAbTxRKvOWxTQxWYt7SlToxFGI=
|
|
||||||
github.com/pion/rtp v1.6.5/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko=
|
|
||||||
github.com/pion/sctp v1.7.10/go.mod h1:EhpTUQu1/lcK3xI+eriS6/96fWetHGCvBi9MSsnaBN0=
|
github.com/pion/sctp v1.7.10/go.mod h1:EhpTUQu1/lcK3xI+eriS6/96fWetHGCvBi9MSsnaBN0=
|
||||||
github.com/pion/sctp v1.7.12 h1:GsatLufywVruXbZZT1CKg+Jr8ZTkwiPnmUC/oO9+uuY=
|
github.com/pion/sctp v1.7.12 h1:GsatLufywVruXbZZT1CKg+Jr8ZTkwiPnmUC/oO9+uuY=
|
||||||
github.com/pion/sctp v1.7.12/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s=
|
github.com/pion/sctp v1.7.12/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s=
|
||||||
@@ -74,14 +69,17 @@ github.com/pion/srtp/v2 v2.0.2 h1:664iGzVmaY7KYS5M0gleY0DscRo9ReDfTxQrq4UgGoU=
|
|||||||
github.com/pion/srtp/v2 v2.0.2/go.mod h1:VEyLv4CuxrwGY8cxM+Ng3bmVy8ckz/1t6A0q/msKOw0=
|
github.com/pion/srtp/v2 v2.0.2/go.mod h1:VEyLv4CuxrwGY8cxM+Ng3bmVy8ckz/1t6A0q/msKOw0=
|
||||||
github.com/pion/stun v0.3.5 h1:uLUCBCkQby4S1cf6CGuR9QrVOKcvUwFeemaC865QHDg=
|
github.com/pion/stun v0.3.5 h1:uLUCBCkQby4S1cf6CGuR9QrVOKcvUwFeemaC865QHDg=
|
||||||
github.com/pion/stun v0.3.5/go.mod h1:gDMim+47EeEtfWogA37n6qXZS88L5V6LqFcf+DZA2UA=
|
github.com/pion/stun v0.3.5/go.mod h1:gDMim+47EeEtfWogA37n6qXZS88L5V6LqFcf+DZA2UA=
|
||||||
|
github.com/pion/transport v0.10.0/go.mod h1:BnHnUipd0rZQyTVB2SBGojFHT9CBt5C5TcsJSQGkvSE=
|
||||||
github.com/pion/transport v0.10.1/go.mod h1:PBis1stIILMiis0PewDw91WJeLJkyIMcEk+DwKOzf4A=
|
github.com/pion/transport v0.10.1/go.mod h1:PBis1stIILMiis0PewDw91WJeLJkyIMcEk+DwKOzf4A=
|
||||||
github.com/pion/transport v0.12.2/go.mod h1:N3+vZQD9HlDP5GWkZ85LohxNsDcNgofQmyL6ojX5d8Q=
|
github.com/pion/transport v0.12.2/go.mod h1:N3+vZQD9HlDP5GWkZ85LohxNsDcNgofQmyL6ojX5d8Q=
|
||||||
github.com/pion/transport v0.12.3 h1:vdBfvfU/0Wq8kd2yhUMSDB/x+O4Z9MYVl2fJ5BT4JZw=
|
github.com/pion/transport v0.12.3 h1:vdBfvfU/0Wq8kd2yhUMSDB/x+O4Z9MYVl2fJ5BT4JZw=
|
||||||
github.com/pion/transport v0.12.3/go.mod h1:OViWW9SP2peE/HbwBvARicmAVnesphkNkCVZIWJ6q9A=
|
github.com/pion/transport v0.12.3/go.mod h1:OViWW9SP2peE/HbwBvARicmAVnesphkNkCVZIWJ6q9A=
|
||||||
github.com/pion/turn/v2 v2.0.5 h1:iwMHqDfPEDEOFzwWKT56eFmh6DYC6o/+xnLAEzgISbA=
|
github.com/pion/turn/v2 v2.0.5 h1:iwMHqDfPEDEOFzwWKT56eFmh6DYC6o/+xnLAEzgISbA=
|
||||||
github.com/pion/turn/v2 v2.0.5/go.mod h1:APg43CFyt/14Uy7heYUOGWdkem/Wu4PhCO/bjyrTqMw=
|
github.com/pion/turn/v2 v2.0.5/go.mod h1:APg43CFyt/14Uy7heYUOGWdkem/Wu4PhCO/bjyrTqMw=
|
||||||
github.com/pion/udp v0.1.1 h1:8UAPvyqmsxK8oOjloDk4wUt63TzFe9WEJkg5lChlj7o=
|
github.com/pion/udp v0.1.0 h1:uGxQsNyrqG3GLINv36Ff60covYmfrLoxzwnCsIYspXI=
|
||||||
github.com/pion/udp v0.1.1/go.mod h1:6AFo+CMdKQm7UiA0eUPA8/eVCTx8jBIITLZHc9DWX5M=
|
github.com/pion/udp v0.1.0/go.mod h1:BPELIjbwE9PRbd/zxI/KYBnbo7B6+oA6YuEaNE8lths=
|
||||||
|
github.com/pion/webrtc/v3 v3.0.20 h1:Jj0sk45MqQdkR24E1wbFRmOzb1Lv258ot9zd2fYB/Pw=
|
||||||
|
github.com/pion/webrtc/v3 v3.0.20/go.mod h1:0eJnCpQrUMpRnvyonw4ZiWClToerpixrZ2KcoTxvX9M=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
@@ -92,32 +90,24 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
|
|||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
|
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY=
|
||||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||||
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
|
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
|
||||||
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb h1:fqpd0EBDzlHRCjiphRR5Zo/RSWWQlWv34418dnEixWk=
|
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb h1:fqpd0EBDzlHRCjiphRR5Zo/RSWWQlWv34418dnEixWk=
|
||||||
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20201201195509-5d6afe98e0b7/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201201195509-5d6afe98e0b7/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
|
||||||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4 h1:b0LrWgu8+q7z4J+0Y3Umo5q1dL7NXBkKBWkaVkAq17E=
|
||||||
golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
|
||||||
golang.org/x/net v0.0.0-20210420210106-798c2154c571 h1:Q6Bg8xzKzpFPU4Oi1sBnBTHBwlMsLeEXpu4hYBY8rAg=
|
|
||||||
golang.org/x/net v0.0.0-20210420210106-798c2154c571/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
|
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@@ -126,23 +116,19 @@ golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005 h1:pDMpM2zh2MT0kHy037cKlSby2nEhD50SYqwQk76Nm40=
|
||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe h1:WdX7u8s3yOigWAhHEaDl8r9G+4XwFQEQFtBMYyN+kXQ=
|
|
||||||
golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/term v0.0.0-20191110171634-ad39bd3f0407/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/term v0.0.0-20191110171634-ad39bd3f0407/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
@@ -161,6 +147,5 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD
|
|||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
11
go.mod
11
go.mod
@@ -2,17 +2,14 @@ module github.com/pion/mediadevices
|
|||||||
|
|
||||||
go 1.13
|
go 1.13
|
||||||
|
|
||||||
replace github.com/pion/webrtc/v3 => github.com/EmrysMyrddin/webrtc/v3 v3.1.25-0.20220301142221-d92d68ff068f
|
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/blackjack/webcam v0.0.0-20200313125108-10ed912a8539
|
github.com/blackjack/webcam v0.0.0-20220329180758-ba064708e165
|
||||||
github.com/gen2brain/malgo v0.10.35
|
github.com/gen2brain/malgo v0.10.35
|
||||||
github.com/google/uuid v1.3.0
|
github.com/google/uuid v1.3.0
|
||||||
github.com/kbinani/screenshot v0.0.0-20210720154843-7d3a670d8329
|
github.com/kbinani/screenshot v0.0.0-20210720154843-7d3a670d8329
|
||||||
github.com/pion/logging v0.2.2
|
github.com/pion/logging v0.2.2
|
||||||
github.com/pion/rtcp v1.2.9
|
github.com/pion/rtp v1.7.9
|
||||||
github.com/pion/rtp v1.7.4
|
github.com/pion/webrtc/v3 v3.1.27
|
||||||
github.com/pion/webrtc/v3 v3.1.10
|
golang.org/x/image v0.0.0-20220321031419-a8550c1d254a
|
||||||
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d
|
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
||||||
)
|
)
|
||||||
|
30
go.sum
30
go.sum
@@ -1,7 +1,5 @@
|
|||||||
github.com/EmrysMyrddin/webrtc/v3 v3.1.25-0.20220301142221-d92d68ff068f h1:o7MCxR85nZxyOgjkmjtnXHsmPmchX3AEbWb/Bgpy3aI=
|
github.com/blackjack/webcam v0.0.0-20220329180758-ba064708e165 h1:QsIbRyO2tn5eSJZ/skuDqSTo0GWI5H4G1AT7Mm2H0Nw=
|
||||||
github.com/EmrysMyrddin/webrtc/v3 v3.1.25-0.20220301142221-d92d68ff068f/go.mod h1:mO/yv7fBN3Lp7YNlnYcTj1jtpvNvssJG+7eh6itZ4xM=
|
github.com/blackjack/webcam v0.0.0-20220329180758-ba064708e165/go.mod h1:G0X+rEqYPWSq0dG8OMf8M446MtKytzpPjgS3HbdOJZ4=
|
||||||
github.com/blackjack/webcam v0.0.0-20200313125108-10ed912a8539 h1:1aIqYfg9s9RETAJHGfVKZW4ok0b22p4QTwk8MsdRtPs=
|
|
||||||
github.com/blackjack/webcam v0.0.0-20200313125108-10ed912a8539/go.mod h1:G0X+rEqYPWSq0dG8OMf8M446MtKytzpPjgS3HbdOJZ4=
|
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
@@ -51,13 +49,12 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y
|
|||||||
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
||||||
github.com/pion/datachannel v1.5.2 h1:piB93s8LGmbECrpO84DnkIVWasRMk3IimbcXkTQLE6E=
|
github.com/pion/datachannel v1.5.2 h1:piB93s8LGmbECrpO84DnkIVWasRMk3IimbcXkTQLE6E=
|
||||||
github.com/pion/datachannel v1.5.2/go.mod h1:FTGQWaHrdCwIJ1rw6xBIfZVkslikjShim5yr05XFuCQ=
|
github.com/pion/datachannel v1.5.2/go.mod h1:FTGQWaHrdCwIJ1rw6xBIfZVkslikjShim5yr05XFuCQ=
|
||||||
github.com/pion/dtls/v2 v2.1.2/go.mod h1:o6+WvyLDAlXF7YiPB/RlskRoeK+/JtuaZa5emwQcWus=
|
|
||||||
github.com/pion/dtls/v2 v2.1.3 h1:3UF7udADqous+M2R5Uo2q/YaP4EzUoWKdfX2oscCUio=
|
github.com/pion/dtls/v2 v2.1.3 h1:3UF7udADqous+M2R5Uo2q/YaP4EzUoWKdfX2oscCUio=
|
||||||
github.com/pion/dtls/v2 v2.1.3/go.mod h1:o6+WvyLDAlXF7YiPB/RlskRoeK+/JtuaZa5emwQcWus=
|
github.com/pion/dtls/v2 v2.1.3/go.mod h1:o6+WvyLDAlXF7YiPB/RlskRoeK+/JtuaZa5emwQcWus=
|
||||||
github.com/pion/ice/v2 v2.2.1 h1:R3MeuJZpU1ty3diPqpD5OxaxcZ15eprAc+EtUiSoFxg=
|
github.com/pion/ice/v2 v2.2.2 h1:UfmAslxZ0u0itVjA4x7aw7WeQIv22FdF8VjW9cM+74g=
|
||||||
github.com/pion/ice/v2 v2.2.1/go.mod h1:Op8jlPtjeiycsXh93Cs4jK82C9j/kh7vef6ztIOvtIQ=
|
github.com/pion/ice/v2 v2.2.2/go.mod h1:vLI7dFqxw8zMSb9J+ca74XU7JjLhddgfQB9+BbTydCo=
|
||||||
github.com/pion/interceptor v0.1.7 h1:HThW0tIIKT9RRoDWGURe8rlZVOx0fJHxBHpA0ej0+bo=
|
github.com/pion/interceptor v0.1.10 h1:DJ2GjMGm4XGIQgMJxuEpdaExdY/6RdngT7Uh4oVmquU=
|
||||||
github.com/pion/interceptor v0.1.7/go.mod h1:Lh3JSl/cbJ2wP8I3ccrjh1K/deRGRn3UlSPuOTiHb6U=
|
github.com/pion/interceptor v0.1.10/go.mod h1:Lh3JSl/cbJ2wP8I3ccrjh1K/deRGRn3UlSPuOTiHb6U=
|
||||||
github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
|
github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
|
||||||
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
|
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
|
||||||
github.com/pion/mdns v0.0.5 h1:Q2oj/JB3NqfzY9xGZ1fPzZzK7sDSD8rZPOvcIQ10BCw=
|
github.com/pion/mdns v0.0.5 h1:Q2oj/JB3NqfzY9xGZ1fPzZzK7sDSD8rZPOvcIQ10BCw=
|
||||||
@@ -68,8 +65,9 @@ github.com/pion/rtcp v1.2.6/go.mod h1:52rMNPWFsjr39z9B9MhnkqhPLoeHTv1aN63o/42bWE
|
|||||||
github.com/pion/rtcp v1.2.9 h1:1ujStwg++IOLIEoOiIQ2s+qBuJ1VN81KW+9pMPsif+U=
|
github.com/pion/rtcp v1.2.9 h1:1ujStwg++IOLIEoOiIQ2s+qBuJ1VN81KW+9pMPsif+U=
|
||||||
github.com/pion/rtcp v1.2.9/go.mod h1:qVPhiCzAm4D/rxb6XzKeyZiQK69yJpbUDJSF7TgrqNo=
|
github.com/pion/rtcp v1.2.9/go.mod h1:qVPhiCzAm4D/rxb6XzKeyZiQK69yJpbUDJSF7TgrqNo=
|
||||||
github.com/pion/rtp v1.7.0/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko=
|
github.com/pion/rtp v1.7.0/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko=
|
||||||
github.com/pion/rtp v1.7.4 h1:4dMbjb1SuynU5OpA3kz1zHK+u+eOCQjW3MAeVHf1ODA=
|
|
||||||
github.com/pion/rtp v1.7.4/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko=
|
github.com/pion/rtp v1.7.4/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko=
|
||||||
|
github.com/pion/rtp v1.7.9 h1:17W5Mt2IM3MVfOh7yRfzXbbKXYzBZxV8eG4KKAy+0bg=
|
||||||
|
github.com/pion/rtp v1.7.9/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko=
|
||||||
github.com/pion/sctp v1.8.0/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s=
|
github.com/pion/sctp v1.8.0/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s=
|
||||||
github.com/pion/sctp v1.8.2 h1:yBBCIrUMJ4yFICL3RIvR4eh/H2BTTvlligmSTy+3kiA=
|
github.com/pion/sctp v1.8.2 h1:yBBCIrUMJ4yFICL3RIvR4eh/H2BTTvlligmSTy+3kiA=
|
||||||
github.com/pion/sctp v1.8.2/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s=
|
github.com/pion/sctp v1.8.2/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s=
|
||||||
@@ -87,22 +85,25 @@ github.com/pion/turn/v2 v2.0.8 h1:KEstL92OUN3k5k8qxsXHpr7WWfrdp7iJZHx99ud8muw=
|
|||||||
github.com/pion/turn/v2 v2.0.8/go.mod h1:+y7xl719J8bAEVpSXBXvTxStjJv3hbz9YFflvkpcGPw=
|
github.com/pion/turn/v2 v2.0.8/go.mod h1:+y7xl719J8bAEVpSXBXvTxStjJv3hbz9YFflvkpcGPw=
|
||||||
github.com/pion/udp v0.1.1 h1:8UAPvyqmsxK8oOjloDk4wUt63TzFe9WEJkg5lChlj7o=
|
github.com/pion/udp v0.1.1 h1:8UAPvyqmsxK8oOjloDk4wUt63TzFe9WEJkg5lChlj7o=
|
||||||
github.com/pion/udp v0.1.1/go.mod h1:6AFo+CMdKQm7UiA0eUPA8/eVCTx8jBIITLZHc9DWX5M=
|
github.com/pion/udp v0.1.1/go.mod h1:6AFo+CMdKQm7UiA0eUPA8/eVCTx8jBIITLZHc9DWX5M=
|
||||||
|
github.com/pion/webrtc/v3 v3.1.27 h1:yQ6TuHKJR/vro3nLZMfPv+WGf7T1/4ItaQeuzIZLXs4=
|
||||||
|
github.com/pion/webrtc/v3 v3.1.27/go.mod h1:hdduI+Rx0cpGvva18j0gKy/Iak611WPyhUIXs5W/FuI=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
|
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
|
||||||
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838 h1:71vQrMauZZhcTVK6KdYM+rklehEEwb3E+ZhaE5jrPrE=
|
golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838 h1:71vQrMauZZhcTVK6KdYM+rklehEEwb3E+ZhaE5jrPrE=
|
||||||
golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d h1:RNPAfi2nHY7C2srAV8A49jpsYr0ADedCk1wq6fTMTvs=
|
golang.org/x/image v0.0.0-20220321031419-a8550c1d254a h1:LnH9RNcpPv5Kzi15lXg42lYMPUf0x8CuPv1YnvBWZAg=
|
||||||
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
golang.org/x/image v0.0.0-20220321031419-a8550c1d254a/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
@@ -114,8 +115,9 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v
|
|||||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20211201190559-0a0e4e1bb54c/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211201190559-0a0e4e1bb54c/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk=
|
|
||||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
|
golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc=
|
||||||
|
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
24
ioreader.go
24
ioreader.go
@@ -1,7 +1,5 @@
|
|||||||
package mediadevices
|
package mediadevices
|
||||||
|
|
||||||
import "github.com/pion/mediadevices/pkg/codec"
|
|
||||||
|
|
||||||
type EncodedBuffer struct {
|
type EncodedBuffer struct {
|
||||||
Data []byte
|
Data []byte
|
||||||
Samples uint32
|
Samples uint32
|
||||||
@@ -10,13 +8,11 @@ type EncodedBuffer struct {
|
|||||||
type EncodedReadCloser interface {
|
type EncodedReadCloser interface {
|
||||||
Read() (EncodedBuffer, func(), error)
|
Read() (EncodedBuffer, func(), error)
|
||||||
Close() error
|
Close() error
|
||||||
codec.Controllable
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type encodedReadCloserImpl struct {
|
type encodedReadCloserImpl struct {
|
||||||
readFn func() (EncodedBuffer, func(), error)
|
readFn func() (EncodedBuffer, func(), error)
|
||||||
closeFn func() error
|
closeFn func() error
|
||||||
controllerFn func() codec.EncoderController
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *encodedReadCloserImpl) Read() (EncodedBuffer, func(), error) {
|
func (r *encodedReadCloserImpl) Read() (EncodedBuffer, func(), error) {
|
||||||
@@ -27,14 +23,9 @@ func (r *encodedReadCloserImpl) Close() error {
|
|||||||
return r.closeFn()
|
return r.closeFn()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *encodedReadCloserImpl) Controller() codec.EncoderController {
|
|
||||||
return r.controllerFn()
|
|
||||||
}
|
|
||||||
|
|
||||||
type encodedIOReadCloserImpl struct {
|
type encodedIOReadCloserImpl struct {
|
||||||
readFn func([]byte) (int, error)
|
readFn func([]byte) (int, error)
|
||||||
closeFn func() error
|
closeFn func() error
|
||||||
controller func() codec.EncoderController
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func newEncodedIOReadCloserImpl(reader EncodedReadCloser) *encodedIOReadCloserImpl {
|
func newEncodedIOReadCloserImpl(reader EncodedReadCloser) *encodedIOReadCloserImpl {
|
||||||
@@ -57,8 +48,7 @@ func newEncodedIOReadCloserImpl(reader EncodedReadCloser) *encodedIOReadCloserIm
|
|||||||
encoded.Data = encoded.Data[n:]
|
encoded.Data = encoded.Data[n:]
|
||||||
return n, nil
|
return n, nil
|
||||||
},
|
},
|
||||||
closeFn: reader.Close,
|
closeFn: reader.Close,
|
||||||
controller: reader.Controller,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,7 +59,3 @@ func (r *encodedIOReadCloserImpl) Read(b []byte) (int, error) {
|
|||||||
func (r *encodedIOReadCloserImpl) Close() error {
|
func (r *encodedIOReadCloserImpl) Close() error {
|
||||||
return r.closeFn()
|
return r.closeFn()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *encodedIOReadCloserImpl) Controller() codec.EncoderController {
|
|
||||||
return r.controller()
|
|
||||||
}
|
|
||||||
|
@@ -8,6 +8,7 @@ import (
|
|||||||
"github.com/pion/mediadevices/pkg/driver"
|
"github.com/pion/mediadevices/pkg/driver"
|
||||||
_ "github.com/pion/mediadevices/pkg/driver/audiotest"
|
_ "github.com/pion/mediadevices/pkg/driver/audiotest"
|
||||||
_ "github.com/pion/mediadevices/pkg/driver/videotest"
|
_ "github.com/pion/mediadevices/pkg/driver/videotest"
|
||||||
|
"github.com/pion/mediadevices/pkg/frame"
|
||||||
"github.com/pion/mediadevices/pkg/prop"
|
"github.com/pion/mediadevices/pkg/prop"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -97,37 +98,163 @@ func TestSelectBestDriverConstraintsResultIsSetProperly(t *testing.T) {
|
|||||||
t.Fatal("expect to get at least 1 property")
|
t.Fatal("expect to get at least 1 property")
|
||||||
}
|
}
|
||||||
expectedProp := driver.Properties()[0]
|
expectedProp := driver.Properties()[0]
|
||||||
// Since this is a continuous value, bestConstraints should be set with the value that user specified
|
|
||||||
expectedProp.FrameRate = 30.0
|
|
||||||
|
|
||||||
wantConstraints := MediaTrackConstraints{
|
// By reducing the value from the driver by a tiny amount, this property should be chosen.
|
||||||
MediaConstraints: prop.MediaConstraints{
|
// At the same time, we'll be able to find out if the return constraints will be properly set
|
||||||
VideoConstraints: prop.VideoConstraints{
|
// to the best constraints.
|
||||||
// By reducing the width from the driver by a tiny amount, this property should be chosen.
|
cases := map[string]struct {
|
||||||
// At the same time, we'll be able to find out if the return constraints will be properly set
|
width, height int
|
||||||
// to the best constraints.
|
frameFormat frame.Format
|
||||||
Width: prop.Int(expectedProp.Width - 1),
|
frameRate float32
|
||||||
Height: prop.Int(expectedProp.Width),
|
}{
|
||||||
FrameFormat: prop.FrameFormat(expectedProp.FrameFormat),
|
"DifferentWidth": {
|
||||||
FrameRate: prop.Float(30.0),
|
width: expectedProp.Width - 1,
|
||||||
},
|
height: expectedProp.Height,
|
||||||
|
frameFormat: expectedProp.FrameFormat,
|
||||||
|
frameRate: expectedProp.FrameRate,
|
||||||
|
},
|
||||||
|
"DifferentHeight": {
|
||||||
|
width: expectedProp.Width,
|
||||||
|
height: expectedProp.Height - 1,
|
||||||
|
frameFormat: expectedProp.FrameFormat,
|
||||||
|
frameRate: expectedProp.FrameRate,
|
||||||
|
},
|
||||||
|
"DifferentFrameFormat": {
|
||||||
|
width: expectedProp.Width,
|
||||||
|
height: expectedProp.Height,
|
||||||
|
frameFormat: frame.FormatI420,
|
||||||
|
frameRate: expectedProp.FrameRate,
|
||||||
|
},
|
||||||
|
"DifferentFrameRate": {
|
||||||
|
width: expectedProp.Width,
|
||||||
|
height: expectedProp.Height,
|
||||||
|
frameFormat: expectedProp.FrameFormat,
|
||||||
|
frameRate: expectedProp.FrameRate - 1,
|
||||||
|
},
|
||||||
|
"NoFrameRateConstraints": {
|
||||||
|
width: expectedProp.Width,
|
||||||
|
height: expectedProp.Height,
|
||||||
|
frameFormat: expectedProp.FrameFormat,
|
||||||
|
frameRate: -1,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
bestDriver, bestConstraints, err := selectBestDriver(filterFn, wantConstraints)
|
for name, c := range cases {
|
||||||
|
c := c
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
var vc prop.VideoConstraints
|
||||||
|
|
||||||
|
if c.frameRate >= 0 {
|
||||||
|
vc = prop.VideoConstraints{
|
||||||
|
Width: prop.Int(c.width),
|
||||||
|
Height: prop.Int(c.height),
|
||||||
|
FrameFormat: prop.FrameFormat(c.frameFormat),
|
||||||
|
FrameRate: prop.Float(c.frameRate),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// do not specify the framerate
|
||||||
|
vc = prop.VideoConstraints{
|
||||||
|
Width: prop.Int(c.width),
|
||||||
|
Height: prop.Int(c.height),
|
||||||
|
FrameFormat: prop.FrameFormat(c.frameFormat),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wantConstraints := MediaTrackConstraints{
|
||||||
|
MediaConstraints: prop.MediaConstraints{
|
||||||
|
VideoConstraints: vc,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
bestDriver, bestConstraints, err := selectBestDriver(filterFn, wantConstraints)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if driver != bestDriver {
|
||||||
|
t.Fatal("best driver is not expected")
|
||||||
|
}
|
||||||
|
|
||||||
|
s := bestConstraints.selectedMedia
|
||||||
|
if s.Width != expectedProp.Width ||
|
||||||
|
s.Height != expectedProp.Height ||
|
||||||
|
s.FrameFormat != expectedProp.FrameFormat ||
|
||||||
|
s.FrameRate != expectedProp.FrameRate {
|
||||||
|
t.Fatalf("failed to return best constraints\nexpected:\n%v\n\ngot:\n%v", expectedProp, bestConstraints.selectedMedia)
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSelectBestDriverConstraintsNoFit(t *testing.T) {
|
||||||
|
filterFn := driver.FilterVideoRecorder()
|
||||||
|
drivers := driver.GetManager().Query(filterFn)
|
||||||
|
if len(drivers) == 0 {
|
||||||
|
t.Fatal("expect to get at least 1 driver")
|
||||||
|
}
|
||||||
|
|
||||||
|
driver := drivers[0]
|
||||||
|
err := driver.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal("expect to open driver successfully")
|
||||||
|
}
|
||||||
|
defer driver.Close()
|
||||||
|
|
||||||
|
if len(driver.Properties()) == 0 {
|
||||||
|
t.Fatal("expect to get at least 1 property")
|
||||||
|
}
|
||||||
|
expectedProp := driver.Properties()[0]
|
||||||
|
|
||||||
|
cases := map[string]struct {
|
||||||
|
width, height int
|
||||||
|
frameFormat frame.Format
|
||||||
|
frameRate float32
|
||||||
|
}{
|
||||||
|
"DifferentWidth": {
|
||||||
|
width: expectedProp.Width - 1,
|
||||||
|
height: expectedProp.Height,
|
||||||
|
frameFormat: expectedProp.FrameFormat,
|
||||||
|
frameRate: expectedProp.FrameRate,
|
||||||
|
},
|
||||||
|
"DifferentHeight": {
|
||||||
|
width: expectedProp.Width,
|
||||||
|
height: expectedProp.Height - 1,
|
||||||
|
frameFormat: expectedProp.FrameFormat,
|
||||||
|
frameRate: expectedProp.FrameRate,
|
||||||
|
},
|
||||||
|
"DifferentFrameFormat": {
|
||||||
|
width: expectedProp.Width,
|
||||||
|
height: expectedProp.Height,
|
||||||
|
frameFormat: frame.FormatI420,
|
||||||
|
frameRate: expectedProp.FrameRate,
|
||||||
|
},
|
||||||
|
"DifferentFrameRate": {
|
||||||
|
width: expectedProp.Width,
|
||||||
|
height: expectedProp.Height,
|
||||||
|
frameFormat: expectedProp.FrameFormat,
|
||||||
|
frameRate: expectedProp.FrameRate - 1,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
if driver != bestDriver {
|
for name, c := range cases {
|
||||||
t.Fatal("best driver is not expected")
|
c := c
|
||||||
}
|
t.Run(name, func(t *testing.T) {
|
||||||
|
wantConstraints := MediaTrackConstraints{
|
||||||
|
MediaConstraints: prop.MediaConstraints{
|
||||||
|
VideoConstraints: prop.VideoConstraints{
|
||||||
|
Width: prop.IntExact(c.width),
|
||||||
|
Height: prop.IntExact(c.height),
|
||||||
|
FrameFormat: prop.FrameFormatExact(c.frameFormat),
|
||||||
|
FrameRate: prop.FloatExact(c.frameRate),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
s := bestConstraints.selectedMedia
|
_, _, err := selectBestDriver(filterFn, wantConstraints)
|
||||||
if s.Width != expectedProp.Width ||
|
if err == nil {
|
||||||
s.Height != expectedProp.Height ||
|
t.Fatal("expect to not find a driver that fits the constraints")
|
||||||
s.FrameFormat != expectedProp.FrameFormat ||
|
}
|
||||||
s.FrameRate != expectedProp.FrameRate {
|
})
|
||||||
t.Fatalf("failed to return best constraints\nexpected:\n%v\n\ngot:\n%v", expectedProp, bestConstraints.selectedMedia)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -11,6 +11,7 @@ package avfoundation
|
|||||||
// }
|
// }
|
||||||
import "C"
|
import "C"
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
@@ -93,9 +94,11 @@ func Devices(mediaType MediaType) ([]Device, error) {
|
|||||||
// ReadCloser is a wrapper around the data callback from AVFoundation. The data received from the
|
// ReadCloser is a wrapper around the data callback from AVFoundation. The data received from the
|
||||||
// the underlying callback can be retrieved by calling Read.
|
// the underlying callback can be retrieved by calling Read.
|
||||||
type ReadCloser struct {
|
type ReadCloser struct {
|
||||||
dataChan chan []byte
|
dataChan chan []byte
|
||||||
id handleID
|
id handleID
|
||||||
onClose func()
|
onClose func()
|
||||||
|
cancelCtx context.Context
|
||||||
|
cancelFunc func()
|
||||||
}
|
}
|
||||||
|
|
||||||
func newReadCloser(onClose func()) *ReadCloser {
|
func newReadCloser(onClose func()) *ReadCloser {
|
||||||
@@ -103,12 +106,22 @@ func newReadCloser(onClose func()) *ReadCloser {
|
|||||||
rc.dataChan = make(chan []byte, 1)
|
rc.dataChan = make(chan []byte, 1)
|
||||||
rc.onClose = onClose
|
rc.onClose = onClose
|
||||||
rc.id = register(rc.dataCb)
|
rc.id = register(rc.dataCb)
|
||||||
|
cancelCtx, cancelFunc := context.WithCancel(context.Background())
|
||||||
|
rc.cancelCtx = cancelCtx
|
||||||
|
rc.cancelFunc = cancelFunc
|
||||||
return &rc
|
return &rc
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rc *ReadCloser) dataCb(data []byte) {
|
func (rc *ReadCloser) dataCb(data []byte) {
|
||||||
// TODO: add a policy for slow reader
|
// TODO: add a policy for slow reader
|
||||||
rc.dataChan <- data
|
if rc.cancelCtx.Err() != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
select {
|
||||||
|
case <-rc.cancelCtx.Done():
|
||||||
|
close(rc.dataChan)
|
||||||
|
case rc.dataChan <- data:
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read reads raw data, the format is determined by the media type and property:
|
// Read reads raw data, the format is determined by the media type and property:
|
||||||
@@ -127,7 +140,7 @@ func (rc *ReadCloser) Close() {
|
|||||||
if rc.onClose != nil {
|
if rc.onClose != nil {
|
||||||
rc.onClose()
|
rc.onClose()
|
||||||
}
|
}
|
||||||
close(rc.dataChan)
|
rc.cancelFunc()
|
||||||
unregister(rc.id)
|
unregister(rc.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -112,37 +112,15 @@ type VideoEncoderBuilder interface {
|
|||||||
BuildVideoEncoder(r video.Reader, p prop.Media) (ReadCloser, error)
|
BuildVideoEncoder(r video.Reader, p prop.Media) (ReadCloser, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadCloser is an io.ReadCloser with a controller
|
// ReadCloser is an io.ReadCloser with methods for rate limiting: SetBitRate and ForceKeyFrame
|
||||||
type ReadCloser interface {
|
type ReadCloser interface {
|
||||||
Read() (b []byte, release func(), err error)
|
Read() (b []byte, release func(), err error)
|
||||||
Close() error
|
Close() error
|
||||||
Controllable
|
|
||||||
}
|
|
||||||
|
|
||||||
// EncoderController is the interface allowing to control the encoder behaviour after it's initialisation.
|
|
||||||
// It will possibly have common control method in the future.
|
|
||||||
// A controller can have optional methods represented by *Controller interfaces
|
|
||||||
type EncoderController interface{}
|
|
||||||
|
|
||||||
// Controllable is a interface representing a encoder which can be controlled
|
|
||||||
// after it's initialisation with an EncoderController
|
|
||||||
type Controllable interface {
|
|
||||||
Controller() EncoderController
|
|
||||||
}
|
|
||||||
|
|
||||||
// KeyFrameController is a interface representing an encoder that can be forced to produce key frame on demand
|
|
||||||
type KeyFrameController interface {
|
|
||||||
EncoderController
|
|
||||||
// ForceKeyFrame forces the next frame to be a keyframe, aka intra-frame.
|
|
||||||
ForceKeyFrame() error
|
|
||||||
}
|
|
||||||
|
|
||||||
// BitRateController is a interface representing an encoder which can have a variable bit rate
|
|
||||||
type BitRateController interface {
|
|
||||||
EncoderController
|
|
||||||
// SetBitRate sets current target bitrate, lower bitrate means smaller data will be transmitted
|
// SetBitRate sets current target bitrate, lower bitrate means smaller data will be transmitted
|
||||||
// but this also means that the quality will also be lower.
|
// but this also means that the quality will also be lower.
|
||||||
SetBitRate(int) error
|
SetBitRate(int) error
|
||||||
|
// ForceKeyFrame forces the next frame to be a keyframe, aka intra-frame.
|
||||||
|
ForceKeyFrame() error
|
||||||
}
|
}
|
||||||
|
|
||||||
// BaseParams represents an codec's encoding properties
|
// BaseParams represents an codec's encoding properties
|
||||||
|
@@ -91,8 +91,12 @@ func (e *encoder) Read() ([]byte, func(), error) {
|
|||||||
return encoded, func() {}, err
|
return encoded, func() {}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) Controller() codec.EncoderController {
|
func (e *encoder) SetBitRate(b int) error {
|
||||||
return e
|
panic("SetBitRate is not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *encoder) ForceKeyFrame() error {
|
||||||
|
panic("ForceKeyFrame is not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) Close() error {
|
func (e *encoder) Close() error {
|
||||||
|
@@ -4,7 +4,6 @@ import (
|
|||||||
"image"
|
"image"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/pion/mediadevices/pkg/codec"
|
|
||||||
"github.com/pion/mediadevices/pkg/codec/internal/codectest"
|
"github.com/pion/mediadevices/pkg/codec/internal/codectest"
|
||||||
"github.com/pion/mediadevices/pkg/frame"
|
"github.com/pion/mediadevices/pkg/frame"
|
||||||
"github.com/pion/mediadevices/pkg/prop"
|
"github.com/pion/mediadevices/pkg/prop"
|
||||||
@@ -45,21 +44,3 @@ func TestEncoder(t *testing.T) {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestShouldImplementBitRateControl(t *testing.T) {
|
|
||||||
t.SkipNow() // TODO: Implement bit rate control
|
|
||||||
|
|
||||||
e := &encoder{}
|
|
||||||
if _, ok := e.Controller().(codec.BitRateController); !ok {
|
|
||||||
t.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestShouldImplementKeyFrameControl(t *testing.T) {
|
|
||||||
t.SkipNow() // TODO: Implement key frame control
|
|
||||||
|
|
||||||
e := &encoder{}
|
|
||||||
if _, ok := e.Controller().(codec.KeyFrameController); !ok {
|
|
||||||
t.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -88,9 +88,8 @@ Slice enc_encode(Encoder *e, Frame f, int *eresult) {
|
|||||||
pic.iPicWidth = f.width;
|
pic.iPicWidth = f.width;
|
||||||
pic.iPicHeight = f.height;
|
pic.iPicHeight = f.height;
|
||||||
pic.iColorFormat = videoFormatI420;
|
pic.iColorFormat = videoFormatI420;
|
||||||
// We always received I420 format
|
pic.iStride[0] = f.ystride;
|
||||||
pic.iStride[0] = pic.iPicWidth;
|
pic.iStride[1] = pic.iStride[2] = f.cstride;
|
||||||
pic.iStride[1] = pic.iStride[2] = pic.iPicWidth / 2;
|
|
||||||
pic.pData[0] = (unsigned char *)f.y;
|
pic.pData[0] = (unsigned char *)f.y;
|
||||||
pic.pData[1] = (unsigned char *)f.u;
|
pic.pData[1] = (unsigned char *)f.u;
|
||||||
pic.pData[2] = (unsigned char *)f.v;
|
pic.pData[2] = (unsigned char *)f.v;
|
||||||
|
@@ -12,6 +12,8 @@ typedef struct Slice {
|
|||||||
|
|
||||||
typedef struct Frame {
|
typedef struct Frame {
|
||||||
void *y, *u, *v;
|
void *y, *u, *v;
|
||||||
|
int ystride;
|
||||||
|
int cstride;
|
||||||
int height;
|
int height;
|
||||||
int width;
|
int width;
|
||||||
} Frame;
|
} Frame;
|
||||||
|
@@ -65,11 +65,13 @@ func (e *encoder) Read() ([]byte, func(), error) {
|
|||||||
bounds := yuvImg.Bounds()
|
bounds := yuvImg.Bounds()
|
||||||
var rv C.int
|
var rv C.int
|
||||||
s := C.enc_encode(e.engine, C.Frame{
|
s := C.enc_encode(e.engine, C.Frame{
|
||||||
y: unsafe.Pointer(&yuvImg.Y[0]),
|
y: unsafe.Pointer(&yuvImg.Y[0]),
|
||||||
u: unsafe.Pointer(&yuvImg.Cb[0]),
|
u: unsafe.Pointer(&yuvImg.Cb[0]),
|
||||||
v: unsafe.Pointer(&yuvImg.Cr[0]),
|
v: unsafe.Pointer(&yuvImg.Cr[0]),
|
||||||
height: C.int(bounds.Max.Y - bounds.Min.Y),
|
ystride: C.int(yuvImg.YStride),
|
||||||
width: C.int(bounds.Max.X - bounds.Min.X),
|
cstride: C.int(yuvImg.CStride),
|
||||||
|
height: C.int(bounds.Max.Y - bounds.Min.Y),
|
||||||
|
width: C.int(bounds.Max.X - bounds.Min.X),
|
||||||
}, &rv)
|
}, &rv)
|
||||||
if err := errResult(rv); err != nil {
|
if err := errResult(rv); err != nil {
|
||||||
return nil, func() {}, fmt.Errorf("failed in encoding: %v", err)
|
return nil, func() {}, fmt.Errorf("failed in encoding: %v", err)
|
||||||
@@ -79,15 +81,15 @@ func (e *encoder) Read() ([]byte, func(), error) {
|
|||||||
return encoded, func() {}, nil
|
return encoded, func() {}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *encoder) SetBitRate(b int) error {
|
||||||
|
panic("SetBitRate is not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
func (e *encoder) ForceKeyFrame() error {
|
func (e *encoder) ForceKeyFrame() error {
|
||||||
e.engine.force_key_frame = C.int(1)
|
e.engine.force_key_frame = C.int(1)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) Controller() codec.EncoderController {
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) Close() error {
|
func (e *encoder) Close() error {
|
||||||
e.mu.Lock()
|
e.mu.Lock()
|
||||||
defer e.mu.Unlock()
|
defer e.mu.Unlock()
|
||||||
|
@@ -4,28 +4,11 @@ import (
|
|||||||
"image"
|
"image"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/pion/mediadevices/pkg/codec"
|
|
||||||
"github.com/pion/mediadevices/pkg/codec/internal/codectest"
|
"github.com/pion/mediadevices/pkg/codec/internal/codectest"
|
||||||
"github.com/pion/mediadevices/pkg/frame"
|
"github.com/pion/mediadevices/pkg/frame"
|
||||||
"github.com/pion/mediadevices/pkg/prop"
|
"github.com/pion/mediadevices/pkg/prop"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestShouldImplementBitRateControl(t *testing.T) {
|
|
||||||
t.SkipNow() // TODO: Implement bit rate control
|
|
||||||
|
|
||||||
e := &encoder{}
|
|
||||||
if _, ok := e.Controller().(codec.BitRateController); !ok {
|
|
||||||
t.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestShouldImplementKeyFrameControl(t *testing.T) {
|
|
||||||
e := &encoder{}
|
|
||||||
if _, ok := e.Controller().(codec.KeyFrameController); !ok {
|
|
||||||
t.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestEncoder(t *testing.T) {
|
func TestEncoder(t *testing.T) {
|
||||||
t.Run("SimpleRead", func(t *testing.T) {
|
t.Run("SimpleRead", func(t *testing.T) {
|
||||||
p, err := NewParams()
|
p, err := NewParams()
|
||||||
|
@@ -121,8 +121,8 @@ func (e *encoder) SetBitRate(bitRate int) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) Controller() codec.EncoderController {
|
func (e *encoder) ForceKeyFrame() error {
|
||||||
return e
|
panic("ForceKeyFrame is not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) Close() error {
|
func (e *encoder) Close() error {
|
||||||
|
@@ -3,28 +3,11 @@ package opus
|
|||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/pion/mediadevices/pkg/codec"
|
|
||||||
"github.com/pion/mediadevices/pkg/codec/internal/codectest"
|
"github.com/pion/mediadevices/pkg/codec/internal/codectest"
|
||||||
"github.com/pion/mediadevices/pkg/prop"
|
"github.com/pion/mediadevices/pkg/prop"
|
||||||
"github.com/pion/mediadevices/pkg/wave"
|
"github.com/pion/mediadevices/pkg/wave"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestShouldImplementBitRateControl(t *testing.T) {
|
|
||||||
e := &encoder{}
|
|
||||||
if _, ok := e.Controller().(codec.BitRateController); !ok {
|
|
||||||
t.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestShouldImplementKeyFrameControl(t *testing.T) {
|
|
||||||
t.SkipNow() // TODO: Implement key frame control
|
|
||||||
|
|
||||||
e := &encoder{}
|
|
||||||
if _, ok := e.Controller().(codec.KeyFrameController); !ok {
|
|
||||||
t.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestEncoder(t *testing.T) {
|
func TestEncoder(t *testing.T) {
|
||||||
t.Run("SimpleRead", func(t *testing.T) {
|
t.Run("SimpleRead", func(t *testing.T) {
|
||||||
p, err := NewParams()
|
p, err := NewParams()
|
||||||
|
@@ -541,8 +541,12 @@ func (e *encoderVP8) Read() ([]byte, func(), error) {
|
|||||||
return encoded, func() {}, err
|
return encoded, func() {}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) Controller() codec.EncoderController {
|
func (e *encoderVP8) SetBitRate(b int) error {
|
||||||
return e
|
panic("SetBitRate is not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *encoderVP8) ForceKeyFrame() error {
|
||||||
|
panic("ForceKeyFrame is not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoderVP8) Close() error {
|
func (e *encoderVP8) Close() error {
|
||||||
|
@@ -1,27 +0,0 @@
|
|||||||
//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris
|
|
||||||
// +build dragonfly freebsd linux netbsd openbsd solaris
|
|
||||||
|
|
||||||
package vaapi
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/pion/mediadevices/pkg/codec"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestShouldImplementBitRateControl(t *testing.T) {
|
|
||||||
t.SkipNow() // TODO: Implement bit rate control
|
|
||||||
|
|
||||||
e := &encoderVP8{}
|
|
||||||
if _, ok := e.Controller().(codec.BitRateController); !ok {
|
|
||||||
t.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestShouldImplementKeyFrameControl(t *testing.T) {
|
|
||||||
t.SkipNow() // TODO: Implement key frame control
|
|
||||||
|
|
||||||
e := &encoderVP8{}
|
|
||||||
if _, ok := e.Controller().(codec.KeyFrameController); !ok {
|
|
||||||
t.Error()
|
|
||||||
}
|
|
||||||
}
|
|
@@ -476,8 +476,12 @@ func (e *encoderVP9) Read() ([]byte, func(), error) {
|
|||||||
return encoded, func() {}, err
|
return encoded, func() {}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) Controller() codec.EncoderController {
|
func (e *encoderVP9) SetBitRate(b int) error {
|
||||||
return e
|
panic("SetBitRate is not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *encoderVP9) ForceKeyFrame() error {
|
||||||
|
panic("ForceKeyFrame is not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoderVP9) Close() error {
|
func (e *encoderVP9) Close() error {
|
||||||
|
@@ -1,22 +0,0 @@
|
|||||||
//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris
|
|
||||||
// +build dragonfly freebsd linux netbsd openbsd solaris
|
|
||||||
|
|
||||||
package vaapi
|
|
||||||
|
|
||||||
func TestShouldImplementBitRateControl(t *testing.T) {
|
|
||||||
t.SkipNow() // TODO: Implement bit rate control
|
|
||||||
|
|
||||||
e := &encoderVP9{}
|
|
||||||
if _, ok := e.Controller().(codec.BitRateController); !ok {
|
|
||||||
t.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestShouldImplementKeyFrameControl(t *testing.T) {
|
|
||||||
t.SkipNow() // TODO: Implement key frame control
|
|
||||||
|
|
||||||
e := &encoderVP9{}
|
|
||||||
if _, ok := e.Controller().(codec.KeyFrameController); !ok {
|
|
||||||
t.Error()
|
|
||||||
}
|
|
||||||
}
|
|
@@ -295,6 +295,10 @@ func (e *encoder) Read() ([]byte, func(), error) {
|
|||||||
return encoded, func() {}, err
|
return encoded, func() {}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *encoder) SetBitRate(b int) error {
|
||||||
|
panic("SetBitRate is not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
func (e *encoder) ForceKeyFrame() error {
|
func (e *encoder) ForceKeyFrame() error {
|
||||||
e.mu.Lock()
|
e.mu.Lock()
|
||||||
defer e.mu.Unlock()
|
defer e.mu.Unlock()
|
||||||
@@ -302,10 +306,6 @@ func (e *encoder) ForceKeyFrame() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) Controller() codec.EncoderController {
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) Close() error {
|
func (e *encoder) Close() error {
|
||||||
e.mu.Lock()
|
e.mu.Lock()
|
||||||
defer e.mu.Unlock()
|
defer e.mu.Unlock()
|
||||||
|
@@ -193,7 +193,7 @@ func TestRequestKeyFrame(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
rel()
|
rel()
|
||||||
r.Controller().(codec.KeyFrameController).ForceKeyFrame()
|
r.ForceKeyFrame()
|
||||||
_, rel, err = r.Read()
|
_, rel, err = r.Read()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
@@ -210,19 +210,3 @@ func TestRequestKeyFrame(t *testing.T) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestShouldImplementBitRateControl(t *testing.T) {
|
|
||||||
t.SkipNow() // TODO: Implement bit rate control
|
|
||||||
|
|
||||||
e := &encoder{}
|
|
||||||
if _, ok := e.Controller().(codec.BitRateController); !ok {
|
|
||||||
t.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestShouldImplementKeyFrameControl(t *testing.T) {
|
|
||||||
e := &encoder{}
|
|
||||||
if _, ok := e.Controller().(codec.KeyFrameController); !ok {
|
|
||||||
t.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -124,8 +124,12 @@ func (e *encoder) Read() ([]byte, func(), error) {
|
|||||||
return encoded, func() {}, err
|
return encoded, func() {}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) Controller() codec.EncoderController {
|
func (e *encoder) SetBitRate(b int) error {
|
||||||
return e
|
panic("SetBitRate is not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *encoder) ForceKeyFrame() error {
|
||||||
|
panic("ForceKeyFrame is not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) Close() error {
|
func (e *encoder) Close() error {
|
||||||
|
@@ -4,7 +4,6 @@ import (
|
|||||||
"image"
|
"image"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/pion/mediadevices/pkg/codec"
|
|
||||||
"github.com/pion/mediadevices/pkg/codec/internal/codectest"
|
"github.com/pion/mediadevices/pkg/codec/internal/codectest"
|
||||||
"github.com/pion/mediadevices/pkg/frame"
|
"github.com/pion/mediadevices/pkg/frame"
|
||||||
"github.com/pion/mediadevices/pkg/prop"
|
"github.com/pion/mediadevices/pkg/prop"
|
||||||
@@ -47,21 +46,3 @@ func TestEncoder(t *testing.T) {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestShouldImplementKeyFrameControl(t *testing.T) {
|
|
||||||
t.SkipNow() // TODO: Implement key frame control
|
|
||||||
|
|
||||||
e := &encoder{}
|
|
||||||
if _, ok := e.Controller().(codec.KeyFrameController); !ok {
|
|
||||||
t.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestShouldImplementBitRateControl(t *testing.T) {
|
|
||||||
t.SkipNow() // TODO: Implement bit rate control
|
|
||||||
|
|
||||||
e := &encoder{}
|
|
||||||
if _, ok := e.Controller().(codec.BitRateController); !ok {
|
|
||||||
t.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -13,6 +13,7 @@ import (
|
|||||||
type camera struct {
|
type camera struct {
|
||||||
device avfoundation.Device
|
device avfoundation.Device
|
||||||
session *avfoundation.Session
|
session *avfoundation.Session
|
||||||
|
rcClose func()
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -43,6 +44,9 @@ func (cam *camera) Open() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cam *camera) Close() error {
|
func (cam *camera) Close() error {
|
||||||
|
if cam.rcClose != nil {
|
||||||
|
cam.rcClose()
|
||||||
|
}
|
||||||
return cam.session.Close()
|
return cam.session.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,6 +60,7 @@ func (cam *camera) VideoRecord(property prop.Media) (video.Reader, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
cam.rcClose = rc.Close
|
||||||
r := video.ReaderFunc(func() (image.Image, func(), error) {
|
r := video.ReaderFunc(func() (image.Image, func(), error) {
|
||||||
frame, _, err := rc.Read()
|
frame, _, err := rc.Read()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -179,6 +179,13 @@ func (c *camera) VideoRecord(p prop.Media) (video.Reader, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if p.FrameRate > 0 {
|
||||||
|
err = c.cam.SetFramerate(float32(p.FrameRate))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if err := c.cam.StartStreaming(); err != nil {
|
if err := c.cam.StartStreaming(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@@ -47,10 +47,6 @@ func (d *dummy) Close() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *dummy) VideoRecord(p prop.Media) (video.Reader, error) {
|
func (d *dummy) VideoRecord(p prop.Media) (video.Reader, error) {
|
||||||
if p.FrameRate == 0 {
|
|
||||||
p.FrameRate = 30
|
|
||||||
}
|
|
||||||
|
|
||||||
colors := [][3]byte{
|
colors := [][3]byte{
|
||||||
{235, 128, 128},
|
{235, 128, 128},
|
||||||
{210, 16, 146},
|
{210, 16, 146},
|
||||||
@@ -143,6 +139,7 @@ func (d dummy) Properties() []prop.Media {
|
|||||||
Width: 640,
|
Width: 640,
|
||||||
Height: 480,
|
Height: 480,
|
||||||
FrameFormat: frame.FormatYUYV,
|
FrameFormat: frame.FormatYUYV,
|
||||||
|
FrameRate: 30,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@@ -109,7 +109,7 @@ func Scale(width, height int, scaler Scaler) TransformFunc {
|
|||||||
yDy := rect.Dy()
|
yDy := rect.Dy()
|
||||||
cRect := fixedRect(rect, i1.SubsampleRatio)
|
cRect := fixedRect(rect, i1.SubsampleRatio)
|
||||||
cDx := cRect.Dx()
|
cDx := cRect.Dx()
|
||||||
cDy := cRect.Dx()
|
cDy := cRect.Dy()
|
||||||
yLen := yDx * yDy
|
yLen := yDx * yDy
|
||||||
cLen := cDx * cDy
|
cLen := cDx * cDy
|
||||||
if len(imgDst.Y) < yLen {
|
if len(imgDst.Y) < yLen {
|
||||||
|
@@ -36,6 +36,32 @@ func TestScale(t *testing.T) {
|
|||||||
Rect: image.Rect(0, 0, 2, 2),
|
Rect: image.Rect(0, 0, 2, 2),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"RGBASameSize": {
|
||||||
|
src: &image.RGBA{
|
||||||
|
Pix: []uint8{
|
||||||
|
// R G B A | R G B A | R G B A | R G B A
|
||||||
|
0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
|
||||||
|
0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
|
||||||
|
0x00, 0x40, 0x00, 0xFF, 0x00, 0x40, 0x00, 0xFF, 0x00, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x60, 0xFF,
|
||||||
|
0x00, 0x40, 0x00, 0xFF, 0x00, 0x40, 0x00, 0xFF, 0x00, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x60, 0xFF,
|
||||||
|
},
|
||||||
|
Stride: 16,
|
||||||
|
Rect: image.Rect(0, 0, 4, 4),
|
||||||
|
},
|
||||||
|
width: 4,
|
||||||
|
height: 4,
|
||||||
|
expected: &image.RGBA{
|
||||||
|
Pix: []uint8{
|
||||||
|
// R G B A | R G B A | R G B A | R G B A
|
||||||
|
0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
|
||||||
|
0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF,
|
||||||
|
0x00, 0x40, 0x00, 0xFF, 0x00, 0x40, 0x00, 0xFF, 0x00, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x60, 0xFF,
|
||||||
|
0x00, 0x40, 0x00, 0xFF, 0x00, 0x40, 0x00, 0xFF, 0x00, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x60, 0xFF,
|
||||||
|
},
|
||||||
|
Stride: 16,
|
||||||
|
Rect: image.Rect(0, 0, 4, 4),
|
||||||
|
},
|
||||||
|
},
|
||||||
"I444": {
|
"I444": {
|
||||||
src: &image.YCbCr{
|
src: &image.YCbCr{
|
||||||
SubsampleRatio: image.YCbCrSubsampleRatio444,
|
SubsampleRatio: image.YCbCrSubsampleRatio444,
|
||||||
@@ -91,6 +117,70 @@ func TestScale(t *testing.T) {
|
|||||||
Rect: image.Rect(0, 0, 3, 3),
|
Rect: image.Rect(0, 0, 3, 3),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"I444SameSize": {
|
||||||
|
src: &image.YCbCr{
|
||||||
|
SubsampleRatio: image.YCbCrSubsampleRatio444,
|
||||||
|
Y: []uint8{
|
||||||
|
0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x40,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x40,
|
||||||
|
0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
|
||||||
|
},
|
||||||
|
Cb: []uint8{
|
||||||
|
0x20, 0x20, 0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x20, 0x20, 0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0,
|
||||||
|
0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0,
|
||||||
|
0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||||
|
},
|
||||||
|
Cr: []uint8{
|
||||||
|
0xE0, 0xE0, 0x80, 0x80, 0x80, 0x80,
|
||||||
|
0xE0, 0xE0, 0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x40, 0x40, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x40, 0x40, 0x80, 0x80,
|
||||||
|
},
|
||||||
|
YStride: 6,
|
||||||
|
CStride: 6,
|
||||||
|
Rect: image.Rect(0, 0, 6, 6),
|
||||||
|
},
|
||||||
|
width: 6,
|
||||||
|
height: 6,
|
||||||
|
expected: &image.YCbCr{
|
||||||
|
SubsampleRatio: image.YCbCrSubsampleRatio444,
|
||||||
|
Y: []uint8{
|
||||||
|
0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x40,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x40,
|
||||||
|
0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
|
||||||
|
},
|
||||||
|
Cb: []uint8{
|
||||||
|
0x20, 0x20, 0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x20, 0x20, 0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0,
|
||||||
|
0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0,
|
||||||
|
0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||||
|
},
|
||||||
|
Cr: []uint8{
|
||||||
|
0xE0, 0xE0, 0x80, 0x80, 0x80, 0x80,
|
||||||
|
0xE0, 0xE0, 0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x40, 0x40, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x40, 0x40, 0x80, 0x80,
|
||||||
|
},
|
||||||
|
YStride: 6,
|
||||||
|
CStride: 6,
|
||||||
|
Rect: image.Rect(0, 0, 6, 6),
|
||||||
|
},
|
||||||
|
},
|
||||||
"I422": {
|
"I422": {
|
||||||
src: &image.YCbCr{
|
src: &image.YCbCr{
|
||||||
SubsampleRatio: image.YCbCrSubsampleRatio422,
|
SubsampleRatio: image.YCbCrSubsampleRatio422,
|
||||||
@@ -155,6 +245,82 @@ func TestScale(t *testing.T) {
|
|||||||
Rect: image.Rect(0, 0, 4, 4),
|
Rect: image.Rect(0, 0, 4, 4),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"I422SameSize": {
|
||||||
|
src: &image.YCbCr{
|
||||||
|
SubsampleRatio: image.YCbCrSubsampleRatio422,
|
||||||
|
Y: []uint8{
|
||||||
|
0xF0, 0xF0, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xF0, 0xF0, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x80, 0x80, 0x30, 0x30, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x80, 0x80, 0x30, 0x30, 0x00, 0x00,
|
||||||
|
},
|
||||||
|
Cb: []uint8{
|
||||||
|
0x20, 0x20, 0x80, 0x80,
|
||||||
|
0x20, 0x20, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0xE0, 0xE0,
|
||||||
|
0x80, 0x80, 0xE0, 0xE0,
|
||||||
|
},
|
||||||
|
Cr: []uint8{
|
||||||
|
0xE0, 0xE0, 0x80, 0x80,
|
||||||
|
0xE0, 0xE0, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80,
|
||||||
|
0xF0, 0xF0, 0x40, 0x40,
|
||||||
|
0xF0, 0xF0, 0x40, 0x40,
|
||||||
|
},
|
||||||
|
YStride: 8,
|
||||||
|
CStride: 4,
|
||||||
|
Rect: image.Rect(0, 0, 8, 8),
|
||||||
|
},
|
||||||
|
width: 8,
|
||||||
|
height: 8,
|
||||||
|
expected: &image.YCbCr{
|
||||||
|
SubsampleRatio: image.YCbCrSubsampleRatio422,
|
||||||
|
Y: []uint8{
|
||||||
|
0xF0, 0xF0, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xF0, 0xF0, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x80, 0x80, 0x30, 0x30, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x80, 0x80, 0x30, 0x30, 0x00, 0x00,
|
||||||
|
},
|
||||||
|
Cb: []uint8{
|
||||||
|
0x20, 0x20, 0x80, 0x80,
|
||||||
|
0x20, 0x20, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0xE0, 0xE0,
|
||||||
|
0x80, 0x80, 0xE0, 0xE0,
|
||||||
|
},
|
||||||
|
Cr: []uint8{
|
||||||
|
0xE0, 0xE0, 0x80, 0x80,
|
||||||
|
0xE0, 0xE0, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0x80, 0x80,
|
||||||
|
0xF0, 0xF0, 0x40, 0x40,
|
||||||
|
0xF0, 0xF0, 0x40, 0x40,
|
||||||
|
},
|
||||||
|
YStride: 8,
|
||||||
|
CStride: 4,
|
||||||
|
Rect: image.Rect(0, 0, 8, 8),
|
||||||
|
},
|
||||||
|
},
|
||||||
"I420": {
|
"I420": {
|
||||||
src: &image.YCbCr{
|
src: &image.YCbCr{
|
||||||
SubsampleRatio: image.YCbCrSubsampleRatio420,
|
SubsampleRatio: image.YCbCrSubsampleRatio420,
|
||||||
@@ -207,6 +373,118 @@ func TestScale(t *testing.T) {
|
|||||||
Rect: image.Rect(0, 0, 4, 4),
|
Rect: image.Rect(0, 0, 4, 4),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"I420SameSize": {
|
||||||
|
src: &image.YCbCr{
|
||||||
|
SubsampleRatio: image.YCbCrSubsampleRatio420,
|
||||||
|
Y: []uint8{
|
||||||
|
0xF0, 0xF0, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xF0, 0xF0, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x80, 0x80, 0x30, 0x30, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x80, 0x80, 0x30, 0x30, 0x00, 0x00,
|
||||||
|
},
|
||||||
|
Cb: []uint8{
|
||||||
|
0x20, 0x20, 0x80, 0x80,
|
||||||
|
0x20, 0x20, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0xE0, 0xE0,
|
||||||
|
0x80, 0x80, 0xE0, 0xE0,
|
||||||
|
},
|
||||||
|
Cr: []uint8{
|
||||||
|
0xE0, 0xE0, 0x80, 0x80,
|
||||||
|
0xE0, 0xE0, 0x80, 0x80,
|
||||||
|
0xF0, 0xF0, 0x40, 0x40,
|
||||||
|
0xF0, 0xF0, 0x40, 0x40,
|
||||||
|
},
|
||||||
|
YStride: 8,
|
||||||
|
CStride: 4,
|
||||||
|
Rect: image.Rect(0, 0, 8, 8),
|
||||||
|
},
|
||||||
|
width: 8,
|
||||||
|
height: 8,
|
||||||
|
expected: &image.YCbCr{
|
||||||
|
SubsampleRatio: image.YCbCrSubsampleRatio420,
|
||||||
|
Y: []uint8{
|
||||||
|
0xF0, 0xF0, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xF0, 0xF0, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x80, 0x80, 0x30, 0x30, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x80, 0x80, 0x30, 0x30, 0x00, 0x00,
|
||||||
|
},
|
||||||
|
Cb: []uint8{
|
||||||
|
0x20, 0x20, 0x80, 0x80,
|
||||||
|
0x20, 0x20, 0x80, 0x80,
|
||||||
|
0x80, 0x80, 0xE0, 0xE0,
|
||||||
|
0x80, 0x80, 0xE0, 0xE0,
|
||||||
|
},
|
||||||
|
Cr: []uint8{
|
||||||
|
0xE0, 0xE0, 0x80, 0x80,
|
||||||
|
0xE0, 0xE0, 0x80, 0x80,
|
||||||
|
0xF0, 0xF0, 0x40, 0x40,
|
||||||
|
0xF0, 0xF0, 0x40, 0x40,
|
||||||
|
},
|
||||||
|
YStride: 8,
|
||||||
|
CStride: 4,
|
||||||
|
Rect: image.Rect(0, 0, 8, 8),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"I420NonSquareImage": {
|
||||||
|
src: &image.YCbCr{
|
||||||
|
SubsampleRatio: image.YCbCrSubsampleRatio420,
|
||||||
|
Y: []uint8{
|
||||||
|
0xF0, 0xF0, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x10, 0x10,
|
||||||
|
0xF0, 0xF0, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x10, 0x10,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x80, 0x80, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x80, 0x80, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
|
||||||
|
},
|
||||||
|
Cb: []uint8{
|
||||||
|
0x20, 0x20, 0x80, 0x80, 0x50, 0x50,
|
||||||
|
0x20, 0x20, 0x80, 0x80, 0x50, 0x50,
|
||||||
|
0x80, 0x80, 0xE0, 0xE0, 0x30, 0x30,
|
||||||
|
0x80, 0x80, 0xE0, 0xE0, 0x30, 0x30,
|
||||||
|
},
|
||||||
|
Cr: []uint8{
|
||||||
|
0xE0, 0xE0, 0x80, 0x80, 0xB0, 0xB0,
|
||||||
|
0xE0, 0xE0, 0x80, 0x80, 0xB0, 0xB0,
|
||||||
|
0xF0, 0xF0, 0x40, 0x40, 0xC0, 0xC0,
|
||||||
|
0xF0, 0xF0, 0x40, 0x40, 0xC0, 0xC0,
|
||||||
|
},
|
||||||
|
YStride: 12,
|
||||||
|
CStride: 6,
|
||||||
|
Rect: image.Rect(0, 0, 12, 8),
|
||||||
|
},
|
||||||
|
width: 6,
|
||||||
|
height: 4,
|
||||||
|
expected: &image.YCbCr{
|
||||||
|
SubsampleRatio: image.YCbCrSubsampleRatio420,
|
||||||
|
Y: []uint8{
|
||||||
|
0xF0, 0x10, 0x00, 0x00, 0xF0, 0x10,
|
||||||
|
0x00, 0x00, 0x40, 0x00, 0x40, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x80, 0x30, 0x00, 0x30, 0x00,
|
||||||
|
},
|
||||||
|
Cb: []uint8{
|
||||||
|
0x20, 0x80, 0x50,
|
||||||
|
0x80, 0xE0, 0x30,
|
||||||
|
},
|
||||||
|
Cr: []uint8{
|
||||||
|
0xE0, 0x80, 0xB0,
|
||||||
|
0xF0, 0x40, 0xC0,
|
||||||
|
},
|
||||||
|
YStride: 6,
|
||||||
|
CStride: 3,
|
||||||
|
Rect: image.Rect(0, 0, 6, 4),
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for name, algo := range scalerTestAlgos {
|
for name, algo := range scalerTestAlgos {
|
||||||
algo := algo
|
algo := algo
|
||||||
@@ -247,6 +525,100 @@ func TestScale(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestScaleFastBoxSampling(t *testing.T) {
|
||||||
|
cases := map[string]struct {
|
||||||
|
src image.Image
|
||||||
|
width, height int
|
||||||
|
expected image.Image
|
||||||
|
}{
|
||||||
|
"I420NonSquareImage": {
|
||||||
|
src: &image.YCbCr{
|
||||||
|
SubsampleRatio: image.YCbCrSubsampleRatio420,
|
||||||
|
Y: []uint8{
|
||||||
|
0xF0, 0xF0, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x10, 0x10,
|
||||||
|
0xF0, 0xF0, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x10, 0x10,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x80, 0x80, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x80, 0x80, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
|
||||||
|
},
|
||||||
|
Cb: []uint8{
|
||||||
|
0x20, 0x20, 0x80, 0x80, 0x50, 0x50,
|
||||||
|
0x20, 0x20, 0x80, 0x80, 0x50, 0x50,
|
||||||
|
0x80, 0x80, 0xE0, 0xE0, 0x30, 0x30,
|
||||||
|
0x80, 0x80, 0xE0, 0xE0, 0x30, 0x30,
|
||||||
|
},
|
||||||
|
Cr: []uint8{
|
||||||
|
0xE0, 0xE0, 0x80, 0x80, 0xB0, 0xB0,
|
||||||
|
0xE0, 0xE0, 0x80, 0x80, 0xB0, 0xB0,
|
||||||
|
0xF0, 0xF0, 0x40, 0x40, 0xC0, 0xC0,
|
||||||
|
0xF0, 0xF0, 0x40, 0x40, 0xC0, 0xC0,
|
||||||
|
},
|
||||||
|
YStride: 12,
|
||||||
|
CStride: 6,
|
||||||
|
Rect: image.Rect(0, 0, 12, 8),
|
||||||
|
},
|
||||||
|
width: 6,
|
||||||
|
height: 4,
|
||||||
|
expected: &image.YCbCr{
|
||||||
|
SubsampleRatio: image.YCbCrSubsampleRatio420,
|
||||||
|
Y: []uint8{
|
||||||
|
0xF0, 0x80, 0x08, 0x00, 0x78, 0x80,
|
||||||
|
0x08, 0x00, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x40, 0x58, 0x18, 0x18, 0x18,
|
||||||
|
},
|
||||||
|
Cb: []uint8{
|
||||||
|
0x20, 0x50, 0x68,
|
||||||
|
0x68, 0xB0, 0x88,
|
||||||
|
},
|
||||||
|
Cr: []uint8{
|
||||||
|
0xE0, 0xB0, 0x98,
|
||||||
|
0xD0, 0x98, 0x80,
|
||||||
|
},
|
||||||
|
YStride: 6,
|
||||||
|
CStride: 3,
|
||||||
|
Rect: image.Rect(0, 0, 6, 4),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for name, c := range cases {
|
||||||
|
c := c
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
trans := Scale(c.width, c.height, ScalerFastBoxSampling)
|
||||||
|
r := trans(ReaderFunc(func() (image.Image, func(), error) {
|
||||||
|
return c.src, func() {}, nil
|
||||||
|
}))
|
||||||
|
for i := 0; i < 4; i++ {
|
||||||
|
out, _, err := r.Read()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(c.expected, out) {
|
||||||
|
t.Errorf("Expected output image:\n%v\ngot:\n%v\nrepeat: %d", c.expected, out, i)
|
||||||
|
}
|
||||||
|
// Destroy output contents
|
||||||
|
switch v := out.(type) {
|
||||||
|
case *image.RGBA:
|
||||||
|
v.Stride = 10
|
||||||
|
v.Pix = v.Pix[:1]
|
||||||
|
v.Rect.Max.X = 1
|
||||||
|
case *image.YCbCr:
|
||||||
|
v.YStride = 10
|
||||||
|
v.CStride = 100
|
||||||
|
v.Y = v.Y[:1]
|
||||||
|
v.Cb = v.Cb[:2]
|
||||||
|
v.Cr = v.Cr[:1]
|
||||||
|
v.Rect.Max.X = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkScale(b *testing.B) {
|
func BenchmarkScale(b *testing.B) {
|
||||||
for name, algo := range scalerBenchAlgos {
|
for name, algo := range scalerBenchAlgos {
|
||||||
algo := algo
|
algo := algo
|
||||||
|
@@ -29,7 +29,7 @@ void fastBoxSampling(
|
|||||||
const int sw, const int sh, const int sstride,
|
const int sw, const int sh, const int sstride,
|
||||||
uint32_t* tmp)
|
uint32_t* tmp)
|
||||||
{
|
{
|
||||||
memset(tmp, 0, dw * dh * ch);
|
memset(tmp, 0, dw * dh * ch * sizeof(tmp[0]));
|
||||||
|
|
||||||
for (int sy = 0; sy < sh; sy++)
|
for (int sy = 0; sy < sh; sy++)
|
||||||
{
|
{
|
||||||
|
@@ -30,10 +30,18 @@ func (p *rgbLikeYCbCr) At(x, y int) color.Color {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *rgbLikeYCbCr) Set(x, y int, c color.Color) {
|
func (p *rgbLikeYCbCr) Set(x, y int, c color.Color) {
|
||||||
rgb := c.(*color.RGBA64)
|
switch v := c.(type) {
|
||||||
p.y.SetGray(x, y, color.Gray{uint8(rgb.R / 0x100)})
|
case color.RGBA:
|
||||||
if (image.Point{x, y}.In(p.cb.Rect)) {
|
p.y.SetGray(x, y, color.Gray{v.R})
|
||||||
p.cb.SetGray(x, y, color.Gray{uint8(rgb.G / 0x100)})
|
if (image.Point{x, y}.In(p.cb.Rect)) {
|
||||||
p.cr.SetGray(x, y, color.Gray{uint8(rgb.B / 0x100)})
|
p.cb.SetGray(x, y, color.Gray{v.G})
|
||||||
|
p.cr.SetGray(x, y, color.Gray{v.B})
|
||||||
|
}
|
||||||
|
case *color.RGBA64:
|
||||||
|
p.y.SetGray(x, y, color.Gray{uint8(v.R / 0x100)})
|
||||||
|
if (image.Point{x, y}.In(p.cb.Rect)) {
|
||||||
|
p.cb.SetGray(x, y, color.Gray{uint8(v.G / 0x100)})
|
||||||
|
p.cr.SetGray(x, y, color.Gray{uint8(v.B / 0x100)})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -145,6 +145,7 @@ func (p *MediaConstraints) FitnessDistance(o Media) (float64, bool) {
|
|||||||
cmps.add(p.Width, o.Width)
|
cmps.add(p.Width, o.Width)
|
||||||
cmps.add(p.Height, o.Height)
|
cmps.add(p.Height, o.Height)
|
||||||
cmps.add(p.FrameFormat, o.FrameFormat)
|
cmps.add(p.FrameFormat, o.FrameFormat)
|
||||||
|
cmps.add(p.FrameRate, o.FrameRate)
|
||||||
cmps.add(p.SampleRate, o.SampleRate)
|
cmps.add(p.SampleRate, o.SampleRate)
|
||||||
cmps.add(p.Latency, o.Latency)
|
cmps.add(p.Latency, o.Latency)
|
||||||
cmps.add(p.ChannelCount, o.ChannelCount)
|
cmps.add(p.ChannelCount, o.ChannelCount)
|
||||||
|
15
rtpreader.go
15
rtpreader.go
@@ -1,20 +1,15 @@
|
|||||||
package mediadevices
|
package mediadevices
|
||||||
|
|
||||||
import (
|
import "github.com/pion/rtp"
|
||||||
"github.com/pion/mediadevices/pkg/codec"
|
|
||||||
"github.com/pion/rtp"
|
|
||||||
)
|
|
||||||
|
|
||||||
type RTPReadCloser interface {
|
type RTPReadCloser interface {
|
||||||
Read() (pkts []*rtp.Packet, release func(), err error)
|
Read() (pkts []*rtp.Packet, release func(), err error)
|
||||||
Close() error
|
Close() error
|
||||||
codec.Controllable
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type rtpReadCloserImpl struct {
|
type rtpReadCloserImpl struct {
|
||||||
readFn func() ([]*rtp.Packet, func(), error)
|
readFn func() ([]*rtp.Packet, func(), error)
|
||||||
closeFn func() error
|
closeFn func() error
|
||||||
controllerFn func() codec.EncoderController
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *rtpReadCloserImpl) Read() ([]*rtp.Packet, func(), error) {
|
func (r *rtpReadCloserImpl) Read() ([]*rtp.Packet, func(), error) {
|
||||||
@@ -24,7 +19,3 @@ func (r *rtpReadCloserImpl) Read() ([]*rtp.Packet, func(), error) {
|
|||||||
func (r *rtpReadCloserImpl) Close() error {
|
func (r *rtpReadCloserImpl) Close() error {
|
||||||
return r.closeFn()
|
return r.closeFn()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *rtpReadCloserImpl) Controller() codec.EncoderController {
|
|
||||||
return r.controllerFn()
|
|
||||||
}
|
|
||||||
|
40
track.go
40
track.go
@@ -3,7 +3,6 @@ package mediadevices
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/pion/rtcp"
|
|
||||||
"image"
|
"image"
|
||||||
"io"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -158,7 +157,6 @@ func (track *baseTrack) bind(ctx webrtc.TrackLocalContext, specializedTrack Trac
|
|||||||
defer track.mu.Unlock()
|
defer track.mu.Unlock()
|
||||||
|
|
||||||
signalCh := make(chan chan<- struct{})
|
signalCh := make(chan chan<- struct{})
|
||||||
var stopRead chan struct{}
|
|
||||||
track.activePeerConnections[ctx.ID()] = signalCh
|
track.activePeerConnections[ctx.ID()] = signalCh
|
||||||
|
|
||||||
var encodedReader RTPReadCloser
|
var encodedReader RTPReadCloser
|
||||||
@@ -184,7 +182,6 @@ func (track *baseTrack) bind(ctx webrtc.TrackLocalContext, specializedTrack Trac
|
|||||||
var doneCh chan<- struct{}
|
var doneCh chan<- struct{}
|
||||||
writer := ctx.WriteStream()
|
writer := ctx.WriteStream()
|
||||||
defer func() {
|
defer func() {
|
||||||
close(stopRead)
|
|
||||||
encodedReader.Close()
|
encodedReader.Close()
|
||||||
|
|
||||||
// When there's another call to unbind, it won't block since we mark the signalCh to be closed
|
// When there's another call to unbind, it won't block since we mark the signalCh to be closed
|
||||||
@@ -217,37 +214,6 @@ func (track *baseTrack) bind(ctx webrtc.TrackLocalContext, specializedTrack Trac
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
keyFrameController, ok := encodedReader.Controller().(codec.KeyFrameController)
|
|
||||||
if ok {
|
|
||||||
stopRead = make(chan struct{})
|
|
||||||
go func() {
|
|
||||||
reader := ctx.ReadStream()
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-stopRead:
|
|
||||||
return
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
|
|
||||||
pkts, _, err := reader.ReadRTCP()
|
|
||||||
if err != nil {
|
|
||||||
track.onError(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, pkt := range pkts {
|
|
||||||
switch pkt.(type) {
|
|
||||||
case *rtcp.PictureLossIndication, *rtcp.FullIntraRequest:
|
|
||||||
if err := keyFrameController.ForceKeyFrame(); err != nil {
|
|
||||||
track.onError(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
|
|
||||||
return selectedCodec, nil
|
return selectedCodec, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -368,8 +334,7 @@ func (track *VideoTrack) newEncodedReader(codecNames ...string) (EncodedReadClos
|
|||||||
}
|
}
|
||||||
return buffer, release, err
|
return buffer, release, err
|
||||||
},
|
},
|
||||||
closeFn: encodedReader.Close,
|
closeFn: encodedReader.Close,
|
||||||
controllerFn: encodedReader.Controller,
|
|
||||||
}, selectedCodec, nil
|
}, selectedCodec, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,8 +372,7 @@ func (track *VideoTrack) NewRTPReader(codecName string, ssrc uint32, mtu int) (R
|
|||||||
pkts := packetizer.Packetize(encoded.Data, encoded.Samples)
|
pkts := packetizer.Packetize(encoded.Data, encoded.Samples)
|
||||||
return pkts, release, err
|
return pkts, release, err
|
||||||
},
|
},
|
||||||
closeFn: encodedReader.Close,
|
closeFn: encodedReader.Close,
|
||||||
controllerFn: encodedReader.Controller,
|
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user