Size: a a a

2020 August 18

LL

Lama Lover in ErlangRus
Ivan
Код на Elixir (в чате Эликсира не смогли пока подсказать).

Вот это работает (чтение из файла, вывод в stdout):

Port.open({:spawn, ~s[ffmpeg -i 1.jpg -vf "scale='min(400,iw)':min'(200,ih)':force_original_aspect_ratio=decrease" -loglevel quiet -f image2 pipe:1]}, [:use_stdio, :stream, :exit_status, :binary])
flush()


Это тоже работает (вывод в файл, чтение из stdin, но приходится слать :close, без этого не работает, висит-ждёт):

pid = Port.open({:spawn, ~s[ffmpeg -i pipe:0 -vf "scale='min(400,iw)':min'(200,ih)':force_original_aspect_ratio=decrease" -loglevel quiet -f image2 4.jpg]}, [:use_stdio, :stream, :exit_status, :binary])
{:ok, data} = File.read("1.jpg")
Port.command(pid, data, [])
send(pid, {self(), :close})
flush()


А вот попытка использовать stdin и stdout не работает (шлю :close, как в предыдущем примере, при этом идёт flush по stdin и stdout, но к этому моменту на stdout пусто, и data messages не идут, порт закрывается, ffmpeg пишет в stderr дебаг-инфо о входном и выходном потоках):

pid = Port.open({:spawn, ~s[ffmpeg -i pipe:0 -vf "scale='min(400,iw)':min'(200,ih)':force_original_aspect_ratio=decrease" -loglevel verbose -f image2 pipe:1]}, [:use_stdio, :stream, :exit_status, :binary])
{:ok, data} = File.read("1.jpg")
Port.command(pid, data, [])
send(pid, {self(), :close})
flush()
Выделяй код этими символами "`"
Три таких с одной стороны, три с другой
И он будет моноширинным
источник

I

Ivan in ErlangRus
Lama Lover
Выделяй код этими символами "`"
Три таких с одной стороны, три с другой
И он будет моноширинным
👌 Не знал, что в Телеге это тоже работает, спасибо. )
источник

ŹR

Źmićer Rubinštejn in ErlangRus
Как в нифке вернуть error tuple наиболее быстрым и каноничным способом чтобы не проебаться?
источник

ŹR

Źmićer Rubinštejn in ErlangRus
ERL_NIF_TERM
mk_atom(ErlNifEnv* env, const char* atom) {
   ERL_NIF_TERM ret;

   if (!enif_make_existing_atom(env, atom, &ret, ERL_NIF_LATIN1)) {
       return enif_make_atom(env, atom);
   }

   return ret;
}

ERL_NIF_TERM
mk_error(ErlNifEnv* env, const char* mesg) {
   return enif_make_tuple2(env, mk_atom(env, "error"), mk_atom(env, mesg));
}


Вот такой сниппет нашел - норм?
источник

ИИ

Иванов Иванов... in ErlangRus
Лишние проверки. Атом глобален. Поэтому хак в том что все атомы создаются заранее
источник

ИИ

Иванов Иванов... in ErlangRus
Макс тут кстати выкладывал обвязку на макросах для лаконичности декларации атомов
источник

ИИ

Иванов Иванов... in ErlangRus
Źmićer Rubinštejn
ERL_NIF_TERM
mk_atom(ErlNifEnv* env, const char* atom) {
   ERL_NIF_TERM ret;

   if (!enif_make_existing_atom(env, atom, &ret, ERL_NIF_LATIN1)) {
       return enif_make_atom(env, atom);
   }

   return ret;
}

ERL_NIF_TERM
mk_error(ErlNifEnv* env, const char* mesg) {
   return enif_make_tuple2(env, mk_atom(env, "error"), mk_atom(env, mesg));
}


Вот такой сниппет нашел - норм?
Но твой вариант каноничен
источник

ŹR

Źmićer Rubinštejn in ErlangRus
А что будет, если вызвать make_atom если он уже сущетсвует? Крешнется ВМ?
источник

ML

Maksim Lapshin in ErlangRus
Źmićer Rubinštejn
А что будет, если вызвать make_atom если он уже сущетсвует? Крешнется ВМ?
Вернется уже существующий
источник

ML

Maksim Lapshin in ErlangRus
Его можно присвоить в глобальную переменную и пользоваться им
источник

