Титр собственного изготовления
Модераторы: ElenVR, Людмила, PR
-
- Сообщения: 7093
- Зарегистрирован: 26 фев 2004 09:53
- Откуда: Techsupport SoftLab-NSK
-
- Сообщения: 90
- Зарегистрирован: 04 сен 2008 01:50
- Откуда: Красноярск
А нет ошибки. SetActive относится к блоку уинициализации, а она проходит успешно. Каждый вызов метода интерфейса из SDK проверяется таким вот образом:Даниленко Сергей писал(а):Если судить по описанию, то регион не стартовал. Посмотрите, пожалуйста, код ошибки, который возвращает функция SetActive.
Код: Выделить всё
// Activate and run region
THROW_FAILED(_region->SetActive(TRUE, TRUE, 0),
_T("Не удалось активировать регион!"));
Код: Выделить всё
inline void ThrowFailed(TCHAR const* Message, HRESULT Result) {
if (FAILED(Result)) throw std::runtime_error((CHAR const*)GetErrorMessage(Message, Result));
}
#define THROW_FAILED(hr, msg) ThrowFailed(msg, hr)
-
- Сообщения: 493
- Зарегистрирован: 04 янв 2004 12:45
- Откуда: СофтЛаб-НСК
-
- Сообщения: 90
- Зарегистрирован: 04 сен 2008 01:50
- Откуда: Красноярск
Код, конечно, не секретный, показать не проблема, но, как я уже говорил, абсолютно этот же код нормально работает на соседнем компьютере, который отличается только версией Forward. Вот я и предположил, что либо дело в версии, либо мы какую-то важную настройку забыли настроитьИгорь Таранцев писал(а): А вообще-то, не могли бы вы прислать письмом куски вашего кода, в которых вы обращаетесь к региону? Было бы проще понять, чем сейчас гадать, что не так.

А код вот такой. Это инициализация:
Код: Выделить всё
STDMETHODIMP CForward::Init()
{
HRESULT hr = S_OK;
try {
//////////////////////////////////////////////////////////////////////////
CKeyEnumerator<ITVCPlugin2> ke(HKEY_LOCAL_MACHINE, _T("Software\\*\\RenderObjects"));
ke.DoEnum(_objects);
THROW_FAILED(_titler.CoCreateInstance(CLSID_SLTitleTarget),
_T("Не удалось создать экземпляр TitleTarget!"));
THROW_FAILED(_titler.QueryInterface(&_surface),
_T("Не удалось получить интерфейс ISLTitleSurface!"));
THROW_FAILED(_titler->ConnectLocalHost(CLSID_SLTMTitleServerTargetMgr, 0),
_T("Не удалось подключить титровальщик к устройству отображения!"));
THROW_FAILED(_titler->GetTargetParams(&_params),
_T("Не удалось получить параметры карты!"));
// create COM-object for application alive checking
CComPtr<IUnknown> holder;
THROW_FAILED(holder.CoCreateInstance(CLSID_SLResourceHolder),
_T("Не удалось создать экземпляр SLResourceHolder!"));
int fifoSize = WIDTH * HEIGHT * 4 * gSett[fd300::OPTI_MAIN_FIFO_SIZE];
CComPtr<IUnknown> unk;
THROW_FAILED(_surface->CreateTitleRectRegion(holder, fifoSize, fifoSize, &unk),
_T("Не удалось создать регион!"));
THROW_FAILED(unk.QueryInterface(&_region),
_T("Не удалось получить интерфейс ISLTitleRegion!"));
CRegionInfo regionInfo = {0};
regionInfo.x0 = XPOS;
regionInfo.y0 = YPOS;
regionInfo.x1 = XPOS + WIDTH;
regionInfo.y1 = YPOS + HEIGHT;
regionInfo.z = gSett[fd300::OPTI_MAIN_ZORDER];
regionInfo.alfa = 255;
regionInfo.ShowLastHalfShot = FALSE;
regionInfo.CurrShot = _currShot = 0;
CSLTitleRegionPlacementFlds flagsSet = (CSLTitleRegionPlacementFlds)(SLTRG_XYPosition | SLTRG_ZOrder |
SLTRG_Alfa | SLTRG_ShowLastHalfShot | SLTRG_CurrShot);
CSLTitleRegionPlacementFlds flagsGet = (CSLTitleRegionPlacementFlds)0;
THROW_FAILED(_region->SetParameters(flagsSet, &flagsGet, ®ionInfo),
_T("Не удалось установить параметры региона!"));
{
CString str;
str.Format(_T("Создан регион с FIFO буфером %d байт для %d кадров"),
fifoSize, (int)gSett[fd300::OPTI_MAIN_FIFO_SIZE]);
_log.WriteLine(str);
}
// Activate and run region
THROW_FAILED(_region->SetActive(TRUE, TRUE, 0),
_T("Не удалось активировать регион!"));
}
catch(std::runtime_error& re) {
_log.WriteLine(re.what());
return E_FAIL;
}
_log.WriteLine(_T("Инициализация прошла успешно."));
return S_OK;
}
Код: Выделить всё
DWORD CForward::Run()
{
_log.WriteLine(_T("CForward::Run"));
HRESULT hr = S_OK;
DWORD sizeRequired = WIDTH * HEIGHT * 4;
int waitTime = gSett[fd300::OPTI_MAIN_FIFO_WAIT];
BYTE* buff = 0;
DWORD size = 0;
int color = 100;
CString str;
while(::WaitForSingleObject(_stopEvent, 1) == WAIT_TIMEOUT) {
try {
// ждем максимум один фрейм для получения буфера
hr = _region->GetShotBuff(sizeRequired, sizeRequired, &buff, &size, 0);
if (hr == S_OK) {
memset(buff, 0x00, sizeRequired); // очищаем весь экран
if (_surfWork != 0) delete _surfWork;
_surfWork = new VSurface(WIDTH, HEIGHT, WIDTH, (DWORD*)buff, VSurface::BOTH_FIELD);
try {
std::vector<CComPtr<ITVCPlugin2>>::const_iterator p = _objects.begin();
while(p != _objects.end()) {
(*p)->RenderRegion(this, true);
p++;
}
}
catch(...) {
throw std::runtime_error("Неизвестное исключение в цикле отрисовки объектов!");
}
// confirm valid image data
CTitleShotInfo shotInfo;
shotInfo.DataType = TitleShotDataType_RGBA;
shotInfo.ShotNumber = _currShot++;
shotInfo.dx = WIDTH;
shotInfo.dy = HEIGHT;
THROW_FAILED(_region->ConfirmShotSize(0, sizeRequired, &shotInfo),
_T("Буфер не прошел валидацию!"));
}
else if (hr == S_FALSE) {
// no free memory at this time
_log.WriteLine(_T("Нет свободной памяти в буфере FIFO"));
Sleep(waitTime);
}
else {
THROW_FAILED(hr, _T("Ошибка при получении свободного буфера кадра!"));
}
}
catch(std::runtime_error& re) {
_log.WriteLine(re.what());
}
}
return 0;
}
-
- Сообщения: 493
- Зарегистрирован: 04 янв 2004 12:45
- Откуда: СофтЛаб-НСК
Вам еще нужно проверять значение flagsGet после вызова метода _region->SetParameters. Оно должно быть равно flagsSet. Возможно, что слой с указанным Z-order уже занят и установить такой-же Z-order не удалось. Но все остальные параметры корректно установились, поэтому ошибки не будет. В этом случае параметр flagsGet не будет иметь битика SLTRG_ZOrder. А регион с нулевым значением Z-order считается служебным и не отображается.
-
- Сообщения: 493
- Зарегистрирован: 04 янв 2004 12:45
- Откуда: СофтЛаб-НСК
Есть одно отличие между старым и новым софтом - выравнивание размеров (границ) до 16 пикселов по горизонтали. Проверьте, что у вас значения XPOS и WIDTH кратны 16.
Кстати, проверка на совпадение flagsSet и flagsGet тоже выявит эту проблему - битик SLTRG_XYPosition не установится в возвращаемом параметре flagsGet.
Кстати, проверка на совпадение flagsSet и flagsGet тоже выявит эту проблему - битик SLTRG_XYPosition не установится в возвращаемом параметре flagsGet.
-
- Сообщения: 90
- Зарегистрирован: 04 сен 2008 01:50
- Откуда: Красноярск
Спасибо за помощь, но проблема "разрешилась" с легкой руки нашего технического директора. Он взял и переустановил софт Forward. Теперь мы, скорее всего, никогда не узнаем в чем был глюк...а жаль.Игорь Таранцев писал(а):Есть одно отличие между старым и новым софтом - выравнивание размеров (границ) до 16 пикселов по горизонтали. Проверьте, что у вас значения XPOS и WIDTH кратны 16.
Кстати, проверка на совпадение flagsSet и flagsGet тоже выявит эту проблему - битик SLTRG_XYPosition не установится в возвращаемом параметре flagsGet.
Еща раз спасибо.
-
- Сообщения: 7093
- Зарегистрирован: 26 фев 2004 09:53
- Откуда: Techsupport SoftLab-NSK