FreeBSD Bugzilla – Attachment 250058 Details for
Bug 278432
[NEW PORT] multimedia/droidcam: Turn your phone/tablet into a webcam for your PC.
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
multimedia/droidcam
droidcam.shar (text/plain), 482.46 KB, created by
Yusuf Yaman
on 2024-04-18 16:45:13 UTC
(
hide
)
Description:
multimedia/droidcam
Filename:
MIME Type:
Creator:
Yusuf Yaman
Created:
2024-04-18 16:45:13 UTC
Size:
482.46 KB
patch
obsolete
># This is a shell archive. Save it in a file, remove anything before ># this line, and then unpack it by entering "sh file". Note, it may ># create directories; files and directories will be owned by you and ># have default permissions. ># ># This archive contains: ># ># droidcam ># droidcam/files ># droidcam/files/patch-droidcam.desktop ># droidcam/work ># droidcam/work/.install_done.droidcam._usr_local ># droidcam/work/.configure_done.droidcam._usr_local ># droidcam/work/.PLIST.flattened ># droidcam/work/.PLIST.mktmp ># droidcam/work/.license_done.droidcam._usr_local ># droidcam/work/.patch_done.droidcam._usr_local ># droidcam/work/.PLIST.droidcam ># droidcam/work/droidcam-2.1.3 ># droidcam/work/droidcam-2.1.3/icon2.png ># droidcam/work/droidcam-2.1.3/README-DKMS.md ># droidcam/work/droidcam-2.1.3/src ># droidcam/work/droidcam-2.1.3/src/common.h ># droidcam/work/droidcam-2.1.3/src/usb.c ># droidcam/work/droidcam-2.1.3/src/droidcam-cli.c ># droidcam/work/droidcam-2.1.3/src/connection.c ># droidcam/work/droidcam-2.1.3/src/settings.h ># droidcam/work/droidcam-2.1.3/src/av.c ># droidcam/work/droidcam-2.1.3/src/decoder.c ># droidcam/work/droidcam-2.1.3/src/decoder_snd.c ># droidcam/work/droidcam-2.1.3/src/resources.c ># droidcam/work/droidcam-2.1.3/src/queue.h ># droidcam/work/droidcam-2.1.3/src/decoder_v4l2.c ># droidcam/work/droidcam-2.1.3/src/settings.c ># droidcam/work/droidcam-2.1.3/src/fourcc.out ># droidcam/work/droidcam-2.1.3/src/connection.h ># droidcam/work/droidcam-2.1.3/src/queue.c ># droidcam/work/droidcam-2.1.3/src/decoder.h ># droidcam/work/droidcam-2.1.3/src/droidcam.c ># droidcam/work/droidcam-2.1.3/.github ># droidcam/work/droidcam-2.1.3/.github/ISSUE_TEMPLATE ># droidcam/work/droidcam-2.1.3/.github/ISSUE_TEMPLATE/bug_report.md ># droidcam/work/droidcam-2.1.3/.github/ISSUE_TEMPLATE/feature_request.md ># droidcam/work/droidcam-2.1.3/.github/ISSUE_TEMPLATE/other.md ># droidcam/work/droidcam-2.1.3/v4l2loopback ># droidcam/work/droidcam-2.1.3/v4l2loopback/test.c ># droidcam/work/droidcam-2.1.3/v4l2loopback/Makefile ># droidcam/work/droidcam-2.1.3/v4l2loopback/v4l2loopback-dc.c ># droidcam/work/droidcam-2.1.3/Makefile ># droidcam/work/droidcam-2.1.3/uninstall ># droidcam/work/droidcam-2.1.3/install.common ># droidcam/work/droidcam-2.1.3/README.md ># droidcam/work/droidcam-2.1.3/droidcam-cli ># droidcam/work/droidcam-2.1.3/install-video ># droidcam/work/droidcam-2.1.3/.gitignore ># droidcam/work/droidcam-2.1.3/droidcam.desktop ># droidcam/work/droidcam-2.1.3/icon.png ># droidcam/work/droidcam-2.1.3/droidcam.desktop.orig ># droidcam/work/droidcam-2.1.3/install-dkms ># droidcam/work/droidcam-2.1.3/LICENSE ># droidcam/work/droidcam-2.1.3/install-sound ># droidcam/work/droidcam-2.1.3/install-client ># droidcam/work/droidcam-2.1.3/droidcam ># droidcam/work/droidcam-2.1.3/.gresource.xml ># droidcam/work/droidcam-2.1.3/uninstall-dkms ># droidcam/work/.PLIST.writable ># droidcam/work/.build_done.droidcam._usr_local ># droidcam/work/.license-catalog.mk ># droidcam/work/.PLIST.readelf ># droidcam/work/stage ># droidcam/work/stage/usr ># droidcam/work/stage/usr/local ># droidcam/work/stage/usr/local/libexec ># droidcam/work/stage/usr/local/libdata ># droidcam/work/stage/usr/local/libdata/ldconfig ># droidcam/work/stage/usr/local/libdata/ldconfig32 ># droidcam/work/stage/usr/local/libdata/pkgconfig ># droidcam/work/stage/usr/local/share ># droidcam/work/stage/usr/local/share/zsh ># droidcam/work/stage/usr/local/share/zsh/site-functions ># droidcam/work/stage/usr/local/share/skel ># droidcam/work/stage/usr/local/share/emacs ># droidcam/work/stage/usr/local/share/emacs/site-lisp ># droidcam/work/stage/usr/local/share/examples ># droidcam/work/stage/usr/local/share/misc ># droidcam/work/stage/usr/local/share/locale ># droidcam/work/stage/usr/local/share/locale/tk ># droidcam/work/stage/usr/local/share/locale/tk/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/sl ># droidcam/work/stage/usr/local/share/locale/sl/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/ta ># droidcam/work/stage/usr/local/share/locale/ta/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/hi ># droidcam/work/stage/usr/local/share/locale/hi/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/sr ># droidcam/work/stage/usr/local/share/locale/sr/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/en_AU ># droidcam/work/stage/usr/local/share/locale/en_AU/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/ee ># droidcam/work/stage/usr/local/share/locale/ee/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/ka ># droidcam/work/stage/usr/local/share/locale/ka/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/eo ># droidcam/work/stage/usr/local/share/locale/eo/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/it ># droidcam/work/stage/usr/local/share/locale/it/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/ro ># droidcam/work/stage/usr/local/share/locale/ro/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/ca ># droidcam/work/stage/usr/local/share/locale/ca/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/dk ># droidcam/work/stage/usr/local/share/locale/dk/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/en_GB ># droidcam/work/stage/usr/local/share/locale/en_GB/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/da ># droidcam/work/stage/usr/local/share/locale/da/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/es_MX ># droidcam/work/stage/usr/local/share/locale/es_MX/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/de_AT ># droidcam/work/stage/usr/local/share/locale/de_AT/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/is ># droidcam/work/stage/usr/local/share/locale/is/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/be ># droidcam/work/stage/usr/local/share/locale/be/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/tr ># droidcam/work/stage/usr/local/share/locale/tr/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/am ># droidcam/work/stage/usr/local/share/locale/am/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/fr_FR ># droidcam/work/stage/usr/local/share/locale/fr_FR/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/sk ># droidcam/work/stage/usr/local/share/locale/sk/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/zh ># droidcam/work/stage/usr/local/share/locale/zh/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/pt_BR ># droidcam/work/stage/usr/local/share/locale/pt_BR/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/sq ># droidcam/work/stage/usr/local/share/locale/sq/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/th ># droidcam/work/stage/usr/local/share/locale/th/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/pt_PT ># droidcam/work/stage/usr/local/share/locale/pt_PT/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/el ># droidcam/work/stage/usr/local/share/locale/el/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/zh_TW.Big5 ># droidcam/work/stage/usr/local/share/locale/zh_TW.Big5/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/nn ># droidcam/work/stage/usr/local/share/locale/nn/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/uk ># droidcam/work/stage/usr/local/share/locale/uk/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/de ># droidcam/work/stage/usr/local/share/locale/de/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/ml ># droidcam/work/stage/usr/local/share/locale/ml/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/ja ># droidcam/work/stage/usr/local/share/locale/ja/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/vi ># droidcam/work/stage/usr/local/share/locale/vi/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/mk ># droidcam/work/stage/usr/local/share/locale/mk/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/ru ># droidcam/work/stage/usr/local/share/locale/ru/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/id ># droidcam/work/stage/usr/local/share/locale/id/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/eu ># droidcam/work/stage/usr/local/share/locale/eu/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/br ># droidcam/work/stage/usr/local/share/locale/br/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/lv ># droidcam/work/stage/usr/local/share/locale/lv/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/ko ># droidcam/work/stage/usr/local/share/locale/ko/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/pt ># droidcam/work/stage/usr/local/share/locale/pt/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/az ># droidcam/work/stage/usr/local/share/locale/az/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/fi ># droidcam/work/stage/usr/local/share/locale/fi/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/fa_IR ># droidcam/work/stage/usr/local/share/locale/fa_IR/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/sv ># droidcam/work/stage/usr/local/share/locale/sv/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/bn ># droidcam/work/stage/usr/local/share/locale/bn/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/lt ># droidcam/work/stage/usr/local/share/locale/lt/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/he ># droidcam/work/stage/usr/local/share/locale/he/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/af ># droidcam/work/stage/usr/local/share/locale/af/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/fa ># droidcam/work/stage/usr/local/share/locale/fa/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/es_ES ># droidcam/work/stage/usr/local/share/locale/es_ES/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/ar ># droidcam/work/stage/usr/local/share/locale/ar/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/tg ># droidcam/work/stage/usr/local/share/locale/tg/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/cy ># droidcam/work/stage/usr/local/share/locale/cy/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/sr@Latn ># droidcam/work/stage/usr/local/share/locale/sr@Latn/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/cs ># droidcam/work/stage/usr/local/share/locale/cs/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/uz ># droidcam/work/stage/usr/local/share/locale/uz/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/zh_CN.GB2312 ># droidcam/work/stage/usr/local/share/locale/zh_CN.GB2312/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/nl ># droidcam/work/stage/usr/local/share/locale/nl/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/en_CA ># droidcam/work/stage/usr/local/share/locale/en_CA/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/mn ># droidcam/work/stage/usr/local/share/locale/mn/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/fr ># droidcam/work/stage/usr/local/share/locale/fr/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/en ># droidcam/work/stage/usr/local/share/locale/en/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/bs ># droidcam/work/stage/usr/local/share/locale/bs/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/et ># droidcam/work/stage/usr/local/share/locale/et/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/pa ># droidcam/work/stage/usr/local/share/locale/pa/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/bg ># droidcam/work/stage/usr/local/share/locale/bg/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/kn ># droidcam/work/stage/usr/local/share/locale/kn/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/li ># droidcam/work/stage/usr/local/share/locale/li/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/hr ># droidcam/work/stage/usr/local/share/locale/hr/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/mt ># droidcam/work/stage/usr/local/share/locale/mt/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/gu ># droidcam/work/stage/usr/local/share/locale/gu/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/nb ># droidcam/work/stage/usr/local/share/locale/nb/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/zh_CN ># droidcam/work/stage/usr/local/share/locale/zh_CN/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/ga ># droidcam/work/stage/usr/local/share/locale/ga/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/gl ># droidcam/work/stage/usr/local/share/locale/gl/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/ne ># droidcam/work/stage/usr/local/share/locale/ne/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/no ># droidcam/work/stage/usr/local/share/locale/no/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/ms ># droidcam/work/stage/usr/local/share/locale/ms/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/or ># droidcam/work/stage/usr/local/share/locale/or/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/hu ># droidcam/work/stage/usr/local/share/locale/hu/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/zh_TW ># droidcam/work/stage/usr/local/share/locale/zh_TW/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/pl ># droidcam/work/stage/usr/local/share/locale/pl/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/es ># droidcam/work/stage/usr/local/share/locale/es/LC_MESSAGES ># droidcam/work/stage/usr/local/share/locale/wa ># droidcam/work/stage/usr/local/share/locale/wa/LC_MESSAGES ># droidcam/work/stage/usr/local/share/xml ># droidcam/work/stage/usr/local/share/fish ># droidcam/work/stage/usr/local/share/fish/vendor_completions.d ># droidcam/work/stage/usr/local/share/aclocal ># droidcam/work/stage/usr/local/share/icons ># droidcam/work/stage/usr/local/share/bash-completion ># droidcam/work/stage/usr/local/share/bash-completion/completions ># droidcam/work/stage/usr/local/share/java ># droidcam/work/stage/usr/local/share/java/classes ># droidcam/work/stage/usr/local/share/doc ># droidcam/work/stage/usr/local/share/doc/ja ># droidcam/work/stage/usr/local/share/man ># droidcam/work/stage/usr/local/share/man/man4 ># droidcam/work/stage/usr/local/share/man/cat9 ># droidcam/work/stage/usr/local/share/man/cat3 ># droidcam/work/stage/usr/local/share/man/mann ># droidcam/work/stage/usr/local/share/man/ja ># droidcam/work/stage/usr/local/share/man/ja/man8 ># droidcam/work/stage/usr/local/share/man/ja/man1 ># droidcam/work/stage/usr/local/share/man/ja/man7 ># droidcam/work/stage/usr/local/share/man/ru.KOI8-R ># droidcam/work/stage/usr/local/share/man/ru.KOI8-R/man1 ># droidcam/work/stage/usr/local/share/man/cat4 ># droidcam/work/stage/usr/local/share/man/man3 ># droidcam/work/stage/usr/local/share/man/man9 ># droidcam/work/stage/usr/local/share/man/man7 ># droidcam/work/stage/usr/local/share/man/it ># droidcam/work/stage/usr/local/share/man/it/man7 ># droidcam/work/stage/usr/local/share/man/it/man8 ># droidcam/work/stage/usr/local/share/man/cat7 ># droidcam/work/stage/usr/local/share/man/cat5 ># droidcam/work/stage/usr/local/share/man/man8 ># droidcam/work/stage/usr/local/share/man/man2 ># droidcam/work/stage/usr/local/share/man/man5 ># droidcam/work/stage/usr/local/share/man/cat2 ># droidcam/work/stage/usr/local/share/man/cat8 ># droidcam/work/stage/usr/local/share/man/es ># droidcam/work/stage/usr/local/share/man/es/man7 ># droidcam/work/stage/usr/local/share/man/es/man8 ># droidcam/work/stage/usr/local/share/man/man1 ># droidcam/work/stage/usr/local/share/man/cat6 ># droidcam/work/stage/usr/local/share/man/manl ># droidcam/work/stage/usr/local/share/man/cat1 ># droidcam/work/stage/usr/local/share/man/man6 ># droidcam/work/stage/usr/local/share/man/fr ># droidcam/work/stage/usr/local/share/man/fr/man7 ># droidcam/work/stage/usr/local/share/applications ># droidcam/work/stage/usr/local/share/dict ># droidcam/work/stage/usr/local/share/licenses ># droidcam/work/stage/usr/local/share/licenses/droidcam-2.1.3 ># droidcam/work/stage/usr/local/share/licenses/droidcam-2.1.3/catalog.mk ># droidcam/work/stage/usr/local/share/licenses/droidcam-2.1.3/GPLv2 ># droidcam/work/stage/usr/local/share/licenses/droidcam-2.1.3/LICENSE ># droidcam/work/stage/usr/local/share/sgml ># droidcam/work/stage/usr/local/share/info ># droidcam/work/stage/usr/local/share/pixmaps ># droidcam/work/stage/usr/local/share/nls ># droidcam/work/stage/usr/local/share/nls/it_CH.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/en_US.UTF-8 ># droidcam/work/stage/usr/local/share/nls/fr_CH.UTF-8 ># droidcam/work/stage/usr/local/share/nls/it_IT.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/sv_SE.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/kk_KZ.UTF-8 ># droidcam/work/stage/usr/local/share/nls/it_CH.UTF-8 ># droidcam/work/stage/usr/local/share/nls/la_LN.ISO8859-2 ># droidcam/work/stage/usr/local/share/nls/be_BY.ISO8859-5 ># droidcam/work/stage/usr/local/share/nls/el_GR.UTF-8 ># droidcam/work/stage/usr/local/share/nls/fr_CH.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/pt_PT.UTF-8 ># droidcam/work/stage/usr/local/share/nls/sr_YU.UTF-8 ># droidcam/work/stage/usr/local/share/nls/ru_RU.CP866 ># droidcam/work/stage/usr/local/share/nls/no_NO.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/ja_JP.eucJP ># droidcam/work/stage/usr/local/share/nls/en_NZ.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/en_CA.UTF-8 ># droidcam/work/stage/usr/local/share/nls/zh_TW.Big5 ># droidcam/work/stage/usr/local/share/nls/bg_BG.CP1251 ># droidcam/work/stage/usr/local/share/nls/is_IS.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/sr_YU.ISO8859-2 ># droidcam/work/stage/usr/local/share/nls/fr_CH.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/hi_IN.ISCII-DEV ># droidcam/work/stage/usr/local/share/nls/sr_YU.ISO8859-5 ># droidcam/work/stage/usr/local/share/nls/de_AT.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/et_EE.UTF-8 ># droidcam/work/stage/usr/local/share/nls/it_IT.UTF-8 ># droidcam/work/stage/usr/local/share/nls/en_IE.UTF-8 ># droidcam/work/stage/usr/local/share/nls/zh_HK.UTF-8 ># droidcam/work/stage/usr/local/share/nls/hy_AM.UTF-8 ># droidcam/work/stage/usr/local/share/nls/kk_KZ.PT154 ># droidcam/work/stage/usr/local/share/nls/C ># droidcam/work/stage/usr/local/share/nls/fi_FI.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/zh_CN.eucCN ># droidcam/work/stage/usr/local/share/nls/en_AU.UTF-8 ># droidcam/work/stage/usr/local/share/nls/he_IL.UTF-8 ># droidcam/work/stage/usr/local/share/nls/en_GB.UTF-8 ># droidcam/work/stage/usr/local/share/nls/nl_NL.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/tr_TR.ISO8859-9 ># droidcam/work/stage/usr/local/share/nls/pt_BR.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/sl_SI.UTF-8 ># droidcam/work/stage/usr/local/share/nls/it_IT.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/fi_FI.UTF-8 ># droidcam/work/stage/usr/local/share/nls/en_GB.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/be_BY.UTF-8 ># droidcam/work/stage/usr/local/share/nls/nl_NL.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/fr_BE.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/no_NO.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/hr_HR.UTF-8 ># droidcam/work/stage/usr/local/share/nls/hr_HR.ISO8859-2 ># droidcam/work/stage/usr/local/share/nls/ru_RU.KOI8-R ># droidcam/work/stage/usr/local/share/nls/la_LN.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/en_CA.US-ASCII ># droidcam/work/stage/usr/local/share/nls/de_AT.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/da_DK.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/bg_BG.UTF-8 ># droidcam/work/stage/usr/local/share/nls/ko_KR.CP949 ># droidcam/work/stage/usr/local/share/nls/la_LN.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/ja_JP.SJIS ># droidcam/work/stage/usr/local/share/nls/hy_AM.ARMSCII-8 ># droidcam/work/stage/usr/local/share/nls/la_LN.US-ASCII ># droidcam/work/stage/usr/local/share/nls/ko_KR.UTF-8 ># droidcam/work/stage/usr/local/share/nls/en_CA.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/pt_BR.UTF-8 ># droidcam/work/stage/usr/local/share/nls/fr_CA.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/sk_SK.UTF-8 ># droidcam/work/stage/usr/local/share/nls/be_BY.CP1251 ># droidcam/work/stage/usr/local/share/nls/ru_RU.UTF-8 ># droidcam/work/stage/usr/local/share/nls/es_ES.UTF-8 ># droidcam/work/stage/usr/local/share/nls/nl_BE.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/hu_HU.ISO8859-2 ># droidcam/work/stage/usr/local/share/nls/no_NO.UTF-8 ># droidcam/work/stage/usr/local/share/nls/en_NZ.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/da_DK.UTF-8 ># droidcam/work/stage/usr/local/share/nls/de_CH.UTF-8 ># droidcam/work/stage/usr/local/share/nls/en_NZ.UTF-8 ># droidcam/work/stage/usr/local/share/nls/zh_CN.GB18030 ># droidcam/work/stage/usr/local/share/nls/is_IS.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/af_ZA.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/fr_CA.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/pl_PL.UTF-8 ># droidcam/work/stage/usr/local/share/nls/it_CH.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/lt_LT.ISO8859-13 ># droidcam/work/stage/usr/local/share/nls/ko_KR.eucKR ># droidcam/work/stage/usr/local/share/nls/be_BY.CP1131 ># droidcam/work/stage/usr/local/share/nls/da_DK.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/pt_PT.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/sl_SI.ISO8859-2 ># droidcam/work/stage/usr/local/share/nls/zh_HK.Big5HKSCS ># droidcam/work/stage/usr/local/share/nls/hu_HU.UTF-8 ># droidcam/work/stage/usr/local/share/nls/la_LN.ISO8859-4 ># droidcam/work/stage/usr/local/share/nls/zh_CN.GB2312 ># droidcam/work/stage/usr/local/share/nls/pl_PL.ISO8859-2 ># droidcam/work/stage/usr/local/share/nls/es_ES.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/am_ET.UTF-8 ># droidcam/work/stage/usr/local/share/nls/en_AU.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/en_GB.US-ASCII ># droidcam/work/stage/usr/local/share/nls/af_ZA.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/ja_JP.UTF-8 ># droidcam/work/stage/usr/local/share/nls/uk_UA.ISO8859-5 ># droidcam/work/stage/usr/local/share/nls/ca_ES.UTF-8 ># droidcam/work/stage/usr/local/share/nls/nl_BE.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/lt_LT.UTF-8 ># droidcam/work/stage/usr/local/share/nls/de_CH.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/fr_BE.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/cs_CZ.UTF-8 ># droidcam/work/stage/usr/local/share/nls/de_CH.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/en_AU.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/fr_CA.UTF-8 ># droidcam/work/stage/usr/local/share/nls/lt_LT.ISO8859-4 ># droidcam/work/stage/usr/local/share/nls/pt_PT.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/en_NZ.US-ASCII ># droidcam/work/stage/usr/local/share/nls/fr_FR.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/sk_SK.ISO8859-2 ># droidcam/work/stage/usr/local/share/nls/sv_SE.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/nl_BE.UTF-8 ># droidcam/work/stage/usr/local/share/nls/fr_FR.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/ro_RO.ISO8859-2 ># droidcam/work/stage/usr/local/share/nls/et_EE.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/zh_TW.UTF-8 ># droidcam/work/stage/usr/local/share/nls/en_US.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/de_DE.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/fi_FI.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/cs_CZ.ISO8859-2 ># droidcam/work/stage/usr/local/share/nls/uk_UA.UTF-8 ># droidcam/work/stage/usr/local/share/nls/nl_NL.UTF-8 ># droidcam/work/stage/usr/local/share/nls/fr_FR.UTF-8 ># droidcam/work/stage/usr/local/share/nls/en_CA.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/tr_TR.UTF-8 ># droidcam/work/stage/usr/local/share/nls/de_DE.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/ro_RO.UTF-8 ># droidcam/work/stage/usr/local/share/nls/el_GR.ISO8859-7 ># droidcam/work/stage/usr/local/share/nls/ca_ES.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/de_AT.UTF-8 ># droidcam/work/stage/usr/local/share/nls/en_AU.US-ASCII ># droidcam/work/stage/usr/local/share/nls/en_GB.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/ca_ES.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/uk_UA.KOI8-U ># droidcam/work/stage/usr/local/share/nls/is_IS.UTF-8 ># droidcam/work/stage/usr/local/share/nls/zh_CN.UTF-8 ># droidcam/work/stage/usr/local/share/nls/es_ES.ISO8859-15 ># droidcam/work/stage/usr/local/share/nls/en_US.ISO8859-1 ># droidcam/work/stage/usr/local/share/nls/sv_SE.UTF-8 ># droidcam/work/stage/usr/local/share/nls/zh_CN.GBK ># droidcam/work/stage/usr/local/share/nls/ru_RU.ISO8859-5 ># droidcam/work/stage/usr/local/share/nls/ru_RU.CP1251 ># droidcam/work/stage/usr/local/share/nls/fr_BE.UTF-8 ># droidcam/work/stage/usr/local/share/nls/de_DE.UTF-8 ># droidcam/work/stage/usr/local/share/nls/af_ZA.UTF-8 ># droidcam/work/stage/usr/local/tests ># droidcam/work/stage/usr/local/www ># droidcam/work/stage/usr/local/lib ># droidcam/work/stage/usr/local/lib/debug ># droidcam/work/stage/usr/local/lib/X11 ># droidcam/work/stage/usr/local/lib/X11/app-defaults ># droidcam/work/stage/usr/local/bin ># droidcam/work/stage/usr/local/sbin ># droidcam/work/stage/usr/local/include ># droidcam/work/stage/usr/local/include/X11 ># droidcam/work/stage/usr/local/etc ># droidcam/work/stage/usr/local/etc/newsyslog.conf.d ># droidcam/work/stage/usr/local/etc/man.d ># droidcam/work/stage/usr/local/etc/pam.d ># droidcam/work/stage/usr/local/etc/rc.conf.d ># droidcam/work/stage/usr/local/etc/rc.d ># droidcam/work/stage/usr/local/etc/devd ># droidcam/work/stage/usr/local/etc/libmap.d ># droidcam/work/.stage_done.droidcam._usr_local ># droidcam/work/.license-report ># droidcam/work/.extract_done.droidcam._usr_local ># droidcam/work/.PLIST.setuid ># droidcam/Makefile ># droidcam/pkg-descr ># droidcam/distinfo ># >echo c - droidcam >mkdir -p droidcam > /dev/null 2>&1 >echo c - droidcam/files >mkdir -p droidcam/files > /dev/null 2>&1 >echo x - droidcam/files/patch-droidcam.desktop >sed 's/^X//' >droidcam/files/patch-droidcam.desktop << '77fcd4154997a312f1014f3b33ac25b6' >X--- droidcam.desktop.orig 2024-04-18 16:03:55 UTC >X+++ droidcam.desktop >X@@ -4,7 +4,7 @@ Exec=/usr/local/bin/droidcam >X Comment=Use your phone as a webcam >X TryExec=/usr/local/bin/droidcam >X Exec=/usr/local/bin/droidcam >X-Icon=/opt/droidcam-icon.png >X+Icon=/usr/local/share/pixmaps/droidcam-icon.png >X Terminal=false >X Type=Application >X Categories=Video;AudioVideo; >77fcd4154997a312f1014f3b33ac25b6 >echo c - droidcam/work >mkdir -p droidcam/work > /dev/null 2>&1 >echo x - droidcam/work/.install_done.droidcam._usr_local >sed 's/^X//' >droidcam/work/.install_done.droidcam._usr_local << 'ef5b88368dd7f8f06d7049a0c442896e' >ef5b88368dd7f8f06d7049a0c442896e >echo x - droidcam/work/.configure_done.droidcam._usr_local >sed 's/^X//' >droidcam/work/.configure_done.droidcam._usr_local << 'fd9a2b936717d148a9b0ad276519e9a6' >fd9a2b936717d148a9b0ad276519e9a6 >echo x - droidcam/work/.PLIST.flattened >sed 's/^X//' >droidcam/work/.PLIST.flattened << '3ddd639c62c7723eb1c1f1f7f90b65fa' >X/usr/local/bin/droidcam >X/usr/local/bin/droidcam-cli >X/usr/local/share/applications/droidcam.desktop >X/usr/local/share/pixmaps/droidcam-icon.png >X/usr/local/share/licenses/droidcam-2.1.3/catalog.mk >X/usr/local/share/licenses/droidcam-2.1.3/LICENSE >X/usr/local/share/licenses/droidcam-2.1.3/GPLv2 >3ddd639c62c7723eb1c1f1f7f90b65fa >echo x - droidcam/work/.PLIST.mktmp >sed 's/^X//' >droidcam/work/.PLIST.mktmp << '7b2cc20e62f234810f06c8a049e047a7' >Xbin/droidcam >Xbin/droidcam-cli >Xshare/applications/droidcam.desktop >Xshare/pixmaps/droidcam-icon.png >X/usr/local/share/licenses/droidcam-2.1.3/catalog.mk >X/usr/local/share/licenses/droidcam-2.1.3/LICENSE >X/usr/local/share/licenses/droidcam-2.1.3/GPLv2 >7b2cc20e62f234810f06c8a049e047a7 >echo x - droidcam/work/.license_done.droidcam._usr_local >sed 's/^X//' >droidcam/work/.license_done.droidcam._usr_local << 'ad7e50a3f575d7cfcfc87391cc0961ad' >ad7e50a3f575d7cfcfc87391cc0961ad >echo x - droidcam/work/.patch_done.droidcam._usr_local >sed 's/^X//' >droidcam/work/.patch_done.droidcam._usr_local << 'e581262c1affc43d0cb409f98c6de202' >e581262c1affc43d0cb409f98c6de202 >echo x - droidcam/work/.PLIST.droidcam >sed 's/^X//' >droidcam/work/.PLIST.droidcam << '602a3c0e4dbef18e3583a07e2d93c4cf' >Xbin/droidcam >Xbin/droidcam-cli >Xshare/applications/droidcam.desktop >Xshare/pixmaps/droidcam-icon.png >X/usr/local/share/licenses/droidcam-2.1.3/catalog.mk >X/usr/local/share/licenses/droidcam-2.1.3/LICENSE >X/usr/local/share/licenses/droidcam-2.1.3/GPLv2 >602a3c0e4dbef18e3583a07e2d93c4cf >echo c - droidcam/work/droidcam-2.1.3 >mkdir -p droidcam/work/droidcam-2.1.3 > /dev/null 2>&1 >echo x - droidcam/work/droidcam-2.1.3/icon2.png >sed 's/^X//' >droidcam/work/droidcam-2.1.3/icon2.png << 'a3c865e8e16955d73bac9932d86d77f3' >XPNG >X >X >X¯´ûy Ðÿ/åË1T¡°üüÞáÂõ|{bò/g@èµ®Ád&Û(Ü',áÆAõÅ Tq4i·ðJìÖä= ÌÞí1(ûìè±X6};15.´2_,º¦¬ ¿w$êèºnÛvï¨7OVáîQ+±dú^©3\^ >XËT¹ËSa 0Éò,¦¾çxÔúDàñëé?±Ë¯ÏüÑkBùÀï`458²¾aL£G`ñÝ¢ü2:ò1,² ¨o°ÈV>MÞJ~xPiÖñÂÏ°íÔȽøïÎÈQølÏ|ØÏ®6Ï8OþFçÖñÃùª° e3¼Ám³ùØìÌzOD¦é$¯Cbį;¬ü/3bÇ©wEn<¼I·,¸îÌpí8<8nÖí»_,ºªû£-øûÇ|@M|gTÔÃÁ¼Õ41'Mçù2ÑS}®XUWHß÷!eÊÖïc¾³'ç %[CïÁí·þ¬Ôró¹ ®ï[ÌuP°´üÖ¯í¯sпÒæo4Ò^{:øO">é»(t f2iµ/fyÞîy~Hø$êhÀ×êMÂb&Ç?DÙ¡ëúª"9õßÇ2)ö÷vÒµîþpY]#tIÐIO}ZÏ[Ù9#ÞÆ-þãQZ¸i M¹¡kÏÅ=ÓP\¸à© êð3úÏ s'!»dËëE.«* ã¢pÚoι¾D"Ãð°èhßçÆF=ÓÕ%Jz¯2,ï7 >XA>Ñ$.ød±þÂ}öêÀ¶ý§ ·u[x*D ÜÕÓÔ.'úÃúFo0Yz5p¯*´Wàïír»u)Q**xzh{%¾êpu«KY§óf³ ï+¸¼¥«á¤§9riï ¤"«W.iâÑïêÅ)Sz^ë?ØJÙ×+Dc¯äº8ÀËuz#2õ¹ÚÊm¸ÖÜø\|BÖ±å[KÊ>*_ þÔ*pöòLnöިr©ÓÂC®éu\©9Mbm\s^c6 Ë @ùÍñ¬<ñyblw¼#Ê1³G¼~^1×ø¾Å´³ë°)}Y ^tN4©f}Iôö6É»üÒÏmlvC<aãï_ùrÔVç+ÛiO¢¸üT»Êí²î&ù)Z)ßj® >X^Ç µ§ÊÒl°õê^ÉôF]k·ªMþî:å³Dú§àI<ÉÖ®þV§îD®ÀÃW·0×q¤ÒÍq3 'Å.!;Äæ9>ê0¤ùíÈÞQ ÖÄßsÕ¿OçE8è*20Ûá¹ Á³ Qy9]Cr~«ú>_Ïp»£¿I<Z¸jrÝyBe]1*jÎÓu$Â:U >Xh=#î@ïä½:1¡´@)SÂSéïð\R+î¥Þ sªüå<ÀÒÉ}6:ý¤åoÀñÂ/PT~5 WÑrysË1¾ý<ä¨È_Oî$+°föÎdÿíI8å=Ùôy.xwÎß°ëô¸\]$8¹ø¶\nü+5gQ½rWcHè¸k䢰֥ÇPVOüÙ%{¡ »T+»UNä|H¾;£`r/îÆQ/cbìR7ÎwF¿ÿørµØiÅ·]®k½±ë,Ãå«ùø{RTNÊ¿ºRR^çÜL*' -Ø~òMáÍç&¾ÙsêM=IùUuEø`ס|¥¼sÇW7ÕJð¶|Î @[ÁsýGÛqFùÌ4Lf#&£xuy1ì¶X¼Ë»Ý´=?¿ ?di^Á(æ4ªû Ö+T¬«7X±ûÀ ùp îÀÂó~Èz Vo;{Ñj£££ïFÊ '1@;*¹RäÕºÈ <ápÞßQ\ñ3%2ËO¹XvþJù°ÛQ°ÃùãRu1QG¹ÓÁ²Û~À#68UôøËej¨~èïCþ3cÚàÅ¢ph;qbOÎÛî;½i`®~8ÿïvç^õ¤üèÀD,±^'Ø/(|qßèwéø+Y¶¦x1Æ Ê3È»´§op©:G´ *llÓ4±?oÜ×ÕbÊuyÈ.ÝsW~B¾õÆSV`üÀy¨·ÑØÃî¶Ç?ïÛ°òêô 6§óHKãcA¨vTQ¯=ß&Ó1ÇÎÖêýYÃþBnJc³2É/;Bïû.EÇì2µÒâµù~°ïPüvÚú}-ÂG{æáTñWÍïû{Ç .x²XÛ6#¢ÜCWL¬êjß@WÅæ{<Ñßg °Í5"]>YÅ5 iTÁð÷ >X£Kæßg®q¥IBûQêôå¼9mßçm OêxyøíäûÌWðÕÑgÿ|¼p¹bPRÑPQ[±®ùýïÇ)]7î ߣËÑ<©SK#©bÓV«³qªhJ*OPPÖ"«d»P fÞ¦iûàqÂ.Ög°·ú }t ¹(©NPI£»¨<¨¦g.þ$,76pÞ#È7gí°@Ñ Û]Zi»] ÛAªj/áBufs¹¢º®Zôâ(drÑ1%iew f\Õ*¾Pe3Ç`vÄ.ÎWÒwïhwt2I;û©pE?ùȪtî¶3iô«EM]P%j¿ö-ø o1úOS¢ubÔfámox·W¸ g[ïÚ³Xe¶j¥ilóû=(²¦ÅDWkê+ÈeI)o0áö¡Ë1!öw¸JF)ó¦<a¸Xt-¨Á§Ò¹56««ÌNÃ%µüýç8ùì Yr¶¼à¬ÅÕEþåt´µi,?t¾¹òJÜ9b9+Åûk«íNæn§íí'_¢ïL³3lÓI;÷LbKzÇu#NêÌ\et2rr¤¥UbÄiT!²Û}pÙI0&z>r/¦ÃVÇû|îäjhRäÍÊ¿.kÖWcÝÞÍÜÞ佡q÷DGµ¥¦|¡Î '@ï8»çWEU]¹ÍÒJcßDUm%vç¼f÷¼Ú³H;·ÌÞy3Lzý5Á4ÂìxO~ W·ÆÌõ~C9ÀAoæÁ×ÿ-ËͤíÙ(×&Ç/w¸WÓ a@÷þü&Òî»s^m|NvA°îpøcÎ[b߶1Q_÷~em>Þ/j*IY2«ÒB;F¼÷.$Ks´,ÔL3Ò¬m*Rk0å+ÉÙ4n04 >Xc£8ýìÜõG.í³C¿Á=IïÓóy]çz¶ø/,Ú!â°DøÂZÓ¥[12bùà8þÅ RÈÄRþåb>·ýÆF?F Ö×8ÿ5%Xr»£ÑJA³X~ÕE:y)å >XÜ;úѹݾ(ÃÁüOPRä'ÄâCvEåé8|îcx´sEM»1vERGÏoƱÍ"prÍk°Rndeù¼qkQ¡û¹4 toAPVöº¿ûXßaÊOâ³+KÄ__oj9íöæq1v3<¥R©Ë½Ñå<\ïrÚ NAÏØ©%Îä«JþãbÞÐw±;SL%V]ttØNĸù©3·þåiÆÅÓ·ÉÞ`£3jõ%kÔAxlòáê:V%þ¹1öÈbT¢ÀüOErõÝñç)ª¾µ½k°xÔ³{H0_ML+¾Ç=k q*lKR?øÛ°ª _B¯7³5!ØLÄâA¢Á~¿â¶*i·g÷zÌà uiGaá¤Mbà³ëwi¯Í >X§µ¸ êKCÃç 1rèèø½z7"Ô×âÊÕ\h=£n転ÅÁ²)})vf¾UÎÏukÔX1ó]+¢Sò¸ËVúy´Àb1K]á~ø]Ó¸)«óÂV#Öãë ÓW4»ÕKÙïúÕÈ~z«üÅßëÎ5ÎrYDc®Fk/²]{¼è_pÕBy¹Ô£¡üK ®SÒ;¿ ·nÀð`,Uض\Íéò®¡¢?f`þ³Î#§äìrõ¼ôMB3{µð!Ĩ<_ð" iïcËgQPÙ!nï\ À+&¯!Ú§/ìKvA¦ÿ±áà±¾+9f±¨VÚE_â¬ÿ;6M/þgô¯ FÄ?Gbj1l-ºÕ£¶¡ºÜ3dAÀS·²y}.§lÏ|²úµbð¸Æý?gi>Y¼ù5{æ~îá¢=Ò¶6è¯ §>±Õ´aK)*?ÒÊ[NïD¿Kqà ¡3Wó·Ú2AUm9%ZR¸b)¶^ Ƨn;â7üx3zÎë¯[çé >XB]¹;K±wÅVi¥®plHÌô¶Ñ1æ-·Zp XÉLÛ?¶U&¬yé&Ä.{ËàbæÅå >X¶2.]´uðû®ê±X¬»ksËÊo >XNSâV¼Òf)bâ åo$LÚ_oè¾íÜof©Õ1&ê·ÞýEP¶h|`̺Gûy \ìÎ_» ç±ãÎM|ÿ »Å8¯èüE·Ìò÷¾¥ 'üÂDoîoÕ5òC&í[0aóµB[Ñ*.ÙjË«ª+ >Xû"}ɻǾm PîßoâM¢È]4ã.Z}×ðUϨ¾U×G}Ù¶Íü1ûÕg.ý8"¸`äR÷®¶ðÛTºðTª¥î÷Ôë1ý§î²ù1gS+3F»²?¥¸âè¨+5¹±×®ê¦C.Uê5ñÙaÚÄ´¨äý¸¸ugg°[zØBm7nqÐ×äÿÉV¶x úJIEND®B`a3c865e8e16955d73bac9932d86d77f3 >echo x - droidcam/work/droidcam-2.1.3/README-DKMS.md >sed 's/^X//' >droidcam/work/droidcam-2.1.3/README-DKMS.md << '6c6de8920ba9292f5cfba152250e234a' >XDKMS for `v4l2loopback_dc` >X========================= >X >XThe [DKMS mechanism][DKMS] is a convenient way to have extra Linux kernel modules managed outside of the kernel tree source to _survive_ kernel updates. >X >XOnce the `v4l2loopback_dc` module, which is necessary for [Droidcam] to work, has been built and installed, you may face at some point that after a system update, implying a kernel update, [Droidcam] may not work anymore... when running `droidcam`, it may fail starting with the following message: >X >X``` >XDevice not found (/dev/video[0-9]). >XDid you install it? >X``` >X >XThis is just because the newly installed kernel does not come with the `v4l2loopback_dc` module, thus you would then have to re-install it manually again. You may have forgotten what you did the first time, have to dig again into documentation, how you did it on the first place... >X >XThis is where [DKMS] comes into the picture. >X >XBy properly declaring the `v4l2loopback_dc` module as a [DKMS] module, future installs of kernel upgrades will _automatically_ take `v4l2loopback_dc` module re-installation into account after the kernel has been updated. >X >X**If your system supports DKMS, it should probably be your prefered install mechanism.** Both for the fact it survives kernel updates, but also for the fact it keeps your kernel module tree _clean_, as extra [DKMS] modules are kept in separated directories. >X >X# DKMS flavour installation of `droidcam` >X >XFirst clone the `droidcam` Github repo anywhere you want (in `/opt` for example): >X >X $ git clone https://github.com/dev47apps/droidcam.git >X >XBuild it following the standard procedure described [here][droidcam build procedure]. >X >X**:information_source: The pre-requisite for what's coming next is that the previous build succeeded.** >X >X >XFrom within the repository, go to the `linux` directory, and then issue a: >X >X $ sudo ./install-dkms [width] [height] >X >XIf you want specific webcam resolution, you can directly pass the width and height to the script (as for the standard install script). Default is 640 480. >X >X:information_source: After this, the module is built, loaded (you may check this using `lsmod|grep v4l2loopback_dc`), and its config for the webcam resolution is created in the file `/etc/modprobe.d/droidcam.conf` (you may want to edit this file afterwards, or you can re-run the install script multiple times with different parameters which is harmless). [Supported webcam resolutions are listed here][webcam resolutions]. >X >X >X# Uninstalling `droidcam` after a DKMS install >X >X >XFrom within the repository, go to the `linux` directory, and then issue a: >X >X $ sudo ./uninstall-dkms >X >XOr alternatively, in case you removed the original repository after install, you can issue: >X >X $ sudo /opt/droidcam-uninstall >X >X >X[DKMS]: https://github.com/dell/dkms "DKMS source code page on Github" >X[Droidcam]: https://github.com/dev47apps/droidcam "Droid source code page on Github" >X[droidcam build procedure]: https://github.com/dev47apps/droidcam/tree/master/linux "droidcam build procedure" >X[webcam resolutions]: http://www.dev47apps.com/droidcam/linux/ "Supported webcams resolutions" >X >6c6de8920ba9292f5cfba152250e234a >echo c - droidcam/work/droidcam-2.1.3/src >mkdir -p droidcam/work/droidcam-2.1.3/src > /dev/null 2>&1 >echo x - droidcam/work/droidcam-2.1.3/src/common.h >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/common.h << '40b01fc43745795bb945987154ad9449' >X/* DroidCam & DroidCamX (C) 2010-2021 >X * https://github.com/dev47apps >X * >X * This program is distributed in the hope that it will be useful, >X * but WITHOUT ANY WARRANTY; without even the implied warranty of >X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. >X */ >X >X#ifndef _COMMON_H_ >X#define _COMMON_H_ >X >X#define APP_VER_INT 213 >X#define APP_VER_STR "2.1.3" >X >X#define MSG_ERROR(str) ShowError("Error",str) >X#define MSG_LASTERROR(str) ShowError(str,strerror(errno)) >Xvoid ShowError(const char*, const char*); >X >X#define ADB_LOCALHOST_IP "127.0.0.1" >X >X#define VIDEO_REQ "CMD /v3/video/%s/%dx%d" >X#define OTHER_REQ "CMD /v1/ctl?%d" >X#define OTHER_REQ_INT "CMD /v1/ctl?%d=%d" >X#define OTHER_REQ_STR "CMD /v1/ctl?%d=%s" >X >X#define AUDIO_REQ "CMD /v2/audio" >X#define STOP_REQ "CMD /v1/stop" >X >X#define PING_REQ "CMD /ping" >X#define BATTERY_REQ "GET /battery HTTP/1.0\r\n\r\n" >X >X#define CSTR_LEN(x) (sizeof(x)-1) >X#define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0])) >X >X#define errprint(...) fprintf(stderr, __VA_ARGS__) >X#ifdef DEBUG >X#define dbgprint errprint >X#else >X#define dbgprint(...) /* */ >X#endif >X >X#define VIDEO_INBUF_SZ 4096 >X#define AUDIO_INBUF_SZ 32 >X >X#ifndef FALSE >X# define FALSE 0 >X#endif >X >X#ifndef TRUE >X# define TRUE 1 >X#endif >X >X#endif >40b01fc43745795bb945987154ad9449 >echo x - droidcam/work/droidcam-2.1.3/src/usb.c >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/usb.c << '71e611f27eb59d1d134bc30d783b4ce3' >X/* DroidCam & DroidCamX (C) 2010-2021 >X * https://github.com/dev47apps >X * >X * This program is distributed in the hope that it will be useful, >X * but WITHOUT ANY WARRANTY; without even the implied warranty of >X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. >X */ >X >X#include <fcntl.h> >X#include <stdio.h> >X#include <stdlib.h> >X#include <string.h> >X#include "usbmuxd.h" >X >X#if __FreeBSD__ >X#include <sys/wait.h> >X#endif >X >X#include "common.h" >X#include "settings.h" >X >Xvoid AdbErrorPrint(int rc) { >X switch (rc) { >X case ERROR_ADDING_FORWARD: >X MSG_ERROR("Error adding adb forward: re-attach the device.\n"); >X break; >X case ERROR_DEVICE_OFFLINE: >X MSG_ERROR("Device is offline: re-attach the device."); >X break; >X case ERROR_DEVICE_NOTAUTH: >X MSG_ERROR("Device is in unauthorized state:\n" >X "Re-attach device and make sure to Allow the USB debugging connection when prompted."); >X break; >X case ERROR_LOADING_DEVICES: >X MSG_ERROR("Error loading devices: check if adb is installed."); >X break; >X case ERROR_NO_DEVICES: >X default: >X MSG_ERROR("No devices detected:\n" >X "Re-attach device and try running `adb devices` in Terminal."); >X break; >X } >X} >X >X >Xint CheckAdbDevices(int port) { >X char buf[256]; >X FILE* pipe; >X int rc = system("adb start-server"); >X if (WEXITSTATUS(rc) != 0){ >X rc = ERROR_LOADING_DEVICES; >X goto EXIT; >X } >X >X pipe = popen("adb devices", "r"); >X if (!pipe) { >X rc = ERROR_LOADING_DEVICES; >X goto EXIT; >X } >X >X rc = ERROR_NO_DEVICES; >X >X while (!feof(pipe)) { >X if (fgets(buf, sizeof(buf), pipe) == NULL) break; >X dbgprint("Got line: %s", buf); >X if (strstr(buf, "List of") != NULL){ >X continue; >X } >X if (strstr(buf, "offline") != NULL){ >X rc = ERROR_DEVICE_OFFLINE; >X if (system("adb kill-server") < 0){} >X break; >X } >X if (strstr(buf, "unauthorized") != NULL){ >X rc = ERROR_DEVICE_NOTAUTH; >X break; >X } >X if (strstr(buf, "device") != NULL && strstr(buf, "??") == NULL){ >X rc = NO_ERROR; >X break; >X } >X } >X pclose(pipe); >X >XEXIT: >X dbgprint("CheckAdbDevices rc=%d\n", rc); >X >X if (rc == NO_ERROR) { >X snprintf(buf, sizeof(buf), "adb forward tcp:%d tcp:%d", port, port); >X rc = system(buf); >X if (WEXITSTATUS(rc) != 0){ >X rc = ERROR_ADDING_FORWARD; >X } >X } >X >X return rc; >X} >X >Xvoid iOSErrorPrint(int rc) { >X switch (rc) { >X case ERROR_LOADING_DEVICES: >X MSG_ERROR("Error loading devices:\n" >X "Make sure usbmuxd service is installed and running."); >X break; >X case ERROR_NO_DEVICES: >X MSG_ERROR("No devices detected:\n" >X "Make sure usbmuxd service running and this computer is trusted."); >X break; >X case ERROR_ADDING_FORWARD: >X MSG_ERROR("Error getting a connection:\n" >X "Make sure DroidCam app is open.\n" >X "Try re-attaching device."); >X break; >X default: >X errprint("unexpected rc=%d from CheckiOSDevices()\n", rc); >X break; >X } >X} >X >Xint CheckiOSDevices(int port) { >X usbmuxd_device_info_t *deviceList = NULL; >X const int deviceCount = usbmuxd_get_device_list(&deviceList); >X dbgprint("CheckiOSDevices: found %d devices\n", deviceCount); >X >X if (deviceCount < 0) { >X return ERROR_LOADING_DEVICES; >X } >X if (deviceCount == 0) { >X usbmuxd_device_list_free(&deviceList); >X return ERROR_NO_DEVICES; >X } >X >X const int sfd = usbmuxd_connect(deviceList[0].handle, port); >X if (sfd <= 0) { >X usbmuxd_device_list_free(&deviceList); >X return ERROR_ADDING_FORWARD; >X } >X >X // remove the NONBLOCK flag >X int flags = fcntl(sfd, F_GETFL, NULL); >X flags &= ~O_NONBLOCK; >X fcntl(sfd, F_SETFL, flags); >X >X usbmuxd_device_list_free(&deviceList); >X return sfd; >X} >71e611f27eb59d1d134bc30d783b4ce3 >echo x - droidcam/work/droidcam-2.1.3/src/droidcam-cli.c >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/droidcam-cli.c << '69bcec95419e1881ee17e5727713fbd2' >X/* DroidCam & DroidCamX (C) 2010-2021 >X * https://github.com/dev47apps >X * >X * This program is distributed in the hope that it will be useful, >X * but WITHOUT ANY WARRANTY; without even the implied warranty of >X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. >X */ >X >X#include <pthread.h> >X#include <signal.h> >X >X#include "common.h" >X#include "settings.h" >X#include "connection.h" >X#include "decoder.h" >X >Xtypedef struct Thread { >X pthread_t t; >X int rc; >X} Thread; >X >XThread athread = {0, -1}, vthread = {0, -1}, dthread = {0, -1}; >X >Xchar *v4l2_dev = 0; >Xunsigned v4l2_width = 640, v4l2_height = 480; >Xvolatile int a_active = 0; >Xvolatile int v_active = 0; >Xvolatile int v_running = 0; >Xvolatile int a_running = 0; >Xvolatile int thread_cmd = 0; >Xint no_controls = 0; >Xstruct settings g_settings = {0}; >X >Xextern const char *thread_cmd_val_str; >Xextern char snd_device[32]; >Xextern char v4l2_device[32]; >Xvoid * AudioThreadProc(void * args); >Xvoid * VideoThreadProc(void * args); >Xvoid * DecodeThreadProc(void * args); >X >Xvoid sig_handler(__attribute__((__unused__)) int sig) { >X a_running = 0; >X v_running = 0; >X return; >X} >X >Xvoid ShowError(const char * title, const char * msg) { >X errprint("%s: %s\n", title, msg); >X} >X >Xvoid UpdateBatteryLabel(char *battery_value) { >X (void) battery_value; >X} >X >Xstatic inline void usage(__attribute__((__unused__)) int argc, char *argv[]) { >X fprintf(stderr, "Usage: \n" >X " %s [options] -l <port>\n" >X " Listen on 'port' for connections (video only)\n" >X "\n" >X " %s [options] <ip> <port>\n" >X " Connect via ip\n" >X "\n" >X " %s [options] adb <port>\n" >X " Connect via adb to Android device\n" >X "\n" >X " env ANDROID_SERIAL=<serial> %s [options] adb <port>\n" >X " Connect via adb to Android device with serial number <serial>\n" >X " (use `adb devices` to find serial number)\n" >X "\n" >X " %s [options] ios <port>\n" >X " Connect via usbmuxd to iDevice\n" >X "\n" >X "Options:\n" >X " -a Enable Audio\n" >X " -v Enable Video\n" >X " (only -v by default)\n" >X "\n" >X " -vflip Apply vertical flip\n" >X " -hflip Apply horizontal flip\n" >X "\n" >X " -nocontrols Disable controls and avoid reading from stdin.\n" >X " Otherwise, enter '?' for list of commands while streaming.\n" >X "\n" >X " -dev=PATH Specify v4l2loopback device to use, instead of first available.\n" >X " Ex: -dev=/dev/video5\n" >X "\n" >X " -size=WxH Specify video size (when using the regular v4l2loopback module)\n" >X " Ex: 640x480, 1280x720, 1920x1080\n" >X "\n" >X , >X argv[0], >X argv[0], >X argv[0], >X argv[0], >X argv[0]); >X} >X >Xstatic void parse_args(int argc, char *argv[]) { >X if (argc >= 3) { >X int i = 1; >X for (; i < argc; i++) { >X if (argv[i][0] == '-' && argv[i][1] == 'v' && argv[i][2] == 'f' && argv[i][3] == 'l' && argv[i][5] == 'p') { >X g_settings.vertical_flip = 1; >X continue; >X } >X if (argv[i][0] == '-' && argv[i][1] == 'h' && argv[i][2] == 'f' && argv[i][3] == 'l' && argv[i][5] == 'p') { >X g_settings.horizontal_flip = 1; >X continue; >X } >X >X if (argv[i][0] == '-' && argv[i][1] == 'a') { >X a_running = 1; >X continue; >X } >X if (argv[i][0] == '-' && argv[i][1] == 'v') { >X v_running = 1; >X continue; >X } >X >X if (argv[i][0] == '-' && argv[i][1] == 'd' && argv[i][3] == 'v') { >X if (argv[i][4] != '=' || argv[i][5] == 0) >X goto ERROR; >X >X v4l2_dev = &argv[i][5]; >X continue; >X } >X if (argv[i][0] == '-' && argv[i][1] == 's' && argv[i][3] == 'z') { >X if (sscanf(argv[i], "-size=%dx%d", &v4l2_width, &v4l2_height) != 2) >X goto ERROR; >X continue; >X } >X >X if (argv[i][0] == '-' && strstr(&argv[i][1], "nocontrols") != NULL) { >X no_controls = 1; >X continue; >X } >X break; >X } >X if (i > (argc - 2)) >X goto ERROR; >X >X if (argv[i][0] == '-' && argv[i][1] == 'l') { >X g_settings.port = strtoul(argv[i+1], NULL, 10); >X g_settings.connection = CB_WIFI_SRVR; >X a_running = 0; >X v_running = 1; >X return; >X } >X >X strncpy(g_settings.ip, argv[i], sizeof(g_settings.ip) - 1); >X g_settings.ip[sizeof(g_settings.ip) - 1] = '\0'; >X g_settings.port = strtoul(argv[i+1], NULL, 10); >X >X if (strcmp(g_settings.ip, "adb") == 0) { >X g_settings.connection = CB_RADIO_ADB; >X memset(g_settings.ip, 0, sizeof(g_settings.ip)); >X strncpy(g_settings.ip, ADB_LOCALHOST_IP, sizeof(g_settings.ip)); >X } >X else if (strcmp(g_settings.ip, "ios") == 0) { >X g_settings.connection = CB_RADIO_IOS; >X } >X else { >X g_settings.connection = CB_RADIO_WIFI; >X } >X >X return; >X } >X >XERROR: >X usage(argc, argv); >X exit(1); >X} >X >Xvoid wait_command() { >X char buf[1]; >X int flags; >X ssize_t len; >X >X flags = fcntl(STDIN_FILENO, F_GETFL, 0); >X if (flags < 0) >X return; >X >X fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK); >X >X while (v_running) { >X len = read(STDIN_FILENO, buf, 1); >X if (len == 0) >X return; >X >X if (len < 0) { >X if (errno == EAGAIN || errno == EWOULDBLOCK) { >X usleep(2000); >X continue; >X } >X return; >X } >X >X switch(buf[0]) { >X case '?': >X printf("M: Horizontal Flip / Mirror\n"); >X printf("V: Vertical Flip\n"); >X printf("A: Auto-focus\n"); >X printf("L: Toggle Flash\n"); >X printf("+: Zoom In\n"); >X printf("-: Zoom Out\n"); >X break; >X case '=': >X case '+': >X thread_cmd = CB_CONTROL_ZOOM_IN; >X break; >X case '-': >X thread_cmd = CB_CONTROL_ZOOM_OUT; >X break; >X case 'a': >X case 'A': >X thread_cmd = CB_CONTROL_AF; >X break; >X case 'l': >X case 'L': >X thread_cmd = CB_CONTROL_LED; >X break; >X case 'm': >X case 'M': >X decoder_horizontal_flip(); >X break; >X case 'v': >X case 'V': >X decoder_vertical_flip(); >X break; >X } >X } >X} >X >Xint main(int argc, char *argv[]) { >X parse_args(argc, argv); >X >X if (!v_running && !a_running) >X v_running = 1; >X >X if (!decoder_init(v4l2_dev, v4l2_width, v4l2_height)) { >X return 2; >X } >X >X printf("Client v" APP_VER_STR "\n"); >X if (v_running) { >X printf("Video: %s\n", v4l2_device); >X SOCKET videoSocket = INVALID_SOCKET; >X if (g_settings.connection == CB_RADIO_WIFI || g_settings.connection == CB_RADIO_ADB || g_settings.connection == CB_RADIO_IOS) { >X >X if (g_settings.connection == CB_RADIO_ADB) { >X int rc = CheckAdbDevices(g_settings.port); >X if (rc != NO_ERROR) { >X AdbErrorPrint(rc); >X return 1; >X } >X } >X >X if (g_settings.connection == CB_RADIO_IOS) { >X int rc = CheckiOSDevices(g_settings.port); >X if (rc <= 0) { >X iOSErrorPrint(rc); >X return 1; >X } >X videoSocket = rc; >X } >X else { >X char *errmsg = NULL; >X videoSocket = Connect(g_settings.ip, g_settings.port, &errmsg); >X if (videoSocket == INVALID_SOCKET) { >X errprint("Video: Connect failed to %s:%d\n", g_settings.ip, g_settings.port); >X if (errmsg) errprint("%s", errmsg); >X return 0; >X } >X } >X } >X vthread.rc = pthread_create(&vthread.t, NULL, VideoThreadProc, (void*) (SOCKET_PTR) videoSocket); >X dthread.rc = pthread_create(&dthread.t, NULL, DecodeThreadProc, NULL); >X } >X >X if (a_running){ >X printf("Audio: %s\n", snd_device); >X if (!v_running) { >X if (g_settings.connection == CB_RADIO_ADB && CheckAdbDevices(g_settings.port) != 0) >X return 1; >X } >X >X athread.rc = pthread_create(&athread.t, NULL, AudioThreadProc, NULL); >X } >X >X signal(SIGINT, sig_handler); >X signal(SIGHUP, sig_handler); >X >X if (g_settings.vertical_flip) >X decoder_vertical_flip(); >X >X if (g_settings.horizontal_flip) >X decoder_horizontal_flip(); >X >X if (!no_controls) >X wait_command(); >X >X while (v_running || a_running) >X usleep(2000); >X >X dbgprint("joining\n"); >X sig_handler(SIGHUP); >X if (athread.rc == 0) pthread_join(athread.t, NULL); >X if (vthread.rc == 0) pthread_join(vthread.t, NULL); >X if (dthread.rc == 0) pthread_join(dthread.t, NULL); >X >X decoder_fini(); >X dbgprint("exit\n"); >X return 0; >X} >69bcec95419e1881ee17e5727713fbd2 >echo x - droidcam/work/droidcam-2.1.3/src/connection.c >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/connection.c << '7782e215ac57a5ecad2107461cfcb156' >X/* DroidCam & DroidCamX (C) 2010-2021 >X * https://github.com/dev47apps >X * >X * This program is distributed in the hope that it will be useful, >X * but WITHOUT ANY WARRANTY; without even the implied warranty of >X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. >X */ >X >X#include <arpa/inet.h> >X#include <errno.h> >X#include <fcntl.h> >X#include <stdio.h> >X#include <string.h> >X#include <sys/select.h> >X#include <sys/socket.h> >X#include <time.h> >X#include <unistd.h> >X >X#if __FreeBSD__ >X#include <netinet/in.h> >X#include <ifaddrs.h> >X#include <net/if.h> >X#endif >X >X#include "common.h" >X#include "connection.h" >X >XSOCKET wifiServerSocket = INVALID_SOCKET; >Xextern int v_running; >X >Xchar* DROIDCAM_CONNECT_ERROR = \ >X "Connect failed, please try again.\n" >X "Check IP and Port.\n" >X "Check network connection.\n"; >X >XSOCKET Connect(const char* ip, int port, char **errormsg) { >X int flags; >X struct sockaddr_in sin; >X SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); >X >X dbgprint("connect to %s:%d\n", ip, port); >X if(sock == INVALID_SOCKET) { >X errprint("socket() error %d '%s'\n", errno, strerror(errno)); >X *errormsg = strerror(errno); >X goto _error_out; >X } >X >X sin.sin_family = AF_INET; >X sin.sin_addr.s_addr = inet_addr(ip); >X sin.sin_port = htons(port); >X >X flags = fcntl(sock, F_GETFL, NULL); >X if(flags < 0) { >X errprint("fcntl() error %d '%s'\n", errno, strerror(errno)); >X *errormsg = strerror(errno); >X close(sock); >X sock = INVALID_SOCKET; >X goto _error_out; >X } >X flags |= O_NONBLOCK; >X fcntl(sock, F_SETFL, flags); >X >X struct timeval timeout; >X timeout.tv_sec = 2; >X timeout.tv_usec = 0; >X >X fd_set set; >X FD_ZERO(&set); >X FD_SET(sock, &set); >X >X connect(sock, (struct sockaddr*)&sin, sizeof(sin)); >X if (!(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINPROGRESS) || (select(sock+1, NULL, &set, NULL, &timeout) <= 0)) { >X dbgprint("connect timeout/error=%d '%s'\n", errno, strerror(errno)); >X *errormsg = DROIDCAM_CONNECT_ERROR; >X close(sock); >X sock = INVALID_SOCKET; >X goto _error_out; >X } >X >X flags = fcntl(sock, F_GETFL, NULL); >X flags &= ~O_NONBLOCK; >X fcntl(sock, F_SETFL, flags); >X >X timeout.tv_sec = 5; >X if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) < 0 >X || setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)) < 0) >X perror("setsockopt failed"); >X >X_error_out: >X dbgprint(" - return fd: %d\n", sock); >X return sock; >X} >X >Xint Send(const char * buffer, int bytes, SOCKET s) { >X ssize_t w = 0; >X char *ptr = (char*) buffer; >X while (bytes > 0) { >X w = send(s, ptr, bytes, 0); >X if (w <= 0) { >X return -1; >X } >X bytes -= w; >X ptr += w; >X } >X return 1; >X} >X >Xint Recv(const char* buffer, int bytes, SOCKET s) { >X return recv(s, (char*)buffer, bytes, 0); >X} >X >Xint RecvAll(const char* buffer, int bytes, SOCKET s) { >X return recv(s, (char*)buffer, bytes, MSG_WAITALL); >X} >X >Xint RecvNonBlock(char * buffer, int bytes, SOCKET s) { >X int res = recv(s, buffer, bytes, MSG_DONTWAIT); >X return (res < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) ? 0 : res; >X} >X >Xint RecvNonBlockUDP(char * buffer, int bytes, SOCKET s) { >X struct sockaddr_in from; >X socklen_t fromLen = sizeof(from); >X int res = recvfrom(s, buffer, bytes, MSG_DONTWAIT, (struct sockaddr *)&from, &fromLen); >X return (res < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) ? 0 : res; >X} >X >Xint SendUDPMessage(SOCKET s, const char *message, int length, char *ip, int port) { >X struct sockaddr_in sin; >X sin.sin_port = htons((uint16_t)port); >X sin.sin_family = AF_INET; >X sin.sin_addr.s_addr = inet_addr(ip); >X return sendto(s, message, length, 0, (struct sockaddr *)&sin, sizeof(sin)); >X} >X >XSOCKET CreateUdpSocket(void) { >X return socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); >X} >X >Xstatic int StartInetServer(int port) >X{ >X int flags = 0; >X struct sockaddr_in sin; >X >X sin.sin_family = AF_INET; >X sin.sin_addr.s_addr = INADDR_ANY; >X sin.sin_port = htons(port); >X >X wifiServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); >X if(wifiServerSocket == INVALID_SOCKET) >X { >X MSG_LASTERROR("Could not create socket"); >X goto _error_out; >X } >X >X if(bind(wifiServerSocket, (struct sockaddr*)&sin, sizeof(sin)) < 0) >X { >X MSG_LASTERROR("Error: bind"); >X goto _error_out; >X } >X if(listen(wifiServerSocket, 1) < 0) >X { >X MSG_LASTERROR("Error: listen"); >X goto _error_out; >X } >X >X flags = fcntl(wifiServerSocket, F_GETFL, NULL); >X if(flags < 0) >X { >X MSG_LASTERROR("Error: fcntl"); >X goto _error_out; >X } >X flags |= O_NONBLOCK; >X fcntl(wifiServerSocket, F_SETFL, flags); >X >X return 1; >X >X_error_out: >X if (wifiServerSocket != INVALID_SOCKET){ >X close(wifiServerSocket); >X wifiServerSocket = INVALID_SOCKET; >X } >X >X return 0; >X} >X >Xvoid connection_cleanup() { >X if (wifiServerSocket != INVALID_SOCKET) { >X close(wifiServerSocket); >X wifiServerSocket = INVALID_SOCKET; >X } >X} >X >Xvoid disconnect(SOCKET s) { >X close(s); >X} >X >XSOCKET accept_connection(int port) >X{ >X int flags; >X SOCKET client = INVALID_SOCKET; >X >X dbgprint("serverSocket=%d\n", wifiServerSocket); >X if (wifiServerSocket == INVALID_SOCKET && !StartInetServer(port)) >X goto _error_out; >X >X errprint("waiting on port %d..", port); >X while(v_running && (client = accept(wifiServerSocket, NULL, NULL)) == INVALID_SOCKET) >X { >X if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR){ >X usleep(50000); >X continue; >X } >X MSG_LASTERROR("Accept Failed"); >X break; >X } >X errprint("got socket %d\n", client); >X >X if (client != INVALID_SOCKET) { >X // Blocking.. >X flags = fcntl(wifiServerSocket, F_GETFL, NULL); >X flags |= O_NONBLOCK; >X fcntl(wifiServerSocket, F_SETFL, flags); >X } >X >X_error_out: >X return client; >X} >7782e215ac57a5ecad2107461cfcb156 >echo x - droidcam/work/droidcam-2.1.3/src/settings.h >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/settings.h << '64b6cf186a049042919bfa4a2e5dc82a' >X// Copyright (C) 2020 github.com/dev47apps >X#ifndef _SETTINGS_H_ >X#define _SETTINGS_H_ >X >Xenum radios { >X CB_RADIO_WIFI, >X CB_RADIO_ADB, >X CB_RADIO_IOS, >X CB_WIFI_SRVR, >X CB_RADIO_COUNT >X}; >X >Xenum widgets { >X CB_BUTTON = CB_RADIO_COUNT, >X CB_AUDIO, >X CB_VIDEO, >X CB_BTN_EL, >X CB_BTN_WB, >X CB_BTN_OTR, >X CB_WIDGETS_COUNT >X}; >X >X >Xenum control_codes { >X CB_CONTROL_EMPTY_0 = 0, >X CB_CONTROL_EL_OFF, >X CB_CONTROL_EL_ON, >X CB_CONTROL_WB, >X CB_CONTROL_EV, >X CB_CONTROL_EMPTY_5, >X CB_CONTROL_ZOOM_IN, >X CB_CONTROL_ZOOM_OUT, >X CB_CONTROL_AF, >X CB_CONTROL_LED, >X CB_H_FLIP, >X CB_V_FLIP, >X}; >X >Xstruct settings { >X char ip[16]; >X int port; >X int audio; >X int video; >X int encoder; >X int connection; // Connection type >X unsigned v4l2_width, v4l2_height; >X >X int adb_auto_start; >X int confirm_close; >X int horizontal_flip; >X int vertical_flip; >X}; >X >Xvoid LoadSettings(struct settings* settings); >Xvoid SaveSettings(struct settings* settings); >X >X#define NO_ERROR 0 >X#define ERROR_NO_DEVICES -1 >X#define ERROR_LOADING_DEVICES -2 >X#define ERROR_ADDING_FORWARD -3 >X#define ERROR_DEVICE_OFFLINE -4 >X#define ERROR_DEVICE_NOTAUTH -5 >Xint CheckAdbDevices(int port); >Xint CheckiOSDevices(int port); >X >Xvoid AdbErrorPrint(int rc); >Xvoid iOSErrorPrint(int rc); >X >Xvoid UpdateBatteryLabel(char *battery_value); >X >X#endif >64b6cf186a049042919bfa4a2e5dc82a >echo x - droidcam/work/droidcam-2.1.3/src/av.c >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/av.c << '819639a5a4f7bf11a72f76d90ce3cb2a' >X/* DroidCam & DroidCamX (C) 2010-2021 >X * https://github.com/dev47apps >X * >X * This program is distributed in the hope that it will be useful, >X * but WITHOUT ANY WARRANTY; without even the implied warranty of >X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. >X */ >X >X#include "common.h" >X#include "settings.h" >X#include "connection.h" >X#include "decoder.h" >X#include <stdint.h> >X >Xextern int a_active; >Xextern int v_active; >Xextern int a_running; >Xextern int v_running; >Xextern int thread_cmd; >Xextern struct settings g_settings; >X >Xconst char *thread_cmd_val_str; >X >XSOCKET GetConnection(void) { >X char *err; >X SOCKET socket = INVALID_SOCKET; >X >X if (g_settings.connection == CB_RADIO_IOS) { >X socket = CheckiOSDevices(g_settings.port); >X if (socket <= 0) socket = INVALID_SOCKET; >X } else { >X socket = Connect(g_settings.ip, g_settings.port, &err); >X } >X >X return socket; >X} >X >X// Battry Check thread >Xvoid *BatteryThreadProc(__attribute__((__unused__)) void *args) { >X SOCKET socket = INVALID_SOCKET; >X char buf[128] = {0}; >X char battery_value[32] = {0}; >X int i, j; >X >X dbgprint("Battery Thread Start\n"); >X >X while (v_running || a_running) { >X if (v_active == 0 && a_active == 0) { >X usleep(50000); >X continue; >X } >X >X socket = GetConnection(); >X if (socket == INVALID_SOCKET) { >X goto LOOP; >X } >X >X if (Send(BATTERY_REQ, CSTR_LEN(BATTERY_REQ), socket) <= 0) { >X errprint("error sending battery status request: (%d) '%s'\n", >X errno, strerror(errno)); >X goto LOOP; >X } >X >X memset(buf, 0, sizeof(buf)); >X if (RecvAll(buf, sizeof(buf), socket) <= 0) { >X goto LOOP; >X } >X >X for (i = 0; i < (sizeof(buf)-4); i++) { >X if (buf[i] == '\r' && buf[i+1] == '\n' && buf[i+2] == '\r' && buf[i+3] == '\n') { >X i += 4; >X break; >X } >X } >X >X j = 0; >X while (i < sizeof(buf) && j < (sizeof(battery_value)-2) && buf[i] >= '0' && buf[i] <= '9') >X battery_value[j++] = buf[i++]; >X >X if (j == 0) >X battery_value[j++] = '-'; >X >X battery_value[j++] = '%'; >X battery_value[j++] = 0; >X dbgprint("battery_value: %s\n", battery_value); >X UpdateBatteryLabel(battery_value); >X >X LOOP: >X disconnect(socket); >X for (j = 0; j < 30000 && (v_running || a_running); j++) >X usleep(1000); >X } >X >X dbgprint("Battery Thread End\n"); >X return 0; >X} >X >Xvoid *DecodeThreadProc(__attribute__((__unused__)) void *args) { >X dbgprint("Decode Thread Start\n"); >X while (v_running != 0) { >X JPGFrame *f = pull_ready_jpg_frame(); >X if (!f) { >X usleep(2000); >X continue; >X } >X process_frame(f); >X push_jpg_frame(f, true); >X } >X dbgprint("Decode Thread End\n"); >X return 0; >X} >X >Xconst char* codec_names[] = { >X "jpg", "avc", >X}; >X >Xvoid *VideoThreadProc(void *args) { >X char buf[32]; >X SOCKET videoSocket = (SOCKET_PTR) args; >X int len; >X int keep_waiting = 0; >X dbgprint("Video Thread Started s=%d\n", videoSocket); >X >Xserver_wait: >X if (videoSocket == INVALID_SOCKET) { >X videoSocket = accept_connection(g_settings.port); >X if (videoSocket == INVALID_SOCKET) { goto early_out; } >X keep_waiting = 1; >X } >X >X len = snprintf(buf, sizeof(buf), VIDEO_REQ, codec_names[g_settings.encoder], >X decoder_get_video_width(), decoder_get_video_height()); >X >X if (Send(buf, len, videoSocket) <= 0){ >X errprint("send error (%d) '%s'\n", errno, strerror(errno)); >X MSG_ERROR("Error sending request, DroidCam might be busy with another client."); >X goto early_out; >X } >X >X memset(buf, 0, sizeof(buf)); >X if (RecvAll(buf, 9, videoSocket) <= 0) { >X errprint("recv error (%d) '%s'\n", errno, strerror(errno)); >X MSG_ERROR("Connection reset!\nIs the app running?"); >X goto early_out; >X } >X >X if (decoder_prepare_video(buf) == 0) { >X goto early_out; >X } >X >X v_active = 1; >X while (v_running != 0){ >X if (thread_cmd != 0) { >X len = 0; >X if (thread_cmd == CB_CONTROL_WB) { >X len = snprintf(buf, sizeof(buf), OTHER_REQ_STR, thread_cmd, thread_cmd_val_str); >X } >X else { >X len = snprintf(buf, sizeof(buf), OTHER_REQ, thread_cmd); >X } >X if (len) { >X Send(buf, len, videoSocket); >X } >X thread_cmd = 0; >X } >X >X JPGFrame *f = pull_empty_jpg_frame(); >X if (RecvAll(buf, 4, videoSocket) <= 0) >X break; >X >X f->length = le32toh(*(uint32_t*) buf); >X if (RecvAll((const char*)f->data, f->length, videoSocket) <= 0) >X break; >X >X push_jpg_frame(f, false); >X } >X >Xearly_out: >X v_active = 0; >X dbgprint("disconnect\n"); >X disconnect(videoSocket); >X decoder_cleanup(); >X >X if (v_running && keep_waiting){ >X videoSocket = INVALID_SOCKET; >X goto server_wait; >X } >X >X connection_cleanup(); >X dbgprint("Video Thread End\n"); >X return 0; >X} >X >X >Xvoid *AudioThreadProc(void *arg) { >X char stream_buf[STREAM_BUF_SIZE]; >X short decode_buf[DECODE_BUF_SIZE]={0}; >X int decode_buf_used = 0; >X int chunks_per_packet; >X int bytes_per_packet; >X int keepAliveCounter = 0; >X int mode = 0; >X SOCKET socket = 0; >X (void) arg; >X >X struct snd_transfer_s transfer; >X snd_pcm_t *handle = decoder_prepare_audio(); >X transfer.first = 1; >X if (!handle) { >X MSG_ERROR("Missing audio device"); >X return 0; >X } >X >X // wait for video >X while (v_running) { >X usleep(200000); >X if (v_active) break; >X if (!a_running) return 0; >X } >X >X if (g_settings.connection == CB_RADIO_IOS) >X goto TCP_ONLY; >X if (strncmp(g_settings.ip, ADB_LOCALHOST_IP, CSTR_LEN(ADB_LOCALHOST_IP)) == 0) >X goto TCP_ONLY; >X >X // Try to stream via UDP first >X socket = CreateUdpSocket(); >X if (socket <= 0) goto TCP_ONLY; >X >X for (int tries = 0; tries < 3; tries++) { >X dbgprint("Audio Thread UDP try #%d\n", tries); >X SendUDPMessage(socket, AUDIO_REQ, CSTR_LEN(AUDIO_REQ), g_settings.ip, g_settings.port + 1); >X for (int i = 0; i < 12; i++) { >X usleep(32000); >X int len = RecvNonBlockUDP(stream_buf, STREAM_BUF_SIZE, socket); >X if (len < 0) { goto TCP_ONLY; } >X if (len > 0) { >X bytes_per_packet = CHUNKS_PER_PACKET * DROIDCAM_SPX_CHUNK_BYTES_2; >X mode = UDP_STREAM; >X goto STREAM; >X } >X } >X } >X >XTCP_ONLY: >X dbgprint("UDP didnt work, trying TCP\n"); >X mode = TCP_STREAM; >X socket = GetConnection(); >X >X if (socket == INVALID_SOCKET) { >X errprint("Audio Connection failed\n"); >X return 0; >X } >X >X if (Send(AUDIO_REQ, CSTR_LEN(AUDIO_REQ), socket) <= 0) { >X errprint("send error (audio) (%d) '%s'\n", errno, strerror(errno)); >X MSG_ERROR("Error sending audio request"); >X goto early_out; >X } >X >X memset(stream_buf, 0, 6); >X if (RecvAll(stream_buf, 6, socket) <= 0) { >X errprint("recv error (audio) (%d) '%s'\n", errno, strerror(errno)); >X MSG_ERROR("Audio connection reset!"); >X goto early_out; >X } >X >X if (stream_buf[0] != '-' || stream_buf[1] != '@' >X || stream_buf[2] != 'v' >X || stream_buf[3] != '0' >X || stream_buf[4] != '2'){ >X MSG_ERROR("Invalid audio data stream!"); >X goto early_out; >X } >X >X chunks_per_packet = stream_buf[5]; >X if (CHUNKS_PER_PACKET != chunks_per_packet) { >X MSG_ERROR("Unsupported audio stream"); >X goto early_out; >X } >X >X bytes_per_packet = CHUNKS_PER_PACKET * DROIDCAM_SPX_CHUNK_BYTES_2; >X >XSTREAM: >X a_active = 1; >X while (a_running) { >X int len = (mode == UDP_STREAM) >X ? RecvNonBlockUDP(stream_buf, STREAM_BUF_SIZE, socket) >X : RecvNonBlock (stream_buf, STREAM_BUF_SIZE, socket); >X if (len < 0) { >X errprint("recv error (audio) (%d) '%s'\n", errno, strerror(errno)); >X goto early_out; >X } >X >X if (len > 0) { >X // dbgprint("recv %d frames\n", (len / DROIDCAM_SPX_CHUNK_BYTES_2)); >X // if we get more than 1 frame, fast-fwd to latest one >X int idx = 0; >X if (len > bytes_per_packet) { >X // dbgprint("got excess data: %u bytes\n", len); >X idx = (len - bytes_per_packet); >X // not needed, but: len = bytes_per_packet; >X } >X decode_speex_frame(&stream_buf[idx], decode_buf, CHUNKS_PER_PACKET); >X // if (decode_buf_used) dbgprint("overwriting %d frames\n", decode_buf_used); >X decode_buf_used = CHUNKS_PER_PACKET * DROIDCAM_PCM_CHUNK_SAMPLES_2; >X } >X >X int err = snd_transfer_check(handle, &transfer); >X if (err < 0) { >X MSG_ERROR("Audio Error: snd_transfer_check failed"); >X goto early_out; >X } >X if (err == 0) { >X usleep(1000); >X continue; >X } >X >X // dbgprint("can transfer %ld frames with offset=%ld\n", transfer.frames, transfer.offset); >X if (decode_buf_used == 0) { >X decoder_speex_plc(&transfer); >X } else { >X short *output_buffer = (short *)transfer.my_areas->addr; >X if ((int)transfer.frames >= decoder_get_audio_frame_size()) { >X transfer.frames = decoder_get_audio_frame_size(); >X } >X memcpy(&output_buffer[transfer.offset], decode_buf, transfer.frames * sizeof(short)); >X memmove(decode_buf, &decode_buf[transfer.frames], transfer.frames * sizeof(short)); >X decode_buf_used -= transfer.frames; >X // dbgprint("copied %ld frames\n", transfer.frames); >X } >X >X err = snd_transfer_commit(handle, &transfer); >X if (err < 0) { >X MSG_ERROR("Audio Error: snd_transfer_commit failed"); >X goto early_out; >X } >X >X if (mode == UDP_STREAM && ++keepAliveCounter > 1024) { >X keepAliveCounter = 0; >X dbgprint("audio keepalive\n"); >X SendUDPMessage(socket, AUDIO_REQ, CSTR_LEN(AUDIO_REQ), g_settings.ip, g_settings.port + 1); >X } >X usleep(2000); >X } >X >Xearly_out: >X a_active = 0; >X if (mode == UDP_STREAM) >X SendUDPMessage(socket, STOP_REQ, CSTR_LEN(STOP_REQ), g_settings.ip, g_settings.port + 1); >X >X if (socket > 0) >X disconnect(socket); >X >X dbgprint("Audio Thread End\n"); >X return 0; >X} >819639a5a4f7bf11a72f76d90ce3cb2a >echo x - droidcam/work/droidcam-2.1.3/src/decoder.c >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/decoder.c << 'ee9a13a0383c90a9c6e2fd504609807f' >X/* DroidCam & DroidCamX (C) 2010-2021 >X * https://github.com/dev47apps >X * >X * This program is distributed in the hope that it will be useful, >X * but WITHOUT ANY WARRANTY; without even the implied warranty of >X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. >X */ >X >X#ifdef HAVE_AV_CONFIG_H >X#undef HAVE_AV_CONFIG_H >X#endif >X >X#include <stdio.h> >X#include <stdlib.h> >X#include <string.h> >X#include <errno.h> >X >X#if __linux__ >X#include <linux/limits.h> >X#endif >X >X#if __FreeBSD__ >X#include <sys/limits.h> >X#endif >X >X#include "common.h" >X#include "decoder.h" >X#include "queue.h" >X >X#include "turbojpeg.h" >X#include "speex/speex.h" >X#ifndef __cplusplus >X#include "libswscale/swscale.h" >X#else >Xextern "C" >X{ >X#include "libswscale/swscale.h" >X} >X#endif >X >Xstruct spx_decoder_s { >X snd_pcm_t *snd_handle; >X void *state; >X SpeexBits bits; >X int audioBoostPerc; >X int frame_size; >X}; >X >Xstruct jpg_dec_ctx_s { >X int invert; >X int subsamp; >X int m_width, m_height; // stream WxH >X int d_width, d_height; // decoded WxH (can be inverted) >X int m_Yuv420Size, m_ySize, m_uvSize; >X int m_webcamYuvSize, m_webcam_ySize, m_webcam_uvSize;; >X size_t m_BufferLimit; >X >X BYTE *m_inBuf; /* incoming stream */ >X BYTE *m_decodeBuf; /* decoded individual frames */ >X BYTE *m_webcamBuf; /* optional, scale incoming stream for the webcam */ >X >X struct SwsContext *swc; >X tjhandle tj; >X tjhandle tjXform; >X tjtransform transform; >X >X BYTE* tjDstSlice[4]; >X BYTE* swcSrcSlice[4]; >X BYTE* swcDstSlice[4]; >X >X int tjDstStride[4]; >X int swcSrcStride[4]; >X int swcDstStride[4]; >X}; >X >X#define JPG_BACKBUF_MAX 3 >XJPGFrame jpg_frames[JPG_BACKBUF_MAX]; >Xqueue decode_queue; >Xqueue receive_queue; >X >Xstruct jpg_dec_ctx_s jpg_decoder; >Xstruct spx_decoder_s spx_decoder; >X >X#define WEBCAM_Wf ((float)WEBCAM_W) >X#define WEBCAM_Hf ((float)WEBCAM_H) >Xstatic unsigned int WEBCAM_W, WEBCAM_H; >X >Xstatic int droidcam_device_fd; >Xstatic snd_output_t *output = NULL; >X >Xstatic void decoder_share_frame(); >X >X#define FREE_OBJECT(obj, free_func) if(obj){dbgprint(" " #obj " %p\n", obj); free_func(obj); obj=NULL;} >X >Xint decoder_init(const char* v4l2_device, unsigned v4l2_width, unsigned v4l2_height) { >X WEBCAM_W = v4l2_width; >X WEBCAM_H = v4l2_height; >X >X if (v4l2_device) { >X set_v4l2_device(v4l2_device); >X droidcam_device_fd = open_v4l2_device(); >X } else { >X droidcam_device_fd = find_v4l2_device(V4L2_PLATFORM_DC); >X if (droidcam_device_fd < 0) { >X // check for generic v4l2loopback device >X droidcam_device_fd = find_v4l2_device(V4L2_PLATFORM); >X } >X } >X >X if (droidcam_device_fd < 0) { >X MSG_ERROR("Droidcam/v4l2loopback device not found (/dev/video[0-9]).\n" >X "Did it install correctly?\n" >X "If you had a kernel update, you may need to re-install."); >X >X WEBCAM_W = 320; >X WEBCAM_H = 240; >X droidcam_device_fd = 0; >X } else { >X query_v4l_device(droidcam_device_fd, &WEBCAM_W, &WEBCAM_H); >X dbgprint("WEBCAM_W=%d, WEBCAM_H=%d\n", WEBCAM_W, WEBCAM_H); >X if (WEBCAM_W < 2 || WEBCAM_H < 2 || WEBCAM_W > 9999 || WEBCAM_H > 9999){ >X MSG_ERROR("Unable to query v4l2 device for correct parameters"); >X return 0; >X } >X } >X >X memset(&jpg_decoder, 0, sizeof(struct jpg_dec_ctx_s)); >X jpg_decoder.tj = NULL; >X jpg_decoder.tjXform = NULL; >X jpg_decoder.invert = (WEBCAM_W < WEBCAM_H); >X jpg_decoder.transform.op = 0; >X jpg_decoder.transform.options = TJXOPT_COPYNONE | TJXOPT_TRIM; >X jpg_decoder.m_BufferLimit = 0; >X jpg_decoder.m_webcamYuvSize = WEBCAM_W * WEBCAM_H * 3 / 2; >X jpg_decoder.m_webcam_ySize = WEBCAM_W * WEBCAM_H; >X jpg_decoder.m_webcam_uvSize = jpg_decoder.m_webcam_ySize / 4; >X >X if (snd_output_stdio_attach(&output, stdout, 0) < 0) { >X errprint("snd_output_stdio_attach failed\n"); >X } >X >X dbgprint("init audio\n"); >X memset(&spx_decoder, 0, sizeof(struct spx_decoder_s)); >X spx_decoder.snd_handle = find_snd_device(); >X if (!spx_decoder.snd_handle) { >X errprint("Audio loopback device not found.\n" >X "Is snd_aloop loaded?\n"); >X } >X >X spx_decoder.audioBoostPerc = 100; >X speex_bits_init(&spx_decoder.bits); >X spx_decoder.state = speex_decoder_init(speex_lib_get_mode(SPEEX_MODEID_WB)); >X speex_decoder_ctl(spx_decoder.state, SPEEX_GET_FRAME_SIZE, &spx_decoder.frame_size); >X dbgprint("spx_decoder.state=%p, frame_size=%d\n", spx_decoder.state, spx_decoder.frame_size); >X >X queue_init(&decode_queue); >X queue_init(&receive_queue); >X dbgprint("decoder_init done\n"); >X return 1; >X} >X >Xvoid decoder_fini() { >X if (droidcam_device_fd) close(droidcam_device_fd); >X droidcam_device_fd = 0; >X decoder_cleanup(); >X >X queue_destroy(&decode_queue); >X queue_destroy(&receive_queue); >X FREE_OBJECT(spx_decoder.snd_handle, snd_pcm_close); >X dbgprint("spx_decoder.state=%p\n", spx_decoder.state); >X if (spx_decoder.state != NULL) { >X speex_bits_destroy(&spx_decoder.bits); >X speex_decoder_destroy(spx_decoder.state); >X spx_decoder.state = NULL; >X } >X} >X >Xint decoder_prepare_video(char * header) { >X jpg_decoder.m_width = be16toh(*(uint16_t*) &header[0]); >X jpg_decoder.m_height = be16toh(*(uint16_t*) &header[2]); >X >X if (droidcam_device_fd <= 0) { >X MSG_ERROR("Missing video device"); >X return 0; >X } >X >X if (jpg_decoder.m_width <= 0 || jpg_decoder.m_height <= 0) { >X MSG_ERROR("Invalid data stream!"); >X return 0; >X } >X >X jpg_decoder.tj = tjInitDecompress(); >X if (!jpg_decoder.tj) { >X MSG_ERROR("Error creating decoder!"); >X return 0; >X } >X >X jpg_decoder.tjXform = tjInitTransform(); >X if (!jpg_decoder.tjXform) { >X MSG_ERROR("Error creating transform!"); >X return 0; >X } >X >X if (jpg_decoder.invert) { >X jpg_decoder.d_width = jpg_decoder.m_height; >X jpg_decoder.d_height = jpg_decoder.m_width; >X jpg_decoder.transform.op = TJXOP_ROT90; >X >X } else { >X jpg_decoder.d_width = jpg_decoder.m_width; >X jpg_decoder.d_height = jpg_decoder.m_height; >X } >X >X dbgprint("Stream W=%d H=%d\n", jpg_decoder.m_width, jpg_decoder.m_height); >X jpg_decoder.subsamp = 0; >X jpg_decoder.m_ySize = jpg_decoder.m_width * jpg_decoder.m_height; >X jpg_decoder.m_uvSize = jpg_decoder.m_ySize / 4; >X jpg_decoder.m_Yuv420Size = jpg_decoder.m_ySize * 3 / 2; >X jpg_decoder.m_inBuf = (BYTE*)malloc((jpg_decoder.m_Yuv420Size * JPG_BACKBUF_MAX + 4096) * sizeof(BYTE)); >X jpg_decoder.m_decodeBuf = (BYTE*)malloc(jpg_decoder.m_Yuv420Size * sizeof(BYTE)); >X >X if (jpg_decoder.m_webcamYuvSize != jpg_decoder.m_Yuv420Size) { >X jpg_decoder.m_webcamBuf = (BYTE*)malloc(jpg_decoder.m_webcamYuvSize * sizeof(BYTE)); >X jpg_decoder.swc = sws_getCachedContext(NULL, >X jpg_decoder.d_width, jpg_decoder.d_height, AV_PIX_FMT_YUV420P, /* src */ >X WEBCAM_W, WEBCAM_H , AV_PIX_FMT_YUV420P, /* dst */ >X SWS_FAST_BILINEAR /* flags */, NULL, NULL, NULL); >X >X int srcLen = jpg_decoder.d_width; >X int dstLen = WEBCAM_W; >X >X jpg_decoder.swcSrcStride[0] = srcLen; >X jpg_decoder.swcSrcStride[1] = srcLen>>1; >X jpg_decoder.swcSrcStride[2] = srcLen>>1; >X jpg_decoder.swcSrcStride[3] = 0; >X >X jpg_decoder.swcSrcSlice[0] = &jpg_decoder.m_decodeBuf[0]; >X jpg_decoder.swcSrcSlice[1] = jpg_decoder.swcSrcSlice[0] + jpg_decoder.m_ySize; >X jpg_decoder.swcSrcSlice[2] = jpg_decoder.swcSrcSlice[1] + jpg_decoder.m_uvSize; >X jpg_decoder.swcSrcSlice[3] = NULL; >X >X jpg_decoder.swcDstStride[0] = dstLen; >X jpg_decoder.swcDstStride[1] = dstLen>>1; >X jpg_decoder.swcDstStride[2] = dstLen>>1; >X jpg_decoder.swcDstStride[3] = 0; >X >X jpg_decoder.swcDstSlice[0] = &jpg_decoder.m_webcamBuf[0]; >X jpg_decoder.swcDstSlice[1] = jpg_decoder.swcDstSlice[0] + jpg_decoder.m_webcam_ySize; >X jpg_decoder.swcDstSlice[2] = jpg_decoder.swcDstSlice[1] + jpg_decoder.m_webcam_uvSize; >X jpg_decoder.swcDstSlice[3] = NULL; >X } >X >X dbgprint("jpg: webcambuf: %p\n", jpg_decoder.m_webcamBuf); >X dbgprint("jpg: decodebuf: %p\n", jpg_decoder.m_decodeBuf); >X dbgprint("jpg: inbuf : %p\n", jpg_decoder.m_inBuf); >X >X for (int i = 0; i < JPG_BACKBUF_MAX; i++) { >X jpg_frames[i].data = &jpg_decoder.m_inBuf[i*jpg_decoder.m_Yuv420Size]; >X jpg_frames[i].length = 0; >X dbgprint("jpg: jpg_frames[%d]: %p\n", i, jpg_frames[i].data); >X queue_add(&receive_queue, &jpg_frames[i]); >X } >X >X int stride = jpg_decoder.d_width; >X jpg_decoder.tjDstStride[0] = stride; >X jpg_decoder.tjDstStride[1] = stride>>1; >X jpg_decoder.tjDstStride[2] = stride>>1; >X jpg_decoder.tjDstStride[3] = 0; >X >X jpg_decoder.tjDstSlice[0] = jpg_decoder.m_decodeBuf; >X jpg_decoder.tjDstSlice[1] = jpg_decoder.tjDstSlice[0] + jpg_decoder.m_ySize; >X jpg_decoder.tjDstSlice[2] = jpg_decoder.tjDstSlice[1] + jpg_decoder.m_uvSize; >X jpg_decoder.tjDstSlice[3] = NULL; >X >X return 1; >X} >X >Xsnd_pcm_t * decoder_prepare_audio(void) { >X speex_bits_reset(&spx_decoder.bits); >X dbgprint("audio boost %d%%\n", spx_decoder.audioBoostPerc); >X return spx_decoder.snd_handle; >X} >X >Xvoid decoder_cleanup() { >X dbgprint("Cleanup\n"); >X FREE_OBJECT(jpg_decoder.m_inBuf, free); >X FREE_OBJECT(jpg_decoder.m_decodeBuf, free); >X FREE_OBJECT(jpg_decoder.m_webcamBuf, free); >X FREE_OBJECT(jpg_decoder.swc, sws_freeContext); >X FREE_OBJECT(jpg_decoder.tjXform, tjDestroy); >X FREE_OBJECT(jpg_decoder.tj, tjDestroy); >X queue_clear(&receive_queue); >X queue_clear(&decode_queue); >X} >X >Xvoid process_frame(JPGFrame *frame) { >X unsigned long len = (unsigned long)frame->length; >X BYTE *p = frame->data; >X >X if (jpg_decoder.subsamp == 0) { >X int width, height, subsamp, colorspace; >X if (tjDecompressHeader3(jpg_decoder.tj, p, len, &width, &height, &subsamp, &colorspace) < 0) { >X errprint("tjDecompressHeader3() failure: %d\n", tjGetErrorCode(jpg_decoder.tj)); >X errprint("%s\n", tjGetErrorStr2(jpg_decoder.tj)); >X return; >X } >X >X dbgprint("stream is %dx%d subsamp %d colorspace %d\n", width, height, subsamp, colorspace); >X if (subsamp != TJSAMP_420) { >X errprint("error: unexpected video image stream subsampling: %d\n", subsamp); >X return; >X } >X >X if (width != jpg_decoder.m_width || height != jpg_decoder.m_height) { >X errprint("error: unexpected video image dimentions: %dx%d vs expected %dx%x\n", >X width, height, jpg_decoder.m_width, jpg_decoder.m_height); >X return; >X } >X >X jpg_decoder.subsamp = subsamp; >X } >X >X if (jpg_decoder.transform.op) { >X if (tjTransform(jpg_decoder.tjXform, p, len, 1, &p, &len, &jpg_decoder.transform, 0)) { >X errprint("tjTransform failure: %s\n", tjGetErrorStr()); >X return; >X } >X } >X >X if (tjDecompressToYUVPlanes(jpg_decoder.tj, p, len, >X jpg_decoder.tjDstSlice, jpg_decoder.d_width, >X jpg_decoder.tjDstStride, jpg_decoder.d_height, >X TJFLAG_FASTDCT | TJFLAG_FASTUPSAMPLE)) >X { >X errprint("tjDecompressToYUV2 failure: %d\n", tjGetErrorCode(jpg_decoder.tj)); >X return; >X } >X >X decoder_share_frame(); >X return; >X} >X >Xstatic void decoder_share_frame() { >X BYTE *p = jpg_decoder.m_decodeBuf; >X if (jpg_decoder.swc != NULL) { >X sws_scale(jpg_decoder.swc, >X (const uint8_t * const*) jpg_decoder.swcSrcSlice, >X jpg_decoder.swcSrcStride, >X 0, >X jpg_decoder.d_height, >X jpg_decoder.swcDstSlice, >X jpg_decoder.swcDstStride); >X >X p = jpg_decoder.m_webcamBuf; >X } >X >X if (write(droidcam_device_fd, p, jpg_decoder.m_webcamYuvSize) < 0) { >X errprint("error: write() failed for video device\n"); >X } >X} >X >X >Xvoid decoder_show_test_image() { >X int i,j; >X int m_height = WEBCAM_H * 2; >X int m_width = WEBCAM_W * 2; >X char header[8]; >X >X header[0] = ( m_width >> 8 ) & 0xFF; >X header[1] = ( m_width >> 0 ) & 0xFF; >X header[2] = ( m_height >> 8 ) & 0xFF; >X header[3] = ( m_height >> 0 ) & 0xFF; >X decoder_prepare_video(header); >X >X // [ jpg ] -> [ yuv420 ] -> [ yuv420 scaled ] -> [ yuv420 webcam transformed ] >X >X // fill in "decoded" data >X BYTE *p = jpg_decoder.m_decodeBuf; >X memset(p, 128, jpg_decoder.m_Yuv420Size); >X for (j = 0; j < m_height; j++) { >X BYTE *line_end = p + m_width; >X for (i = 0; i < (m_width / 4); i++) { >X *p++ = 0; >X } >X for (i = 0; i < (m_width / 4); i++) { >X *p++ = 64; >X } >X for (i = 0; i < (m_width / 4); i++) { >X *p++ = 128; >X } >X for (i = 0; i < (m_width / 4); i++) { >X *p++ = rand()%250; >X } >X while (p < line_end) p++; >X } >X >X decoder_share_frame(); >X} >X >Xvoid push_jpg_frame(JPGFrame* frame, bool empty) { >X if (empty || receive_queue.size == 0 || decode_queue.size > jpg_decoder.m_BufferLimit) >X queue_add(&receive_queue, frame); >X else >X queue_add(&decode_queue, frame); >X} >X >XJPGFrame* pull_empty_jpg_frame(void) { >X return (JPGFrame*) queue_next(&receive_queue, 0); >X} >X >XJPGFrame* pull_ready_jpg_frame(void) { >X return (JPGFrame*) queue_next(&decode_queue, jpg_decoder.m_BufferLimit); >X} >X >Xint decoder_get_video_width() { >X return WEBCAM_W; >X} >X >Xint decoder_get_video_height() { >X return WEBCAM_H; >X} >X >Xint decoder_horizontal_flip() { >X int h_flip = (jpg_decoder.transform.op == TJXOP_HFLIP); >X int v_flip = (jpg_decoder.transform.op == TJXOP_VFLIP); >X int hv_flip = (jpg_decoder.transform.op == TJXOP_ROT180); >X >X if (h_flip || hv_flip) { >X jpg_decoder.transform.op = hv_flip ? TJXOP_VFLIP : TJXOP_NONE; >X } else { >X jpg_decoder.transform.op = v_flip ? TJXOP_ROT180 : TJXOP_HFLIP; >X } >X >X return jpg_decoder.transform.op == TJXOP_HFLIP || jpg_decoder.transform.op == TJXOP_ROT180; >X} >X >Xint decoder_vertical_flip() { >X int h_flip = (jpg_decoder.transform.op == TJXOP_HFLIP); >X int v_flip = (jpg_decoder.transform.op == TJXOP_VFLIP); >X int hv_flip = (jpg_decoder.transform.op == TJXOP_ROT180); >X >X if (v_flip || hv_flip) { >X jpg_decoder.transform.op = hv_flip ? TJXOP_HFLIP : TJXOP_NONE; >X } else { >X jpg_decoder.transform.op = h_flip ? TJXOP_ROT180 : TJXOP_VFLIP; >X } >X >X return jpg_decoder.transform.op == TJXOP_VFLIP || jpg_decoder.transform.op == TJXOP_ROT180; >X} >X >Xint decoder_get_audio_frame_size(void) { >X return spx_decoder.frame_size; //20ms for wb speex >X} >X >Xvoid decoder_speex_plc(struct snd_transfer_s* transfer) { >X short *output_buffer = (short *)transfer->my_areas->addr; >X if ((int)transfer->frames >= spx_decoder.frame_size){ >X speex_decode_int(spx_decoder.state, NULL, &output_buffer[transfer->offset]); >X transfer->frames = spx_decoder.frame_size; >X } else { >X memset(&output_buffer[transfer->offset], 0, transfer->frames * sizeof(short)); >X } >X // dbgprint("guessed %ld frames\n", transfer->frames); >X} >X >Xint decode_speex_frame(char *stream_buf, short *decode_buf, int droidcam_spx_chunks) { >X int output_used = 0; >X for (int i = 0; i < droidcam_spx_chunks; i++) { >X speex_bits_read_from(&spx_decoder.bits, &stream_buf[i * DROIDCAM_SPX_CHUNK_BYTES_2], DROIDCAM_SPX_CHUNK_BYTES_2); >X while (output_used < DECODE_BUF_SIZE) { >X int ret = speex_decode_int(spx_decoder.state, &spx_decoder.bits, &decode_buf[output_used]); >X if (ret != 0) break; >X output_used += spx_decoder.frame_size; >X } >X } >X if (output_used > 0 && spx_decoder.audioBoostPerc != 100 && spx_decoder.audioBoostPerc >= 50 && spx_decoder.audioBoostPerc < 200) { >X for (int i = 0; i < output_used; i++) { >X decode_buf[i] += (decode_buf[i] * spx_decoder.audioBoostPerc / 100); >X } >X } >X // dbgprint("decoded %d frames\n", output_used); >X return output_used; >X} >ee9a13a0383c90a9c6e2fd504609807f >echo x - droidcam/work/droidcam-2.1.3/src/decoder_snd.c >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/decoder_snd.c << '289d6629bfb38f1d292a4a972e06f27b' >X/* DroidCam & DroidCamX (C) 2010-2021 >X * https://github.com/dev47apps >X * >X * This program is distributed in the hope that it will be useful, >X * but WITHOUT ANY WARRANTY; without even the implied warranty of >X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. >X */ >X >X#include "common.h" >X#include "decoder.h" >X >X >X#define AUDIO_RATE 16000 >X#define AUDIO_CHANNELS 1 >X#define PERIOD_TIME (DROIDCAM_CHUNK_MS_2 * 1000) >X >Xchar snd_device[32]; >X >Xstatic snd_pcm_format_t format = SND_PCM_FORMAT_S16; >X >Xstatic snd_pcm_sframes_t buffer_size; >Xstatic snd_pcm_sframes_t period_size; >X >Xstatic unsigned int period_time = PERIOD_TIME;/* period time in us */ >Xstatic unsigned int buffer_time = DROIDCAM_SPEEX_BACKBUF_MAX_COUNT * PERIOD_TIME; /* ring buffer length in us */ >X >Xsnd_pcm_hw_params_t *hwparams; >Xsnd_pcm_sw_params_t *swparams; >X >Xstatic int set_hwparams(snd_pcm_t *handle, snd_pcm_hw_params_t *params, snd_pcm_access_t access) { >X unsigned int rrate; >X snd_pcm_uframes_t size; >X int err, dir; >X int resample = 1; >X /* choose all parameters */ >X err = snd_pcm_hw_params_any(handle, params); >X if (err < 0) { >X errprint("Broken configuration for playback: no configurations available: %s\n", snd_strerror(err)); >X return err; >X } >X /* set hardware resampling */ >X err = snd_pcm_hw_params_set_rate_resample(handle, params, resample); >X if (err < 0) { >X errprint("Resampling setup failed for playback: %s\n", snd_strerror(err)); >X return err; >X } >X /* set the interleaved read/write format */ >X err = snd_pcm_hw_params_set_access(handle, params, access); >X if (err < 0) { >X errprint("Access type not available for playback: %s\n", snd_strerror(err)); >X return err; >X } >X /* set the sample format */ >X err = snd_pcm_hw_params_set_format(handle, params, format); >X if (err < 0) { >X errprint("Sample format not available for playback: %s\n", snd_strerror(err)); >X return err; >X } >X /* set the count of channels */ >X err = snd_pcm_hw_params_set_channels(handle, params, AUDIO_CHANNELS); >X if (err < 0) { >X errprint("Channels count (%u) not available for playbacks: %s\n", AUDIO_CHANNELS, snd_strerror(err)); >X return err; >X } >X /* set the stream rate */ >X rrate = AUDIO_RATE; >X err = snd_pcm_hw_params_set_rate_near(handle, params, &rrate, 0); >X if (err < 0) { >X errprint("Rate %uHz not available for playback: %s\n", AUDIO_RATE, snd_strerror(err)); >X return err; >X } >X if (rrate != AUDIO_RATE) { >X errprint("Rate doesn't match (requested %uHz, get %iHz)\n", AUDIO_RATE, err); >X return -EINVAL; >X } >X /* set the buffer time */ >X err = snd_pcm_hw_params_set_buffer_time_near(handle, params, &buffer_time, &dir); >X if (err < 0) { >X errprint("Unable to set buffer time %u for playback: %s\n", buffer_time, snd_strerror(err)); >X return err; >X } >X err = snd_pcm_hw_params_get_buffer_size(params, &size); >X if (err < 0) { >X errprint("Unable to get buffer size for playback: %s\n", snd_strerror(err)); >X return err; >X } >X buffer_size = size; >X /* set the period time */ >X err = snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, &dir); >X if (err < 0) { >X errprint("Unable to set period time %u for playback: %s\n", period_time, snd_strerror(err)); >X return err; >X } >X err = snd_pcm_hw_params_get_period_size(params, &size, &dir); >X if (err < 0) { >X errprint("Unable to get period size for playback: %s\n", snd_strerror(err)); >X return err; >X } >X period_size = size; >X /* write the parameters to device */ >X err = snd_pcm_hw_params(handle, params); >X if (err < 0) { >X errprint("Unable to set hw params for playback: %s\n", snd_strerror(err)); >X return err; >X } >X return 0; >X} >X >Xstatic int set_swparams(snd_pcm_t *handle, snd_pcm_sw_params_t *swparams) { >X int err; >X /* get the current swparams */ >X err = snd_pcm_sw_params_current(handle, swparams); >X if (err < 0) { >X errprint("Unable to determine current swparams for playback: %s\n", snd_strerror(err)); >X return err; >X } >X >X /* start the transfer when the buffer is almost full: */ >X /* (buffer_size / avail_min) * avail_min */ >X err = snd_pcm_sw_params_set_start_threshold(handle, swparams, period_size); >X if (err < 0) { >X errprint("Unable to set start threshold mode for playback: %s\n", snd_strerror(err)); >X return err; >X } >X >X /* allow the transfer when at least period_size samples can be processed */ >X /* or disable this mechanism when period event is enabled (aka interrupt like style processing) */ >X err = snd_pcm_sw_params_set_avail_min(handle, swparams, period_size); >X if (err < 0) { >X errprint("Unable to set avail min for playback: %s\n", snd_strerror(err)); >X return err; >X } >X >X /* write the parameters to the playback device */ >X err = snd_pcm_sw_params(handle, swparams); >X if (err < 0) { >X errprint("Unable to set sw params for playback: %s\n", snd_strerror(err)); >X return err; >X } >X >X return 0; >X} >X >Xstatic int xrun_recovery(snd_pcm_t *handle, int err) { >X dbgprint("stream recovery\n"); >X >X if (err == -EPIPE) { /* under-run */ >X err = snd_pcm_prepare(handle); >X if (err < 0) errprint("Can't recover from underrun\n"); >X } >X else if (err == -ESTRPIPE) { >X int limit = 60000; >X while ((err = snd_pcm_resume(handle)) == -EAGAIN) { >X usleep(1000); /* wait until the suspend flag is released */ >X if (--limit == 0) break; >X } >X >X if (err < 0) { >X err = snd_pcm_prepare(handle); >X if (err < 0) errprint("Can't recover from suspend\n"); >X } >X } >X >X return err; >X} >X >Xint snd_transfer_check(snd_pcm_t *handle, struct snd_transfer_s *transfer) { >X int err; >X >X snd_pcm_state_t state = snd_pcm_state(handle); >X if (state == SND_PCM_STATE_XRUN) { >X err = xrun_recovery(handle, -EPIPE); >X if (err < 0) { >X errprint("XRUN recovery failed: %s\n", snd_strerror(err)); >X return err; >X } >X transfer->first = 1; >X } else if (state == SND_PCM_STATE_SUSPENDED) { >X err = xrun_recovery(handle, -ESTRPIPE); >X if (err < 0) { >X errprint("SUSPEND recovery failed: %s\n", snd_strerror(err)); >X return err; >X } >X } >X >X snd_pcm_sframes_t avail = snd_pcm_avail_update(handle); >X if (avail < 0) { >X err = xrun_recovery(handle, avail); >X if (err < 0) { >X errprint("avail update failed: %s\n", snd_strerror(err)); >X return err; >X } >X transfer->first = 1; >X return 0; >X } >X >X if (avail < period_size) { >X if (transfer->first) { >X transfer->first = 0; >X err = snd_pcm_start(handle); >X if (err < 0) { >X errprint("snd_pcm_start failed: %s\n", snd_strerror(err)); >X return err; >X } >X } else { >X err = snd_pcm_wait(handle, 2000); >X if (err < 0) { >X if ((err = xrun_recovery(handle, err)) < 0) { >X errprint("snd_pcm_wait error: %s\n", snd_strerror(err)); >X return err; >X } >X transfer->first = 1; >X } >X } >X return 0; >X } >X >X transfer->frames = period_size; >X err = snd_pcm_mmap_begin(handle, &transfer->my_areas, &transfer->offset, &transfer->frames); >X if (err < 0) { >X if ((err = xrun_recovery(handle, err)) < 0) { >X errprint("MMAP begin avail error: %s\n", snd_strerror(err)); >X return err; >X } >X transfer->first = 1; >X } >X >X return 1; >X} >X >X >Xint snd_transfer_commit(snd_pcm_t *handle, struct snd_transfer_s *transfer) { >X int err; >X snd_pcm_sframes_t commits = snd_pcm_mmap_commit(handle, transfer->offset, transfer->frames); >X // dbgprint("commited %ld/%ld frames\n", commits, transfer->frames); >X if (commits < 0 || (snd_pcm_uframes_t)commits != transfer->frames) { >X if ((err = xrun_recovery(handle, commits >= 0 ? -EPIPE : commits)) < 0) { >X errprint("MMAP commit error: %s\n", snd_strerror(err)); >X return err; >X } >X transfer->first = 1; >X } >X >X return 0; >X} >X >X >Xsnd_pcm_t *find_snd_device(void) { >X int err, card, i; >X snd_pcm_t *handle = NULL; >X snd_pcm_hw_params_alloca(&hwparams); >X snd_pcm_sw_params_alloca(&swparams); >X >X for (card = 0; card < 50; card++) { >X snprintf(snd_device, sizeof(snd_device), "/proc/asound/card%d/id", card); >X dbgprint("Trying %s\n", snd_device); >X >X FILE *fp = fopen(snd_device, "r"); >X if (!fp) >X continue; >X >X err = fread(snd_device, 1, sizeof(snd_device), fp); >X fclose(fp); >X if (err <= 0 || strncmp(snd_device, "Loopback", 8) != 0) >X continue; >X >X for (i = 0; i < 8; i++) { >X snprintf(snd_device, sizeof(snd_device), "hw:%d,0,%d", card, i); >X dbgprint("Trying to open audio device: %s\n", snd_device); >X err = snd_pcm_open(&handle, snd_device, SND_PCM_STREAM_PLAYBACK, 0); >X if (err < 0 || !handle) { >X errprint("snd_pcm_open failed: %s\n", snd_strerror(err)); >X continue; >X } >X >X // got a handle >X >X if (set_hwparams(handle, hwparams, SND_PCM_ACCESS_MMAP_INTERLEAVED) < 0) { >X errprint("setting audio hwparams failed\n"); >X snd_pcm_close(handle); >X continue; >X } >X >X if (set_swparams(handle, swparams) < 0) { >X errprint("Setting audio swparams failed\n"); >X snd_pcm_close(handle); >X goto OUT; >X } >X >X if (buffer_size != DROIDCAM_PCM_CHUNK_BYTES_2) { >X errprint("Unexpected audio device buffer size: %ld\n", buffer_size); >X snd_pcm_close(handle); >X goto OUT; >X } >X >X // update the buffer to have output device name, which will be shown in the UI >X snprintf(snd_device, sizeof(snd_device), "hw:%d,1,%d", card, i); >X return handle; >X } >X } >X >XOUT: >X snd_device[0] = 0; // this will get shown on the UI, clear the value >X return NULL; >X} >289d6629bfb38f1d292a4a972e06f27b >echo x - droidcam/work/droidcam-2.1.3/src/resources.c >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/resources.c << '6e472f139735d05a43a4527bd9c56ed8' >X#include <gio/gio.h> >X >X#if defined (__ELF__) && ( __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6)) >X# define SECTION __attribute__ ((section (".gresource."), aligned (8))) >X#else >X# define SECTION >X#endif >X >X#ifdef _MSC_VER >Xstatic const SECTION union { const guint8 data[5325]; const double alignment; void * const ptr;} _resource_data = { { >X 0107, 0126, 0141, 0162, 0151, 0141, 0156, 0164, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, >X 0030, 0000, 0000, 0000, 0254, 0000, 0000, 0000, 0000, 0000, 0000, 0050, 0005, 0000, 0000, 0000, >X 0000, 0000, 0000, 0000, 0001, 0000, 0000, 0000, 0001, 0000, 0000, 0000, 0004, 0000, 0000, 0000, >X 0005, 0000, 0000, 0000, 0324, 0265, 0002, 0000, 0377, 0377, 0377, 0377, 0254, 0000, 0000, 0000, >X 0001, 0000, 0114, 0000, 0260, 0000, 0000, 0000, 0264, 0000, 0000, 0000, 0302, 0257, 0211, 0013, >X 0000, 0000, 0000, 0000, 0264, 0000, 0000, 0000, 0004, 0000, 0114, 0000, 0270, 0000, 0000, 0000, >X 0274, 0000, 0000, 0000, 0317, 0340, 0275, 0324, 0001, 0000, 0000, 0000, 0274, 0000, 0000, 0000, >X 0012, 0000, 0114, 0000, 0310, 0000, 0000, 0000, 0314, 0000, 0000, 0000, 0317, 0302, 0304, 0207, >X 0004, 0000, 0000, 0000, 0314, 0000, 0000, 0000, 0011, 0000, 0166, 0000, 0330, 0000, 0000, 0000, >X 0274, 0024, 0000, 0000, 0301, 0262, 0211, 0017, 0002, 0000, 0000, 0000, 0274, 0024, 0000, 0000, >X 0011, 0000, 0114, 0000, 0310, 0024, 0000, 0000, 0314, 0024, 0000, 0000, 0057, 0000, 0000, 0000, >X 0001, 0000, 0000, 0000, 0143, 0157, 0155, 0057, 0002, 0000, 0000, 0000, 0144, 0145, 0166, 0064, >X 0067, 0141, 0160, 0160, 0163, 0057, 0000, 0000, 0004, 0000, 0000, 0000, 0151, 0143, 0157, 0156, >X 0062, 0056, 0160, 0156, 0147, 0000, 0000, 0000, 0324, 0023, 0000, 0000, 0000, 0000, 0000, 0000, >X 0211, 0120, 0116, 0107, 0015, 0012, 0032, 0012, 0000, 0000, 0000, 0015, 0111, 0110, 0104, 0122, >X 0000, 0000, 0000, 0140, 0000, 0000, 0000, 0140, 0010, 0006, 0000, 0000, 0000, 0342, 0230, 0167, >X 0070, 0000, 0000, 0000, 0031, 0164, 0105, 0130, 0164, 0123, 0157, 0146, 0164, 0167, 0141, 0162, >X 0145, 0000, 0101, 0144, 0157, 0142, 0145, 0040, 0111, 0155, 0141, 0147, 0145, 0122, 0145, 0141, >X 0144, 0171, 0161, 0311, 0145, 0074, 0000, 0000, 0023, 0166, 0111, 0104, 0101, 0124, 0170, 0332, >X 0354, 0135, 0007, 0170, 0224, 0145, 0266, 0176, 0247, 0146, 0046, 0311, 0044, 0031, 0222, 0220, >X 0204, 0024, 0123, 0040, 0005, 0244, 0046, 0264, 0204, 0116, 0304, 0005, 0025, 0126, 0154, 0213, >X 0215, 0145, 0105, 0164, 0131, 0312, 0352, 0203, 0327, 0273, 0373, 0074, 0353, 0136, 0135, 0225, >X 0107, 0326, 0276, 0226, 0253, 0040, 0270, 0127, 0160, 0335, 0105, 0304, 0206, 0300, 0202, 0042, >X 0125, 0112, 0002, 0241, 0044, 0044, 0206, 0004, 0110, 0245, 0245, 0222, 0111, 0231, 0172, 0317, >X 0371, 0046, 0011, 0311, 0222, 0051, 0011, 0231, 0024, 0062, 0107, 0177, 0107, 0230, 0177, 0346, >X 0377, 0377, 0363, 0176, 0347, 0234, 0367, 0234, 0357, 0174, 0337, 0110, 0054, 0026, 0013, 0334, >X 0322, 0175, 0042, 0165, 0253, 0300, 0015, 0100, 0237, 0026, 0271, 0263, 0047, 0232, 0055, 0006, >X 0305, 0305, 0252, 0323, 0011, 0027, 0257, 0146, 0047, 0224, 0325, 0344, 0306, 0066, 0030, 0164, >X 0136, 0022, 0211, 0133, 0201, 0327, 0364, 0003, 0250, 0024, 0232, 0352, 0040, 0237, 0204, 0323, >X 0101, 0076, 0203, 0263, 0002, 0065, 0261, 0071, 0235, 0002, 0100, 0165, 0175, 0351, 0200, 0103, >X 0171, 0153, 0026, 0036, 0053, 0374, 0347, 0003, 0227, 0257, 0346, 0304, 0067, 0030, 0214, 0302, >X 0152, 0334, 0221, 0343, 0172, 0341, 0361, 0310, 0203, 0122, 0245, 0360, 0060, 0016, 0360, 0033, >X 0176, 0154, 0124, 0304, 0103, 0353, 0023, 0043, 0037, 0336, 0340, 0251, 0354, 0127, 0146, 0363, >X 0063, 0266, 0203, 0260, 0105, 0262, 0053, 0173, 0325, 0263, 0273, 0262, 0137, 0177, 0272, 0102, >X 0167, 0051, 0120, 0041, 0003, 0144, 0122, 0011, 0135, 0300, 0355, 0265, 0034, 0211, 0305, 0142, >X 0202, 0321, 0014, 0030, 0114, 0100, 0260, 0157, 0324, 0271, 0131, 0303, 0136, 0374, 0323, 0250, >X 0210, 0007, 0327, 0073, 0015, 0100, 0275, 0241, 0322, 0157, 0303, 0301, 0107, 0066, 0144, 0024, >X 0176, 0073, 0113, 0051, 0024, 0057, 0163, 0153, 0265, 0203, 0142, 0060, 0231, 0204, 0173, 0232, >X 0236, 0360, 0324, 0133, 0263, 0107, 0274, 0376, 0173, 0207, 0000, 0350, 0215, 0072, 0257, 0065, >X 0173, 0147, 0155, 0313, 0052, 0331, 0063, 0301, 0123, 0351, 0126, 0174, 0347, 0130, 0204, 0231, >X 0006, 0265, 0005, 0251, 0203, 0227, 0275, 0063, 0147, 0344, 0133, 0113, 0355, 0262, 0240, 0157, >X 0216, 0077, 0375, 0246, 0133, 0371, 0235, 0034, 0033, 0310, 0155, 0253, 0224, 0122, 0354, 0310, >X 0172, 0173, 0311, 0316, 0254, 0277, 0374, 0331, 0246, 0005, 0144, 0226, 0174, 0365, 0313, 0325, >X 0173, 0176, 0271, 0131, 0041, 0223, 0122, 0100, 0161, 0123, 0234, 0316, 0147, 0112, 0046, 0162, >X 0347, 0052, 0375, 0323, 0063, 0322, 0022, 0203, 0174, 0206, 0234, 0152, 0145, 0001, 0024, 0070, >X 0144, 0073, 0062, 0377, 0347, 0005, 0153, 0064, 0167, 0053, 0337, 0045, 0111, 0227, 0104, 0206, >X 0132, 0175, 0275, 0162, 0333, 0251, 0347, 0136, 0274, 0316, 0005, 0235, 0055, 0073, 0220, 0122, >X 0120, 0176, 0174, 0250, 0122, 0346, 0146, 0071, 0256, 0024, 0017, 0271, 0004, 0271, 0027, 0166, >X 0244, 0126, 0327, 0225, 0204, 0266, 0002, 0040, 0247, 0164, 0333, 0114, 0203, 0311, 0322, 0310, >X 0146, 0335, 0342, 0072, 0053, 0220, 0122, 0156, 0165, 0325, 0053, 0367, 0322, 0367, 0251, 0255, >X 0000, 0050, 0252, 0110, 0113, 0222, 0166, 0203, 0356, 0055, 0140, 0206, 0100, 0274, 0231, 0350, >X 0132, 0127, 0136, 0136, 0157, 0064, 0211, 0243, 0273, 0244, 0270, 0042, 0075, 0261, 0025, 0000, >X 0127, 0353, 0056, 0206, 0164, 0065, 0000, 0114, 0317, 0074, 0344, 0076, 0230, 0067, 0366, 0075, >X 0014, 0014, 0112, 0101, 0103, 0027, 0051, 0204, 0257, 0063, 0176, 0340, 0174, 0314, 0032, 0366, >X 0034, 0005, 0106, 0113, 0227, 0347, 0365, 0234, 0055, 0227, 0351, 0316, 0106, 0267, 0002, 0200, >X 0250, 0122, 0227, 0017, 0007, 0063, 0075, 0270, 0102, 0246, 0306, 0370, 0230, 0047, 0061, 0157, >X 0314, 0047, 0360, 0364, 0320, 0300, 0144, 0066, 0273, 0166, 0344, 0223, 0245, 0205, 0152, 0343, >X 0161, 0377, 0350, 0165, 0030, 0022, 0072, 0133, 0000, 0320, 0325, 0145, 0025, 0036, 0347, 0165, >X 0372, 0112, 0155, 0233, 0171, 0100, 0127, 0212, 0214, 0130, 0101, 0231, 0356, 0002, 0076, 0117, >X 0177, 0034, 0132, 0257, 0050, 0334, 0071, 0374, 0045, 0122, 0220, 0353, 0106, 0044, 0133, 0034, >X 0137, 0363, 0276, 0244, 0017, 0351, 0017, 0146, 0154, 0074, 0362, 0070, 0230, 0206, 0167, 0007, >X 0353, 0153, 0032, 0360, 0335, 0116, 0171, 0074, 0344, 0122, 0354, 0317, 0375, 0010, 0331, 0027, >X 0276, 0103, 0162, 0314, 0122, 0014, 0015, 0233, 0106, 0061, 0301, 0354, 0040, 0156, 0130, 0004, >X 0247, 0156, 0171, 0160, 0375, 0305, 0021, 0160, 0365, 0106, 0013, 0246, 0306, 0057, 0107, 0124, >X 0300, 0104, 0374, 0073, 0353, 0317, 0310, 0273, 0174, 0214, 0054, 0260, 0173, 0023, 0316, 0156, >X 0007, 0240, 0151, 0364, 0175, 0221, 0276, 0230, 0174, 0163, 0065, 0356, 0115, 0374, 0000, 0336, >X 0252, 0153, 0256, 0210, 0203, 0264, 0321, 0154, 0022, 0176, 0233, 0203, 0065, 0273, 0020, 0263, >X 0231, 0143, 0207, 0027, 0324, 0112, 0137, 0072, 0374, 0304, 0253, 0134, 0346, 0101, 0347, 0231, >X 0233, 0317, 0343, 0127, 0223, 0371, 0032, 0050, 0374, 0271, 0210, 0176, 0011, 0230, 0071, 0164, >X 0045, 0021, 0216, 0043, 0330, 0231, 0271, 0112, 0120, 0302, 0356, 0026, 0071, 0172, 0200, 0360, >X 0050, 0054, 0255, 0072, 0317, 0145, 0020, 0002, 0140, 0015, 0271, 0242, 0227, 0261, 0341, 0247, >X 0245, 0220, 0222, 0225, 0252, 0024, 0122, 0004, 0373, 0304, 0222, 0337, 0036, 0211, 0001, 0176, >X 0043, 0320, 0337, 0047, 0016, 0336, 0036, 0375, 0341, 0243, 0016, 0206, 0134, 0252, 0152, 0364, >X 0250, 0026, 0032, 0335, 0325, 0250, 0251, 0057, 0103, 0125, 0135, 0001, 0056, 0126, 0237, 0046, >X 0226, 0221, 0201, 0342, 0312, 0143, 0250, 0320, 0025, 0021, 0333, 0341, 0153, 0000, 0367, 0046, >X 0175, 0100, 0064, 0120, 0216, 0215, 0151, 0213, 0140, 0060, 0031, 0240, 0224, 0313, 0334, 0000, >X 0064, 0011, 0053, 0172, 0037, 0271, 0242, 0270, 0240, 0333, 0311, 0025, 0055, 0101, 0111, 0145, >X 0006, 0074, 0225, 0101, 0030, 0026, 0166, 0067, 0102, 0174, 0207, 0121, 0012, 0257, 0264, 0373, >X 0171, 0015, 0006, 0040, 0320, 0233, 0377, 0057, 0345, 0232, 0313, 0061, 0124, 0241, 0260, 0374, >X 0010, 0216, 0026, 0374, 0013, 0001, 0336, 0341, 0302, 0365, 0174, 0173, 0142, 0005, 0362, 0057, >X 0147, 0100, 0255, 0350, 0031, 0265, 0256, 0036, 0003, 0200, 0301, 0144, 0046, 0227, 0001, 0212, >X 0005, 0333, 0050, 0016, 0334, 0047, 0054, 0341, 0306, 0101, 0365, 0305, 0240, 0240, 0124, 0161, >X 0064, 0001, 0222, 0177, 0151, 0267, 0360, 0112, 0354, 0326, 0344, 0075, 0240, 0314, 0336, 0355, >X 0061, 0200, 0003, 0050, 0373, 0354, 0350, 0200, 0261, 0130, 0066, 0175, 0073, 0061, 0224, 0065, >X 0056, 0264, 0062, 0137, 0054, 0236, 0272, 0027, 0217, 0246, 0254, 0205, 0277, 0167, 0044, 0352, >X 0350, 0272, 0226, 0156, 0236, 0333, 0223, 0166, 0357, 0250, 0067, 0221, 0117, 0126, 0341, 0356, >X 0121, 0053, 0261, 0144, 0372, 0136, 0032, 0251, 0063, 0134, 0136, 0012, 0221, 0313, 0124, 0030, >X 0035, 0271, 0000, 0313, 0123, 0017, 0141, 0302, 0240, 0005, 0060, 0030, 0311, 0362, 0054, 0246, >X 0276, 0347, 0202, 0170, 0324, 0007, 0372, 0104, 0340, 0221, 0361, 0353, 0021, 0351, 0077, 0261, >X 0313, 0257, 0317, 0201, 0374, 0201, 0321, 0153, 0021, 0035, 0230, 0102, 0371, 0300, 0357, 0140, >X 0064, 0065, 0020, 0070, 0262, 0276, 0141, 0001, 0114, 0021, 0243, 0002, 0107, 0140, 0361, 0224, >X 0235, 0335, 0242, 0374, 0226, 0062, 0072, 0362, 0061, 0054, 0232, 0262, 0205, 0250, 0157, 0200, >X 0260, 0310, 0233, 0036, 0000, 0126, 0076, 0227, 0002, 0026, 0115, 0336, 0112, 0176, 0170, 0120, >X 0233, 0151, 0326, 0361, 0302, 0317, 0260, 0355, 0324, 0013, 0310, 0275, 0370, 0357, 0316, 0310, >X 0177, 0221, 0121, 0370, 0017, 0154, 0317, 0174, 0201, 0330, 0317, 0256, 0066, 0317, 0030, 0030, >X 0070, 0035, 0217, 0117, 0376, 0206, 0230, 0221, 0106, 0004, 0347, 0233, 0326, 0005, 0361, 0303, >X 0371, 0252, 0003, 0260, 0040, 0145, 0063, 0274, 0224, 0301, 0155, 0236, 0263, 0371, 0330, 0022, >X 0354, 0314, 0172, 0117, 0104, 0002, 0246, 0351, 0217, 0044, 0257, 0103, 0142, 0304, 0257, 0073, >X 0254, 0374, 0057, 0063, 0226, 0142, 0307, 0251, 0167, 0105, 0001, 0214, 0222, 0156, 0074, 0234, >X 0274, 0026, 0111, 0267, 0054, 0270, 0356, 0314, 0160, 0355, 0070, 0074, 0070, 0156, 0035, 0326, >X 0355, 0273, 0137, 0224, 0054, 0272, 0252, 0373, 0243, 0013, 0055, 0200, 0370, 0006, 0021, 0216, >X 0373, 0307, 0174, 0200, 0100, 0115, 0174, 0233, 0147, 0124, 0324, 0236, 0303, 0301, 0274, 0325, >X 0064, 0022, 0001, 0061, 0047, 0115, 0347, 0177, 0237, 0371, 0062, 0321, 0123, 0175, 0207, 0256, >X 0130, 0125, 0127, 0110, 0337, 0367, 0041, 0145, 0312, 0326, 0357, 0143, 0276, 0263, 0047, 0347, >X 0015, 0233, 0045, 0213, 0133, 0103, 0357, 0301, 0355, 0267, 0376, 0221, 0254, 0324, 0162, 0363, >X 0271, 0040, 0256, 0357, 0214, 0213, 0231, 0217, 0133, 0007, 0314, 0165, 0120, 0226, 0260, 0264, >X 0374, 0213, 0326, 0257, 0355, 0257, 0163, 0320, 0277, 0322, 0346, 0157, 0224, 0064, 0322, 0136, >X 0173, 0222, 0072, 0370, 0117, 0042, 0076, 0351, 0273, 0050, 0036, 0164, 0011, 0000, 0146, 0062, >X 0151, 0037, 0265, 0057, 0146, 0014, 0171, 0336, 0356, 0171, 0176, 0236, 0021, 0110, 0036, 0370, >X 0044, 0352, 0150, 0300, 0327, 0352, 0115, 0302, 0142, 0046, 0307, 0077, 0003, 0231, 0104, 0331, >X 0241, 0353, 0372, 0252, 0042, 0220, 0024, 0071, 0037, 0365, 0215, 0337, 0307, 0062, 0051, 0366, >X 0367, 0166, 0021, 0225, 0322, 0265, 0356, 0034, 0376, 0212, 0160, 0131, 0135, 0221, 0043, 0164, >X 0111, 0014, 0320, 0223, 0111, 0117, 0214, 0175, 0024, 0132, 0317, 0133, 0034, 0016, 0331, 0071, >X 0043, 0336, 0306, 0055, 0376, 0343, 0121, 0132, 0231, 0215, 0270, 0220, 0151, 0224, 0240, 0115, >X 0271, 0241, 0153, 0317, 0035, 0305, 0223, 0075, 0323, 0120, 0134, 0221, 0211, 0270, 0340, 0251, >X 0210, 0011, 0234, 0352, 0360, 0063, 0203, 0372, 0317, 0240, 0163, 0047, 0041, 0273, 0144, 0217, >X 0313, 0353, 0105, 0056, 0007, 0200, 0253, 0231, 0052, 0205, 0002, 0343, 0242, 0237, 0160, 0332, >X 0157, 0214, 0010, 0177, 0220, 0216, 0316, 0271, 0276, 0104, 0042, 0303, 0360, 0260, 0007, 0350, >X 0150, 0337, 0347, 0306, 0106, 0075, 0216, 0323, 0004, 0200, 0325, 0045, 0112, 0172, 0257, 0013, >X 0062, 0232, 0054, 0010, 0357, 0067, 0012, 0101, 0076, 0203, 0321, 0233, 0044, 0056, 0370, 0027, >X 0144, 0261, 0376, 0302, 0175, 0366, 0352, 0030, 0300, 0005, 0266, 0201, 0375, 0247, 0240, 0267, >X 0165, 0133, 0170, 0052, 0003, 0104, 0011, 0334, 0325, 0323, 0324, 0056, 0007, 0200, 0047, 0372, >X 0303, 0372, 0215, 0106, 0157, 0024, 0236, 0177, 0060, 0131, 0172, 0065, 0000, 0026, 0160, 0237, >X 0227, 0257, 0052, 0264, 0127, 0002, 0340, 0357, 0035, 0355, 0162, 0273, 0165, 0051, 0000, 0234, >X 0121, 0052, 0025, 0052, 0170, 0172, 0150, 0173, 0045, 0000, 0276, 0352, 0001, 0160, 0165, 0253, >X 0216, 0113, 0131, 0020, 0247, 0363, 0146, 0263, 0011, 0037, 0357, 0237, 0053, 0270, 0274, 0245, >X 0027, 0255, 0253, 0341, 0244, 0220, 0247, 0071, 0025, 0162, 0151, 0357, 0005, 0200, 0037, 0203, >X 0255, 0240, 0244, 0042, 0253, 0127, 0056, 0151, 0342, 0321, 0357, 0352, 0305, 0051, 0035, 0006, >X 0200, 0123, 0172, 0136, 0202, 0303, 0253, 0077, 0330, 0112, 0331, 0327, 0053, 0104, 0143, 0257, >X 0344, 0272, 0070, 0300, 0313, 0165, 0172, 0043, 0000, 0062, 0211, 0365, 0271, 0332, 0312, 0155, >X 0270, 0217, 0326, 0334, 0370, 0134, 0174, 0236, 0102, 0326, 0261, 0345, 0133, 0035, 0002, 0200, >X 0113, 0312, 0076, 0052, 0137, 0014, 0015, 0233, 0212, 0376, 0232, 0004, 0324, 0031, 0052, 0160, >X 0366, 0362, 0001, 0024, 0226, 0237, 0020, 0025, 0114, 0156, 0303, 0266, 0336, 0250, 0005, 0162, >X 0251, 0022, 0323, 0022, 0026, 0302, 0103, 0256, 0351, 0165, 0000, 0134, 0251, 0071, 0203, 0214, >X 0202, 0115, 0142, 0155, 0134, 0163, 0136, 0143, 0066, 0011, 0313, 0210, 0015, 0232, 0100, 0371, >X 0315, 0030, 0361, 0254, 0074, 0361, 0237, 0177, 0171, 0037, 0201, 0142, 0154, 0167, 0237, 0221, >X 0274, 0043, 0312, 0037, 0031, 0061, 0007, 0263, 0107, 0274, 0206, 0176, 0136, 0061, 0327, 0370, >X 0276, 0305, 0200, 0264, 0263, 0353, 0260, 0051, 0175, 0031, 0131, 0205, 0136, 0164, 0001, 0213, >X 0116, 0064, 0251, 0007, 0146, 0016, 0175, 0111, 0364, 0200, 0366, 0066, 0311, 0273, 0374, 0003, >X 0322, 0317, 0155, 0154, 0166, 0103, 0074, 0141, 0343, 0357, 0035, 0201, 0137, 0215, 0371, 0210, >X 0162, 0233, 0324, 0126, 0347, 0236, 0053, 0333, 0217, 0215, 0151, 0117, 0242, 0270, 0374, 0124, >X 0273, 0312, 0027, 0355, 0262, 0031, 0356, 0046, 0216, 0013, 0236, 0210, 0371, 0051, 0233, 0132, >X 0051, 0337, 0152, 0256, 0012, 0214, 0215, 0136, 0204, 0007, 0307, 0255, 0205, 0265, 0247, 0312, >X 0322, 0154, 0260, 0365, 0206, 0352, 0136, 0311, 0202, 0364, 0106, 0135, 0013, 0227, 0153, 0206, >X 0267, 0252, 0037, 0026, 0115, 0376, 0356, 0072, 0345, 0263, 0104, 0372, 0247, 0340, 0211, 0111, >X 0074, 0311, 0024, 0326, 0256, 0376, 0126, 0247, 0001, 0020, 0356, 0104, 0256, 0300, 0235, 0303, >X 0127, 0221, 0227, 0267, 0215, 0060, 0327, 0161, 0022, 0006, 0244, 0322, 0315, 0233, 0161, 0063, >X 0011, 0027, 0024, 0047, 0305, 0056, 0041, 0227, 0073, 0304, 0346, 0071, 0076, 0352, 0060, 0244, >X 0016, 0371, 0003, 0014, 0355, 0310, 0336, 0234, 0006, 0200, 0121, 0015, 0326, 0304, 0220, 0337, >X 0163, 0234, 0325, 0016, 0017, 0277, 0117, 0004, 0347, 0233, 0105, 0070, 0350, 0052, 0025, 0062, >X 0014, 0036, 0060, 0333, 0341, 0271, 0011, 0301, 0263, 0240, 0121, 0171, 0071, 0135, 0103, 0162, >X 0176, 0253, 0002, 0372, 0076, 0137, 0317, 0160, 0273, 0243, 0277, 0111, 0074, 0024, 0132, 0270, >X 0152, 0033, 0203, 0162, 0335, 0171, 0024, 0224, 0035, 0102, 0145, 0135, 0061, 0052, 0152, 0316, >X 0323, 0165, 0044, 0302, 0072, 0125, 0012, 0037, 0150, 0075, 0043, 0021, 0356, 0237, 0210, 0100, >X 0357, 0201, 0344, 0207, 0275, 0072, 0061, 0241, 0264, 0100, 0051, 0123, 0302, 0123, 0351, 0357, >X 0360, 0134, 0225, 0122, 0053, 0356, 0245, 0336, 0240, 0163, 0252, 0374, 0345, 0222, 0074, 0300, >X 0322, 0311, 0175, 0066, 0072, 0375, 0025, 0244, 0345, 0157, 0300, 0361, 0302, 0057, 0120, 0124, >X 0176, 0014, 0065, 0015, 0127, 0321, 0162, 0171, 0163, 0313, 0202, 0061, 0227, 0276, 0375, 0074, >X 0303, 0020, 0027, 0222, 0212, 0244, 0250, 0207, 0310, 0137, 0117, 0356, 0044, 0053, 0260, 0146, >X 0366, 0316, 0144, 0377, 0355, 0111, 0070, 0345, 0075, 0331, 0364, 0171, 0056, 0170, 0167, 0316, >X 0337, 0260, 0353, 0364, 0233, 0270, 0134, 0135, 0044, 0070, 0271, 0234, 0370, 0266, 0207, 0134, >X 0156, 0027, 0374, 0053, 0065, 0147, 0121, 0232, 0275, 0032, 0007, 0162, 0127, 0143, 0110, 0350, >X 0035, 0270, 0153, 0344, 0213, 0242, 0260, 0326, 0023, 0245, 0307, 0002, 0120, 0126, 0223, 0217, >X 0117, 0016, 0374, 0032, 0331, 0045, 0173, 0241, 0240, 0273, 0124, 0053, 0235, 0273, 0125, 0116, >X 0206, 0344, 0174, 0110, 0255, 0276, 0073, 0243, 0140, 0013, 0162, 0057, 0356, 0306, 0234, 0121, >X 0057, 0143, 0142, 0354, 0122, 0067, 0000, 0316, 0010, 0167, 0106, 0277, 0377, 0303, 0235, 0270, >X 0162, 0265, 0330, 0151, 0305, 0267, 0135, 0010, 0221, 0212, 0256, 0153, 0275, 0261, 0006, 0353, >X 0017, 0054, 0303, 0345, 0253, 0371, 0230, 0233, 0370, 0206, 0033, 0000, 0173, 0122, 0124, 0221, >X 0116, 0312, 0277, 0013, 0225, 0272, 0122, 0122, 0136, 0347, 0334, 0236, 0114, 0052, 0047, 0040, >X 0055, 0330, 0176, 0362, 0115, 0341, 0315, 0347, 0046, 0276, 0331, 0163, 0352, 0115, 0075, 0111, >X 0371, 0125, 0165, 0105, 0370, 0140, 0327, 0034, 0241, 0174, 0245, 0274, 0163, 0307, 0006, 0127, >X 0067, 0325, 0112, 0031, 0201, 0360, 0026, 0266, 0235, 0174, 0316, 0015, 0100, 0133, 0301, 0163, >X 0375, 0201, 0107, 0204, 0333, 0161, 0106, 0371, 0314, 0064, 0114, 0146, 0043, 0214, 0046, 0243, >X 0170, 0165, 0206, 0171, 0061, 0010, 0354, 0222, 0266, 0236, 0130, 0211, 0274, 0313, 0273, 0335, >X 0000, 0264, 0224, 0075, 0077, 0277, 0215, 0223, 0205, 0077, 0222, 0202, 0144, 0016, 0151, 0136, >X 0203, 0301, 0050, 0346, 0031, 0064, 0252, 0000, 0004, 0373, 0015, 0202, 0326, 0053, 0124, 0254, >X 0021, 0253, 0067, 0130, 0001, 0261, 0373, 0300, 0024, 0240, 0371, 0234, 0215, 0207, 0027, 0023, >X 0160, 0015, 0356, 0030, 0300, 0302, 0213, 0363, 0176, 0310, 0172, 0015, 0126, 0227, 0157, 0073, >X 0173, 0321, 0213, 0152, 0243, 0002, 0243, 0243, 0357, 0106, 0312, 0240, 0047, 0061, 0100, 0073, >X 0014, 0052, 0271, 0006, 0006, 0122, 0344, 0325, 0272, 0013, 0310, 0240, 0074, 0341, 0160, 0336, >X 0337, 0121, 0134, 0361, 0063, 0045, 0203, 0062, 0233, 0313, 0117, 0271, 0130, 0166, 0376, 0112, >X 0026, 0016, 0234, 0371, 0260, 0333, 0231, 0121, 0217, 0260, 0200, 0303, 0371, 0037, 0343, 0122, >X 0165, 0061, 0121, 0107, 0271, 0035, 0220, 0214, 0010, 0323, 0016, 0301, 0262, 0333, 0176, 0300, >X 0202, 0211, 0237, 0043, 0066, 0070, 0125, 0364, 0370, 0313, 0145, 0152, 0250, 0025, 0176, 0350, >X 0357, 0023, 0217, 0031, 0103, 0376, 0210, 0025, 0063, 0017, 0143, 0332, 0340, 0305, 0242, 0160, >X 0150, 0073, 0161, 0222, 0210, 0234, 0142, 0117, 0316, 0333, 0035, 0356, 0073, 0275, 0151, 0000, >X 0140, 0256, 0176, 0070, 0377, 0357, 0166, 0347, 0136, 0365, 0244, 0374, 0350, 0300, 0104, 0054, >X 0237, 0261, 0233, 0136, 0047, 0330, 0057, 0005, 0050, 0174, 0161, 0337, 0350, 0167, 0351, 0370, >X 0053, 0131, 0214, 0031, 0266, 0246, 0202, 0170, 0061, 0306, 0205, 0312, 0063, 0310, 0273, 0264, >X 0247, 0157, 0003, 0160, 0251, 0072, 0107, 0264, 0015, 0052, 0154, 0154, 0223, 0323, 0064, 0261, >X 0077, 0157, 0334, 0207, 0327, 0325, 0142, 0312, 0165, 0171, 0310, 0056, 0335, 0211, 0163, 0127, >X 0176, 0102, 0255, 0276, 0365, 0306, 0204, 0123, 0023, 0126, 0140, 0374, 0300, 0171, 0250, 0267, >X 0321, 0330, 0303, 0356, 0211, 0013, 0266, 0307, 0013, 0077, 0357, 0333, 0000, 0260, 0362, 0352, >X 0364, 0015, 0066, 0247, 0363, 0032, 0110, 0113, 0343, 0143, 0036, 0101, 0250, 0166, 0124, 0033, >X 0226, 0121, 0213, 0257, 0217, 0075, 0213, 0225, 0337, 0046, 0323, 0061, 0002, 0307, 0316, 0177, >X 0326, 0352, 0375, 0131, 0303, 0376, 0102, 0156, 0112, 0143, 0263, 0062, 0311, 0230, 0237, 0057, >X 0073, 0102, 0357, 0033, 0373, 0056, 0000, 0105, 0025, 0307, 0354, 0062, 0036, 0265, 0322, 0003, >X 0223, 0342, 0226, 0265, 0371, 0176, 0260, 0357, 0120, 0374, 0166, 0332, 0026, 0004, 0372, 0204, >X 0020, 0175, 0055, 0302, 0107, 0173, 0346, 0341, 0124, 0361, 0127, 0315, 0357, 0373, 0173, 0307, >X 0040, 0056, 0170, 0262, 0130, 0002, 0333, 0066, 0043, 0242, 0334, 0103, 0127, 0114, 0254, 0352, >X 0152, 0337, 0005, 0100, 0127, 0177, 0305, 0346, 0173, 0074, 0007, 0321, 0337, 0147, 0240, 0010, >X 0260, 0315, 0065, 0042, 0135, 0076, 0131, 0305, 0065, 0205, 0151, 0124, 0301, 0360, 0367, 0012, >X 0027, 0243, 0231, 0113, 0346, 0337, 0147, 0256, 0022, 0161, 0245, 0111, 0102, 0373, 0215, 0204, >X 0255, 0255, 0121, 0231, 0222, 0352, 0364, 0345, 0274, 0071, 0155, 0337, 0005, 0200, 0347, 0222, >X 0155, 0011, 0117, 0352, 0170, 0171, 0370, 0213, 0355, 0005, 0232, 0344, 0373, 0314, 0127, 0360, >X 0325, 0321, 0147, 0232, 0377, 0174, 0274, 0160, 0023, 0271, 0221, 0014, 0142, 0120, 0122, 0321, >X 0020, 0120, 0121, 0133, 0010, 0203, 0261, 0256, 0371, 0375, 0000, 0357, 0030, 0307, 0051, 0135, >X 0067, 0356, 0040, 0337, 0243, 0313, 0321, 0074, 0251, 0123, 0113, 0043, 0224, 0251, 0142, 0323, >X 0126, 0005, 0027, 0253, 0263, 0161, 0252, 0150, 0017, 0112, 0052, 0117, 0120, 0120, 0326, 0042, >X 0253, 0144, 0273, 0120, 0040, 0217, 0146, 0336, 0202, 0246, 0151, 0373, 0340, 0226, 0161, 0302, >X 0031, 0056, 0326, 0147, 0001, 0260, 0267, 0372, 0205, 0175, 0164, 0015, 0271, 0050, 0203, 0251, >X 0116, 0000, 0120, 0111, 0243, 0273, 0250, 0074, 0203, 0250, 0246, 0004, 0147, 0056, 0376, 0044, >X 0054, 0204, 0067, 0031, 0224, 0066, 0006, 0160, 0336, 0224, 0043, 0310, 0067, 0201, 0030, 0225, >X 0147, 0013, 0226, 0225, 0355, 0260, 0100, 0321, 0235, 0216, 0240, 0333, 0135, 0220, 0132, 0151, >X 0273, 0135, 0205, 0333, 0101, 0252, 0152, 0057, 0341, 0102, 0165, 0146, 0163, 0271, 0242, 0272, >X 0256, 0132, 0364, 0342, 0050, 0144, 0162, 0321, 0014, 0005, 0061, 0045, 0151, 0026, 0145, 0010, >X 0255, 0167, 0040, 0146, 0217, 0134, 0325, 0052, 0233, 0276, 0120, 0225, 0145, 0063, 0307, 0140, >X 0166, 0304, 0056, 0316, 0127, 0035, 0322, 0167, 0001, 0010, 0357, 0227, 0150, 0167, 0164, 0062, >X 0203, 0111, 0073, 0373, 0251, 0160, 0105, 0077, 0235, 0371, 0310, 0252, 0164, 0356, 0266, 0063, >X 0031, 0151, 0364, 0253, 0105, 0115, 0210, 0135, 0120, 0024, 0045, 0152, 0277, 0235, 0366, 0055, >X 0006, 0370, 0015, 0157, 0061, 0372, 0117, 0123, 0242, 0165, 0220, 0142, 0203, 0324, 0146, 0214, >X 0341, 0155, 0157, 0170, 0016, 0267, 0127, 0270, 0040, 0147, 0133, 0357, 0332, 0263, 0005, 0130, >X 0024, 0145, 0266, 0152, 0245, 0222, 0024, 0151, 0154, 0363, 0373, 0075, 0050, 0262, 0246, 0023, >X 0000, 0305, 0104, 0127, 0153, 0352, 0053, 0310, 0145, 0111, 0051, 0157, 0060, 0341, 0366, 0241, >X 0313, 0061, 0041, 0366, 0167, 0270, 0112, 0014, 0106, 0051, 0363, 0246, 0074, 0141, 0270, 0130, >X 0216, 0164, 0055, 0177, 0250, 0301, 0247, 0007, 0027, 0322, 0271, 0065, 0066, 0253, 0253, 0314, >X 0116, 0303, 0210, 0045, 0265, 0374, 0234, 0375, 0347, 0227, 0070, 0371, 0354, 0022, 0027, 0000, >X 0040, 0201, 0230, 0131, 0162, 0266, 0274, 0340, 0254, 0004, 0021, 0305, 0014, 0325, 0016, 0105, >X 0376, 0345, 0164, 0264, 0265, 0151, 0054, 0077, 0164, 0255, 0276, 0022, 0271, 0027, 0016, 0210, >X 0362, 0201, 0004, 0112, 0334, 0071, 0142, 0071, 0035, 0053, 0305, 0373, 0201, 0232, 0153, 0253, >X 0355, 0231, 0116, 0346, 0224, 0156, 0247, 0021, 0355, 0207, 0355, 0047, 0137, 0242, 0357, 0114, >X 0263, 0063, 0177, 0154, 0021, 0323, 0226, 0111, 0221, 0017, 0073, 0367, 0114, 0142, 0113, 0172, >X 0307, 0165, 0043, 0116, 0352, 0314, 0134, 0145, 0225, 0164, 0062, 0000, 0162, 0162, 0244, 0245, >X 0125, 0231, 0142, 0304, 0151, 0124, 0041, 0016, 0262, 0333, 0175, 0160, 0236, 0331, 0111, 0060, >X 0046, 0172, 0076, 0162, 0057, 0246, 0303, 0126, 0307, 0013, 0373, 0174, 0356, 0016, 0344, 0152, >X 0150, 0122, 0344, 0035, 0315, 0312, 0277, 0056, 0153, 0326, 0127, 0143, 0335, 0336, 0005, 0315, >X 0001, 0334, 0336, 0344, 0275, 0241, 0161, 0367, 0104, 0107, 0265, 0245, 0246, 0174, 0241, 0316, >X 0240, 0047, 0002, 0220, 0206, 0100, 0357, 0070, 0273, 0347, 0026, 0127, 0036, 0105, 0125, 0135, >X 0271, 0315, 0322, 0112, 0207, 0143, 0000, 0337, 0104, 0125, 0155, 0045, 0166, 0347, 0274, 0146, >X 0367, 0274, 0212, 0332, 0263, 0110, 0073, 0267, 0201, 0314, 0336, 0171, 0063, 0114, 0212, 0172, >X 0030, 0375, 0065, 0301, 0064, 0302, 0354, 0227, 0004, 0224, 0024, 0170, 0117, 0024, 0176, 0205, >X 0127, 0267, 0216, 0306, 0216, 0314, 0225, 0224, 0365, 0176, 0103, 0071, 0300, 0101, 0002, 0157, >X 0027, 0016, 0346, 0255, 0301, 0327, 0031, 0377, 0055, 0036, 0234, 0313, 0315, 0034, 0244, 0355, >X 0331, 0050, 0327, 0201, 0046, 0307, 0057, 0167, 0270, 0023, 0127, 0323, 0040, 0141, 0100, 0367, >X 0376, 0374, 0046, 0177, 0322, 0356, 0231, 0273, 0163, 0136, 0155, 0034, 0174, 0222, 0116, 0166, >X 0101, 0260, 0356, 0160, 0370, 0143, 0316, 0133, 0142, 0337, 0266, 0061, 0121, 0217, 0137, 0367, >X 0176, 0145, 0155, 0001, 0076, 0336, 0177, 0057, 0152, 0032, 0052, 0111, 0131, 0062, 0207, 0253, >X 0322, 0233, 0231, 0220, 0102, 0213, 0073, 0106, 0274, 0210, 0217, 0367, 0056, 0044, 0113, 0163, >X 0264, 0054, 0324, 0114, 0026, 0226, 0206, 0063, 0227, 0322, 0254, 0155, 0052, 0122, 0153, 0060, >X 0345, 0232, 0033, 0053, 0311, 0231, 0331, 0064, 0156, 0060, 0036, 0024, 0064, 0012, 0143, 0243, >X 0027, 0070, 0375, 0354, 0334, 0365, 0234, 0107, 0056, 0355, 0263, 0103, 0277, 0301, 0075, 0111, >X 0357, 0323, 0363, 0171, 0135, 0347, 0172, 0266, 0234, 0370, 0057, 0234, 0054, 0332, 0041, 0342, >X 0226, 0213, 0202, 0260, 0104, 0370, 0302, 0177, 0034, 0132, 0204, 0323, 0245, 0133, 0061, 0062, >X 0142, 0036, 0371, 0340, 0070, 0376, 0305, 0015, 0122, 0310, 0217, 0304, 0122, 0376, 0027, 0345, >X 0142, 0076, 0267, 0375, 0213, 0032, 0306, 0106, 0077, 0106, 0011, 0326, 0327, 0070, 0234, 0377, >X 0065, 0045, 0130, 0162, 0273, 0243, 0321, 0112, 0101, 0033, 0263, 0130, 0176, 0010, 0211, 0325, >X 0105, 0072, 0225, 0171, 0223, 0225, 0051, 0345, 0012, 0334, 0073, 0372, 0035, 0321, 0271, 0335, >X 0276, 0001, 0050, 0303, 0301, 0374, 0117, 0120, 0122, 0225, 0201, 0344, 0230, 0047, 0304, 0342, >X 0103, 0166, 0217, 0105, 0345, 0351, 0070, 0174, 0356, 0143, 0221, 0233, 0170, 0264, 0163, 0105, >X 0115, 0273, 0023, 0061, 0166, 0105, 0122, 0231, 0005, 0107, 0317, 0157, 0306, 0261, 0202, 0315, >X 0042, 0160, 0162, 0315, 0206, 0027, 0153, 0260, 0122, 0156, 0144, 0145, 0371, 0274, 0161, 0153, >X 0121, 0241, 0373, 0005, 0271, 0224, 0064, 0007, 0040, 0164, 0204, 0157, 0101, 0120, 0126, 0366, >X 0272, 0277, 0032, 0373, 0236, 0130, 0215, 0337, 0021, 0141, 0020, 0212, 0312, 0117, 0342, 0263, >X 0053, 0113, 0304, 0014, 0036, 0137, 0137, 0157, 0152, 0212, 0071, 0355, 0177, 0366, 0016, 0346, >X 0001, 0022, 0161, 0061, 0166, 0063, 0074, 0006, 0245, 0122, 0251, 0230, 0313, 0275, 0321, 0345, >X 0074, 0134, 0357, 0177, 0162, 0332, 0026, 0014, 0015, 0233, 0116, 0101, 0317, 0330, 0251, 0045, >X 0002, 0316, 0033, 0214, 0344, 0253, 0036, 0112, 0376, 0020, 0343, 0142, 0026, 0336, 0320, 0167, >X 0261, 0073, 0022, 0123, 0236, 0114, 0233, 0045, 0126, 0135, 0164, 0164, 0003, 0330, 0033, 0116, >X 0304, 0270, 0371, 0251, 0063, 0267, 0376, 0345, 0151, 0306, 0305, 0323, 0267, 0212, 0311, 0024, >X 0336, 0140, 0243, 0063, 0152, 0365, 0234, 0045, 0153, 0324, 0101, 0170, 0154, 0362, 0006, 0341, >X 0352, 0072, 0255, 0126, 0045, 0376, 0271, 0061, 0025, 0366, 0310, 0142, 0234, 0124, 0242, 0300, >X 0374, 0224, 0117, 0105, 0162, 0365, 0335, 0361, 0347, 0051, 0231, 0252, 0023, 0276, 0265, 0275, >X 0153, 0260, 0170, 0324, 0263, 0173, 0110, 0030, 0060, 0001, 0017, 0216, 0137, 0115, 0114, 0053, >X 0276, 0307, 0075, 0153, 0027, 0000, 0040, 0161, 0052, 0203, 0154, 0113, 0122, 0007, 0077, 0213, >X 0370, 0220, 0333, 0260, 0215, 0222, 0252, 0023, 0205, 0137, 0102, 0257, 0067, 0212, 0222, 0263, >X 0065, 0041, 0223, 0330, 0114, 0204, 0304, 0342, 0101, 0242, 0231, 0301, 0176, 0221, 0230, 0022, >X 0277, 0014, 0223, 0342, 0226, 0266, 0052, 0151, 0267, 0147, 0204, 0367, 0172, 0000, 0314, 0026, >X 0303, 0015, 0165, 0036, 0204, 0151, 0107, 0141, 0341, 0244, 0115, 0142, 0021, 0340, 0221, 0263, >X 0353, 0221, 0167, 0151, 0257, 0315, 0012, 0247, 0265, 0270, 0026, 0040, 0352, 0113, 0103, 0303, >X 0347, 0040, 0061, 0162, 0236, 0350, 0230, 0350, 0370, 0275, 0233, 0172, 0067, 0000, 0042, 0203, >X 0324, 0327, 0342, 0312, 0325, 0134, 0150, 0075, 0243, 0156, 0350, 0273, 0242, 0002, 0223, 0305, >X 0301, 0262, 0051, 0175, 0051, 0166, 0146, 0276, 0003, 0125, 0013, 0316, 0317, 0033, 0165, 0153, >X 0324, 0201, 0130, 0061, 0363, 0010, 0135, 0053, 0242, 0123, 0356, 0277, 0244, 0362, 0270, 0313, >X 0126, 0372, 0020, 0171, 0221, 0264, 0002, 0300, 0142, 0061, 0113, 0135, 0341, 0176, 0370, 0001, >X 0016, 0235, 0135, 0323, 0270, 0051, 0253, 0363, 0302, 0126, 0043, 0326, 0343, 0032, 0353, 0240, >X 0323, 0127, 0064, 0273, 0003, 0006, 0325, 0113, 0331, 0357, 0372, 0325, 0310, 0224, 0176, 0172, >X 0253, 0374, 0305, 0337, 0227, 0353, 0316, 0065, 0316, 0162, 0131, 0104, 0143, 0256, 0106, 0025, >X 0004, 0153, 0057, 0220, 0262, 0135, 0226, 0173, 0274, 0350, 0137, 0160, 0325, 0102, 0171, 0271, >X 0324, 0243, 0241, 0025, 0000, 0374, 0113, 0240, 0256, 0230, 0231, 0123, 0322, 0023, 0034, 0073, >X 0277, 0011, 0267, 0206, 0156, 0300, 0210, 0360, 0207, 0234, 0140, 0054, 0125, 0330, 0224, 0266, >X 0214, 0134, 0315, 0001, 0221, 0351, 0362, 0214, 0226, 0256, 0241, 0242, 0225, 0077, 0146, 0140, >X 0376, 0263, 0316, 0043, 0247, 0344, 0354, 0162, 0365, 0031, 0274, 0364, 0115, 0102, 0063, 0173, >X 0265, 0010, 0000, 0024, 0360, 0041, 0006, 0304, 0200, 0250, 0225, 0074, 0137, 0360, 0042, 0015, >X 0206, 0151, 0016, 0357, 0143, 0313, 0211, 0147, 0121, 0120, 0226, 0331, 0041, 0156, 0357, 0030, >X 0134, 0040, 0300, 0053, 0046, 0257, 0025, 0000, 0041, 0332, 0021, 0031, 0247, 0057, 0354, 0113, >X 0166, 0101, 0010, 0246, 0377, 0230, 0261, 0341, 0340, 0002, 0261, 0276, 0053, 0071, 0146, 0261, >X 0250, 0126, 0332, 0222, 0223, 0105, 0137, 0342, 0207, 0254, 0377, 0023, 0073, 0035, 0066, 0115, >X 0057, 0376, 0147, 0020, 0027, 0364, 0257, 0015, 0106, 0304, 0077, 0107, 0142, 0152, 0061, 0037, >X 0154, 0055, 0272, 0325, 0243, 0266, 0241, 0272, 0021, 0334, 0063, 0144, 0101, 0177, 0300, 0123, >X 0267, 0037, 0262, 0171, 0175, 0056, 0247, 0154, 0317, 0174, 0236, 0262, 0372, 0265, 0142, 0360, >X 0270, 0306, 0375, 0020, 0000, 0232, 0201, 0077, 0213, 0147, 0151, 0232, 0220, 0076, 0131, 0274, >X 0371, 0236, 0065, 0173, 0346, 0176, 0356, 0341, 0242, 0075, 0322, 0232, 0266, 0066, 0350, 0257, >X 0011, 0247, 0024, 0076, 0261, 0325, 0264, 0141, 0113, 0051, 0052, 0077, 0212, 0322, 0312, 0237, >X 0133, 0255, 0116, 0357, 0104, 0277, 0113, 0161, 0303, 0033, 0011, 0241, 0063, 0233, 0127, 0363, >X 0267, 0224, 0332, 0206, 0062, 0024, 0224, 0037, 0101, 0125, 0155, 0071, 0045, 0132, 0122, 0270, >X 0142, 0223, 0051, 0266, 0136, 0011, 0024, 0306, 0247, 0156, 0073, 0234, 0024, 0342, 0067, 0374, >X 0170, 0063, 0000, 0172, 0223, 0316, 0353, 0257, 0133, 0007, 0347, 0224, 0351, 0012, 0102, 0135, >X 0271, 0255, 0073, 0007, 0113, 0261, 0167, 0204, 0305, 0126, 0226, 0151, 0245, 0231, 0256, 0160, >X 0207, 0154, 0110, 0314, 0224, 0364, 0206, 0266, 0227, 0321, 0061, 0346, 0055, 0267, 0132, 0160, >X 0205, 0130, 0013, 0201, 0311, 0207, 0227, 0114, 0333, 0077, 0266, 0125, 0046, 0254, 0224, 0171, >X 0351, 0046, 0304, 0056, 0173, 0313, 0340, 0142, 0346, 0305, 0345, 0012, 0266, 0062, 0056, 0135, >X 0264, 0165, 0360, 0373, 0256, 0352, 0022, 0261, 0130, 0254, 0231, 0273, 0207, 0215, 0153, 0163, >X 0035, 0313, 0225, 0312, 0157, 0012, 0116, 0123, 0342, 0126, 0274, 0322, 0146, 0051, 0142, 0342, >X 0240, 0345, 0157, 0044, 0204, 0114, 0332, 0137, 0157, 0350, 0276, 0355, 0334, 0157, 0146, 0251, >X 0325, 0233, 0061, 0046, 0352, 0201, 0215, 0267, 0206, 0336, 0375, 0105, 0233, 0000, 0120, 0266, >X 0150, 0174, 0140, 0314, 0272, 0107, 0373, 0171, 0205, 0134, 0354, 0316, 0137, 0231, 0273, 0031, >X 0205, 0347, 0261, 0343, 0202, 0223, 0017, 0316, 0115, 0174, 0377, 0011, 0273, 0305, 0070, 0177, >X 0257, 0350, 0374, 0105, 0223, 0267, 0314, 0362, 0367, 0276, 0245, 0240, 0047, 0374, 0302, 0104, >X 0157, 0027, 0356, 0157, 0325, 0065, 0220, 0362, 0103, 0046, 0355, 0133, 0060, 0141, 0363, 0034, >X 0265, 0102, 0133, 0321, 0052, 0056, 0331, 0152, 0313, 0253, 0252, 0053, 0012, 0373, 0042, 0175, >X 0311, 0273, 0307, 0213, 0276, 0232, 0155, 0021, 0015, 0120, 0356, 0337, 0223, 0157, 0237, 0342, >X 0115, 0242, 0020, 0310, 0135, 0064, 0343, 0007, 0056, 0132, 0175, 0327, 0360, 0125, 0317, 0250, >X 0024, 0276, 0125, 0327, 0021, 0003, 0107, 0175, 0221, 0331, 0027, 0266, 0315, 0374, 0061, 0373, >X 0325, 0025, 0147, 0056, 0375, 0070, 0225, 0042, 0270, 0140, 0344, 0122, 0367, 0017, 0256, 0266, >X 0225, 0360, 0210, 0030, 0333, 0124, 0272, 0360, 0124, 0252, 0033, 0006, 0005, 0245, 0356, 0230, >X 0022, 0367, 0324, 0353, 0061, 0375, 0247, 0356, 0262, 0371, 0061, 0147, 0033, 0123, 0213, 0053, >X 0063, 0106, 0236, 0273, 0262, 0077, 0245, 0270, 0342, 0350, 0250, 0053, 0065, 0271, 0261, 0327, >X 0256, 0352, 0226, 0246, 0034, 0103, 0056, 0125, 0352, 0003, 0065, 0361, 0331, 0141, 0332, 0304, >X 0264, 0250, 0200, 0344, 0375, 0201, 0232, 0270, 0034, 0207, 0270, 0165, 0147, 0147, 0260, 0133, >X 0172, 0330, 0102, 0155, 0067, 0000, 0156, 0161, 0003, 0320, 0327, 0344, 0377, 0005, 0030, 0000, >X 0311, 0126, 0266, 0170, 0011, 0372, 0231, 0112, 0000, 0000, 0000, 0000, 0111, 0105, 0116, 0104, >X 0256, 0102, 0140, 0202, 0000, 0000, 0050, 0165, 0165, 0141, 0171, 0051, 0144, 0162, 0157, 0151, >X 0144, 0143, 0141, 0155, 0057, 0000, 0000, 0000, 0003, 0000, 0000, 0000 >X} }; >X#else /* _MSC_VER */ >Xstatic const SECTION union { const guint8 data[5325]; const double alignment; void * const ptr;} _resource_data = { >X "\107\126\141\162\151\141\156\164\000\000\000\000\000\000\000\000" >X "\030\000\000\000\254\000\000\000\000\000\000\050\005\000\000\000" >X "\000\000\000\000\001\000\000\000\001\000\000\000\004\000\000\000" >X "\005\000\000\000\324\265\002\000\377\377\377\377\254\000\000\000" >X "\001\000\114\000\260\000\000\000\264\000\000\000\302\257\211\013" >X "\000\000\000\000\264\000\000\000\004\000\114\000\270\000\000\000" >X "\274\000\000\000\317\340\275\324\001\000\000\000\274\000\000\000" >X "\012\000\114\000\310\000\000\000\314\000\000\000\317\302\304\207" >X "\004\000\000\000\314\000\000\000\011\000\166\000\330\000\000\000" >X "\274\024\000\000\301\262\211\017\002\000\000\000\274\024\000\000" >X "\011\000\114\000\310\024\000\000\314\024\000\000\057\000\000\000" >X "\001\000\000\000\143\157\155\057\002\000\000\000\144\145\166\064" >X "\067\141\160\160\163\057\000\000\004\000\000\000\151\143\157\156" >X "\062\056\160\156\147\000\000\000\324\023\000\000\000\000\000\000" >X "\211\120\116\107\015\012\032\012\000\000\000\015\111\110\104\122" >X "\000\000\000\140\000\000\000\140\010\006\000\000\000\342\230\167" >X "\070\000\000\000\031\164\105\130\164\123\157\146\164\167\141\162" >X "\145\000\101\144\157\142\145\040\111\155\141\147\145\122\145\141" >X "\144\171\161\311\145\074\000\000\023\166\111\104\101\124\170\332" >X "\354\135\007\170\224\145\266\176\247\146\046\311\044\031\222\220" >X "\204\024\123\040\005\244\046\264\204\116\304\005\025\126\154\213" >X "\215\145\105\164\131\312\352\203\327\273\373\074\353\136\135\225" >X "\107\326\276\226\253\040\270\127\160\335\105\304\206\300\202\042" >X "\125\112\002\241\044\044\206\004\110\245\245\222\111\231\172\317" >X "\371\046\011\311\222\051\011\231\024\062\107\177\107\230\177\346" >X "\377\377\363\176\347\234\367\234\357\174\337\110\054\026\013\334" >X "\322\175\042\165\253\300\015\100\237\026\271\263\047\232\055\006" >X "\305\305\252\323\011\027\257\146\047\224\325\344\306\066\030\164" >X "\136\022\211\133\201\327\364\003\250\024\232\352\040\237\204\323" >X "\101\076\203\263\002\065\261\071\235\002\100\165\175\351\200\103" >X "\171\153\026\036\053\374\347\003\227\257\346\304\067\030\214\302" >X "\152\334\221\343\172\341\361\310\203\122\245\360\060\016\360\033" >X "\176\154\124\304\103\353\023\043\037\336\340\251\354\127\146\363" >X "\063\266\203\260\105\262\053\173\325\263\273\262\137\177\272\102" >X "\167\051\120\041\003\144\122\011\135\300\355\265\034\211\305\142" >X "\202\321\014\030\114\100\260\157\324\271\131\303\136\374\323\250" >X "\210\007\327\073\015\100\275\241\322\157\303\301\107\066\144\024" >X "\176\073\113\051\024\057\163\153\265\203\142\060\231\204\173\232" >X "\236\360\324\133\263\107\274\376\173\207\000\350\215\072\257\065" >X "\173\147\155\313\052\331\063\301\123\351\126\174\347\130\204\231" >X "\006\265\005\251\203\227\275\063\147\344\133\113\355\262\240\157" >X "\216\077\375\246\133\371\235\034\033\310\155\253\224\122\354\310" >X "\172\173\311\316\254\277\374\331\246\005\144\226\174\365\313\325" >X "\173\176\271\131\041\223\122\100\161\123\234\316\147\112\046\162" >X "\347\052\375\323\063\322\022\203\174\206\234\152\145\001\024\070" >X "\144\073\062\377\347\005\153\064\167\053\337\045\111\227\104\206" >X "\132\175\275\162\333\251\347\136\274\316\005\235\055\073\220\122" >X "\120\176\174\250\122\346\146\071\256\024\017\271\004\271\027\166" >X "\244\126\327\225\204\266\002\040\247\164\333\114\203\311\322\310" >X "\146\335\342\072\053\220\122\156\165\325\053\367\322\367\251\255" >X "\000\050\252\110\113\222\166\203\356\055\140\206\100\274\231\350" >X "\132\127\136\136\157\064\211\243\273\244\270\042\075\261\025\000" >X "\127\353\056\206\164\065\000\114\317\074\344\076\230\067\366\075" >X "\014\014\112\101\103\027\051\204\257\063\176\340\174\314\032\366" >X "\034\005\106\113\227\347\365\234\055\227\351\316\106\267\002\200" >X "\250\122\227\017\007\063\075\270\102\246\306\370\230\047\061\157" >X "\314\047\360\364\320\300\144\066\273\166\344\223\245\205\152\343" >X "\161\377\350\165\030\022\072\133\000\320\325\145\025\036\347\165" >X "\372\112\155\233\171\100\127\212\214\130\101\231\356\002\076\117" >X "\177\034\132\257\050\334\071\374\045\122\220\353\106\044\133\034" >X "\137\363\276\244\017\351\017\146\154\074\362\070\230\206\167\007" >X "\353\153\032\360\335\116\171\074\344\122\354\317\375\010\331\027" >X "\276\103\162\314\122\014\015\233\106\061\301\354\040\156\130\004" >X "\247\156\171\160\375\305\021\160\365\106\013\246\306\057\107\124" >X "\300\104\374\073\353\317\310\273\174\214\054\260\173\023\316\156" >X "\007\240\151\364\175\221\276\230\174\163\065\356\115\374\000\336" >X "\252\153\256\210\203\264\321\154\022\176\233\203\065\273\020\263" >X "\231\143\207\027\324\112\137\072\374\304\253\134\346\101\347\231" >X "\233\317\343\127\223\371\032\050\374\271\210\176\011\230\071\164" >X "\045\021\216\043\330\231\271\112\120\302\356\026\071\172\200\360" >X "\050\054\255\072\317\145\020\002\140\015\271\242\227\261\341\247" >X "\245\220\222\225\252\024\122\004\373\304\222\337\036\211\001\176" >X "\043\320\337\047\016\336\036\375\341\243\016\206\134\252\152\364" >X "\250\026\032\335\325\250\251\057\103\125\135\001\056\126\237\046" >X "\226\221\201\342\312\143\250\320\025\021\333\341\153\000\367\046" >X "\175\100\064\120\216\215\151\213\140\060\031\240\224\313\334\000" >X "\064\011\053\172\037\271\242\270\240\333\311\025\055\101\111\145" >X "\006\074\225\101\030\026\166\067\102\174\207\121\012\257\264\373" >X "\171\015\006\040\320\233\377\057\345\232\313\061\124\241\260\374" >X "\010\216\026\374\013\001\336\341\302\365\174\173\142\005\362\057" >X "\147\100\255\350\031\265\256\036\003\200\301\144\046\227\001\212" >X "\005\333\050\016\334\047\054\341\306\101\365\305\240\240\124\161" >X "\064\001\222\177\151\267\360\112\354\326\344\075\240\314\336\355" >X "\061\200\003\050\373\354\350\200\261\130\066\175\073\061\224\065" >X "\056\264\062\137\054\236\272\027\217\246\254\205\277\167\044\352" >X "\350\272\226\156\236\333\223\166\357\250\067\221\117\126\341\356" >X "\121\053\261\144\372\136\032\251\063\134\136\012\221\313\124\030" >X "\035\271\000\313\123\017\141\302\240\005\060\030\311\362\054\246" >X "\276\347\202\170\324\007\372\104\340\221\361\353\021\351\077\261" >X "\313\257\317\201\374\201\321\153\021\035\230\102\371\300\357\140" >X "\064\065\020\070\262\276\141\001\114\021\243\002\107\140\361\224" >X "\235\335\242\374\226\062\072\362\061\054\232\262\205\250\157\200" >X "\260\310\233\036\000\126\076\227\002\026\115\336\112\176\170\120" >X "\233\151\326\361\302\317\260\355\324\013\310\275\370\357\316\310" >X "\177\221\121\370\017\154\317\174\201\330\317\256\066\317\030\030" >X "\070\035\217\117\376\206\230\221\106\004\347\233\326\005\361\303" >X "\371\252\003\260\040\145\063\274\224\301\155\236\263\371\330\022" >X "\354\314\172\117\104\002\246\351\217\044\257\103\142\304\257\073" >X "\254\374\057\063\226\142\307\251\167\105\001\214\222\156\074\234" >X "\274\026\111\267\054\270\356\314\160\355\070\074\070\156\035\326" >X "\355\273\137\224\054\272\252\373\243\013\055\200\370\006\021\216" >X "\373\307\174\200\100\115\174\233\147\124\324\236\303\301\274\325" >X "\064\022\001\061\047\115\347\177\237\371\062\321\123\175\207\256" >X "\130\125\127\110\337\367\041\145\312\326\357\143\276\263\047\347" >X "\015\233\045\213\133\103\357\301\355\267\376\221\254\324\162\363" >X "\271\040\256\357\214\213\231\217\133\007\314\165\120\226\260\264" >X "\374\213\326\257\355\257\163\320\277\322\346\157\224\064\322\136" >X "\173\222\072\370\117\042\076\351\273\050\036\164\011\000\146\062" >X "\151\037\265\057\146\014\171\336\356\171\176\236\021\110\036\370" >X "\044\352\150\300\327\352\115\302\142\046\307\077\003\231\104\331" >X "\241\353\372\252\042\220\024\071\037\365\215\337\307\062\051\366" >X "\367\166\021\225\322\265\356\034\376\212\160\131\135\221\043\164" >X "\111\014\320\223\111\117\214\175\024\132\317\133\034\016\331\071" >X "\043\336\306\055\376\343\121\132\231\215\270\220\151\224\240\115" >X "\271\241\153\317\035\305\223\075\323\120\134\221\211\270\340\251" >X "\210\011\234\352\360\063\203\372\317\240\163\047\041\273\144\217" >X "\313\353\105\056\007\200\253\231\052\205\002\343\242\237\160\332" >X "\157\214\010\177\220\216\316\271\276\104\042\303\360\260\007\350" >X "\150\337\347\306\106\075\216\323\004\200\325\045\112\172\257\013" >X "\062\232\054\010\357\067\012\101\076\203\321\233\044\056\370\027" >X "\144\261\376\302\175\366\352\030\300\005\266\201\375\247\240\267" >X "\165\133\170\052\003\104\011\334\325\323\324\056\007\200\047\372" >X "\303\372\215\106\157\024\236\177\060\131\172\065\000\026\160\237" >X "\227\257\052\264\127\002\340\357\035\355\162\273\165\051\000\234" >X "\121\052\025\052\170\172\150\173\045\000\276\352\001\160\165\253" >X "\216\113\131\020\247\363\146\263\011\037\357\237\053\270\274\245" >X "\027\255\253\341\244\220\247\071\025\162\151\357\005\200\037\203" >X "\255\240\244\042\253\127\056\151\342\321\357\352\305\051\035\006" >X "\200\123\172\136\202\303\253\077\330\112\331\327\053\104\143\257" >X "\344\272\070\300\313\165\172\043\000\062\211\365\271\332\312\155" >X "\270\217\326\334\370\134\174\236\102\326\261\345\133\035\002\200" >X "\113\312\076\052\137\014\015\233\212\376\232\004\324\031\052\160" >X "\366\362\001\024\226\237\020\025\114\156\303\266\336\250\005\162" >X "\251\022\323\022\026\302\103\256\351\165\000\134\251\071\203\214" >X "\202\115\142\155\134\163\136\143\066\011\313\210\015\232\100\371" >X "\315\030\361\254\074\361\237\177\171\037\201\142\154\167\237\221" >X "\274\043\312\037\031\061\007\263\107\274\206\176\136\061\327\370" >X "\276\305\200\264\263\353\260\051\175\031\131\205\136\164\001\213" >X "\116\064\251\007\146\016\175\111\364\200\366\066\311\273\374\003" >X "\322\317\155\154\166\103\074\141\343\357\035\201\137\215\371\210" >X "\162\233\324\126\347\236\053\333\217\215\151\117\242\270\374\124" >X "\273\312\027\355\262\031\356\046\216\013\236\210\371\051\233\132" >X "\051\337\152\256\012\214\215\136\204\007\307\255\205\265\247\312" >X "\322\154\260\365\206\352\136\311\202\364\106\135\013\227\153\206" >X "\267\252\037\026\115\376\356\072\345\263\104\372\247\340\211\111" >X "\074\311\024\326\256\376\126\247\001\020\356\104\256\300\235\303" >X "\127\221\227\267\215\060\327\161\022\006\244\322\315\233\161\063" >X "\011\027\024\047\305\056\041\227\073\304\346\071\076\352\060\244" >X "\016\371\003\014\355\310\336\234\006\200\121\015\326\304\220\337" >X "\163\234\325\016\017\277\117\004\347\233\105\070\350\052\025\062" >X "\014\036\060\333\341\271\011\301\263\240\121\171\071\135\103\162" >X "\176\253\002\372\076\137\317\160\273\243\277\111\074\024\132\270" >X "\152\033\203\162\335\171\024\224\035\102\145\135\061\052\152\316" >X "\323\165\044\302\072\125\012\037\150\075\043\021\356\237\210\100" >X "\357\201\344\207\275\072\061\241\264\100\051\123\302\123\351\357" >X "\360\134\225\122\053\356\245\336\240\163\252\374\345\222\074\300" >X "\322\311\175\066\072\375\025\244\345\157\300\361\302\057\120\124" >X "\176\014\065\015\127\321\162\171\163\313\202\061\227\276\375\074" >X "\303\020\027\222\212\244\250\207\310\137\117\356\044\053\260\146" >X "\366\316\144\377\355\111\070\345\075\331\364\171\056\170\167\316" >X "\337\260\353\364\233\270\134\135\044\070\271\234\370\266\207\134" >X "\156\027\374\053\065\147\121\232\275\032\007\162\127\143\110\350" >X "\035\270\153\344\213\242\260\326\023\245\307\002\120\126\223\217" >X "\117\016\374\032\331\045\173\241\240\273\124\053\235\273\125\116" >X "\206\344\174\110\255\276\073\243\140\013\162\057\356\306\234\121" >X "\057\143\142\354\122\067\000\316\010\167\106\277\377\303\235\270" >X "\162\265\330\151\305\267\135\010\221\212\256\153\275\261\006\353" >X "\017\054\303\345\253\371\230\233\370\206\033\000\173\122\124\221" >X "\116\312\277\013\225\272\122\122\136\347\334\236\114\052\047\040" >X "\055\330\176\362\115\341\315\347\046\276\331\163\352\115\075\111" >X "\371\125\165\105\370\140\327\034\241\174\245\274\163\307\006\127" >X "\067\325\112\031\201\360\026\266\235\174\316\015\100\133\301\163" >X "\375\201\107\204\333\161\106\371\314\064\114\146\043\214\046\243" >X "\170\165\206\171\061\010\354\222\266\236\130\211\274\313\273\335" >X "\000\264\224\075\077\277\215\223\205\077\222\202\144\016\151\136" >X "\203\301\050\346\031\064\252\000\004\373\015\202\326\053\124\254" >X "\021\253\067\130\001\261\373\300\024\240\371\234\215\207\027\023" >X "\160\015\356\030\300\302\213\363\176\310\172\015\126\227\157\073" >X "\173\321\213\152\243\002\243\243\357\106\312\240\047\061\100\073" >X "\014\052\271\006\006\122\344\325\272\013\310\240\074\341\160\336" >X "\337\121\134\361\063\045\203\062\233\313\117\271\130\166\376\112" >X "\026\016\234\371\260\333\231\121\217\260\200\303\371\037\343\122" >X "\165\061\121\107\271\035\220\214\010\323\016\301\262\333\176\300" >X "\202\211\237\043\066\070\125\364\370\313\145\152\250\025\176\350" >X "\357\023\217\031\103\376\210\025\063\017\143\332\340\305\242\160" >X "\150\073\161\222\210\234\142\117\316\333\035\356\073\275\151\000" >X "\140\256\176\070\377\357\166\347\136\365\244\374\350\300\104\054" >X "\237\261\233\136\047\330\057\005\050\174\161\337\350\167\351\370" >X "\053\131\214\031\266\246\202\170\061\306\205\312\063\310\273\264" >X "\247\157\003\160\251\072\107\264\015\052\154\154\223\323\064\261" >X "\077\157\334\207\327\325\142\312\165\171\310\056\335\211\163\127" >X "\176\102\255\276\365\306\204\123\023\126\140\374\300\171\250\267" >X "\321\330\303\356\211\013\266\307\013\077\357\333\000\260\362\352" >X "\364\015\066\247\363\032\110\113\343\143\036\101\250\166\124\033" >X "\226\121\213\257\217\075\213\225\337\046\323\061\002\307\316\177" >X "\326\352\375\131\303\376\102\156\112\143\263\062\311\230\237\057" >X "\073\102\357\033\373\056\000\105\025\307\354\062\036\265\322\003" >X "\223\342\226\265\371\176\260\357\120\374\166\332\026\004\372\204" >X "\020\175\055\302\107\173\346\341\124\361\127\315\357\373\173\307" >X "\040\056\170\262\130\002\333\066\043\242\334\103\127\114\254\352" >X "\152\337\005\100\127\177\305\346\173\074\007\321\337\147\240\010" >X "\260\315\065\042\135\076\131\305\065\205\151\124\301\360\367\012" >X "\027\243\231\113\346\337\147\256\022\161\245\111\102\373\215\204" >X "\255\255\121\231\222\352\364\345\274\071\155\337\005\200\347\222" >X "\155\011\117\352\170\171\370\213\355\005\232\344\373\314\127\360" >X "\325\321\147\232\377\174\274\160\023\271\221\014\142\120\122\321" >X "\020\120\121\133\010\203\261\256\371\375\000\357\030\307\051\135" >X "\067\356\040\337\243\313\321\074\251\123\113\043\224\251\142\323" >X "\126\005\027\253\263\161\252\150\017\112\052\117\120\120\326\042" >X "\253\144\273\120\040\217\146\336\202\246\151\373\340\226\161\302" >X "\031\056\326\147\001\260\267\372\205\175\164\015\271\050\203\251" >X "\116\000\120\111\243\273\250\074\203\250\246\004\147\056\376\044" >X "\054\204\067\031\224\066\006\160\336\224\043\310\067\201\030\225" >X "\147\013\226\225\355\260\100\321\235\216\240\333\135\220\132\151" >X "\273\135\205\333\101\252\152\057\341\102\165\146\163\271\242\272" >X "\256\132\364\342\050\144\162\321\014\005\061\045\151\026\145\010" >X "\255\167\040\146\217\134\325\052\233\276\120\225\145\063\307\140" >X "\166\304\056\316\127\035\322\167\001\010\357\227\150\167\164\062" >X "\203\111\073\373\251\160\105\077\235\371\310\252\164\356\266\063" >X "\031\151\364\253\105\115\210\135\120\024\045\152\277\235\366\055" >X "\006\370\015\157\061\372\117\123\242\165\220\142\203\324\146\214" >X "\341\155\157\170\016\267\127\270\040\147\133\357\332\263\005\130" >X "\024\145\266\152\245\222\024\151\154\363\373\075\050\262\246\023" >X "\000\305\104\127\153\352\053\310\145\111\051\157\060\341\366\241" >X "\313\061\041\366\167\270\112\014\106\051\363\246\074\141\270\130" >X "\216\164\055\177\250\301\247\007\027\322\271\065\066\253\253\314" >X "\116\303\210\045\265\374\234\375\347\227\070\371\354\022\027\000" >X "\040\201\230\131\162\266\274\340\254\004\021\305\014\325\016\105" >X "\376\345\164\264\265\151\054\077\164\255\276\022\271\027\016\210" >X "\362\201\004\112\334\071\142\071\035\053\305\373\201\232\153\253" >X "\355\231\116\346\224\156\247\021\355\207\355\047\137\242\357\114" >X "\263\063\177\154\021\323\226\111\221\017\073\367\114\142\113\172" >X "\307\165\043\116\352\314\134\145\225\164\062\000\162\162\244\245" >X "\125\231\142\304\151\124\041\016\262\333\175\160\236\331\111\060" >X "\046\172\076\162\057\246\303\126\307\013\373\174\356\016\344\152" >X "\150\122\344\035\315\312\277\056\153\326\127\143\335\336\005\315" >X "\001\334\336\344\275\241\161\367\104\107\265\245\246\174\241\316" >X "\240\047\002\220\206\100\357\070\273\347\026\127\036\105\125\135" >X "\271\315\322\112\207\143\000\337\104\125\155\045\166\347\274\146" >X "\367\274\212\332\263\110\073\267\201\314\336\171\063\114\212\172" >X "\030\375\065\301\064\302\354\227\004\224\024\170\117\024\176\205" >X "\127\267\216\306\216\314\225\224\365\176\103\071\300\101\002\157" >X "\027\016\346\255\301\327\031\377\055\036\234\313\315\034\244\355" >X "\331\050\327\201\046\307\057\167\270\023\127\323\040\141\100\367" >X "\376\374\046\177\322\356\231\273\163\136\155\034\174\222\116\166" >X "\101\260\356\160\370\143\316\133\142\337\266\061\121\217\137\367" >X "\176\145\155\001\076\336\177\057\152\032\052\111\131\062\207\253" >X "\322\233\231\220\102\213\073\106\274\210\217\367\056\044\113\163" >X "\264\054\324\114\026\226\206\063\227\322\254\155\052\122\153\060" >X "\345\232\033\053\311\231\331\064\156\060\036\024\064\012\143\243" >X "\027\070\375\354\334\365\234\107\056\355\263\103\277\301\075\111" >X "\357\323\363\171\135\347\172\266\234\370\057\234\054\332\041\342" >X "\226\213\202\260\104\370\302\177\034\132\204\323\245\133\061\062" >X "\142\036\371\340\070\376\305\015\122\310\217\304\122\376\027\345" >X "\142\076\267\375\213\032\306\106\077\106\011\326\327\070\234\377" >X "\065\045\130\162\273\243\321\112\101\033\263\130\176\010\211\325" >X "\105\072\225\171\223\225\051\345\012\334\073\372\035\321\271\335" >X "\276\001\050\303\301\374\117\120\122\225\201\344\230\047\304\342" >X "\103\166\217\105\345\351\070\174\356\143\221\233\170\264\163\105" >X "\115\273\023\061\166\105\122\231\005\107\317\157\306\261\202\315" >X "\042\160\162\315\206\027\153\260\122\156\144\145\371\274\161\153" >X "\121\241\373\005\271\224\064\007\040\164\204\157\101\120\126\366" >X "\272\277\032\373\236\130\215\337\021\141\020\212\312\117\342\263" >X "\053\113\304\014\036\137\137\157\152\212\071\355\177\366\016\346" >X "\001\022\161\061\166\063\074\006\245\122\251\230\313\275\321\345" >X "\074\134\357\177\162\332\026\014\015\233\116\101\317\330\251\045" >X "\002\316\033\214\344\253\036\112\376\020\343\142\026\336\320\167" >X "\261\073\022\123\236\114\233\045\126\135\164\164\003\330\033\116" >X "\304\270\371\251\063\267\376\345\151\306\305\323\267\212\311\024" >X "\336\140\243\063\152\365\234\045\153\324\101\170\154\362\006\341" >X "\352\072\255\126\045\376\271\061\025\366\310\142\234\124\242\300" >X "\374\224\117\105\162\365\335\361\347\051\231\252\023\276\265\275" >X "\153\260\170\324\263\173\110\030\060\001\017\216\137\115\114\053" >X "\276\307\075\153\027\000\040\161\052\203\154\113\122\007\077\213" >X "\370\220\333\260\215\222\252\023\205\137\102\257\067\212\222\263" >X "\065\041\223\330\114\204\304\342\101\242\231\301\176\221\230\022" >X "\277\014\223\342\226\266\052\151\267\147\204\367\172\000\314\026" >X "\303\015\165\036\204\151\107\141\341\244\115\142\021\340\221\263" >X "\353\221\167\151\257\315\012\247\265\270\026\040\352\113\103\303" >X "\347\040\061\162\236\350\230\350\370\275\233\172\067\000\042\203" >X "\324\327\342\312\325\134\150\075\243\156\350\273\242\002\223\305" >X "\301\262\051\175\051\166\146\276\003\125\013\316\317\033\165\153" >X "\324\201\130\061\363\010\135\053\242\123\356\277\244\362\270\313" >X "\126\372\020\171\221\264\002\300\142\061\113\135\341\176\370\001" >X "\016\235\135\323\270\051\253\363\302\126\043\326\343\032\353\240" >X "\323\127\064\273\003\006\325\113\331\357\372\325\310\224\176\172" >X "\253\374\305\337\227\353\316\065\316\162\131\104\143\256\106\025" >X "\004\153\057\220\262\135\226\173\274\350\137\160\325\102\171\271" >X "\324\243\241\025\000\374\113\240\256\230\231\123\322\023\034\073" >X "\277\011\267\206\156\300\210\360\207\234\140\054\125\330\224\266" >X "\214\134\315\001\221\351\362\214\226\256\241\242\225\077\146\140" >X "\376\263\316\043\247\344\354\162\365\031\274\364\115\102\063\173" >X "\265\010\000\024\360\041\006\304\200\250\225\074\137\360\042\015" >X "\206\151\016\357\143\313\211\147\121\120\226\331\041\156\357\030" >X "\134\040\300\053\046\257\025\000\041\332\021\031\247\057\354\113" >X "\166\101\010\246\377\230\261\341\340\002\261\276\053\071\146\261" >X "\250\126\332\222\223\105\137\342\207\254\377\023\073\035\066\115" >X "\057\376\147\020\027\364\257\015\106\304\077\107\142\152\061\037" >X "\154\055\272\325\243\266\241\272\021\334\063\144\101\177\300\123" >X "\267\037\262\171\175\056\247\154\317\174\236\262\372\265\142\360" >X "\270\306\375\020\000\232\201\077\213\147\151\232\220\076\131\274" >X "\371\236\065\173\346\176\356\341\242\075\322\232\266\066\350\257" >X "\011\247\024\076\261\325\264\141\113\051\052\077\212\322\312\237" >X "\133\255\116\357\104\277\113\161\303\033\011\241\063\233\127\363" >X "\267\224\332\206\062\024\224\037\101\125\155\071\045\132\122\270" >X "\142\223\051\266\136\011\024\306\247\156\073\234\024\342\067\374" >X "\170\063\000\172\223\316\353\257\133\007\347\224\351\012\102\135" >X "\271\255\073\007\113\261\167\204\305\126\226\151\245\231\256\160" >X "\207\154\110\314\224\364\206\266\227\321\061\346\055\267\132\160" >X "\205\130\013\201\311\207\227\114\333\077\266\125\046\254\224\171" >X "\351\046\304\056\173\313\340\142\346\305\345\012\266\062\056\135" >X "\264\165\360\373\256\352\022\261\130\254\231\273\207\215\153\163" >X "\035\313\225\312\157\012\116\123\342\126\274\322\146\051\142\342" >X "\240\345\157\044\204\114\332\137\157\350\276\355\334\157\146\251" >X "\325\233\061\046\352\201\215\267\206\336\375\105\233\000\120\266" >X "\150\174\140\314\272\107\373\171\205\134\354\316\137\231\273\031" >X "\205\347\261\343\202\223\017\316\115\174\377\011\273\305\070\177" >X "\257\350\374\105\223\267\314\362\367\276\245\240\047\374\302\104" >X "\157\027\356\157\325\065\220\362\103\046\355\133\060\141\363\034" >X "\265\102\133\321\052\056\331\152\313\253\252\053\012\373\042\175" >X "\311\273\307\213\276\232\155\021\015\120\356\337\223\157\237\342" >X "\115\242\020\310\135\064\343\007\056\132\175\327\360\125\317\250" >X "\024\276\125\327\021\003\107\175\221\331\027\266\315\374\061\373" >X "\325\025\147\056\375\070\225\042\270\140\344\122\367\017\256\266" >X "\225\360\210\030\333\124\272\360\124\252\033\006\005\245\356\230" >X "\022\367\324\353\061\375\247\356\262\371\061\147\033\123\213\053" >X "\063\106\236\273\262\077\245\270\342\350\250\053\065\271\261\327" >X "\256\352\226\246\034\103\056\125\352\003\065\361\331\141\332\304" >X "\264\250\200\344\375\201\232\270\034\207\270\165\147\147\260\133" >X "\172\330\102\155\067\000\156\161\003\320\327\344\377\005\030\000" >X "\311\126\266\170\011\372\231\112\000\000\000\000\111\105\116\104" >X "\256\102\140\202\000\000\050\165\165\141\171\051\144\162\157\151" >X "\144\143\141\155\057\000\000\000\003\000\000\000" }; >X#endif /* !_MSC_VER */ >X >Xstatic GStaticResource static_resource = { _resource_data.data, sizeof (_resource_data.data) - 1 /* nul terminator */, NULL, NULL, NULL }; >Xextern GResource *_get_resource (void); >XGResource *_get_resource (void) >X{ >X return g_static_resource_get_resource (&static_resource); >X} >X/* >X If G_HAS_CONSTRUCTORS is true then the compiler support *both* constructors and >X destructors, in a sane way, including e.g. on library unload. If not you're on >X your own. >X >X Some compilers need #pragma to handle this, which does not work with macros, >X so the way you need to use this is (for constructors): >X >X #ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA >X #pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(my_constructor) >X #endif >X G_DEFINE_CONSTRUCTOR(my_constructor) >X static void my_constructor(void) { >X ... >X } >X >X*/ >X >X#ifndef __GTK_DOC_IGNORE__ >X >X#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) >X >X#define G_HAS_CONSTRUCTORS 1 >X >X#define G_DEFINE_CONSTRUCTOR(_func) static void __attribute__((constructor)) _func (void); >X#define G_DEFINE_DESTRUCTOR(_func) static void __attribute__((destructor)) _func (void); >X >X#elif defined (_MSC_VER) && (_MSC_VER >= 1500) >X/* Visual studio 2008 and later has _Pragma */ >X >X#include <stdlib.h> >X >X#define G_HAS_CONSTRUCTORS 1 >X >X/* We do some weird things to avoid the constructors being optimized >X * away on VS2015 if WholeProgramOptimization is enabled. First we >X * make a reference to the array from the wrapper to make sure its >X * references. Then we use a pragma to make sure the wrapper function >X * symbol is always included at the link stage. Also, the symbols >X * need to be extern (but not dllexport), even though they are not >X * really used from another object file. >X */ >X >X/* We need to account for differences between the mangling of symbols >X * for Win32 (x86) and x64 programs, as symbols on Win32 are prefixed >X * with an underscore but symbols on x64 are not. >X */ >X#ifdef _WIN64 >X#define G_MSVC_SYMBOL_PREFIX "" >X#else >X#define G_MSVC_SYMBOL_PREFIX "_" >X#endif >X >X#define G_DEFINE_CONSTRUCTOR(_func) G_MSVC_CTOR (_func, G_MSVC_SYMBOL_PREFIX) >X#define G_DEFINE_DESTRUCTOR(_func) G_MSVC_DTOR (_func, G_MSVC_SYMBOL_PREFIX) >X >X#define G_MSVC_CTOR(_func,_sym_prefix) \ >X static void _func(void); \ >X extern int (* _array ## _func)(void); \ >X int _func ## _wrapper(void) { _func(); g_slist_find (NULL, _array ## _func); return 0; } \ >X __pragma(comment(linker,"/include:" _sym_prefix # _func "_wrapper")) \ >X __pragma(section(".CRT$XCU",read)) \ >X __declspec(allocate(".CRT$XCU")) int (* _array ## _func)(void) = _func ## _wrapper; >X >X#define G_MSVC_DTOR(_func,_sym_prefix) \ >X static void _func(void); \ >X extern int (* _array ## _func)(void); \ >X int _func ## _constructor(void) { atexit (_func); g_slist_find (NULL, _array ## _func); return 0; } \ >X __pragma(comment(linker,"/include:" _sym_prefix # _func "_constructor")) \ >X __pragma(section(".CRT$XCU",read)) \ >X __declspec(allocate(".CRT$XCU")) int (* _array ## _func)(void) = _func ## _constructor; >X >X#elif defined (_MSC_VER) >X >X#define G_HAS_CONSTRUCTORS 1 >X >X/* Pre Visual studio 2008 must use #pragma section */ >X#define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 >X#define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 >X >X#define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ >X section(".CRT$XCU",read) >X#define G_DEFINE_CONSTRUCTOR(_func) \ >X static void _func(void); \ >X static int _func ## _wrapper(void) { _func(); return 0; } \ >X __declspec(allocate(".CRT$XCU")) static int (*p)(void) = _func ## _wrapper; >X >X#define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ >X section(".CRT$XCU",read) >X#define G_DEFINE_DESTRUCTOR(_func) \ >X static void _func(void); \ >X static int _func ## _constructor(void) { atexit (_func); return 0; } \ >X __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor; >X >X#elif defined(__SUNPRO_C) >X >X/* This is not tested, but i believe it should work, based on: >X * http://opensource.apple.com/source/OpenSSL098/OpenSSL098-35/src/fips/fips_premain.c >X */ >X >X#define G_HAS_CONSTRUCTORS 1 >X >X#define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 >X#define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 >X >X#define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ >X init(_func) >X#define G_DEFINE_CONSTRUCTOR(_func) \ >X static void _func(void); >X >X#define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ >X fini(_func) >X#define G_DEFINE_DESTRUCTOR(_func) \ >X static void _func(void); >X >X#else >X >X/* constructors not supported for this compiler */ >X >X#endif >X >X#endif /* __GTK_DOC_IGNORE__ */ >X >X#ifdef G_HAS_CONSTRUCTORS >X >X#ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA >X#pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(resource_constructor) >X#endif >XG_DEFINE_CONSTRUCTOR(resource_constructor) >X#ifdef G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA >X#pragma G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(resource_destructor) >X#endif >XG_DEFINE_DESTRUCTOR(resource_destructor) >X >X#else >X#warning "Constructor not supported on this compiler, linking in resources will not work" >X#endif >X >Xstatic void resource_constructor (void) >X{ >X g_static_resource_init (&static_resource); >X} >X >Xstatic void resource_destructor (void) >X{ >X g_static_resource_fini (&static_resource); >X} >6e472f139735d05a43a4527bd9c56ed8 >echo x - droidcam/work/droidcam-2.1.3/src/queue.h >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/queue.h << '5727100f718b31562128388c1df5923d' >X// SPDX-FileCopyrightText: 2021 Keno Hassler >X// >X// SPDX-License-Identifier: GPL-2.0-or-later >X >X#ifndef __QUEUE_H__ >X#define __QUEUE_H__ >X >X#include <pthread.h> >X >Xtypedef struct queue_elem_s >X{ >X void *payload; >X struct queue_elem_s *next; >X} queue_elem; >X >Xtypedef struct queue_s >X{ >X pthread_mutex_t mutex; >X size_t size; >X queue_elem *last; >X queue_elem *first; >X} queue; >X >Xvoid queue_init(queue *q); >Xvoid queue_destroy(queue *q); >X >Xvoid queue_clear(queue *q); >Xvoid queue_add(queue *q, void *item); >Xvoid *queue_next(queue *q, size_t backbuffer); >X >X#endif >5727100f718b31562128388c1df5923d >echo x - droidcam/work/droidcam-2.1.3/src/decoder_v4l2.c >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/decoder_v4l2.c << '9754b9d1bd8e9650aa39eb9420922c5a' >X/* DroidCam & DroidCamX (C) 2010-2021 >X * https://github.com/dev47apps >X * >X * This program is distributed in the hope that it will be useful, >X * but WITHOUT ANY WARRANTY; without even the implied warranty of >X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. >X */ >X >X#include <linux/videodev2.h> >X#include <sys/ioctl.h> >X#include <sys/stat.h> >X >X#include "common.h" >X#include "decoder.h" >X >Xchar v4l2_device[32]; >X >Xstatic int xioctl(int fd, int request, void *arg){ >X int r; >X do r = ioctl (fd, request, arg); >X while (-1 == r && EINTR == errno); >X return r; >X} >X >Xstatic unsigned int _get_control_id(int fd, const char *control){ >X const size_t length = strnlen(control, 1024); >X const unsigned next = V4L2_CTRL_FLAG_NEXT_CTRL; >X struct v4l2_queryctrl qctrl; >X int id; >X >X memset(&qctrl, 0, sizeof(qctrl)); >X while (ioctl(fd, VIDIOC_QUERYCTRL, &qctrl) == 0) { >X if (!strncmp((const char*)qctrl.name, control, length)) >X return qctrl.id; >X qctrl.id |= next; >X } >X for (id = V4L2_CID_USER_BASE; id < V4L2_CID_LASTP1; id++) { >X qctrl.id = id; >X if (ioctl(fd, VIDIOC_QUERYCTRL, &qctrl) == 0) { >X if (!strncmp((const char*)qctrl.name, control, length)) >X return qctrl.id; >X } >X } >X for (qctrl.id = V4L2_CID_PRIVATE_BASE; >X ioctl(fd, VIDIOC_QUERYCTRL, &qctrl) == 0; qctrl.id++) { >X if (!strncmp((const char*)qctrl.name, control, length)) { >X unsigned int id = qctrl.id; >X return id; >X } >X } >X return 0; >X} >X >Xstatic int set_control_i(int fd, const char *control, int value){ >X struct v4l2_control ctrl; >X memset(&ctrl, 0, sizeof(ctrl)); >X ctrl.id = _get_control_id(fd, control); >X ctrl.value = value; >X if (ctrl.id && ioctl(fd, VIDIOC_S_CTRL, &ctrl) == 0) { >X int value = ctrl.value; >X return value; >X } >X return 0; >X} >X#if 0 >Xstatic int get_control_i(int fd, const char *control){ >X struct v4l2_control ctrl; >X memset(&ctrl, 0, sizeof(ctrl)); >X ctrl.id = _get_control_id(fd, control); >X >X if (ctrl.id && ioctl(fd, VIDIOC_G_CTRL, &ctrl) == 0) { >X int value = ctrl.value; >X return value; >X } >X return 0; >X} >X#endif >X >Xint open_v4l2_device(void) { >X int fd; >X struct stat st; >X >X if (stat(v4l2_device, &st) < 0) >X return 0; >X >X if (!S_ISCHR(st.st_mode)) >X return 0; >X >X fd = open(v4l2_device, O_RDWR | O_NONBLOCK, 0); >X if (fd <= 0) { >X errprint("Error opening '%s': %d '%s'\n", v4l2_device, errno, strerror(errno)); >X return 0; >X } >X >X dbgprint("Opened %s, fd:%d\n", v4l2_device, fd); >X return fd; >X} >X >Xint find_v4l2_device(const char* bus_info) { >X int bus_info_len = strlen(bus_info); >X int video_dev_fd; >X int video_dev_nr = 0; >X struct v4l2_capability v4l2cap; >X >X dbgprint("Looking for v4l2 card: %s\n", bus_info); >X for (video_dev_nr = 0; video_dev_nr < 99; video_dev_nr++) { >X snprintf(v4l2_device, sizeof(v4l2_device), "/dev/video%d", video_dev_nr); >X >X video_dev_fd = open_v4l2_device(); >X if (video_dev_fd <= 0) >X continue; >X >X if (xioctl(video_dev_fd, VIDIOC_QUERYCAP, &v4l2cap) < 0) { >X close(video_dev_fd); >X continue; >X } >X >X dbgprint("Device %s is '%s' @ %s\n", v4l2_device, v4l2cap.card, v4l2cap.bus_info); >X if (0 == strncmp(bus_info, (const char*) v4l2cap.bus_info, bus_info_len)) { >X return video_dev_fd; >X } >X >X close(video_dev_fd); >X continue; >X } >X >X v4l2_device[0] = 0; >X return -1; >X} >X >Xvoid set_v4l2_device(const char* device) { >X strncpy(v4l2_device, device, sizeof(v4l2_device) - 1); >X v4l2_device[sizeof(v4l2_device) - 1] = '\0'; >X} >X >Xvoid query_v4l_device(int fd, unsigned *WEBCAM_W, unsigned *WEBCAM_H) { >X struct v4l2_capability v4l2cap = {0}; >X struct v4l2_format vid_format = {0}; >X vid_format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; >X >X int in_width = *WEBCAM_W; >X int in_height = *WEBCAM_H; >X *WEBCAM_W = 0; >X *WEBCAM_H = 0; >X >X if (xioctl(fd, VIDIOC_QUERYCAP, &v4l2cap) < 0) { >X errprint("Error: Unable to query video device. dev=%s errno=%d\n", >X v4l2_device, errno); >X return; >X } >X >X dbgprint("using '%s' (%s)\n", v4l2cap.card, v4l2cap.bus_info); >X >X const char* bus_info_dc = V4L2_PLATFORM_DC; >X if (0 != strncmp(bus_info_dc, (const char*) v4l2cap.bus_info, strlen(bus_info_dc))) { >X vid_format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; >X xioctl(fd, VIDIOC_G_FMT, &vid_format); >X >X dbgprint("set fmt YU12:%dx%d\n", in_width, in_height); >X vid_format.fmt.pix.width = in_width; >X vid_format.fmt.pix.height = in_height; >X vid_format.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420; >X vid_format.fmt.pix.field = V4L2_FIELD_NONE; >X if (xioctl(fd, VIDIOC_S_FMT, &vid_format) >= 0) { >X set_control_i(fd, "keep_format", 1); >X goto early_out; >X } >X >X dbgprint("set fmt failed, trying to query fmt\n"); >X } >X >X int ret = xioctl(fd, VIDIOC_G_FMT, &vid_format); >X if (ret < 0) { >X errprint("Error: Unable to determine video device fmt. dev=%s errno=%d\n", >X v4l2_device, errno); >X return; >X } >X >X dbgprint(" vid_format->type =%d\n", vid_format.type ); >X dbgprint(" vid_format->fmt.pix.width =%d\n", vid_format.fmt.pix.width ); >X dbgprint(" vid_format->fmt.pix.height =%d\n", vid_format.fmt.pix.height ); >X dbgprint(" vid_format->fmt.pix.pixelformat =%d\n", vid_format.fmt.pix.pixelformat); >X dbgprint(" vid_format->fmt.pix.sizeimage =%d\n", vid_format.fmt.pix.sizeimage ); >X dbgprint(" vid_format->fmt.pix.field =%d\n", vid_format.fmt.pix.field ); >X dbgprint(" vid_format->fmt.pix.bytesperline=%d\n", vid_format.fmt.pix.bytesperline ); >X dbgprint(" vid_format->fmt.pix.colorspace =%d\n", vid_format.fmt.pix.colorspace ); >X >X if (vid_format.fmt.pix.pixelformat != V4L2_PIX_FMT_YUV420) { >X unsigned pixelfmt = vid_format.fmt.pix.pixelformat; >X BYTE fourcc[5] = { (BYTE)(pixelfmt >> 0), (BYTE)(pixelfmt >> 8), >X (BYTE)(pixelfmt >> 16), (BYTE)(pixelfmt >> 24), '\0' }; >X >X errprint("Fatal: video device reported pixel format %x (%s), expected %x (YU12/I420)\n" >X "Try `v4l2loopback-ctl set-caps %s \"YU12:%dx%d\"`, or specify a different video device\n", >X vid_format.fmt.pix.pixelformat, fourcc, V4L2_PIX_FMT_YUV420, >X v4l2_device, in_width, in_height); >X return; >X } >X if (vid_format.fmt.pix.width <= 0 || vid_format.fmt.pix.height <= 0) { >X errprint("Fatal: droidcam video device reported invalid resolution: %dx%d\n", >X vid_format.fmt.pix.width, vid_format.fmt.pix.height); >X return; >X } >X >Xearly_out: >X *WEBCAM_W = vid_format.fmt.pix.width; >X *WEBCAM_H = vid_format.fmt.pix.height; >X} >9754b9d1bd8e9650aa39eb9420922c5a >echo x - droidcam/work/droidcam-2.1.3/src/settings.c >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/settings.c << 'cf6450f63cb72e22194ef841031591d6' >X/* DroidCam & DroidCamX (C) 2010-2021 >X * https://github.com/dev47apps >X * >X * This program is distributed in the hope that it will be useful, >X * but WITHOUT ANY WARRANTY; without even the implied warranty of >X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. >X */ >X >X#include <stdio.h> >X#include <stdlib.h> >X#include <string.h> >X >X#if __linux__ >X#include <linux/limits.h> >X#endif >X >X#if __FreeBSD__ >X#include <sys/limits.h> >X#include <sys/param.h> >X#endif >X >X#include "common.h" >X#include "settings.h" >X >Xstatic inline FILE *GetFile(const char* mode) { >X char buf[PATH_MAX]; >X snprintf(buf, sizeof(buf), "%s/.config/droidcam", getenv("HOME")); >X return fopen(buf, mode); >X} >X >Xvoid LoadSettings(struct settings* settings) { >X char buf[512]; >X int version = 0; >X FILE * fp = GetFile("r"); >X >X // set defaults >X memset(settings, 0, sizeof(struct settings)); >X settings->video = 1; >X settings->port = 4747; >X settings->v4l2_width = 640; >X settings->v4l2_height = 480; >X settings->connection = CB_RADIO_WIFI; >X settings->confirm_close = 1; >X >X if (!fp) { >X return; >X } >X >X if(fgets(buf, sizeof(buf), fp)){ >X sscanf(buf, "v%d", &version); >X } >X >X if (version == 1) { >X if (fgets(buf, sizeof(buf), fp)){ >X strncpy(settings->ip, buf, sizeof(settings->ip) - 1); >X settings->ip[sizeof(settings->ip) - 1] = '\0'; >X } >X >X if (fgets(buf, sizeof(buf), fp)) { >X settings->port = strtoul(buf, NULL, 10); >X } >X } >X else if (version == 2 || version == 3) { >X if (fgets(buf, sizeof(buf), fp)){ >X strncpy(settings->ip, buf, sizeof(settings->ip) - 1); >X settings->ip[sizeof(settings->ip) - 1] = '\0'; >X } >X if (fgets(buf, sizeof(buf), fp)) { >X sscanf(buf, "%d", &settings->port); >X } >X if (fgets(buf, sizeof(buf), fp)) { >X sscanf(buf, "%d", &settings->audio); >X } >X if (version == 3) { >X if (fgets(buf, sizeof(buf), fp)) { >X sscanf(buf, "%d", &settings->video); >X } >X } >X if (fgets(buf, sizeof(buf), fp)) { >X sscanf(buf, "%d", &settings->connection); >X } >X } >X else if (version == 4) { >X int arg1, arg2; >X while (fgets(buf, sizeof(buf), fp)) { >X if (1 == sscanf(buf, "ip=%16s\n", settings->ip)) continue; >X if (1 == sscanf(buf, "port=%d\n", &settings->port)) continue; >X >X if (1 == sscanf(buf, "audio=%d\n", &settings->audio)) continue; >X if (1 == sscanf(buf, "video=%d\n", &settings->video)) continue; >X >X if (2 == sscanf(buf, "size=%dx%d\n", &arg1, &arg2) && arg1 > 0 && arg2 > 0) { >X settings->v4l2_width = arg1; >X settings->v4l2_height = arg2; >X continue; >X } >X >X if (1 == sscanf(buf, "type=%d\n",&settings->connection)) continue; >X if (1 == sscanf(buf, "adb_auto_start=%d\n",&settings->adb_auto_start)) continue; >X if (1 == sscanf(buf, "confirm_close=%d\n",&settings->confirm_close)) continue; >X if (1 == sscanf(buf, "vertical_flip=%d\n",&settings->vertical_flip)) continue; >X if (1 == sscanf(buf, "horizontal_flip=%d\n",&settings->horizontal_flip)) continue; >X } >X } >X >X fclose(fp); >X dbgprint( >X "settings: ip=%s\n" >X "settings: port=%d\n" >X "settings: audio=%d\n" >X "settings: video=%d\n" >X "settings: size=%dx%d\n" >X "settings: adb_auto_start=%d\n" >X "settings: confirm_close=%d\n" >X "settings: vertical_flip=%d\n" >X "settings: horizontal_flip=%d\n" >X "settings: connection=%d\n" >X , >X settings->ip, >X settings->port, >X settings->audio, >X settings->video, >X settings->v4l2_width, settings->v4l2_height, >X settings->adb_auto_start, >X settings->confirm_close, >X settings->vertical_flip, >X settings->horizontal_flip, >X settings->connection); >X} >X >Xvoid SaveSettings(struct settings* settings) { >X int version = 4; >X FILE * fp = GetFile("w"); >X if (!fp) return; >X >X fprintf(fp, >X "v%d\n" >X "ip=%s\n" >X "port=%d\n" >X "audio=%d\n" >X "video=%d\n" >X "size=%dx%d\n" >X // TODO "adb_auto_start=%d\n" >X "confirm_close=%d\n" >X "vertical_flip=%d\n" >X "horizontal_flip=%d\n" >X "type=%d\n" >X , >X version, >X settings->ip, >X settings->port, >X settings->audio, >X settings->video, >X settings->v4l2_width, settings->v4l2_height, >X settings->confirm_close, >X settings->vertical_flip, >X settings->horizontal_flip, >X settings->connection); >X fclose(fp); >X} >cf6450f63cb72e22194ef841031591d6 >echo x - droidcam/work/droidcam-2.1.3/src/fourcc.out >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/fourcc.out << '59f7926a4e91637ba49fa210a33f6b6c' >X V4L2_PIX_FMT_RGB332 = 826427218 >X V4L2_PIX_FMT_RGB444 = 875836498 >X V4L2_PIX_FMT_RGB555 = 1329743698 >X V4L2_PIX_FMT_RGB565 = 1346520914 >X V4L2_PIX_FMT_RGB555X= 1363298130 >X V4L2_PIX_FMT_RGB565X= 1380075346 >X V4L2_PIX_FMT_BGR24 = 861030210 >X V4L2_PIX_FMT_RGB24 = 859981650 >X V4L2_PIX_FMT_BGR32 = 877807426 >X V4L2_PIX_FMT_RGB32 = 876758866 >X V4L2_PIX_FMT_GREY = 1497715271 >X V4L2_PIX_FMT_Y16 = 540422489 >X V4L2_PIX_FMT_PAL8 = 944521552 >X V4L2_PIX_FMT_YVU410 = 961893977 >X V4L2_PIX_FMT_YVU420 = 842094169 >X V4L2_PIX_FMT_YUYV = 1448695129 >X V4L2_PIX_FMT_YYUV = 1448434009 >X V4L2_PIX_FMT_YVYU = 1431918169 >X V4L2_PIX_FMT_UYVY = 1498831189 >X V4L2_PIX_FMT_VYUY = 1498765654 >X V4L2_PIX_FMT_YUV422P= 1345466932 >X V4L2_PIX_FMT_YUV411P= 1345401140 >X V4L2_PIX_FMT_Y41P = 1345401945 >X V4L2_PIX_FMT_YUV444 = 875836505 >X V4L2_PIX_FMT_YUV555 = 1331058009 >X V4L2_PIX_FMT_YUV565 = 1347835225 >X V4L2_PIX_FMT_YUV32 = 878073177 >X V4L2_PIX_FMT_YUV410 = 961959257 >X V4L2_PIX_FMT_YUV420 = 842093913 >X V4L2_PIX_FMT_HI240 = 875710792 >X V4L2_PIX_FMT_HM12 = 842091848 >X V4L2_PIX_FMT_NV12 = 842094158 >X V4L2_PIX_FMT_NV21 = 825382478 >X V4L2_PIX_FMT_NV16 = 909203022 >X V4L2_PIX_FMT_NV61 = 825644622 >X V4L2_PIX_FMT_SBGGR8 = 825770306 >X V4L2_PIX_FMT_SGBRG8 = 1196573255 >X V4L2_PIX_FMT_SGRBG8 = 1195528775 >X V4L2_PIX_FMT_SGRBG10= 808534338 >X V4L2_PIX_FMT_SGRBG10DPCM8= 808535106 >X V4L2_PIX_FMT_SBGGR16 = 844257602 >X V4L2_PIX_FMT_MJPEG = 1196444237 >X V4L2_PIX_FMT_JPEG = 1195724874 >X V4L2_PIX_FMT_DV = 1685288548 >X V4L2_PIX_FMT_MPEG = 1195724877 >XV4L2_PIX_FMT_WNVA = 1096175191 >XV4L2_PIX_FMT_SN9C10X = 808532307 >XV4L2_PIX_FMT_SN9C20X_I420 = 808597843 >XV4L2_PIX_FMT_PWC1 = 826496848 >XV4L2_PIX_FMT_PWC2 = 843274064 >XV4L2_PIX_FMT_ET61X251 = 892483141 >XV4L2_PIX_FMT_SPCA501 = 825242963 >XV4L2_PIX_FMT_SPCA505 = 892351827 >XV4L2_PIX_FMT_SPCA508 = 942683475 >XV4L2_PIX_FMT_SPCA561 = 825636179 >XV4L2_PIX_FMT_PAC207 = 925905488 >XV4L2_PIX_FMT_MR97310A = 808530765 >XV4L2_PIX_FMT_SQ905C = 1127559225 >XV4L2_PIX_FMT_PJPG = 1196444240 >XV4L2_PIX_FMT_OV511 = 825308495 >XV4L2_PIX_FMT_OV518 = 942749007 >59f7926a4e91637ba49fa210a33f6b6c >echo x - droidcam/work/droidcam-2.1.3/src/connection.h >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/connection.h << '50209323531204c0ab7da829b7a89cfb' >X/* DroidCam & DroidCamX (C) 2010-2021 >X * https://github.com/dev47apps >X * >X * This program is distributed in the hope that it will be useful, >X * but WITHOUT ANY WARRANTY; without even the implied warranty of >X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. >X */ >X >X#ifndef __CONN_H__ >X#define __CONN_H__ >X >X#define INVALID_SOCKET -1 >Xtypedef int SOCKET; >Xtypedef long int SOCKET_PTR; >X >XSOCKET Connect(const char* ip, int port, char **errormsg); >Xvoid connection_cleanup(); >Xvoid disconnect(SOCKET s); >X >XSOCKET accept_connection(int port); >XSOCKET CreateUdpSocket(void); >Xint Send(const char * buffer, int bytes, SOCKET s); >Xint Recv(const char * buffer, int bytes, SOCKET s); >Xint RecvAll(const char * buffer, int bytes, SOCKET s); >Xint RecvNonBlock(char * buffer, int bytes, SOCKET s); >Xint RecvNonBlockUDP(char * buffer, int bytes, SOCKET s); >Xint SendUDPMessage(SOCKET s, const char *message, int length, char *ip, int port); >X >X#endif >50209323531204c0ab7da829b7a89cfb >echo x - droidcam/work/droidcam-2.1.3/src/queue.c >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/queue.c << 'eddb059d39aa421c94e5b26596af7415' >X// SPDX-FileCopyrightText: 2021 Keno Hassler >X// >X// SPDX-License-Identifier: GPL-2.0-or-later >X >X#include <stdio.h> >X#include <stdlib.h> >X#include "queue.h" >X >Xvoid queue_init(queue *q) >X{ >X if (pthread_mutex_init(&q->mutex, NULL) != 0) >X { >X perror("queue: mutex init failed"); >X exit(EXIT_FAILURE); >X } >X >X q->size = 0; >X q->last = NULL; >X q->first = NULL; >X} >X >Xvoid queue_destroy(queue *q) >X{ >X // remove all entries first >X queue_clear(q); >X >X if (pthread_mutex_destroy(&q->mutex) != 0) >X { >X perror("queue: mutex destroy failed"); >X exit(EXIT_FAILURE); >X } >X} >X >Xvoid queue_clear(queue *q) >X{ >X if (pthread_mutex_lock(&q->mutex) != 0) >X { >X perror("queue: mutex lock failed"); >X exit(EXIT_FAILURE); >X } >X >X queue_elem *elem = q->first; >X while (elem != NULL) >X { >X queue_elem *tmp = elem; >X elem = elem->next; >X free(tmp); >X } >X >X q->size = 0; >X q->last = NULL; >X q->first = NULL; >X >X if (pthread_mutex_unlock(&q->mutex) != 0) >X { >X perror("queue: mutex unlock failed"); >X exit(EXIT_FAILURE); >X } >X} >X >Xvoid queue_add(queue *q, void *item) >X{ >X queue_elem *elem = (queue_elem *)calloc(1, sizeof(queue_elem)); >X if (elem == NULL) >X { >X perror("queue: malloc failed"); >X exit(EXIT_FAILURE); >X } >X elem->payload = item; >X >X if (pthread_mutex_lock(&q->mutex) != 0) >X { >X perror("queue: mutex lock failed"); >X exit(EXIT_FAILURE); >X } >X >X // is this the first element? >X if (q->first == NULL) >X { >X q->first = elem; >X } >X else >X { >X q->last->next = elem; >X } >X >X q->last = elem; >X q->size++; >X >X if (pthread_mutex_unlock(&q->mutex) != 0) >X { >X perror("queue: mutex unlock failed"); >X exit(EXIT_FAILURE); >X } >X} >X >Xvoid *queue_next(queue *q, size_t backbuffer) >X{ >X void *item = NULL; >X >X if (pthread_mutex_lock(&q->mutex) != 0) >X { >X perror("queue: mutex lock failed"); >X exit(EXIT_FAILURE); >X } >X >X if (q->size > backbuffer) >X { >X // pop the first queue element >X queue_elem *elem = q->first; >X q->first = elem->next; >X >X item = elem->payload; >X free(elem); >X q->size--; >X >X // was this the last element? >X if (q->first == NULL) >X { >X q->last = NULL; >X } >X } >X >X if (pthread_mutex_unlock(&q->mutex) != 0) >X { >X perror("queue: mutex unlock failed"); >X exit(EXIT_FAILURE); >X } >X >X return item; >X} >eddb059d39aa421c94e5b26596af7415 >echo x - droidcam/work/droidcam-2.1.3/src/decoder.h >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/decoder.h << '04c433738a0d3dba932787e09da3cd9c' >X/* DroidCam & DroidCamX (C) 2010-2021 >X * https://github.com/dev47apps >X * >X * This program is distributed in the hope that it will be useful, >X * but WITHOUT ANY WARRANTY; without even the implied warranty of >X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. >X */ >X >X#ifndef __DECODR_H__ >X#define __DECODR_H__ >X >X#include <stdbool.h> >X#include <alsa/asoundlib.h> >Xstruct snd_transfer_s { >X int first; >X snd_pcm_uframes_t offset; >X snd_pcm_uframes_t frames; >X const snd_pcm_channel_area_t *my_areas; >X}; >X >Xtypedef unsigned char BYTE; >X >Xtypedef struct JPGFrame { >X BYTE *data; >X unsigned length; >X} JPGFrame; >X >X >X >Xint decoder_init(const char* v4l2_device, unsigned v4l2_width, unsigned v4l2_height); >Xvoid decoder_fini(); >X >Xsnd_pcm_t * decoder_prepare_audio(void); >Xint decoder_get_audio_frame_size(void); >Xvoid decoder_speex_plc(struct snd_transfer_s* transfer); >Xint decode_speex_frame(char *stream_buf, short *decode_buf, int droidcam_spx_chunks); >Xint decoder_prepare_video(char * header); >Xvoid decoder_cleanup(); >X >XJPGFrame* pull_empty_jpg_frame(void); >XJPGFrame* pull_ready_jpg_frame(void); >Xvoid push_jpg_frame(JPGFrame*, bool empty); >Xvoid process_frame(JPGFrame*); >Xint decoder_get_video_width(); >Xint decoder_get_video_height(); >Xint decoder_horizontal_flip(); >Xint decoder_vertical_flip(); >Xvoid decoder_show_test_image(); >X >X/* 20ms 16hkz 16 bit */ >X#define DROIDCAM_CHUNK_MS_2 20 >X#define DROIDCAM_SPX_CHUNK_BYTES_2 70 >X#define DROIDCAM_PCM_CHUNK_BYTES_2 640 >X#define DROIDCAM_PCM_CHUNK_SAMPLES_2 320 >X#define DROIDCAM_SPEEX_BACKBUF_MAX_COUNT 2 >X >X#define STREAM_BUF_SIZE (DROIDCAM_SPX_CHUNK_BYTES_2*6) >X#define DECODE_BUF_SIZE (DROIDCAM_PCM_CHUNK_SAMPLES_2*6) >X#define CHUNKS_PER_PACKET 2 >X#define UDP_STREAM 2 >X#define TCP_STREAM 1 >X >X#define VIDEO_FMT_DROIDCAM 3 >X#define VIDEO_FMT_DROIDCAMX 18 >X >X#define V4L2_PLATFORM "platform:v4l2loopback" >X#define V4L2_PLATFORM_DC "platform:v4l2loopback_dc" >X >Xvoid set_v4l2_device(const char* device); >Xint open_v4l2_device(void); >Xint find_v4l2_device(const char* bus_info); >Xvoid query_v4l_device(int droidcam_device_fd, unsigned *WEBCAM_W, unsigned *WEBCAM_H); >X >Xsnd_pcm_t *find_snd_device(void); >Xint snd_transfer_check(snd_pcm_t *handle, struct snd_transfer_s *transfer); >Xint snd_transfer_commit(snd_pcm_t *handle, struct snd_transfer_s *transfer); >X >X#endif >04c433738a0d3dba932787e09da3cd9c >echo x - droidcam/work/droidcam-2.1.3/src/droidcam.c >sed 's/^X//' >droidcam/work/droidcam-2.1.3/src/droidcam.c << 'bcf744d1c15efc757c51ffca8404ae82' >X/* DroidCam & DroidCamX (C) 2010-2021 >X * https://github.com/dev47apps >X * >X * This program is distributed in the hope that it will be useful, >X * but WITHOUT ANY WARRANTY; without even the implied warranty of >X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. >X */ >X >X#include <gtk/gtk.h> >X#ifdef USE_AYATANA_APPINDICATOR >X#include <libayatana-appindicator/app-indicator.h> >X#else >X#include <libappindicator/app-indicator.h> >X#endif >X >X#include <X11/Xlib.h> >X#include <stdint.h> >X >X#include "common.h" >X#include "settings.h" >X#include "connection.h" >X#include "decoder.h" >X >X/* Globals */ >XGtkWidget *menu; >XGtkWidget *menuButton; >XGtkWidget *wbMenu; >XGtkWidget *wbButton; >XGtkWidget *elButton; >XGtkWidget *infoText; >XGtkWidget *batteryText; >XGtkWidget *audioCheckbox; >XGtkWidget *videoCheckbox; >XGtkEntry * ipEntry; >XGtkEntry * portEntry; >XGtkButton *start_button; >XGThread* hVideoThread; >XGThread* hAudioThread; >XGThread* hDecodeThread; >XGThread* hBatteryThread; >X >Xchar *v4l2_dev = 0; >Xvolatile int a_active = 0; >Xvolatile int v_active = 0; >Xvolatile int a_running = 0; >Xvolatile int v_running = 0; >Xvolatile int thread_cmd = 0; >Xstruct settings g_settings = {0}; >X >Xextern const char *thread_cmd_val_str; >Xextern char snd_device[32]; >Xextern char v4l2_device[32]; >Xconst char *APP_ICON_FILE = "/opt/droidcam-icon.png"; >X >Xvoid * AudioThreadProc(void * args); >Xvoid * VideoThreadProc(void * args); >Xvoid * DecodeThreadProc(void * args); >Xvoid * BatteryThreadProc(void * args); >X >Xconst char* wb_options[] = { >X "Automatic", >X "Incandescent", >X "Warm Fluorescent", >X "Twilight", >X "Fluorescent", >X "Daylight", >X "Cloudy Daylight", >X "Shade", >X}; >X >Xconst char* wb_values[] = { >X "auto", >X "incandescent", >X "warm-fluorescent", >X "twilight", >X "fluorescent", >X "daylight", >X "cloudy-daylight", >X "shade", >X}; >X >X/* Helper Functions */ >Xchar title[256]; >Xchar msg[256]; >X >Xgboolean ShowError_GTK(gpointer data) { >X GtkWidget *dialog = gtk_message_dialog_new(NULL, >X (GtkDialogFlags)(GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL), >X GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", msg); >X gtk_window_set_title(GTK_WINDOW(dialog), title); >X gtk_dialog_run(GTK_DIALOG(dialog)); >X gtk_widget_destroy(dialog); >X return FALSE; >X} >X >Xvoid ShowError(const char* in_title, const char* in_msg) { >X strncpy(msg, in_msg, sizeof(msg) - 1); >X msg[sizeof(msg) - 1] = '\0'; >X strncpy(title, in_title, sizeof(title) - 1); >X title[sizeof(title) - 1] = '\0'; >X gdk_threads_add_idle(ShowError_GTK, NULL); >X} >X >Xvoid UpdateBatteryLabel(char *battery_value) { >X gtk_label_set_text(GTK_LABEL(batteryText), battery_value); >X} >X >Xstatic void Stop(void) { >X a_running = 0; >X v_running = 0; >X dbgprint("join\n"); >X if (hVideoThread) { >X g_thread_join(hVideoThread); >X hVideoThread = NULL; >X } >X if (hAudioThread) { >X g_thread_join(hAudioThread); >X hAudioThread = NULL; >X } >X if (hDecodeThread) { >X g_thread_join(hDecodeThread); >X hDecodeThread = NULL; >X } >X if (hBatteryThread) { >X g_thread_join(hBatteryThread); >X hBatteryThread = NULL; >X } >X >X a_active = 0; >X v_active = 0; >X gtk_widget_set_sensitive(GTK_WIDGET(elButton), FALSE); >X gtk_widget_set_sensitive(GTK_WIDGET(wbButton), FALSE); >X gtk_widget_set_sensitive(GTK_WIDGET(menuButton), FALSE); >X UpdateBatteryLabel(""); >X} >X >Xstatic void Start(void) { >X const char* ip = NULL; >X SOCKET s = INVALID_SOCKET; >X int port = strtoul(gtk_entry_get_text(portEntry), NULL, 10); >X >X if (port <= 0 || port > 65535) { >X MSG_ERROR("Invalid Port value"); >X return; >X } >X g_settings.port = port; >X >X if (g_settings.connection == CB_WIFI_SRVR) { >X v_running = 1; >X hVideoThread = g_thread_new(NULL, VideoThreadProc, (void*) (SOCKET_PTR) s); >X hDecodeThread = g_thread_new(NULL, DecodeThreadProc, NULL); >X goto EARLY_OUT; >X } >X >X if (!g_settings.audio && !g_settings.video) { >X MSG_ERROR("Both Audio and Video are disabled"); >X return; >X } >X >X if (g_settings.connection == CB_RADIO_ADB) { >X int rc = CheckAdbDevices(port); >X if (rc != NO_ERROR) { >X AdbErrorPrint(rc); >X return; >X } >X ip = ADB_LOCALHOST_IP; >X } else if (g_settings.connection == CB_RADIO_IOS) { >X s = CheckiOSDevices(port); >X if (s <= 0) { >X iOSErrorPrint(s); >X return; >X } >X } else if (g_settings.connection == CB_RADIO_WIFI) { >X ip = (char*)gtk_entry_get_text(ipEntry); >X } else { >X MSG_ERROR("Invalid connection mode"); >X return; >X } >X >X >X // wifi or USB >X if (ip != NULL) { >X if (strlen(ip) < 7) { >X MSG_ERROR("Invalid IP value"); >X return; >X } >X >X char *errmsg = NULL; >X gtk_button_set_label(start_button, "Please wait"); >X s = Connect(ip, port, &errmsg); >X if (s == INVALID_SOCKET) { >X gtk_button_set_label(start_button, "Connect"); >X if (errmsg) MSG_ERROR(errmsg); >X return; >X } >X strncpy(g_settings.ip, ip, sizeof(g_settings.ip) - 1); >X g_settings.ip[sizeof(g_settings.ip) - 1] = '\0'; >X } >X >X if (g_settings.video) { >X v_active = 0; >X v_running = 1; >X hVideoThread = g_thread_new(NULL, VideoThreadProc, (void*) (SOCKET_PTR) s); >X hDecodeThread = g_thread_new(NULL, DecodeThreadProc, NULL); >X } else { >X disconnect(s); >X } >X >X if (g_settings.audio) { >X a_active = 0; >X a_running = 1; >X hAudioThread = g_thread_new(NULL, AudioThreadProc, NULL); >X } >X >X hBatteryThread = g_thread_new(NULL, BatteryThreadProc, NULL); >X >XEARLY_OUT: >X gtk_button_set_label(start_button, "Stop"); >X gtk_widget_set_sensitive(GTK_WIDGET(ipEntry), FALSE); >X gtk_widget_set_sensitive(GTK_WIDGET(portEntry), FALSE); >X gtk_widget_set_sensitive(GTK_WIDGET(audioCheckbox), FALSE); >X gtk_widget_set_sensitive(GTK_WIDGET(videoCheckbox), FALSE); >X gtk_widget_set_sensitive(GTK_WIDGET(elButton), TRUE); >X gtk_widget_set_sensitive(GTK_WIDGET(wbButton), TRUE); >X gtk_widget_set_sensitive(GTK_WIDGET(menuButton), TRUE); >X} >X >X/* Messages */ >X >X// app indicator callbacks >Xstatic void hide_window(GtkWidget* widget, gpointer extra) { >X GtkWindow* window = GTK_WINDOW(extra); >X gtk_widget_hide(GTK_WIDGET(window)); >X} >X >Xstatic void show_window(GtkWidget* widget, gpointer extra) { >X GtkWindow* window = GTK_WINDOW(extra); >X gtk_widget_show(GTK_WIDGET(window)); >X} >X >Xstatic void exit_window(GtkWidget* widget, gpointer extra) { >X GtkWindow* window = GTK_WINDOW(extra); >X gtk_window_close(window); >X} >X >X// generic callback >Xstatic void the_callback(GtkWidget* widget, gpointer extra) >X{ >X int cb = (uintptr_t) extra; >X gboolean ipEdit = TRUE; >X gboolean portEdit = TRUE; >X gboolean audioBox = TRUE; >X gboolean videoBox = TRUE; >X gboolean active = FALSE; >X const char* text = NULL; >X >X_up: >X dbgprint("the_callback=%d\n", cb); >X switch (cb) { >X case CB_BUTTON: >X if (v_running || a_running) { >X Stop(); >X cb = (int)g_settings.connection; >X goto _up; >X } >X#if 1 >X Start(); >X#else >X decoder_show_test_image(); >X#endif >X break; >X case CB_WIFI_SRVR: >X g_settings.connection = CB_WIFI_SRVR; >X text = "Prepare"; >X ipEdit = FALSE; >X audioBox = FALSE; >X videoBox = FALSE; >X break; >X case CB_RADIO_WIFI: >X g_settings.connection = CB_RADIO_WIFI; >X text = "Connect"; >X break; >X case CB_RADIO_ADB: >X g_settings.connection = CB_RADIO_ADB; >X text = "Connect"; >X ipEdit = FALSE; >X break; >X case CB_RADIO_IOS: >X g_settings.connection = CB_RADIO_IOS; >X text = "Connect"; >X ipEdit = FALSE; >X break; >X case CB_BTN_OTR: >X gtk_menu_popup_at_pointer(GTK_MENU(menu), NULL); >X break; >X case CB_BTN_WB: >X gtk_menu_popup_at_pointer(GTK_MENU(wbMenu), NULL); >X break; >X case CB_BTN_EL: >X if (v_running != 1 || thread_cmd != 0) { >X gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(elButton), FALSE); >X break; >X } >X >X active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(elButton)); >X thread_cmd = (active) ? CB_CONTROL_EL_ON : CB_CONTROL_EL_OFF; >X break; >X case CB_AUDIO: >X g_settings.audio = (int) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(audioCheckbox)); >X dbgprint("audio=%d\n", g_settings.audio); >X break; >X case CB_VIDEO: >X g_settings.video = (int) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(videoCheckbox)); >X dbgprint("video=%d\n", g_settings.video); >X break; >X } >X >X if (text != NULL && v_running == 0){ >X gtk_button_set_label(start_button, text); >X gtk_widget_set_sensitive(GTK_WIDGET(ipEntry), ipEdit); >X gtk_widget_set_sensitive(GTK_WIDGET(portEntry), portEdit); >X gtk_widget_set_sensitive(GTK_WIDGET(audioCheckbox), audioBox); >X gtk_widget_set_sensitive(GTK_WIDGET(videoCheckbox), videoBox); >X } >X} >X >Xstatic void controls_callback(GtkWidget* widget, gpointer extra) { >X int cb = (uintptr_t) extra; >X dbgprint("controls_callback=%d\n", cb); >X if (v_running == 0 || thread_cmd != 0) { >X return; >X } >X switch (cb) { >X case CB_CONTROL_ZOOM_IN: >X case CB_CONTROL_ZOOM_OUT: >X case CB_CONTROL_AF: >X case CB_CONTROL_LED: >X thread_cmd = cb; >X break; >X case CB_H_FLIP: >X g_settings.horizontal_flip = decoder_horizontal_flip(); >X break; >X case CB_V_FLIP: >X g_settings.vertical_flip = decoder_vertical_flip(); >X break; >X } >X} >X >X// wbMenu callback >Xstatic void wb_callback(GtkWidget* widget, gpointer extra) { >X uintptr_t cb = (uintptr_t) extra; >X dbgprint("wb_callback=%lu\n", cb); >X if (cb < ARRAY_LEN(wb_options) && v_running == 1 && thread_cmd == 0) { >X thread_cmd_val_str = wb_values[cb]; >X thread_cmd = CB_CONTROL_WB; >X } >X} >X >X// keyboard shortcuts callback >Xstatic gboolean accel_callback(GtkAccelGroup *group, GObject *obj, guint keyval, >X GdkModifierType mod, gpointer extra) >X{ >X controls_callback(NULL, extra); >X return TRUE; >X} >X >Xstatic gboolean delete_window_callback(GtkWidget *widget, GdkEvent *event, gpointer extra) >X{ >X if ((v_running || a_running) && g_settings.confirm_close) { >X GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(extra), >X (GtkDialogFlags)(GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL), >X GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, >X "Connection will be lost."); >X >X gtk_window_set_title(GTK_WINDOW(dialog), "Are you sure?"); >X int rc = gtk_dialog_run(GTK_DIALOG(dialog)); >X gtk_widget_destroy(dialog); >X if (rc == GTK_RESPONSE_NO) >X return TRUE; // dont quit >X } >X >X return FALSE; >X} >X >X/* Main */ >Xstatic void usage(int argc, char *argv[]) { >X fprintf(stderr, "Options:\n" >X " -dev=PATH Specify v4l2loopback device to use, instead of first available.\n" >X " Ex: /dev/video5\n" >X "\n" >X " -size=WxH Specify video size (when using the regular v4l2loopback module)\n" >X " Ex: 640x480, 1280x720, 1920x1080\n" >X ); >X} >X >Xstatic void parse_args(int argc, char *argv[]) { >X int i = 1; >X for (; i < argc; i++) { >X if (argv[i][0] == '-' && argv[i][1] == 'd' && argv[i][3] == 'v') { >X if (argv[i][4] != '=' || argv[i][5] == 0) >X goto ERROR; >X >X v4l2_dev = &argv[i][5]; >X continue; >X } >X if (argv[i][0] == '-' && argv[i][1] == 's' && argv[i][3] == 'z') { >X if (sscanf(argv[i], "-size=%dx%d", &g_settings.v4l2_width, &g_settings.v4l2_height) != 2) >X goto ERROR; >X >X continue; >X } >X >X if (argv[i][0] == '-' && argv[i][1] == 'h') >X goto ERROR; >X } >X return; >X >XERROR: >X usage(argc, argv); >X exit(1); >X} >X >Xstatic void add_indicator(GtkWidget *window) { >X AppIndicator *indicator = app_indicator_new("droidcam", APP_ICON_FILE, APP_INDICATOR_CATEGORY_APPLICATION_STATUS); >X GtkWidget *menu = gtk_menu_new(); >X GtkWidget *name_menu_item = gtk_menu_item_new_with_label("Droidcam"); >X GtkWidget *show_menu_item = gtk_menu_item_new_with_label("Show"); >X GtkWidget *hide_menu_item = gtk_menu_item_new_with_label("Hide"); >X GtkWidget *exit_menu_item = gtk_menu_item_new_with_label("Exit"); >X >X gtk_widget_set_sensitive(name_menu_item, 0); >X gtk_menu_shell_append(GTK_MENU_SHELL(menu), name_menu_item); >X gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new()); >X gtk_menu_shell_append(GTK_MENU_SHELL(menu), show_menu_item); >X gtk_menu_shell_append(GTK_MENU_SHELL(menu), hide_menu_item); >X gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new()); >X gtk_menu_shell_append(GTK_MENU_SHELL(menu), exit_menu_item); >X >X gtk_widget_show_all(menu); >X app_indicator_set_status(indicator, APP_INDICATOR_STATUS_ACTIVE); >X app_indicator_set_menu(indicator, GTK_MENU(menu)); >X >X g_signal_connect(G_OBJECT(hide_menu_item), "activate", G_CALLBACK(hide_window), window); >X g_signal_connect(G_OBJECT(show_menu_item), "activate", G_CALLBACK(show_window), window); >X g_signal_connect(G_OBJECT(exit_menu_item), "activate", G_CALLBACK(exit_window), window); >X} >X >Xint main(int argc, char *argv[]) >X{ >X char info[128]; >X char port[16]; >X GtkWidget *window; >X GtkWidget *grid; >X GtkWidget *radioGroup; >X GtkWidget *menuGrid; >X GtkWidget *radios[CB_RADIO_COUNT]; >X GtkWidget *widget; // generic stuff >X GClosure *closure; >X GtkAccelGroup *gtk_accel; >X >X // init threads >X XInitThreads(); >X gtk_init(&argc, &argv); >X >X window = gtk_window_new(GTK_WINDOW_TOPLEVEL); >X gtk_window_set_title(GTK_WINDOW(window), "DroidCam Client"); >X gtk_container_set_border_width(GTK_CONTAINER(window), 1); >X gtk_window_set_resizable(GTK_WINDOW(window), FALSE); >X gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_NONE); >X gtk_container_set_border_width(GTK_CONTAINER(window), 4); >X gtk_window_set_icon_from_file(GTK_WINDOW(window), APP_ICON_FILE, NULL); >X >X // keyboard shortcuts >X gtk_accel = gtk_accel_group_new (); >X closure = g_cclosure_new(G_CALLBACK(accel_callback), (gpointer)(CB_CONTROL_AF), NULL); >X gtk_accel_group_connect(gtk_accel, GDK_KEY_A, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE, closure); >X >X closure = g_cclosure_new(G_CALLBACK(accel_callback), (gpointer)(CB_CONTROL_LED), NULL); >X gtk_accel_group_connect(gtk_accel, GDK_KEY_L, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE, closure); >X >X closure = g_cclosure_new(G_CALLBACK(accel_callback), (gpointer)(CB_CONTROL_ZOOM_OUT), NULL); >X gtk_accel_group_connect(gtk_accel, GDK_KEY_minus, (GdkModifierType)0, GTK_ACCEL_VISIBLE, closure); >X >X closure = g_cclosure_new(G_CALLBACK(accel_callback), (gpointer)(CB_CONTROL_ZOOM_OUT), NULL); >X gtk_accel_group_connect(gtk_accel, GDK_KEY_KP_Subtract, (GdkModifierType)0, GTK_ACCEL_VISIBLE, closure); >X >X closure = g_cclosure_new(G_CALLBACK(accel_callback), (gpointer)(CB_CONTROL_ZOOM_IN), NULL); >X gtk_accel_group_connect(gtk_accel, GDK_KEY_plus, (GdkModifierType)0, GTK_ACCEL_VISIBLE, closure); >X >X closure = g_cclosure_new(G_CALLBACK(accel_callback), (gpointer)(CB_CONTROL_ZOOM_IN), NULL); >X gtk_accel_group_connect(gtk_accel, GDK_KEY_KP_Add, (GdkModifierType)0, GTK_ACCEL_VISIBLE, closure); >X >X closure = g_cclosure_new(G_CALLBACK(accel_callback), (gpointer)(CB_CONTROL_ZOOM_IN), NULL); >X gtk_accel_group_connect(gtk_accel, GDK_KEY_equal, (GdkModifierType)0, GTK_ACCEL_VISIBLE, closure); >X >X closure = g_cclosure_new(G_CALLBACK(accel_callback), (gpointer)(CB_H_FLIP), NULL); >X gtk_accel_group_connect(gtk_accel, GDK_KEY_M, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE, closure); >X >X closure = g_cclosure_new(G_CALLBACK(accel_callback), (gpointer)(CB_V_FLIP), NULL); >X gtk_accel_group_connect(gtk_accel, GDK_KEY_V, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE, closure); >X >X gtk_window_add_accel_group(GTK_WINDOW(window), gtk_accel); >X >X // gui >X menu = gtk_menu_new(); >X widget = gtk_menu_item_new_with_label("Auto-Focus (Ctrl+A)"); >X gtk_menu_shell_append (GTK_MENU_SHELL(menu), widget); >X gtk_widget_show (widget); >X g_signal_connect(widget, "activate", G_CALLBACK(controls_callback), (gpointer)CB_CONTROL_AF); >X >X widget = gtk_menu_item_new_with_label("Toggle LED Flash (Ctrl+L)"); >X gtk_menu_shell_append (GTK_MENU_SHELL(menu), widget); >X gtk_widget_show (widget); >X g_signal_connect(widget, "activate", G_CALLBACK(controls_callback), (gpointer)CB_CONTROL_LED); >X >X widget = gtk_menu_item_new_with_label("Zoom In (+)"); >X gtk_menu_shell_append (GTK_MENU_SHELL(menu), widget); >X gtk_widget_show (widget); >X g_signal_connect(widget, "activate", G_CALLBACK(controls_callback), (gpointer)CB_CONTROL_ZOOM_IN); >X >X widget = gtk_menu_item_new_with_label("Zoom Out (-)"); >X gtk_menu_shell_append (GTK_MENU_SHELL(menu), widget); >X gtk_widget_show (widget); >X g_signal_connect(widget, "activate", G_CALLBACK(controls_callback), (gpointer)CB_CONTROL_ZOOM_OUT); >X >X widget = gtk_menu_item_new_with_label("Horizontal Flip / Mirror (Ctrl+M)"); >X gtk_menu_shell_append (GTK_MENU_SHELL(menu), widget); >X gtk_widget_show (widget); >X g_signal_connect(widget, "activate", G_CALLBACK(controls_callback), (gpointer)CB_H_FLIP); >X >X widget = gtk_menu_item_new_with_label("Vertical Flip (Ctrl+V)"); >X gtk_menu_shell_append (GTK_MENU_SHELL(menu), widget); >X gtk_widget_show (widget); >X g_signal_connect(widget, "activate", G_CALLBACK(controls_callback), (gpointer)CB_V_FLIP); >X >X // white-balance menu >X wbMenu = gtk_menu_new(); >X for (size_t i = 0; i < ARRAY_LEN(wb_options); i++) { >X widget = gtk_menu_item_new_with_label(wb_options[i]); >X gtk_menu_shell_append (GTK_MENU_SHELL(wbMenu), widget); >X gtk_widget_show(widget); >X g_signal_connect(widget, "activate", G_CALLBACK(wb_callback), (gpointer)i); >X } >X >X // Create main grid to create left and right column of the UI. >X // +-----------------------------------+ >X // |---------------+ +--------------| >X // ||RadioGroup | |Input field || >X // || | |Input field || >X // ||Toggle A/V | | Connect|| >X // ||[...] | | || >X // |---------------+ +--------------| >X // + InfoText -+ >X // +-----------------------------------+ >X grid = gtk_grid_new(); >X >X // Add created grid to main window. >X gtk_container_add(GTK_CONTAINER(window), grid); >X >X // Columns and rows should be separated a bit. >X gtk_grid_set_column_spacing(GTK_GRID(grid), 10); >X gtk_grid_set_row_spacing(GTK_GRID(grid), 5); >X >X // Create grid for radio buttons, so they are easy to distinguish from the rest >X // the elements. >X radioGroup = gtk_grid_new(); >X >X // Put radio group as first element of left column. >X gtk_grid_attach(GTK_GRID(grid), radioGroup, 0, 0, 1, 3); >X >X // Create radio options. >X radios[CB_RADIO_WIFI] = gtk_radio_button_new_with_label(NULL, "WiFi / LAN"); >X g_signal_connect(radios[CB_RADIO_WIFI], "toggled", G_CALLBACK(the_callback), (gpointer)CB_RADIO_WIFI); >X gtk_grid_attach(GTK_GRID(radioGroup), radios[CB_RADIO_WIFI], 0, 0, 1, 1); >X >X radios[CB_WIFI_SRVR] = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radios[CB_RADIO_WIFI]), "Wifi Server Mode"); >X g_signal_connect(radios[CB_WIFI_SRVR], "toggled", G_CALLBACK(the_callback), (gpointer)CB_WIFI_SRVR); >X gtk_grid_attach_next_to(GTK_GRID(radioGroup), radios[CB_WIFI_SRVR], radios[CB_RADIO_WIFI], GTK_POS_BOTTOM, 1, 1); >X >X radios[CB_RADIO_ADB] = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radios[CB_WIFI_SRVR]), "USB (Android)"); >X g_signal_connect(radios[CB_RADIO_ADB], "toggled", G_CALLBACK(the_callback), (gpointer)CB_RADIO_ADB); >X gtk_grid_attach_next_to(GTK_GRID(radioGroup), radios[CB_RADIO_ADB], radios[CB_WIFI_SRVR], GTK_POS_BOTTOM, 1, 1); >X >X radios[CB_RADIO_IOS] = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radios[CB_RADIO_ADB]), "USB (iOS)"); >X g_signal_connect(radios[CB_RADIO_IOS], "toggled", G_CALLBACK(the_callback), (gpointer)CB_RADIO_IOS); >X gtk_grid_attach_next_to(GTK_GRID(radioGroup), radios[CB_RADIO_IOS], radios[CB_RADIO_ADB], GTK_POS_BOTTOM, 1, 1); >X >X // Add toggle button to enable video as 2nd element of left column. >X widget = gtk_check_button_new_with_label("Enable Video"); >X g_signal_connect(widget, "toggled", G_CALLBACK(the_callback), (gpointer)CB_VIDEO); >X gtk_grid_attach(GTK_GRID(grid), widget, 0, 3, 1, 1); >X videoCheckbox = widget; >X >X // Add toggle button to enable audio as 3rd element of left column. >X widget = gtk_check_button_new_with_label("Enable Audio"); >X g_signal_connect(widget, "toggled", G_CALLBACK(the_callback), (gpointer)CB_AUDIO); >X gtk_grid_attach(GTK_GRID(grid), widget, 0, 4, 1, 1); >X audioCheckbox = widget; >X >X // Add [WB] Menu button >X widget = gtk_button_new_with_label("WB"); >X gtk_widget_set_tooltip_text(widget, "White-balance"); >X g_signal_connect(widget, "clicked", G_CALLBACK(the_callback), (gpointer)CB_BTN_WB); >X wbButton = widget; >X >X // Put menu button in the grid, so it's not full column width, but smaller. >X menuGrid = gtk_grid_new(); >X gtk_grid_attach(GTK_GRID(menuGrid), widget, 0, 1, 1, 1); >X >X // Battery level label >X batteryText = gtk_label_new(NULL); >X gtk_grid_attach(GTK_GRID(menuGrid), batteryText, 0, 0, 1, 1); >X >X // Add [EL] Menu button >X widget = gtk_toggle_button_new_with_label("EL"); >X gtk_widget_set_tooltip_text(widget, "Exposure Locked"); >X g_signal_connect(widget, "clicked", G_CALLBACK(the_callback), (gpointer)CB_BTN_EL); >X gtk_grid_attach(GTK_GRID(menuGrid), widget, 1, 1, 1, 1); >X elButton = widget; >X >X // Add [...] Menu button >X widget = gtk_button_new_with_label("..."); >X g_signal_connect(widget, "clicked", G_CALLBACK(the_callback), (gpointer)CB_BTN_OTR); >X gtk_grid_attach(GTK_GRID(menuGrid), widget, 2, 1, 1, 1); >X menuButton = widget; >X >X // attach the buttons to the column >X gtk_grid_attach(GTK_GRID(grid), menuGrid, 0, 5, 1, 1); >X >X // Info text goes as last element of left column. >X infoText = gtk_label_new(NULL); >X gtk_grid_attach(GTK_GRID(grid), infoText, 0, 6, 2, 1); >X >X // Phone IP label. >X widget = gtk_label_new("Phone IP:"); >X gtk_label_set_xalign(GTK_LABEL(widget), 1.0); >X gtk_grid_attach(GTK_GRID(grid), widget, 1, 0, 1, 1); >X >X // And input field for phone IP. >X widget = gtk_entry_new(); >X gtk_entry_set_max_length(GTK_ENTRY(widget), 16); >X ipEntry = (GtkEntry*)widget; >X gtk_grid_attach(GTK_GRID(grid), widget, 2, 0, 1, 1); >X >X // Port label. >X widget = gtk_label_new("DroidCam Port:"); >X gtk_label_set_xalign (GTK_LABEL(widget), 1.0); >X gtk_grid_attach(GTK_GRID(grid), widget, 1, 1, 1, 1); >X >X // Port input field. >X widget = gtk_entry_new(); >X gtk_entry_set_max_length(GTK_ENTRY(widget), 5); >X portEntry = (GtkEntry*)widget; >X gtk_grid_attach(GTK_GRID(grid), widget, 2, 1, 1, 1); >X >X // And finally connect button. >X widget = gtk_button_new_with_label("Connect"); >X g_signal_connect(widget, "clicked", G_CALLBACK(the_callback), (gpointer) CB_BUTTON); >X start_button = (GtkButton*)widget; >X gtk_grid_attach(GTK_GRID(grid), widget, 2, 2, 1, 1); >X >X g_signal_connect(window, "destroy", G_CALLBACK (gtk_main_quit), NULL); >X g_signal_connect(window, "delete-event", G_CALLBACK(delete_window_callback), window); >X gtk_widget_show_all(window); >X >X Stop(); // reset the UI >X LoadSettings(&g_settings); >X if (argc >= 1) { >X parse_args(argc, argv); >X } >X >X snprintf(port, sizeof(port), "%d", g_settings.port); >X gtk_entry_set_text(ipEntry, g_settings.ip); >X gtk_entry_set_text(portEntry, port); >X >X if (g_settings.connection < CB_RADIO_COUNT) >X gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radios[g_settings.connection]), TRUE); >X >X if (g_settings.audio) >X gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(audioCheckbox), TRUE); >X >X if (g_settings.video) >X gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(videoCheckbox), TRUE); >X >X if (decoder_init(v4l2_dev, g_settings.v4l2_width, g_settings.v4l2_height)) >X { >X // add info about devices >X snprintf(info, sizeof(info), "Client v" APP_VER_STR ", Video: %s, Audio: %s", >X v4l2_device, snd_device); >X gtk_label_set_text(GTK_LABEL(infoText), info); >X printf("Video: %s\n", v4l2_device); >X printf("Audio: %s\n", snd_device); >X >X // re-load flip values from last run >X if (g_settings.horizontal_flip) >X decoder_horizontal_flip(); >X >X if (g_settings.vertical_flip) >X decoder_vertical_flip(); >X >X // set the font size >X PangoAttrList *attrlist = pango_attr_list_new(); >X PangoAttribute *attr = pango_attr_size_new_absolute(12 * PANGO_SCALE); >X pango_attr_list_insert(attrlist, attr); >X gtk_label_set_attributes(GTK_LABEL(infoText), attrlist); >X pango_attr_list_unref(attrlist); >X >X // add taskbar widget >X add_indicator(window); >X >X // main loop >X gtk_main(); >X Stop(); >X decoder_fini(); >X connection_cleanup(); >X SaveSettings(&g_settings); >X } >X >X return 0; >X} >bcf744d1c15efc757c51ffca8404ae82 >echo c - droidcam/work/droidcam-2.1.3/.github >mkdir -p droidcam/work/droidcam-2.1.3/.github > /dev/null 2>&1 >echo c - droidcam/work/droidcam-2.1.3/.github/ISSUE_TEMPLATE >mkdir -p droidcam/work/droidcam-2.1.3/.github/ISSUE_TEMPLATE > /dev/null 2>&1 >echo x - droidcam/work/droidcam-2.1.3/.github/ISSUE_TEMPLATE/bug_report.md >sed 's/^X//' >droidcam/work/droidcam-2.1.3/.github/ISSUE_TEMPLATE/bug_report.md << 'ccde1cbd0b81d715ec591ddc6d30d9a1' >X--- >Xname: Bug report >Xabout: File a bug report >Xtitle: '' >Xlabels: '' >Xassignees: '' >X >X--- >X >X**Describe the bug** >XA clear and concise description of what the bug is. >X >X**Expected behavior** >XA clear and concise description of what you expected to happen. >X >X**Additional context** >XAdd any other context about the problem here. >ccde1cbd0b81d715ec591ddc6d30d9a1 >echo x - droidcam/work/droidcam-2.1.3/.github/ISSUE_TEMPLATE/feature_request.md >sed 's/^X//' >droidcam/work/droidcam-2.1.3/.github/ISSUE_TEMPLATE/feature_request.md << '40e5e54196b2b7fbcad4df33c4bcda5c' >X--- >Xname: Feature request >Xabout: Suggest an idea >Xtitle: '' >Xlabels: '' >Xassignees: '' >X >X--- >X >X**Describe the feature you'd like to see added to the app** >XA clear and concise description of what you want to happen. >40e5e54196b2b7fbcad4df33c4bcda5c >echo x - droidcam/work/droidcam-2.1.3/.github/ISSUE_TEMPLATE/other.md >sed 's/^X//' >droidcam/work/droidcam-2.1.3/.github/ISSUE_TEMPLATE/other.md << '0c0c209215b58f3fba7e79869223aec8' >X--- >Xname: Other >Xabout: For other issues, please email support@dev47apps.com first. >Xtitle: '' >Xlabels: '' >Xassignees: '' >X >X--- >X >X >0c0c209215b58f3fba7e79869223aec8 >echo c - droidcam/work/droidcam-2.1.3/v4l2loopback >mkdir -p droidcam/work/droidcam-2.1.3/v4l2loopback > /dev/null 2>&1 >echo x - droidcam/work/droidcam-2.1.3/v4l2loopback/test.c >sed 's/^X//' >droidcam/work/droidcam-2.1.3/v4l2loopback/test.c << 'b85e5c169bacbed27cb51cbfc65d797d' >X/* >X * How to test v4l2loopback: >X * 1. launch this test program (even in background), it will initialize the >X * loopback device and keep it open so it won't loose the settings. >X * 2. Feed the video device with data according to the settings specified >X * below: size, pixelformat, etc. >X * For instance, you can try the default settings with this command: >X * mencoder video.avi -ovc raw -nosound -vf scale=640:480,format=yuy2 -o /dev/video1 >X * TODO: a command that limits the fps would be better :) >X * >X * Test the video in your favourite viewer, for instance: >X * luvcview -d /dev/video1 -f yuyv >X */ >X >X#include <linux/videodev2.h> >X#include <sys/ioctl.h> >X#include <sys/mman.h> >X#include <unistd.h> >X >X#include <stdio.h> >X#include <stdlib.h> >X#include <string.h> >X#include <fcntl.h> >X#include <assert.h> >X >X#define ROUND_UP_2(num) (((num)+1)&~1) >X#define ROUND_UP_4(num) (((num)+3)&~3) >X#define ROUND_UP_8(num) (((num)+7)&~7) >X#define ROUND_UP_16(num) (((num)+15)&~15) >X#define ROUND_UP_32(num) (((num)+31)&~31) >X#define ROUND_UP_64(num) (((num)+63)&~63) >X >X#if 0 >X# define CHECK_REREAD >X#endif >X >X#define VIDEO_DEVICE "/dev/video1" >X >X# define FRAME_WIDTH 320 >X# define FRAME_HEIGHT 240 >X >X# define FRAME_FORMAT V4L2_PIX_FMT_YUV420 >X >Xstatic int debug=1; >X >Xint format_properties(const unsigned int format, >X const unsigned int width, >X const unsigned int height, >X size_t*linewidth, >X size_t*framewidth) { >Xsize_t lw, fw; >X switch(format) { >X case V4L2_PIX_FMT_YUV420: case V4L2_PIX_FMT_YVU420: >X lw = width; /* ??? */ >X fw = ROUND_UP_4 (width) * ROUND_UP_2 (height); >X fw += 2 * ((ROUND_UP_8 (width) / 2) * (ROUND_UP_2 (height) / 2)); >X break; >X case V4L2_PIX_FMT_UYVY: case V4L2_PIX_FMT_Y41P: case V4L2_PIX_FMT_YUYV: case V4L2_PIX_FMT_YVYU: >X lw = (ROUND_UP_2 (width) * 2); >X fw = lw * height; >X break; >X default: >X return 0; >X } >X >X if(linewidth)*linewidth=lw; >X if(framewidth)*framewidth=fw; >X >X return 1; >X} >X >X >Xvoid print_format(struct v4l2_format*vid_format) { >X printf(" vid_format->type =%d\n", vid_format->type ); >X printf(" vid_format->fmt.pix.width =%d\n", vid_format->fmt.pix.width ); >X printf(" vid_format->fmt.pix.height =%d\n", vid_format->fmt.pix.height ); >X printf(" vid_format->fmt.pix.pixelformat =%d\n", vid_format->fmt.pix.pixelformat); >X printf(" vid_format->fmt.pix.sizeimage =%d\n", vid_format->fmt.pix.sizeimage ); >X printf(" vid_format->fmt.pix.field =%d\n", vid_format->fmt.pix.field ); >X printf(" vid_format->fmt.pix.bytesperline=%d\n", vid_format->fmt.pix.bytesperline ); >X printf(" vid_format->fmt.pix.colorspace =%d\n", vid_format->fmt.pix.colorspace ); >X} >X >X >Xstruct buffer { >X __u8 * start; >X size_t length; >X}; >X >X >Xint main(int argc, char**argv) >X{ >X struct v4l2_capability vid_caps; >X struct v4l2_format vid_format; >X struct v4l2_requestbuffers reqbuf; >X struct v4l2_buffer buf; >X >X >X struct buffer * buffers; >X >X size_t framesize; >X size_t linewidth; >X >X const char*video_device=VIDEO_DEVICE; >X int fdwr = 0; >X int ret_code = 0; >X >X int i, j; >X >X if(argc>1) { >X video_device=argv[1]; >X printf("using output device: %s\n", video_device); >X } >X >X fdwr = open(video_device, O_RDWR); >X assert(fdwr >= 0); >X >X ret_code = ioctl(fdwr, VIDIOC_QUERYCAP, &vid_caps); >X assert(ret_code != -1); >X if (!(vid_caps.capabilities & V4L2_CAP_STREAMING)) { >X fprintf (stderr, "%s does not support streaming i/o\n", video_device); >X exit (EXIT_FAILURE); >X } >X >X memset(&vid_format, 0, sizeof(vid_format)); >X memset(&reqbuf, 0, sizeof(reqbuf)); >X memset(&buf, 0, sizeof(buf)); >X >X ret_code = ioctl(fdwr, VIDIOC_G_FMT, &vid_format); >X printf("VIDIOC_G_FMT return %d\n", ret_code); >X print_format(&vid_format); >X >X vid_format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; >X vid_format.fmt.pix.width = FRAME_WIDTH; >X vid_format.fmt.pix.height = FRAME_HEIGHT; >X vid_format.fmt.pix.pixelformat = FRAME_FORMAT; >X vid_format.fmt.pix.sizeimage = framesize; >X vid_format.fmt.pix.field = V4L2_FIELD_NONE; >X vid_format.fmt.pix.bytesperline = linewidth; >X vid_format.fmt.pix.colorspace = V4L2_COLORSPACE_SRGB; >X printf("Updated format:\n"); >X print_format(&vid_format); >X >X ret_code = ioctl(fdwr, VIDIOC_S_FMT, &vid_format); >X printf("VIDIOC_S_FMT return %d\n", ret_code); >X assert(ret_code != -1); >X >X print_format(&vid_format); >X >X if(!format_properties(vid_format.fmt.pix.pixelformat, >X vid_format.fmt.pix.width, vid_format.fmt.pix.height, >X &linewidth, >X &framesize)) { >X printf("unable to guess correct settings for format '%d'\n", FRAME_FORMAT); >X } >X >X reqbuf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; >X reqbuf.memory = V4L2_MEMORY_MMAP; >X reqbuf.count = 1; >X ret_code = ioctl (fdwr, VIDIOC_REQBUFS, &reqbuf); >X printf("VIDIOC_REQBUFS return %d\n", ret_code); >X assert(ret_code != -1); >X >X buffers = calloc(reqbuf.count, sizeof (buffers)); >X assert(buffers != NULL); >X >X printf("Mapping buffer\n"); >X buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; >X buf.memory = V4L2_MEMORY_MMAP; >X buf.index = 1; >X ioctl (fdwr, VIDIOC_QUERYBUF, &buf); >X buffers[0].length = buf.length; >X buffers[0].start = mmap (NULL /* start anywhere */, >X buf.length, >X PROT_READ | PROT_WRITE /* required */, >X MAP_SHARED /* recommended */, >X fdwr, buf.m.offset); >X >X assert(MAP_FAILED != buffers[0].start); >X >X for (j = 0; j < 256; i++) >X { >X for (i = 0; i < framesize; ++i) { >X buffers[0].start[i] = 100;//i%j; >X } >X usleep(100000); >X } >X >X pause(); >X >X munmap(buffers[0].start, buffers[0].length); >X close(fdwr); >X return 0; >X} >b85e5c169bacbed27cb51cbfc65d797d >echo x - droidcam/work/droidcam-2.1.3/v4l2loopback/Makefile >sed 's/^X//' >droidcam/work/droidcam-2.1.3/v4l2loopback/Makefile << '0976729bb3516f62a762569d1a8f7395' >XKERNELRELEASE ?= $(shell uname -r) >XKERNEL_DIR ?= /lib/modules/$(KERNELRELEASE)/build >XPWD := $(shell pwd) >X >Xobj-m := v4l2loopback-dc.o >X >Xall: >X $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules >X >Xinstall: >X $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules_install >X >Xtest: >X gcc test.c -o test >X >Xclean: >X $(MAKE) -C $(KERNEL_DIR) M=$(PWD) clean >X >Xinsmod: >X sudo insmod v4l2loopback-dc.ko width=320 height=240 >X >Xrmmod: >X sudo rmmod v4l2loopback-dc.ko >0976729bb3516f62a762569d1a8f7395 >echo x - droidcam/work/droidcam-2.1.3/v4l2loopback/v4l2loopback-dc.c >sed 's/^X//' >droidcam/work/droidcam-2.1.3/v4l2loopback/v4l2loopback-dc.c << '5ac21c631493e2fad4b578b59aec1d60' >X/* >X * Original source: >X * https://github.com/umlaeute/v4l2loopback >X * Copyright (C) 2005-2009 Vasily Levin (vasaka@gmail.com) >X * Copyright (C) 2010-2012 IOhannes m zmoelnig (zmoelnig@iem.at) >X * Copyright (C) 2011 Stefan Diewald (stefan.diewald@mytum.de) >X * Copyright (C) 2012 Anton Novikov (random.plant@gmail.com) >X * >X * https://github.com/aramg/droidcam >X * Copyright (C) 2013 @dev47apps >X * >X * This program is free software; you can redistribute it and/or modify >X * it under the terms of the GNU General Public License as published by >X * the Free Software Foundation; either version 2 of the License, or >X * (at your option) any later version. >X * >X * This program is distributed in the hope that it will be useful, >X * but WITHOUT ANY WARRANTY; without even the implied warranty of >X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. >X * Use at your own risk. >X * >X */ >X#include <linux/version.h> >X#include <linux/vmalloc.h> >X#include <linux/mm.h> >X#include <linux/time.h> >X#include <linux/module.h> >X#include <linux/videodev2.h> >X#include <media/v4l2-ioctl.h> >X#include <media/v4l2-common.h> >X >Xstatic inline void get_timestamp(struct v4l2_buffer *b) { >X /* ktime_get_ts is considered deprecated, so use ktime_get_ts64 if possible */ >X#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0) >X struct timespec ts; >X ktime_get_ts(&ts); >X#else >X struct timespec64 ts; >X ktime_get_ts64(&ts); >X#endif >X >X b->timestamp.tv_sec = ts.tv_sec; >X b->timestamp.tv_usec = (ts.tv_nsec / NSEC_PER_USEC); >X} >X >X#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) >X# define v4l2_file_operations file_operations >X /* dummy v4l2_device struct/functions */ >X # define V4L2_DEVICE_NAME_SIZE (20 + 16) >X struct v4l2_device { >X char name[V4L2_DEVICE_NAME_SIZE]; >X }; >X static inline int v4l2_device_register (void *dev, void *v4l2_dev) { return 0; } >X static inline void v4l2_device_unregister(struct v4l2_device *v4l2_dev) { return; } >X#else >X# include <media/v4l2-device.h> >X#endif >X >X#if LINUX_VERSION_CODE < KERNEL_VERSION(3,6,1) >X # define kstrtoul strict_strtoul >X#endif >X >X#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) >Xvoid * v4l2l_vzalloc (unsigned long size) { >X void*data=vmalloc(size); >X memset(data, 0, size); >X return data; >X} >X#else >X# define v4l2l_vzalloc vzalloc >X#endif >X >X#include <linux/sched.h> >X#include <linux/slab.h> >X >X#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0) >X#define strscpy strlcpy >X#endif >X >X#if defined(timer_setup) && defined(from_timer) >X#define HAVE_TIMER_SETUP >X#endif >X >X#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 7, 0) >X# define VFL_TYPE_VIDEO VFL_TYPE_GRABBER >X#endif >X >X#define V4L2LOOPBACK_VERSION_CODE KERNEL_VERSION(0,6,4) >X >X >X#define DEBUG 0 >X >XMODULE_DESCRIPTION("V4L2 loopback video device"); >XMODULE_AUTHOR("Vasily Levin, IOhannes m zmoelnig <zmoelnig@iem.at>, Stefan Diewald, Anton Novikov"); >XMODULE_LICENSE("GPL"); >X >X >X/* helpers */ >X#define STRINGIFY(s) #s >X#define STRINGIFY2(s) STRINGIFY(s) >X >X#if DEBUG >X >X#define dprintk(fmt, args...) \ >X do { if (DEBUG > 0) { \ >X printk(KERN_INFO "v4l2-loopback[" STRINGIFY2(__LINE__) "]: " fmt, ##args); \ >X } } while(0) >X >X#define MARK() \ >X do{ if (DEBUG > 1) { \ >X printk(KERN_INFO "%s:%d[%s]", __FILE__, __LINE__, __FUNCTION__); \ >X } } while (0) >X >X#define dprintkrw(fmt, args...) \ >X do { if (DEBUG > 2) { \ >X printk(KERN_INFO "v4l2-loopback[" STRINGIFY2(__LINE__)"]: " fmt, ##args); \ >X } } while (0) >X >X#else >X >X#define MARK() >X#define dprintk(fmt, args...) >X#define dprintkrw(fmt, args...) >X >X#endif >X >X/* module constants */ >X#define MAX_TIMEOUT (100 * 1000 * 1000) /* in msecs */ >X >X#define MAX_BUFFERS 16 /* max buffers that can be mapped, actually they >X * are all mapped to MAX_BUFFERS buffers */ >X >X/* how many times a device can be opened >X * the per-module default value can be overridden on a per-device basis using >X * the /sys/devices interface >X * >X * note that max_openers should be at least 2 in order to get a working system: >X * one opener for the producer and one opener for the consumer >X */ >X#define MAX_OPENERS 8; >X#define MAX_DEVICES 1 >X#define DEVICES 1 >X >X/* format specifications */ >X#define V4L2LOOPBACK_SIZE_MIN_WIDTH 48 >X#define V4L2LOOPBACK_SIZE_MIN_HEIGHT 32 >X#define V4L2LOOPBACK_SIZE_MAX_WIDTH 8192 >X#define V4L2LOOPBACK_SIZE_MAX_HEIGHT 8192 >X >X#define V4L2LOOPBACK_SIZE_DEFAULT_WIDTH 640 >X#define V4L2LOOPBACK_SIZE_DEFAULT_HEIGHT 480 >X >X >X#define V4L2LOOPBACK_VIDEO_NR_DEFAULT -1 >X >X/* module parameters */ >Xstatic int width = V4L2LOOPBACK_SIZE_DEFAULT_WIDTH; >Xmodule_param(width, int, S_IRUGO); >XMODULE_PARM_DESC(width, "frame width"); >X >Xstatic int height = V4L2LOOPBACK_SIZE_DEFAULT_HEIGHT; >Xmodule_param(height, int, S_IRUGO); >XMODULE_PARM_DESC(height, "frame height"); >X >Xstatic int video_nr = V4L2LOOPBACK_VIDEO_NR_DEFAULT; >Xmodule_param(video_nr, int, S_IRUGO); >XMODULE_PARM_DESC(video_nr, "video device numbers (-1=auto, 0=/dev/video0, etc.)"); >X >X >X/* control IDs */ >X#define CID_KEEP_FORMAT (V4L2_CID_PRIVATE_BASE+0) >X#define CID_SUSTAIN_FRAMERATE (V4L2_CID_PRIVATE_BASE+1) >X#define CID_TIMEOUT (V4L2_CID_PRIVATE_BASE+2) >X#define CID_TIMEOUT_IMAGE_IO (V4L2_CID_PRIVATE_BASE+3) >X >X >X/* module structures */ >Xstruct v4l2loopback_private { >X int devicenr; >X}; >X >Xtypedef struct v4l2loopback_private *priv_ptr; >X >X/* TODO(vasaka) use typenames which are common to kernel, but first find out if >X * it is needed */ >X/* struct keeping state and settings of loopback device */ >X >Xstruct v4l2l_buffer { >X struct v4l2_buffer buffer; >X struct list_head list_head; >X int use_count; >X}; >X >Xstruct v4l2_loopback_device { >X struct v4l2_device v4l2_dev; >X struct video_device *vdev; >X /* pixel and stream format */ >X struct v4l2_pix_format pix_format; >X struct v4l2_captureparm capture_param; >X unsigned long frame_jiffies; >X >X /* ctrls */ >X int keep_format; /* CID_KEEP_FORMAT; stay ready_for_capture even when all >X openers close() the device */ >X int sustain_framerate; /* CID_SUSTAIN_FRAMERATE; duplicate frames to maintain >X (close to) nominal framerate */ >X >X /* buffers stuff */ >X u8 *image; /* pointer to actual buffers data */ >X unsigned long int imagesize; /* size of buffers data */ >X int buffers_number; /* should not be big, 4 is a good choice */ >X struct v4l2l_buffer buffers[MAX_BUFFERS]; /* inner driver buffers */ >X int used_buffers; /* number of the actually used buffers */ >X int max_openers; /* how many times can this device be opened */ >X >X int write_position; /* number of last written frame + 1 */ >X struct list_head outbufs_list; /* buffers in output DQBUF order */ >X int bufpos2index[MAX_BUFFERS]; /* mapping of (read/write_position % used_buffers) >X * to inner buffer index */ >X long buffer_size; >X >X /* sustain_framerate stuff */ >X struct timer_list sustain_timer; >X unsigned int reread_count; >X >X /* timeout stuff */ >X unsigned long timeout_jiffies; /* CID_TIMEOUT; 0 means disabled */ >X int timeout_image_io; /* CID_TIMEOUT_IMAGE_IO; next opener will >X * read/write to timeout_image */ >X u8 *timeout_image; /* copy of it will be captured when timeout passes */ >X struct v4l2l_buffer timeout_image_buffer; >X struct timer_list timeout_timer; >X int timeout_happened; >X >X /* sync stuff */ >X atomic_t open_count; >X int ready_for_capture;/* set to true when at least one writer opened >X * device and negotiated format */ >X wait_queue_head_t read_event; >X spinlock_t lock; >X}; >X >X/* types of opener shows what opener wants to do with loopback */ >Xenum opener_type { >X UNNEGOTIATED = 0, >X READER = 1, >X WRITER = 2, >X}; >X >X/* struct keeping state and type of opener */ >Xstruct v4l2_loopback_opener { >X enum opener_type type; >X int vidioc_enum_frameintervals_calls; >X int read_position; /* number of last processed frame + 1 or >X * write_position - 1 if reader went out of sync */ >X unsigned int reread_count; >X struct v4l2_buffer *buffers; >X int buffers_number; /* should not be big, 4 is a good choice */ >X int timeout_image_io; >X}; >X >X/* this is heavily inspired by the bttv driver found in the linux kernel */ >Xstruct v4l2l_format { >X char *name; >X int fourcc; /* video4linux 2 */ >X int depth; /* bit/pixel */ >X int flags; >X}; >X/* set the v4l2l_format.flags to PLANAR for non-packed formats */ >X#define FORMAT_FLAGS_PLANAR 0x01 >X >Xstatic const struct v4l2l_format formats[] = { >X /* here come the packed formats */ >X { >X .name = "32 bpp RGB, le", >X .fourcc = V4L2_PIX_FMT_BGR32, >X .depth = 32, >X .flags = 0, >X },{ >X .name = "32 bpp RGB, be", >X .fourcc = V4L2_PIX_FMT_RGB32, >X .depth = 32, >X .flags = 0, >X },{ >X .name = "24 bpp RGB, le", >X .fourcc = V4L2_PIX_FMT_BGR24, >X .depth = 24, >X .flags = 0, >X },{ >X .name = "24 bpp RGB, be", >X .fourcc = V4L2_PIX_FMT_RGB24, >X .depth = 24, >X .flags = 0, >X },{ >X .name = "4:2:2, packed, YUYV", >X .fourcc = V4L2_PIX_FMT_YUYV, >X .depth = 16, >X .flags = 0, >X },{ >X .name = "4:2:2, packed, YUYV", >X .fourcc = V4L2_PIX_FMT_YUYV, >X .depth = 16, >X .flags = 0, >X },{ >X .name = "4:2:2, packed, UYVY", >X .fourcc = V4L2_PIX_FMT_UYVY, >X .depth = 16, >X .flags = 0, >X },{ >X#ifdef V4L2_PIX_FMT_YVYU >X .name = "4:2:2, packed YVYU", >X .fourcc = V4L2_PIX_FMT_YVYU, >X .depth = 16, >X .flags=0, >X },{ >X#endif >X#ifdef V4L2_PIX_FMT_VYUY >X .name = "4:2:2, packed VYUY", >X .fourcc = V4L2_PIX_FMT_VYUY, >X .depth = 16, >X .flags=0, >X },{ >X#endif >X .name = "4:2:2, packed YYUV", >X .fourcc = V4L2_PIX_FMT_YYUV, >X .depth = 16, >X .flags=0, >X },{ >X .name = "YUV-8-8-8-8", >X .fourcc = V4L2_PIX_FMT_YUV32, >X .depth = 32, >X .flags = 0, >X },{ >X .name = "8 bpp, gray", >X .fourcc = V4L2_PIX_FMT_GREY, >X .depth = 8, >X .flags = 0, >X },{ >X .name = "16 Greyscale", >X .fourcc = V4L2_PIX_FMT_Y16, >X .depth = 16, >X .flags = 0, >X }, >X >X /* here come the planar formats */ >X { >X .name = "4:1:0, planar, Y-Cr-Cb", >X .fourcc = V4L2_PIX_FMT_YVU410, >X .depth = 9, >X .flags = FORMAT_FLAGS_PLANAR, >X },{ >X .name = "4:2:0, planar, Y-Cr-Cb", >X .fourcc = V4L2_PIX_FMT_YVU420, >X .depth = 12, >X .flags = FORMAT_FLAGS_PLANAR, >X },{ >X .name = "4:1:0, planar, Y-Cb-Cr", >X .fourcc = V4L2_PIX_FMT_YUV410, >X .depth = 9, >X .flags = FORMAT_FLAGS_PLANAR, >X },{ >X .name = "4:2:0, planar, Y-Cb-Cr", >X .fourcc = V4L2_PIX_FMT_YUV420, >X .depth = 12, >X .flags = FORMAT_FLAGS_PLANAR, >X } >X}; >Xstatic const unsigned int FORMATS = ARRAY_SIZE(formats); >X >X >Xstatic char* >Xfourcc2str (unsigned int fourcc, >X char buf[4]) >X{ >X buf[0]=(fourcc>> 0) & 0xFF; >X buf[1]=(fourcc>> 8) & 0xFF; >X buf[2]=(fourcc>>16) & 0xFF; >X buf[3]=(fourcc>>24) & 0xFF; >X >X return buf; >X} >X >Xstatic const struct v4l2l_format* >Xformat_by_fourcc (int fourcc) >X{ >X unsigned int i; >X >X for (i = 0; i < FORMATS; i++) { >X if (formats[i].fourcc == fourcc) >X return formats+i; } >X >X dprintk("unsupported format '%c%c%c%c'", >X (fourcc>> 0) & 0xFF, >X (fourcc>> 8) & 0xFF, >X (fourcc>>16) & 0xFF, >X (fourcc>>24) & 0xFF); >X return NULL; >X} >X >Xstatic void >Xpix_format_set_size (struct v4l2_pix_format * f, >X const struct v4l2l_format * fmt, >X unsigned int width, >X unsigned int height) >X{ >X f->width = width; >X f->height = height; >X >X if (fmt->flags & FORMAT_FLAGS_PLANAR) { >X f->bytesperline = width; /* Y plane */ >X f->sizeimage = (width * height * fmt->depth) >> 3; >X } else { >X f->bytesperline = (width * fmt->depth) >> 3; >X f->sizeimage = height * f->bytesperline; >X } >X} >X >Xstatic void >Xset_timeperframe(struct v4l2_loopback_device *dev, struct v4l2_fract *tpf) >X{ >X dev->capture_param.timeperframe = *tpf; >X dev->frame_jiffies = max(1UL, msecs_to_jiffies(1000) * tpf->numerator / tpf->denominator); >X} >X >Xstatic struct v4l2_loopback_device*v4l2loopback_cd2dev (struct device*cd); >X >X/* device attributes */ >X/* available via sysfs: /sys/devices/virtual/video4linux/video* */ >X >Xstatic ssize_t attr_show_format(struct device *cd, >X struct device_attribute *attr, >X char *buf) >X{ >X /* gets the current format as "FOURCC:WxH@f/s", e.g. "YUYV:320x240@1000/30" */ >X struct v4l2_loopback_device *dev = v4l2loopback_cd2dev(cd); >X const struct v4l2_fract *tpf; >X char buf4cc[5], buf_fps[32]; >X >X if (!dev || !dev->ready_for_capture) >X return 0; >X tpf = &dev->capture_param.timeperframe; >X >X fourcc2str(dev->pix_format.pixelformat, buf4cc); >X if (tpf->numerator == 1) >X snprintf(buf_fps, sizeof(buf_fps), "%d", tpf->denominator); >X else >X snprintf(buf_fps, sizeof(buf_fps), "%d/%d", tpf->denominator, tpf->numerator); >X >X return sprintf(buf, "%4s:%dx%d@%s\n", >X buf4cc, dev->pix_format.width, dev->pix_format.height, buf_fps); >X} >Xstatic ssize_t attr_store_format(struct device* cd, >X struct device_attribute *attr, >X const char* buf, size_t len) >X{ >X struct v4l2_loopback_device *dev = v4l2loopback_cd2dev(cd); >X int fps_num = 0, fps_den = 1; >X >X /* only fps changing is supported */ >X if (sscanf(buf, "@%d/%d", &fps_num, &fps_den) > 0) { >X if (fps_num < 1 || fps_den < 1) >X return -EINVAL; >X set_timeperframe(dev, &(struct v4l2_fract){.numerator = fps_den, >X .denominator = fps_num}); >X return len; >X } else { >X return -EINVAL; >X } >X} >Xstatic DEVICE_ATTR(format, S_IRUGO | S_IWUSR, attr_show_format, attr_store_format); >X >Xstatic ssize_t attr_show_buffers(struct device *cd, >X struct device_attribute *attr, >X char *buf) >X{ >X struct v4l2_loopback_device *dev = v4l2loopback_cd2dev(cd); >X return sprintf(buf, "%d\n", dev->used_buffers); >X} >Xstatic DEVICE_ATTR(buffers, S_IRUGO, attr_show_buffers, NULL); >X >Xstatic ssize_t attr_show_maxopeners(struct device *cd, >X struct device_attribute *attr, >X char *buf) >X{ >X struct v4l2_loopback_device *dev = v4l2loopback_cd2dev(cd); >X return sprintf(buf, "%d\n", dev->max_openers); >X} >Xstatic ssize_t attr_store_maxopeners(struct device* cd, >X struct device_attribute *attr, >X const char* buf, size_t len) >X{ >X struct v4l2_loopback_device *dev = NULL; >X unsigned long curr=0; >X >X if (kstrtoul(buf, 0, &curr)) >X return -EINVAL; >X >X dev = v4l2loopback_cd2dev(cd); >X >X if (dev->max_openers == curr) >X return len; >X >X if (dev->open_count.counter > curr) { >X /* request to limit to less openers as are currently attached to us */ >X return -EINVAL; >X } >X >X dev->max_openers = (int)curr; >X >X return len; >X} >X >X >Xstatic DEVICE_ATTR(max_openers, S_IRUGO | S_IWUSR, attr_show_maxopeners, attr_store_maxopeners); >X >X >X >X >X >Xstatic void v4l2loopback_remove_sysfs(struct video_device *vdev) >X{ >X#define V4L2_SYSFS_DESTROY(x) device_remove_file(&vdev->dev, &dev_attr_##x) >X >X if (vdev) { >X V4L2_SYSFS_DESTROY(format); >X V4L2_SYSFS_DESTROY(buffers); >X V4L2_SYSFS_DESTROY(max_openers); >X /* ... */ >X } >X} >Xstatic void v4l2loopback_create_sysfs(struct video_device *vdev) >X{ >X int res=0; >X#define V4L2_SYSFS_CREATE(x) res = device_create_file(&vdev->dev, &dev_attr_##x); if (res < 0) break >X if (!vdev) return; >X do { >X V4L2_SYSFS_CREATE(format); >X V4L2_SYSFS_CREATE(buffers); >X V4L2_SYSFS_CREATE(max_openers); >X /* ... */ >X } while(0); >X >X if (res >= 0)return; >X dev_err(&vdev->dev, "%s error: %d\n", __func__, res); >X} >X >X >X >X >X >X >X/* global module data */ >Xstruct v4l2_loopback_device *devs[MAX_DEVICES]; >X >Xstatic struct v4l2_loopback_device* >Xv4l2loopback_cd2dev (struct device*cd) >X{ >X struct video_device *loopdev = to_video_device(cd); >X priv_ptr ptr = (priv_ptr)video_get_drvdata(loopdev); >X int nr = ptr->devicenr; >X if(nr<0 || nr>=DEVICES){printk(KERN_ERR "v4l2-loopback: illegal device %d\n",nr);return NULL;} >X return devs[nr]; >X} >X >Xstatic struct v4l2_loopback_device* >Xv4l2loopback_getdevice (struct file*f) >X{ >X struct video_device *loopdev = video_devdata(f); >X priv_ptr ptr = (priv_ptr)video_get_drvdata(loopdev); >X int nr = ptr->devicenr; >X if(nr<0 || nr>=DEVICES){printk(KERN_ERR "v4l2-loopback: illegal device %d\n",nr);return NULL;} >X return devs[nr]; >X} >X >Xstatic struct v4l2_loopback_device* >Xv4l2loopback_getdevice_internal (int nr) >X{ >X if(nr<0 || nr>=DEVICES){printk(KERN_ERR "v4l2-loopback: illegal device %d\n",nr);return NULL;} >X return devs[nr]; >X} >X >X/* forward declarations */ >Xstatic void init_buffers(struct v4l2_loopback_device *dev); >Xstatic int allocate_buffers(struct v4l2_loopback_device *dev); >Xstatic int free_buffers(struct v4l2_loopback_device *dev); >Xstatic void try_free_buffers(struct v4l2_loopback_device *dev); >Xstatic int allocate_timeout_image(struct v4l2_loopback_device *dev); >Xstatic void check_timers(struct v4l2_loopback_device *dev); >Xstatic const struct v4l2_file_operations v4l2_loopback_fops; >Xstatic const struct v4l2_ioctl_ops v4l2_loopback_ioctl_ops; >X >X/* Queue helpers */ >X/* next functions sets buffer flags and adjusts counters accordingly */ >Xstatic inline void >Xset_done (struct v4l2l_buffer *buffer) >X{ >X buffer->buffer.flags &= ~V4L2_BUF_FLAG_QUEUED; >X buffer->buffer.flags |= V4L2_BUF_FLAG_DONE; >X} >X >Xstatic inline void >Xset_queued (struct v4l2l_buffer *buffer) >X{ >X buffer->buffer.flags &= ~V4L2_BUF_FLAG_DONE; >X buffer->buffer.flags |= V4L2_BUF_FLAG_QUEUED; >X} >X >Xstatic inline void >Xunset_flags (struct v4l2l_buffer *buffer) >X{ >X buffer->buffer.flags &= ~V4L2_BUF_FLAG_QUEUED; >X buffer->buffer.flags &= ~V4L2_BUF_FLAG_DONE; >X} >X/* V4L2 ioctl caps and params calls */ >X/* returns device capabilities >X * called on VIDIOC_QUERYCAP >X */ >Xstatic int >Xvidioc_querycap (struct file *file, >X void *priv, >X struct v4l2_capability *cap) >X{ >X struct v4l2_loopback_device *dev = v4l2loopback_getdevice(file); >X int devnr = ((struct v4l2loopback_private *)video_get_drvdata(dev->vdev))->devicenr; >X >X strscpy(cap->driver, "Droidcam", sizeof(cap->driver)); >X strscpy(cap->card , "Droidcam", sizeof(cap->card)); >X snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:v4l2loopback_dc-%03d", devnr); >X >X#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0) >X /* since 3.1.0, the v4l2-core system is supposed to set the version */ >X cap->version = V4L2LOOPBACK_VERSION_CODE; >X#endif >X >X cap->capabilities = >X#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0) >X V4L2_CAP_DEVICE_CAPS | >X#endif >X V4L2_CAP_VIDEO_CAPTURE | >X /*V4L2_CAP_VIDEO_OUTPUT |*/ >X V4L2_CAP_STREAMING | >X V4L2_CAP_READWRITE; >X >X#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0) >X cap->device_caps = (cap->capabilities & ~V4L2_CAP_DEVICE_CAPS); >X#endif >X >X#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0) >X cap->device_caps = cap->capabilities; >X cap->capabilities |= V4L2_CAP_DEVICE_CAPS; >X#endif >X >X memset(cap->reserved, 0, sizeof(cap->reserved)); >X >X return 0; >X} >X >Xstatic int >Xvidioc_enum_framesizes (struct file *file, void *fh, >X struct v4l2_frmsizeenum *argp) >X{ >X struct v4l2_loopback_device *dev; >X >X /* LATER: what does the index really mean? >X * if it's about enumerating formats, we can safely ignore it >X * (CHECK) >X */ >X >X /* there can be only one... */ >X if (argp->index) >X return -EINVAL; >X >X >X dev=v4l2loopback_getdevice(file); >X if (dev->ready_for_capture) { >X /* format has already been negotiated >X * cannot change during runtime >X */ >X argp->type=V4L2_FRMSIZE_TYPE_DISCRETE; >X >X argp->discrete.width=dev->pix_format.width; >X argp->discrete.height=dev->pix_format.height; >X } else { >X /* if the format has not been negotiated yet, we accept anything >X */ >X argp->type=V4L2_FRMSIZE_TYPE_CONTINUOUS; >X >X argp->stepwise.min_width=V4L2LOOPBACK_SIZE_MIN_WIDTH; >X argp->stepwise.min_height=V4L2LOOPBACK_SIZE_MIN_HEIGHT; >X >X argp->stepwise.max_width=V4L2LOOPBACK_SIZE_MAX_WIDTH; >X argp->stepwise.max_height=V4L2LOOPBACK_SIZE_MAX_HEIGHT; >X >X argp->stepwise.step_width=1; >X argp->stepwise.step_height=1; >X } >X return 0; >X} >X >X/* returns frameinterval (fps) for the set resolution >X * called on VIDIOC_ENUM_FRAMEINTERVALS >X */ >Xstatic int >Xvidioc_enum_frameintervals(struct file *file, >X void *fh, >X struct v4l2_frmivalenum *argp) >X{ >X struct v4l2_loopback_device *dev = v4l2loopback_getdevice(file); >X struct v4l2_loopback_opener *opener = file->private_data; >X >X if (dev->ready_for_capture) { >X if (opener->vidioc_enum_frameintervals_calls > 0) >X return -EINVAL; >X if (argp->width == dev->pix_format.width && >X argp->height== dev->pix_format.height) >X { >X argp->type = V4L2_FRMIVAL_TYPE_DISCRETE; >X argp->discrete = dev->capture_param.timeperframe; >X opener->vidioc_enum_frameintervals_calls++; >X return 0; >X } else { >X return -EINVAL; >X } >X } >X return 0; >X} >X >X/* ------------------ CAPTURE ----------------------- */ >X >X/* returns device formats >X * called on VIDIOC_ENUM_FMT, with v4l2_buf_type set to V4L2_BUF_TYPE_VIDEO_CAPTURE >X */ >Xstatic int >Xvidioc_enum_fmt_cap (struct file *file, >X void *fh, >X struct v4l2_fmtdesc *f) >X{ >X struct v4l2_loopback_device *dev; >X MARK(); >X >X dev=v4l2loopback_getdevice(file); >X >X if (f->index) >X return -EINVAL; >X if (dev->ready_for_capture) { >X const __u32 format = dev->pix_format.pixelformat; >X // strscpy(f->description, "current format", sizeof(f->description)); >X >X snprintf(f->description, sizeof(f->description), >X "[%c%c%c%c]", >X (format>> 0) & 0xFF, >X (format>> 8) & 0xFF, >X (format>>16) & 0xFF, >X (format>>24) & 0xFF); >X >X f->pixelformat = dev->pix_format.pixelformat; >X } else { >X return -EINVAL; >X } >X f->flags=0; >X MARK(); >X return 0; >X} >X >X/* returns current video format format fmt >X * called on VIDIOC_G_FMT, with v4l2_buf_type set to V4L2_BUF_TYPE_VIDEO_CAPTURE >X */ >Xstatic int >Xvidioc_g_fmt_cap (struct file *file, >X void *priv, >X struct v4l2_format *fmt) >X{ >X struct v4l2_loopback_device *dev; >X MARK(); >X >X dev=v4l2loopback_getdevice(file); >X >X if (!dev->ready_for_capture) { >X return -EINVAL; >X } >X >X fmt->fmt.pix = dev->pix_format; >X MARK(); >X return 0; >X} >X >X/* checks if it is OK to change to format fmt; >X * actual check is done by inner_try_fmt_cap >X * just checking that pixelformat is OK and set other parameters, app should >X * obey this decision >X * called on VIDIOC_TRY_FMT, with v4l2_buf_type set to V4L2_BUF_TYPE_VIDEO_CAPTURE >X */ >Xstatic int >Xvidioc_try_fmt_cap (struct file *file, >X void *priv, >X struct v4l2_format *fmt) >X{ >X struct v4l2_loopback_device *dev; >X >X dev=v4l2loopback_getdevice(file); >X >X if (0 == dev->ready_for_capture) { >X dprintk("setting fmt_cap not possible yet\n"); >X return -EBUSY; >X } >X >X if (fmt->fmt.pix.pixelformat != dev->pix_format.pixelformat) >X return -EINVAL; >X >X fmt->fmt.pix = dev->pix_format; >X >X do { char buf[5]; buf[4]=0; dprintk("capFOURCC=%s\n", fourcc2str(dev->pix_format.pixelformat, buf)); } while(0); >X return 0; >X} >X >X/* sets new output format, if possible >X * actually format is set by input and we even do not check it, just return >X * current one, but it is possible to set subregions of input TODO(vasaka) >X * called on VIDIOC_S_FMT, with v4l2_buf_type set to V4L2_BUF_TYPE_VIDEO_CAPTURE >X */ >Xstatic int >Xvidioc_s_fmt_cap (struct file *file, >X void *priv, >X struct v4l2_format *fmt) >X{ >X return vidioc_try_fmt_cap(file, priv, fmt); >X} >X >X >X/* ------------------ OUTPUT ----------------------- */ >X >X/* returns device formats; >X * LATER: allow all formats >X * called on VIDIOC_ENUM_FMT, with v4l2_buf_type set to V4L2_BUF_TYPE_VIDEO_OUTPUT >X */ >Xstatic int >Xvidioc_enum_fmt_out (struct file *file, >X void *fh, >X struct v4l2_fmtdesc *f) >X{ >X struct v4l2_loopback_device *dev; >X const struct v4l2l_format * fmt; >X >X dev=v4l2loopback_getdevice(file); >X >X if (dev->ready_for_capture) { >X const __u32 format = dev->pix_format.pixelformat; >X >X /* format has been fixed by the writer, so only one single format is supported */ >X if (f->index) >X return -EINVAL; >X >X fmt=format_by_fourcc(format); >X if(NULL == fmt) >X return -EINVAL; >X >X f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; >X // f->flags = ??; >X snprintf(f->description, sizeof(f->description), >X fmt->name); >X >X f->pixelformat = dev->pix_format.pixelformat; >X } else { >X __u32 format; >X /* fill in a dummy format */ >X if(f->index < 0 || >X f->index >= FORMATS) >X return -EINVAL; >X >X fmt=&formats[f->index]; >X >X f->pixelformat=fmt->fourcc; >X format = f->pixelformat; >X >X // strscpy(f->description, "dummy OUT format", sizeof(f->description)); >X snprintf(f->description, sizeof(f->description), >X fmt->name); >X >X } >X f->flags=0; >X >X return 0; >X} >X >X/* returns current video format format fmt */ >X/* NOTE: this is called from the producer >X * so if format has not been negotiated yet, >X * it should return ALL of available formats, >X * called on VIDIOC_G_FMT, with v4l2_buf_type set to V4L2_BUF_TYPE_VIDEO_OUTPUT >X */ >Xstatic int >Xvidioc_g_fmt_out (struct file *file, >X void *priv, >X struct v4l2_format *fmt) >X{ >X struct v4l2_loopback_device *dev; >X >X MARK(); >X >X if (file != NULL) { >X dev=v4l2loopback_getdevice(file); >X } >X else { >X dev = v4l2loopback_getdevice_internal(0); >X } >X >X /* >X * LATER: this should return the currently valid format >X * gstreamer doesn't like it, if this returns -EINVAL, as it >X * then concludes that there is _no_ valid format >X * CHECK whether this assumption is wrong, >X * or whether we have to always provide a valid format >X */ >X >X fmt->fmt.pix = dev->pix_format; >X return 0; >X} >X >X/* checks if it is OK to change to format fmt; >X * if format is negotiated do not change it >X * called on VIDIOC_TRY_FMT with v4l2_buf_type set to V4L2_BUF_TYPE_VIDEO_OUTPUT >X */ >Xstatic int >Xvidioc_try_fmt_out (struct file *file, >X void *priv, >X struct v4l2_format *fmt) >X{ >X struct v4l2_loopback_device *dev; >X MARK(); >X >X if (file != NULL) { >X dev=v4l2loopback_getdevice(file); >X } >X else { >X dev = v4l2loopback_getdevice_internal(0); >X } >X >X /* TODO(vasaka) loopback does not care about formats writer want to set, >X * maybe it is a good idea to restrict format somehow */ >X if (dev->ready_for_capture) { >X fmt->fmt.pix = dev->pix_format; >X } else { >X __u32 w=fmt->fmt.pix.width; >X __u32 h=fmt->fmt.pix.height; >X __u32 pixfmt=fmt->fmt.pix.pixelformat; >X const struct v4l2l_format*format=format_by_fourcc(pixfmt); >X >X if(w > V4L2LOOPBACK_SIZE_MAX_WIDTH) w=V4L2LOOPBACK_SIZE_MAX_WIDTH; >X if(h > V4L2LOOPBACK_SIZE_MAX_HEIGHT) h=V4L2LOOPBACK_SIZE_MAX_HEIGHT; >X >X dprintk("trying image %dx%d", w, h); >X >X if(w<1) w=V4L2LOOPBACK_SIZE_DEFAULT_WIDTH; >X if(h<1) h=V4L2LOOPBACK_SIZE_DEFAULT_HEIGHT; >X >X if(NULL==format) { >X format=&formats[0]; >X } >X >X pix_format_set_size(&fmt->fmt.pix, format, w, h); >X >X fmt->fmt.pix.pixelformat = format->fourcc; >X fmt->fmt.pix.colorspace=V4L2_COLORSPACE_SRGB; >X >X if(V4L2_FIELD_ANY == fmt->fmt.pix.field) >X fmt->fmt.pix.field=V4L2_FIELD_NONE; >X >X /* FIXXME: try_fmt should never modify the device-state */ >X dev->pix_format = fmt->fmt.pix; >X } >X return 0; >X} >X >X/* sets new output format, if possible; >X * allocate data here because we do not know if it will be streaming or >X * read/write IO >X * called on VIDIOC_S_FMT with v4l2_buf_type set to V4L2_BUF_TYPE_VIDEO_OUTPUT >X */ >Xstatic int >Xvidioc_s_fmt_out (struct file *file, >X void *priv, struct v4l2_format *fmt) >X{ >X struct v4l2_loopback_device *dev; >X int ret; >X MARK(); >X >X if (file != NULL) >X dev=v4l2loopback_getdevice(file); >X else >X dev=v4l2loopback_getdevice_internal(0); >X >X ret = vidioc_try_fmt_out(file, priv, fmt); >X >X dprintk("s_fmt_out(%d) %d...%d", ret, dev->ready_for_capture, dev->pix_format.sizeimage); >X >X do { >X char buf[5]; >X buf[4]=0; >X dprintk("outFOURCC=%s\n", fourcc2str(dev->pix_format.pixelformat, buf)); >X } while(0); >X >X if (ret < 0) >X return ret; >X >X if (!dev->ready_for_capture) { >X dev->buffer_size = PAGE_ALIGN(dev->pix_format.sizeimage); >X fmt->fmt.pix.sizeimage = dev->buffer_size; >X allocate_buffers(dev); >X } >X return ret; >X} >X >X//#define V4L2L_OVERLAY >X#ifdef V4L2L_OVERLAY >X/* ------------------ OVERLAY ----------------------- */ >X/* currently unsupported */ >X/* GSTreamer's v4l2sink is buggy, as it requires the overlay to work >X * while it should only require it, if overlay is requested >X * once the gstreamer element is fixed, remove the overlay dummies >X */ >X#warning OVERLAY dummies >Xstatic int >Xvidioc_g_fmt_overlay(struct file *file, >X void *priv, >X struct v4l2_format *fmt) >X{ >X return 0; >X} >Xstatic int >Xvidioc_s_fmt_overlay(struct file *file, >X void *priv, >X struct v4l2_format *fmt) >X{ >X return 0; >X} >X#endif /* V4L2L_OVERLAY */ >X >X >X/* ------------------ PARAMs ----------------------- */ >X >X/* get some data flow parameters, only capability, fps and readbuffers has >X * effect on this driver >X * called on VIDIOC_G_PARM >X */ >Xstatic int >Xvidioc_g_parm (struct file *file, >X void *priv, >X struct v4l2_streamparm *parm) >X{ >X /* do not care about type of opener, hope this enums would always be >X * compatible */ >X struct v4l2_loopback_device *dev; >X MARK(); >X >X dev=v4l2loopback_getdevice(file); >X parm->parm.capture = dev->capture_param; >X return 0; >X} >X >X/* get some data flow parameters, only capability, fps and readbuffers has >X * effect on this driver >X * called on VIDIOC_S_PARM >X */ >Xstatic int >Xvidioc_s_parm (struct file *file, >X void *priv, >X struct v4l2_streamparm *parm) >X{ >X struct v4l2_loopback_device *dev; >X MARK(); >X >X dev=v4l2loopback_getdevice(file); >X dprintk("vidioc_s_parm called frate=%d/%d\n", >X parm->parm.capture.timeperframe.numerator, >X parm->parm.capture.timeperframe.denominator); >X >X switch (parm->type) { >X case V4L2_BUF_TYPE_VIDEO_CAPTURE: >X set_timeperframe(dev, &parm->parm.capture.timeperframe); >X break; >X case V4L2_BUF_TYPE_VIDEO_OUTPUT: >X set_timeperframe(dev, &parm->parm.capture.timeperframe); >X break; >X default: >X return -1; >X } >X >X parm->parm.capture = dev->capture_param; >X return 0; >X} >X >X#ifdef V4L2LOOPBACK_WITH_STD >X/* sets a tv standard, actually we do not need to handle this any special way >X * added to support effecttv >X * called on VIDIOC_S_STD >X */ >Xstatic int >Xvidioc_s_std (struct file *file, >X void *private_data, >X v4l2_std_id *_std) >X{ >X v4l2_std_id req_std=0, supported_std=0; >X const v4l2_std_id all_std=V4L2_STD_ALL, no_std=0; >X >X if(_std) { >X req_std=*_std; >X *_std=all_std; >X } >X >X /* we support everything in V4L2_STD_ALL, but not more... */ >X supported_std=(all_std & req_std); >X if(no_std == supported_std) { >X return -EINVAL; >X } >X >X return 0; >X} >X >X >X/* gets a fake video standard >X * called on VIDIOC_G_STD >X */ >Xstatic int >Xvidioc_g_std (struct file *file, >X void *private_data, >X v4l2_std_id *norm) >X{ >X if(norm) >X *norm=V4L2_STD_ALL; >X return 0; >X} >X/* gets a fake video standard >X * called on VIDIOC_QUERYSTD >X */ >Xstatic int >Xvidioc_querystd (struct file *file, >X void *private_data, >X v4l2_std_id *norm) >X{ >X if(norm) >X *norm=V4L2_STD_ALL; >X return 0; >X} >X#endif /* V4L2LOOPBACK_WITH_STD */ >X >X >X/* get ctrls info >X * called on VIDIOC_QUERYCTRL >X */ >Xstatic int >Xvidioc_queryctrl(struct file *file, void *fh, >X struct v4l2_queryctrl *q) >X{ >X switch (q->id) { >X case CID_KEEP_FORMAT: >X case CID_SUSTAIN_FRAMERATE: >X case CID_TIMEOUT_IMAGE_IO: >X q->type = V4L2_CTRL_TYPE_BOOLEAN; >X q->minimum = 0; >X q->maximum = 1; >X q->step = 1; >X break; >X case CID_TIMEOUT: >X q->type = V4L2_CTRL_TYPE_INTEGER; >X q->minimum = 0; >X q->maximum = MAX_TIMEOUT; >X q->step = 1; >X break; >X default: >X return -EINVAL; >X } >X >X switch (q->id) { >X case CID_KEEP_FORMAT: >X strcpy(q->name, "keep_format"); >X q->default_value = 0; >X break; >X case CID_SUSTAIN_FRAMERATE: >X strcpy(q->name, "sustain_framerate"); >X q->default_value = 0; >X break; >X case CID_TIMEOUT: >X strcpy(q->name, "timeout"); >X q->default_value = 0; >X break; >X case CID_TIMEOUT_IMAGE_IO: >X strcpy(q->name, "timeout_image_io"); >X q->default_value = 0; >X break; >X default: >X BUG(); >X } >X >X memset(q->reserved, 0, sizeof(q->reserved)); >X return 0; >X} >X >X >Xstatic int >Xvidioc_g_ctrl(struct file *file, void *fh, >X struct v4l2_control *c) >X{ >X struct v4l2_loopback_device *dev = v4l2loopback_getdevice(file); >X >X switch (c->id) { >X case CID_KEEP_FORMAT: >X c->value = dev->keep_format; >X break; >X case CID_SUSTAIN_FRAMERATE: >X c->value = dev->sustain_framerate; >X break; >X case CID_TIMEOUT: >X c->value = jiffies_to_msecs(dev->timeout_jiffies); >X break; >X case CID_TIMEOUT_IMAGE_IO: >X c->value = dev->timeout_image_io; >X break; >X default: >X return -EINVAL; >X } >X >X return 0; >X} >X >X >Xstatic int >Xvidioc_s_ctrl(struct file *file, void *fh, >X struct v4l2_control *c) >X{ >X struct v4l2_loopback_device *dev = v4l2loopback_getdevice(file); >X >X switch (c->id) { >X case CID_KEEP_FORMAT: >X if (c->value < 0 || c->value > 1) >X return -EINVAL; >X dev->keep_format = c->value; >X try_free_buffers(dev); >X break; >X case CID_SUSTAIN_FRAMERATE: >X if (c->value < 0 || c->value > 1) >X return -EINVAL; >X spin_lock_bh(&dev->lock); >X dev->sustain_framerate = c->value; >X check_timers(dev); >X spin_unlock_bh(&dev->lock); >X break; >X case CID_TIMEOUT: >X if (c->value < 0 || c->value > MAX_TIMEOUT) >X return -EINVAL; >X spin_lock_bh(&dev->lock); >X dev->timeout_jiffies = msecs_to_jiffies(c->value); >X check_timers(dev); >X spin_unlock_bh(&dev->lock); >X allocate_timeout_image(dev); >X break; >X case CID_TIMEOUT_IMAGE_IO: >X if (c->value < 0 || c->value > 1) >X return -EINVAL; >X dev->timeout_image_io = c->value; >X break; >X default: >X return -EINVAL; >X } >X >X return 0; >X} >X >X >X/* returns set of device outputs, in our case there is only one >X * called on VIDIOC_ENUMOUTPUT >X */ >Xstatic int >Xvidioc_enum_output (struct file *file, >X void *fh, >X struct v4l2_output *outp) >X{ >X __u32 index=outp->index; >X MARK(); >X >X if (0!=index) { >X return -EINVAL; >X } >X >X /* clear all data (including the reserved fields) */ >X memset(outp, 0, sizeof(*outp)); >X >X outp->index = index; >X strscpy(outp->name, "loopback in", sizeof(outp->name)); >X outp->type = V4L2_OUTPUT_TYPE_ANALOG; >X outp->audioset = 0; >X outp->modulator = 0; >X outp->std = V4L2_STD_ALL; >X >X#ifdef V4L2_OUT_CAP_STD >X outp->capabilities |= V4L2_OUT_CAP_STD; >X#endif >X >X return 0; >X} >X >X/* which output is currently active, >X * called on VIDIOC_G_OUTPUT >X */ >Xstatic int >Xvidioc_g_output (struct file *file, >X void *fh, >X unsigned int *i) >X{ >X if(i) >X *i = 0; >X return 0; >X} >X >X/* set output, can make sense if we have more than one video src, >X * called on VIDIOC_S_OUTPUT >X */ >Xstatic int >Xvidioc_s_output (struct file *file, >X void *fh, >X unsigned int i) >X{ >X if(i) >X return -EINVAL; >X i=0; >X >X if (v4l2loopback_getdevice(file)->ready_for_capture) { >X return -EBUSY; >X } >X >X return 0; >X} >X >X >X/* returns set of device inputs, in our case there is only one, >X * but later I may add more >X * called on VIDIOC_ENUMINPUT >X */ >Xstatic int >Xvidioc_enum_input (struct file *file, >X void *fh, >X struct v4l2_input *inp) >X{ >X __u32 index=inp->index; >X MARK(); >X >X if (0!=index) { >X return -EINVAL; >X } >X >X if (!v4l2loopback_getdevice(file)->ready_for_capture) >X return -EINVAL; >X >X /* clear all data (including the reserved fields) */ >X memset(inp, 0, sizeof(*inp)); >X >X inp->index = index; >X strscpy(inp->name, "loopback", sizeof(inp->name)); >X inp->type = V4L2_INPUT_TYPE_CAMERA; >X inp->audioset = 0; >X inp->tuner = 0; >X inp->std = V4L2_STD_ALL; >X inp->status = 0; >X >X >X#ifdef V4L2_IN_CAP_STD >X//inp->capabilities |= V4L2_IN_CAP_STD; >X#endif >X return 0; >X} >X >X/* which input is currently active, >X * called on VIDIOC_G_INPUT >X */ >Xstatic int >Xvidioc_g_input (struct file *file, >X void *fh, >X unsigned int *i) >X{ >X if (!v4l2loopback_getdevice(file)->ready_for_capture) >X return -EINVAL; >X if(i) >X *i = 0; >X return 0; >X} >X >X/* set input, can make sense if we have more than one video src, >X * called on VIDIOC_S_INPUT >X */ >Xstatic int >Xvidioc_s_input (struct file *file, >X void *fh, >X unsigned int i) >X{ >X if ((i==0) && (v4l2loopback_getdevice(file)->ready_for_capture)) >X return 0; >X >X return -EINVAL; >X} >X >X/* --------------- V4L2 ioctl buffer related calls ----------------- */ >X >X/* negotiate buffer type >X * only mmap streaming supported >X * called on VIDIOC_REQBUFS >X */ >Xstatic int >Xvidioc_reqbufs (struct file *file, >X void *fh, >X struct v4l2_requestbuffers *b) >X{ >X struct v4l2_loopback_device *dev; >X struct v4l2_loopback_opener *opener; >X int i; >X MARK(); >X >X dev=v4l2loopback_getdevice(file); >X opener = file->private_data; >X >X dprintk("reqbufs: %d\t%d=%d", b->memory, b->count, dev->buffers_number); >X if (opener->timeout_image_io) { >X if (b->memory != V4L2_MEMORY_MMAP) >X return -EINVAL; >X b->count = 1; >X return 0; >X } >X >X init_buffers(dev); >X switch (b->memory) { >X case V4L2_MEMORY_MMAP: >X /* do nothing here, buffers are always allocated*/ >X if (0 == b->count) >X return 0; >X >X if (b->count > dev->buffers_number) >X b->count = dev->buffers_number; >X >X /* make sure that outbufs_list contains buffers from 0 to used_buffers-1 >X * actually, it will have been already populated via v4l2_loopback_init() >X * at this point */ >X if (list_empty(&dev->outbufs_list)) { >X for (i = 0; i < dev->used_buffers; ++i) >X list_add_tail(&dev->buffers[i].list_head, &dev->outbufs_list); >X } >X >X /* also, if dev->used_buffers is going to be decreased, we should remove >X * out-of-range buffers from outbufs_list, and fix bufpos2index mapping */ >X if (b->count < dev->used_buffers) { >X struct v4l2l_buffer *pos, *n; >X list_for_each_entry_safe(pos, n, &dev->outbufs_list, list_head) { >X if (pos->buffer.index >= b->count) >X list_del(&pos->list_head); >X } >X >X /* after we update dev->used_buffers, buffers in outbufs_list will >X * correspond to dev->write_position + [0;b->count-1] range */ >X i = dev->write_position; >X list_for_each_entry(pos, &dev->outbufs_list, list_head) { >X dev->bufpos2index[i % b->count] = pos->buffer.index; >X ++i; >X } >X } >X >X opener->buffers_number = b->count; >X if (opener->buffers_number < dev->used_buffers) >X dev->used_buffers = opener->buffers_number; >X return 0; >X default: >X return -EINVAL; >X } >X} >X >X/* returns buffer asked for; >X * give app as many buffers as it wants, if it less than MAX, >X * but map them in our inner buffers >X * called on VIDIOC_QUERYBUF >X */ >Xstatic int >Xvidioc_querybuf (struct file *file, >X void *fh, >X struct v4l2_buffer *b) >X{ >X enum v4l2_buf_type type ; >X int index; >X struct v4l2_loopback_device *dev; >X struct v4l2_loopback_opener *opener; >X MARK(); >X >X type = b->type; >X index = b->index; >X dev=v4l2loopback_getdevice(file); >X opener = file->private_data; >X >X if ((b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) && >X (b->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)) { >X return -EINVAL; >X } >X if (b->index > MAX_BUFFERS) >X return -EINVAL; >X >X if (opener->timeout_image_io) >X *b = dev->timeout_image_buffer.buffer; >X else >X *b = dev->buffers[b->index % dev->used_buffers].buffer; >X >X b->type = type; >X b->index = index; >X dprintkrw("buffer type: %d (of %d with size=%ld)", b->memory, dev->buffers_number, dev->buffer_size); >X return 0; >X} >X >Xstatic void >Xbuffer_written(struct v4l2_loopback_device *dev, struct v4l2l_buffer *buf) >X{ >X del_timer_sync(&dev->sustain_timer); >X del_timer_sync(&dev->timeout_timer); >X spin_lock_bh(&dev->lock); >X >X dev->bufpos2index[dev->write_position % dev->used_buffers] = buf->buffer.index; >X list_move_tail(&buf->list_head, &dev->outbufs_list); >X ++dev->write_position; >X dev->reread_count = 0; >X >X check_timers(dev); >X spin_unlock_bh(&dev->lock); >X} >X >X/* put buffer to queue >X * called on VIDIOC_QBUF >X */ >Xstatic int >Xvidioc_qbuf (struct file *file, >X void *private_data, >X struct v4l2_buffer *buf) >X{ >X struct v4l2_loopback_device *dev; >X struct v4l2_loopback_opener *opener; >X struct v4l2l_buffer *b; >X int index; >X >X dev=v4l2loopback_getdevice(file); >X opener = file->private_data; >X >X if (buf->index > MAX_BUFFERS) >X return -EINVAL; >X if (opener->timeout_image_io) >X return 0; >X >X index = buf->index % dev->used_buffers; >X b=&dev->buffers[index]; >X >X switch (buf->type) { >X case V4L2_BUF_TYPE_VIDEO_CAPTURE: >X dprintkrw("capture QBUF index: %d\n", index); >X set_queued(b); >X return 0; >X case V4L2_BUF_TYPE_VIDEO_OUTPUT: >X dprintkrw("output QBUF pos: %d index: %d\n", dev->write_position, index); >X get_timestamp(&b->buffer); >X set_done(b); >X buffer_written(dev, b); >X wake_up_all(&dev->read_event); >X return 0; >X default: >X return -EINVAL; >X } >X} >X >Xstatic int >Xcan_read(struct v4l2_loopback_device *dev, struct v4l2_loopback_opener *opener) >X{ >X int ret; >X spin_lock_bh(&dev->lock); >X check_timers(dev); >X ret = dev->write_position > opener->read_position >X || dev->reread_count > opener->reread_count >X || dev->timeout_happened; >X spin_unlock_bh(&dev->lock); >X return ret; >X} >X >Xstatic int >Xget_capture_buffer(struct file *file) >X{ >X struct v4l2_loopback_device *dev = v4l2loopback_getdevice(file); >X struct v4l2_loopback_opener *opener = file->private_data; >X int pos, ret; >X int timeout_happened; >X >X if ((file->f_flags&O_NONBLOCK) && (dev->write_position <= opener->read_position && >X dev->reread_count <= opener->reread_count && >X !dev->timeout_happened)) >X return -EAGAIN; >X wait_event_interruptible(dev->read_event, can_read(dev, opener)); >X >X spin_lock_bh(&dev->lock); >X if (dev->write_position == opener->read_position) { >X if (dev->reread_count > opener->reread_count+2) >X opener->reread_count = dev->reread_count - 1; >X ++opener->reread_count; >X pos = (opener->read_position + dev->used_buffers - 1) % dev->used_buffers; >X } else { >X opener->reread_count = 0; >X if (dev->write_position > opener->read_position+2) >X opener->read_position = dev->write_position - 1; >X pos = opener->read_position % dev->used_buffers; >X ++opener->read_position; >X } >X timeout_happened = dev->timeout_happened; >X dev->timeout_happened = 0; >X spin_unlock_bh(&dev->lock); >X >X ret = dev->bufpos2index[pos]; >X if (timeout_happened) { >X /* although allocated on-demand, timeout_image is freed only in free_buffers(), >X * so we don't need to worry about it being deallocated suddenly */ >X memcpy(dev->image + dev->buffers[ret].buffer.m.offset, dev->timeout_image, dev->buffer_size); >X } >X return ret; >X} >X >X/* put buffer to dequeue >X * called on VIDIOC_DQBUF >X */ >Xstatic int >Xvidioc_dqbuf (struct file *file, >X void *private_data, >X struct v4l2_buffer *buf) >X{ >X struct v4l2_loopback_device *dev; >X struct v4l2_loopback_opener *opener; >X int index; >X struct v4l2l_buffer *b; >X >X dev=v4l2loopback_getdevice(file); >X opener = file->private_data; >X if (opener->timeout_image_io) { >X *buf = dev->timeout_image_buffer.buffer; >X return 0; >X } >X >X switch (buf->type) { >X case V4L2_BUF_TYPE_VIDEO_CAPTURE: >X index = get_capture_buffer(file); >X if (index < 0) >X return index; >X dprintkrw("capture DQBUF pos: %d index: %d\n", opener->read_position - 1, index); >X if (!(dev->buffers[index].buffer.flags&V4L2_BUF_FLAG_MAPPED)) { >X dprintk("trying to return not mapped buf\n"); >X return -EINVAL; >X } >X unset_flags(&dev->buffers[index]); >X *buf = dev->buffers[index].buffer; >X return 0; >X case V4L2_BUF_TYPE_VIDEO_OUTPUT: >X b = list_entry(dev->outbufs_list.next, struct v4l2l_buffer, list_head); >X list_move_tail(&b->list_head, &dev->outbufs_list); >X dprintkrw("output DQBUF index: %d\n", b->buffer.index); >X unset_flags(b); >X *buf = b->buffer; >X buf->type = V4L2_BUF_TYPE_VIDEO_OUTPUT; >X return 0; >X default: >X return -EINVAL; >X } >X} >X >X/* ------------- STREAMING ------------------- */ >X >X/* start streaming >X * called on VIDIOC_STREAMON >X */ >Xstatic int >Xvidioc_streamon (struct file *file, >X void *private_data, >X enum v4l2_buf_type type) >X{ >X struct v4l2_loopback_device *dev; >X struct v4l2_loopback_opener *opener; >X int ret; >X MARK(); >X >X dev=v4l2loopback_getdevice(file); >X opener = file->private_data; >X >X switch (type) { >X case V4L2_BUF_TYPE_VIDEO_OUTPUT: >X opener->type = WRITER; >X if (!dev->ready_for_capture) { >X ret = allocate_buffers(dev); >X if (ret < 0) >X return ret; >X dev->ready_for_capture = 1; >X } >X return 0; >X case V4L2_BUF_TYPE_VIDEO_CAPTURE: >X opener->type = READER; >X if (!dev->ready_for_capture) >X return -EIO; >X return 0; >X default: >X return -EINVAL; >X } >X} >X >X/* stop streaming >X * called on VIDIOC_STREAMOFF >X */ >Xstatic int >Xvidioc_streamoff (struct file *file, >X void *private_data, >X enum v4l2_buf_type type) >X{ >X MARK(); >X dprintk("%d", type); >X return 0; >X} >X >X#ifdef CONFIG_VIDEO_V4L1_COMPAT >Xstatic int >Xvidiocgmbuf (struct file *file, >X void *fh, >X struct video_mbuf *p) >X{ >X struct v4l2_loopback_device *dev; >X MARK(); >X >X dev=v4l2loopback_getdevice(file); >X p->frames = dev->buffers_number; >X p->offsets[0] = 0; >X p->offsets[1] = 0; >X p->size = dev->buffer_size; >X return 0; >X} >X#endif >X >X/* file operations */ >Xstatic void >Xvm_open (struct vm_area_struct *vma) >X{ >X struct v4l2l_buffer *buf; >X MARK(); >X >X buf=vma->vm_private_data; >X buf->use_count++; >X} >X >Xstatic void >Xvm_close (struct vm_area_struct *vma) >X{ >X struct v4l2l_buffer *buf; >X MARK(); >X >X buf=vma->vm_private_data; >X buf->use_count--; >X} >X >Xstatic struct vm_operations_struct vm_ops = { >X .open = vm_open, >X .close = vm_close, >X}; >X >Xstatic int >Xv4l2_loopback_mmap (struct file *file, >X struct vm_area_struct *vma) >X{ >X int i; >X unsigned long addr; >X unsigned long start; >X unsigned long size; >X struct v4l2_loopback_device *dev; >X struct v4l2_loopback_opener *opener; >X struct v4l2l_buffer *buffer = NULL; >X MARK(); >X >X start = (unsigned long) vma->vm_start; >X size = (unsigned long) (vma->vm_end - vma->vm_start); >X >X dev=v4l2loopback_getdevice(file); >X opener=file->private_data; >X >X if (size > dev->buffer_size) { >X dprintk("userspace tries to mmap too much, fail\n"); >X return -EINVAL; >X } >X if (opener->timeout_image_io) { >X /* we are going to map the timeout_image_buffer */ >X if ((vma->vm_pgoff << PAGE_SHIFT) != dev->buffer_size * MAX_BUFFERS) { >X dprintk("invalid mmap offset for timeout_image_io mode\n"); >X return -EINVAL; >X } >X } else if ((vma->vm_pgoff << PAGE_SHIFT) > >X dev->buffer_size * (dev->buffers_number - 1)) { >X dprintk("userspace tries to mmap too far, fail\n"); >X return -EINVAL; >X } >X >X /* FIXXXXXME: allocation should not happen here! */ >X if(NULL==dev->image) { >X if(allocate_buffers(dev)<0) { >X return -EINVAL; >X } >X } >X >X if (opener->timeout_image_io) { >X buffer = &dev->timeout_image_buffer; >X addr = (unsigned long) dev->timeout_image; >X } else { >X for (i = 0; i < dev->buffers_number; ++i) { >X buffer = &dev->buffers[i]; >X if ((buffer->buffer.m.offset >> PAGE_SHIFT) == vma->vm_pgoff) >X break; >X } >X >X if(NULL == buffer) { >X return -EINVAL; >X } >X >X addr = (unsigned long) dev->image + (vma->vm_pgoff << PAGE_SHIFT); >X } >X >X while (size > 0) { >X struct page *page; >X >X page = (void *) vmalloc_to_page((void *) addr); >X >X if (vm_insert_page(vma, start, page) < 0) >X return -EAGAIN; >X >X start += PAGE_SIZE; >X addr += PAGE_SIZE; >X size -= PAGE_SIZE; >X } >X >X vma->vm_ops = &vm_ops; >X vma->vm_private_data = buffer; >X buffer->buffer.flags |= V4L2_BUF_FLAG_MAPPED; >X >X vm_open(vma); >X >X MARK(); >X return 0; >X} >X >Xstatic unsigned int >Xv4l2_loopback_poll (struct file *file, >X struct poll_table_struct *pts) >X{ >X struct v4l2_loopback_opener *opener; >X struct v4l2_loopback_device *dev; >X int ret_mask = 0; >X MARK(); >X >X opener = file->private_data; >X dev = v4l2loopback_getdevice(file); >X >X switch (opener->type) { >X case WRITER: >X ret_mask = POLLOUT | POLLWRNORM; >X break; >X case READER: >X poll_wait(file, &dev->read_event, pts); >X if (can_read(dev, opener)) >X ret_mask = POLLIN | POLLRDNORM; >X break; >X default: >X ret_mask = -POLLERR; >X } >X MARK(); >X >X return ret_mask; >X} >X >X/* do not want to limit device opens, it can be as many readers as user want, >X * writers are limited by means of setting writer field */ >Xstatic int >Xv4l2_loopback_open (struct file *file) >X{ >X struct v4l2_loopback_device *dev; >X struct v4l2_loopback_opener *opener; >X MARK(); >X >X dev=v4l2loopback_getdevice(file); >X >X if (dev->open_count.counter >= dev->max_openers) >X return -EBUSY; >X /* kfree on close */ >X opener = kzalloc(sizeof(*opener), GFP_KERNEL); >X if (opener == NULL) >X return -ENOMEM; >X file->private_data = opener; >X atomic_inc(&dev->open_count); >X >X opener->timeout_image_io = dev->timeout_image_io; >X dev->timeout_image_io = 0; >X >X if (opener->timeout_image_io) { >X int r = allocate_timeout_image(dev); >X if (r < 0) { >X dprintk("timeout image allocation failed\n"); >X return r; >X } >X } >X dprintk("opened dev:%p with image:%p", dev, dev?dev->image:NULL); >X // droidcam: >X { >X struct v4l2_format vid_format; >X vidioc_g_fmt_out(NULL, NULL, &vid_format); >X vid_format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; >X vid_format.fmt.pix.width = width; >X vid_format.fmt.pix.height = height; >X vid_format.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420; >X vid_format.fmt.pix.field = V4L2_FIELD_NONE; >X vid_format.fmt.pix.colorspace = V4L2_COLORSPACE_SRGB; >X if (0 != vidioc_s_fmt_out(NULL, NULL, &vid_format)) >X printk("Setting DroidCam default format FAILED!"); >X else >X dev->ready_for_capture = 1; >X } >X >X MARK(); >X return 0; >X} >X >Xstatic int >Xv4l2_loopback_close (struct file *file) >X{ >X struct v4l2_loopback_opener *opener; >X struct v4l2_loopback_device *dev; >X MARK(); >X >X opener = file->private_data; >X dev = v4l2loopback_getdevice(file); >X >X atomic_dec(&dev->open_count); >X if (dev->open_count.counter == 0) { >X del_timer_sync(&dev->sustain_timer); >X del_timer_sync(&dev->timeout_timer); >X } >X try_free_buffers(dev); >X kfree(opener); >X MARK(); >X return 0; >X} >X >Xstatic ssize_t >Xv4l2_loopback_read (struct file *file, >X char __user *buf, >X size_t count, >X loff_t *ppos) >X{ >X int read_index; >X struct v4l2_loopback_opener *opener; >X struct v4l2_loopback_device *dev; >X MARK(); >X >X opener = file->private_data; >X dev = v4l2loopback_getdevice(file); >X >X read_index = get_capture_buffer(file); >X if (count > dev->buffer_size) >X count = dev->buffer_size; >X if (copy_to_user((void *) buf, (void *) (dev->image + >X dev->buffers[read_index].buffer.m.offset), count)) { >X printk(KERN_ERR "v4l2-loopback: " >X "failed copy_from_user() in write buf\n"); >X return -EFAULT; >X } >X dprintkrw("leave v4l2_loopback_read()\n"); >X return count; >X} >X >Xstatic ssize_t >Xv4l2_loopback_write (struct file *file, >X const char __user *buf, >X size_t count, >X loff_t *ppos) >X{ >X struct v4l2_loopback_device *dev; >X int write_index; >X struct v4l2_buffer*b; >X int ret; >X MARK(); >X >X dev=v4l2loopback_getdevice(file); >X >X if (!dev->ready_for_capture) { >X ret = allocate_buffers(dev); >X if (ret < 0) >X return ret; >X dev->ready_for_capture = 1; >X } >X dprintkrw("v4l2_loopback_write() trying to write %zu bytes\n", count); >X if (count > dev->buffer_size) >X count = dev->buffer_size; >X >X write_index = dev->write_position % dev->used_buffers; >X b=&dev->buffers[write_index].buffer; >X >X if (copy_from_user((void *) (dev->image + b->m.offset), >X (void *) buf, count)) { >X printk(KERN_ERR "v4l2-loopback: " >X "failed copy_from_user() in write buf, could not write %zu\n", >X count); >X return -EFAULT; >X } >X get_timestamp(b); >X b->sequence = dev->write_position; >X buffer_written(dev, &dev->buffers[write_index]); >X wake_up_all(&dev->read_event); >X dprintkrw("leave v4l2_loopback_write()\n"); >X return count; >X} >X >X/* init functions */ >X/* frees buffers, if already allocated */ >Xstatic int free_buffers(struct v4l2_loopback_device *dev) >X{ >X MARK(); >X dprintk("freeing image@%p for dev:%p", dev?(dev->image):NULL, dev); >X if(dev->image) { >X vfree(dev->image); >X dev->image=NULL; >X } >X if(dev->timeout_image) { >X vfree(dev->timeout_image); >X dev->timeout_image=NULL; >X } >X dev->imagesize=0; >X >X return 0; >X} >X/* frees buffers, if they are no longer needed */ >Xstatic void >Xtry_free_buffers(struct v4l2_loopback_device *dev) >X{ >X MARK(); >X if (0 == dev->open_count.counter && !dev->keep_format) { >X free_buffers(dev); >X dev->ready_for_capture = 0; >X dev->buffer_size = 0; >X dev->write_position = 0; >X } >X} >X/* allocates buffers, if buffer_size is set */ >Xstatic int >Xallocate_buffers (struct v4l2_loopback_device *dev) >X{ >X MARK(); >X /* vfree on close file operation in case no open handles left */ >X if (0 == dev->buffer_size) >X return -EINVAL; >X >X if (dev->image) { >X dprintk("allocating buffers again: %ld %ld", dev->buffer_size * dev->buffers_number, dev->imagesize); >X /* FIXME: prevent double allocation more intelligently! */ >X if(dev->buffer_size * dev->buffers_number == dev->imagesize) >X return 0; >X >X /* if there is only one writer, no problem should occur */ >X if (dev->open_count.counter==1) >X free_buffers(dev); >X else >X return -EINVAL; >X } >X >X dev->imagesize=dev->buffer_size * dev->buffers_number; >X >X dprintk("allocating %ld = %ldx%d", dev->imagesize, dev->buffer_size, dev->buffers_number); >X >X dev->image = vmalloc(dev->imagesize); >X if (dev->timeout_jiffies > 0) >X allocate_timeout_image(dev); >X >X if (dev->image == NULL) >X return -ENOMEM; >X dprintk("vmallocated %ld bytes\n", >X dev->imagesize); >X MARK(); >X init_buffers(dev); >X return 0; >X} >X/* init inner buffers, they are capture mode and flags are set as >X * for capture mod buffers */ >Xstatic void >Xinit_buffers (struct v4l2_loopback_device *dev) >X{ >X int i; >X int buffer_size; >X int bytesused; >X MARK(); >X >X buffer_size=dev->buffer_size; >X bytesused = dev->pix_format.sizeimage; >X >X for (i = 0; i < dev->buffers_number; ++i) { >X struct v4l2_buffer*b=&dev->buffers[i].buffer; >X b->index = i; >X b->bytesused = bytesused; >X b->length = buffer_size; >X b->field = V4L2_FIELD_NONE; >X b->flags = 0; >X// b->input = 0; >X b->m.offset = i * buffer_size; >X b->memory = V4L2_MEMORY_MMAP; >X b->sequence = 0; >X b->timestamp.tv_sec = 0; >X b->timestamp.tv_usec = 0; >X b->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; >X >X get_timestamp(b); >X } >X dev->timeout_image_buffer = dev->buffers[0]; >X dev->timeout_image_buffer.buffer.m.offset = MAX_BUFFERS * buffer_size; >X MARK(); >X} >X >Xstatic int >Xallocate_timeout_image(struct v4l2_loopback_device *dev) >X{ >X MARK(); >X if (dev->buffer_size <= 0) >X return -EINVAL; >X >X if (dev->timeout_image == NULL) { >X dev->timeout_image = v4l2l_vzalloc(dev->buffer_size); >X if (dev->timeout_image == NULL) >X return -ENOMEM; >X } >X return 0; >X} >X >X/* fills and register video device */ >Xstatic void >Xinit_vdev (struct video_device *vdev) >X{ >X MARK(); >X strscpy(vdev->name, "Loopback video device", sizeof(vdev->name)); >X >X#if 0 >X //todo: remove V4L2_STD stuff >X vdev->tvnorms = V4L2_STD_ALL; >X vdev->current_norm = V4L2_STD_ALL; >X#endif >X >X vdev->vfl_type = VFL_TYPE_VIDEO; >X vdev->fops = &v4l2_loopback_fops; >X vdev->ioctl_ops = &v4l2_loopback_ioctl_ops; >X vdev->release = &video_device_release; >X vdev->minor = -1; >X #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) >X vdev->device_caps = >X V4L2_CAP_DEVICE_CAPS | >X V4L2_CAP_VIDEO_CAPTURE | >X V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; >X #endif >X >X /* since kernel-3.7, there is a new field 'vfl_dir' that has to be >X * set to VFL_DIR_M2M for bidrectional devices. >X * For DroidCam, this allows other programs like ffmpeg to write to >X * the device. */ >X #ifdef VFL_DIR_M2M >X vdev->vfl_dir = VFL_DIR_M2M; >X #endif >X#if DEBUG >X#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 20, 0) >X vdev->debug = V4L2_DEBUG_IOCTL | V4L2_DEBUG_IOCTL_ARG; >X#else >X vdev->dev_debug = V4L2_DEV_DEBUG_IOCTL | V4L2_DEV_DEBUG_IOCTL_ARG; >X#endif >X#endif >X MARK(); >X} >X >X/* init default capture parameters, only fps may be changed in future */ >Xstatic void >Xinit_capture_param (struct v4l2_captureparm *capture_param) >X{ >X MARK(); >X capture_param->capability = 0; >X capture_param->capturemode = 0; >X capture_param->extendedmode = 0; >X capture_param->readbuffers = MAX_BUFFERS; >X capture_param->timeperframe.numerator = 1; >X capture_param->timeperframe.denominator = 30; >X} >X >Xstatic void >Xcheck_timers(struct v4l2_loopback_device *dev) >X{ >X if (!dev->ready_for_capture) >X return; >X >X if (dev->timeout_jiffies > 0 && !timer_pending(&dev->timeout_timer)) >X mod_timer(&dev->timeout_timer, jiffies + dev->timeout_jiffies); >X if (dev->sustain_framerate && !timer_pending(&dev->sustain_timer)) >X mod_timer(&dev->sustain_timer, jiffies + dev->frame_jiffies * 3 / 2); >X} >X >X#ifdef HAVE_TIMER_SETUP >X >Xstatic void sustain_timer_clb(struct timer_list *t) >X{ >X struct v4l2_loopback_device *dev = from_timer(dev,t,sustain_timer); >X#else >X >Xstatic void sustain_timer_clb(unsigned long nr) >X{ >X struct v4l2_loopback_device *dev = devs[nr]; >X >X#endif >X >X spin_lock(&dev->lock); >X if (dev->sustain_framerate) { >X dev->reread_count++; >X dprintkrw("reread: %d %d", dev->write_position, dev->reread_count); >X if (dev->reread_count == 1) >X mod_timer(&dev->sustain_timer, jiffies + max(1UL, dev->frame_jiffies / 2)); >X else >X mod_timer(&dev->sustain_timer, jiffies + dev->frame_jiffies); >X wake_up_all(&dev->read_event); >X } >X spin_unlock(&dev->lock); >X} >X >X#ifdef HAVE_TIMER_SETUP >Xstatic void timeout_timer_clb(struct timer_list *t) >X{ >X struct v4l2_loopback_device *dev = from_timer(dev,t,timeout_timer); >X#else >X >Xstatic void timeout_timer_clb(unsigned long nr) >X{ >X struct v4l2_loopback_device *dev = devs[nr]; >X >X#endif >X spin_lock(&dev->lock); >X if (dev->timeout_jiffies > 0) { >X dev->timeout_happened = 1; >X mod_timer(&dev->timeout_timer, jiffies + dev->timeout_jiffies); >X wake_up_all(&dev->read_event); >X } >X spin_unlock(&dev->lock); >X} >X >X/* init loopback main structure */ >Xstatic int >Xv4l2_loopback_init (struct v4l2_loopback_device *dev, >X int nr) >X{ >X MARK(); >X >X { >X int ret; >X snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name), "Droidcam (v4l2loopback-%03d)", nr); >X if ((ret = v4l2_device_register(NULL, &dev->v4l2_dev))) return ret; >X } >X >X dev->vdev = video_device_alloc(); >X if (dev->vdev == NULL) { >X v4l2_device_unregister(&dev->v4l2_dev); >X return -ENOMEM; >X } >X >X video_set_drvdata(dev->vdev, kzalloc(sizeof(struct v4l2loopback_private), GFP_KERNEL)); >X if (video_get_drvdata(dev->vdev) == NULL) { >X v4l2_device_unregister(&dev->v4l2_dev); >X kfree(dev->vdev); >X return -ENOMEM; >X } >X ((priv_ptr)video_get_drvdata(dev->vdev))->devicenr = nr; >X >X init_vdev(dev->vdev); >X dev->vdev->v4l2_dev = &dev->v4l2_dev; >X init_capture_param(&dev->capture_param); >X set_timeperframe(dev, &dev->capture_param.timeperframe); >X dev->keep_format = 0; >X dev->sustain_framerate = 0; >X dev->buffers_number = MAX_BUFFERS; >X dev->used_buffers = MAX_BUFFERS; >X dev->max_openers = MAX_OPENERS; >X dev->write_position = 0; >X INIT_LIST_HEAD(&dev->outbufs_list); >X if (list_empty(&dev->outbufs_list)) { >X int i; >X for (i = 0; i < dev->used_buffers; ++i) { >X list_add_tail(&dev->buffers[i].list_head, &dev->outbufs_list); >X } >X } >X memset(dev->bufpos2index, 0, sizeof(dev->bufpos2index)); >X atomic_set(&dev->open_count, 0); >X dev->ready_for_capture = 0; >X dev->buffer_size = 0; >X dev->image = NULL; >X dev->imagesize = 0; >X >X#ifdef HAVE_TIMER_SETUP >X timer_setup(&dev->sustain_timer, sustain_timer_clb, 0); >X timer_setup(&dev->timeout_timer, timeout_timer_clb, 0); >X#else >X setup_timer(&dev->sustain_timer, sustain_timer_clb, nr); >X setup_timer(&dev->timeout_timer, timeout_timer_clb, nr); >X#endif >X dev->reread_count = 0; >X dev->timeout_jiffies = 0; >X dev->timeout_image = NULL; >X dev->timeout_happened = 0; >X >X /* FIXME set buffers to 0 */ >X >X /* Set initial format */ >X >X dev->pix_format.width = 0; /* V4L2LOOPBACK_SIZE_DEFAULT_WIDTH; */ >X dev->pix_format.height = 0; /* V4L2LOOPBACK_SIZE_DEFAULT_HEIGHT; */ >X dev->pix_format.pixelformat = formats[0].fourcc; >X dev->pix_format.colorspace = V4L2_COLORSPACE_SRGB; /* do we need to set this ? */ >X dev->pix_format.field = V4L2_FIELD_NONE; >X dev->buffer_size = PAGE_ALIGN(dev->pix_format.sizeimage); >X >X dprintk("buffer_size = %ld (=%d)\n", dev->buffer_size, dev->pix_format.sizeimage); >X allocate_buffers(dev); >X >X init_waitqueue_head(&dev->read_event); >X >X MARK(); >X return 0; >X}; >X >X/* LINUX KERNEL */ >Xstatic const struct v4l2_file_operations v4l2_loopback_fops = { >X .owner = THIS_MODULE, >X .open = v4l2_loopback_open, >X .release = v4l2_loopback_close, >X .read = v4l2_loopback_read, >X .write = v4l2_loopback_write, >X .poll = v4l2_loopback_poll, >X .mmap = v4l2_loopback_mmap, >X .unlocked_ioctl = video_ioctl2, >X}; >X >Xstatic const struct v4l2_ioctl_ops v4l2_loopback_ioctl_ops = { >X .vidioc_querycap = &vidioc_querycap, >X#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) >X .vidioc_enum_framesizes = &vidioc_enum_framesizes, >X .vidioc_enum_frameintervals = &vidioc_enum_frameintervals, >X#endif >X >X .vidioc_queryctrl = &vidioc_queryctrl, >X .vidioc_g_ctrl = &vidioc_g_ctrl, >X .vidioc_s_ctrl = &vidioc_s_ctrl, >X >X .vidioc_enum_output = &vidioc_enum_output, >X .vidioc_g_output = &vidioc_g_output, >X .vidioc_s_output = &vidioc_s_output, >X >X .vidioc_enum_input = &vidioc_enum_input, >X .vidioc_g_input = &vidioc_g_input, >X .vidioc_s_input = &vidioc_s_input, >X >X .vidioc_enum_fmt_vid_cap = &vidioc_enum_fmt_cap, >X .vidioc_g_fmt_vid_cap = &vidioc_g_fmt_cap, >X .vidioc_s_fmt_vid_cap = &vidioc_s_fmt_cap, >X .vidioc_try_fmt_vid_cap = &vidioc_try_fmt_cap, >X >X .vidioc_enum_fmt_vid_out = &vidioc_enum_fmt_out, >X .vidioc_s_fmt_vid_out = &vidioc_s_fmt_out, >X .vidioc_g_fmt_vid_out = &vidioc_g_fmt_out, >X .vidioc_try_fmt_vid_out = &vidioc_try_fmt_out, >X >X#ifdef V4L2L_OVERLAY >X .vidioc_s_fmt_vid_overlay= &vidioc_s_fmt_overlay, >X .vidioc_g_fmt_vid_overlay= &vidioc_g_fmt_overlay, >X#endif >X >X#ifdef V4L2LOOPBACK_WITH_STD >X .vidioc_s_std = &vidioc_s_std, >X .vidioc_g_std = &vidioc_g_std, >X .vidioc_querystd = &vidioc_querystd, >X#endif >X >X .vidioc_g_parm = &vidioc_g_parm, >X .vidioc_s_parm = &vidioc_s_parm, >X >X .vidioc_reqbufs = &vidioc_reqbufs, >X .vidioc_querybuf = &vidioc_querybuf, >X .vidioc_qbuf = &vidioc_qbuf, >X .vidioc_dqbuf = &vidioc_dqbuf, >X >X .vidioc_streamon = &vidioc_streamon, >X .vidioc_streamoff = &vidioc_streamoff, >X >X#ifdef CONFIG_VIDEO_V4L1_COMPAT >X .vidiocgmbuf = &vidiocgmbuf, >X#endif >X}; >X >Xstatic void >Xzero_devices (void) >X{ >X int i; >X MARK(); >X for(i=0; i<MAX_DEVICES; i++) { >X devs[i]=NULL; >X } >X} >X >Xstatic void >Xfree_devices (void) >X{ >X int i; >X MARK(); >X for(i=0; i<DEVICES; i++) { >X if(NULL!=devs[i]) { >X free_buffers(devs[i]); >X v4l2loopback_remove_sysfs(devs[i]->vdev); >X kfree(video_get_drvdata(devs[i]->vdev)); >X video_unregister_device(devs[i]->vdev); >X v4l2_device_unregister(&devs[i]->v4l2_dev); >X kfree(devs[i]); >X devs[i]=NULL; >X } >X } >X} >X >Xstatic int __init v4l2loopback_init_module(void) >X{ >X int ret; >X int i; >X MARK(); >X >X zero_devices(); >X >X /* kfree on module release */ >X for(i=0; i<DEVICES; i++) { >X dprintk("creating v4l2loopback-device #%d on device %d\n", i, video_nr); >X devs[i] = kzalloc(sizeof(*devs[i]), GFP_KERNEL); >X if (devs[i] == NULL) { >X free_devices(); >X return -ENOMEM; >X } >X ret = v4l2_loopback_init(devs[i], i); >X if (ret < 0) { >X free_devices(); >X return ret; >X } >X /* register the device -> it creates /dev/video* */ >X if (video_register_device(devs[i]->vdev, VFL_TYPE_VIDEO, video_nr) < 0) { >X video_device_release(devs[i]->vdev); >X printk(KERN_ERR "v4l2loopback: failed video_register_device()\n"); >X free_devices(); >X return -EFAULT; >X } >X v4l2loopback_create_sysfs(devs[i]->vdev); >X } >X >X dprintk("module installed\n"); >X >X printk(KERN_INFO "v4l2loopback driver version %d.%d.%d (droidcam) loaded\n", >X (V4L2LOOPBACK_VERSION_CODE >> 16) & 0xff, >X (V4L2LOOPBACK_VERSION_CODE >> 8) & 0xff, >X (V4L2LOOPBACK_VERSION_CODE ) & 0xff); >X >X return 0; >X} >X >Xstatic void v4l2loopback_cleanup_module(void) >X{ >X MARK(); >X /* unregister the device -> it deletes /dev/video* */ >X free_devices(); >X dprintk("module removed\n"); >X} >X >Xmodule_init(v4l2loopback_init_module); >Xmodule_exit(v4l2loopback_cleanup_module); >5ac21c631493e2fad4b578b59aec1d60 >echo x - droidcam/work/droidcam-2.1.3/Makefile >sed 's/^X//' >droidcam/work/droidcam-2.1.3/Makefile << 'd2b7e7d52d1302bee6bbf802e0972b06' >X# DroidCam & DroidCamX (C) 2010-2021 >X# https://github.com/dev47apps >X# >X# This program is distributed in the hope that it will be useful, >X# but WITHOUT ANY WARRANTY; without even the implied warranty of >X# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. >X# Use at your own risk. See README file for more details. >X >X# >X# Variables with ?= can be changed during invocation >X# Example: >X# APPINDICATOR=ayatana-appindicator3-0.1 make droidcam >X >X >XCC ?= gcc >XCFLAGS ?= >XAPPINDICATOR ?= appindicator3-0.1 >X >XGTK = `pkg-config --libs --cflags gtk+-3.0` `pkg-config --libs x11` >XGTK += `pkg-config --libs --cflags $(APPINDICATOR)` >XLIBAV = `pkg-config --libs --cflags libswscale libavutil` >XJPEG = `pkg-config --libs --cflags libturbojpeg` >XUSBMUXD = `pkg-config --libs --cflags libusbmuxd` >XLIBS = -lspeex -lasound -lpthread -lm >XSRC = src/connection.c src/settings.c src/decoder*.c src/av.c src/usb.c src/queue.c >X >Xifneq ($(findstring ayatana,$(APPINDICATOR)),) >X CFLAGS += -DUSE_AYATANA_APPINDICATOR >Xendif >X >XUNAME_S := $(shell uname -s) >Xifeq ($(UNAME_S),FreeBSD) >X CC ?= $(shell pkg info | grep -o '^gcc[0-9]*' | head -n 1) >X JPEG_DIR = /usr/local >X JPEG_INCLUDE = $(JPEG_DIR)/include >X JPEG_LIB = $(JPEG_DIR)/lib >X USBMUXD = -lusbmuxd-2.0 >Xendif >X >Xall: droidcam-cli droidcam >X >Xifeq "$(RELEASE)" "" >Xpackage: >X @echo "usage: RELEASE=2. make -B package" >X >Xelse >XCFLAGS += -Wall -O2 >X >XJPEG = -I/opt/libjpeg-turbo/include >XUSBMUXD = -I/opt/libimobiledevice/include >XLIBAV = -L/opt/ffmpeg4/lib -lswscale -lavutil >X >XSRC += /opt/libimobiledevice/lib/libusbmuxd.a >XSRC += /opt/libimobiledevice/lib/libplist-2.0.a >XSRC += /opt/libjpeg-turbo/lib64/libturbojpeg.a >X >X.PHONY: package >Xpackage: all >X zip "droidcam_$(RELEASE).zip" \ >X LICENSE README* icon2.png \ >X droidcam* install* uninstall* \ >X v4l2loopback/* >Xendif >X >X#src/resources.c: .gresource.xml icon2.png >X# glib-compile-resources .gresource.xml --generate-source --target=src/resources.c >X >Xdroidcam-cli: LDLIBS += $(LIBAV) $(JPEG) $(USBMUXD) $(LIBS) >Xdroidcam: LDLIBS += $(GTK) $(LIBAV) $(JPEG) $(USBMUXD) $(LIBS) >X >Xdroidcam-cli: src/droidcam-cli.c $(SRC) >X $(CC) $(CPPFLAGS) $(CFLAGS) $^ -o $@ $(LDFLAGS) $(LDLIBS) >X >Xdroidcam: src/droidcam.c src/resources.c $(SRC) >X $(CC) $(CPPFLAGS) $(CFLAGS) $^ -o $@ $(LDFLAGS) $(LDLIBS) >X >Xclean: >X rm -f droidcam >X rm -f droidcam-cli >X make -C v4l2loopback clean >d2b7e7d52d1302bee6bbf802e0972b06 >echo x - droidcam/work/droidcam-2.1.3/uninstall >sed 's/^X//' >droidcam/work/droidcam-2.1.3/uninstall << '32f54b70cb873cfd8a7865f1503ba279' >X#!/usr/bin/env bash >X# >X >Xif (lsmod | grep v4l2loopback_dc); then >X echo "Removing video device" >X rmmod v4l2loopback_dc >X rm -f /lib/modules/`uname -r`/kernel/drivers/media/video/v4l2loopback-dc.ko >Xfi >X >Xecho "Removing files" >Xsudo rm -f /usr/bin/droidcam* >Xsudo rm -f /usr/local/bin/droidcam* >Xsudo rm -f /usr/share/applications/droidcam.desktop >Xsudo xdg-desktop-menu uninstall droidcam.desktop >X >Xetc_modules() { >X # Remove droidcam reference in /etc/modules >X cat /etc/modules | egrep -v "^(videodev|v4l2loopback_dc)" > /tmp/.etc.modules >X prevperm=`stat -c %a /etc/modules` >X sudo mv /tmp/.etc.modules /etc/modules >X sudo chmod $prevperm /etc/modules >X} >X >Xecho "Cleaning DroidCam configs" >X[[ -e "/etc/modules" ]] && etc_modules >Xrm -f /etc/modprobe.d/droidcam.conf || true >Xrm -f /etc/modules-load.d/droidcam.conf || true >Xrm -rf /opt/droidcam* >Xecho "Completed" >32f54b70cb873cfd8a7865f1503ba279 >echo x - droidcam/work/droidcam-2.1.3/install.common >sed 's/^X//' >droidcam/work/droidcam-2.1.3/install.common << '3c6e62e667bc0868bb3382780c2770b4' >X#!/usr/bin/env bash >X# You should not call this directly. >X# This is supposed to be sourced from install and install-dkms scripts >X >XV4L2_LOOPBACK_DIR="v4l2loopback" >XV4L2_LOOPBACK_DC="v4l2loopback_dc" >XV4L2_LOOPBACK_KM="v4l2loopback-dc" >XV4L2_LOOPBACK_KO="${V4L2_LOOPBACK_KM}.ko" >XV4L2_LOOPBACK_VERSION="0.0.1" >XDRIVER_LOCATION="/lib/modules/`uname -r`/kernel/drivers/media/video/" >X >XWIDTH="640" >XHEIGHT="480" >X >Xcheck_if_loaded() { >X if lsmod | grep -q $V4L2_LOOPBACK_DC; then >X echo "Looks like the DroidCam driver ($V4L2_LOOPBACK_DC) is currently loaded." >X echo "Close any programs that might be using it, and press enter to try to unload." >X echo "Press Ctrl+C to cancel." >X [ -t 0 ] && read -rp "Continue?" X >X rmmod $V4L2_LOOPBACK_DC || exit 1 >X fi >X} >X >Xcheck_if_installed() { >X if [ ! -s "/opt/droidcam-uninstall" ] >X then >X echo "Error: droidcam not installed. Run 'sudo ./install-client' first." >X exit 1 >X fi >X} >X >Xcheck_module_options() { >X if [[ "$1" != "" && "$2" != "" ]] >X then >X WIDTH=$1 >X HEIGHT=$2 >X fi >X >X if [[ ! $(echo "$WIDTH" | grep -E "^[0-9]+$") || ! $(echo "$HEIGHT" | grep -E "^[0-9]+$") ]] >X then >X echo "Invalid parameters: '$WIDTH' and '$HEIGHT'" >X exit 1 >X fi >X >X if [[ $WIDTH -lt 240 || $HEIGHT -lt 160 ]] >X then >X echo "Parameters too low: '$WIDTH' and '$HEIGHT'" >X exit 1 >X fi >X >X echo "Webcam parameters: '$WIDTH' and '$HEIGHT'" >X} >X >Xadd_line() { >X conf="$1" >X line="$2" >X prevperm= >X >X if [ -f "$conf" ]; then >X cp "$conf" \ >X "/tmp/$(echo $conf|tr '/' '.')-$(cat /proc/sys/kernel/random/uuid)" >X prevperm=$(stat -c %a "$conf") >X chmod 666 "$conf" >X else >X touch "$conf" >X fi >X >X if ! grep -qE "^$line\$" "$conf" >X then >X echo "Adding $line to $conf" >X echo "$line" >> "$conf" >X fi >X >X if [ "$prevperm" != "" ]; then >X chmod $prevperm "$conf" >X fi >X} >X >Xregister_video_module_at_boot_time() { >X if [ -d "/etc/modprobe.d/" ]; then >X add_line "/etc/modprobe.d/droidcam.conf" "options $V4L2_LOOPBACK_DC width=$WIDTH height=$HEIGHT" >X fi >X >X if [ -d "/etc/modules-load.d" ]; then >X add_line "/etc/modules-load.d/droidcam.conf" "videodev" >X add_line "/etc/modules-load.d/droidcam.conf" "$V4L2_LOOPBACK_DC" >X elif [ -e "/etc/modules" ]; then >X add_line "/etc/modules" "videodev" >X add_line "/etc/modules" "$V4L2_LOOPBACK_DC" >X else >X echo "Warning: Unknown distro. Webcam module may not load after a reboot." >X fi >X}3c6e62e667bc0868bb3382780c2770b4 >echo x - droidcam/work/droidcam-2.1.3/README.md >sed 's/^X//' >droidcam/work/droidcam-2.1.3/README.md << '55bbb70710734c891f17fdbd86d7a9ac' >XLinux >X======== >X >X## Download and Install >X >XYou can download and install the latest release from the official website at https://www.dev47apps.com/droidcam/linux/, along with instructions on how to update the webcam resolution and other info. >X >XReleases are also available here on GitHub at https://github.com/dev47apps/droidcam/releases >X >XRaspberry-PI instructions can be found here: https://github.com/dev47apps/droidcam/wiki/Raspberry-PI >X >X## Building >X >XInstall the dependencies >X >X``` >XDebian/ubuntu: >Xlibavutil-dev libswscale-dev libasound2-dev libspeex-dev libusbmuxd-dev libplist-dev libturbojpeg0-dev >X >X# Only needed for GUI client >Xlibgtk-3-dev libappindicator3-dev >X >X >XFedora: >Xlibavutil-free-devel libswscale-free-devel alsa-lib-devel speex-devel libusbmuxd-devel libplist-devel turbojpeg-devel >X >X# Only needed for GUI client >Xgtk3-devel libappindicator-gtk3-devel >X``` >X >XRun `make`, or `make droidcam-cli` if you skipped installing GTK+, to build the droidcam binaries. >X >XTo install, run `sudo ./install-client` >X >X >XNote: Some distros are removing libappindicator in their latest versions (Ubuntu 21+, Fedora 33+, Debian Bullseye+), used for system tray icon. >XThe new dependency (Ubuntu) is `libayatana-appindicator3-dev` >X >XYou can specify the indicator libary to make like so: >X`APPINDICATOR=ayatana-appindicator3-0.1 make droidcam` >X >X >X## V4L2 Loopback (Webcam driver) >X >XDroidCam has its own version of v4l2loopback, `v4l2loopback-dc`, which makes the app a little more user-friendly. >XDroidCam works with the standard v4l2loopback module, so installing `v4l2loopback-dc` is optional. >X >XThe standard v4l2loopback module is already available on most distros as v4l2loopback-dkms. See [v4l2loopback usage examples](https://github.com/dev47apps/droidcam/releases/tag/v1.7). >X >XThe main differences with `v4l2loopback-dc` are that: >X* Youâll see "DroidCam" in the list of webcams. >X* It works with Skype+Chrome without the need for `exclusive_caps=1`. >X* The install scripts will configure v4l2loopback-dc to auto-load after reboot. >X >XTo use v4l2loopback-dc, make sure you have these dependencies installed >X``` >Xlinux-headers-`uname -r` gcc make >X``` >Xthen run `sudo ./install-video` to build the module and install it. >X >XDebian/Ubuntu and RHEL (Fedora/SUSE) based distros: >X[If your system supports DKMS](./README-DKMS.md), you can instead use `sudo ./install-dkms`. >X >X(note: you may need the `deb-helper` package) >X >X## Sound >X >XDroidCam can use the Linux ALSA Loopback sound card for audio. >XThere are many differences and quirks with audio on different Linux systems. >XItâs recommended you use a regular microphone and keep droidcam for video only. >X >XRun `sudo ./install-sound` to load the Linux ALSA Loopback sound card which the Droidcam client will use for audio input. >X >XTo get the mic to show up in PulseAudio you can either run `pacmd load-module module-alsa-source device=hw:Loopback,1,0` (you may need to adjust the last number), >Xor by editing /etc/pulse/default.pa [as described here](https://wiki.archlinux.org/index.php/PulseAudio/Troubleshooting#Microphone). >XOn some systems you need to do this after launching the droidcam client. >X >XIf the Loopback card takes over your line out, you can set the default PulseAudio sink as shown here: https://askubuntu.com/a/14083 >X >XTo use DroidCam with Pipewire ([Source](https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/713)) >X* Open pavucontrol, Configuration tab >X* There's probably multiple devices called "Built-in Audio", one of them is droidcam. Try with the bottom device maybe. >X* Choose the profile Pro Audio >X* Go to the Input Devices tab >X* Check which VU meter reacts to the phone's audio input (eg. Built-in Audio Pro 1), this is the desired audio input device. >X* Inside pavucontrol you can now set this device as default input or choose it as the input device for individual apps etc. >X >X >XFreeBSD >X======== >X >X## Initial considerations >X >XPlease make sure that you add your user to the webcamd group after the installation of the dependencies, this can be done by running `doas pw groupmod webcamd -m $USER` >X >XYou will also want to enable webcamd and the cuse module to load at boot for that you'll need to modify __/etc/rc.conf__ and __/boot/loader.conf__ with: >X >X>webcamd_enable="YES" >X >Xand >X >X>cuse_load="YES" >X >Xrespectively. >X >X## Getting all the necessary dependencies >X >XRun `doas pkg install gmake gcc pkgconf libjpeg-turbo usbmuxd libusbmuxd alsa-lib v4l_compat speex ffmpeg webcamd libappindicator` >X >X## Building and Installing >X >XRun `gmake`, or `gmake droidcam-cli` if you wish to only build the command line version of droidcam. >X >XTo install, run `doas ./install-client` >X >X## Running >X >XYou'll need to run `doas webcamd -B -c v4l2loopback` before launching droidcam >55bbb70710734c891f17fdbd86d7a9ac >echo x - droidcam/work/droidcam-2.1.3/droidcam-cli >sed 's/^X//' >droidcam/work/droidcam-2.1.3/droidcam-cli << '06bb31db04bbf34f20224f0a1cfc207f' >XELF >[ @øÑ@8@%#@@ @ hh¨¨ ¨ tKtKK[ [ LL¸ ¸ 00Ê 0Ê d@@¸ @¸ ððRåtd¸ ¸ ðPåtd@@ @ ôôQåtdÀÀ À HH/libexec/ld-elf.so.1FreeBSD½^FreeBSDFreeBSD. Lflsx ¤¬´»ÊÑÞäéðü&,16?FMRY`iou|¥¬¼Ïâô+<LShy~¤²ÆÞí÷"7EUjx ¥¹Òëñþ8Ur±Øú!CUoµÇÌÑØÞæíõü3C\o 0Ê `Î "¼ (È T@Ñ @Ñ Ñ B8Ñ >X >X >X >X¶3°(zM°(zMµ(z `¶(zi·(zrs >X >X >X >X >X >X >XRe-attach device and try running `adb devices` in Terminal.A: Auto-focusip=%16s >X >X >X >X >X >X >X >X >X >X >X >X >XMake sure usbmuxd service running and this computer is trusted.Usage: >X %s [options] -l <port> >X Listen on 'port' for connections (video only) >X >X %s [options] <ip> <port> >X Connect via ip >X >X %s [options] adb <port> >X Connect via adb to Android device >X >X env ANDROID_SERIAL=<serial> %s [options] adb <port> >X Connect via adb to Android device with serial number <serial> >X (use `adb devices` to find serial number) >X >X %s [options] ios <port> >X Connect via usbmuxd to iDevice >X >XOptions: >X -a Enable Audio >X -v Enable Video >X (only -v by default) >X >X -vflip Apply vertical flip >X -hflip Apply horizontal flip >X >X -nocontrols Disable controls and avoid reading from stdin. >X Otherwise, enter '?' for list of commands while streaming. >X >X -dev=PATH Specify v4l2loopback device to use, instead of first available. >X Ex: -dev=/dev/video5 >X >X -size=WxH Specify video size (when using the regular v4l2loopback module) >X Ex: 640x480, 1280x720, 1920x1080 >X >X >X >X >X >X >X >X >XTry `v4l2loopback-ctl set-caps %s "YU12:%dx%d"`, or specify a different video device >X >X >X >X >XCheck IP and Port. >XCheck network connection. >X >X >XDid it install correctly? >XIf you had a kernel update, you may need to re-install.snd_output_stdio_attach failed >X >X >X >X >Xip=%s >Xport=%d >Xaudio=%d >Xvideo=%d >Xsize=%dx%d >Xconfirm_close=%d >Xvertical_flip=%d >Xhorizontal_flip=%d >Xtype=%d >X >X >X >X >X >X >X >X >X >XIs snd_aloop loaded? >X >XMake sure usbmuxd service is installed and running.unexpected rc=%d from CheckiOSDevices() >X >X >X >X >X >XMake sure DroidCam app is open. >XTry re-attaching device.Audio: %s >X >X >X >X >X >XRe-attach device and make sure to Allow the USB debugging connection when prompted.radb_auto_start=%d >X >X >X >X >X >X >X >X >X >X >X >X >X >X >X >X >XIs the app running?CMD /v2/audioError loading devices: check if adb is installed.??size=%dx%d >X >X >X >X >X >X >X >X >X >X >X >X >Xo ¦é¿Î ºè BÆoAÿÇJ<û1öº >X >XÇ^nH=Gn59j7jèv Àt]¿}6 èA=1nÓ¿ø' ¾Ñ 1ÀèZA Dn¸ÿÿÿÿùwùu0=nèZ; ÀtÇè;»é»é nùu =êmè5= À6ÇèÊ<»édHÇEÐ5ÂmHUпΠèDøÿHcÈ¿HÊ º 1öèÇ@Ai¿XÊ º 1ö1Éè®@8i=UmtT¿d7 ¾àÐ 1Àè~@=7mu!=^mu=Fmè:» À È¿8Ê ºÀ 1ö1ÉèQ@»h¾ \ ¿èL@¾ \ ¿è=@=mt1Àèm= >Xmt1Àè =Âluèúÿÿëffff.¿ÐèF?=luí=luäÇ~lÇpl=)ht;=0htI=7htW1Û1ÀèHoH;EØ ØHÄ[A\A^A_]ÃH=Ýg1öè?=çgu·H=Ög1öèw?=àgu©H=Ïg1öè`?ëH=n l1Û¾j9 ºÎ 1Àè^>H}ÐH ÿuÿÿÿH5rnè5?édÿÿÿHßè¿è.?è>fUHåHìH9nHH$¾h+ HÇHÊIÈIÉ1Àèò=HÄ]ÃÌÌÌÌÌÌÌÌÌÌÌÌUHåAWAVATSHì°IÖA÷IüHîmHEØ¿¾ºè¶>øÿ~ÃÆEÉLçè¯>EÌfAÁÇfD}Êß¾1Ò1Àè= ÀÈß¾Â1Àèg=HÇ 0ÿÿÿHÇ 8ÿÿÿWÀ) @ÿÿÿ) Pÿÿÿ) `ÿÿÿ) pÿÿÿ)E)E)E )E°HcúÙHÓâHÁèH Å@ÿÿÿHuÈߺè>è$=8#tè=8#tè=8$ 'ßÿÇH@ÿÿÿL 0ÿÿÿ1ö1Éèì= Àß¾1Ò1Àè¤<àûß¾Â1Àè<HÇ 0ÿÿÿH0ÿÿÿß¾ÿÿºA¸è¨= Àx&H0ÿÿÿß¾ÿÿºA¸è= À¤¿ï) è=éH@lèS<D8èK<8èt=¾W: HßDúHÁ1Àèï;è*<8èS=IëOL=ÿkè<D è >X<8è3=¾9 LÿDâHÁ1Àè®;èé;8è=ëHeIßè=»ÿÿÿÿH³kH;EØuØHÄ°[A\A^A_]ÃèÆ;fDUHåAWAVATS» ö~3AÖA÷IüDúD÷Læ1ÉèÀ<H À~ A)ÇIÄE ÿàë»ÿÿÿÿØ[A\A^A_]Ãfffff.UHåÑHøHcÖÏHÆ1É]é<UHåÑHøHcÖÏHƹ@]éd<@UHåAVSÑHøHcÖÏHƹèB<Hà ÛxAÞëèÑ:E1ö8#t >XèÄ:8#uäDð[A^]ÃUHåAVSHì ÑHøHjHUèÇEÔHcÖLEØLMÔÏHƹèä;Hà ÛxAÞëèc:E1ö8#t >XèV:8#uäH:jH;EèuDðHÄ [A^]ÃèS:UHåAWAVSHìÓIöAÿHjHEàfAÁÀfDEÒÆEÑHÏèÚ:EÔHcÓLEÐDÿLö1ÉA¹è];H ÆiH;MàuHÄ[A^A_]Ãèà9UH忾º]éw:=ºbÿÿtUHåèÌ:Ç¢bÿÿÿÿ]ÃUHå]é¶:fDUHåSHìûHNiHEð=sbÿ¡H=.i¾' Ú1Àèø8ëfD¿PÃè9=OftO=7b1ö1Òè:øÿ ùè98#tËèö88#tÁèì88t·èâ88è:¿â/ HÆè¾óÿÿH=¯h»ÿÿÿÿ¾o: ºÿÿÿÿ1Àèq8éUÆEáÇEäØfÁÀfE⿾ºèS9aøÿ¬HuàǺè: À§=va¾èü9 À¢=^a¾1Ò1Àè8 ÀÈ=?a¾Â1Àèá7é¿þÿÿÃH=ëg¾o: Â1Àèµ7=a¾1Ò1Àè±7È=ø`¾Â1Àè7ëqèÃ78èì8¿ 5 ë7è°78èÙ8¿Æ5 ë$è78èÆ8¿3 ëè78è³8¿1 HÆèfòÿÿ=`ÿÿtè¦8Ç|`ÿÿÿÿ»ÿÿÿÿH@gH;Eðu ØHÄ[]Ãè\7ÌÌÌÌÌÌÌÌÌÌÌÌUHåAWAVAUATSHìHIþHgHEÐÇ Ìûÿÿ¿8 èº8HÐûÿÿ¾ºù: HßHÁ1Àè¬8¾s8 Hßè¯8HÃWÀAFAF AF,AAÇFAÇFH¸àIF$AÇF0H ÛH½Ðûÿÿ¾HÚèc8H ÀtH½ÐûÿÿHÌûÿÿ¾;* 1Àè6Mf ÌûÿÿøukH½Ðûÿÿ¾HÚè!8H ÀtHµÐûÿÿºL÷èx6AÆFH½Ðûÿÿ¾HÚèï7H ÀH½Ðûÿÿ1öº >X >X¿8 ¾¹' è.éÿÿ1ÀHÄ0[A\A^A_]à Á[¿[ËAƯÁµ[D5²[Ç[ª[H ÀIÈÁù [@AÄAÁìAÄAÑüD%~[CdHcøè0IÇH[McäLçè0Hy[Hc=V[D9çèd0He[D[D [WÀD$HÇD$ ÇD$Ç$1ÿÞDò1Éè10H*[äZ ¾ZÈ[ÑøÄ[Â[Ǽ[HéZHR[Hc·ZHÂHI[HcªZHÐH@[HÇ=[ [Ñù {[ y[Çs[HZH[Hc jZHÁH [Hc]ZHÈH[HÇ[L=MZL=¾[Ǽ[¿pÐ ¾Ð è*HcZHZH [Ç[¿pÐ ¾ Ð èg*HcØYHÀHîYH[Ç}[¿pÐ ¾°Ð è6* YzZÑøvZtZÇnZH«YHôYHc yYHÁH ëYHclYHÈHâYHÇßY¸éaýÿÿffff.UHå¿Ð èr.H3Z]ÃfUHåH=-YH ÿtè[.HÇYH=YH ÿtè?.HÇYH=YH ÿtè#.HÇðXH=ñXH ÿtè.HÇÜXH=åXH ÿtè.HÇÐXH=ÁXH ÿtèï-HǬX¿pÐ èz(¿PÐ ]éo(ffffff.UHåAVSHì0H~ZHEè_H]àL7LuØ= XtU=tXÎH=OXLEØLMàLöHÚ¹jhHÏ èp-HÄ ÀHZèh-¾I* é^H=ÿWHìHEÈHMÔLEÐLMÌLöHÚPèG-HÄ ÀïUÌú .UÔDmWMÐD gWD9 &D9É ÇCW=°W <ÿÿÿëLuØH]àH=yWD*W(W¹pÏ A¹ÐÏ LöHÚh PèÈ,HÄ Àt"HAYH=:Wè½,¾6 HßÂéH=WH ÿ§DËVHì¾Ï ºàÏ A¹°Ï 1ÉhðÏ è,Hĸ(Ï ëzHÝXH=ÖVèY,¾ª( HßÂ1Àè(H¹XH=²VèU,¾×) HßHÂ1Àès(ëdH=X¾e/ 1Àè^(ëOH=}X¾é2 1ÀèI(ë:¸ Ï H0=VHc&Vè ,H ÀyH IX¿7 ¾'ºè}*H6XH;Eèu HÄ0[A^]ÃèR(fUHåAWAVAUATSHì8HXHEÐUD4 U ÁéMÈHU¸UÉÁèEÊDuËH}ÈèáøÿÿHªUHc{UHß¾èÖ)DuÄE öÌHE¸HcÈHM¨H ÀIÈÁùHM°DqÿIÿÆE1íë&H]¨L)û¸HCÃLøAÿÅHÃD;mÄIß}¸|ÔHß1öLòèg)N<3Lÿ¾@LòèS)M÷Lÿ¾Lòè@)M÷HE°AÄfDèË*HHiÈÓMbHÊHÁê?HÁé$ÑiÉú)ÈAIÿÇAÿÌuÒé]ÿÿÿH=ÆTH ÿt-D~THÇ$ðÏ ¾Ï ºàÏ A¹°Ï 1Éè;*¸(Ï ë¸ Ï H0=.THcSTè:*H ÀxH~VH;EÐuEHÄ8[A\A]A^A_]ÃH ZVH[VH;EÐu"¿7 ¾'ºHÄ8[A\A]A^A_]és(è^&fffff.UHåºpÐ H(UH;ÙS¸PÐ HGÂH=0UHùHD öHEÂHÇHÎ]é$ffffff.UHå¿pÐ 1ö]é$ffffff.UHåH5uS¿PÐ ]éj$f.UHåS]Ã@UHå >XS]Ã@UHå ~Sùtùu1ÀùÀÀë 1ÀùÀÿÀUSøÁøÀȶÀ]Ãf.UHå.SÁÉùu >X1ÉøÁë1ÉøÁ Sá1ÀùÀ]ÃUHåâS]Ã@UHåSPHûHWHGH9ÂS~HKH<HHÒ1öHÄ[]é¼&H=eSHKHH1öèV(HcSHCHÄ[]Ã@UHåAWAVAUATSPHó Ò~}IÿAÔE1íE1öëffff.IÿÅM9åt]IkõFLþ¿Ð ºFè(Dñffffff.AÎùÅH=ÎRIcÆHC¾Ð è½' óRDñ ÀtÐëE1öE öµÔRød¦ø2=ÇDðAþrHûLÐ ½HCHùHÐ ¬1ÉHÊH÷Ò¨t/¿4K=zR¯þHcÿHiÿ ëQIøIÁè?HÁï%DÇ÷f<KHÉHÂ'@¿K5>R¯òHcöHiö ëQH÷HÁï?HÁî%þÖf4K¿TK5R¯òHcöHiö ëQH÷HÁï?HÁî%þÖftKHÁH9Èu¡é¿Ááüfn×QfpÀÂÁêHÁâ1öfpÈõfo2Áÿÿfó~3faãfräfoèfôìfpõèfpäõfôáfpüèfb÷fïÿffþfôêfpíífôâfpäífbìfÛúfúïfoåfrÔfrÕfþìòpåèópäèfpäèfýãfÖ$3HÆH9ò vÿÿÿH9Á þÿÿDðHÄ[A\A]A^A_]ÃÌÌÌÌÌÌÌÌÌÌÌUHåAWAVATSIöIÿèÚ%øtøu)LÿèØ% ÀHAÇëLÿè¿% ÀaLÿè¿%HÃH Àx^H QH9ÃA>AÇLÿè%1Û ÀpAÆHbQÇè%¾L0 HßHÂ1Àè!!DóéEûà ¦Lÿè8% ÀÃH Q¿3: ¾ºèS#éêINIFIvIVLÿè6%» ÀåAÄøàu.LÿèÙ$ ÀÿAÄH ¿P¿3: ¾ºèó"H¤PDçèÔ$¾É9 é ÛxrAÇ1ÛéÃH wP¿3: ¾ºè«"L5\Pßè$¾¯9 ëEÃH EP¿3: ¾ºèy"L5*Pßè[$¾·7 ëL5PßèF$¾30 L÷HÂ1ÀèÔØ[A\A^A_]ÃLÿ¾Ðè<$1Û ÀyâAÄøàu3LÿèÖ# Àx AÇëÅAÄH ·O¿3: ¾ºèë!HODçèÌ#¾: HßHÂ1ÀèZDãëDUHåAWAVSPIöIÿHvIVèÃ#HÃH Àx >X1ÀI;^uëaûàu+LÿèD# Ày#ÃH /O¿3: ¾ºèc!ë ÛxAÇ1Àë"L5Oßè4#¾B1 L÷HÂ1ÀèÂØHÄ[A^A_]ÃDUHåAWAVAUATSHì(HÈNHEÐHÇE°è'#HãHÀHàðH)ÃHÜH'Nè >X#Hß1öHÂè è#HãHÀHàðH)ÃHÜHNèë"Hß1öHÂè~ Le¼1ÛëfDÿÃû2h¿àÐ ¾ ºY1 Ù1Àè ¿àÐ ¾s8 è H ÀtÉIÇ¿àÐ ¾º HÁè"MæIÄLÿè E äMô~H¸LoopbackH9xMuE1íë1L=ÁMÇèò!¾«6 LÿHÂ1ÀèMôAÿÅAýPÿÿÿ¿àÐ ¾ º: ÙEè1Àèe¾àÐ H}°1Ò1Éè" ÀxLe°M ätL=çLLçLþè" À*LçLþºèü! À'LçLþ1Òè÷! À'LçLþºèï! À$LçLþºèç! ÀUÇEÌ>LçLþHUÌ1Éè×! ÀU}Ì> eºÊ LçLþLñè¿! ÀiLÿHuÀè»! ÀqHEÀHHLºÊ LçLþLñè¥! ÀcLÿHuÀHU¼è! ÀzHEÀHÊKLçLþè! ÀtL=(LÇèY ¾'9 ëRL=LÇèD ¾H4 ë=L=þKÇè/ ¾/ ë(L=éKÇè ¾5/ ëL=ÔKÇè ¾N5 LÿHÂ1ÀèH ´K¿ >X4 ¾ºèèH}°è/éêýÿÿL=KÇè¼¾Q) LÿºéL=kKÇè¾4 Lÿº>ësH=NK¾: º>Á1Àèé{ÿÿÿL=/KD%pDÇèY¾b* ë2L=KÇèD¾ã6 é:ÿÿÿL=ûJD%@DÇè%¾( LÿDâHÁ1Àè°éÿÿÿL=ÌJÇèý¾|5 éóþÿÿLu°L=HJL÷Lþè ÀxpH"JL÷Lþè ÀxaHJL÷Lþè ÀxRL÷Lþè ÀxJH'JHú ¢¿àÐ ¾ ºé( ÙEè1ÀèHE°ëe»³; ë»p1 뻺: ë»Ô7 L5JÇèAL÷HÞHÂ1ÀèÑH òI¿Ä6 ¾ºè&H}°èmÆvI1ÀH ÍIH;MÐu$HeØ[A\A]A^A_]ÃH=©I¾8 1Àèuë½èÎÌÌÌÌÌÌÌÌÌÌÌÌÌÌUHåAVSHìðH{IHEèHµÿÿÿ¿Ñ èÁ1À Éxc· ÿÿÿáðù uN¿Ñ ¾1Ò1Àèæ À7H#Iè6D0è.8èW¾* ºÑ HßDñIÀ1ÀèÍ1ÀH ôHH;MèuHÄð[A^]Ãè ffff.UHåAWAVAUATSHìxHûHµHHEÐèlLcøL¥hÿÿÿE1íëffff.D÷èØAÿÅAýct|¿Ñ ¾ º¶4 Dé1ÀèFèÑþÿÿ ÀtÕAÆf.¾Vh@D÷Lâ1ÀèøÿuèD8tßëffff. ÀxHßHuLúèí À uÿÿÿë ÆÌGA¾ÿÿÿÿHïGH;EÐuDðHÄx[A\A]A^A_]ÃèfUHåHþ¿Ñ ºè*Æ¢G]ÃUHåAWAVAUATSHì¨HÓIöAÿHGHEÐfïÀf `ÿÿÿf Pÿÿÿf @ÿÿÿf 0ÿÿÿf ÿÿÿf ÿÿÿHÇ pÿÿÿf @þÿÿf ÿÿÿf ðþÿÿf àþÿÿf Ðþÿÿf Àþÿÿf °þÿÿf þÿÿf þÿÿf þÿÿf pþÿÿf `þÿÿf PþÿÿÇ @þÿÿH 8þÿÿD*ÇÇL¥ÿÿÿ¾Vh@DÿLâ1Àènøÿuè¤8tßéÒ ÀÊfo @ÿÿÿó~Pÿÿÿft ú´ÿÿftµÿÿfÛÁf×À=ÿÿmÇ @þÿÿL¥@þÿÿfffff.DÿHÇÆVÐÀLâ1Àèìøÿu >Xè"8tÝH 8þÿÿ HþÿÿDLþÿÿH¸YU12H PþÿÿL¥@þÿÿDÿHÇÆVÐÀLâ1Àèøÿu'èÒ8tÝéÖH©Eè¼¾Ã4 éÈ À¶I¼p_formatfïÀfE°fE fEfEÇEÀHU¾$VDÀDÿ1Àè, ÀuJLm@HEH¹keep_forH1ÈHML1áH ÁE E¾$VDÀDÿLê1Àèâ Àt¾A¼ Lméffffff.èû8 ÷H@þÿÿDÿHÇÆVÐÀ1ÀèøÿtÕ ÀÒPþÿÿúYU12 HþÿÿLþÿÿ Òt É ¾H=D¾ô( 1ÀèPé²ff.AÿÄAü, De¾$VDÀDÿLê1Àè ÀuÖHEH¹keep_forH1ÈHMHºp_formatH1ÑH Áu¯EEÇE À)¾$VDÀHÆøÿÃÿHUDÿ1ÀèÀé >XHÜCèï¾+< ºÑ Hß1ÀèHÂCH;EÐ íHĨ[A\A]A^A_]ÃUuÐÁèEÐÁèEÆEH=}CHM¾f0 A¹Ñ A¸YU121ÀAUÿµ8þÿÿè1HÄëÇEHU¾$VDÀDÿ1Àè ÀI¼p_formatuRLmffffff.HEH¹keep_forH1ÈHML1áH ÁEàþÿÿÿÀE¾$VDÀDÿLê1Àèµ ÀtÁHþÿÿLþÿÿAéÿÿÿèöÌÌÌÌÌÌUHåHìH±BHEø=@5@u÷èGÁ À¸ÿÿÿÿOÁëHUð¿Î èkÔÿÿH tBH;MøuHÄ]ÃèUHåAWAVAUATSHì¸HEBHEÐWÀ)EÀ)E°)E )E)E) pÿÿÿ) `ÿÿÿ) Pÿÿÿ) @ÿÿÿ) 0ÿÿÿA???+HPÿÿÿL½(ÿÿÿë!D¿PÃèÆ??úú>ð>tÖ=?5 ?u'÷èPAÄ À.A¼ÿÿÿÿéfffff.¿Î LúècÓÿÿAÄøÿtÒ¿M3 ¾DâèÉÕÿÿ ÀWÀ)EÀ)E°)E )E)E) pÿÿÿ) `ÿÿÿ) PÿÿÿHß¾DâèÖÿÿ À1ÀëfHÿÀHø|tl¼Pÿÿÿ uí¼Qÿÿÿ >Xuã¼Rÿÿÿ uÙ¼Sÿÿÿ >XuÏø{HÀë:L-±@èÄD0è¼8èå¾ ; LïDòHÁ1Àè`é~¸|ÁðøºCÂÿÀH)HÂPÿÿÿ1ɶ4 >X~Ð@ÿ w@´ 0ÿÿÿHÿÁH9Èuã ÉuëHÈ Éuë1ÀÆ0ÿÿÿ-¹ÈfÇ0ÿÿÿ%H½0ÿÿÿè-ËÿÿDçèÖÿÿA¾0uffffff.*=(=þÿÿ¿èèÄAÿÎußéôýÿÿHÃ?H;EÐu1ÀHĸ[A\A]A^A_]ÃèÔ@=Ù<t[UHåSPë0ffffff.HÃHÇèåäÿÿHß¾èHéÿÿ=¡<tèªéÿÿH ÀuÕ¿Ðè;=<uãHÄ[]1ÀÃfUHåAWAVAUATSHì8IþH?HEÐH]°E1íf.Aþÿu=T<èÕÿÿøÿéAÆA½HcB<L<ÅÊ 1Àè7éÿÿAÄ1Àè=éÿÿ¾ ºÉ8 HßLùEàAÁ1ÀèHßÆDòèÓÿÿ ÀWÀ)EÀ)E°Hß¾ Dòè`Óÿÿ ÀHßèpßÿÿ ÀhÇ;=;Q ; Éteùu1L>¾ º< Hß¹1Àèñ Àu%ë0ff.¾ ºå9 Hß1ÀèÌ Àt HßÆDòèKÒÿÿÇ;èüçÿÿIÇHß¾Dòè©Òÿÿ ÀÁu°AwI?DòèÒÿÿ À§Lÿ1öèmçÿÿ=Æ: @ÿÿÿéff.Dm¬A¿ð/ A¼ê; ëfffff.Dm¬A¿>; A¼¥1 L-1=èD è= 8èfLïLæÚHÁ1Àèä¿8 LþèÈÿÿH]°Dm¬ë A¾ÿÿÿÿÇ":D÷ènÓÿÿ1ÀèwáÿÿE ítA¾ÿÿÿÿA½=ÿ9 ¹ýÿÿ1Àè"ÓÿÿH«<H;EÐu1ÀHÄ8[A\A]A^A_]Ãè¿ffffff.UHåAWAVAUATSHìøHe<HEÐH½ ïÿÿº1öènèÉàÿÿÇ øîÿÿH ÀêIÆ=i9t!¿@ è =R9u=Q9uÛéÂ=o9 Á5S9÷èà À%¿d; ¾ ÚèAÐÿÿ ÀÀfÇ $þÿÿÇ þÿÿH½ þÿÿ¾ÚèÐÿÿ Àûfo þÿÿf~ÀA¿à8 =-@v0 ½$þÿÿ2 A¿< A½½%þÿÿ òLµèîÿÿég¿8 ¾)4 è=ÆÿÿéôH¸127.0.0.H3w8¶ x8Hñ1H ÁLµèîÿÿèWÑÿÿ ÀÃE1íA¼L½ þÿÿA¾D@8AÿÀ¾d; ¹Î ߺ è§Ðÿÿ¿}è >X >X >X >X >X >X¿8 ¾* èÒÀÿÿÇ3Aý oÿÿÿD3AÿÀ¾i< ¹Î ߺè~ËÿÿéJÿÿÿèÄÌÌÌÌUHåǾB( ÿwHcÇH4Åð? ¿8 ]éiÀÿÿfUHåAWAVATSHìûHE5HEØ¿g3 èGA¼þÿÿÿ=ÿD¿x3 ¾s8 è7H À,IÆL½ÐþÿÿA¼ÿÿÿÿfffff.=95tL÷è ÀtéìfDAFÁèà À ÔLÿ¾Lòè®H À»¾,3 LÿèèH Àu£¾Û) LÿèÖH Àu¾ë' LÿèÄH Àu¾P: Lÿè²H Àiÿÿÿ¾¤; LÿèH À SÿÿÿL÷è{ >X >X >X >X >XHCHÀëHCL0LsHÿCHßè ÀuHÄ[A^A_]ÿû8 ë¿Ë1 ë¿5 èk¿èUHåAVSIöHûè¾ ÀuFL9sv)H{HGHCL7èHÿKH{u HÇCëE1öHßè ÀuLð[A^]ÿË1 ë¿5 èó¿èÌÌÌÌÌÌÌÌÌUHåSPHsHHHHùrÿÐHÃøëëHÄ[]ÃUHåèËÿÿÿ]ÃUHåèïºÿÿ]Ãÿ5Â)ÿ%Ä)@ÿ%Â)héàÿÿÿÿ%º)héÐÿÿÿÿ%²)héÀÿÿÿÿ%ª)hé°ÿÿÿÿ%¢)hé ÿÿÿÿ%)héÿÿÿÿ%)héÿÿÿÿ%)hépÿÿÿÿ%)hé`ÿÿÿÿ%z)h éPÿÿÿÿ%r)h >X >X)hépþÿÿÿ%)hé`þÿÿÿ%ú(héPþÿÿÿ%ò(hé@þÿÿÿ%ê(hé0þÿÿÿ%â(hé þÿÿÿ%Ú(héþÿÿÿ%Ò(héþÿÿÿ%Ê(héðýÿÿÿ%Â(h éàýÿÿÿ%º(h!éÐýÿÿÿ%²(h"éÀýÿÿÿ%ª(h#é°ýÿÿÿ%¢(h$é ýÿÿÿ%(h%éýÿÿÿ%(h&éýÿÿÿ%(h'épýÿÿÿ%(h(é`ýÿÿÿ%z(h)éPýÿÿÿ%r(h*é@ýÿÿÿ%j(h+é0ýÿÿÿ%b(h,é ýÿÿÿ%Z(h-éýÿÿÿ%R(h.éýÿÿÿ%J(h/éðüÿÿÿ%B(h0éàüÿÿÿ%:(h1éÐüÿÿÿ%2(h2éÀüÿÿÿ%*(h3é°üÿÿÿ%"(h4é üÿÿÿ%(h5éüÿÿÿ%(h6éüÿÿÿ% >X(h7épüÿÿÿ%(h8é`üÿÿÿ%ú'h9éPüÿÿÿ%ò'h:é@üÿÿÿ%ê'h;é0üÿÿÿ%â'h<é üÿÿÿ%Ú'h=éüÿÿÿ%Ò'h>éüÿÿÿ%Ê'h?éðûÿÿÿ%Â'h@éàûÿÿÿ%º'hAéÐûÿÿÿ%²'hBéÀûÿÿÿ%ª'hCé°ûÿÿÿ%¢'hDé ûÿÿÿ%'hEéûÿÿÿ%'hFéûÿÿÿ%'hGépûÿÿÿ%'hHé`ûÿÿÿ%z'hIéPûÿÿÿ%r'hJé@ûÿÿÿ%j'hKé0ûÿÿÿ%b'hLé ûÿÿÿ%Z'hMéûÿÿÿ%R'hNéûÿÿÿ%J'hOéðúÿÿÿ%B'hPéàúÿÿÿ%:'hQéÐúÿÿÿ%2'hRéÀúÿÿÿ%*'hSé°úÿÿÿ%"'hTé úÿÿÿ%'hUéúÿÿÿ%'hVéúÿÿÿ% >X'hWépúÿÿÿ%'hXé`úÿÿÿ%ú&hYéPúÿÿÿ%ò&hZé@úÿÿÿ%ê&h[é0úÿÿÿ%â&h\é úÿÿÿ%Ú&h]éúÿÿÿ%Ò&h^éúÿÿÿ%Ê&h_éðùÿÿÿ%Â&h`éàùÿÿÿ%º&haéÐùÿÿÿ%²&hbéÀùÿÿÿ%ª&hcé°ùÿÿÿ%¢&hdé ùÿÿÿ%&heéùÿÿÿ%&hféùÿÿÿ%&hgépùÿÿÿ%&hhé`ùÿÿÿ%z&hiéPùÿÿÿ%r&hjé@ùÿÿÿ%j&hké0ùÿÿÿ%b&hlé ùÿÿÿ%Z&hméùÿÿÿ%R&hnéùÿÿÿ%J&hoéðøÿÿÿ%B&hpéàøÿÿÿ%:&hqéÐøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð[ ´{ÑAVx ` Ø ° >X >X >XCUB ¸ ü£g 0¸ arÀ[ ,VËGAJ ÈIaPß[ ð[ %Vmm \ d?/Ìu µ ,a? 0¸ K\Vl[~?) ¸ »?, (¸ ,V1 >XA4È6È3KP¯ /Ã"P/usr/src/lib/csu/amd64/crtn.S/usr/obj/usr/src/amd64.amd64/lib/csu/amd64FreeBSD clang version 17.0.6 (https://github.com/llvm/llvm-project.git llvmorg-17.0.6-0-g6009708b4367)% >X >X >X$>.@B:;'4:;I 4:;IB1B.:;'<?I$>%4I:;I!I7I:;I'$> .@B:;' >X4:;I4:;IB $>U% >X >X ò= *l¬" >XL5/Xgb8û /usrsrc/lib/csu/common/crtend.c 1 >X÷= *lc5û /usr/src/lib/csu/amd64crtn.S Å ! Ñ !__do_global_ctors_aux/usr/obj/usr/src/amd64.amd64/lib/csu/amd64n__DTOR_LIST____dso_handle__CTOR_LIST__crt_funcFreeBSD clang version 17.0.6 (https://github.com/llvm/llvm-project.git llvmorg-17.0.6-0-g6009708b4367)/usr/src/lib/csu/amd64/crt1_c.c__JCR_LIST__/usr/src/lib/csu/common/crtend.ccharint/usr/src/lib/csu/common/crtbegin.c__progname__JCR_END__register_classes__CTOR_END___Jv_RegisterClasses__ARRAY_SIZE_TYPE__environ__DTOR_END__fn__do_global_dtors_auxLinker: LLD 17.0.6 (FreeBSD llvmorg-17.0.6-0-g6009708b4367-1400006)FreeBSD clang version 17.0.6 (https://github.com/llvm/llvm-project.git llvmorg-17.0.6-0-g6009708b4367)ÿÿÿÿÿÿÿÿ¼ ÿÿÿÿÿÿÿÿÈ ÿÿÿÿÿÿÿÿÅ ÿÿÿÿÿÿÿÿÑ P%,PP%,Pñÿ >X >X >X >X >X >X >X >X >X >X06bb31db04bbf34f20224f0a1cfc207f >echo x - droidcam/work/droidcam-2.1.3/install-video >sed 's/^X//' >droidcam/work/droidcam-2.1.3/install-video << 'a888fe1692ad01571faa0e3629257b8f' >X#!/usr/bin/env bash >Xset -e >X >XREPO_PATH="$(/usr/bin/dirname $([ -L $0 ] && /bin/readlink -f $0 || echo $0))" >Xsource "${REPO_PATH}/install.common" >X >Xcheck_if_installed >Xcheck_module_options "$1" "$2" >Xcheck_if_loaded >X >Xecho "Building $V4L2_LOOPBACK_KO" >Xmake -C $V4L2_LOOPBACK_DIR >X >Xif [ ! -e "$V4L2_LOOPBACK_DIR/$V4L2_LOOPBACK_KO" ] >Xthen >X echo "$V4L2_LOOPBACK_KO not built.. Failure" >X exit 1; >Xfi >X >Xset +e >Xif mokutil --sb-state | grep -qF enabled; then >X echo "Secure Boot is enabled, attempting to sign the driver" >X PRIV="/var/lib/shim-signed/mok/MOK.priv" >X PUB="/var/lib/shim-signed/mok/MOK.der" >X if [[ ! -e "$PRIV" || ! -e "$PUB" ]] >X then >X echo "please specify signing key location (or leave empty to sign manually later)" >X echo "You can Google 'secure boot' for your distro" >X echo "" >X read -rp "Enter the path of the public key: " PUB >X read -rp "Enter the path of the private key: " PRIV >X fi >X >X SIGNER_BIN="/usr/src/linux-headers-`uname -r`/scripts/sign-file" >X [ -e "$SIGNER_BIN" ] || SIGNER_BIN="/usr/src/kernels/`uname -r`/scripts/sign-file" >X [ -e "$SIGNER_BIN" ] || SIGNER_BIN="kmodsign" >X if [[ -e "$PRIV" && -e "$PUB" ]] >X then >X $SIGNER_BIN sha512 "$PRIV" "$PUB" "$V4L2_LOOPBACK_DIR/$V4L2_LOOPBACK_KO" \ >X || echo "warning: device signing failed." >X fi >Xfi >Xset -e >X >Xmkdir -p $DRIVER_LOCATION || true >X >Xecho "Copying file" >Xset -x >Xcp "$V4L2_LOOPBACK_DIR/$V4L2_LOOPBACK_KO" $DRIVER_LOCATION >Xset +x >X >Xecho "Registering webcam device" >Xmodprobe videodev >Xinsmod $DRIVER_LOCATION$V4L2_LOOPBACK_KO width=$WIDTH height=$HEIGHT || echo "warning: insmod failed" >X >Xecho "Running depmod" >Xdepmod -a >Xmake -C $V4L2_LOOPBACK_DIR clean >X >Xregister_video_module_at_boot_time >X >Xecho "Done" >a888fe1692ad01571faa0e3629257b8f >echo x - droidcam/work/droidcam-2.1.3/.gitignore >sed 's/^X//' >droidcam/work/droidcam-2.1.3/.gitignore << 'a3163166518d4ed446c5ab517ee042e8' >Xdroidcam* >X >X# vim swap files >X*.swp >a3163166518d4ed446c5ab517ee042e8 >echo x - droidcam/work/droidcam-2.1.3/droidcam.desktop >sed 's/^X//' >droidcam/work/droidcam-2.1.3/droidcam.desktop << 'e2cfaac32cd79a99531bc4371904f180' >X[Desktop Entry] >XEncoding=UTF-8 >XName=DroidCam >XComment=Use your phone as a webcam >XTryExec=/usr/local/bin/droidcam >XExec=/usr/local/bin/droidcam >XIcon=/usr/local/share/pixmaps/droidcam-icon.png >XTerminal=false >XType=Application >XCategories=Video;AudioVideo; >e2cfaac32cd79a99531bc4371904f180 >echo x - droidcam/work/droidcam-2.1.3/icon.png >sed 's/^X//' >droidcam/work/droidcam-2.1.3/icon.png << '465831d7927652b37ce61812a94dfda8' >XPNG >X >X >XOiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKKoR RB&*! J!¡ÙQÁEEÈ Q, >XØä!¢£Êûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀH3Q5©BàÇÄÆáä.@ >X$p³d!sý#ø~<<+"À¾xÓÀMÀ0ÿêB\Àt8K@zB¦@F&S `ËcbãP-`'æÓø{[! eDh;¬ÏVEX0fKÄ9Ø-0IWfH°·Àβ0Q ){`È##xFòW<ñ+®ç*x²<¹$9E[-qWW.(ÎI+6aa@.Ây24àóÌ àóýxήÎÎ6¶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³;mþ¢%îh^ u÷f²@µ éÚWópø~<<E¡¹ÙÙåääØJÄB[aÊW}þgÂ_ÀWýlù~<ü÷õà¾â$2]GøàÂÌôL¥Ï bÜæGü·ÿüÓ"ÄIb¹X*ãQqDó2¥"B)Å%Òÿdâß,û>ß5°j>{-¨]cöK'XtÀâ÷ò»oÁÔ(háÏwÿï?ýG %fIq^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁü`6B$ÄÂBB >Xdr`)¬B(Í°*`/Ô@4ÀQhp.ÂU¸=púaÁ(¼ AÈa!ÚbX# ø!ÁH$ ÉQ"K5H1RT UHò=r9\Fº;È2ü¼G1²Q=ÔµC¹¨7F¢Ðdt1 Ðr´=6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, c˱"¬«Æ°V¬»õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 QÂ'"¨K´&ºùÄb21XH,#Ö/{CÄ7$C2'¹I±¤TÒÒFÒnR#é,©4H#ÉÚdk²9, +È ääÃä3ää!ò[ >Xb@q¤øSâ(RÊjJåå4åe2AU£Rݨ¡T5ZB¡¶R¯Q¨4u9ÍIK¥¢Óhh÷i¯ètºÝNÐWÒËéGèèôw Çg(gw¯L¦ÓÇT071ëçoUX*¶*|Ê >XJ&*/T©ª¦ªÞªUóUËT©^S}®FU3Sã© Ô«UªPëSSg©;¨ªg¨oT?¤~YýYÃLÃOC¤Q ±_ã¼Æ c³x,!k «u5Ä&±ÍÙ|v*»ý»=ª©¡9C3J3W³Róf?ãqøtN ç(§ó~Þï)â)¦4L¹1e\kªX«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ >X§M=:õ®.ªk¥¡»Dw¿n§î¾^Lo§Þy½çú}/ýTýmú§õGX³$ÛÎ<Å5qo</ÇÛñQC]Ã@C¥aaá¹Ñ<£ÕFFiÆ\ã$ãmÆmÆ£&&!&KMêMîRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ5=1×2çç×ß·`ZxZ,¶¨¶¸eI²äZ¦Yn Z9Y¥XUZ]³F%Ö»»§§¹NN«Ögðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ãî½}º}ý= Ù«Z~s´r:V:ÞÎî?}Åôé/gXÏÏØ3ã¶Ë)ÄiSÓGgg¹sóKË.>.ÆÝȽäJtõq]ázÒõ³Âí¨Û¯î6îiîÜÌ4)Y3sÐÃÈCàQåÑ?0k߬~OCOgµç#/c/W×°·¥wª÷aï>ö>rã>ã<7Þ2ÞY_Ì7À·È·ËOÃo_ ßC#ÿdÿzÿѧ%gA[ûøz|!¿?:Ûeö²ÙíA ¹AAåÁ!hÈì!÷çÎÎi P~èÖÐaæaÃ~' W?pXÑ15wÑÜCsßDúDDÞg1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíóââã{/È]py¡ÎÂô §©.,:@LN8ðA*¨%òw% >XyÂÂg"/Ñ6ÑØC\*NòH*Mzì¼5y$Å3¥,å¹'©¼L LÝ:v m2=:½1qBª!M¶gêgæfvˬe ²þÅn·/Ék³¬Y- >X¶B¦èTZ(×*²geWf¿ÍÊ9«+Íí̳ÊÛ7ïÿíÂᶥKW-X潬j9²<qyÛ >Xã+V¬<¸¶*mÕO«íW®~½&zMk^ÁÊÁµkëU >Xå }ëÜ×í]OX/Yßµaú>®ÛØ(ÜxåoÊ¿Ü´©«Ä¹dÏfÒféæÞ-[ªæn ÙÚ´ ßV´íõöEÛ/Í(Û»¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®ªéøûm]NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UÆâ#pDyäé÷ ß÷ :Úv{¬áÓvg/jBòFSû[b[ºOÌ>ÑÖêÞzüGÛ4<YyJóTÉiÚéÓgòÏ}~.ùÜ`Û¢¶{çcÎßjoïºtáÒEÿç;¼;Î\ò¸tò²ÛåW¸W¯:_mêtê<þÓOÇ»»®¹\k¹îz½µ{f÷é7ÎÝô½yñÿÖÕ9=ݽózo÷Å÷õßÝ~r'ýÎË»Ùw'î¼O¼_ô@íAÙCÝÕ?[þÜØïÜjÀw óÑÜG÷ ÏþõCË ë8>99â?rýéü§CÏdÏ&þ¢þË®/~øÕë×ÎÑÑ¡ò¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧûÿóüc3-Û cHRMz%ùÿéu0ê`:o_ÅFIDATxÚÄ[l\Wÿµ÷9g®¾_7vÁ%ê4iîmR ¢T( .ê[_úB¨@BâöE<rkK ¢R @ ¨DÜ2Á8îØc{f<gfÎm_83;i %méÌÑÙk}û_{íYðÛÏã:FÍdñxÚéÿ¹1mAX×áDÀwÚFw´;ð"³ÝÒỶ[G`AÞ´#²{Ì`ÔA "Ïé<.Eªµ,ºÎX3çêÞºËncd½áFªö9ÀþÍZ}ÈBíe¶#Æ*ÅÀ,ؼªrL;[hOÜZÀ@Æé þªÌGª²Ç°^´¬û×UãÆ$HxÁϸý'®#ã åaÛ$ĺ >Xcãõwë)`6 PÛä@æÝxq&±áַ˸þ쨡F²ü£zR|]"Ú <ÙÙt+0q ¼¦ Lp×j4û{Ó/à@d¶%Jû tí³«Q¡ÏuréÜc£UD»P-¡-´E*7/þÀpÒOðdî3øvëÈ1YwäÝï¨ÇÅc+WTa²HQHL½cÓNÇl\P6üâðµ8µ ¢l¸:¹uùYËvr2$BUýbÆ> :³Fl|dÁ*βn%L@sòö «÷[Ö;·ªc;q5}£íͤt0154i6ÔØÌÑÚj#iYÝI¯oÔõ[ÆÞÄÔÁ0 È®Î5-IGdf´Æªï^·`J)Û|1çmCljÛ¢WRwzeo Ê¿Ô6TùRJö >Xuù0 ·fyAÞGCU=Å`4ÒSJ6~ >Xà~4ÿ0à ÄÚ26<D$§Lá?2Þ^ç!Ò«Ç#]Ó]M_Í!Á°roóeCÚ|$°{MøƶÛMìM7ç þWöp6¾PaN|zzøFÕ/ÿsá,ÃÛï(oöïúßU ²ÚAïKù8ÂÈÓ*ïå \=ç~1kßD8q¥°â§ðúb Ë«5,Uk_ZA¨4ªË»qöÏÎPÉ( >Xsó¸8{Z õFA!dryy)cné,èì»äÞ¾GÆGïÂP>Ì!Â(BEÐÆ æ§PòMäÚ´3P`0,¹/twDÕtêÄc¡°XÁÑ}»á >XâJA¢ÑÑB( :4ÇÞôÄ´ì;)á<?úäXïþïtüñÌùW÷ëßàéE°Æ½;pùõ4fƾéÛÐßwÓê;~4¯<ÿ's:"û 7èX4îÉ;páäãXõ}L`¹RE:åâ;Ç1<<ññؾÑØYwè+²°0`0¶Õo8æVªÏeßúø¡IñÈ[ò©¿\¸fÐÄlqÅ¥%îÍ¿ìOïOú!%AcèËDäÄ>§[®4³¬;ò«ÛòÓO¨EWàë+[WAA±gûW{>pîË?> o>ù¾_ý;ΪX¦úZ c£O}êÀé=éñû\-¶ªðaAÎ;=Ùû5G¤Øi]í~ÀèöññOðþç·Ýþ®3sË(IÀj'ó^¦?üÄ3Hb»&®@äSÛ°YÊàVûÝ}Úô(>²gêÛz2ªÍïÙ¿K _)Ãeëk0ÜÂ¥%Üy·DѺPlºû-kÔ"¿ÞjÇcÉÖ}Cvô'Þ%?Re«µú]¦Q°qÖ ÀW7ÏÖ0RiaÖZ5ÝÜê4åkÁ( X×:2±pñüéo©ýï«Õë»\#MObÅA:0Qtô`9½óm= b8.@éÐ(¼×.'µ7o^ÄøHß `½p¹T~oÕÃ÷³Ry2²\/u¥t>ÏþÏ:v×£ÊFG<;=Ò³ûYàò» Ô×Kþ_¿qú¿yÍ[ö±jý{UUÒdx_IEND®B`465831d7927652b37ce61812a94dfda8 >echo x - droidcam/work/droidcam-2.1.3/droidcam.desktop.orig >sed 's/^X//' >droidcam/work/droidcam-2.1.3/droidcam.desktop.orig << '5e9c2ef8c5de3a89f9df4c251b97f427' >X[Desktop Entry] >XEncoding=UTF-8 >XName=DroidCam >XComment=Use your phone as a webcam >XTryExec=/usr/local/bin/droidcam >XExec=/usr/local/bin/droidcam >XIcon=/opt/droidcam-icon.png >XTerminal=false >XType=Application >XCategories=Video;AudioVideo; >5e9c2ef8c5de3a89f9df4c251b97f427 >echo x - droidcam/work/droidcam-2.1.3/install-dkms >sed 's/^X//' >droidcam/work/droidcam-2.1.3/install-dkms << 'f60532f4347d235a59e47308a3d93d83' >X#!/usr/bin/env bash >X# >X# Usage: ./install-dkms [640 480] >X >Xset -e >XREPO_PATH="$(/usr/bin/dirname $([ -L $0 ] && /bin/readlink -f $0 || echo $0))" >Xsource "${REPO_PATH}/install.common" >Xcheck_if_installed >X >Xgenerate_dkms_conf() { >X local target="$*" >X cat <<EOF > "${target}" >XPACKAGE_NAME="${V4L2_LOOPBACK_DC}" >XPACKAGE_VERSION="${V4L2_LOOPBACK_VERSION}" >XCLEAN="make clean" >XMAKE[0]="make all KVERSION=$kernelver" >XBUILT_MODULE_NAME[0]="${V4L2_LOOPBACK_KM}" >XDEST_MODULE_LOCATION[0]="/updates" >XAUTOINSTALL="yes" >XEOF >X} >X >Xsetup_dkms_module() { >X # Copying module dir with name expected by dkms in /usr/src >X if [ -d "/usr/src/${V4L2_LOOPBACK_DC}-${V4L2_LOOPBACK_VERSION}" ] || [ -L "/usr/src/${V4L2_LOOPBACK_DC}-${V4L2_LOOPBACK_VERSION}" ]; then >X rm -Rf "/usr/src/${V4L2_LOOPBACK_DC}-${V4L2_LOOPBACK_VERSION}" >X fi >X cp -a "${REPO_PATH}/${V4L2_LOOPBACK_DIR}" "/usr/src/${V4L2_LOOPBACK_DC}-${V4L2_LOOPBACK_VERSION}" >X chown root:root "/usr/src/${V4L2_LOOPBACK_DC}-${V4L2_LOOPBACK_VERSION}" -R >X generate_dkms_conf "/usr/src/${V4L2_LOOPBACK_DC}-${V4L2_LOOPBACK_VERSION}/dkms.conf" >X >X dkms build -m ${V4L2_LOOPBACK_DC} -v ${V4L2_LOOPBACK_VERSION} >X dkms install -m ${V4L2_LOOPBACK_DC} -v ${V4L2_LOOPBACK_VERSION} >X if [ -f /etc/redhat-release ]; then >X dkms mkrpm -m ${V4L2_LOOPBACK_DC} -v ${V4L2_LOOPBACK_VERSION} >X elif [ -f /etc/debian_version ]; then >X dkms mkdeb -m ${V4L2_LOOPBACK_DC} -v ${V4L2_LOOPBACK_VERSION} >X else >X echo "unsupported distro" >X exit 1 >X fi >X} >X >Xcopy_uninstall_script() { >X echo "Adding uninstall script in '/opt/droidcam-uninstall'" >X mkdir -p /opt || true >X cp "${REPO_PATH}/uninstall-dkms" /opt/droidcam-uninstall >X} >X >X# Here we go >Xcheck_module_options "$1" "$2" >X >Xcopy_uninstall_script >Xsetup_dkms_module >Xregister_video_module_at_boot_time >X >X# Finally let's load the module >Xmodprobe ${V4L2_LOOPBACK_DC} >X >Xecho 'Done' >X >X >f60532f4347d235a59e47308a3d93d83 >echo x - droidcam/work/droidcam-2.1.3/LICENSE >sed 's/^X//' >droidcam/work/droidcam-2.1.3/LICENSE << 'db13feca99810091b4ad62c51f7622ca' >XGNU GENERAL PUBLIC LICENSE >X Version 2, June 1991 >X >X Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/> >X 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA >X Everyone is permitted to copy and distribute verbatim copies >X of this license document, but changing it is not allowed. >X >X Preamble >X >X The licenses for most software are designed to take away your >Xfreedom to share and change it. By contrast, the GNU General Public >XLicense is intended to guarantee your freedom to share and change free >Xsoftware--to make sure the software is free for all its users. This >XGeneral Public License applies to most of the Free Software >XFoundation's software and to any other program whose authors commit to >Xusing it. (Some other Free Software Foundation software is covered by >Xthe GNU Lesser General Public License instead.) You can apply it to >Xyour programs, too. >X >X When we speak of free software, we are referring to freedom, not >Xprice. Our General Public Licenses are designed to make sure that you >Xhave the freedom to distribute copies of free software (and charge for >Xthis service if you wish), that you receive source code or can get it >Xif you want it, that you can change the software or use pieces of it >Xin new free programs; and that you know you can do these things. >X >X To protect your rights, we need to make restrictions that forbid >Xanyone to deny you these rights or to ask you to surrender the rights. >XThese restrictions translate to certain responsibilities for you if you >Xdistribute copies of the software, or if you modify it. >X >X For example, if you distribute copies of such a program, whether >Xgratis or for a fee, you must give the recipients all the rights that >Xyou have. You must make sure that they, too, receive or can get the >Xsource code. And you must show them these terms so they know their >Xrights. >X >X We protect your rights with two steps: (1) copyright the software, and >X(2) offer you this license which gives you legal permission to copy, >Xdistribute and/or modify the software. >X >X Also, for each author's protection and ours, we want to make certain >Xthat everyone understands that there is no warranty for this free >Xsoftware. If the software is modified by someone else and passed on, we >Xwant its recipients to know that what they have is not the original, so >Xthat any problems introduced by others will not reflect on the original >Xauthors' reputations. >X >X Finally, any free program is threatened constantly by software >Xpatents. We wish to avoid the danger that redistributors of a free >Xprogram will individually obtain patent licenses, in effect making the >Xprogram proprietary. To prevent this, we have made it clear that any >Xpatent must be licensed for everyone's free use or not licensed at all. >X >X The precise terms and conditions for copying, distribution and >Xmodification follow. >X >X GNU GENERAL PUBLIC LICENSE >X TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION >X >X 0. This License applies to any program or other work which contains >Xa notice placed by the copyright holder saying it may be distributed >Xunder the terms of this General Public License. The "Program", below, >Xrefers to any such program or work, and a "work based on the Program" >Xmeans either the Program or any derivative work under copyright law: >Xthat is to say, a work containing the Program or a portion of it, >Xeither verbatim or with modifications and/or translated into another >Xlanguage. (Hereinafter, translation is included without limitation in >Xthe term "modification".) Each licensee is addressed as "you". >X >XActivities other than copying, distribution and modification are not >Xcovered by this License; they are outside its scope. The act of >Xrunning the Program is not restricted, and the output from the Program >Xis covered only if its contents constitute a work based on the >XProgram (independent of having been made by running the Program). >XWhether that is true depends on what the Program does. >X >X 1. You may copy and distribute verbatim copies of the Program's >Xsource code as you receive it, in any medium, provided that you >Xconspicuously and appropriately publish on each copy an appropriate >Xcopyright notice and disclaimer of warranty; keep intact all the >Xnotices that refer to this License and to the absence of any warranty; >Xand give any other recipients of the Program a copy of this License >Xalong with the Program. >X >XYou may charge a fee for the physical act of transferring a copy, and >Xyou may at your option offer warranty protection in exchange for a fee. >X >X 2. You may modify your copy or copies of the Program or any portion >Xof it, thus forming a work based on the Program, and copy and >Xdistribute such modifications or work under the terms of Section 1 >Xabove, provided that you also meet all of these conditions: >X >X a) You must cause the modified files to carry prominent notices >X stating that you changed the files and the date of any change. >X >X b) You must cause any work that you distribute or publish, that in >X whole or in part contains or is derived from the Program or any >X part thereof, to be licensed as a whole at no charge to all third >X parties under the terms of this License. >X >X c) If the modified program normally reads commands interactively >X when run, you must cause it, when started running for such >X interactive use in the most ordinary way, to print or display an >X announcement including an appropriate copyright notice and a >X notice that there is no warranty (or else, saying that you provide >X a warranty) and that users may redistribute the program under >X these conditions, and telling the user how to view a copy of this >X License. (Exception: if the Program itself is interactive but >X does not normally print such an announcement, your work based on >X the Program is not required to print an announcement.) >X >XThese requirements apply to the modified work as a whole. If >Xidentifiable sections of that work are not derived from the Program, >Xand can be reasonably considered independent and separate works in >Xthemselves, then this License, and its terms, do not apply to those >Xsections when you distribute them as separate works. But when you >Xdistribute the same sections as part of a whole which is a work based >Xon the Program, the distribution of the whole must be on the terms of >Xthis License, whose permissions for other licensees extend to the >Xentire whole, and thus to each and every part regardless of who wrote it. >X >XThus, it is not the intent of this section to claim rights or contest >Xyour rights to work written entirely by you; rather, the intent is to >Xexercise the right to control the distribution of derivative or >Xcollective works based on the Program. >X >XIn addition, mere aggregation of another work not based on the Program >Xwith the Program (or with a work based on the Program) on a volume of >Xa storage or distribution medium does not bring the other work under >Xthe scope of this License. >X >X 3. You may copy and distribute the Program (or a work based on it, >Xunder Section 2) in object code or executable form under the terms of >XSections 1 and 2 above provided that you also do one of the following: >X >X a) Accompany it with the complete corresponding machine-readable >X source code, which must be distributed under the terms of Sections >X 1 and 2 above on a medium customarily used for software interchange; or, >X >X b) Accompany it with a written offer, valid for at least three >X years, to give any third party, for a charge no more than your >X cost of physically performing source distribution, a complete >X machine-readable copy of the corresponding source code, to be >X distributed under the terms of Sections 1 and 2 above on a medium >X customarily used for software interchange; or, >X >X c) Accompany it with the information you received as to the offer >X to distribute corresponding source code. (This alternative is >X allowed only for noncommercial distribution and only if you >X received the program in object code or executable form with such >X an offer, in accord with Subsection b above.) >X >XThe source code for a work means the preferred form of the work for >Xmaking modifications to it. For an executable work, complete source >Xcode means all the source code for all modules it contains, plus any >Xassociated interface definition files, plus the scripts used to >Xcontrol compilation and installation of the executable. However, as a >Xspecial exception, the source code distributed need not include >Xanything that is normally distributed (in either source or binary >Xform) with the major components (compiler, kernel, and so on) of the >Xoperating system on which the executable runs, unless that component >Xitself accompanies the executable. >X >XIf distribution of executable or object code is made by offering >Xaccess to copy from a designated place, then offering equivalent >Xaccess to copy the source code from the same place counts as >Xdistribution of the source code, even though third parties are not >Xcompelled to copy the source along with the object code. >X >X 4. You may not copy, modify, sublicense, or distribute the Program >Xexcept as expressly provided under this License. Any attempt >Xotherwise to copy, modify, sublicense or distribute the Program is >Xvoid, and will automatically terminate your rights under this License. >XHowever, parties who have received copies, or rights, from you under >Xthis License will not have their licenses terminated so long as such >Xparties remain in full compliance. >X >X 5. You are not required to accept this License, since you have not >Xsigned it. However, nothing else grants you permission to modify or >Xdistribute the Program or its derivative works. These actions are >Xprohibited by law if you do not accept this License. Therefore, by >Xmodifying or distributing the Program (or any work based on the >XProgram), you indicate your acceptance of this License to do so, and >Xall its terms and conditions for copying, distributing or modifying >Xthe Program or works based on it. >X >X 6. Each time you redistribute the Program (or any work based on the >XProgram), the recipient automatically receives a license from the >Xoriginal licensor to copy, distribute or modify the Program subject to >Xthese terms and conditions. You may not impose any further >Xrestrictions on the recipients' exercise of the rights granted herein. >XYou are not responsible for enforcing compliance by third parties to >Xthis License. >X >X 7. If, as a consequence of a court judgment or allegation of patent >Xinfringement or for any other reason (not limited to patent issues), >Xconditions are imposed on you (whether by court order, agreement or >Xotherwise) that contradict the conditions of this License, they do not >Xexcuse you from the conditions of this License. If you cannot >Xdistribute so as to satisfy simultaneously your obligations under this >XLicense and any other pertinent obligations, then as a consequence you >Xmay not distribute the Program at all. For example, if a patent >Xlicense would not permit royalty-free redistribution of the Program by >Xall those who receive copies directly or indirectly through you, then >Xthe only way you could satisfy both it and this License would be to >Xrefrain entirely from distribution of the Program. >X >XIf any portion of this section is held invalid or unenforceable under >Xany particular circumstance, the balance of the section is intended to >Xapply and the section as a whole is intended to apply in other >Xcircumstances. >X >XIt is not the purpose of this section to induce you to infringe any >Xpatents or other property right claims or to contest validity of any >Xsuch claims; this section has the sole purpose of protecting the >Xintegrity of the free software distribution system, which is >Ximplemented by public license practices. Many people have made >Xgenerous contributions to the wide range of software distributed >Xthrough that system in reliance on consistent application of that >Xsystem; it is up to the author/donor to decide if he or she is willing >Xto distribute software through any other system and a licensee cannot >Ximpose that choice. >X >XThis section is intended to make thoroughly clear what is believed to >Xbe a consequence of the rest of this License. >X >X 8. If the distribution and/or use of the Program is restricted in >Xcertain countries either by patents or by copyrighted interfaces, the >Xoriginal copyright holder who places the Program under this License >Xmay add an explicit geographical distribution limitation excluding >Xthose countries, so that distribution is permitted only in or among >Xcountries not thus excluded. In such case, this License incorporates >Xthe limitation as if written in the body of this License. >X >X 9. The Free Software Foundation may publish revised and/or new versions >Xof the General Public License from time to time. Such new versions will >Xbe similar in spirit to the present version, but may differ in detail to >Xaddress new problems or concerns. >X >XEach version is given a distinguishing version number. If the Program >Xspecifies a version number of this License which applies to it and "any >Xlater version", you have the option of following the terms and conditions >Xeither of that version or of any later version published by the Free >XSoftware Foundation. If the Program does not specify a version number of >Xthis License, you may choose any version ever published by the Free Software >XFoundation. >X >X 10. If you wish to incorporate parts of the Program into other free >Xprograms whose distribution conditions are different, write to the author >Xto ask for permission. For software which is copyrighted by the Free >XSoftware Foundation, write to the Free Software Foundation; we sometimes >Xmake exceptions for this. Our decision will be guided by the two goals >Xof preserving the free status of all derivatives of our free software and >Xof promoting the sharing and reuse of software generally. >X >X NO WARRANTY >X >X 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY >XFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN >XOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES >XPROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED >XOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF >XMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS >XTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE >XPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, >XREPAIR OR CORRECTION. >X >X 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING >XWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR >XREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, >XINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING >XOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED >XTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY >XYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER >XPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE >XPOSSIBILITY OF SUCH DAMAGES. >X >X END OF TERMS AND CONDITIONS >db13feca99810091b4ad62c51f7622ca >echo x - droidcam/work/droidcam-2.1.3/install-sound >sed 's/^X//' >droidcam/work/droidcam-2.1.3/install-sound << 'f6d7589edd97d927c7e9f6562ce391ec' >X#!/usr/bin/env bash >X# >XREPO_PATH="$(/usr/bin/dirname $([ -L $0 ] && /bin/readlink -f $0 || echo $0))" >Xsource "${REPO_PATH}/install.common" >X >Xcheck_if_installed >X >Xecho "Loading Loopback device" >Xmodprobe snd-aloop || exit 1 >X >XLOOPBACK_CARD_ID=$(grep -F "[Loopback" < /proc/asound/cards | awk '{print $1}') >Xif [[ ! $(echo "$LOOPBACK_CARD_ID" | grep -E "^[0-9]$") ]] >Xthen >X echo "Error: Could not determine Loopback card number" >X exit 1 >Xfi >X >Xif [ -d "/etc/modprobe.d/" ]; then >X add_line "/etc/modprobe.d/droidcam.conf" "options snd-aloop index=$LOOPBACK_CARD_ID" >Xfi >X >Xif [ -d "/etc/modules-load.d" ]; then >X add_line "/etc/modules-load.d/droidcam.conf" "snd-aloop" >Xelif [ -e "/etc/modules" ]; then >X add_line "/etc/modules" "snd-aloop" >Xelse >X echo "Warning: Unknown distro. Sound card may not load after a reboot." >Xfi >X >Xecho "Done" >Xecho "Use 'pacmd load-module module-alsa-source device=hw:Loopback,1,0' to load the card into PulseAudio while droidcam is running"f6d7589edd97d927c7e9f6562ce391ec >echo x - droidcam/work/droidcam-2.1.3/install-client >sed 's/^X//' >droidcam/work/droidcam-2.1.3/install-client << '4f7f9031620dc56b6c05161453e52e2f' >X#!/usr/bin/env bash >Xset -e >X >Xif [ -z "$SUDO_USER" ]; then >X USER_HOME=~ >Xelse >X USER_HOME=$(getent passwd "$SUDO_USER" | cut -d: -f6) >Xfi >X >X[ -d /opt ] || mkdir -p /opt >X[ -d "$USER_HOME/.config" ] || mkdir -p "$USER_HOME/.config" >X >X# remove old settings >Xif [ -f "$USER_HOME/.droidcam/settings" ]; then >X mv "$USER_HOME/.droidcam/settings" "$USER_HOME/.config/droidcam" >X rm -rf "$USER_HOME/.droidcam" >Xfi >X# remove old-old binaries >Xrm -f /usr/bin/droidcam* >X >Xecho "Copying files" >Xset -x >Xcp uninstall /opt/droidcam-uninstall >Xcp icon2.png /opt/droidcam-icon.png >Xcp droidcam /usr/local/bin/ >Xcp droidcam-cli /usr/local/bin/ >Xset +x >Xif [ "$(command -v xdg-desktop-menu)" != "" ]; then >X xdg-desktop-menu install --novendor droidcam.desktop >Xfi >Xecho "Done" >4f7f9031620dc56b6c05161453e52e2f >echo x - droidcam/work/droidcam-2.1.3/droidcam >sed 's/^X//' >droidcam/work/droidcam-2.1.3/droidcam << '86de9216ad56ea4e98a4b82d8040644b' >XELF >Ð @È@8@'%@@ @ hh¨¨ ¨ ÌrÌrÐrÐ Ð ``PÓPó Pó ``°Ö°!°!h4Óó ó RåtdPÓPó Pó `°PåtdPePe Pe LLQåtdÀÀ À HH/libexec/ld-elf.so.1FreeBSD½^FreeBSDFreeBSD. BYn}Òßè÷/Gey »Èåû!.@\u ¥Ñé #?Mn¸ÌÕè =Tm®Êãú >X 3;Pm³ºÊÛú(/;AIQXcjs{¢©®µ¼ÂÈÏàø.@Naw´ÅÊÚäðþ*9CRX]n¡¶ÄÑäñ 7 = J ` ¡ ¾ Ý ý $ >X >X >X >X >X >X >X >X >X¶°(z °(zµ(z¬¶(z >X >X >X >X >X!I >X!J >X!K >X!L >X!M( >X!N0 >X!O8 >X!P@ >X!QH >X!RP >X!SX >X!T` >X!Uh >X!Vp >X!Wx >X!X >X!Y >X!Z >X![ >X!\ >X!]¨ >X!^° >X!_¸ >X!`À >X!aÈ >X!bÐ >X!cØ >X!dà >X!eè >X!fð >X!gø >X!h!i!j!k!l !m(!n0!o8!p@!qH!rP!sX!t`!uh!vp!wx!x!y!z!{!| !}¨!~°!¸!À!È!Ð!Ø!à! è!ð!ø!!!!! !(!0!8!@!H!P!X!`!h!p!x!!!!! !¨!°!¸! À!¡È!¢Ð!£Ø!¤à!¥è!¦ð!§ø!¨ !© !ª !«PrepareInvalid connection modewaiting on port %d..horizontal_flip=%d >X >X >X >XRe-attach device and try running `adb devices` in Terminal.autodaylightDroidCam ClientBoth Audio and Video are disabled127.0.0.1ip=%16s >X >X >X >X >X >X >X >X >X >X >X >X >XMake sure usbmuxd service running and this computer is trusted.incandescentError creating decoder!Access type not available for playback: %s >X >X >X >X >X >XTry `v4l2loopback-ctl set-caps %s "YU12:%dx%d"`, or specify a different video device >X >X >X >X >XCheck IP and Port. >XCheck network connection. >X >X >XDid it install correctly? >XIf you had a kernel update, you may need to re-install.snd_output_stdio_attach failed >X >X >X >X >Xip=%s >Xport=%d >Xaudio=%d >Xvideo=%d >Xsize=%dx%d >Xconfirm_close=%d >Xvertical_flip=%d >Xhorizontal_flip=%d >Xtype=%d >X >X >X >X >X >X >X >X >X >XIs snd_aloop loaded? >X >XMake sure usbmuxd service is installed and running.unexpected rc=%d from CheckiOSDevices() >X >X >X >X >X >XMake sure DroidCam app is open. >XTry re-attaching device.%dAudio: %s >X >X >X >X >X >XRe-attach device and make sure to Allow the USB debugging connection when prompted.Connection will be lost.radb_auto_start=%d >X >X >X >X >X >X >X >X >X >X >X >X >X >X >X >XIs the app running?CMD /v2/audioError loading devices: check if adb is installed.??DaylightHidesize=%dx%d >X >X >X >X -dev=PATH Specify v4l2loopback device to use, instead of first available. >X Ex: /dev/video5 >X >X -size=WxH Specify video size (when using the regular v4l2loopback module) >X Ex: 640x480, 1280x720, 1920x1080 >X >X >X >X >X >X¯´ûy Ðÿ/åË1T¡°üüÞáÂõ|{bò/g@èµ®Ád&Û(Ü',áÆAõÅ Tq4i·ðJìÖä= ÌÞí1(ûìè±X6};15.´2_,º¦¬ ¿w$êèºnÛvï¨7OVáîQ+±dú^©3\^ >XËT¹ËSa 0Éò,¦¾çxÔúDàñëé?±Ë¯ÏüÑkBùÀï`458²¾aL£G`ñÝ¢ü2:ò1,² ¨o°ÈV>MÞJ~xPiÖñÂÏ°íÔȽøïÎÈQølÏ|ØÏ®6Ï8OþFçÖñÃùª° e3¼Ám³ùØìÌzOD¦é$¯Cbį;¬ü/3bÇ©wEn<¼I·,¸îÌpí8<8nÖí»_,ºªû£-øûÇ|@M|gTÔÃÁ¼Õ41'Mçù2ÑS}®XUWHß÷!eÊÖïc¾³'ç %[CïÁí·þ¬Ôró¹ ®ï[ÌuP°´üÖ¯í¯sпÒæo4Ò^{:øO">é»(t f2iµ/fyÞîy~Hø$êhÀ×êMÂb&Ç?DÙ¡ëúª"9õßÇ2)ö÷vÒµîþpY]#tIÐIO}ZÏ[Ù9#ÞÆ-þãQZ¸i M¹¡kÏÅ=ÓP\¸à© êð3úÏ s'!»dËëE.«* ã¢pÚoι¾D"Ãð°èhßçÆF=ÓÕ%Jz¯2,ï7 >XA>Ñ$.ød±þÂ}öêÀ¶ý§ ·u[x*D ÜÕÓÔ.'úÃúFo0Yz5p¯*´Wàïír»u)Q**xzh{%¾êpu«KY§óf³ ï+¸¼¥«á¤§9riï ¤"«W.iâÑïêÅ)Sz^ë?ØJÙ×+Dc¯äº8ÀËuz#2õ¹ÚÊm¸ÖÜø\|BÖ±å[KÊ>*_ þÔ*pöòLnöިr©ÓÂC®éu\©9Mbm\s^c6 Ë @ùÍñ¬<ñyblw¼#Ê1³G¼~^1×ø¾Å´³ë°)}Y ^tN4©f}Iôö6É»üÒÏmlvC<aãï_ùrÔVç+ÛiO¢¸üT»Êí²î&ù)Z)ßj® >X^Ç µ§ÊÒl°õê^ÉôF]k·ªMþî:å³Dú§àI<ÉÖ®þV§îD®ÀÃW·0×q¤ÒÍq3 'Å.!;Äæ9>ê0¤ùíÈÞQ ÖÄßsÕ¿OçE8è*20Ûá¹ Á³ Qy9]Cr~«ú>_Ïp»£¿I<Z¸jrÝyBe]1*jÎÓu$Â:U >Xh=#î@ïä½:1¡´@)SÂSéïð\R+î¥Þ sªüå<ÀÒÉ}6:ý¤åoÀñÂ/PT~5 WÑrysË1¾ý<ä¨È_Oî$+°föÎdÿíI8å=Ùôy.xwÎß°ëô¸\]$8¹ø¶\nü+5gQ½rWcHè¸k䢰֥ÇPVOüÙ%{¡ »T+»UNä|H¾;£`r/îÆQ/cbìR7ÎwF¿ÿørµØiÅ·]®k½±ë,Ãå«ùø{RTNÊ¿ºRR^çÜL*' -Ø~òMáÍç&¾ÙsêM=IùUuEø`ס|¥¼sÇW7ÕJð¶|Î @[ÁsýGÛqFùÌ4Lf#&£xuy1ì¶X¼Ë»Ý´=?¿ ?di^Á(æ4ªû Ö+T¬«7X±ûÀ ùp îÀÂó~Èz Vo;{Ñj£££ïFÊ '1@;*¹RäÕºÈ <ápÞßQ\ñ3%2ËO¹XvþJù°ÛQ°ÃùãRu1QG¹ÓÁ²Û~À#68UôøËej¨~èïCþ3cÚàÅ¢ph;qbOÎÛî;½i`®~8ÿïvç^õ¤üèÀD,±^'Ø/(|qßèwéø+Y¶¦x1Æ Ê3È»´§op©:G´ *llÓ4±?oÜ×ÕbÊuyÈ.ÝsW~B¾õÆSV`üÀy¨·ÑØÃî¶Ç?ïÛ°òêô 6§óHKãcA¨vTQ¯=ß&Ó1ÇÎÖêýYÃþBnJc³2É/;Bïû.EÇì2µÒâµù~°ïPüvÚú}-ÂG{æáTñWÍïû{Ç .x²XÛ6#¢ÜCWL¬êjß@WÅæ{<Ñßg °Í5"]>YÅ5 iTÁð÷ >X£Kæßg®q¥IBûQêôå¼9mßçm OêxyøíäûÌWðÕÑgÿ|¼p¹bPRÑPQ[±®ùýïÇ)]7î ߣËÑ<©SK#©bÓV«³qªhJ*OPPÖ"«d»P fÞ¦iûàqÂ.Ög°·ú }t ¹(©NPI£»¨<¨¦g.þ$,76pÞ#È7gí°@Ñ Û]Zi»] ÛAªj/áBufs¹¢º®Zôâ(drÑ1%iew f\Õ*¾Pe3Ç`vÄ.ÎWÒwïhwt2I;û©pE?ùȪtî¶3iô«EM]P%j¿ö-ø o1úOS¢ubÔfámox·W¸ g[ïÚ³Xe¶j¥ilóû=(²¦ÅDWkê+ÈeI)o0áö¡Ë1!öw¸JF)ó¦<a¸Xt-¨Á§Ò¹56««ÌNÃ%µüýç8ùì Yr¶¼à¬ÅÕEþåt´µi,?t¾¹òJÜ9b9+Åûk«íNæn§íí'_¢ïL³3lÓI;÷LbKzÇu#NêÌ\et2rr¤¥UbÄiT!²Û}pÙI0&z>r/¦ÃVÇû|îäjhRäÍÊ¿.kÖWcÝÞÍÜÞ佡q÷DGµ¥¦|¡Î '@ï8»çWEU]¹ÍÒJcßDUm%vç¼f÷¼Ú³H;·ÌÞy3Lzý5Á4ÂìxO~ W·ÆÌõ~C9ÀAoæÁ×ÿ-ËͤíÙ(×&Ç/w¸WÓ a@÷þü&Òî»s^m|NvA°îpøcÎ[b߶1Q_÷~em>Þ/j*IY2«ÒB;F¼÷.$Ks´,ÔL3Ò¬m*Rk0å+ÉÙ4n04 >Xc£8ýìÜõG.í³C¿Á=IïÓóy]çz¶ø/,Ú!â°DøÂZÓ¥[12bùà8þÅ RÈÄRþåb>·ýÆF?F Ö×8ÿ5%Xr»£ÑJA³X~ÕE:y)å >XÜ;úѹݾ(ÃÁüOPRä'ÄâCvEåé8|îcx´sEM»1vERGÏoƱÍ"prÍk°Rndeù¼qkQ¡û¹4 toAPVöº¿ûXßaÊOâ³+KÄ__oj9íöæq1v3<¥R©Ë½Ñå<\ïrÚ NAÏØ©%Îä«JþãbÞÐw±;SL%V]ttØNĸù©3·þåiÆÅÓ·ÉÞ`£3jõ%kÔAxlòáê:V%þ¹1öÈbT¢ÀüOErõÝñç)ª¾µ½k°xÔ³{H0_ML+¾Ç=k q*lKR?øÛ°ª _B¯7³5!ØLÄâA¢Á~¿â¶*i·g÷zÌà uiGaá¤Mbà³ëwi¯Í >X§µ¸ êKCÃç 1rèèø½z7"Ô×âÊÕ\h=£n転ÅÁ²)})vf¾UÎÏukÔX1ó]+¢Sò¸ËVúy´Àb1K]á~ø]Ó¸)«óÂV#Öãë ÓW4»ÕKÙïúÕÈ~z«üÅßëÎ5ÎrYDc®Fk/²]{¼è_pÕBy¹Ô£¡üK ®SÒ;¿ ·nÀð`,Uض\Íéò®¡¢?f`þ³Î#§äìrõ¼ôMB3{µð!Ĩ<_ð" iïcËgQPÙ!nï\ À+&¯!Ú§/ìKvA¦ÿ±áà±¾+9f±¨VÚE_â¬ÿ;6M/þgô¯ FÄ?Gbj1l-ºÕ£¶¡ºÜ3dAÀS·²y}.§lÏ|²úµbð¸Æý?gi>Y¼ù5{æ~îá¢=Ò¶6è¯ §>±Õ´aK)*?ÒÊ[NïD¿Kqà ¡3Wó·Ú2AUm9%ZR¸b)¶^ Ƨn;â7üx3zÎë¯[çé >XB]¹;K±wÅVi¥®plHÌô¶Ñ1æ-·Zp XÉLÛ?¶U&¬yé&Ä.{ËàbæÅå >X¶2.]´uðû®ê±X¬»ksËÊo >XNSâV¼Òf)bâ åo$LÚ_oè¾íÜof©Õ1&ê·ÞýEP¶h|`̺Gûy \ìÎ_» ç±ãÎM|ÿ »Å8¯èüE·Ìò÷¾¥ 'üÂDoîoÕ5òC&í[0aóµB[Ñ*.ÙjË«ª+ >Xû"}ɻǾm PîßoâM¢È]4ã.Z}×ðUϨ¾U×G}Ù¶Íü1ûÕg.ý8"¸`äR÷®¶ðÛTºðTª¥î÷Ôë1ý§î²ù1gS+3F»²?¥¸âè¨+5¹±×®ê¦C.Uê5ñÙaÚÄ´¨äý¸¸ugg°[zØBm7nqÐ×äÿÉV¶x úJIEND®B`(uuay)droidcam/;LHhÀð¨ ÐôÐð4-dð-@.¼.ä 3@ 4h5 5¨05È@5èP5`5(p5H5h8`8¼8Ü 8üð8 p9Hà9t: :´0:Ôp<à@0Bh D D´Hà0HI pKHpMÀM àMÀNàN N pN@ °N` ÀN O¨ QØ T >X >X >X >X >X >X >X >X >X >X >X >X >X >X >X >X >X >XtAøu1Àè¥ czë 1ÀèF Pz¸]ÃfUHå=ùyt =ôyt]ÃFúøs5ây]Ãþ >Xtþuä1ÀèG z]Ã1Àèèòy]ÃUHåHþw¤yøu =yt]ÃHõ!H±~Çy]ÃDUHåAVSHìH~HEèëè{5qyþ =9yuã=,yuÚH=Ã{è>HHÇ1öº >X >X¸0; E1ö1Û5x=[x H=òzHÆèGH=ÓzDöèÓFH=Ìz¾èÂFH=zÞè´FH=uzHF}H;Eè ÞHÄ[A^]éFH=Vzè1GûwëH=:zèGëwH}H;Eè YHÄ[A^]ëwøu =£wtWH=zHË|H;Eè $1öHÄ[A^]éEH=ËyëH=ºyH|H;Eè ô1öHÄ[A^]é¢FH=»yèFø¸Ø-wéYÿÿÿ6w@wø ºÇw¾°É 1ÿHÇÂÿÿÿÿè^FHy¾@É 1ÿ1ÒèIFHyH=sy¾ñ= èFH=Ry1öèSEH=Ly1öèEEH=y1öè7EH=øx1öè)EH=y¾èEH=éx¾èEH=èx¾èöDéþÿÿ kv ivtA ÀtLøteø ßèj< ÀH [{H;Mè ´ÇHÄ[A^]é<¿ !¾< éýÿÿH=xèEIÆH ÀuP»ÿÿÿÿé®ßè>à ÀHýzH;Eè VßHÄ[A^]é=¿ !¾8; é£üÿÿA¾·< L÷èEHøw¿ !¾æ; éüÿÿHÇEàH=x¾= èDHUàL÷ÞèÛøÿ¸Ã¿L !ºLöèÞ@ÆBu=DutAÇuÇuHcÓ¾°É 1ÿèkDH¤w¾@É 1ÿ1ÒèVDHwëßè=ïtt)Ç»tǹt¾`Ì 1ÿ1ÒèDH\w¾Æ 1ÿ1ÒèDHWwé¸ýÿÿH=+w¾q= è¹CHuàH ö¥üÿÿ¿IJ èòêÿÿéüÿÿèhC=Mtu =@tta=sttXUHåAVSA¸üI H×¾º¹1Àè?Hþ5> HÇè?Hßè?AÆHßè?¸Aþ÷[A^]t1ÀÃf.UHåÇÂsǼsH=avH ÿtè7CHÇLvH=MvH ÿtèCHÇ8vH=9vH ÿtèÿBHÇ$vH=%vH ÿtèãBHÇvÇ6sÇ0sH=u1öèÆAH=u1öè¸AH=u1öèªAH=Su¾> ]éÈ>UHåH ex¿sN ¾ïº]épBUHåH÷]ésBUHåH÷]és?UHåH÷]écBÌÌÌUHå¿P!]éaBUHå¿P!]éaBUHå¿P!]éaBÌUHåAWAVATSHì°IÖA÷IüHwHEØ¿¾ºè6Bøÿ~ÃÆEÉLçè/BEÌfAÁÇfD}Êß¾1Ò1Àè"B ÀÈß¾Â1ÀèBHÇ 0ÿÿÿHÇ 8ÿÿÿWÀ) @ÿÿÿ) Pÿÿÿ) `ÿÿÿ) pÿÿÿ)E)E)E )E°HcúÙHÓâHÁèH Å@ÿÿÿHuÈߺè©Aè´A8#tèªA8#tè A8$ 'ßÿÇH@ÿÿÿL 0ÿÿÿ1ö1ÉèA Àß¾1Ò1ÀèDAàûß¾Â1Àè1AHÇ 0ÿÿÿH0ÿÿÿß¾ÿÿºA¸èHA Àx&H0ÿÿÿß¾ÿÿºA¸è&A À¤¿O> è$AéH(vèã@D8èÛ@8èA¾-L HßDúHÁ1ÀèAèº@8èó@IëOL=çuè¢@D è@8èÓ@¾×J LÿDâHÁ1ÀèÎ@èy@8è²@ëHijIßè¿@»ÿÿÿÿHSuH;EØuØHÄ°[A\A^A_]Ãè?fDUHåAWAVATS» ö~3AÖA÷IüDúD÷Læ1Éèp@H À~ A)ÇIÄE ÿàë»ÿÿÿÿØ[A\A^A_]Ãfffff.UHåÑHøHcÖÏHÆ1É]é7@UHåÑHøHcÖÏHƹ@]é@@UHåAVSÑHøHcÖÏHƹèò?Hà ÛxAÞëèa?E1ö8#t >XèT?8#uäDð[A^]ÃUHåAVSHì ÑHøH)tHUèÇEÔHcÖLEØLMÔÏHƹè?Hà ÛxAÞëèó>E1ö8#t >Xèæ>8#uäHÚsH;EèuDðHÄ [A^]Ãè=UHåAWAVSHìÓIöAÿH¤sHEàfAÁÀfDEÒÆEÑHÏèZ>EÔHcÓLEÐDÿLö1ÉA¹è ?H fsH;MàuHÄ[A^A_]Ãè =UH忾º]é÷=="hÿÿtUHåè|>Ç >Xhÿÿÿÿ]ÃUHå]éf>fDUHåSHìûHîrHEð=Ûgÿ¡H=s¾P; Ú1Àè>ëfD¿PÃèf>=smtO=g1ö1Òè^>øÿ ùè=8#tËè=8#tÁè|=8t·èr=8è«=¿¾@ HÆè®ãÿÿH=r»ÿÿÿÿ¾EL ºÿÿÿÿ1Àè=éUÆEáÇEäØfÁÀfE⿾ºèÓ<gøÿ¬HuàǺèÄ= À§=Þf¾è¼= À¢=Æf¾1Ò1Àè < ÀÈ=§f¾Â1Àè<é¿þÿÿÃH=Óq¾EL Â1ÀèÕ<=wf¾1Ò1ÀèQ<È=`f¾Â1Àè:<ëqèS<8è<¿oF ë7è@<8èy<¿WG ë$è-<8èf<¿ D ëè<8èS<¿ãA HÆèVâÿÿ=øeÿÿtèV<Çäeÿÿÿÿ»ÿÿÿÿHàpH;Eðu ØHÄ[]Ãè:ÌÌÌÌÌÌÌÌÌÌÌÌUHåAWAVAUATSHìHIþH¢pHEÐÇ Ìûÿÿ¿OJ èz<HÐûÿÿ¾ºùL HßHÁ1Àè,9¾J Hßè_<HÃWÀAFAF AF,AAÇFAÇFH¸àIF$AÇF0H ÛH½Ðûÿÿ¾HÚè<H ÀtH½ÐûÿÿHÌûÿÿ¾¤> 1Àè9Mf ÌûÿÿøukH½Ðûÿÿ¾HÚèÑ;H ÀtHµÐûÿÿºL÷è6AÆFH½Ðûÿÿ¾HÚè;H ÀH½Ðûÿÿ1öº >X >X¿IJ ¾y; èÙÿÿ1ÀHÄ0[A\A^A_]à ae_eËAƯÁUeD5ReÇ8eJeH ÀIÈÁù =e@AÄAÁìAÄAÑüD%eCdHcøè54IÇH#eMcäLçè 4HeHc=ödD9çè4HeD¦dD £dWÀD$HÇD$ ÇD$Ç$1ÿÞDò1ÉèÑ3HÊdd ^dheÑødebeÇ\eHdHòdHcWdHÂHédHcJdHÐHàdHÇÝd eÑù e eÇeH8dH¹dHc >XdHÁH °dHcýcHÈH§dHǤdL=ícL=^eÇ\e¿°!¾Ð!è*Hc¦cH¿cH@eÇ>e¿°!¾à!èg*HcxcHÀHcHeÇe¿°!¾ð!è6*@cdÑøddÇdHKcHcHc cHÁH cHccHÈHcHÇc¸éaýÿÿffff.UHå¿X!è2HÓc]ÃfUHåH=ÍbH ÿtèû1HǸbH=¹bH ÿtèß1HǤbH=¥bH ÿtèÃ1HÇbH=bH ÿtè·1HÇ|bH= bH ÿtè«1HÇpbH=abH ÿtè1HÇLb¿°!èz(¿!]éo(ffffff.UHåAVSHì0HdHEè_H]àL7LuØ=©atU=bÎH=ïaLEØLMàLöHÚ¹jh!è1HÄ ÀHýcè1¾²> é^H=aHìHEÈHMÔLEÐLMÌLöHÚPèç0HÄ ÀïUÌú .UÔD aMÐD aD9 &D9É Çã`=Pa <ÿÿÿëLuØH]àH=aDÊ`È`¹°!A¹!LöHÚh Pèh0HÄ Àt"H)cH=Ú`è]0¾H HßÂéH=·`H ÿ§Dk`Hì¾Ð!º !A¹ð!1Éh0!è'0Hĸh!ëzHÅbH=v`èù/¾Ê< HßÂ1Àè¸-H¡bH=R`èõ/¾)> HßHÂ1Àè-ëdH=zb¾V@ 1Àè~-ëOH=eb¾ÙC 1Àèi-ë:¸`!H0=¡_HcÆ_è/H ÀyH 1b¿I ¾'ºè=,HÖaH;Eèu HÄ0[A^]Ãè+fUHåAWAVAUATSHì8H¨aHEÐ2_D4 $_ ÁéMÈHU¸UÉÁèEÊDuËH}ÈèáøÿÿHJ_Hc_Hß¾è-DuÄE öÌHE¸HcÈHM¨H ÀIÈÁùHM°DqÿIÿÆE1íë&H]¨L)û¸HCÃLøAÿÅHÃD;mÄIß}¸|ÔHß1öLòè-N<3Lÿ¾@Lòè-M÷Lÿ¾Lòèð,M÷HE°AÄfDèk.HHiÈÓMbHÊHÁê?HÁé$ÑiÉú)ÈAIÿÇAÿÌuÒé]ÿÿÿH=f^H ÿt-D^HÇ$0!¾Ð!º !A¹ð!1ÉèÛ-¸h!ë¸`!H0=Î]Hcó]èÚ-H ÀxH`H;EÐuEHÄ8[A\A]A^A_]ÃH B`Hû_H;EÐu"¿I ¾'ºHÄ8[A\A]A^A_]é3*è)fffff.UH庰!HÈ^H;y]¸!HGÂH=Ð^HùHD öHEÂHÇHÎ]é$ffffff.UHå¿°!1ö]é$ffffff.UHåH5]¿!]éj$f.UHå¶\]Ã@UHåª\]Ã@UHå ]ùtùu1ÀùÀÀë 1ÀùÀÿÀõ\øÁøÀȶÀ]Ãf.UHåÎ\ÁÉùu >X1ÉøÁë1ÉøÁ ¥\á1ÀùÀ]ÃUHå]]Ã@UHåSPHûHWHGH9b]~HKH<HHÒ1öHÄ[]él*H=]HKHH1öèö+Hc+]HCHÄ[]Ã@UHåAWAVAUATSPHó Ò~}IÿAÔE1íE1öëffff.IÿÅM9åt]IkõFLþ¿X!ºFè¢+Dñffffff.AÎùÅH=n\IcÆHC¾X!è]+ \Dñ ÀtÐëE1öE öµt\ød¦ø2=ÇDðAþrHû!½HCHù!¬1ÉHÊH÷Ò¨t/¿4K=\¯þHcÿHiÿ ëQIøIÁè?HÁï%DÇ÷f<KHÉHÂ'@¿K5Þ[¯òHcöHiö ëQH÷HÁï?HÁî%þÖf4K¿TK5³[¯òHcöHiö ëQH÷HÁï?HÁî%þÖftKHÁH9Èu¡é¿Ááüfnw[fpÀÂÁêHÁâ1öfpÈõfoÿÿfó~3faãfräfoèfôìfpõèfpäõfôáfpüèfb÷fïÿffþfôêfpíífôâfpäífbìfÛúfúïfoåfrÔfrÕfþìòpåèópäèfpäèfýãfÖ$3HÆH9ò vÿÿÿH9Á þÿÿDðHÄ[A\A]A^A_]ÃÌÌÌÌÌÌÌÌÌÌÌUHåAWAVATSIöIÿèz)øtøu)Lÿèx) ÀHAÇëLÿè_) ÀaLÿè_)HÃH Àx^HÀZH9ÃA>AÇLÿè>)1Û ÀpAÆHJ[Çè3)¾(A HßHÂ1ÀèA&DóéEûà ¦LÿèØ( ÀÃH [¿åK ¾ºè%éêINIFIvIVLÿèÖ(» ÀåAÄøàu.Lÿèy( ÀÿAÄH §Z¿åK ¾ºè³$HZDçèt(¾\K é ÛxrAÇ1ÛéÃH _Z¿åK ¾ºèk$L5DZßè-(¾BK ëEÃH -Z¿åK ¾ºè9$L5Zßèû'¾@I ëL5ýYßèæ'¾A L÷HÂ1Àèô$Ø[A\A^A_]ÃLÿ¾ÐèÜ'1Û ÀyâAÄøàu3Lÿèv' Àx AÇëÅAÄH Y¿åK ¾ºè«#HYDçèl'¾ÍK HßHÂ1Àèz$DãëDUHåAWAVSPIöIÿHvIVèc'HÃH Àx >X1ÀI;^uëaûàu+Lÿèä& Ày#ÃH Y¿åK ¾ºè##ë ÛxAÇ1Àë"L5ëXßèÔ&¾B L÷HÂ1Àèâ#ØHÄ[A^A_]ÃDUHåAWAVAUATSHì(HhXHEÐHÇE°èÇ&HãHÀHàðH)ÃHÜHÇWèª&Hß1öHÂè]$è¨&HãHÀHàðH)ÃHÜH Wè&Hß1öHÂè.$Le¼1ÛëfDÿÃû2h¿ !¾ º5B Ù1Àè ¿ !¾J è¾#H ÀtÉIÇ¿ !¾º HÁè/&MæIÄLÿè±#E äMô~H¸LoopbackH9WuE1íë1L=©WÇè%¾?H LÿHÂ1Àè "MôAÿÅAýPÿÿÿ¿ !¾ ºVL ÙEè1Àèå¾ !H}°1Ò1Éè³% ÀxLe°M ätL=VLçLþè¤% À*LçLþºè% À'LçLþ1Òè% À'LçLþºè% À$LçLþºè% ÀUÇEÌ>LçLþHUÌ1Éèw% ÀU}Ì> eº!LçLþLñè_% ÀiLÿHuÀè[% ÀqHEÀHèUº!LçLþLñèE% ÀcLÿHuÀHU¼è=% ÀzHEÀHjULçLþè/% ÀtL=VÇèù#¾îJ ëRL=ûUÇèä#¾E ë=L=æUÇèÏ#¾@ ë(L=ÑUÇèº#¾ö? ëL=¼UÇè¥#¾F LÿHÂ1Àè³ H U¿E ¾ºè¨H}°èÏ!éêýÿÿL=sUÇè\#¾= LÿºéL=SUÇè<#¾ØE Lÿº>ësH=6U¾aL º>Á1Àè3 é{ÿÿÿL=UD%ØIÇèù"¾Ë> ë2L=ûTÇèä"¾wH é:ÿÿÿL=ãTD%¨IÇèÅ"¾÷; LÿDâHÁ1ÀèÐéÿÿÿL=´TÇè"¾ËF éóþÿÿLu°L=èSL÷Lþè# ÀxpHÂSL÷Lþè§# ÀxaH¬SL÷Lþè¡# ÀxRL÷Lþè¢# ÀxJHÇSHú ¢¿ !¾ º = ÙEè1ÀèHE°ëe»ÁM ë»LB ë»L ë»]I L5øSÇèá!L÷HÞHÂ1ÀèñH ÚS¿XH ¾ºèæH}°è ÆS1ÀH mSH;MÐu$HeØ[A\A]A^A_]ÃH=S¾TJ 1Àèë½èÌÌÌÌÌÌÌÌÌÌÌÌÌÌUHåAVSHìðHSHEèHµÿÿÿ¿P!è¦"Á1À Éxc· ÿÿÿáðù uN¿P!¾1Ò1Àè" À7HSèÆD0è¾8è÷¾a> ºP!HßDñIÀ1Àèí1ÀH RH;MèuHÄð[A^]ÃèMffff.UHåAWAVAUATSHìxHûHURHEÐèLcøL¥hÿÿÿE1íëffff.D÷èAÿÅAýct|¿P!¾ ºF Dé1ÀèÆèÑþÿÿ ÀtÕAÆf.¾Vh@D÷Lâ1Àè!øÿuèÔ8tßëffff. ÀxHßHuLúè}! À uÿÿÿë ÆlQA¾ÿÿÿÿHQH;EÐuDðHÄx[A\A]A^A_]ÃèBfUHåHþ¿P!ºèÊÆBQ]ÃUHåAWAVAUATSHì¨HÓIöAÿH,QHEÐfïÀf `ÿÿÿf Pÿÿÿf @ÿÿÿf 0ÿÿÿf ÿÿÿf ÿÿÿHÇ pÿÿÿf @þÿÿf ÿÿÿf ðþÿÿf àþÿÿf Ðþÿÿf Àþÿÿf °þÿÿf þÿÿf þÿÿf þÿÿf pþÿÿf `þÿÿf PþÿÿÇ @þÿÿH 8þÿÿD*ÇÇL¥ÿÿÿ¾Vh@DÿLâ1Àèþøÿuè48tßéÒ ÀÊfo @ÿÿÿó~Pÿÿÿft ÊÿÿftÒÿÿfÛÁf×À=ÿÿmÇ @þÿÿL¥@þÿÿfffff.DÿHÇÆVÐÀLâ1Àè|øÿu >Xè²8tÝH 8þÿÿ HþÿÿDLþÿÿH¸YU12H PþÿÿL¥@þÿÿDÿHÇÆVÐÀLâ1Àè,øÿu'èb8tÝéÖHOèL¾F éÈ À¶I¼p_formatfïÀfE°fE fEfEÇEÀHU¾$VDÀDÿ1Àè¼ ÀuJLm@HEH¹keep_forH1ÈHML1áH ÁE E¾$VDÀDÿLê1Àèr Àt¾A¼ Lméffffff.è8 ÷H@þÿÿDÿHÇÆVÐÀ1Àè*øÿtÕ ÀÒPþÿÿúYU12 HþÿÿLþÿÿ Òt É ¾H=lN¾= 1Àèpé²ff.AÿÄAü, De¾$VDÀDÿLê1Àèª ÀuÖHEH¹keep_forH1ÈHMHºp_formatH1ÑH Áu¯EEÇE À)¾$VDÀHÆøÿÃÿHUDÿ1ÀèPé >XHÄMè¾hO ºP!Hß1Àè¹HbMH;EÐ íHĨ[A\A]A^A_]ÃUuÐÁèEÐÁèEÆEH=eMHM¾BA A¹P!A¸YU121ÀAUÿµ8þÿÿèQHÄëÇEHU¾$VDÀDÿ1Àè¡ ÀI¼p_formatuRLmffffff.HEH¹keep_forH1ÈHML1áH ÁEàþÿÿÿÀE¾$VDÀDÿLê1ÀèE ÀtÁHþÿÿLþÿÿAéÿÿÿè6ÌÌÌÌÌÌUHåHìHQLHEø=2G5Gu÷èGÁ À¸ÿÿÿÿOÁëHUð¿L !èkÔÿÿH LH;MøuHÄ]ÃèÓUHåAWAVAUATSHì¸HåKHEÐWÀ)EÀ)E°)E )E)E) pÿÿÿ) `ÿÿÿ) Pÿÿÿ) @ÿÿÿ) 0ÿÿÿeF[F+HPÿÿÿL½(ÿÿÿë!D¿PÃè&4F*FúFFtÖ=;F5%Fu'÷èPAÄ À.A¼ÿÿÿÿéfffff.¿L !LúècÓÿÿAÄøÿtÒ¿ED ¾DâèÉÕÿÿ ÀWÀ)EÀ)E°)E )E)E) pÿÿÿ) `ÿÿÿ) PÿÿÿHß¾DâèÖÿÿ À1ÀëfHÿÀHø|tl¼Pÿÿÿ uí¼Qÿÿÿ >Xuã¼Rÿÿÿ uÙ¼Sÿÿÿ >XuÏø{HÀë:L-JèTD0èL8è ¾ M LïDòHÁ1Àèé~¸|ÁðøºCÂÿÀH)HÂPÿÿÿ1ɶ4 >X~Ð@ÿ w@´ 0ÿÿÿHÿÁH9Èuã ÉuëHÈ Éuë1ÀÆ0ÿÿÿ-¹ÈfÇ0ÿÿÿ%H½0ÿÿÿèM»ÿÿDçèÖÿÿA¾0uffffff.NDDDþÿÿ¿èè$AÿÎußéôýÿÿHcIH;EÐu1ÀHĸ[A\A]A^A_]Ãè@=ýCt[UHåSPë0ffffff.HÃHÇèåäÿÿHß¾èHéÿÿ=ÅCtèªéÿÿH ÀuÕ¿Ðè=¨CuãHÄ[]1ÀÃfUHåAWAVAUATSHì8IþHµHHEÐH]°E1íf.Aþÿu=pCèÕÿÿøÿéAÆA½Hc^CL<Å!1Àè7éÿÿAÄ1Àè=éÿÿ¾ º~J HßLùEàAÁ1ÀèHßÆDòèÓÿÿ ÀWÀ)EÀ)E°Hß¾ Dòè`Óÿÿ ÀHßèpßÿÿ ÀhǪB=«BQ ¢B Éteùu1LºG¾ ºN Hß¹1Àèq Àu%ë0ff.¾ ºxK Hß1ÀèL Àt HßÆDòèKÒÿÿÇ9BèüçÿÿIÇHß¾Dòè©Òÿÿ ÀÁu°AwI?DòèÒÿÿ À§Lÿ1öèmçÿÿ=êA @ÿÿÿéff.Dm¬A¿Ì@ A¼øM ëfffff.Dm¬A¿>M A¼B L-GèÔèÍ8èLïLæÚHÁ1Àè¿IJ Lþè÷·ÿÿH]°Dm¬ë A¾ÿÿÿÿÇBAD÷ènÓÿÿ1ÀèwáÿÿE ítA¾ÿÿÿÿA½=#A ¹ýÿÿ1Àè"ÓÿÿHKFH;EÐu1ÀHÄ8[A\A]A^A_]Ãèÿffffff.UHåAWAVAUATSHìøHFHEÐH½ ïÿÿº1öèèÉàÿÿÇ øîÿÿH ÀêIÆ=@t!¿@ èm=r@u=m@uÛéÂ=@ Á5o@÷èà À%¿dM ¾ ÚèAÐÿÿ ÀÀfÇ $þÿÿÇ þÿÿH½ þÿÿ¾ÚèÐÿÿ Àûfo þÿÿf~ÀA¿J =-@v0 ½$þÿÿ2 A¿ N A½½%þÿÿ òLµèîÿÿég¿IJ ¾:E è-¶ÿÿéôH¸127.0.0.H3?¶ ?Hñ1H ÁLµèîÿÿèWÑÿÿ ÀÃE1íA¼L½ þÿÿA¾D\?AÿÀ¾dM ¹L !ߺ è§Ðÿÿ¿}è Lÿ¾¤ÚèÐÿÿ ÀEOî µ¿}èèLÿ¾¤ÚèéÏÿÿ ÀEOî ¿}èÃLÿ¾¤ÚèÄÏÿÿ ÀEOî k¿}èLÿ¾¤ÚèÏÿÿ ÀEOî F¿}èyLÿ¾¤ÚèzÏÿÿ ÀEOî !¿}èTLÿ¾¤ÚèUÏÿÿ ÀEOî ü¿}è/Lÿ¾¤Úè0Ïÿÿ ÀEOî ׿}è >XLÿ¾¤ÚèÏÿÿ ÀEOî ²¿}èåLÿ¾¤ÚèæÎÿÿ ÀEOî ¿}èÀLÿ¾¤ÚèÁÎÿÿ ÀEOîul¿}èLÿ¾¤Úè Îÿÿ ÀEOîuK¿}è~Lÿ¾¤ÚèÎÿÿ ÀEOîu*AÿÌ 'þÿÿéA¿~> A¾÷F éd5n=é ÀòÇ3==4=L¥èîÿÿõLµ þÿÿL½øîÿÿÇ ôîÿÿÇ ðîÿÿë"A¿èDÿèå =î<L½øîÿÿ¯L÷¾¤ÚAýuèÌÍÿÿëf.èkÍÿÿ À4t3-¹BÁH<(HÇ þÿÿHµ ïÿÿºè¸ãÿÿÇ ôîÿÿLçLþèæÿÿ Àbÿÿÿ½ôîÿÿt'MæH ïÿÿL8D¥ïÿÿèãÿÿD9à~Hïÿÿë#LÿèýâÿÿÇ ôîÿÿëbèÜâÿÿHcÐHïÿÿMôH ïÿÿI<GHÒLµ ïÿÿLöèL½ïÿÿJ4} ïÿÿHîK?L÷èD)½ôîÿÿLµ þÿÿL½øîÿÿLçLþèÔçÿÿ ÀkA¿ÐAý þÿÿ ðîÿÿ=} ÿÀ ðîÿÿé þÿÿD;AÿÀ¾dM ¹L !ߺ èâÌÿÿÇ ðîÿÿéVþÿÿ=x;5b;LµèîÿÿæúÿÿHïÿÿ¿L !è¸ÈÿÿÃøÿ ÛúÿÿH @¿K ¾ºè¢ >X >X >X >X >X >X¿IJ ¾ú> è°ÿÿÇ :Aý oÿÿÿD3:AÿÀ¾¦O ¹L !ߺè~ËÿÿéJÿÿÿè ÌÌÌÌUHåǾ&< ÿwHcÇH4Å`P ¿IJ ]éY°ÿÿfUHåAWAVATSHìûHå>HEØ¿_D è×A¼þÿÿÿ=ÿD¿pD ¾J èÇH À,IÆL½ÐþÿÿA¼ÿÿÿÿfffff.=é>tL÷è ÀtéìfDAFÁèà À ÔLÿ¾Lòè^ >X >XHCHÀëHCL0LsHÿCHßè² ÀuHÄ[A^A_]ÿ°J 뿧B ë¿QF è¿èUHåAVSIöHûè^ ÀuFL9sv)H{HGHCL7è°HÿKH{u HÇCëE1öHßè0 ÀuLð[A^]ÿ§B ë¿QF è¿èÌÌÌÌÌÌÌÌÌUHåSPHHHHHùrÿÐHÃøëëHÄ[]ÃUHåèËÿÿÿ]ÃUHåèªÿÿ]Ãÿ5"/ÿ%$/@ÿ%"/héàÿÿÿÿ%/héÐÿÿÿÿ%/héÀÿÿÿÿ% >X/hé°ÿÿÿÿ%/hé ÿÿÿÿ%ú.héÿÿÿÿ%ò.héÿÿÿÿ%ê.hépÿÿÿÿ%â.hé`ÿÿÿÿ%Ú.h éPÿÿÿÿ%Ò.h >X >X.h#é°ýÿÿÿ%.h$é ýÿÿÿ%ú-h%éýÿÿÿ%ò-h&éýÿÿÿ%ê-h'épýÿÿÿ%â-h(é`ýÿÿÿ%Ú-h)éPýÿÿÿ%Ò-h*é@ýÿÿÿ%Ê-h+é0ýÿÿÿ%Â-h,é ýÿÿÿ%º-h-éýÿÿÿ%²-h.éýÿÿÿ%ª-h/éðüÿÿÿ%¢-h0éàüÿÿÿ%-h1éÐüÿÿÿ%-h2éÀüÿÿÿ%-h3é°üÿÿÿ%-h4é üÿÿÿ%z-h5éüÿÿÿ%r-h6éüÿÿÿ%j-h7épüÿÿÿ%b-h8é`üÿÿÿ%Z-h9éPüÿÿÿ%R-h:é@üÿÿÿ%J-h;é0üÿÿÿ%B-h<é üÿÿÿ%:-h=éüÿÿÿ%2-h>éüÿÿÿ%*-h?éðûÿÿÿ%"-h@éàûÿÿÿ%-hAéÐûÿÿÿ%-hBéÀûÿÿÿ% >X-hCé°ûÿÿÿ%-hDé ûÿÿÿ%ú,hEéûÿÿÿ%ò,hFéûÿÿÿ%ê,hGépûÿÿÿ%â,hHé`ûÿÿÿ%Ú,hIéPûÿÿÿ%Ò,hJé@ûÿÿÿ%Ê,hKé0ûÿÿÿ%Â,hLé ûÿÿÿ%º,hMéûÿÿÿ%²,hNéûÿÿÿ%ª,hOéðúÿÿÿ%¢,hPéàúÿÿÿ%,hQéÐúÿÿÿ%,hRéÀúÿÿÿ%,hSé°úÿÿÿ%,hTé úÿÿÿ%z,hUéúÿÿÿ%r,hVéúÿÿÿ%j,hWépúÿÿÿ%b,hXé`úÿÿÿ%Z,hYéPúÿÿÿ%R,hZé@úÿÿÿ%J,h[é0úÿÿÿ%B,h\é úÿÿÿ%:,h]éúÿÿÿ%2,h^éúÿÿÿ%*,h_éðùÿÿÿ%",h`éàùÿÿÿ%,haéÐùÿÿÿ%,hbéÀùÿÿÿ% >X,hcé°ùÿÿÿ%,hdé ùÿÿÿ%ú+heéùÿÿÿ%ò+hféùÿÿÿ%ê+hgépùÿÿÿ%â+hhé`ùÿÿÿ%Ú+hiéPùÿÿÿ%Ò+hjé@ùÿÿÿ%Ê+hké0ùÿÿÿ%Â+hlé ùÿÿÿ%º+hméùÿÿÿ%²+hnéùÿÿÿ%ª+hoéðøÿÿÿ%¢+hpéàøÿÿÿ%+hqéÐøÿÿÿ%+hréÀøÿÿÿ%+hsé°øÿÿÿ%+hté øÿÿÿ%z+huéøÿÿÿ%r+hvéøÿÿÿ%j+hwépøÿÿÿ%b+hxé`øÿÿÿ%Z+hyéPøÿÿÿ%R+hzé@øÿÿÿ%J+h{é0øÿÿÿ%B+h|é øÿÿÿ%:+h}éøÿÿÿ%2+h~éøÿÿÿ%*+héð÷ÿÿÿ%"+héà÷ÿÿÿ%+héÐ÷ÿÿÿ%+héÀ÷ÿÿÿ% >X+hé°÷ÿÿÿ%+hé ÷ÿÿÿ%ú*h é÷ÿÿÿ%ò*hé÷ÿÿÿ%ê*hép÷ÿÿÿ%â*hé`÷ÿÿÿ%Ú*héP÷ÿÿÿ%Ò*hé@÷ÿÿÿ%Ê*hé0÷ÿÿÿ%Â*hé ÷ÿÿÿ%º*hé÷ÿÿÿ%²*hé÷ÿÿÿ%ª*héðöÿÿÿ%¢*héàöÿÿÿ%*héÐöÿÿÿ%*héÀöÿÿÿ%*hé°öÿÿÿ%*hé öÿÿÿ%z*héöÿÿÿ%r*héöÿÿÿ%j*hépöÿÿÿ%b*hé`öÿÿÿ%Z*héPöÿÿÿ%R*hé@öÿÿÿ%J*hé0öÿÿÿ%B*hé öÿÿÿ%:*héöÿÿÿ%2*héöÿÿÿ%**héðõÿÿÿ%"*h éàõÿÿÿ%*h¡éÐõÿÿÿ%*h¢éÀõÿÿÿ% >X*h£é°õÿÿÿ%*h¤é õÿÿÿ%ú)h¥éõÿÿÿ%ò)h¦éõÿÿÿ%ê)h§épõÿÿÿ%â)h¨é`õÿÿÿ%Ú)h©éPõÿÿÿ%Ò)hªé@õÿÿÿ%Ê)h«é0õÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ ° À ÇÕãíþ ' 7 E [ r ´ À Ö ì ü g¢¨* ` + ! | >X >XCUB `ó ü£g pó ar ,VËGAJ ÈIaP/ @ %Vmm c d?/Ìu µ0Ø ,a? pó K\Vl[~?) Xó »?, hó 0Ø ,V1 >XA4È6È3KPOØ /Ã"P/usr/src/lib/csu/amd64/crtn.S/usr/obj/usr/src/amd64.amd64/lib/csu/amd64FreeBSD clang version 17.0.6 (https://github.com/llvm/llvm-project.git llvmorg-17.0.6-0-g6009708b4367)% >X >X >X$>.@B:;'4:;I 4:;IB1B.:;'<?I$>%4I:;I!I7I:;I'$> .@B:;' >X4:;I4:;IB $>U% >X >X ò= *l¬" >XL5/Xgb8û /usrsrc/lib/csu/common/crtend.c 0Ø 1 >X÷= *lc5û /usr/src/lib/csu/amd64crtn.S eØ ! qØ !__do_global_ctors_aux/usr/obj/usr/src/amd64.amd64/lib/csu/amd64n__DTOR_LIST____dso_handle__CTOR_LIST__crt_funcFreeBSD clang version 17.0.6 (https://github.com/llvm/llvm-project.git llvmorg-17.0.6-0-g6009708b4367)/usr/src/lib/csu/amd64/crt1_c.c__JCR_LIST__/usr/src/lib/csu/common/crtend.ccharint/usr/src/lib/csu/common/crtbegin.c__progname__JCR_END__register_classes__CTOR_END___Jv_RegisterClasses__ARRAY_SIZE_TYPE__environ__DTOR_END__fn__do_global_dtors_auxLinker: LLD 17.0.6 (FreeBSD llvmorg-17.0.6-0-g6009708b4367-1400006)FreeBSD clang version 17.0.6 (https://github.com/llvm/llvm-project.git llvmorg-17.0.6-0-g6009708b4367)ÿÿÿÿÿÿÿÿ\Ø ÿÿÿÿÿÿÿÿhØ ÿÿÿÿÿÿÿÿeØ ÿÿÿÿÿÿÿÿqØ P%,PP%,Pñÿ >X >X >X >X >X >X >X >X >X >X >X >X >X >X >X >X >X >X >X >X$,3>ENV!msP Rx}° Ð ð I@ }¬µÀ pÄË0 Ûx!ì 4þ%+2Á BP¿ ³SÀ þd0Á êu ! Ð!ªH!H¶º BÆÖéü ! 0Ö >& °! 4 ÁD pÖ 5R ` s ð© c ° À Ç Ü Ð!0ç × ñ ` -7°Ö lCP® nQ]k¦°¿ÅÀ° òÝâÀ² Añ³ °× w0³ &P³ >`³ W´ t´ \p´ eª¿à¶ {Òàð 3@`¹ Th!£!¬²¿Õù3Rr»â0Vv Æ ]®!ºÁÉÐÖà!ãèïö7J`s.interp.note.tag.dynsym.gnu.version.gnu.version_r.gnu.hash.hash.dynstr.rela.dyn.rela.plt.rodata.gresource..eh_frame_hdr.eh_frame.text.init.fini.plt.ctors.dtors.jcr.init_array.fini_array.dynamic.data.got.plt.bss.debug_info.debug_abbrev.debug_aranges.debug_line.debug_str.comment.debug_ranges.debug_loc.symtab.shstrtab.strtabcrt1_c.ccrtbegin.c__do_global_dtors_aux__DTOR_LIST__register_classes__JCR_LIST____CTOR_LIST__droidcam.caccel_callbackcontrols_callbackwb_callbackthe_callbackdelete_window_callbackStophide_windowshow_windowexit_windowusageresources.cstatic_resourceresource_constructorresource_destructor_resource_dataconnection.csettings.cdecoder.cWEBCAM_WWEBCAM_Hdroidcam_device_fdoutputdecoder_snd.cperiod_sizebuffer_timebuffer_sizeperiod_timedecoder_v4l2.cav.cusb.cqueue.ccrtend.c__do_global_ctors_aux__CTOR_END____JCR_END____DTOR_END___startmain__libc_start1__prognameenviron_init_fini_Jv_RegisterClasses__dso_handleShowError_GTKmsggtk_message_dialog_newtitlegtk_window_set_titlegtk_dialog_rungtk_widget_destroyShowErrorstrncpygdk_threads_add_idleUpdateBatteryLabelbatteryTextgtk_label_set_text__stack_chk_guardXInitThreadsgtk_initgtk_window_newgtk_container_set_border_widthgtk_window_set_resizablegtk_window_set_positionAPP_ICON_FILEgtk_window_set_icon_from_filegtk_accel_group_newg_cclosure_newgtk_accel_group_connectgtk_window_add_accel_groupgtk_menu_newmenugtk_menu_item_new_with_labelgtk_menu_shell_appendgtk_widget_showg_signal_connect_datawbMenuwb_optionsgtk_grid_newgtk_container_addgtk_grid_set_column_spacinggtk_grid_set_row_spacinggtk_grid_attachgtk_radio_button_new_with_labelgtk_radio_button_new_with_label_from_widgetgtk_grid_attach_next_togtk_check_button_new_with_labelvideoCheckboxaudioCheckboxgtk_button_new_with_labelgtk_widget_set_tooltip_textwbButtongtk_label_newgtk_toggle_button_new_with_labelelButtonmenuButtoninfoTextgtk_label_set_xaligngtk_entry_newgtk_entry_set_max_lengthipEntryportEntrystart_buttongtk_main_quitgtk_widget_show_allg_settingsLoadSettingssnprintfgtk_entry_set_textgtk_toggle_button_set_activev4l2_devdecoder_initv4l2_devicesnd_deviceprintfdecoder_horizontal_flipdecoder_vertical_flippango_attr_list_newpango_attr_size_new_absolutepango_attr_list_insertgtk_label_set_attributespango_attr_list_unrefapp_indicator_newgtk_widget_set_sensitivegtk_separator_menu_item_newapp_indicator_set_statusapp_indicator_set_menugtk_maindecoder_finiconnection_cleanupSaveSettingssscanfexit__stack_chk_failv_runningthread_cmdwb_valuesthread_cmd_val_stra_runninggtk_entry_get_textstrtoulgtk_button_set_labelgtk_toggle_button_get_activegtk_menu_popup_at_pointerVideoThreadProcg_thread_newhVideoThreadDecodeThreadProchDecodeThreadCheckAdbDevicesAdbErrorPrintCheckiOSDevicesiOSErrorPrintstrlenConnectv_activedisconnecta_activeAudioThreadProchAudioThreadBatteryThreadProchBatteryThreadg_thread_join__stderrpfwritegtk_widget_hidegtk_window_close_get_resourceg_static_resource_get_resourceg_static_resource_initg_static_resource_finisocket__inet_addrfcntlconnect__errorselectsetsockoptperrorstrerrorfprintfDROIDCAM_CONNECT_ERRORcloseSendsendRecvrecvRecvAllRecvNonBlockRecvNonBlockUDPrecvfromSendUDPMessagesendtoCreateUdpSocketwifiServerSocketaccept_connectionusleepacceptbindlistengetenvfopenfgetsfcloseset_v4l2_deviceopen_v4l2_devicefind_v4l2_devicequery_v4l_devicejpg_decodermemset__stdoutpsnd_output_stdio_attachspx_decoderfind_snd_devicespeex_bits_initspeex_lib_get_modespeex_decoder_initspeex_decoder_ctldecode_queuequeue_initreceive_queuedecoder_cleanupqueue_destroysnd_pcm_closespeex_bits_destroyspeex_decoder_destroydecoder_prepare_videotjInitDecompresstjInitTransformmallocsws_getCachedContextjpg_framesqueue_adddecoder_prepare_audiospeex_bits_resetfreesws_freeContexttjDestroyqueue_clearprocess_frametjTransformtjGetErrorStrtjDecompressHeader3tjDecompressToYUVPlanestjGetErrorCodesws_scaletjGetErrorStr2writedecoder_show_test_imagerandpush_jpg_framepull_empty_jpg_framequeue_nextpull_ready_jpg_framedecoder_get_video_widthdecoder_get_video_heightdecoder_get_audio_frame_sizedecoder_speex_plcspeex_decode_intdecode_speex_framespeex_bits_read_fromsnd_transfer_checksnd_pcm_statesnd_pcm_preparesnd_pcm_avail_updatesnd_pcm_startsnd_strerrorsnd_pcm_mmap_beginsnd_pcm_waitsnd_transfer_commitsnd_pcm_mmap_commitsnd_pcm_hw_params_sizeofhwparamssnd_pcm_sw_params_sizeofswparamsfreadsnd_pcm_opensnd_pcm_hw_params_anysnd_pcm_hw_params_set_rate_resamplesnd_pcm_hw_params_set_accesssnd_pcm_hw_params_set_formatsnd_pcm_hw_params_set_channelssnd_pcm_hw_params_set_rate_nearsnd_pcm_hw_params_set_buffer_time_nearsnd_pcm_hw_params_get_buffer_sizesnd_pcm_hw_params_set_period_time_nearsnd_pcm_hw_params_get_period_sizesnd_pcm_hw_paramssnd_pcm_sw_params_currentsnd_pcm_sw_params_set_start_thresholdsnd_pcm_sw_params_set_avail_minsnd_pcm_sw_paramsstatopenioctlstrncmpGetConnectioncodec_namesmemcpymemmovesystempopen__isthreadedfeofstrstrpcloseusbmuxd_get_device_listusbmuxd_connectusbmuxd_device_list_freepthread_mutex_initpthread_mutex_destroypthread_mutex_lockpthread_mutex_unlockcalloc_DYNAMIC¨ ¨ À ÀH øÿÿÿo j(þÿÿol l7öÿÿo LAÌ Ì°G| |(O¨* ¨*`YB+ + c20; 0;PkP PÐwPe PeL g g,Ð ÐrU\Ø \ÈhØ hÈ¡Ø ÈÐ >X >Xjb*86de9216ad56ea4e98a4b82d8040644b >echo x - droidcam/work/droidcam-2.1.3/.gresource.xml >sed 's/^X//' >droidcam/work/droidcam-2.1.3/.gresource.xml << '14b25b6de39428b39831c20045978b52' >X<?xml version="1.0" encoding="UTF-8"?> >X<gresources> >X <gresource prefix="/com/dev47apps/droidcam"> >X <file>icon2.png</file> >X </gresource> >X</gresources> >14b25b6de39428b39831c20045978b52 >echo x - droidcam/work/droidcam-2.1.3/uninstall-dkms >sed 's/^X//' >droidcam/work/droidcam-2.1.3/uninstall-dkms << '12657638738f111ce3d0e4ef4e3fb587' >X#!/usr/bin/env bash >X# >X# Usage: ./uninstall-dkms >X >XKVERSION=`uname -r` >XDKMS_STATUS_OUTPUT_RE="^\s*([^,]+),\s*([^,]+),\s*([^,]+),\s*([^:]+):(.*)$" >X >X# Unloading module >Xif (lsmod | grep v4l2loopback_dc); then >X echo "Unloading module" >X rmmod v4l2loopback_dc >Xfi >X >X# DKMS module >Xdkms status| grep v4l2loopback_dc | grep ${KVERSION} | while read LINE; do >X if [[ "${LINE}" =~ ${DKMS_STATUS_OUTPUT_RE} ]] && module="${BASH_REMATCH[1]}" && version="${BASH_REMATCH[2]}" && kversion="${BASH_REMATCH[3]}" && arch="${BASH_REMATCH[4]}" && status="${BASH_REMATCH[5]}"; then >X echo "De-registering as DKMS module v4l2loopback_dc version ${version} from kernel ${kversion}..." >X dkms remove v4l2loopback_dc/${version} -k ${kversion} >X if [ -d "/usr/src/v4l2loopback_dc-${version}" ]; then >X echo "Removing v4l2loopback_dc version ${version} module source in /usr/src" >X rm -Rf "/usr/src/v4l2loopback_dc-${version}" >X fi >X fi >Xdone >X >Xecho "Cleaning system configs" >X >X# Module configuration >Xif [ -f "/etc/modprobe.d/droidcam.conf" ]; then >X echo "Removing module config" >X rm /etc/modprobe.d/droidcam.conf >Xfi >X >X# Systemd module registration >Xif [ -f "/etc/modules-load.d/droidcam.conf" ]; then >X echo "Removing systemd module registration" >X rm /etc/modules-load.d/droidcam.conf >Xfi >X >X# Old style module registration >Xclean_etc_modules() { >X # Remove droidcam reference in /etc/modules >X echo "Removing module references in /etc/modules" >X cat /etc/modules | egrep -v "^(videodev|v4l2loopback_dc)" > /tmp/.etc.modules >X prevperm=`stat -c %a /etc/modules` >X sudo mv /tmp/.etc.modules /etc/modules >X sudo chmod $prevperm /etc/modules >X} >X[[ -e "/etc/modules" ]] && clean_etc_modules >X >X >Xecho "Removing droidcam binaries" >Xrm -f /usr/bin/droidcam* >Xrm -f /usr/local/bin/droidcam* >Xrm -f /usr/share/applications/droidcam.desktop >Xxdg-desktop-menu uninstall droidcam.desktop >X >Xrm -f /opt/droidcam* || true >12657638738f111ce3d0e4ef4e3fb587 >echo x - droidcam/work/.PLIST.writable >sed 's/^X//' >droidcam/work/.PLIST.writable << '632b7ba4a3a93d44e9469cd51899a36a' >632b7ba4a3a93d44e9469cd51899a36a >echo x - droidcam/work/.build_done.droidcam._usr_local >sed 's/^X//' >droidcam/work/.build_done.droidcam._usr_local << 'c96dd00e0eabeb20d23851d53f3e4430' >c96dd00e0eabeb20d23851d53f3e4430 >echo x - droidcam/work/.license-catalog.mk >sed 's/^X//' >droidcam/work/.license-catalog.mk << 'e33b86b7d067b670b1ac60fa7edd93a2' >X_LICENSE=GPLv2 >X_LICENSE_NAME=GNU General Public License version 2 >X_LICENSE_PERMS=dist-mirror dist-sell pkg-mirror pkg-sell auto-accept >X_LICENSE_GROUPS=FSF GPL OSI >X_LICENSE_DISTFILES=dev47apps-droidcam-v2.1.3_GH0.tar.gz >e33b86b7d067b670b1ac60fa7edd93a2 >echo x - droidcam/work/.PLIST.readelf >sed 's/^X//' >droidcam/work/.PLIST.readelf << 'dd7534fbd90ee700df529271eadc4295' >X >XFile: /usr/local/bin/droidcam >X >XRelocation section with addend (.rela.dyn): >Xr_offset r_info r_type st_value st_name + r_addend >X000000211280 00b000000005 R_X86_64_COPY 0000000000211280 __stack_chk_guard + 0 >X0000002112d0 00b100000005 R_X86_64_COPY 00000000002112d0 __stdoutp + 0 >X0000002112e0 00b200000005 R_X86_64_COPY 00000000002112e0 __isthreaded + 0 >X0000002112c0 00b400000005 R_X86_64_COPY 00000000002112c0 __stderrp + 0 >X >XRelocation section with addend (.rela.plt): >Xr_offset r_info r_type st_value st_name + r_addend >X0000002107b8 000100000007 R_X86_64_JUMP_SLOT 0000000000000000 __libc_start1 + 0 >X0000002107c0 000200000007 R_X86_64_JUMP_SLOT 0000000000000000 _Jv_RegisterClasses + 0 >X0000002107c8 000300000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_message_dialog_new + 0 >X0000002107d0 000400000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_window_set_title + 0 >X0000002107d8 000500000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_dialog_run + 0 >X0000002107e0 000600000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_widget_destroy + 0 >X0000002107e8 000700000007 R_X86_64_JUMP_SLOT 0000000000000000 strncpy + 0 >X0000002107f0 000800000007 R_X86_64_JUMP_SLOT 0000000000000000 gdk_threads_add_idle + 0 >X0000002107f8 000900000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_label_set_text + 0 >X000000210800 000a00000007 R_X86_64_JUMP_SLOT 0000000000000000 XInitThreads + 0 >X000000210808 000b00000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_init + 0 >X000000210810 000c00000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_window_new + 0 >X000000210818 000d00000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_container_set_border_width + 0 >X000000210820 000e00000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_window_set_resizable + 0 >X000000210828 000f00000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_window_set_position + 0 >X000000210830 001000000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_window_set_icon_from_file + 0 >X000000210838 001100000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_accel_group_new + 0 >X000000210840 001200000007 R_X86_64_JUMP_SLOT 0000000000000000 g_cclosure_new + 0 >X000000210848 001300000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_accel_group_connect + 0 >X000000210850 001400000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_window_add_accel_group + 0 >X000000210858 001500000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_menu_new + 0 >X000000210860 001600000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_menu_item_new_with_label + 0 >X000000210868 001700000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_menu_shell_append + 0 >X000000210870 001800000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_widget_show + 0 >X000000210878 001900000007 R_X86_64_JUMP_SLOT 0000000000000000 g_signal_connect_data + 0 >X000000210880 001a00000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_grid_new + 0 >X000000210888 001b00000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_container_add + 0 >X000000210890 001c00000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_grid_set_column_spacing + 0 >X000000210898 001d00000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_grid_set_row_spacing + 0 >X0000002108a0 001e00000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_grid_attach + 0 >X0000002108a8 001f00000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_radio_button_new_with_label + 0 >X0000002108b0 002000000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_radio_button_new_with_label_from_widget + 0 >X0000002108b8 002100000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_grid_attach_next_to + 0 >X0000002108c0 002200000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_check_button_new_with_label + 0 >X0000002108c8 002300000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_button_new_with_label + 0 >X0000002108d0 002400000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_widget_set_tooltip_text + 0 >X0000002108d8 002500000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_label_new + 0 >X0000002108e0 002600000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_toggle_button_new_with_label + 0 >X0000002108e8 002700000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_label_set_xalign + 0 >X0000002108f0 002800000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_entry_new + 0 >X0000002108f8 002900000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_entry_set_max_length + 0 >X000000210900 00b300000007 R_X86_64_JUMP_SLOT 000000000020db20 gtk_main_quit + 0 >X000000210908 002a00000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_widget_show_all + 0 >X000000210910 002b00000007 R_X86_64_JUMP_SLOT 0000000000000000 snprintf + 0 >X000000210918 002c00000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_entry_set_text + 0 >X000000210920 002d00000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_toggle_button_set_active + 0 >X000000210928 002e00000007 R_X86_64_JUMP_SLOT 0000000000000000 printf + 0 >X000000210930 002f00000007 R_X86_64_JUMP_SLOT 0000000000000000 pango_attr_list_new + 0 >X000000210938 003000000007 R_X86_64_JUMP_SLOT 0000000000000000 pango_attr_size_new_absolute + 0 >X000000210940 003100000007 R_X86_64_JUMP_SLOT 0000000000000000 pango_attr_list_insert + 0 >X000000210948 003200000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_label_set_attributes + 0 >X000000210950 003300000007 R_X86_64_JUMP_SLOT 0000000000000000 pango_attr_list_unref + 0 >X000000210958 003400000007 R_X86_64_JUMP_SLOT 0000000000000000 app_indicator_new + 0 >X000000210960 003500000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_widget_set_sensitive + 0 >X000000210968 003600000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_separator_menu_item_new + 0 >X000000210970 003700000007 R_X86_64_JUMP_SLOT 0000000000000000 app_indicator_set_status + 0 >X000000210978 003800000007 R_X86_64_JUMP_SLOT 0000000000000000 app_indicator_set_menu + 0 >X000000210980 003900000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_main + 0 >X000000210988 003a00000007 R_X86_64_JUMP_SLOT 0000000000000000 sscanf + 0 >X000000210990 003b00000007 R_X86_64_JUMP_SLOT 0000000000000000 exit + 0 >X000000210998 003c00000007 R_X86_64_JUMP_SLOT 0000000000000000 __stack_chk_fail + 0 >X0000002109a0 003d00000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_entry_get_text + 0 >X0000002109a8 003e00000007 R_X86_64_JUMP_SLOT 0000000000000000 strtoul + 0 >X0000002109b0 003f00000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_button_set_label + 0 >X0000002109b8 004000000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_toggle_button_get_active + 0 >X0000002109c0 004100000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_menu_popup_at_pointer + 0 >X0000002109c8 004200000007 R_X86_64_JUMP_SLOT 0000000000000000 g_thread_new + 0 >X0000002109d0 004300000007 R_X86_64_JUMP_SLOT 0000000000000000 strlen + 0 >X0000002109d8 004400000007 R_X86_64_JUMP_SLOT 0000000000000000 g_thread_join + 0 >X0000002109e0 004500000007 R_X86_64_JUMP_SLOT 0000000000000000 fwrite + 0 >X0000002109e8 004600000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_widget_hide + 0 >X0000002109f0 004700000007 R_X86_64_JUMP_SLOT 0000000000000000 gtk_window_close + 0 >X0000002109f8 004800000007 R_X86_64_JUMP_SLOT 0000000000000000 g_static_resource_get_resource + 0 >X000000210a00 004900000007 R_X86_64_JUMP_SLOT 0000000000000000 g_static_resource_init + 0 >X000000210a08 004a00000007 R_X86_64_JUMP_SLOT 0000000000000000 g_static_resource_fini + 0 >X000000210a10 004b00000007 R_X86_64_JUMP_SLOT 0000000000000000 socket + 0 >X000000210a18 004c00000007 R_X86_64_JUMP_SLOT 0000000000000000 __inet_addr + 0 >X000000210a20 004d00000007 R_X86_64_JUMP_SLOT 0000000000000000 fcntl + 0 >X000000210a28 004e00000007 R_X86_64_JUMP_SLOT 0000000000000000 connect + 0 >X000000210a30 004f00000007 R_X86_64_JUMP_SLOT 0000000000000000 __error + 0 >X000000210a38 005000000007 R_X86_64_JUMP_SLOT 0000000000000000 select + 0 >X000000210a40 005100000007 R_X86_64_JUMP_SLOT 0000000000000000 setsockopt + 0 >X000000210a48 005200000007 R_X86_64_JUMP_SLOT 0000000000000000 perror + 0 >X000000210a50 005300000007 R_X86_64_JUMP_SLOT 0000000000000000 strerror + 0 >X000000210a58 005400000007 R_X86_64_JUMP_SLOT 0000000000000000 fprintf + 0 >X000000210a60 005500000007 R_X86_64_JUMP_SLOT 0000000000000000 close + 0 >X000000210a68 005600000007 R_X86_64_JUMP_SLOT 0000000000000000 send + 0 >X000000210a70 005700000007 R_X86_64_JUMP_SLOT 0000000000000000 recv + 0 >X000000210a78 005800000007 R_X86_64_JUMP_SLOT 0000000000000000 recvfrom + 0 >X000000210a80 005900000007 R_X86_64_JUMP_SLOT 0000000000000000 sendto + 0 >X000000210a88 005a00000007 R_X86_64_JUMP_SLOT 0000000000000000 usleep + 0 >X000000210a90 005b00000007 R_X86_64_JUMP_SLOT 0000000000000000 accept + 0 >X000000210a98 005c00000007 R_X86_64_JUMP_SLOT 0000000000000000 bind + 0 >X000000210aa0 005d00000007 R_X86_64_JUMP_SLOT 0000000000000000 listen + 0 >X000000210aa8 005e00000007 R_X86_64_JUMP_SLOT 0000000000000000 getenv + 0 >X000000210ab0 005f00000007 R_X86_64_JUMP_SLOT 0000000000000000 fopen + 0 >X000000210ab8 006000000007 R_X86_64_JUMP_SLOT 0000000000000000 fgets + 0 >X000000210ac0 006100000007 R_X86_64_JUMP_SLOT 0000000000000000 fclose + 0 >X000000210ac8 006200000007 R_X86_64_JUMP_SLOT 0000000000000000 memset + 0 >X000000210ad0 006300000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_output_stdio_attach + 0 >X000000210ad8 006400000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_bits_init + 0 >X000000210ae0 006500000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_lib_get_mode + 0 >X000000210ae8 006600000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_decoder_init + 0 >X000000210af0 006700000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_decoder_ctl + 0 >X000000210af8 006800000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_close + 0 >X000000210b00 006900000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_bits_destroy + 0 >X000000210b08 006a00000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_decoder_destroy + 0 >X000000210b10 006b00000007 R_X86_64_JUMP_SLOT 0000000000000000 tjInitDecompress + 0 >X000000210b18 006c00000007 R_X86_64_JUMP_SLOT 0000000000000000 tjInitTransform + 0 >X000000210b20 006d00000007 R_X86_64_JUMP_SLOT 0000000000000000 malloc + 0 >X000000210b28 006e00000007 R_X86_64_JUMP_SLOT 0000000000000000 sws_getCachedContext + 0 >X000000210b30 006f00000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_bits_reset + 0 >X000000210b38 007000000007 R_X86_64_JUMP_SLOT 0000000000000000 free + 0 >X000000210b40 007100000007 R_X86_64_JUMP_SLOT 0000000000000000 sws_freeContext + 0 >X000000210b48 007200000007 R_X86_64_JUMP_SLOT 0000000000000000 tjDestroy + 0 >X000000210b50 007300000007 R_X86_64_JUMP_SLOT 0000000000000000 tjTransform + 0 >X000000210b58 007400000007 R_X86_64_JUMP_SLOT 0000000000000000 tjGetErrorStr + 0 >X000000210b60 007500000007 R_X86_64_JUMP_SLOT 0000000000000000 tjDecompressHeader3 + 0 >X000000210b68 007600000007 R_X86_64_JUMP_SLOT 0000000000000000 tjDecompressToYUVPlanes + 0 >X000000210b70 007700000007 R_X86_64_JUMP_SLOT 0000000000000000 tjGetErrorCode + 0 >X000000210b78 007800000007 R_X86_64_JUMP_SLOT 0000000000000000 sws_scale + 0 >X000000210b80 007900000007 R_X86_64_JUMP_SLOT 0000000000000000 tjGetErrorStr2 + 0 >X000000210b88 007a00000007 R_X86_64_JUMP_SLOT 0000000000000000 write + 0 >X000000210b90 007b00000007 R_X86_64_JUMP_SLOT 0000000000000000 rand + 0 >X000000210b98 007c00000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_decode_int + 0 >X000000210ba0 007d00000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_bits_read_from + 0 >X000000210ba8 007e00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_state + 0 >X000000210bb0 007f00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_prepare + 0 >X000000210bb8 008000000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_avail_update + 0 >X000000210bc0 008100000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_start + 0 >X000000210bc8 008200000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_strerror + 0 >X000000210bd0 008300000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_mmap_begin + 0 >X000000210bd8 008400000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_wait + 0 >X000000210be0 008500000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_mmap_commit + 0 >X000000210be8 008600000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_sizeof + 0 >X000000210bf0 008700000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_sw_params_sizeof + 0 >X000000210bf8 008800000007 R_X86_64_JUMP_SLOT 0000000000000000 fread + 0 >X000000210c00 008900000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_open + 0 >X000000210c08 008a00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_any + 0 >X000000210c10 008b00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_set_rate_resample + 0 >X000000210c18 008c00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_set_access + 0 >X000000210c20 008d00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_set_format + 0 >X000000210c28 008e00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_set_channels + 0 >X000000210c30 008f00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_set_rate_near + 0 >X000000210c38 009000000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_set_buffer_time_near + 0 >X000000210c40 009100000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_get_buffer_size + 0 >X000000210c48 009200000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_set_period_time_near + 0 >X000000210c50 009300000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_get_period_size + 0 >X000000210c58 009400000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params + 0 >X000000210c60 009500000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_sw_params_current + 0 >X000000210c68 009600000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_sw_params_set_start_threshold + 0 >X000000210c70 009700000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_sw_params_set_avail_min + 0 >X000000210c78 009800000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_sw_params + 0 >X000000210c80 009900000007 R_X86_64_JUMP_SLOT 0000000000000000 stat + 0 >X000000210c88 009a00000007 R_X86_64_JUMP_SLOT 0000000000000000 open + 0 >X000000210c90 009b00000007 R_X86_64_JUMP_SLOT 0000000000000000 ioctl + 0 >X000000210c98 009c00000007 R_X86_64_JUMP_SLOT 0000000000000000 strncmp + 0 >X000000210ca0 009d00000007 R_X86_64_JUMP_SLOT 0000000000000000 memcpy + 0 >X000000210ca8 009e00000007 R_X86_64_JUMP_SLOT 0000000000000000 memmove + 0 >X000000210cb0 009f00000007 R_X86_64_JUMP_SLOT 0000000000000000 system + 0 >X000000210cb8 00a000000007 R_X86_64_JUMP_SLOT 0000000000000000 popen + 0 >X000000210cc0 00a100000007 R_X86_64_JUMP_SLOT 0000000000000000 feof + 0 >X000000210cc8 00a200000007 R_X86_64_JUMP_SLOT 0000000000000000 strstr + 0 >X000000210cd0 00a300000007 R_X86_64_JUMP_SLOT 0000000000000000 pclose + 0 >X000000210cd8 00a400000007 R_X86_64_JUMP_SLOT 0000000000000000 usbmuxd_get_device_list + 0 >X000000210ce0 00a500000007 R_X86_64_JUMP_SLOT 0000000000000000 usbmuxd_connect + 0 >X000000210ce8 00a600000007 R_X86_64_JUMP_SLOT 0000000000000000 usbmuxd_device_list_free + 0 >X000000210cf0 00a700000007 R_X86_64_JUMP_SLOT 0000000000000000 pthread_mutex_init + 0 >X000000210cf8 00a800000007 R_X86_64_JUMP_SLOT 0000000000000000 pthread_mutex_destroy + 0 >X000000210d00 00a900000007 R_X86_64_JUMP_SLOT 0000000000000000 pthread_mutex_lock + 0 >X000000210d08 00aa00000007 R_X86_64_JUMP_SLOT 0000000000000000 pthread_mutex_unlock + 0 >X000000210d10 00ab00000007 R_X86_64_JUMP_SLOT 0000000000000000 calloc + 0 >X >XFile: /usr/local/bin/droidcam-cli >X >XRelocation section with addend (.rela.dyn): >Xr_offset r_info r_type st_value st_name + r_addend >X00000020d140 007700000005 R_X86_64_COPY 000000000020d140 __stack_chk_guard + 0 >X00000020d180 007800000005 R_X86_64_COPY 000000000020d180 __stdoutp + 0 >X00000020d190 007900000005 R_X86_64_COPY 000000000020d190 __isthreaded + 0 >X00000020d138 007a00000005 R_X86_64_COPY 000000000020d138 __stderrp + 0 >X >XRelocation section with addend (.rela.plt): >Xr_offset r_info r_type st_value st_name + r_addend >X00000020cab8 000100000007 R_X86_64_JUMP_SLOT 0000000000000000 __libc_start1 + 0 >X00000020cac0 000200000007 R_X86_64_JUMP_SLOT 0000000000000000 _Jv_RegisterClasses + 0 >X00000020cac8 000300000007 R_X86_64_JUMP_SLOT 0000000000000000 fprintf + 0 >X00000020cad0 000400000007 R_X86_64_JUMP_SLOT 0000000000000000 fcntl + 0 >X00000020cad8 000500000007 R_X86_64_JUMP_SLOT 0000000000000000 usleep + 0 >X00000020cae0 000600000007 R_X86_64_JUMP_SLOT 0000000000000000 read + 0 >X00000020cae8 000700000007 R_X86_64_JUMP_SLOT 0000000000000000 __error + 0 >X00000020caf0 000800000007 R_X86_64_JUMP_SLOT 0000000000000000 puts + 0 >X00000020caf8 000900000007 R_X86_64_JUMP_SLOT 0000000000000000 __stack_chk_fail + 0 >X00000020cb00 000a00000007 R_X86_64_JUMP_SLOT 0000000000000000 sscanf + 0 >X00000020cb08 000b00000007 R_X86_64_JUMP_SLOT 0000000000000000 strstr + 0 >X00000020cb10 000c00000007 R_X86_64_JUMP_SLOT 0000000000000000 strtoul + 0 >X00000020cb18 000d00000007 R_X86_64_JUMP_SLOT 0000000000000000 strncpy + 0 >X00000020cb20 000e00000007 R_X86_64_JUMP_SLOT 0000000000000000 printf + 0 >X00000020cb28 000f00000007 R_X86_64_JUMP_SLOT 0000000000000000 pthread_create + 0 >X00000020cb30 001000000007 R_X86_64_JUMP_SLOT 0000000000000000 signal + 0 >X00000020cb38 001100000007 R_X86_64_JUMP_SLOT 0000000000000000 pthread_join + 0 >X00000020cb40 001200000007 R_X86_64_JUMP_SLOT 0000000000000000 fputs + 0 >X00000020cb48 001300000007 R_X86_64_JUMP_SLOT 0000000000000000 exit + 0 >X00000020cb50 001400000007 R_X86_64_JUMP_SLOT 0000000000000000 socket + 0 >X00000020cb58 001500000007 R_X86_64_JUMP_SLOT 0000000000000000 __inet_addr + 0 >X00000020cb60 001600000007 R_X86_64_JUMP_SLOT 0000000000000000 connect + 0 >X00000020cb68 001700000007 R_X86_64_JUMP_SLOT 0000000000000000 select + 0 >X00000020cb70 001800000007 R_X86_64_JUMP_SLOT 0000000000000000 setsockopt + 0 >X00000020cb78 001900000007 R_X86_64_JUMP_SLOT 0000000000000000 perror + 0 >X00000020cb80 001a00000007 R_X86_64_JUMP_SLOT 0000000000000000 strerror + 0 >X00000020cb88 001b00000007 R_X86_64_JUMP_SLOT 0000000000000000 close + 0 >X00000020cb90 001c00000007 R_X86_64_JUMP_SLOT 0000000000000000 send + 0 >X00000020cb98 001d00000007 R_X86_64_JUMP_SLOT 0000000000000000 recv + 0 >X00000020cba0 001e00000007 R_X86_64_JUMP_SLOT 0000000000000000 recvfrom + 0 >X00000020cba8 001f00000007 R_X86_64_JUMP_SLOT 0000000000000000 sendto + 0 >X00000020cbb0 002000000007 R_X86_64_JUMP_SLOT 0000000000000000 accept + 0 >X00000020cbb8 002100000007 R_X86_64_JUMP_SLOT 0000000000000000 bind + 0 >X00000020cbc0 002200000007 R_X86_64_JUMP_SLOT 0000000000000000 listen + 0 >X00000020cbc8 002300000007 R_X86_64_JUMP_SLOT 0000000000000000 getenv + 0 >X00000020cbd0 002400000007 R_X86_64_JUMP_SLOT 0000000000000000 snprintf + 0 >X00000020cbd8 002500000007 R_X86_64_JUMP_SLOT 0000000000000000 fopen + 0 >X00000020cbe0 002600000007 R_X86_64_JUMP_SLOT 0000000000000000 fgets + 0 >X00000020cbe8 002700000007 R_X86_64_JUMP_SLOT 0000000000000000 fclose + 0 >X00000020cbf0 002800000007 R_X86_64_JUMP_SLOT 0000000000000000 memset + 0 >X00000020cbf8 002900000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_output_stdio_attach + 0 >X00000020cc00 002a00000007 R_X86_64_JUMP_SLOT 0000000000000000 fwrite + 0 >X00000020cc08 002b00000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_bits_init + 0 >X00000020cc10 002c00000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_lib_get_mode + 0 >X00000020cc18 002d00000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_decoder_init + 0 >X00000020cc20 002e00000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_decoder_ctl + 0 >X00000020cc28 002f00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_close + 0 >X00000020cc30 003000000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_bits_destroy + 0 >X00000020cc38 003100000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_decoder_destroy + 0 >X00000020cc40 003200000007 R_X86_64_JUMP_SLOT 0000000000000000 tjInitDecompress + 0 >X00000020cc48 003300000007 R_X86_64_JUMP_SLOT 0000000000000000 tjInitTransform + 0 >X00000020cc50 003400000007 R_X86_64_JUMP_SLOT 0000000000000000 malloc + 0 >X00000020cc58 003500000007 R_X86_64_JUMP_SLOT 0000000000000000 sws_getCachedContext + 0 >X00000020cc60 003600000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_bits_reset + 0 >X00000020cc68 003700000007 R_X86_64_JUMP_SLOT 0000000000000000 free + 0 >X00000020cc70 003800000007 R_X86_64_JUMP_SLOT 0000000000000000 sws_freeContext + 0 >X00000020cc78 003900000007 R_X86_64_JUMP_SLOT 0000000000000000 tjDestroy + 0 >X00000020cc80 003a00000007 R_X86_64_JUMP_SLOT 0000000000000000 tjTransform + 0 >X00000020cc88 003b00000007 R_X86_64_JUMP_SLOT 0000000000000000 tjGetErrorStr + 0 >X00000020cc90 003c00000007 R_X86_64_JUMP_SLOT 0000000000000000 tjDecompressHeader3 + 0 >X00000020cc98 003d00000007 R_X86_64_JUMP_SLOT 0000000000000000 tjDecompressToYUVPlanes + 0 >X00000020cca0 003e00000007 R_X86_64_JUMP_SLOT 0000000000000000 tjGetErrorCode + 0 >X00000020cca8 003f00000007 R_X86_64_JUMP_SLOT 0000000000000000 sws_scale + 0 >X00000020ccb0 004000000007 R_X86_64_JUMP_SLOT 0000000000000000 tjGetErrorStr2 + 0 >X00000020ccb8 004100000007 R_X86_64_JUMP_SLOT 0000000000000000 write + 0 >X00000020ccc0 004200000007 R_X86_64_JUMP_SLOT 0000000000000000 rand + 0 >X00000020ccc8 004300000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_decode_int + 0 >X00000020ccd0 004400000007 R_X86_64_JUMP_SLOT 0000000000000000 speex_bits_read_from + 0 >X00000020ccd8 004500000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_state + 0 >X00000020cce0 004600000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_prepare + 0 >X00000020cce8 004700000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_avail_update + 0 >X00000020ccf0 004800000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_start + 0 >X00000020ccf8 004900000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_strerror + 0 >X00000020cd00 004a00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_mmap_begin + 0 >X00000020cd08 004b00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_wait + 0 >X00000020cd10 004c00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_mmap_commit + 0 >X00000020cd18 004d00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_sizeof + 0 >X00000020cd20 004e00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_sw_params_sizeof + 0 >X00000020cd28 004f00000007 R_X86_64_JUMP_SLOT 0000000000000000 fread + 0 >X00000020cd30 005000000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_open + 0 >X00000020cd38 005100000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_any + 0 >X00000020cd40 005200000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_set_rate_resample + 0 >X00000020cd48 005300000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_set_access + 0 >X00000020cd50 005400000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_set_format + 0 >X00000020cd58 005500000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_set_channels + 0 >X00000020cd60 005600000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_set_rate_near + 0 >X00000020cd68 005700000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_set_buffer_time_near + 0 >X00000020cd70 005800000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_get_buffer_size + 0 >X00000020cd78 005900000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_set_period_time_near + 0 >X00000020cd80 005a00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params_get_period_size + 0 >X00000020cd88 005b00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_hw_params + 0 >X00000020cd90 005c00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_sw_params_current + 0 >X00000020cd98 005d00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_sw_params_set_start_threshold + 0 >X00000020cda0 005e00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_sw_params_set_avail_min + 0 >X00000020cda8 005f00000007 R_X86_64_JUMP_SLOT 0000000000000000 snd_pcm_sw_params + 0 >X00000020cdb0 006000000007 R_X86_64_JUMP_SLOT 0000000000000000 stat + 0 >X00000020cdb8 006100000007 R_X86_64_JUMP_SLOT 0000000000000000 open + 0 >X00000020cdc0 006200000007 R_X86_64_JUMP_SLOT 0000000000000000 strlen + 0 >X00000020cdc8 006300000007 R_X86_64_JUMP_SLOT 0000000000000000 ioctl + 0 >X00000020cdd0 006400000007 R_X86_64_JUMP_SLOT 0000000000000000 strncmp + 0 >X00000020cdd8 006500000007 R_X86_64_JUMP_SLOT 0000000000000000 memcpy + 0 >X00000020cde0 006600000007 R_X86_64_JUMP_SLOT 0000000000000000 memmove + 0 >X00000020cde8 006700000007 R_X86_64_JUMP_SLOT 0000000000000000 system + 0 >X00000020cdf0 006800000007 R_X86_64_JUMP_SLOT 0000000000000000 popen + 0 >X00000020cdf8 006900000007 R_X86_64_JUMP_SLOT 0000000000000000 feof + 0 >X00000020ce00 006a00000007 R_X86_64_JUMP_SLOT 0000000000000000 pclose + 0 >X00000020ce08 006b00000007 R_X86_64_JUMP_SLOT 0000000000000000 usbmuxd_get_device_list + 0 >X00000020ce10 006c00000007 R_X86_64_JUMP_SLOT 0000000000000000 usbmuxd_connect + 0 >X00000020ce18 006d00000007 R_X86_64_JUMP_SLOT 0000000000000000 usbmuxd_device_list_free + 0 >X00000020ce20 006e00000007 R_X86_64_JUMP_SLOT 0000000000000000 pthread_mutex_init + 0 >X00000020ce28 006f00000007 R_X86_64_JUMP_SLOT 0000000000000000 pthread_mutex_destroy + 0 >X00000020ce30 007000000007 R_X86_64_JUMP_SLOT 0000000000000000 pthread_mutex_lock + 0 >X00000020ce38 007100000007 R_X86_64_JUMP_SLOT 0000000000000000 pthread_mutex_unlock + 0 >X00000020ce40 007200000007 R_X86_64_JUMP_SLOT 0000000000000000 calloc + 0 >X >XFile: /usr/local/share/applications/droidcam.desktop >X >XFile: /usr/local/share/pixmaps/droidcam-icon.png >X >XFile: /usr/local/share/licenses/droidcam-2.1.3/catalog.mk >X >XFile: /usr/local/share/licenses/droidcam-2.1.3/LICENSE >X >XFile: /usr/local/share/licenses/droidcam-2.1.3/GPLv2 >dd7534fbd90ee700df529271eadc4295 >echo c - droidcam/work/stage >mkdir -p droidcam/work/stage > /dev/null 2>&1 >echo c - droidcam/work/stage/usr >mkdir -p droidcam/work/stage/usr > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local >mkdir -p droidcam/work/stage/usr/local > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/libexec >mkdir -p droidcam/work/stage/usr/local/libexec > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/libdata >mkdir -p droidcam/work/stage/usr/local/libdata > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/libdata/ldconfig >mkdir -p droidcam/work/stage/usr/local/libdata/ldconfig > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/libdata/ldconfig32 >mkdir -p droidcam/work/stage/usr/local/libdata/ldconfig32 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/libdata/pkgconfig >mkdir -p droidcam/work/stage/usr/local/libdata/pkgconfig > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share >mkdir -p droidcam/work/stage/usr/local/share > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/zsh >mkdir -p droidcam/work/stage/usr/local/share/zsh > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/zsh/site-functions >mkdir -p droidcam/work/stage/usr/local/share/zsh/site-functions > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/skel >mkdir -p droidcam/work/stage/usr/local/share/skel > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/emacs >mkdir -p droidcam/work/stage/usr/local/share/emacs > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/emacs/site-lisp >mkdir -p droidcam/work/stage/usr/local/share/emacs/site-lisp > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/examples >mkdir -p droidcam/work/stage/usr/local/share/examples > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/misc >mkdir -p droidcam/work/stage/usr/local/share/misc > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale >mkdir -p droidcam/work/stage/usr/local/share/locale > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/tk >mkdir -p droidcam/work/stage/usr/local/share/locale/tk > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/tk/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/tk/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/sl >mkdir -p droidcam/work/stage/usr/local/share/locale/sl > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/sl/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/sl/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ta >mkdir -p droidcam/work/stage/usr/local/share/locale/ta > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ta/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/ta/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/hi >mkdir -p droidcam/work/stage/usr/local/share/locale/hi > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/hi/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/hi/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/sr >mkdir -p droidcam/work/stage/usr/local/share/locale/sr > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/sr/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/sr/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/en_AU >mkdir -p droidcam/work/stage/usr/local/share/locale/en_AU > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/en_AU/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/en_AU/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ee >mkdir -p droidcam/work/stage/usr/local/share/locale/ee > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ee/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/ee/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ka >mkdir -p droidcam/work/stage/usr/local/share/locale/ka > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ka/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/ka/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/eo >mkdir -p droidcam/work/stage/usr/local/share/locale/eo > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/eo/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/eo/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/it >mkdir -p droidcam/work/stage/usr/local/share/locale/it > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/it/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/it/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ro >mkdir -p droidcam/work/stage/usr/local/share/locale/ro > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ro/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/ro/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ca >mkdir -p droidcam/work/stage/usr/local/share/locale/ca > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ca/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/ca/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/dk >mkdir -p droidcam/work/stage/usr/local/share/locale/dk > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/dk/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/dk/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/en_GB >mkdir -p droidcam/work/stage/usr/local/share/locale/en_GB > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/en_GB/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/en_GB/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/da >mkdir -p droidcam/work/stage/usr/local/share/locale/da > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/da/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/da/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/es_MX >mkdir -p droidcam/work/stage/usr/local/share/locale/es_MX > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/es_MX/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/es_MX/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/de_AT >mkdir -p droidcam/work/stage/usr/local/share/locale/de_AT > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/de_AT/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/de_AT/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/is >mkdir -p droidcam/work/stage/usr/local/share/locale/is > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/is/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/is/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/be >mkdir -p droidcam/work/stage/usr/local/share/locale/be > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/be/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/be/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/tr >mkdir -p droidcam/work/stage/usr/local/share/locale/tr > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/tr/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/tr/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/am >mkdir -p droidcam/work/stage/usr/local/share/locale/am > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/am/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/am/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/fr_FR >mkdir -p droidcam/work/stage/usr/local/share/locale/fr_FR > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/fr_FR/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/fr_FR/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/sk >mkdir -p droidcam/work/stage/usr/local/share/locale/sk > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/sk/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/sk/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/zh >mkdir -p droidcam/work/stage/usr/local/share/locale/zh > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/zh/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/zh/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/pt_BR >mkdir -p droidcam/work/stage/usr/local/share/locale/pt_BR > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/pt_BR/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/pt_BR/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/sq >mkdir -p droidcam/work/stage/usr/local/share/locale/sq > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/sq/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/sq/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/th >mkdir -p droidcam/work/stage/usr/local/share/locale/th > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/th/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/th/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/pt_PT >mkdir -p droidcam/work/stage/usr/local/share/locale/pt_PT > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/pt_PT/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/pt_PT/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/el >mkdir -p droidcam/work/stage/usr/local/share/locale/el > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/el/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/el/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/zh_TW.Big5 >mkdir -p droidcam/work/stage/usr/local/share/locale/zh_TW.Big5 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/zh_TW.Big5/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/zh_TW.Big5/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/nn >mkdir -p droidcam/work/stage/usr/local/share/locale/nn > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/nn/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/nn/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/uk >mkdir -p droidcam/work/stage/usr/local/share/locale/uk > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/uk/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/uk/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/de >mkdir -p droidcam/work/stage/usr/local/share/locale/de > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/de/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/de/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ml >mkdir -p droidcam/work/stage/usr/local/share/locale/ml > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ml/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/ml/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ja >mkdir -p droidcam/work/stage/usr/local/share/locale/ja > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ja/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/ja/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/vi >mkdir -p droidcam/work/stage/usr/local/share/locale/vi > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/vi/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/vi/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/mk >mkdir -p droidcam/work/stage/usr/local/share/locale/mk > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/mk/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/mk/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ru >mkdir -p droidcam/work/stage/usr/local/share/locale/ru > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ru/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/ru/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/id >mkdir -p droidcam/work/stage/usr/local/share/locale/id > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/id/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/id/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/eu >mkdir -p droidcam/work/stage/usr/local/share/locale/eu > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/eu/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/eu/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/br >mkdir -p droidcam/work/stage/usr/local/share/locale/br > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/br/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/br/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/lv >mkdir -p droidcam/work/stage/usr/local/share/locale/lv > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/lv/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/lv/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ko >mkdir -p droidcam/work/stage/usr/local/share/locale/ko > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ko/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/ko/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/pt >mkdir -p droidcam/work/stage/usr/local/share/locale/pt > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/pt/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/pt/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/az >mkdir -p droidcam/work/stage/usr/local/share/locale/az > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/az/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/az/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/fi >mkdir -p droidcam/work/stage/usr/local/share/locale/fi > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/fi/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/fi/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/fa_IR >mkdir -p droidcam/work/stage/usr/local/share/locale/fa_IR > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/fa_IR/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/fa_IR/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/sv >mkdir -p droidcam/work/stage/usr/local/share/locale/sv > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/sv/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/sv/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/bn >mkdir -p droidcam/work/stage/usr/local/share/locale/bn > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/bn/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/bn/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/lt >mkdir -p droidcam/work/stage/usr/local/share/locale/lt > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/lt/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/lt/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/he >mkdir -p droidcam/work/stage/usr/local/share/locale/he > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/he/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/he/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/af >mkdir -p droidcam/work/stage/usr/local/share/locale/af > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/af/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/af/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/fa >mkdir -p droidcam/work/stage/usr/local/share/locale/fa > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/fa/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/fa/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/es_ES >mkdir -p droidcam/work/stage/usr/local/share/locale/es_ES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/es_ES/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/es_ES/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ar >mkdir -p droidcam/work/stage/usr/local/share/locale/ar > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ar/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/ar/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/tg >mkdir -p droidcam/work/stage/usr/local/share/locale/tg > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/tg/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/tg/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/cy >mkdir -p droidcam/work/stage/usr/local/share/locale/cy > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/cy/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/cy/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/sr@Latn >mkdir -p droidcam/work/stage/usr/local/share/locale/sr@Latn > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/sr@Latn/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/sr@Latn/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/cs >mkdir -p droidcam/work/stage/usr/local/share/locale/cs > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/cs/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/cs/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/uz >mkdir -p droidcam/work/stage/usr/local/share/locale/uz > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/uz/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/uz/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/zh_CN.GB2312 >mkdir -p droidcam/work/stage/usr/local/share/locale/zh_CN.GB2312 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/zh_CN.GB2312/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/zh_CN.GB2312/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/nl >mkdir -p droidcam/work/stage/usr/local/share/locale/nl > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/nl/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/nl/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/en_CA >mkdir -p droidcam/work/stage/usr/local/share/locale/en_CA > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/en_CA/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/en_CA/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/mn >mkdir -p droidcam/work/stage/usr/local/share/locale/mn > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/mn/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/mn/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/fr >mkdir -p droidcam/work/stage/usr/local/share/locale/fr > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/fr/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/fr/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/en >mkdir -p droidcam/work/stage/usr/local/share/locale/en > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/en/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/en/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/bs >mkdir -p droidcam/work/stage/usr/local/share/locale/bs > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/bs/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/bs/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/et >mkdir -p droidcam/work/stage/usr/local/share/locale/et > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/et/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/et/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/pa >mkdir -p droidcam/work/stage/usr/local/share/locale/pa > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/pa/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/pa/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/bg >mkdir -p droidcam/work/stage/usr/local/share/locale/bg > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/bg/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/bg/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/kn >mkdir -p droidcam/work/stage/usr/local/share/locale/kn > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/kn/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/kn/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/li >mkdir -p droidcam/work/stage/usr/local/share/locale/li > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/li/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/li/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/hr >mkdir -p droidcam/work/stage/usr/local/share/locale/hr > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/hr/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/hr/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/mt >mkdir -p droidcam/work/stage/usr/local/share/locale/mt > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/mt/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/mt/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/gu >mkdir -p droidcam/work/stage/usr/local/share/locale/gu > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/gu/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/gu/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/nb >mkdir -p droidcam/work/stage/usr/local/share/locale/nb > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/nb/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/nb/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/zh_CN >mkdir -p droidcam/work/stage/usr/local/share/locale/zh_CN > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/zh_CN/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/zh_CN/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ga >mkdir -p droidcam/work/stage/usr/local/share/locale/ga > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ga/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/ga/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/gl >mkdir -p droidcam/work/stage/usr/local/share/locale/gl > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/gl/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/gl/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ne >mkdir -p droidcam/work/stage/usr/local/share/locale/ne > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ne/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/ne/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/no >mkdir -p droidcam/work/stage/usr/local/share/locale/no > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/no/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/no/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ms >mkdir -p droidcam/work/stage/usr/local/share/locale/ms > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/ms/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/ms/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/or >mkdir -p droidcam/work/stage/usr/local/share/locale/or > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/or/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/or/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/hu >mkdir -p droidcam/work/stage/usr/local/share/locale/hu > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/hu/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/hu/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/zh_TW >mkdir -p droidcam/work/stage/usr/local/share/locale/zh_TW > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/zh_TW/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/zh_TW/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/pl >mkdir -p droidcam/work/stage/usr/local/share/locale/pl > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/pl/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/pl/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/es >mkdir -p droidcam/work/stage/usr/local/share/locale/es > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/es/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/es/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/wa >mkdir -p droidcam/work/stage/usr/local/share/locale/wa > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/locale/wa/LC_MESSAGES >mkdir -p droidcam/work/stage/usr/local/share/locale/wa/LC_MESSAGES > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/xml >mkdir -p droidcam/work/stage/usr/local/share/xml > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/fish >mkdir -p droidcam/work/stage/usr/local/share/fish > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/fish/vendor_completions.d >mkdir -p droidcam/work/stage/usr/local/share/fish/vendor_completions.d > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/aclocal >mkdir -p droidcam/work/stage/usr/local/share/aclocal > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/icons >mkdir -p droidcam/work/stage/usr/local/share/icons > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/bash-completion >mkdir -p droidcam/work/stage/usr/local/share/bash-completion > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/bash-completion/completions >mkdir -p droidcam/work/stage/usr/local/share/bash-completion/completions > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/java >mkdir -p droidcam/work/stage/usr/local/share/java > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/java/classes >mkdir -p droidcam/work/stage/usr/local/share/java/classes > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/doc >mkdir -p droidcam/work/stage/usr/local/share/doc > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/doc/ja >mkdir -p droidcam/work/stage/usr/local/share/doc/ja > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man >mkdir -p droidcam/work/stage/usr/local/share/man > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/man4 >mkdir -p droidcam/work/stage/usr/local/share/man/man4 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/cat9 >mkdir -p droidcam/work/stage/usr/local/share/man/cat9 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/cat3 >mkdir -p droidcam/work/stage/usr/local/share/man/cat3 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/mann >mkdir -p droidcam/work/stage/usr/local/share/man/mann > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/ja >mkdir -p droidcam/work/stage/usr/local/share/man/ja > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/ja/man8 >mkdir -p droidcam/work/stage/usr/local/share/man/ja/man8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/ja/man1 >mkdir -p droidcam/work/stage/usr/local/share/man/ja/man1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/ja/man7 >mkdir -p droidcam/work/stage/usr/local/share/man/ja/man7 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/ru.KOI8-R >mkdir -p droidcam/work/stage/usr/local/share/man/ru.KOI8-R > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/ru.KOI8-R/man1 >mkdir -p droidcam/work/stage/usr/local/share/man/ru.KOI8-R/man1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/cat4 >mkdir -p droidcam/work/stage/usr/local/share/man/cat4 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/man3 >mkdir -p droidcam/work/stage/usr/local/share/man/man3 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/man9 >mkdir -p droidcam/work/stage/usr/local/share/man/man9 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/man7 >mkdir -p droidcam/work/stage/usr/local/share/man/man7 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/it >mkdir -p droidcam/work/stage/usr/local/share/man/it > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/it/man7 >mkdir -p droidcam/work/stage/usr/local/share/man/it/man7 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/it/man8 >mkdir -p droidcam/work/stage/usr/local/share/man/it/man8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/cat7 >mkdir -p droidcam/work/stage/usr/local/share/man/cat7 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/cat5 >mkdir -p droidcam/work/stage/usr/local/share/man/cat5 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/man8 >mkdir -p droidcam/work/stage/usr/local/share/man/man8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/man2 >mkdir -p droidcam/work/stage/usr/local/share/man/man2 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/man5 >mkdir -p droidcam/work/stage/usr/local/share/man/man5 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/cat2 >mkdir -p droidcam/work/stage/usr/local/share/man/cat2 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/cat8 >mkdir -p droidcam/work/stage/usr/local/share/man/cat8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/es >mkdir -p droidcam/work/stage/usr/local/share/man/es > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/es/man7 >mkdir -p droidcam/work/stage/usr/local/share/man/es/man7 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/es/man8 >mkdir -p droidcam/work/stage/usr/local/share/man/es/man8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/man1 >mkdir -p droidcam/work/stage/usr/local/share/man/man1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/cat6 >mkdir -p droidcam/work/stage/usr/local/share/man/cat6 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/manl >mkdir -p droidcam/work/stage/usr/local/share/man/manl > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/cat1 >mkdir -p droidcam/work/stage/usr/local/share/man/cat1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/man6 >mkdir -p droidcam/work/stage/usr/local/share/man/man6 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/fr >mkdir -p droidcam/work/stage/usr/local/share/man/fr > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/man/fr/man7 >mkdir -p droidcam/work/stage/usr/local/share/man/fr/man7 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/applications >mkdir -p droidcam/work/stage/usr/local/share/applications > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/dict >mkdir -p droidcam/work/stage/usr/local/share/dict > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/licenses >mkdir -p droidcam/work/stage/usr/local/share/licenses > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/licenses/droidcam-2.1.3 >mkdir -p droidcam/work/stage/usr/local/share/licenses/droidcam-2.1.3 > /dev/null 2>&1 >echo x - droidcam/work/stage/usr/local/share/licenses/droidcam-2.1.3/catalog.mk >sed 's/^X//' >droidcam/work/stage/usr/local/share/licenses/droidcam-2.1.3/catalog.mk << 'bc2a3a1100ac9443570321ec9dd2a063' >X_LICENSE=GPLv2 >X_LICENSE_NAME=GNU General Public License version 2 >X_LICENSE_PERMS=dist-mirror dist-sell pkg-mirror pkg-sell auto-accept >X_LICENSE_GROUPS=FSF GPL OSI >X_LICENSE_DISTFILES=dev47apps-droidcam-v2.1.3_GH0.tar.gz >bc2a3a1100ac9443570321ec9dd2a063 >echo x - droidcam/work/stage/usr/local/share/licenses/droidcam-2.1.3/GPLv2 >sed 's/^X//' >droidcam/work/stage/usr/local/share/licenses/droidcam-2.1.3/GPLv2 << 'c2b56a17d89d1309f21eb2d9b2a160f5' >XGNU GENERAL PUBLIC LICENSE >X Version 2, June 1991 >X >X Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/> >X 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA >X Everyone is permitted to copy and distribute verbatim copies >X of this license document, but changing it is not allowed. >X >X Preamble >X >X The licenses for most software are designed to take away your >Xfreedom to share and change it. By contrast, the GNU General Public >XLicense is intended to guarantee your freedom to share and change free >Xsoftware--to make sure the software is free for all its users. This >XGeneral Public License applies to most of the Free Software >XFoundation's software and to any other program whose authors commit to >Xusing it. (Some other Free Software Foundation software is covered by >Xthe GNU Lesser General Public License instead.) You can apply it to >Xyour programs, too. >X >X When we speak of free software, we are referring to freedom, not >Xprice. Our General Public Licenses are designed to make sure that you >Xhave the freedom to distribute copies of free software (and charge for >Xthis service if you wish), that you receive source code or can get it >Xif you want it, that you can change the software or use pieces of it >Xin new free programs; and that you know you can do these things. >X >X To protect your rights, we need to make restrictions that forbid >Xanyone to deny you these rights or to ask you to surrender the rights. >XThese restrictions translate to certain responsibilities for you if you >Xdistribute copies of the software, or if you modify it. >X >X For example, if you distribute copies of such a program, whether >Xgratis or for a fee, you must give the recipients all the rights that >Xyou have. You must make sure that they, too, receive or can get the >Xsource code. And you must show them these terms so they know their >Xrights. >X >X We protect your rights with two steps: (1) copyright the software, and >X(2) offer you this license which gives you legal permission to copy, >Xdistribute and/or modify the software. >X >X Also, for each author's protection and ours, we want to make certain >Xthat everyone understands that there is no warranty for this free >Xsoftware. If the software is modified by someone else and passed on, we >Xwant its recipients to know that what they have is not the original, so >Xthat any problems introduced by others will not reflect on the original >Xauthors' reputations. >X >X Finally, any free program is threatened constantly by software >Xpatents. We wish to avoid the danger that redistributors of a free >Xprogram will individually obtain patent licenses, in effect making the >Xprogram proprietary. To prevent this, we have made it clear that any >Xpatent must be licensed for everyone's free use or not licensed at all. >X >X The precise terms and conditions for copying, distribution and >Xmodification follow. >X >X GNU GENERAL PUBLIC LICENSE >X TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION >X >X 0. This License applies to any program or other work which contains >Xa notice placed by the copyright holder saying it may be distributed >Xunder the terms of this General Public License. The "Program", below, >Xrefers to any such program or work, and a "work based on the Program" >Xmeans either the Program or any derivative work under copyright law: >Xthat is to say, a work containing the Program or a portion of it, >Xeither verbatim or with modifications and/or translated into another >Xlanguage. (Hereinafter, translation is included without limitation in >Xthe term "modification".) Each licensee is addressed as "you". >X >XActivities other than copying, distribution and modification are not >Xcovered by this License; they are outside its scope. The act of >Xrunning the Program is not restricted, and the output from the Program >Xis covered only if its contents constitute a work based on the >XProgram (independent of having been made by running the Program). >XWhether that is true depends on what the Program does. >X >X 1. You may copy and distribute verbatim copies of the Program's >Xsource code as you receive it, in any medium, provided that you >Xconspicuously and appropriately publish on each copy an appropriate >Xcopyright notice and disclaimer of warranty; keep intact all the >Xnotices that refer to this License and to the absence of any warranty; >Xand give any other recipients of the Program a copy of this License >Xalong with the Program. >X >XYou may charge a fee for the physical act of transferring a copy, and >Xyou may at your option offer warranty protection in exchange for a fee. >X >X 2. You may modify your copy or copies of the Program or any portion >Xof it, thus forming a work based on the Program, and copy and >Xdistribute such modifications or work under the terms of Section 1 >Xabove, provided that you also meet all of these conditions: >X >X a) You must cause the modified files to carry prominent notices >X stating that you changed the files and the date of any change. >X >X b) You must cause any work that you distribute or publish, that in >X whole or in part contains or is derived from the Program or any >X part thereof, to be licensed as a whole at no charge to all third >X parties under the terms of this License. >X >X c) If the modified program normally reads commands interactively >X when run, you must cause it, when started running for such >X interactive use in the most ordinary way, to print or display an >X announcement including an appropriate copyright notice and a >X notice that there is no warranty (or else, saying that you provide >X a warranty) and that users may redistribute the program under >X these conditions, and telling the user how to view a copy of this >X License. (Exception: if the Program itself is interactive but >X does not normally print such an announcement, your work based on >X the Program is not required to print an announcement.) >X >XThese requirements apply to the modified work as a whole. If >Xidentifiable sections of that work are not derived from the Program, >Xand can be reasonably considered independent and separate works in >Xthemselves, then this License, and its terms, do not apply to those >Xsections when you distribute them as separate works. But when you >Xdistribute the same sections as part of a whole which is a work based >Xon the Program, the distribution of the whole must be on the terms of >Xthis License, whose permissions for other licensees extend to the >Xentire whole, and thus to each and every part regardless of who wrote it. >X >XThus, it is not the intent of this section to claim rights or contest >Xyour rights to work written entirely by you; rather, the intent is to >Xexercise the right to control the distribution of derivative or >Xcollective works based on the Program. >X >XIn addition, mere aggregation of another work not based on the Program >Xwith the Program (or with a work based on the Program) on a volume of >Xa storage or distribution medium does not bring the other work under >Xthe scope of this License. >X >X 3. You may copy and distribute the Program (or a work based on it, >Xunder Section 2) in object code or executable form under the terms of >XSections 1 and 2 above provided that you also do one of the following: >X >X a) Accompany it with the complete corresponding machine-readable >X source code, which must be distributed under the terms of Sections >X 1 and 2 above on a medium customarily used for software interchange; or, >X >X b) Accompany it with a written offer, valid for at least three >X years, to give any third party, for a charge no more than your >X cost of physically performing source distribution, a complete >X machine-readable copy of the corresponding source code, to be >X distributed under the terms of Sections 1 and 2 above on a medium >X customarily used for software interchange; or, >X >X c) Accompany it with the information you received as to the offer >X to distribute corresponding source code. (This alternative is >X allowed only for noncommercial distribution and only if you >X received the program in object code or executable form with such >X an offer, in accord with Subsection b above.) >X >XThe source code for a work means the preferred form of the work for >Xmaking modifications to it. For an executable work, complete source >Xcode means all the source code for all modules it contains, plus any >Xassociated interface definition files, plus the scripts used to >Xcontrol compilation and installation of the executable. However, as a >Xspecial exception, the source code distributed need not include >Xanything that is normally distributed (in either source or binary >Xform) with the major components (compiler, kernel, and so on) of the >Xoperating system on which the executable runs, unless that component >Xitself accompanies the executable. >X >XIf distribution of executable or object code is made by offering >Xaccess to copy from a designated place, then offering equivalent >Xaccess to copy the source code from the same place counts as >Xdistribution of the source code, even though third parties are not >Xcompelled to copy the source along with the object code. >X >X 4. You may not copy, modify, sublicense, or distribute the Program >Xexcept as expressly provided under this License. Any attempt >Xotherwise to copy, modify, sublicense or distribute the Program is >Xvoid, and will automatically terminate your rights under this License. >XHowever, parties who have received copies, or rights, from you under >Xthis License will not have their licenses terminated so long as such >Xparties remain in full compliance. >X >X 5. You are not required to accept this License, since you have not >Xsigned it. However, nothing else grants you permission to modify or >Xdistribute the Program or its derivative works. These actions are >Xprohibited by law if you do not accept this License. Therefore, by >Xmodifying or distributing the Program (or any work based on the >XProgram), you indicate your acceptance of this License to do so, and >Xall its terms and conditions for copying, distributing or modifying >Xthe Program or works based on it. >X >X 6. Each time you redistribute the Program (or any work based on the >XProgram), the recipient automatically receives a license from the >Xoriginal licensor to copy, distribute or modify the Program subject to >Xthese terms and conditions. You may not impose any further >Xrestrictions on the recipients' exercise of the rights granted herein. >XYou are not responsible for enforcing compliance by third parties to >Xthis License. >X >X 7. If, as a consequence of a court judgment or allegation of patent >Xinfringement or for any other reason (not limited to patent issues), >Xconditions are imposed on you (whether by court order, agreement or >Xotherwise) that contradict the conditions of this License, they do not >Xexcuse you from the conditions of this License. If you cannot >Xdistribute so as to satisfy simultaneously your obligations under this >XLicense and any other pertinent obligations, then as a consequence you >Xmay not distribute the Program at all. For example, if a patent >Xlicense would not permit royalty-free redistribution of the Program by >Xall those who receive copies directly or indirectly through you, then >Xthe only way you could satisfy both it and this License would be to >Xrefrain entirely from distribution of the Program. >X >XIf any portion of this section is held invalid or unenforceable under >Xany particular circumstance, the balance of the section is intended to >Xapply and the section as a whole is intended to apply in other >Xcircumstances. >X >XIt is not the purpose of this section to induce you to infringe any >Xpatents or other property right claims or to contest validity of any >Xsuch claims; this section has the sole purpose of protecting the >Xintegrity of the free software distribution system, which is >Ximplemented by public license practices. Many people have made >Xgenerous contributions to the wide range of software distributed >Xthrough that system in reliance on consistent application of that >Xsystem; it is up to the author/donor to decide if he or she is willing >Xto distribute software through any other system and a licensee cannot >Ximpose that choice. >X >XThis section is intended to make thoroughly clear what is believed to >Xbe a consequence of the rest of this License. >X >X 8. If the distribution and/or use of the Program is restricted in >Xcertain countries either by patents or by copyrighted interfaces, the >Xoriginal copyright holder who places the Program under this License >Xmay add an explicit geographical distribution limitation excluding >Xthose countries, so that distribution is permitted only in or among >Xcountries not thus excluded. In such case, this License incorporates >Xthe limitation as if written in the body of this License. >X >X 9. The Free Software Foundation may publish revised and/or new versions >Xof the General Public License from time to time. Such new versions will >Xbe similar in spirit to the present version, but may differ in detail to >Xaddress new problems or concerns. >X >XEach version is given a distinguishing version number. If the Program >Xspecifies a version number of this License which applies to it and "any >Xlater version", you have the option of following the terms and conditions >Xeither of that version or of any later version published by the Free >XSoftware Foundation. If the Program does not specify a version number of >Xthis License, you may choose any version ever published by the Free Software >XFoundation. >X >X 10. If you wish to incorporate parts of the Program into other free >Xprograms whose distribution conditions are different, write to the author >Xto ask for permission. For software which is copyrighted by the Free >XSoftware Foundation, write to the Free Software Foundation; we sometimes >Xmake exceptions for this. Our decision will be guided by the two goals >Xof preserving the free status of all derivatives of our free software and >Xof promoting the sharing and reuse of software generally. >X >X NO WARRANTY >X >X 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY >XFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN >XOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES >XPROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED >XOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF >XMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS >XTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE >XPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, >XREPAIR OR CORRECTION. >X >X 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING >XWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR >XREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, >XINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING >XOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED >XTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY >XYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER >XPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE >XPOSSIBILITY OF SUCH DAMAGES. >X >X END OF TERMS AND CONDITIONS >c2b56a17d89d1309f21eb2d9b2a160f5 >echo x - droidcam/work/stage/usr/local/share/licenses/droidcam-2.1.3/LICENSE >sed 's/^X//' >droidcam/work/stage/usr/local/share/licenses/droidcam-2.1.3/LICENSE << 'ccd1c0c9fe6d734994417775637c2d92' >XThis package has a single license: GPLv2 (GNU General Public License version 2). >ccd1c0c9fe6d734994417775637c2d92 >echo c - droidcam/work/stage/usr/local/share/sgml >mkdir -p droidcam/work/stage/usr/local/share/sgml > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/info >mkdir -p droidcam/work/stage/usr/local/share/info > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/pixmaps >mkdir -p droidcam/work/stage/usr/local/share/pixmaps > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls >mkdir -p droidcam/work/stage/usr/local/share/nls > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/it_CH.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/it_CH.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_US.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/en_US.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/fr_CH.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/fr_CH.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/it_IT.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/it_IT.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/sv_SE.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/sv_SE.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/kk_KZ.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/kk_KZ.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/it_CH.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/it_CH.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/la_LN.ISO8859-2 >mkdir -p droidcam/work/stage/usr/local/share/nls/la_LN.ISO8859-2 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/be_BY.ISO8859-5 >mkdir -p droidcam/work/stage/usr/local/share/nls/be_BY.ISO8859-5 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/el_GR.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/el_GR.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/fr_CH.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/fr_CH.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/pt_PT.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/pt_PT.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/sr_YU.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/sr_YU.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/ru_RU.CP866 >mkdir -p droidcam/work/stage/usr/local/share/nls/ru_RU.CP866 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/no_NO.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/no_NO.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/ja_JP.eucJP >mkdir -p droidcam/work/stage/usr/local/share/nls/ja_JP.eucJP > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_NZ.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/en_NZ.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_CA.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/en_CA.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/zh_TW.Big5 >mkdir -p droidcam/work/stage/usr/local/share/nls/zh_TW.Big5 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/bg_BG.CP1251 >mkdir -p droidcam/work/stage/usr/local/share/nls/bg_BG.CP1251 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/is_IS.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/is_IS.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/sr_YU.ISO8859-2 >mkdir -p droidcam/work/stage/usr/local/share/nls/sr_YU.ISO8859-2 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/fr_CH.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/fr_CH.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/hi_IN.ISCII-DEV >mkdir -p droidcam/work/stage/usr/local/share/nls/hi_IN.ISCII-DEV > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/sr_YU.ISO8859-5 >mkdir -p droidcam/work/stage/usr/local/share/nls/sr_YU.ISO8859-5 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/de_AT.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/de_AT.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/et_EE.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/et_EE.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/it_IT.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/it_IT.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_IE.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/en_IE.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/zh_HK.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/zh_HK.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/hy_AM.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/hy_AM.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/kk_KZ.PT154 >mkdir -p droidcam/work/stage/usr/local/share/nls/kk_KZ.PT154 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/C >mkdir -p droidcam/work/stage/usr/local/share/nls/C > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/fi_FI.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/fi_FI.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/zh_CN.eucCN >mkdir -p droidcam/work/stage/usr/local/share/nls/zh_CN.eucCN > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_AU.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/en_AU.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/he_IL.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/he_IL.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_GB.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/en_GB.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/nl_NL.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/nl_NL.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/tr_TR.ISO8859-9 >mkdir -p droidcam/work/stage/usr/local/share/nls/tr_TR.ISO8859-9 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/pt_BR.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/pt_BR.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/sl_SI.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/sl_SI.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/it_IT.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/it_IT.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/fi_FI.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/fi_FI.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_GB.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/en_GB.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/be_BY.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/be_BY.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/nl_NL.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/nl_NL.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/fr_BE.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/fr_BE.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/no_NO.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/no_NO.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/hr_HR.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/hr_HR.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/hr_HR.ISO8859-2 >mkdir -p droidcam/work/stage/usr/local/share/nls/hr_HR.ISO8859-2 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/ru_RU.KOI8-R >mkdir -p droidcam/work/stage/usr/local/share/nls/ru_RU.KOI8-R > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/la_LN.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/la_LN.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_CA.US-ASCII >mkdir -p droidcam/work/stage/usr/local/share/nls/en_CA.US-ASCII > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/de_AT.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/de_AT.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/da_DK.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/da_DK.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/bg_BG.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/bg_BG.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/ko_KR.CP949 >mkdir -p droidcam/work/stage/usr/local/share/nls/ko_KR.CP949 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/la_LN.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/la_LN.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/ja_JP.SJIS >mkdir -p droidcam/work/stage/usr/local/share/nls/ja_JP.SJIS > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/hy_AM.ARMSCII-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/hy_AM.ARMSCII-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/la_LN.US-ASCII >mkdir -p droidcam/work/stage/usr/local/share/nls/la_LN.US-ASCII > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/ko_KR.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/ko_KR.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_CA.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/en_CA.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/pt_BR.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/pt_BR.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/fr_CA.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/fr_CA.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/sk_SK.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/sk_SK.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/be_BY.CP1251 >mkdir -p droidcam/work/stage/usr/local/share/nls/be_BY.CP1251 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/ru_RU.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/ru_RU.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/es_ES.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/es_ES.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/nl_BE.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/nl_BE.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/hu_HU.ISO8859-2 >mkdir -p droidcam/work/stage/usr/local/share/nls/hu_HU.ISO8859-2 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/no_NO.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/no_NO.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_NZ.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/en_NZ.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/da_DK.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/da_DK.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/de_CH.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/de_CH.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_NZ.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/en_NZ.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/zh_CN.GB18030 >mkdir -p droidcam/work/stage/usr/local/share/nls/zh_CN.GB18030 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/is_IS.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/is_IS.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/af_ZA.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/af_ZA.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/fr_CA.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/fr_CA.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/pl_PL.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/pl_PL.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/it_CH.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/it_CH.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/lt_LT.ISO8859-13 >mkdir -p droidcam/work/stage/usr/local/share/nls/lt_LT.ISO8859-13 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/ko_KR.eucKR >mkdir -p droidcam/work/stage/usr/local/share/nls/ko_KR.eucKR > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/be_BY.CP1131 >mkdir -p droidcam/work/stage/usr/local/share/nls/be_BY.CP1131 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/da_DK.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/da_DK.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/pt_PT.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/pt_PT.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/sl_SI.ISO8859-2 >mkdir -p droidcam/work/stage/usr/local/share/nls/sl_SI.ISO8859-2 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/zh_HK.Big5HKSCS >mkdir -p droidcam/work/stage/usr/local/share/nls/zh_HK.Big5HKSCS > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/hu_HU.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/hu_HU.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/la_LN.ISO8859-4 >mkdir -p droidcam/work/stage/usr/local/share/nls/la_LN.ISO8859-4 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/zh_CN.GB2312 >mkdir -p droidcam/work/stage/usr/local/share/nls/zh_CN.GB2312 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/pl_PL.ISO8859-2 >mkdir -p droidcam/work/stage/usr/local/share/nls/pl_PL.ISO8859-2 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/es_ES.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/es_ES.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/am_ET.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/am_ET.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_AU.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/en_AU.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_GB.US-ASCII >mkdir -p droidcam/work/stage/usr/local/share/nls/en_GB.US-ASCII > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/af_ZA.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/af_ZA.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/ja_JP.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/ja_JP.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/uk_UA.ISO8859-5 >mkdir -p droidcam/work/stage/usr/local/share/nls/uk_UA.ISO8859-5 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/ca_ES.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/ca_ES.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/nl_BE.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/nl_BE.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/lt_LT.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/lt_LT.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/de_CH.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/de_CH.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/fr_BE.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/fr_BE.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/cs_CZ.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/cs_CZ.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/de_CH.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/de_CH.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_AU.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/en_AU.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/fr_CA.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/fr_CA.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/lt_LT.ISO8859-4 >mkdir -p droidcam/work/stage/usr/local/share/nls/lt_LT.ISO8859-4 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/pt_PT.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/pt_PT.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_NZ.US-ASCII >mkdir -p droidcam/work/stage/usr/local/share/nls/en_NZ.US-ASCII > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/fr_FR.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/fr_FR.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/sk_SK.ISO8859-2 >mkdir -p droidcam/work/stage/usr/local/share/nls/sk_SK.ISO8859-2 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/sv_SE.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/sv_SE.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/nl_BE.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/nl_BE.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/fr_FR.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/fr_FR.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/ro_RO.ISO8859-2 >mkdir -p droidcam/work/stage/usr/local/share/nls/ro_RO.ISO8859-2 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/et_EE.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/et_EE.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/zh_TW.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/zh_TW.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_US.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/en_US.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/de_DE.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/de_DE.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/fi_FI.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/fi_FI.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/cs_CZ.ISO8859-2 >mkdir -p droidcam/work/stage/usr/local/share/nls/cs_CZ.ISO8859-2 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/uk_UA.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/uk_UA.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/nl_NL.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/nl_NL.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/fr_FR.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/fr_FR.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_CA.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/en_CA.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/tr_TR.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/tr_TR.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/de_DE.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/de_DE.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/ro_RO.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/ro_RO.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/el_GR.ISO8859-7 >mkdir -p droidcam/work/stage/usr/local/share/nls/el_GR.ISO8859-7 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/ca_ES.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/ca_ES.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/de_AT.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/de_AT.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_AU.US-ASCII >mkdir -p droidcam/work/stage/usr/local/share/nls/en_AU.US-ASCII > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_GB.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/en_GB.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/ca_ES.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/ca_ES.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/uk_UA.KOI8-U >mkdir -p droidcam/work/stage/usr/local/share/nls/uk_UA.KOI8-U > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/is_IS.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/is_IS.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/zh_CN.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/zh_CN.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/es_ES.ISO8859-15 >mkdir -p droidcam/work/stage/usr/local/share/nls/es_ES.ISO8859-15 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/en_US.ISO8859-1 >mkdir -p droidcam/work/stage/usr/local/share/nls/en_US.ISO8859-1 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/sv_SE.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/sv_SE.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/zh_CN.GBK >mkdir -p droidcam/work/stage/usr/local/share/nls/zh_CN.GBK > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/ru_RU.ISO8859-5 >mkdir -p droidcam/work/stage/usr/local/share/nls/ru_RU.ISO8859-5 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/ru_RU.CP1251 >mkdir -p droidcam/work/stage/usr/local/share/nls/ru_RU.CP1251 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/fr_BE.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/fr_BE.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/de_DE.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/de_DE.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/share/nls/af_ZA.UTF-8 >mkdir -p droidcam/work/stage/usr/local/share/nls/af_ZA.UTF-8 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/tests >mkdir -p droidcam/work/stage/usr/local/tests > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/www >mkdir -p droidcam/work/stage/usr/local/www > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/lib >mkdir -p droidcam/work/stage/usr/local/lib > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/lib/debug >mkdir -p droidcam/work/stage/usr/local/lib/debug > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/lib/X11 >mkdir -p droidcam/work/stage/usr/local/lib/X11 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/lib/X11/app-defaults >mkdir -p droidcam/work/stage/usr/local/lib/X11/app-defaults > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/bin >mkdir -p droidcam/work/stage/usr/local/bin > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/sbin >mkdir -p droidcam/work/stage/usr/local/sbin > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/include >mkdir -p droidcam/work/stage/usr/local/include > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/include/X11 >mkdir -p droidcam/work/stage/usr/local/include/X11 > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/etc >mkdir -p droidcam/work/stage/usr/local/etc > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/etc/newsyslog.conf.d >mkdir -p droidcam/work/stage/usr/local/etc/newsyslog.conf.d > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/etc/man.d >mkdir -p droidcam/work/stage/usr/local/etc/man.d > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/etc/pam.d >mkdir -p droidcam/work/stage/usr/local/etc/pam.d > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/etc/rc.conf.d >mkdir -p droidcam/work/stage/usr/local/etc/rc.conf.d > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/etc/rc.d >mkdir -p droidcam/work/stage/usr/local/etc/rc.d > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/etc/devd >mkdir -p droidcam/work/stage/usr/local/etc/devd > /dev/null 2>&1 >echo c - droidcam/work/stage/usr/local/etc/libmap.d >mkdir -p droidcam/work/stage/usr/local/etc/libmap.d > /dev/null 2>&1 >echo x - droidcam/work/.stage_done.droidcam._usr_local >sed 's/^X//' >droidcam/work/.stage_done.droidcam._usr_local << '3d4bd40a6fce10e163b0b70ad1206e61' >3d4bd40a6fce10e163b0b70ad1206e61 >echo x - droidcam/work/.license-report >sed 's/^X//' >droidcam/work/.license-report << '612c7b3428bf09e9ba09ef9e5bd331df' >XThis package has a single license: GPLv2 (GNU General Public License version 2). >612c7b3428bf09e9ba09ef9e5bd331df >echo x - droidcam/work/.extract_done.droidcam._usr_local >sed 's/^X//' >droidcam/work/.extract_done.droidcam._usr_local << '26fa301a3f4ed0049fa3c9451f936785' >26fa301a3f4ed0049fa3c9451f936785 >echo x - droidcam/work/.PLIST.setuid >sed 's/^X//' >droidcam/work/.PLIST.setuid << '3e26c2dab5d7a34a298842919aa337cc' >3e26c2dab5d7a34a298842919aa337cc >echo x - droidcam/Makefile >sed 's/^X//' >droidcam/Makefile << '1dcb364e01f0dc210f7391c67ee8371e' >XPORTNAME= droidcam >XDISTVERSIONPREFIX= v >XDISTVERSION= 2.1.3 >XCATEGORIES= multimedia >X >XMAINTAINER= nxjoseph@protonmail.com >XCOMMENT= GNU/Linux/nix client for DroidCam >XWWW= https://github.com/dev47apps/droidcam >X >XLICENSE= GPLv2 >XLICENSE_FILE= ${WRKSRC}/LICENSE >X >XLIB_DEPENDS= libappindicator3.so:devel/libappindicator \ >X libasound.so:audio/alsa-lib \ >X libatk-1.0.so:accessibility/at-spi2-core \ >X libcairo-gobject.so:graphics/cairo \ >X libcairo.so:graphics/cairo \ >X libdbusmenu-glib.so:devel/libdbusmenu \ >X libgdk-3.so:x11-toolkits/gtk30 \ >X libgdk_pixbuf-2.0.so:graphics/gdk-pixbuf2 \ >X libgio-2.0.so:devel/glib20 \ >X libglib-2.0.so:devel/glib20 \ >X libgobject-2.0.so:devel/glib20 \ >X libgtk-3.so:x11-toolkits/gtk30 \ >X libharfbuzz.so:print/harfbuzz \ >X libpango-1.0.so:x11-toolkits/pango \ >X libpangocairo-1.0.so:x11-toolkits/pango \ >X libspeex.so:audio/speex \ >X libturbojpeg.so:graphics/libjpeg-turbo \ >X libusbmuxd-2.0.so:comms/libusbmuxd \ >X libX11.so:x11/libX11 >X >XRUN_DEPENDS= adb:devel/android-tools \ >X ffmpeg:multimedia/ffmpeg \ >X pkgconf:devel/pkgconf \ >X usbmuxd:comms/usbmuxd \ >X webcamd:multimedia/webcamd >XUSES= gettext-runtime gmake pkgconfig:build desktop-file-utils >XUSE_GNOME= cairo gdkpixbuf2 glib20 gtk30 pango >XUSE_XORG= x11 >X >XOPTIONS_DEFINE= NLS >XOPTIONS_SUB= yes >X >XNLS_USES= gettext >XNLS_CONFIGURE_ENABLE= nls >X >XPLIST_FILES= bin/droidcam \ >X bin/droidcam-cli \ >X share/applications/droidcam.desktop \ >X share/pixmaps/droidcam-icon.png >X >XUSE_GITHUB= yes >XGH_ACCOUNT= dev47apps >X >Xdo-install: >X ${INSTALL_PROGRAM} ${WRKSRC}/droidcam \ >X ${STAGEDIR}${PREFIX}/bin >X ${INSTALL_PROGRAM} ${WRKSRC}/droidcam-cli \ >X ${STAGEDIR}${PREFIX}/bin >X ${INSTALL_DATA} ${WRKSRC}/icon2.png \ >X ${STAGEDIR}${PREFIX}/share/pixmaps/droidcam-icon.png >X ${INSTALL_DATA} ${WRKSRC}/droidcam.desktop \ >X ${STAGEDIR}${PREFIX}/share/applications >X >Xdeinstall: >X pkg del -y droidcam >X ${RM} ${STAGEDIR}${PREFIX}/bin/droidcam >X ${RM} ${STAGEDIR}${PREFIX}/bin/droidcam-cli >X ${RM} ${STAGEDIR}${PREFIX}/share/pixmaps/droidcam-icon.png >X ${RM} ${STAGEDIR}${PREFIX}/share/applications/droidcam.desktop >X >X.include <bsd.port.mk> >1dcb364e01f0dc210f7391c67ee8371e >echo x - droidcam/pkg-descr >sed 's/^X//' >droidcam/pkg-descr << 'ffff29b887b098da5f34cf3ac62fb832' >XDroidCam turns your phone/tablet into a webcam for your PC. >XUse it with chat programs like Zoom, MS Teams, and Skype. >ffff29b887b098da5f34cf3ac62fb832 >echo x - droidcam/distinfo >sed 's/^X//' >droidcam/distinfo << '3bfe458ad9e08c0adcdcff6b2eaca098' >XTIMESTAMP = 1713444177 >XSHA256 (dev47apps-droidcam-v2.1.3_GH0.tar.gz) = 0eb46c1ef19bce817b78740600d5451d14f7b279ebfd4605993d81f96aad08db >XSIZE (dev47apps-droidcam-v2.1.3_GH0.tar.gz) = 86091 >3bfe458ad9e08c0adcdcff6b2eaca098 >exit >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 278432
:
250048
|
250054
|
250058
|
250059
|
250063
|
250203
|
250207