ВидеоКонф(ВКС)  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

h264 с вызывной панели DS-KD8102-V только при движении

Новичком считается только что прочитавший «Астериск - будущее телефонии»
http://asterisk.ru/knowledgebase/books
и пытающийся сделать большее

Модераторы: april22, Zavr2008

Re: h264 с вызывной панели DS-KD8102-V только при движении

Сообщение sasa » 25 фев 2019, 17:22

pastebin разве не удобнее ?
Только патчить
Они обмениваются разными параметрами кодека и из за неточностях модуля res_format_attr_h264 - астериск решает что они равнозначны
packetization-mode не получает один
idc-profile-level не получает другой
sasa
 
Сообщений: 119
Зарегистрирован: 22 янв 2019, 15:41

Re: h264 с вызывной панели DS-KD8102-V только при движении

Сообщение podmigor » 25 фев 2019, 17:27

Спасибо, попробую пропатчить. Пока что непонятно как патчить asterisk в составе дистрибутива freepbx..
podmigor
 
Сообщений: 17
Зарегистрирован: 22 фев 2019, 16:45

Re: h264 с вызывной панели DS-KD8102-V только при движении

Сообщение sasa » 25 фев 2019, 17:31

Менеджером пакетов стягивать исходники которые должны быть по идеи прибиты к дистрибутиву
И пересобирать
sasa
 
Сообщений: 119
Зарегистрирован: 22 янв 2019, 15:41

Re: h264 с вызывной панели DS-KD8102-V только при движении

Сообщение podmigor » 28 фев 2019, 12:31

Пропатчил по этому мануалу https://wiki.freepbx.org/display/PPS/Applying+patches+to+Asterisk+in+distro+SNG7, только применимо к своей версии 13.22.0; и при установке пакетов пользовался не rpm -i, а rpm -iv --reinstall, ну и потом полный restart. Для уверенности проверил хеш установленного модуля res_format_attr_h264 - после исправления он изменился.
В итоге симптомы проблемы те же.
podmigor
 
Сообщений: 17
Зарегистрирован: 22 фев 2019, 16:45

Re: h264 с вызывной панели DS-KD8102-V только при движении

Сообщение sasa » 28 фев 2019, 13:24

Лог левел варнинг и смотрите отрабатывает ли этот модуль вообще
Код: выделить все
--- res_format_attr_h264.c.orig 2019-02-25 11:41:21.487089361 +0200
+++ res_format_attr_h264.c      2019-02-28 11:21:51.117788005 +0200
@@ -105,8 +105,7 @@
        struct h264_attr *attr1 = ast_format_get_attribute_data(format1);
        struct h264_attr *attr2 = ast_format_get_attribute_data(format2);

-       if (!attr1 || !attr1->PROFILE_IDC || !attr2 || !attr2->PROFILE_IDC ||
-               (attr1->PROFILE_IDC == attr2->PROFILE_IDC)) {
+       if (!attr1 || !attr2 || (attr1 && attr2 && !memcmp(attr1, attr2, sizeof(*attr1)))) {
                return AST_FORMAT_CMP_EQUAL;
        }

@@ -124,6 +123,9 @@
        if (!cloned) {
                return NULL;
        }
+
+       ast_log(AST_LOG_WARNING, "h264_getjoint");
+
        attr = ast_format_get_attribute_data(cloned);

        attr1 = ast_format_get_attribute_data(format1);
@@ -175,6 +177,9 @@
        if (!cloned) {
                return NULL;
        }
+
+       ast_log(AST_LOG_WARNING, "h264_parse_sdp_fmtp: %s", attributes);
+
        attr = ast_format_get_attribute_data(cloned);

        attr->REDUNDANT_PIC_CAP = H264_ATTR_KEY_UNSET;
@@ -306,6 +311,8 @@
                ast_str_append(str, 0, "\r\n");
        }

+       ast_log(AST_LOG_WARNING, "h264_generate_sdp_fmtp: %s", ast_str_buffer(str));
+
        return;
}

sasa
 
Сообщений: 119
Зарегистрирован: 22 янв 2019, 15:41

