2004-10-20 01:38
by Vasil KolevНай-важното за днес – намерих проблема с ffserver. Всъщност, се оказа проблем с ffmpeg, но отне бая време да го изровя, и след това да открия, че това са го оправили в новите версии (и са строшили куп други неща :) ).
Проблемът беше в libavformat/tcp.c, правеше се следното(премахнал съм малко ifdef-ове):
ret = write(s->fd, buf, size); if (ret < 0 && errno != EINTR && errno != EAGAIN) return -errno; size -= ret; buf += ret;
Което при EAGAIN или EINTR всъщност мърда буфера в обратната посока, понеже ret=-1. Така потока, пращан от ffmpeg, се намазва, и ffserver-а полудява.
Отидох да погледна в cvs-а, и какво открих - проблема е оправен ето тук, точно след release на 0.4.8. Да бях се усетил да разгледам самия ffmpeg как се държи, още с първия strace го хванах, че мести буфера назад, ето и изхода:
write(4, "fm\0\0\0\3\346\323\337\326< |\10\r\35?\225j\234G\260\263"..., 32768) = 3432 write(4, "\23\21\330\214V1WD\6\347;\305\213\24A\265C\323g\3238/\310"..., 29336) = -1 EAGAIN (Resource temporarily unavailable) write(4, "\v\23\21\330\214V1WD\6\347;\305\213\24A\265C\323g\3238"..., 29337) = -1 EAGAIN (Resource temporarily unavailable) write(4, "M\v\23\21\330\214V1WD\6\347;\305\213\24A\265C\323g\323"..., 29338) = -1 EAGAIN (Resource temporarily unavailable) write(4, "\vM\v\23\21\330\214V1WD\6\347;\305\213\24A\265C\323g\323"..., 29339) = -1 EAGAIN (Resource temporarily unavailable) write(4, "%\vM\v\23\21\330\214V1WD\6\347;\305\213\24A\265C\323g\323"..., 29340) = -1 EAGAIN (Resource temporarily unavailable)
И за да може да хване google търсенията по-добре, кратко описание на проблема: ffserver дава segmentation fault (т.е. SIGSEGV) при мрежови проблеми при връзката м/у ffmpeg и ffserver.
Другото днес беше занимаването ми с един Itanium2, който ще показваме на openfest - в крайна сметка ще сваля някаква друга дистрибуция, за момента има един SLES8, който обаче е адски outdated. Освен това машината бучи като за два 32битови сървъра, и ме боли главата... Не ми харесва и как се движи - изглежда, за да работи нещо добре на нея, трябва да се компилира с ICC, а това е леко сложна задача за linux, най-малкото защото не всичко, компилирано с тоя компилатор работи (пример - linux kernel, с изчистени GNU-изми).