# 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 Xy  Л/1T |{b/g@d&(',AŠTq4iJ=1(耱X6};15.2_,w$躖nۓv7OVQ+d^3\^ XTSa 0,xD?˯ρkB`458aLG`ݢ2:1,oțV>MJ~xPiϰ ȽQl|Ϯ68OF e3mzOD$Cbį;/3bǩwEn<I,p8<8n_, -|@M|gTԞ41'M2S}XUWH!ec' %[Cr [uP֯sпo4^{:O">(t f2i/f yy~H$hMb&?D١"92)vҵpY]#tI ГIO}Z[9#-QZiMkœ=P\ੈ 3Ϡs'!dE.*㢟poιD"hF=%Jz 2,7 XA>ћ$.d}u[x*D .'Fo0Yz5p*Wru)Q**xzh{%puKYf +ᤐ9ri"W.i)Sz^ë?J+Dc8uz#2m\|Bֱ[K>*_ *pLnöިrCu\9Mbm\s^c6 ˈ @<yblw#1G~^1ŀ)}Y^tN4f}I6ɻmlvC0 ޜQ ĐsOE8*2 0 Qy9]Cr~>_pI<ZjryBe]1*ju$:U Xh=#@䇽:1@)SS\R+ޠs<}6:o/PT~ 5 Wrys˂1<_O$+fdI8=y.xw߰\]$8\n+5gQrWcHk䋢PVO%{T+UN|H;` r/ƜQ/cbR7wFÝriŷ]k,{RTNʿ RR^ܞL*' -~M&sM=IUuE`|sW7J| @[sGqF4Lf#&xuy1쒶X˻=??di^(4 +T7Xp ‹~z Vo;{ыjFʠ'1@; *Rպ ȠY5iT XKgqIBQ9mm OxyWg|p bPRPQ[)]7 ߣr/V |jhRʿ.kWc佡qDG|Π'@8WEU]JcDUm%vfڳH;y3Lz54xO~WƎ̕~C9Ao-(ׁ&/wW a@&s^m|NvApc[b߶1Q_~em>/j*IY2қB;F.$Ks,L3Ҭm*Rk0+ə4n04 Xc8G.C=Iy]z/,!▋DZӥ[12b8 RȏRb>F?F 85%XrJAX~E:y) X;ѹݾ(OPR'CvE8|cxsEM1vERGoƱ"pr͆kRndeqkQ4 toAPVXaO+K __oj9q1v3<R˽<\r NAة%Jbw;SL%V]ttNĸ3iӷ`3j%kAxl:V%1bTOEr)kxԳ{H0_ML+=k q*lKR?۰_B75!LA~ ▶*igz uiGaMbwi X KC 1rz7"\h=n転)})vfU ukԁX1]+SVyb1K]~]Ӹ)V#W4KȔ~zߗ5rYDcFk/]{_pByԣKS; n`,Uؔ\򌖮?f`#rMB3{!Ā<_" icˉgQP!n\ +&!/KvA+9fVڒE_⇬;6M/g F?Gbj1l-գ3dASy}.l|b?gi>Y5{~=Қ6 >մaK)*?ʟ[NDKq 3Wچ2AUm9%ZRb)^ Ƨn;7x3z[ XB];KwViplH̔􆶗1-ZpX ɇL?U&y&.{b X2.]uXks˕o XNSVf)bo$L_oof՛1&ꁍEPh|`̺Gy\_んM| 8E'Doo5C&[0aB[*.j˫+ X"}ɻNjm PߓoM]4.Z}UϨUG}1g.8"`RTT11gS+3F?+5׮ꖦC.U5aĴugg[zBm7nqVx JIENDB`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 X#include X#include X#include X#include "usbmuxd.h" X X#if __FreeBSD__ X#include 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 X#include 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 \n" X " Listen on 'port' for connections (video only)\n" X "\n" X " %s [options] \n" X " Connect via ip\n" X "\n" X " %s [options] adb \n" X " Connect via adb to Android device\n" X "\n" X " env ANDROID_SERIAL= %s [options] adb \n" X " Connect via adb to Android device with serial number \n" X " (use `adb devices` to find serial number)\n" X "\n" X " %s [options] ios \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 X#include X#include X#include X#include X#include X#include X#include X#include X X#if __FreeBSD__ X#include X#include X#include 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 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 X#include X#include X#include X X#if __linux__ X#include X#endif X X#if __FreeBSD__ X#include 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 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 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 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 X#include X#include 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 X#include X#include X X#if __linux__ X#include X#endif X X#if __FreeBSD__ X#include X#include 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 X#include 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 X#include 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 X#ifdef USE_AYATANA_APPINDICATOR X#include X#else X#include X#endif X X#include X#include 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 X#include X#include X#include X X#include X#include X#include X#include X#include 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 X#include X#include X#include X#include X#include X#include X#include 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 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 X#include 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 , 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; ivdev); 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 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@@ @ Rtd  Ptd@@ @ Qtd  HH/libexec/ld-elf.so.1FreeBSD^FreeBSDFreeBSD. Lflsx &,16?FMRY`iou|+<LShy~ "7EUjx8Ur!CUo3C\o0 ` " (Ƞ T@ @  B8  X X X X 3(zM(zM(z `(z i(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 X Listen on 'port' for connections (video only) X X %s [options] X Connect via ip X X %s [options] adb X Connect via adb to Android device X X env ANDROID_SERIAL= %s [options] adb X Connect via adb to Android device with serial number X (use `adb devices` to find serial number) X X %s [options] ios 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  BoAJ<1 X X^nH=Gn59j7jvt]}6 A=1n'  1ZA Dnwu0=nZ;t; nu =m5=6<dHE5mHUп DHcȿH  1@AiX 11@8i=UmtTd7 1~@=7mu!=^mu=Fm:8 11Q@h \ L@ \ =@=mt1m= Xmt1 =luffff.F?=lu=lu~lpl=)ht;=0htI=7htW11HoH;EH[A\A^A_]H=g1?=guH=g1w?=guH=g1`?H=n l1۾j9 1^>H}HuH5rn5?dH.?>fUHHH9nHH $h+ HHII1=H]UHAWAVATSHIAIHmHEؿ>~EL>EfAfD}ʉ߾11=߾1g=HDž0HDž8W)@)P)`)p)E)E)E)EHcúHHH @Huȉߺ>$=8#t=8#t=8$'H@L011=߾11<߾1<HDž0H0߾A=x&H0߾A=) =H@lS<D8K<8t=W: HDH1;*<8S=IOL=k<D X<83=9 LDH1;;8=HeI=HkH;EuHİ[A\A^A_];fDUHAWAVATS~3AAIDDL1<H~ A)IE[A\A^A_]fffff.UHHHc։H1]<UHHHc։Hƹ@]d<@UHAVSHHc։HƹB<HÅxA:E18#t X:8#uD[A^]UHAVSH HHjHUEHcLELMԉHƹ;HÅxAc:E18#t XV:8#uH:jH;Eu DH [A^]S:UHAWAVSHIAHjHEfAfDEEH:EHcLEDL1A];H iH;Mu H[A^A_]9UH]w:=btUH:b]UH]:fDUHSHHNiHE=sbH=.i' 18fDP9=OftO=7b11:98#t88#t88t88 :/ HH=ho: 1q8UEEffES9aHuǺ:=va9=^a118=?a17H=go: 17=a117=`17q788 5 77885 $7883 7881 Hf=`t8|`H@gH;Eu H[]\7UHAWAVAUATSHHIHgHEDž8 8H: HH18s8 H8HWAFAF AF,AAFAFHIF$AF0HHHc8HtHH;* 16MfukHH!8HtHLx6AFHH7HH1 X X8 ' .1H0[A\A^A_]Ë [[A[D5[[[HI [@AAAAD%~[CdHc0IH[McL0Hy[Hc=V[D9d0He[D[D [WD$HD$ D$$1D110H*[Z Z[[[[HZHR[HcZHHI[HcZHH@[H=[ [ {[ y[s[HZH[Hc jZHH [Hc]ZHH[H[L=MZL=[[p *HcZHZH[[p g*HcYHHYH[}[p 6*YzZvZtZnZHYHYHc yYHH YHclYHHYHYaffff.UH r.H3Z]fUHH=-YHt[.HYH=YHt?.HYH=YHt#.HXH=XHt.HXH=XHt .HXH=XHt-HXp z(P ]o(ffffff.UHAVSH0H~ZHE_H]L7Lu؃= XtU=tXH=OXLELMLHڹjhH p-HHZh-I* ^H=WHHEHMLELMLHPG-HŨ.UDmWMD gWD9&D9CW=W<LuH]H=yWD*W(Wp A LHh P,Ht"HAYH=:W,6 H߉H=WHDVH A 1h ,H( zHXH=VY,( H߉1(HXH=VU,) HH1s(dH=Xe/ 1^(OH=}X2 1I(: H0=VHc&V ,HyH IX7 '}*H6XH;Eu H0[A^]R(fUHAWAVAUATSH8HXHEЋUD4 U MHUUEDuH}HUHc{UH߾)DuEHEHcHMHIHMDqIE1&H]L)HCLAHD;mI߃}|H1Lg)N<3L@LS)MLL@)MHEAfD*HHiMbHH?H$i)AIAu]H=THt-D~TH$ A 1;*(  H0=.THcST:*HxH~VH;EuEH8[A\A]A^A_]H ZVH[VH;Eu"7 'H8[A\A]A^A_]s(^&fffff.UHp H(UH;SP HGH=0UHHD…HEHH]$ffffff.UHp 1]$ffffff.UHH5uSP ]j$f.UHS]@UH XS]@UH ~Stu 1 1US]f.UH.Su X1Ƀ1Ƀ  S1]UHS]@UHSPHHWHGH9S~HKHRHcHiQHH?H%f4KTK5RHcHiQHH?H%ftKHH9ufnQfpH1fpfo2f~3fafrfoffpfpffpfbfffffpffpfbfffofrfrfppfpff$3HH9vH9DH[A\A]A^A_]UHAWAVATSII%tu)L%HAL%aL%HHx^H QH9A>AL%1ۅpAHbQ%L0 HH1!!DEL8%H Q3: S#INIFIvIVL6%Aău.L$AH P3: "HPD$9 xrA1H wP3: "L5\P$9 EH EP3: y"L5*P[$7 L5PF$30 LH1[A\A^A_]L<$1ۅyAău3L#x AAH O3: !HOD#: HH1ZDDUHAWAVSPIIHvIV#HHx X1I;^uau+LD#y#H /O3: c!x A1"L5O4#B1 LH1H[A^A_]DUHAWAVAUATSH(HNHEHE'#HHHH)HH'N X#H1H #HHHH)HHN"H1H~ Le1fDÃ2h Y1 1 s8  HtIǿ  H"MIL EM~HLoopbackH9xMuE11L=M!6 LH1MAAP : E1e H}11"xLeMtL=LLL"*LL!'LL1!'LL!$LL!UÈ>LLHU1!U}̀>e LLL!iLHu!qHEHHL LLL!cLHuHU!zHEHKLL!tL=(LY '9 RL=LD H4 =L=K/ / (L=K 5/ L=K N5 LH1H K X4 H}/L=KQ) LL=kK4 L>sH=NK: >1{L=/KD%pDYb* 2L=KD6 :L=JD%@D%( LDH1L=J|5 LuL=HJLL xpH"JLL xaH JLL xRLL xJH'JH ( E1HEe; p1 : 7 L5JALHH1H I6 &H}mvI1H IH;Mu$He[A\A]A^A_]H=I8 1uUHAVSHH{IHEH 1xc uN 117H#I6D0.8W*  HDI11H HH;Mu H[A^] ffff.UHAWAVAUATSHxHHHHElLcLhE1ffff.DAAct| 4 D1FtAf.Vh@DL1uD8tffff.xHHuLu GAHGH;EuDHx[A\A]A^A_]fUHH *G]ÐUHAWAVAUATSHHIAHGHEff`fPf@f0f fHDžpf@ffffffffffpf`fPDž@H8D*LVh@DL1nu8tfo@~Pft ftff=mDž@L@fffff.DHVL1u X"8tH8HDLHYU12HPL@DHVL1u'8tHE4 Ip_formatffEfEfEfEEHU$VDD1,uJLm@HEHkeep_forH1HML1H E E$VDDL1tA Lmffffff.8H@DHV1tՅPYU12HLtH=D( 1Pff.AA, De$VDDL1uHEHkeep_forH1HMHp_formatH1H uEEE)$VDHHUD1 XHC+<  H1HCH;EHĨ[A\A]A^A_]ÈUuEEEH=}CHMf0 A AYU121AU81HEHU$VDD1Ip_formatuRLmffffff.HEHkeep_forH1HML1H EE$VDDL1tHLA UHHHBHE=@5@uGOHU kH tBH;MuH]UHAWAVAUATSHHEBHEW)E)E)E)E)E)p)`)P)@)0A? ??+HPL(!DP? ?> >tփ=?5 ?u'PAą.Afffff. LcAătҿM3 DW)E)E)E)E)E)p)`)PH߾D1fHH|tlP u퀼Q Xu〼R uـS Xuσ{H:L-@D08 ; LDH1`~|CH)HP14 X~@ w@ 0HH9uu Hȅu1Ƅ0-fDŽ0%H0-DA0uffffff.*= (=AuH?H;Eu1Hĸ[A\A]A^A_]@=<t[UHSP0ffffff.HHH߾H=<tHuտ;=<uH[]1fUHAWAVAUATSH8IH?HEH]E1f.Au=T<AAHcB<L<Ő 17A1= 8 HLEA1H߉DW)E)EH߾ D`Hph;=;Q ;teu1L> < H߹1u%0ff. 9 H1t H߉DK;IH߾DuAwI?DL1m=:@ff.DmA/ A; fffff.DmA>; A1 L-1=D = 8fLLH1 8 LH]Dm A":Dn1wEtAA=91"H<H;Eu1H8[A\A]A^A_] ffffff.UHAWAVAUATSHHe<HEH 1nDžHI=i9t!@  =R9u=Q9u=o95S9Å%d; AfDž$Dž H fo f~A8 =-@v0$2 A< A%Lg8 )4 =H127.0.0.H3w8 x8H1H LW E1AL AD@8Ad; ߺ } X X X X X X8 * 3AoD3Ai< ߺ ~JUHB( w HcH4? 8 ]ifUHAWAVATSHHE5HEؿg3 G A=Dx3 s8 7 H,ILAfffff.=95tL tfDAFLLH,3 LHu) LHu' LHuP: LHi; LHSL{ X X X X XHCHHCL0LsHCHuH[A^A_]ÿ8 1 5 kUHAVSIHuFL9sv)H{HGHCL7HKH{u HCE1HuL[A^]ÿ1 5 UHSPHsHHHHrHH[]UH]UH]5)%)@%)h%)h%)h%)h%)h%)h%)h%)hp%)h`%z)h P%r)h X X)hp%)h`%(hP%(h@%(h0%(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(h7p%(h8`%'h9P%'h:@%'h;0%'h< %'h=%'h>%'h?%'h@%'hA%'hB%'hC%'hD%'hE%'hF%'hGp%'hH`%z'hIP%r'hJ@%j'hK0%b'hL %Z'hM%R'hN%J'hO%B'hP%:'hQ%2'hR%*'hS%"'hT%'hU%'hV% X'hWp%'hX`%&hYP%&hZ@%&h[0%&h\ %&h]%&h^%&h_%&h`%&ha%&hb%&hc%&hd%&he%&hf%&hgp%&hh`%z&hiP%r&hj@%j&hk0%b&hl %Z&hm%R&hn%J&ho%B&hp%:&hq[ {AVx `   X X XCUB  g 0 ar [ ,VG AJ IaP[ [ %Vmm \ d?/u  ,a? 0 K\Vl[~?)  ?, ( ,V1 XA4 63K P /"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!I7 I: ; I'$ > .@B: ; ' X4: ; I 4: ; I B $> U% X X =* l" XL5/ X gb8 /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!QEEȠQ, X!{kּ> H3Q5 B.@ X$pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB Xdr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ Xb@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| XJ&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ XM=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% Xyg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- XBTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxė[l\W9g_7v%4imRT( .[_B@BE :Fl|d* βn%L@s [;c ;q5}ͤt0154i6Ԛj#iYIo[0 Ȯ5-IGdfƪ^`J)|1mClj WRwzeoʿ6 TRJ Xu0 fyAGCU=`4SJ6~ X~40Î ڟ26!(BEƠPMڴ3P`0, /twDtcX} XJA B(:4Ǚĉ;)[4;O EW+[WAAgW{>p?>o> _;ΖXZ cO}=\-aA;=5Gi]~O燷3s(Ij'^?3Hb&@S۰YV}(>g z2ٿK_)ek0܎¥%yDѺPl-kԓ"jc}Cv'%?Re]Qq W70RiaZ54k(X:2po\#MObA:0Qt`9m= b8.@(.'7o^H `pT~oRy2\/ut>:vףFG<;=ҳY K_qy[j{UUdx_IENDB`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 < "${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., 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   rrrЂ Ђ ``PP P ``!!h4   RtdPP P ` PtdPePe Pe LLQtd  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 Xy  Л/1T |{b/g@d&(',AŠTq4iJ=1(耱X6};15.2_,w$躖nۓv7OVQ+d^3\^ XTSa 0,xD?˯ρkB`458aLG`ݢ2:1,oțV>MJ~xPiϰ ȽQl|Ϯ68OF e3mzOD$Cbį;/3bǩwEn<I,p8<8n_, -|@M|gTԞ41'M2S}XUWH!ec' %[Cr [uP֯sпo4^{:O">(t f2i/f yy~H$hMb&?D١"92)vҵpY]#tI ГIO}Z[9#-QZiMkœ=P\ੈ 3Ϡs'!dE.*㢟poιD"hF=%Jz 2,7 XA>ћ$.d}u[x*D .'Fo0Yz5p*Wru)Q**xzh{%puKYf +ᤐ9ri"W.i)Sz^ë?J+Dc8uz#2m\|Bֱ[K>*_ *pLnöިrCu\9Mbm\s^c6 ˈ @<yblw#1G~^1ŀ)}Y^tN4f}I6ɻmlvC0 ޜQ ĐsOE8*2 0 Qy9]Cr~>_pI<ZjryBe]1*ju$:U Xh=#@䇽:1@)SS\R+ޠs<}6:o/PT~ 5 Wrys˂1<_O$+fdI8=y.xw߰\]$8\n+5gQrWcHk䋢PVO%{T+UN|H;` r/ƜQ/cbR7wFÝriŷ]k,{RTNʿ RR^ܞL*' -~M&sM=IUuE`|sW7J| @[sGqF4Lf#&xuy1쒶X˻=??di^(4 +T7Xp ‹~z Vo;{ыjFʠ'1@; *Rպ ȠY5iT XKgqIBQ9mm OxyWg|p bPRPQ[)]7 ߣr/V |jhRʿ.kWc佡qDG|Π'@8WEU]JcDUm%vfڳH;y3Lz54xO~WƎ̕~C9Ao-(ׁ&/wW a@&s^m|NvApc[b߶1Q_~em>/j*IY2қB;F.$Ks,L3Ҭm*Rk0+ə4n04 Xc8G.C=Iy]z/,!▋DZӥ[12b8 RȏRb>F?F 85%XrJAX~E:y) X;ѹݾ(OPR'CvE8|cxsEM1vERGoƱ"pr͆kRndeqkQ4 toAPVXaO+K __oj9q1v3<R˽<\r NAة%Jbw;SL%V]ttNĸ3iӷ`3j%kAxl:V%1bTOEr)kxԳ{H0_ML+=k q*lKR?۰_B75!LA~ ▶*igz uiGaMbwi X KC 1rz7"\h=n転)})vfU ukԁX1]+SVyb1K]~]Ӹ)V#W4KȔ~zߗ5rYDcFk/]{_pByԣKS; n`,Uؔ\򌖮?f`#rMB3{!Ā<_" icˉgQP!n\ +&!/KvA+9fVڒE_⇬;6M/g F?Gbj1l-գ3dASy}.l|b?gi>Y5{~=Қ6 >մaK)*?ʟ[NDKq 3Wچ2AUm9%ZRb)^ Ƨn;7x3z[ XB];KwViplH̔􆶗1-ZpX ɇL?U&y&.{b X2.]uXks˕o XNSVf)bo$L_oof՛1&ꁍEPh|`̺Gy\_んM| 8E'Doo5C&[0aB[*.j˫+ X"}ɻNjm PߓoM]4.Z}UϨUG}1g.8"`RTT11gS+3F?+5׮ꖦC.U5aĴugg[zBm7nqVx JIENDB`(uuay)droidcam/;LHh 4-d-@..3@ 4h5 505@5P5`5(p5H5h8`8888 p9H9t: :0:p<@0Bh DDH0HI pKHpMMMNN 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 1F Pz]fUH=yt =yt]ÍFs5y]à Xt u1G z]1y]UHHwyu =yt]H!H~y]DUHAVSHH~HE{5qy=9yu=,yuH={>HH1 X X0; E11ۉ5x=[xH=zHGH=zDFH=zFH=zFH=uzHF}H;EH[A^]FH=Vz1GwH=:zGwH}H;EYH[A^]Ëwu =wtWH=zH|H;E$1H[A^]EH=yH=yH|H;E1H[A^]FH=yF-wY6w@ww 1H^FHy@ 11IFHyH=sy= FH=Ry1SEH=Ly1EEH=y17EH=x1)EH=yEH=xEH=xD kv ivtAtLtej<H [{H;MH[A^]< !< H=xEIHuP>ÅHzH;EVH[A^]= !8; A< LEHw !; HEH= x= DHULÿL !L@Bu=DutAuuHcӾ 1kDHw@ 11VDHw=tt)tt` 11DH\w 11DHWwH=+wq= CHuHIJ hC=Mtu =@tta=sttXUHAVSAI H׾1?Hþ5> H?H?AH?A[A^]t1f.UHssH=avHt7CHLvH=MvHtCH8vH=9vHtBH$vH=%vHtBHv6s0sH=u1AH=u1AH=u1AH=Su> ]>UHH exsN ]pBUHH]sBUHH]s?UHH]cBUHP!]aBUHP!]aBUHP!]aBUHAWAVATSHIAIHwHEؿ6B~EL/BEfAfD}ʉ߾11"B߾1BHDž0HDž8W)@)P)`)p)E)E)E)EHcúHHH @HuȉߺAA8#tA8#tA8$'H@L011A߾11DA߾11AHDž0H0߾AHAx&H0߾A&AO> $AH(v@D8@8A-L HDH1A@8@IOL=u@D @8@J LDH1@y@8@HijI@HSuH;EuHİ[A\A^A_]?fDUHAWAVATS~3AAIDDL1p@H~ A)IE[A\A^A_]fffff.UHHHc։H1]7@UHHHc։Hƹ@]@@UHAVSHHc։Hƹ?HÅxAa?E18#t XT?8#uD[A^]UHAVSH HH)tHUEHcLELMԉHƹ?HÅxA>E18#t X>8#uHsH;Eu DH [A^]=UHAWAVSHIAHsHEfAfDEEHZ>EHcLEDL1A ?H fsH;Mu H[A^A_] =UH]=="htUH|> Xh]UH]f>fDUHSHHrHE=gH=sP; 1>fDPf>=smtO=g11^>=8#t=8#t|=8tr=8=@ HH=rEL 1=UEEffE<gHuǺ==f==f11<=f1<H=qEL 1<=wf11Q<=`f1:<qS<8<oF 7@<8y<WG $-<8f<D <8S<A HV=etV<eHpH;Eu H[]:UHAWAVAUATSHHIHpHEDžOJ z<HL HH1,9J H_<HWAFAF AF,AAFAFHIF$AF0HHH<HtHH> 19MfukHH;HtHL6AFHH;HH1 X XIJ y; 1H0[A\A^A_]Ë ae_eAUeD5Re8eJeHI =e@AAAAD%eCdHc54IH#eMcL 4HeHc=dD94HeDdD dWD$HD$ D$$1D13Hdd ^dhedebe\eHdHdHcWdHHdHcJdHHdHd e e eeH8dHdHc XdHH dHccHHdHdL=cL=^e\e!!*HccHcH@e>e!!g*HcxcHHcHee!!6*@cddddHKcHcHc cHH cHc cHHcHcaffff.UHX!2Hc]fUHH=bHt1HbH=bHt1HbH=bHt1HbH=bHt1H|bH=bHt1HpbH=abHt1HLb!z(!]o(ffffff.UHAVSH0HdHE_H]L7Lu؃=atU=bH=aLELMLHڹjh!1HHc1> ^H=aHHEHMLELMLHP0HŨ.UD aMD aD9&D9`=Pa<LuH]H=aD``!A!LHh Ph0Ht"H)cH=`]0H H߉H=`HDk`H! !A!1h0!'0Hh!zHbH=v`/< H߉1-HbH=R`/)> HH1-dH=zbV@ 1~-OH=ebC 1i-:`!H0=_Hc_/HyH 1bI '=,HaH;Eu H0[A^]+fUHAWAVAUATSH8HaHEЋ2_D4 $_ MHUUEDuH}HJ_Hc_H߾-DuEHEHcHMHIHMDqIE1&H]L)HCLAHD;mI߃}|H1L-N<3L@L-MLL,MHEAfDk.HHiMbHH?H$i)AIAu]H=f^Ht-D^H$0!! !A!1-h!`!H0=]Hc]-HxH`H;EuEH8[A\A]A^A_]H B`H_H;Eu"I 'H8[A\A]A^A_]3*)fffff.UH庰!H^H;y]!HGH=^HHD…HEHH]$ffffff.UH忰!1]$ffffff.UHH5]!]j$f.UH\]@UH\]@UH ]tu 1 1\]f.UH\u X1Ƀ1Ƀ  \1]UH]]@UHSPHHWHGH9b]~HKHAL>)1ۅpAHJ[3)(A HH1A&DEL(H [K %INIFIvIVL(Aău.Ly(AH ZK $HZDt(\K xrA1H _ZK k$L5DZ-(BK EH -ZK 9$L5Z'@I L5Y'A LH1$[A\A^A_]L'1ۅyAău3Lv'x AAH YK #HYDl'K HH1z$DDUHAWAVSPIIHvIVc'HHx X1I;^uau+L&y#H YK ##x A1"L5X&B LH1#H[A^A_]DUHAWAVAUATSH(HhXHEHE&HHHH)HHW&H1H]$&HHHH)HHW&H1H.$Le1fDÃ2h ! 5B 1 !J #HtIǿ ! H/&MIL#EM~HLoopbackH9WuE11L=W%?H LH1"MAAP ! VL E1 !H}11%xLeMtL=VLL%*LL%'LL1%'LL%$LL%UÈ>LLHU1w%U}̀>e!LLL_%iLHu[%qHEHU!LLLE%cLHuHU=%zHEHjULL/%tL=V#J RL=U#E =L=U#@ (L=U#? L=U#F LH1 H UE H}!L=sU\#= LL=SU<#E L>sH=6UaL >13 {L=UD%I"> 2L=T"wH :L=TD%I"; LDH1L=T"F LuL=SLL#xpHSLL#xaHSLL#xRLL#xJHSH ! = E1HEeM LB L ]I L5S!LHH1H SXH H} S1H mSH;Mu$He[A\A]A^A_]H=STJ 1UHAVSHHSHEHP!"1xc uNP!11"7H SD08a> P!HDI11H RH;Mu H[A^]Mffff.UHAWAVAUATSHxHHURHELcLhE1ffff.DAAct|P! F D1tAf.Vh@DL1!u8tffff.xHHuL}!u lQAHQH;EuDHx[A\A]A^A_]BfUHHP!BQ]ÐUHAWAVAUATSHHIAH,QHEff`fPf@f0f fHDžpf@ffffffffffpf`fPDž@H8D*LVh@DL1u48tfo@~Pft ʍftҍff=mDž@L@fffff.DHVL1|u X8tH8HDLHYU12HPL@DHVL1,u'b8tHOLF Ip_formatffEfEfEfEEHU$VDD1uJLm@HEHkeep_forH1HML1H E E$VDDL1rtA Lmffffff.8H@DHV1*tՅPYU12HLtH=lN= 1pff.AA, De$VDDL1uHEHkeep_forH1HMHp_formatH1H uEEE)$VDHHUD1P XHMhO P!H1HbMH;EHĨ[A\A]A^A_]ÈUuEEEH=eMHMBA AP!AYU121AU8QHEHU$VDD1Ip_formatuRLmffffff.HEHkeep_forH1HML1H EE$VDDL1EtHLA 6UHHHQLHE=2G5GuGOHUL !kH LH;MuH]UHAWAVAUATSHHKHEW)E)E)E)E)E)p)`)P)@)0eF [F+HPL(!DP&4F *FF Ftփ=;F5%Fu'PAą.Afffff.L !LcAătҿED DW)E)E)E)E)E)p)`)PH߾D1fHH|tlP u퀼Q Xu〼R uـS Xuσ{H:L-JTD0L8 M LDH1~|CH)HP14 X~@ w@ 0HH9uu Hȅu1Ƅ0-fDŽ0%H0MDA0uffffff.ND DD$AuHcIH;Eu1Hĸ[A\A]A^A_]@=Ct[UHSP0ffffff.HHH߾H=CtHuտ=CuH[]1fUHAWAVAUATSH8IHHHEH]E1f.Au=pCAAHc^CL<Ő!17A1= ~J HLEA1H߉DW)E)EH߾ D`HphB=BQ Bteu1LG N H߹1qu%0ff. xK H1Lt H߉DK9BIH߾DuAwI?DL1m=A@ff.DmA@ AM fffff.DmA>M AB L-G8LLH1IJ LH]Dm ABADn1wEtAA=#A1"HKFH;Eu1H8[A\A]A^A_]ffffff.UHAWAVAUATSHHFHEH 1DžHI=@t!@ m=r@u=m@u=@5o@Å%dM AfDž$Dž H fo f~AJ =-@v0$2 A N A%LgIJ :E -H127.0.0.H3? ?H1H LW E1AL AD\?AdM L !ߺ } LEO}LEO}LEOk}LEOF}yLzEO!}TLUEO}/L0EO} XL EO}LEO}LEOul}LEOuK}~LEOu*A'A~> AF d5n=3==4=LL LDžDž"AD =<LLAuf.k4t3-BH<(H H DžLLbt'MHL8DD9~H#LDžbHcHMHI ° :AoD3:AO L !ߺ ~J UH&< w HcH4`P IJ ]YfUHAWAVATSHH>HEؿ_D A=DpD J H,ILAfffff.=>tLtfDAFLL^ X XHCHHCL0LsHCH uH[A^A_]ÿJ B QF UHAVSIH^ uFL9sv)H{HGHCL7HKH{u HCE1H0 uL[A^]ÿB QF UHSPHHHHHrHH[]UH]UH蟪]5"/%$/@%"/h%/h%/h% X/h%/h%.h%.h%.hp%.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-h7p%b-h8`%Z-h9P%R-h:@%J-h;0%B-h< %:-h=%2-h>%*-h?%"-h@%-hA%-hB% X-hC%-hD%,hE%,hF%,hGp%,hH`%,hIP%,hJ@%,hK0%,hL %,hM%,hN%,hO%,hP%,hQ%,hR%,hS%,hT%z,hU%r,hV%j,hWp%b,hX`%Z,hYP%R,hZ@%J,h[0%B,h\ %:,h]%2,h^%*,h_%",h`%,ha%,hb% X,hc%,hd%+he%+hf%+hgp%+hh`%+hiP%+hj@%+hk0%+hl %+hm%+hn%+ho%+hp%+hq%+hr%+hs%+ht%z+hu%r+hv%j+hwp%b+hx`%Z+hyP%R+hz@%J+h{0%B+h| %:+h}%2+h~%*+h%"+h%+h%+h% X+h%+h%*h%*h%*hp%*h`%*hP%*h@%*h0%*h %*h%*h%*h%*h%*h%*h%*h%*h%z*h%r*h%j*hp%b*h`%Z*hP%R*h@%J*h0%B*h %:*h%2*h%**h%"*h%*h%*h% X*h%*h%)h%)h%)hp%)h`%)hP%)h@%)h0@       ' 7 E [ r           g   * ` +  ! | X XCUB ` g p ar  ,VG AJ IaP/ @ %Vmm c d?/u 0 ,a? p K\Vl[~?) X ?, h 0 ,V1 XA4 63K PO /"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!I7 I: ; I'$ > .@B: ; ' X4: ; I 4: ; I B $> U% X X =* l" XL5/ X gb8 /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 > E N V !m s P Rx }    Н   I @ }   p  0  x!  4      % + 2  B P S  d 0 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!!3Rr0Vv ]!!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 l7o LA G| |(O* *`YB+ + c20; 0;PkP PwPe PeLg 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 X X X icon2.png X X 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., 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 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