Re: h264 с вызывной панели DS-KD8102-V только при движении

Сообщение podmigor » 01 мар 2019, 16:57

Внес изменения и снял лог звонка: http://pasted.co/56869d20
Строки в логе содержащие WARNING:
[Показать] Спойлер:
[2019-03-01 14:41:32] WARNING[4045][C-00000001] res_format_attr_h264.c: h264_parse_sdp_fmtp: [2019-03-01 14:41:32] VERBOSE[4045][C-00000001] chan_sip.c: Found video description format H264 for ID 96
[2019-03-01 14:41:32] WARNING[4045][C-00000001] res_format_attr_h264.c: h264_parse_sdp_fmtp: profile-level-id=4D001F; packetization-mode=1[2019-03-01 14:41:32] DEBUG[4045][C-00000001] chan_sip.c: Processing media-level (video) SDP a=fmtp:96 profile-level-id=4D001F; packetization-mode=1... OK.
[2019-03-01 14:41:32] WARNING[4045][C-00000001] res_format_attr_h264.c: h264_getjoint[2019-03-01 14:41:32] VERBOSE[4045][C-00000001] chan_sip.c: Capabilities: us - (ulaw|g726|alaw|h264), peer - audio=(ulaw|g726|alaw)/video=(h264)/text=(nothing), combined - (ulaw|g726|alaw|h264)
[2019-03-01 14:41:32] WARNING[5784] logger: Log queue threshold (1000) exceeded. Discarding new messages.
[2019-03-01 14:41:32] WARNING[3977] logger: Logging resumed. 357 messages discarded.
[2019-03-01 14:41:32] WARNING[5784][C-00000001] res_format_attr_h264.c: h264_getjoint[2019-03-01 14:41:32] DEBUG[4022] manager.c: Examining AMI event:
[2019-03-01 14:41:32] WARNING[5784][C-00000001] res_format_attr_h264.c: h264_generate_sdp_fmtp: рИш]2[2019-03-01 14:41:32] VERBOSE[5784][C-00000001] chan_sip.c: Adding codec g726 to SDP
[2019-03-01 14:41:36] WARNING[4045][C-00000001] res_format_attr_h264.c: h264_parse_sdp_fmtp: [2019-03-01 14:41:36] VERBOSE[4045][C-00000001] chan_sip.c: Found video description format H264 for ID 99
[2019-03-01 14:41:36] WARNING[4045][C-00000001] res_format_attr_h264.c: h264_parse_sdp_fmtp: profile-level-id=42801F[2019-03-01 14:41:36] DEBUG[4045][C-00000001] chan_sip.c: Processing media-level (video) SDP a=fmtp:99 profile-level-id=42801F... OK.
[2019-03-01 14:41:36] WARNING[4045][C-00000001] res_format_attr_h264.c: h264_getjoint[2019-03-01 14:41:36] VERBOSE[4045][C-00000001] chan_sip.c: Capabilities: us - (ulaw|g726|alaw|h264), peer - audio=(ulaw|alaw)/video=(h264)/text=(nothing), combined - (ulaw|alaw|h264)
[2019-03-01 14:41:36] WARNING[5784][C-00000001] res_format_attr_h264.c: h264_generate_sdp_fmtp: °Лш]2[2019-03-01 14:41:36] VERBOSE[5784][C-00000001] chan_sip.c: Adding non-codec 0x1 (telephone-event) to SDP

Мне кажется модуль отрабатывает, судя по этим строкам...
podmigor
 
Сообщений: 17
Зарегистрирован: 22 фев 2019, 16:45

Re: h264 с вызывной панели DS-KD8102-V только при движении

Сообщение sasa » 01 мар 2019, 18:09

Отрабатывает да не так
pastebin.com Лучше
Код: выделить все
--- res_format_attr_h264.c.orig 2019-02-25 11:41:21.487089361 +0200
+++ res_format_attr_h264.c      2019-03-01 16:31:05.389176706 +0200
@@ -105,8 +105,7 @@
        struct h264_attr *attr1 = ast_format_get_attribute_data(format1);
        struct h264_attr *attr2 = ast_format_get_attribute_data(format2);