ŹR

Źmićer Rubinštejn in ErlangRus
if (!enif_make_existing_atom(env, atom, &ret, ERL_NIF_LATIN1)) {
       return enif_make_atom(env, atom);
   }
источник

ŹR

Źmićer Rubinštejn in ErlangRus
Типа вторая фукнция дороже?
источник

ŹR

Źmićer Rubinštejn in ErlangRus
Иванов Иванов
Лишние проверки. Атом глобален. Поэтому хак в том что все атомы создаются заранее
В растлере вроде так из коробки делается. Но вот жизнь заставляет писать на C, а я его очень сильно не знаю
источник

ИИ

Иванов Иванов... in ErlangRus
Źmićer Rubinštejn
Типа вторая фукнция дороже?
С трудом верится. Скорее для проверки если нужна проверка что атом уже есть. В данном случае - ради каноничности.
источник

ИИ

Иванов Иванов... in ErlangRus
Хотя если он его создаёт таки, а потом фоном проверят то может и дороже
источник

VS

Vladimir Sekisov in ErlangRus
Ivan
Код на Elixir (в чате Эликсира не смогли пока подсказать).

Вот это работает (чтение из файла, вывод в stdout):

Port.open({:spawn, ~s[ffmpeg -i 1.jpg -vf "scale='min(400,iw)':min'(200,ih)':force_original_aspect_ratio=decrease" -loglevel quiet -f image2 pipe:1]}, [:use_stdio, :stream, :exit_status, :binary])
flush()


Это тоже работает (вывод в файл, чтение из stdin, но приходится слать :close, без этого не работает, висит-ждёт):

pid = Port.open({:spawn, ~s[ffmpeg -i pipe:0 -vf "scale='min(400,iw)':min'(200,ih)':force_original_aspect_ratio=decrease" -loglevel quiet -f image2 4.jpg]}, [:use_stdio, :stream, :exit_status, :binary])
{:ok, data} = File.read("1.jpg")
Port.command(pid, data, [])
send(pid, {self(), :close})
flush()


А вот попытка использовать stdin и stdout не работает (шлю :close, как в предыдущем примере, при этом идёт flush по stdin и stdout, но к этому моменту на stdout пусто, и data messages не идут, порт закрывается, ffmpeg пишет в stderr дебаг-инфо о входном и выходном потоках):

pid = Port.open({:spawn, ~s[ffmpeg -i pipe:0 -vf "scale='min(400,iw)':min'(200,ih)':force_original_aspect_ratio=decrease" -loglevel verbose -f image2 pipe:1]}, [:use_stdio, :stream, :exit_status, :binary])
{:ok, data} = File.read("1.jpg")
Port.command(pid, data, [])
send(pid, {self(), :close})
flush()
это известное ограничение для портов,
Erlang не умеет закрывать stdout, посмотрите на erlexec или ему подобный,
может он умеет:
https://github.com/saleyn/erlexec
источник

I

Ivan in ErlangRus
Vladimir Sekisov
это известное ограничение для портов,
Erlang не умеет закрывать stdout, посмотрите на erlexec или ему подобный,
может он умеет:
https://github.com/saleyn/erlexec
То есть уже сталкивались с проблемой преждевременного закрытия stdout? Erlexec смотрел, мне зашло, но команда против "лишних" зависимостей.)
источник

VS

Vladimir Sekisov in ErlangRus
Ivan
То есть уже сталкивались с проблемой преждевременного закрытия stdout? Erlexec смотрел, мне зашло, но команда против "лишних" зависимостей.)
тут либо делать свою обертку, либо брать
чужую,
порты были спроектированы
для специфического случая,
общения с с-нодами и более
ни для чего.
источник

ИИ

Иванов Иванов... in ErlangRus
Ivan
То есть уже сталкивались с проблемой преждевременного закрытия stdout? Erlexec смотрел, мне зашло, но команда против "лишних" зависимостей.)
у меня были проблемы с erlexec - иногда невоспроизводимым образом резались (терялись) хвосты сообщений.
источник

P

PsyDebug in ErlangRus
вот тут какраз были вроде похожие кейсы, какраз для механизма превьюшек, с ffmpeg
https://bitbucket.org/corneyy/mpegtsmon/src/master/
источник