Управление форвардом из Си++

Здесь обсуждаются любые продукты компании СофтЛаб-НСК для телевизионного вещания (Форвард Т, Форвард ТС, Форвард Голкипер, Форвард Рефери, Форвард Офис, Форвард Инжест)

Модераторы: ElenVR, Людмила, PR

Ответить
vd
Сообщения: 2311
Зарегистрирован: 05 мар 2003 19:21

Сообщение vd »

Да, действительно, файлы там есть. Только вот это для x64 сборок каталог. 32-битные библиотеки должны лежать в C:\Program Files (x86)\Common Files\SoftLab-Nsk.
Нет таких жестких требований - разве что, возможно, есть какие-то общие рекомендации от Microsoft. COM-библиотека может лежать вообще в любой папке на диске. Лишь бы она была зарегистрирована, и информация об этом была в реестре. Этого достаточно на 100%, чтобы потом сработал CoCreateInstance.

Вот у меня проекты с COM-библиотеками лежат на диске D: (не системном) глубоко во вложенных папках. И ничего, все библиотеки работают и успешно вызываются из клиентских программ.

Точно так же и SLMessageServer можно разместить где угодно, зарегистрировать в этом месте, и он будет работать.
Даниленко Сергей
Сообщения: 7093
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Сообщение Даниленко Сергей »

Декомпилировал ваш инсталлятор.
Вот таким образом у вас регистрируются сборки COM:
Proc [92] Export: GETREGASMPATH 8 @8
[0] PUSHVAR Base[-1] // 1
[6] CALL 93
[11] POP // 0
[12] CALC Base[-1] + ['\Microsoft.NET\Framework\v2.0.50727\regasm.exe ']
[75] RET
Декомпиляция? Срываем покровы :) ?

Вообще-то утилита regasm регистрирует не СОМ-объекты, а сборки .Net (assembly).
Т.е. вы получаете путь к regasm на основе жестко заданной версии .NET. Что если у меня другая версия .NET (хотя бы немного)? Скрипт не отработает и файл не будет зарегистрирован.
Да, представьте себе это так - используется путь на основе жёстко заданной версии .Net.

Выглядит это примерно так (в InnoSetup):

Код: Выделить всё

const
RegAsmPath = '\Microsoft.NET\Framework\v2.0.50727\regasm.exe ';
RegAsmParam = '/codebase ';
RegAsmUninstallParam = '/u ';

function GetRegAsmPath(S: String): String;
begin
	Result := GetWinDir() + RegAsmPath;
end;

function GetRegAsmParam(S: String): String;
begin
	Result := RegAsmParam;
end;
::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::
[Run]
;MessageServer
Filename: {code:GetRegAsmPath}; Parameters: {code:GetRegAsmParam} SLMessageRemote2.dll; WorkingDir: {cf}\SoftLab-Nsk; Flags: runhidden skipifdoesntexist

Но только вывод из этого у вас неправильный. Если уж используете декомпиляцию, то посмотрите на InitializeSetup:

function InitializeSetup(): Boolean;
begin
::::::::::::::::::
::::::::::::::::::
  if(FALSE = [b]CheckAndInstallDotNet35[/b](DotNetFxName35, ReqDotNetFxVersion35, DotNetFxRegPath35)) then 
    exit;
:::::::::::::::::
:::::::::::::::::
end;

Другими словами, до того места, которое вы озвучили выше не имея нужной версии .Net вы просто не доберётесь. У вас даже "мордочка" инсталлятора не поднимется - просто вежливо пошлют в "космос" с настойчивым пожеланием установить прежде нужную версию .Net.
Оставлю без комментариев почему мы проверяем на версию 3.5, а regasm берём из 2.0 - на то есть свои причины и объяснения.

[quote]Что если у меня другая версия .NET (хотя бы немного)[/quote]
А как это немного? Я надеюсь, что вы не думаете, что .Net - это open source, в который каждый может залезть и сделать себе нужную версию?

[quote]Вот некоторые другие файлы у вас прописаны явно для регистрации: 