-       if (!attr1 || !attr1->PROFILE_IDC || !attr2 || !attr2->PROFILE_IDC ||
-               (attr1->PROFILE_IDC == attr2->PROFILE_IDC)) {
+       if (!attr1 || !attr2 || (attr1 && attr2 && !memcmp(attr1, attr2, sizeof(*attr1)))) {
                return AST_FORMAT_CMP_EQUAL;
        }

@@ -129,6 +128,10 @@
        attr1 = ast_format_get_attribute_data(format1);
        attr2 = ast_format_get_attribute_data(format2);

+       ast_log(AST_LOG_WARNING, "h264_getjoint: %x %x %x = %x %x %x\n",
+                                       attr1 ? attr1->PROFILE_IDC:0, attr1 ? attr1->PROFILE_IOP:0, attr1 ? attr1->LEVEL:0,
+                                       attr2 ? attr2->PROFILE_IDC:0, attr2 ? attr2->PROFILE_IOP:0, attr2 ? attr2->LEVEL:0);
+
        DETERMINE_JOINT(attr, attr1, attr2, PROFILE_IDC);
        DETERMINE_JOINT(attr, attr1, attr2, PROFILE_IOP);
        DETERMINE_JOINT(attr, attr1, attr2, LEVEL);
@@ -175,6 +178,7 @@
        if (!cloned) {
                return NULL;
        }
+       ast_log(AST_LOG_WARNING, "h264_parse_sdp_fmtp: %s\n", attributes);
        attr = ast_format_get_attribute_data(cloned);

        attr->REDUNDANT_PIC_CAP = H264_ATTR_KEY_UNSET;
@@ -189,6 +193,7 @@
                attrib = ast_strip(attrib);

                if (sscanf(attrib, "profile-level-id=%lx", &val2) == 1) {
+       ast_log(AST_LOG_WARNING, "h264_parse_sdp_fmtp: profile-level-id= (%lx)\n", val2);
                        attr->PROFILE_IDC = ((val2 >> 16) & 0xFF);
                        attr->PROFILE_IOP = ((val2 >> 8) & 0xFF);
                        attr->LEVEL = (val2 & 0xFF);
@@ -284,6 +289,7 @@
        APPEND_IF_NOT_H264_UNSET(attr->PACKETIZATION_MODE, str, "packetization-mode");
        APPEND_IF_NOT_H264_UNSET(attr->LEVEL_ASYMMETRY_ALLOWED, str, "level-asymmetry-allowed");

+       ast_log(AST_LOG_WARNING, "h264_generate_sdp_fmtp: profile-level-id= (%02X%02X%02X)\n", attr->PROFILE_IDC, attr->PROFILE_IOP, attr->LEVEL);
        if (attr->PROFILE_IDC && attr->PROFILE_IOP && attr->LEVEL) {
                if (added) {
                        ast_str_append(str, 0, ";");
@@ -306,6 +312,7 @@
                ast_str_append(str, 0, "\r\n");
        }

+       ast_log(AST_LOG_WARNING, "h264_generate_sdp_fmtp: %d, %s\n", ast_str_size(str), ast_str_buffer(str));
        return;
}
sasa
 
Сообщений: 119
Зарегистрирован: 22 янв 2019, 15:41

Re: h264 с вызывной панели DS-KD8102-V только при движении

Сообщение sasa » 01 мар 2019, 18:46

Исправил, не благодарите, я бы сказал там вся логика модуля не верная
Видео вообще могло работать только на особенных профайлах

Иногда нужно генерировать параметр даже с нулевым значением

Но для профайл левела
Если хоть один параметр ноль, то оно не генерировало профайл левел кодека целиком
Код: выделить все
if (attr->PROFILE_IDC && attr->PROFILE_IOP && attr->LEVEL) {

Правильно если хоть один парамер есть, нужно генерировать весь профайл
Код: выделить все
if (attr->PROFILE_IDC || attr->PROFILE_IOP || attr->LEVEL) {

Полный патч, на то случай если все же не то генерируется
Код: выделить все
--- res_format_attr_h264.c.orig 2019-02-25 11:41:21.487089361 +0200
+++ res_format_attr_h264.c      2019-03-01 16:42:31.406440601 +0200
@@ -105,8 +105,7 @@
        struct h264_attr *attr1 = ast_format_get_attribute_data(format1);
        struct h264_attr *attr2 = ast_format_get_attribute_data(format2);

-       if (!attr1 || !attr1->PROFILE_IDC || !attr2 || !attr2->PROFILE_IDC ||
-               (attr1->PROFILE_IDC == attr2->PROFILE_IDC)) {
+       if (!attr1 || !attr2 || (attr1 && attr2 && !memcmp(attr1, attr2, sizeof(*attr1)))) {
                return AST_FORMAT_CMP_EQUAL;
        }

@@ -129,6 +128,10 @@
        attr1 = ast_format_get_attribute_data(format1);
        attr2 = ast_format_get_attribute_data(format2);

+       ast_log(AST_LOG_WARNING, "h264_getjoint: %x %x %x = %x %x %x\n",
+                                       attr1 ? attr1->PROFILE_IDC:0, attr1 ? attr1->PROFILE_IOP:0, attr1 ? attr1->LEVEL:0,
+                                       attr2 ? attr2->PROFILE_IDC:0, attr2 ? attr2->PROFILE_IOP:0, attr2 ? attr2->LEVEL:0);
+
        DETERMINE_JOINT(attr, attr1, attr2, PROFILE_IDC);
        DETERMINE_JOINT(attr, attr1, attr2, PROFILE_IOP);
        DETERMINE_JOINT(attr, attr1, attr2, LEVEL);
@@ -175,6 +178,7 @@
        if (!cloned) {
                return NULL;
        }
+       ast_log(AST_LOG_WARNING, "h264_parse_sdp_fmtp: %s\n", attributes);
        attr = ast_format_get_attribute_data(cloned);

        attr->REDUNDANT_PIC_CAP = H264_ATTR_KEY_UNSET;
@@ -189,6 +193,7 @@
                attrib = ast_strip(attrib);

                if (sscanf(attrib, "profile-level-id=%lx", &val2) == 1) {
+       ast_log(AST_LOG_WARNING, "h264_parse_sdp_fmtp: profile-level-id= (%lx)\n", val2);
                        attr->PROFILE_IDC = ((val2 >> 16) & 0xFF);
                        attr->PROFILE_IOP = ((val2 >> 8) & 0xFF);
                        attr->LEVEL = (val2 & 0xFF);
@@ -284,7 +289,8 @@
        APPEND_IF_NOT_H264_UNSET(attr->PACKETIZATION_MODE, str, "packetization-mode");
        APPEND_IF_NOT_H264_UNSET(attr->LEVEL_ASYMMETRY_ALLOWED, str, "level-asymmetry-allowed");

-       if (attr->PROFILE_IDC && attr->PROFILE_IOP && attr->LEVEL) {
+       ast_log(AST_LOG_WARNING, "h264_generate_sdp_fmtp: profile-level-id= (%02X%02X%02X)\n", attr->PROFILE_IDC, attr->PROFILE_IOP, attr->LEVEL);
+       if (attr->PROFILE_IDC || attr->PROFILE_IOP || attr->LEVEL) {
                if (added) {
                        ast_str_append(str, 0, ";");
                } else if (0 < ast_str_append(str, 0, "a=fmtp:%u ", payload)) {
@@ -306,6 +312,7 @@
                ast_str_append(str, 0, "\r\n");
        }

+       ast_log(AST_LOG_WARNING, "h264_generate_sdp_fmtp: %d, %s\n", ast_str_size(str), ast_str_buffer(str));
        return;
}


В последней версии астериска исправили убрав проверку заведомо нулевого параметра
Код: выделить все
if (attr->PROFILE_IDC && attr->LEVEL) {

https://github.com/asterisk/asterisk/bl ... 264.c#L285
Используйте всегда самый последний астериск

Но не исправили если два одинаковых профайл левела будут иметь разницу в пакетизации
Видео не пройдет
sasa
 
Сообщений: 119
Зарегистрирован: 22 янв 2019, 15:41

Re: h264 с вызывной панели DS-KD8102-V только при движении

Сообщение podmigor » 02 мар 2019, 16:18

Пробовал
Код: выделить все
if (attr->PROFILE_IDC || attr->PROFILE_IOP || attr->LEVEL) {

Не помогло..
То же самое и с полным патчем..
http://pasted.co/22d04a3c
[Показать] Спойлер:
Line 247: [2019-03-02 14:11:23] WARNING[2718][C-00000001] res_format_attr_h264.c: h264_parse_sdp_fmtp:
Line 250: [2019-03-02 14:11:23] WARNING[2718][C-00000001] res_format_attr_h264.c: h264_parse_sdp_fmtp: profile-level-id=4D001F; packetization-mode=1
Line 251: [2019-03-02 14:11:23] WARNING[2718][C-00000001] res_format_attr_h264.c: h264_parse_sdp_fmtp: profile-level-id= (4d001f)
Line 253: [2019-03-02 14:11:23] WARNING[2718][C-00000001] res_format_attr_h264.c: h264_getjoint: 0 0 0 = 4d 0 1f
Line 10832: [2019-03-02 14:11:23] WARNING[3995][C-00000001] res_format_attr_h264.c: h264_getjoint: 4d 0 1f = 0 0 0
Line 12630: [2019-03-02 14:11:23] WARNING[3995][C-00000001] res_format_attr_h264.c: h264_getjoint: 0 0 0 = 4d 0 1f
Line 12652: [2019-03-02 14:11:23] WARNING[3995][C-00000001] res_format_attr_h264.c: h264_generate_sdp_fmtp: profile-level-id= (4D001F)
Line 12653: [2019-03-02 14:11:23] WARNING[3995][C-00000001] res_format_attr_h264.c: h264_generate_sdp_fmtp: 1678772896, рXн{
Line 13366: [2019-03-02 14:11:26] WARNING[2718][C-00000001] res_format_attr_h264.c: h264_parse_sdp_fmtp:
Line 13369: [2019-03-02 14:11:26] WARNING[2718][C-00000001] res_format_attr_h264.c: h264_parse_sdp_fmtp: profile-level-id=42801F
Line 13370: [2019-03-02 14:11:26] WARNING[2718][C-00000001] res_format_attr_h264.c: h264_parse_sdp_fmtp: profile-level-id= (42801f)
Line 13372: [2019-03-02 14:11:26] WARNING[2718][C-00000001] res_format_attr_h264.c: h264_getjoint: 0 0 0 = 42 80 1f
Line 13600: [2019-03-02 14:11:26] WARNING[3995][C-00000001] res_format_attr_h264.c: h264_generate_sdp_fmtp: profile-level-id= (4D001F)
Line 13601: [2019-03-02 14:11:26] WARNING[3995][C-00000001] res_format_attr_h264.c: h264_generate_sdp_fmtp: 1677844672, °[н{

Пробовал апгрейдить астериск до 16 версии еще до написания темы - результата не дало.
podmigor
 
Сообщений: 17
Зарегистрирован: 22 фев 2019, 16:45

Re: h264 с вызывной панели DS-KD8102-V только при движении

Сообщение sasa » 02 мар 2019, 17:15

Но в логе уже почти все правильно
Астариск начал отправлять профайл левел ид, раньше там было пусто
Код: выделить все
v=0
o=root 1129822023 1129822023 IN IP4 192.168.1.246
s=Asterisk PBX 13.22.0
c=IN IP4 192.168.1.246
b=CT:384
t=0 0
m=audio 16570 RTP/AVP 0 2 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:2 G726-32/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=maxptime:150
a=sendrecv
m=video 11252 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=4D001F
a=sendrecv


Правда в другом порядке, сначала пакетизацию а потом профайл
Можете снять tcpdump pcap когда панель с Астериском договариваются напрямую без астериска ?
И будущие логи аттачите сразу лог файлом, тяжело его копипастить для анализа
sasa
 
Сообщений: 119
Зарегистрирован: 22 янв 2019, 15:41

Пред.След.

Вернуться в Вопросы новичков

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25

© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH