4.6. Программирование в Scenarist Pro
DVD стандарт, кроме возможностей по установке примитивных связей между объектами DVD проекта, разрешает также и программирование действий DVD плеера по воспроизведению DVD-Video диска. Возможности по программированию управления воспроизведением довольно обширны и мы постараемся рассказать о них, пояснив их конкретными примерами. Прежде чем приступить к описанию способов программирования, мы познакомимся с теми объектами, которые используются при программировании.
4.6.1. Системные параметры (регистры)
Задача системных параметров сохранить и сообщить автору состояние DVD плеера в текущий момент времени. Часть системных параметров определяются и устанавливаются DVD плеером, часть просто индикативных и могут быть только прочитаны. Системные параметры обозначаются как SPRM, всего их 24 (три не используются и зарезервированы для возможных будущих применений) и проще и понятнее считать их системными регистрами. Разрядность SPRM регистра 16 бит и, соответственно, максимальное значение регистра может быть 65535 в десятичной системе или FFFFh в шестнадцатиричной. Значения в регистрах SPRM можно просматривать и изменять (конечно, только разрешенные для изменения) во время воспроизведения во вкладке System Params Simulation window. Таблица ниже описывает SPRM регистры:
Номер регистра | Название регистра в Simulation window Scenarist | Наименование | Описание | Доступность по чтению (R) или записи (W) | Значение по умолчанию* |
0 | Menu Disk Lang | Код языка меню | Определяет код языка, используемого в меню | R | Не определено |
1 | Audio | Номер текущего аудио потока | Содержит номер текущего проигрываемого аудио потока | R/W |
000Fh |
2 | Subpicture | Номер текущего потока subpicture | Содержит номер текущего проигрываемого потока subpicture | R/W |
62d |
3 | Angle | Номер камеры (Angle number) | Содержит номер текущего проигрываемого потока angle (камеры) | R/W | 1 |
4 | Title # | Номер тайтла | Содержит номер текущего проигрываемого тайтла | R/W | 1 |
5 | VTS Title # | Номер VTS | Содержит номер текущего проигрываемого VTS | R/W | Равно SPRM 4 |
6 | Title PGC # | Номер PGC с текущим тайтлом | Содержит номер PGC с текущим проигрываемым тайтлом. Если тайтл включает в себя несколько PGC, то содержимое регистра будет меняться во время воспроизведения. | R/W | Не определено |
7 | PTTN | Номер главы или сцены (chapter, Part of Title) | Содержит номер текущей проигрываемой сцены. Номер, естественно, по мере изменения текущей сцены будет также меняться. | R/W | 1 |
8 | Highlight Btn | Номер последней выбранной кнопки меню | Содержит номер последней выбранной кнопки меню | R/W | 1 |
9 | Nav Tmr | Таймер для навигации | Параметр определяет время перехода к проигрыванию PGC, номер которой задается значением в SPRM10. Значение SPRM9 определяется автором и уменьшается каждую секунду текущего воспроизведения на единицу. При переходе к меню или выборе зрителем паузы значение SPRM 9 остается неизменным. SPRM 9 и SPRM 10 могут изменяться только в пределах домена VTS командами навигации. | R/W | 1 |
10 | Nav Tmr PGC # | Номер PGC для перехода по таймеру навигации | R/W
|
Не определено | |
11 | Audio Mix Mode | Режим караоке DVD плеера | Определяет возможности DVD плеера по микшированию аудио каналов для караоке. Если плеер караоке не поддерживает, то параметр игнорируется. | R/W | 0 |
12 | Country Code | Код страны для управления правами родителей | Указывает код страны для возможности запрета родителями просмотра нежелательного видео детьми. | R | Не определено |
13 | Parental Level | Уровень запрета родителями | Определяет уровень запрета, устанавливаемый в соответствии с кодом страны, заданным в SPRM 12 | R/W | Не определено |
14 | Player Config | Конфигурация плеера для просмотра видео | Определяет соотношение сторон кадра и текущий режим показа | R | Не определено |
15 | P-CFG for Audio | Поддержка воспроизведения звука | Определяет возможности плеера по поддержке различных форматов звука, таких как Dolby Digital, MPEG, DTS и т.д. | R | Не определено |
16 | Initial Lang Code | Стартовый код языка для звука | Определяет код языка и его расширение для текущего проигрываемого аудио потока. | R | FFFFh |
17 | Initial Lang Code Ext | Стартовое расширение кода языка для звука | R | 00h | |
18 | INI_LCD for SPST | Стартовый код языка для subpicture | Определяет код языка и его расширение для текущей проигрываемой subpicture. | R | FFFFh |
19 | INI_LCD_EXT for SPST | Стартовое расширение кода языка для subpicture | R | 00h
|
|
20 | Player Region Code | Код региона плеера | Сообщает установленный в плеере код региона. | R | Не определено |
21, 22, 23 | Резерв |
*Примечание: если число в этом столбце заканчивается буквой h, то оно приводится в шестнадцатиричной системе счисления, если буквой d - десятичной, буквой b - двоичной.
4.6.2. Общие параметры (регистры общего назначения)
Регистры общего назначения (GPRM) отличаются от системных (SPRM) тем, что они находятся в полной власти автора диска и он волен проделывать с ними любые допустимые операции. Разрядность GPRM регистра 16 бит и, соответственно, максимальное значение регистра может быть 65535 в десятичной системе или FFFFh в шестнадцатиричной. Значения в регистрах GPRM можно просматривать и изменять во время воспроизведения во вкладке General Params Simulation window. Всего этих регистров 16 и над ними допускаются следующие операции (выполняются по команде Set):
-
Assign (Присвоение) - присвоение регистру любого числового значения в диапазоне от 0 до 65535, а также значения, находящегося в любом другом GPRM или SPRM регистре.
-
Exchange (Обмен) - обмен содержимого одного GPRM регистра с другим GPRM регистром.
-
Add (Сложить) - прибавление к содержимому GPRM регистра числа или содержимого другого регистра или сложение значений в двух GPRM регистрах.
-
Subtract (Вычитание) - вычитание числа из содержимого GPRM регистра, вычитание из содержимого одного регистра содержимого другого.
-
Multiplay (Умножение) - умножение числа на содержимое GPRM регистра или умножение содержимого двух GPRM регистров.
-
Divide (Деление) - деление содержимого GPRM регистра на число или деление содержимого одного GPRM регистра на другой и запись частного от деления, которое не может быть равно нулю.
-
Remainder (Остаток) - запись остатка от деления числа на значение GPRM регистра или остатка от деления одного регистра GPRM на другой.
-
Random Value (Случайное значение) - присвоение GPRM регистру случайно выбранного числа, которое не может быть равно нулю.
-
Bitwise Product (Побитовое умножение) - присвоение GPRM регистру результата побитовой операции AND (И) одного GPRM регистра с другим, числа с GPRM регистром, регистра GPRM с SPRM и т.д.
-
Bitwise Sum (Побитовое сложение) - присвоение GPRM регистру результата побитовой операции OR (ИЛИ) одного GPRM регистра с другим, числа с GPRM регистром, регистра GPRM с SPRM и т.д.
-
Exclusive OR (Исключающее ИЛИ) - присвоение GPRM регистру результата побитовой операции Exclusive OR (Исключающее ИЛИ) одного GPRM регистра с другим, числа с GPRM регистром, регистра GPRM с SPRM и т.д.
Собственно говоря, все действия автора по соединению между собой объектов DVD проекта преобразуются программой Scenarist в различные команды. Но кроме автоматически формируемых команд, существует множество команд, которые автор может добавить только вручную. "Прикрепить" команды можно только к таким объектам в PGC:
-
Pre - команды будут выполняться ДО воспроизведения PGC. На один Pre можно "повесить" до 128 команд.
-
Post - команды будут выполняться ПОСЛЕ воспроизведения PGC. На один Post можно "повесить" до 128 команд.
-
Cell - команда будет выполняться после воспроизведения ячейки (Cell) PGC. На одну Cell можно формально "повесить" до 128 команд, но выполнится только первая из них. Если в PGC только одна Cell, то команда в Cell будет выполнена раньше команды (команд) в Post. Команды на Cell рекомендуется назначать только в случае невозможности какого-либо иного пути, поскольку это приведет в большинстве случаев к заметной на глаз задержке при воспроизведении фильма и флаг SM Cell с командой автоматически изменится на NSM.
-
Btns - в этом месте изначально можно "повесить" только команды перехода, которые потом, впрочем, можно изменить. Но добавить какие-либо команды в Simulation Window или еще каким-либо способом нельзя.
4.6.3.1. Команды безусловного перехода (Jump)
Команды перехода (Jump) применяются автором чаще других и чаще всего сам автор об этом и не подозревает, поскольку именно в команды Jump преобразуются большинство действия автора по соединению объектов фильма связями. Команды Jump могут быть такими:
-
Jump to PGC (Переход к PGC) - соединяет меню или тайтл с другим меню или тайтлом внутри одного VTS.
-
Jump to Program (Переход к Program в PGC) - соединяет меню или тайтл с chapter (сценой, главой) внутри одной PGC.
-
Jump to Cell (Переход к ячейке) - соединяет меню или тайтл с ячейкой (Cell) внутри одной PGC.
-
Jump by Sub-Instructions (Переход с выполнением дополнительной операции) - с помощью этой команды можно решить много задач, но самым популярным применением команды является возврат из меню в то же место фильма, откуда выполнялся переход в меню - Jump by Sub-Instructions/Resume. Также может использоваться для изменения содержимого регистра SPRM 8 изменением номера текущей выделяемой кнопки.
-
Jump to Title (Переход к тайтлу) - соединяет меню или тайтл с любым тайтлом внутри одного VTS.
-
Jump to Part of Title (Переход к главе(сцене) - соединяет тайтл с главой (сценой) внутри того же тайтла. Не может быть использована в Pre.
-
Jump to Part of Title in VTS (Переход к главе(сцене) внутри VTS) - соединяет тайтл с любой главой (сценой) в любом тайтле внутри VTS. Может быть использована в Pre.
-
Jump to PGC in System Space (Переход к PGC в проекте) - соединяет тайтл или меню с другим тайтлом или меню в проекте. Необходима для соединения компонентов проекта из разных VTS или, например, для соединений из Video Manager в VTS.
4.6.3.2. Группы и типы команд
4.6.3.2.1. Группы команд
Группа | Какие основные задачи решают команды группы | Могут быть объединены с командами из групп |
Link (Соединить) | Старт видео в текущем домене | Set, Compare и SetSystem |
Jump | Старт видео в указанном домене | Compare |
GoTo | Переход к другой команде навигации | Compare |
Compare | Сравнивает указанные параметры | Jump, GoTo, Set, Link и SetSystem |
SetSystem | Устанавливает навигационные параметры | Link и Compare |
Set | Задает значения GPRM | Link и Compare |
Всего существуют три типа команд согласно DVD стандарту. Это:
-
Первый тип (Type 1) - команды этого типа всегда состоят только из одной инструкции.
-
Второй тип (Type 2) - команды этого типа состоят из 2-х инструкций.
-
Третий тип (Type 3) - команды этого типа включают в себя команды из групп Compare, Set и Link to SubInstruction и тем самым состоят из трех инструкций.
Правила использования команд различных типов сведены в таблицу:
Команда | Тип | Описание | Количество инструкций в команде |
GoTo | 1 | Меняет порядок выполнения инструкций | 1 |
Link | 1 | Начинает выполнение указанного действия внутри домена (включая выделение кнопки) | 1 |
Jump | 1 | То же самое, что и Link, но в другом домене | 1 |
Compare GoTo | 1 | Если результат сравнения истина (true), то выполнение команды GoTo | 1 |
Compare Link | 1 | Если результат сравнения истина (true), то выполнение команды Link | 1 |
Compare Jump | 1 | Если результат сравнения истина (true), то выполнение команды Jump | 1 |
SetSystem | 2 | Установка навигационных параметров (регистров) GPRM и SPRM | 2 |
Set | 2 | Установка GPRM | 2 |
Compare SetSystem | 2 | Если результат сравнения истина (true), то выполнение команды SetSystem | 2 |
Compare Set | Если результат сравнения истина (true), то выполнение команды Set | 2 | |
SetSystem Link | 2 | Сначала выполнение команды SetSystem, затем Link | 2 |
Set Link | 2 | Сначала выполнение команды Set, затем Link | 2 |
Set Compare LinkSIns | 3 | Сначала выполняется команда Set, затем, если результат сравнения по команде Compare истина (true), то переход к выполнению команды LinkSIns | 3 |
Compare & Set - LinkSIns | 3 | Сначала выполняется команда сравнения Compare и, если результат сравнения истина (true), то затем последовательно выполняются команды Set и LinkSIns | 3 |
Compare - Set & LinkSIns | 3 | Сначала выполняется команда сравнения Compare и, если результат сравнения истина (true), то затем последовательно выполняются команды Set и LinkSIns, причем LinkSIbs в этом случае игнорирует результат сравнения | 3 |
Для того, чтобы дальнейшая работа с командами в Scenarist была более понятной, позволим себе напомнить некоторые азы булевой алгебры, без которых освоение программирования в Scenarist будет затруднено. Итак, для начала рассмотрим операцию AND (И), которая в Scenarist (и не только в нем, конечно) также обозначается символом &. Эта операция также может называться логическим умножением. Scenarist всегда подразумевает, что данные в регистрах будут сравниваться побитово. Операция AND для каждого бита выполняется следующим образом:
-
0 & 0 = 0 (False - ложь)
-
0 & 1 = 0 (False - ложь)
-
1 & 0 = 0 (False - ложь)
-
1 & 1 = 1 (True - истина)
Поясним это на примере. Допустим, вы хотите сравнить значения по AND в двух регистрах. В одном из них десятичное число 25 (оно же двоичное 00011010, оно же шестнадцатиричное 1A) с другим, в котором содержится десятичное число 9 (оно же двоичное 00001001, оно же шестнадцатиричное 09). Результат будет таким:
00011010
00001001
-------------
00001000 = True (Истина) Результат оказался true, поскольку одна единица появилась в результате. В противном случае результат был бы False (Ложь). Расшифровка обозначений операций сравнения в Scenarist приведена в таблице ниже:
& | Логическое AND (И). Результат будет true (истина), если в нем есть хотя бы одна единица. В противном случае он будет равен false (ложь). Если результат true, то будет выполнена следующая команда. |
== | Если сравниваемые значения РАВНЫ, то команда будет выполнена. |
!= | Если сравниваемые значения НЕ РАВНЫ, то команда будет выполнена. |
>= | Если результат РАВЕН или БОЛЬШЕ, то команда будет выполнена. |
> | Если результат БОЛЬШЕ, то команда будет выполнена. |
<= td=""> | Если результат РАВЕН или МЕНЬШЕ, то команда будет выполнена. |
< | Если результат БОЛЬШЕ, то команда будет выполнена. |
Теперь настало время перейти к практическим примерам, поясняющим программирование в Scenarist.