Filename: "regsvr32.exe"; Parameters: "/s ""{app}\FDTitle\Logotype.dll"""; MinVersion: 4.1,4.0; Flags: skipifdoesntexist 
[/quote]

Здесь я могу только отослать вас к документации по InnoSetup, которым мы пользуемся для своих инсталляторов. Посмотрите, во что разворачивается при работе инсталлятора константа {app}.


[quote]Я не понимаю агрессии с вашей стороны. То я вас пугаю, то говорю не по теме. У меня сейчас все работает и все хорошо благодаря вашей тех поддержке, которая отлично сработала. Только вот почему-то когда я хочу сказать об ошибке, вам это начинает не нравится, вроде как камень в ваш огород. Ошибки бывают у всех, важно уметь их признавать.[/quote]
Ну а смайлик вы конечно не заметили в моём вопросе?
Вы до сих пор считаете, что вписались в обсуждение по теме?
Готовы признать свои ошибки. Только какие именно? :)

[quote]Да, действительно, файлы там есть. Только вот это для x64 сборок каталог. 32-битные библиотеки должны лежать в C:\Program Files (x86)\Common Files\SoftLab-Nsk.[/quote]

Во-первых, соглашусь со своим коллегой, что это чисто формальное "требование", которое на работу ПО, как правило, не влияет. Единственное, где это нужно (по нашему ПО) - для 32 и 64 разрядных версий кодеков на 64-разрядной ОС. Там действительно нужно раскладывать в разные папки.

Кроме того, вы на это смотрите с точки зрения программиста. А мы - с точки зрения пользователя, который этим добром пользуется. Не хочется забивать голову пользователю, что  в одной версии ОС софт стоит в одной папке, а в другой версии ОС - используется другое место.
AntonChik
Сообщения: 83
Зарегистрирован: 16 фев 2010 15:32
Откуда: г. Красноярск

Сообщение AntonChik »

Игорь Таранцев писал(а):Я думаю, что ошибка связана с отсутствием какого-либо из титровальных элементов, которые используются в Вашем титровальном проекте. Вам нужно попробовать загрузить выбранный Вами титровальный проект в OnAir - он должен загрузиться без ошибок. Затем OnAir нужно закрыть (или очистить титровальный проект) и попытаться загрузить титровальный проект в тестовом приложении. Если ошибка останется, то сделайте ее скриншот (или копию полного текстового описания) и пришлите на почту техподдержки (к письму приложите титровальный проект).
Титровальный проект содержит просто одну Картинку. В OnAir грузится без проблем и работает.
Попробовал сегодня программку на плате (FD300), все работает, проект грузится, Low-Level Title Objects отрабатывают.
Вернулся к компу с ForwardLite. При открытии даже пустого проекта выходят последовательно такие окна:

Изображение
А при нажатии кнопки Start для Low-Level Title Object появляется окошко

Изображение
p.s. сейчас продублирую эту информацию в почту техподдержки forward@softlab.tv
Игорь Таранцев
Сообщения: 493
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Сообщение Игорь Таранцев »

Необходимо изменить GUID титровального сервера, на котором запускается тестовое приложение. В SDK по умолчанию (в коде) выбран GUID для платы FD300, поскольку раньше большинство клиентов работали именно с платой FD300.
При работе на видеопроцессоре (программа SLTitlePreview создает именно видеопроцессор) необходимо использовать другой GUID.
Вам нужно в файле ImageGenerator.cpp добавить строки:

Код: Выделить всё

extern "C" const GUID CLSID_SLDirectShowTitleEngine = {0x73DA552F,0x4946,0x4670,{0x84,0x84,0x95,0x8F,0x97,0xA2,0x23,0xF2}};

// VideoProceesor title surface info
GUID CImageGenerator::guidTitleTarget = CLSID_SLDirectShowTitleEngine;
Соответственно, строку с текущим guidTitleTarget нужно закомментировать:

Код: Выделить всё

//GUID CImageGenerator::guidTitleTarget = CLSID_SLTMTitleServerTargetMgr;
иначе компилятор сругается на двойное определение guidTitleTarget.

