Очень хорошая статья на тему:
http://x264dev.multimedia.cx/archives/249
UPD, ссылка недоступна, через веб-архив:
http://web.archive.org/web/20150421033553/http://x264dev.multimedia.cx/archives/249
Цитата оттуда:
The total latency of x264, including encoder/decoder-side buffering, is:
B-frame latency (in frames) + Threading latency (in frames) + RC-lookahead (in frames) + Sync-lookahead (in frames) + VBV buffer size (in seconds) + Time to encode one frame (in milliseconds)
Собственно отсюда видно какие ручки крутить у того же FFmpeg что бы сделать задержку на стриминг как можно меньше:
-rc-lookahead #
-bf #
-threads #
-refs #
-x264-params sync-lookahead=#
и всякие буффера.
Эти же опции применительно к AVCodecContext:
AVCodecContext *ctx = ...;
...
av_opt_set(ctx, "rc-lookahead", "#", AV_OPT_SEARCH_CHILDREN);
av_opt_set(ctx, "threads", "#", AV_OPT_SEARCH_CHILDREN);
av_opt_set(ctx, "bf", "#", AV_OPT_SEARCH_CHILDREN);
av_opt_set(ctx, "refs", "#", AV_OPT_SEARCH_CHILDREN);
GOP size (-g/“g”) будет влиять на объём траффика и как быстро картинка сможет восстановиться, если ключевой кадр был потерян.
Ну из опций видно, что загоняя эти параметры в минимальные значения, получим максимальную скорость. Уменьшать количество потоков (threads) имеет смысл когда у вас несколько подобных процессингов.
Есть ещё опция -tune (“tune”) со значением “zerolatency” - вундервафля, которая почти сгоняет задержку в ноль, но и качество картинки примерно туда же. Про то, что включает в себя различные опции тюнинга можно посмотреть в выводе:
Дополнительные материалы:
UPD: что-то странно, что все ссылки стали недоступны. Особенно рекомендации Ясона.
Всё достаточно просто. В control
добавляем описание нового пакета, вроде:
Package: ffmpeg-real-dbg
Section: libdevel
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: debug symbols for ffmpeg libraries
This package contains the debug symbols for FFmpeg lubraries.
.
This is the real ffmpeg. The libraries are installed to the /opt/ffmpeg/lib.
А в rules
что-то вроде:
override_dh_strip:
dh_strip --dbg-package=ffmpeg-real-dbg
Главное, что бы имя пакета соответствовало. Естественно, при сборке нужно обеспечить что бы при компиляции отладочная информация вообще создавась. В случае real-ffmpeg от samrog131 нужно добавить
к ./configure
Подробнее:
http://askubuntu.com/questions/182703/how-and-why-to-create-dbg-dev-doc-packages
Не знал как лучше сформулировать тему.
Суть: есть source-пакет из которого строится несколько бинарных deb-пакетов.
Допустим:
- Библиотека: libfoo
- Бинарник, зависящий от этой библиотеки: foo
- Пакет для разработчика: libfoo-dev
При отстройке имеем примерно такую проблему:
dpkg-shlibdeps: error: couldn't find library libopencv_core.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_traincascade (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_ml.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_traincascade (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_imgproc.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_traincascade (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_highgui.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_traincascade (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_objdetect.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_haartraining (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_calib3d.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_haartraining (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_highgui.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_haartraining (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_imgproc.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_haartraining (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_core.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_haartraining (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_core.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_performance (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_highgui.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_performance (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_objdetect.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_performance (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_objdetect.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_createsamples (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_calib3d.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_createsamples (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_highgui.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_createsamples (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_imgproc.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_createsamples (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: couldn't find library libopencv_core.so.2.4 needed by debian/libopencv-ffmpeg-dev/opt/opencv/bin/opencv_createsamples (ELF format: 'elf64-x86-64'; RPATH: '')
dpkg-shlibdeps: error: cannot continue due to the errors listed above
Note: libraries are not searched in other binary packages that do not have any shlibs or symbols file.
To help dpkg-shlibdeps find private libraries, you might need to set LD_LIBRARY_PATH.
При этом библиотеки отстроены и с ними всё в порядке.
Лечится добавлением в debian/rules примерно такого:
override_dh_shlibdeps:
LD_LIBRARY_PATH=$(LD_LIBRARY_PATH):debian/tmp/PATH_TO_LIB_DIR dh_shlibdeps
Главное, замените PATH_TO_LIB_DIR
на своё, обычно это PREFIX/lib
или PREFIX/lib/$(DEB_HOST_MULTIARCH)
Да, дважды подумайте перед тем как смешивать их:
http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them
Если коротко, то всё, что связано с std::locale
в MinGW не работает. Точка.
Зато вполне себе работает функционал из Си:
std::locale::global(std::locale("")); // не установит текущую локаль
setlocale(LC_ALL, ""); // установит текущую локаль, у меня это Russian_Russia.Cp1251
Статью изначально публиковал на хабре:
http://habrahabr.ru/post/232775/. Здесь - для единства мыслей :)
Когда не так часто, как хотелось бы, приходится работать с языком, некоторые аспекты забываются. А некоторые никогда и не откладываются в голове. Поэтому, когда возникают вопросы, приходится отвлекаться и лезть в документацию.
Чтобы сэкономить время в последующем, а также, чтобы лучше понять в ходе обучения, крайне помогает вести конспекты и делать наглядные шпаргалки. Шпаргалку можно повесить рядом на стену. Хороши шпаргалки в виде блок-схем, по которым можно легко, по шагам, получить нужный результат (например
выбрать правильный контейнер).
Под катом я решил опубликовать пару шпаргалок для определения условия когда будет создан компилятором неявно-генерируемый перемещающий конструктор и перемещающий оператор присваивания.
Шпаргалки представлены в виде PDF файлов для печати на принтере A4, в виде картинки PNG, а также исходников в SVG.
Однажды писал про двоичные литералы в GCC:
/post/2009-10-02_13.44_0b00100100, новый стандарт C++14 закрепил их в C++.
Но тут я хотел бы рассмотреть лёгкий способ перехода в уме между hex и bin представлениями.
Стандарт отправился в печать:
https://isocpp.org/blog/2014/08/we-have-cpp14
Сильно быстро меняется, компиляторы не поспевают, не то что головы программистов и промышленность. Надеюсь они притормозят коней, да займутся больше багофиксами.
Удобный сервис для анализа последовательностей и поиска зависимостей и вывода формулы:
http://oeis.org/
Удобно использовать для различных видов анализа, обратной разработки и т.п.
Условное удаление по значению из всяких там map и иже с ними. А так же, бонусом, наиболее оптимальный вариант условного удаления для вектора.
Ничего нового, просто ссылки:
-
http://www.parashift.com/c++-faq/const-correctness.html - разные аспекты
-
http://www.cprogramming.com/tutorial/const_correctness.html - для чего нужно и почему, а так же логическая и побитовая константность.
Если коротко, то что даёт применение ключевого слова const
везде, где это уместно:
<WRAP center round tip 60%>
- Уберегает вас от некоторых ошибок, связанных с внезапным изменением данных в каких-то вызовых. Т.е. добавляет безопасности.
- Автодокументирование кода: вы выдите const => вы знаете, что данные не меняются ни в этом вызове, ни далее по иерархии.
Побитовая константность - когда при вызове ни один бит структуры или класса не меняется.
Логическая константность - когда при вызове какие-то поля могут меняться, но данные, отвечающие за логику класса не изменяются.
Обычно последнее связано с полями, которые имеют спецификатор mutable
. Для чего они нужны? Самый простой пример: экземпляр класса может использоваться из разных потоков. Писать может один поток, а читать другой. Логично, что метод для чтения будет константным. Так же логично, что чтение и запись следует защитить мьютексом. Но если мы попробуем заблокировать мьютекс в константном методе, получис ошибку компиляции. Понятно, что изменение мьютекса никак не влияет на логическую константность класса, поэтому его можно объявить mutable
и спокойно защищать им данные.
Из примера выше можно сделать такое неформальное заключение:
<WRAP center round tip 60%>
Побитовая константностью - неиболее сильная. Логическая - более слабая.
Небольшая заметка о том, как форсировать поддержку C++11 в парсере для различных билд-систем. Заметки касаются master-снапшота QTC (брать тут:
http://download.qt-project.org/snapshots/qtcreator/master/latest/ или собирать из исходников).
Нужно отметить, что синтаксис нового стандарта поддерживается сейчас по-умолчанию. Проблемы касаются правильного определения констант компилятора, подключения частей стандартной библиотеки и т.п.
С приходом нового стандарта эти две свободные функции появились в STL, в библиотеке итераторов (#include <iterator>
). Кроме того, в примерах кода часто можно увидеть, что они используются на STL контейнерах вместо собственных методов .begin()
и .end()
:
#include <iostream>
#include <vector>
#include <iterators>
using namespace std;
int main()
{
vector<int> v{1, 2, 3, 4, 5};
for (auto it = begin(v); it != end(v); ++it)
{
cout << "Number: " << *it << endl;
}
return 0;
}
Мне хорошо понятно, что эти функции отлично подходят для RAW-массивов, т.е. если в примере выше заменить:
vector<int> v{1, 2, 3, 4, 5};
на
int v[] = {1, 2, 3, 4, 5};
или даже
То весь остальной код менять не нужно. Удобно, причём мы защищены от подсовывания указателя вместо массива. Но почему они применяются для STL контейнеров?
Поиск по интернету дал только один ответ: для унификации. И только.
Т.е. ни по “кошерности” ни по скорости два этих подхода не отличаются. Чисто для единства вида.
Если у кого есть другие предположения - милости просим в дискуссию.
Ссылки
-
std::begin()
-
std::end()
-
std::next()
-
std::prev()
Дошли руки до включения данной фичи на моём ноутбуке. Всё оказалось не просто, а очень просто, в случае Linux Mint 16, всё делаем по инструкции:
http://help.ubuntu.ru/wiki/bumblebee для Linux Mint 16 смотрим на версии убунты 13.10, для будущего Linux Mint 17 - 14.04.
За более детальными настройками:
https://wiki.archlinux.org/index.php/Bumblebee_%28%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%29
Если коротко:
- Включаем в биосе Nvidia Optimus, у меня стоит предупреждение, что тема только для Windows 7 и 8, тупо игнорим
- После перезагрузке в выводе
lspci -nn | grep VGA
наблюдаем две строки, а не одну, как обычно.
- Ставим дрова nvidia (проприетарные):
sudo apt-get install nvidia-319-updates nvidia-settings-319-updates
- Ставим бамблбее:
sudo apt-get install bumblebee bumblebee-nvidia primus primus-libs-ia32
- Ребутимся (а может и не нужно, но у меня на этом шаге Optimus был выключен в биосе, так что один фиг нужно было включить, но перелогиниться нужно точно, так как текущий пользователь был включён в группу bumblebee, что бы иметь возможность вызывать optirun).
- Профит!
После загрузки смотрим вывод optirun --status
видим, что всё ок. А приложения запускаем:
optirun [аргументы] <приложение> [аргументы приложения]
Для самых нетерпеливых, можно сравнить вывод двух команд:
glxinfo
optirun glxinfo
Если при старте вылазит такое:
...using GL_NV_blend_square
...using GL_ARB_texture_compression
X..GL_EXT_texture_compression_s3tc not found
Fatal Error: Texture compression unavailable
Shutting down SDL subsystem
--------------- BSE Shutdown ----------------
---------------------------------------------
idRenderSystem::Shutdown()
Sys_Error: Texture compression unavailable
Нужно сделать следующее:
- Устанавливаем
driconf
, для deb-based: apt-get install driconf
- Запускаем его от простого пользователя
- На вкладке “Image Quality” включаем параметр “Enable S3TC texture compression even if software support is not available”
Всё, радуемся игре.