Если Вы посмотрите в начало файла ImageGenerator.cpp, то увидетие в нем много разных GUID-ов для платы FD300. В SDK в файле SLDSTitleCLSID.txt указаны другие GUID-ы, например, для плат FD322, FD422, FD842. Ваше приложение должно использовать нужный GUID и индекс платы (титровального ядра), чтобы оно рисовало титры на нужной Вам плате.
Игорь Таранцев
Сообщения: 493
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Сообщение Игорь Таранцев »

В примере SLTMTitleRunTimeSDK из SDK вообще нет выбора плат - он всегда открывается на первой плате с текущим GUID-ом (по умолчанию - на плате FD300).
Если Вам нужно сделать приложение, которое могло бы работать на разных платах (FD300, FD322 и т.д.) или вообще без платы (в окне программы SLTitlePreview), то нужно усложнять программу и предлагать выбор сначала типа плат (FD300, Videoprocessor, FDExt), а затем номера платы (вернее индекса рабочего титровального ядра, поскольку на новых платах много титровальных ядер). Так сделано в программе OnAir в закладке "Конфигурация", где в левом списке выбирается тип, а в правом - конкретная плата данного типа.
Я добавлю в SDK пример такого выбора плат.
AntonChik
Сообщения: 83
Зарегистрирован: 16 фев 2010 15:32
Откуда: г. Красноярск

Сообщение AntonChik »

Так и сделал, теперь все работает.
Спасибо за развернутый ответ.
Даниленко Сергей
Сообщения: 7093
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Сообщение Даниленко Сергей »

Для int:
Как видите дело было вовсе не в SLMessageServer.
AntonChik
Сообщения: 83
Зарегистрирован: 16 фев 2010 15:32
Откуда: г. Красноярск

Сообщение AntonChik »

Подскажите, пожалуйста, еще один момент.
Имеется две платы FD300
Успешно работаю с первой, nBoardIndex = 0
Попробовал сделать вывод через вторую плату, сделал
nBoardIndex = 1
Инициализация проходит, программа работает, но вывода не вижу, видеосигнал как бы не выходит.
Чтобы бы это значило?
Если ставлю nBoardIndex = 2, инициализация сразу не проходит.

Есть еще одна самописная программа (скажем так без исходников), которая успешно работает с этой второй платой.
Не могу понять в чем дело. С индексами вроде правильно поступаю.
Игорь Таранцев
Сообщения: 493
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Сообщение Игорь Таранцев »

Да, с индексами все правильно. Что не так я подсказать пока не могу. Надо больше информации. Проще всего мне понять проблему, если мне удалось бы получить доступ к Вашему компьютеру и Вы бы мне показали "на месте" что Вы делаете. Если такой возможности нет, то для начала нужно получить письмо (на адрес техподдержки) с информацией из SaveInfo с компьютера и далее я буду смотреть, почему картинки не видно.
Даниленко Сергей
Сообщения: 7093
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Сообщение Даниленко Сергей »

Про SaveInfo:

Запустите программу SLSaveInfo.
Соберите с ее помощью информацию о настройках платы и программ и пришлите нам.
ftp://ftp.sl.iae.nsk.su/Public/ForwardT ... veInfo.zip

forward@softlab.tv
forward@sl.iae.nsk.su
forward@softlab-nsk.com
Даниленко Сергей
Сообщения: 7093
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Сообщение Даниленко Сергей »

Цитирую ответ наших разработчиков:
У Вас вторая плата настроена на работу в режиме YUV+sKey. Возможно, в OnAir вы ее используете (использовали несколько минут назад) в режиме "внешний микшер". В этом случае нужно использовать другой CLSID устройства, а именно вместо CLSID_SLTMTitleServerTargetMgr нужно использовать CLSID_SLTMTitleNoPremultServerTargetMgr. На всякий случай приведу идентификаторы обоих устройств:
extern "C" const GUID CLSID_SLTMTitleServerTargetMgr = {0xDD02FC80,0x7D6E,0x440B,{0xBF,0x32,0x1A,0x29,0x77,0x4D,0xDC,0x1A}};
extern "C" const GUID CLSID_SLTMTitleNoPremultServerTargetMgr = {0xABCCE56A,0xC309,0x4FC8,{0x93,0x71,0x0F,0x58,0xCB,0xAA,0xAC,0x68}};
AntonChik
Сообщения: 83
Зарегистрирован: 16 фев 2010 15:32
Откуда: г. Красноярск

Сообщение AntonChik »

Спасибо. Дело было именно в этом. Теперь все работает.
AntonChik
Сообщения: 83
Зарегистрирован: 16 фев 2010 15:32
Откуда: г. Красноярск

Сообщение AntonChik »

Здравствуйте.
Возникла задача. Необходимо прокрутить в бегучке заданный текст за заданное время. Т.е. скорость бегучки рассчитывается по этим параметрам непосредственно перед запуском бегучки, и насколько я понял средствами SLTMTitleRunTime SDK этого не добиться. Как посоветуете поступить?
Игорь Таранцев
Сообщения: 493
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Сообщение Игорь Таранцев »

Да, в SLTMTitleRunTime SDK нет методов, позволяющих подобрать скорость бегучки.
Есть несолько вариантов решения проблемы:
Вариант 1.
Написать свой титровальный Java-скрипт, который будет подбирать требуемую скорость. Мне этот вариант кажется самым простым и эффективным, поскольку скрипт имеет доступ ко всем свойствам титровальных элементов в группе. Например, в первой строке задания указано время показа (в секундах), а далее до конца файла идет текст, который нужно показать. Соответственно, скрипт читает файл задания, запоминает скорость, загружает текст непосредственно в "бегущую строку" и меняет скорость до тех пор, пока длительность задания не станет требуемой.
Вариант 2.
Редактировать XML-файл с заданием для титровалього объекта (расширение файла SLTitleTsk), меняя параметр скорости бегущей строки из Вашей программы. Для этого нужно:
1) сохранить файл SLTitleTsk из группы в FDTitleDesigner-е и найти там поле, задающее скорость прокрутки текста
2) в программе отредактировать файл с заданием, установив скорость (например "1.0"), и с помощью метода CheckTask узнать время выполнения задания.
3) повторить шаг 2, но с другой сокростью (например, "5.0")
4) интерполировать скорость (интерполировав время 2-го и 3-го шагов), сохранить его в задании и загрузить задание в титровальный объект.
Вариант 3.
Если Ваше приложение написано на C# (вернее на .NET), то есть дополнительное апи, позволяющее редактировать свойства титровальных элементов (им пользуется программа FDTitleDesigner). Но это только для сильно "продвинутых" разработчиков, поскольку там много ограничений, которые трудно формализуются в SDK.
AntonChik
Сообщения: 83
Зарегистрирован: 16 фев 2010 15:32
Откуда: г. Красноярск

Сообщение AntonChik »

Спасибо за ответ.
Я собственно и думал сделать по схеме Варианта 2,
но после сохранения файла SLTitleTsk из группы в FDTitleDesigner-е не нашел там поле, задающее скорость прокрутки текста.

Код: Выделить всё

<?xml version="1.0" encoding="utf-16" standalone="yes"?>
<Regions count="2" name="Бегучка">
    <!--Бегущая строка, Барабан-->
    <region CLSID="6e350868-ab30-47a7-819e-1352e958dd83" visible="true" name="БегущСтрока">
        <!--Строка задания или имя файла задания.-->
        <FileName value="Бегучка.txt" />
    </region>
    <!--Картинка с прозрачностью-->
    <region CLSID="d373f79b-8e1c-4c3c-bb5c-742bd8b36797" visible="true" name="Подклад">
        <!--Полное имя файла задания.-->
        <FileName value="graphics\roll.tga" />
    </region>
</Regions> 
подозреваю, что наверно можно куда-то дописать, что-то вроде <Speed value=5/>
но гадать не хочется (хотя завтра все же попробую)
Изображение
Ответить