Codigo fuente
ratDVD fue diseñado más como una tecnología que como un programa - encontraras que todo esta construido sobre un sistema de clases agradable y por eso animo a cada uno a usarlo en sus propios programas - no comercialmente.
Debajo, algunas secciones son proporcionadas en código fuente - otras no. Probablemente lanzare mas en codigo abierto cuando el tiempo me lo permita ;-)
La interfaz de usuario que proporciono es realmente solo una pequeña porcion de código que esta por encima de todo y que puede ser facilmente modificada. Mientras deseo que mi interfaz satisfaga las necesidades de muchas personas, estoy seguro que otra y mejor interfaz puede ser creada - ¡que lo disfruten!
Esta página contiene las siguientes secciones:
- Usando la aplicación de transcodificación de ratDVD de otros programas.
- Integración de la reproducción de ratDVD en otros programas.
- Plug-Ins de ratDVD
- Plug-In de Importación
- Plug-In de E/S: ejemplo y código fuente.
- Plug-In para ficheros de imagenes ISO: ejemplo y código fuente.
- Plug-In de Exportación
- Plug-In de E/S: ejemplo y código fuente.
- Plug-In de Navigación
- Plug-In de navegación Libdvdnav: ejemplo y código fuente.
- Plug-In de Etiquetado
- Plug-In de etiquetado Imdbexport: ejemplo y código fuente.
- Plug-In de Importación
- Compartir datos analizados en un DVD
Mecanismo de conversión mediante parámetros en línea de comandos de ratDVD
El la aplicación de codificación de ratDVD soporta los siguientes parámetros en línea de comandos:
| /srcimage <filename> | En "filename" debe ir el archivo VIDEO_TS.IFO si lo que quieres es crear un archivo .ratDVD o bien el nombre del archivo .ratDVD si lo que quieres es restaurar un DVD desde el .ratDVD. |
| /dstimage <filename> | Si lo que quieres es crear un archivo .ratDVD especifica el nombre del archivo de destino con este parametro. |
| /dstfolder <path> | Si lo que quieres es convertir un .ratDVD a una carpeta con archivos compatibles DVD-VIDEO especifica la carpeta aqui. Esta carpeta sera creada en caso de no existir. Atención: en caso de un error esta carpeta sera vaciada asi que seria recomendable seleccionar una nueva carpeta. |
| /smartfilename | Esta opción aconseja a la aplicación de codificación que extienda el nombre de archivo especificado, de acuerdo al nombramiento de estilos de ratDVD |
| /ignorediscdata | Si esta opción es especificada, la aplicación de codificación no conectará con el servidor de ratDVD para obtener el analisis de datos y en vez de esto siempre analizará el DVD de nuevo si el formato de destino es XA. Tener en cuenta que el analisis local de los datos, no es exactamente como el analisis de datos del servidor ratDVD. |
| /dstfmt | Puedes suar esta opción para especificar el codificador de video y el modo de codificación usado. XC es "XEB de calidad constante " y XA significa "XEB de bibrate de media constante ". |
| /dstquality | Esta opción seleccina la calidad basandose en la opción "/dstfmt". Si el formato de destino es seleccionado a "XC" (por defecto) este valor especifica el nivel de calidad como se muestra en barra de la UI (de 50 a 120). Si el formato de destino es "XA", este valor especifica el bibrate de video en KBit/s (de 500 KBit/s a 2000 KBit/s). |
| /profile | Usa esta opción para especificar el perfil a usar para esta conversión. |
| /autostart | La conversion comenzara de inmediato. Una vez terminada el programa se cerrara. |
| /burn | Abre la ventana de grabación cuando empieza el programa. Solo tiene sentido si otra opción como el origen o el destino ha sido especificado. |
Seguimiento del progreso de conversión de otros programas
Cuando tu integras la conversión de ratDVD en tu propio programa, tiene sentido seguir el progreso del proceso de ratting o unratting. El transcodificador de ratDVD posibilita esto enviando una ventana de mensaje "XEBKeepAlive" para todos los porcentajes completados del proceso.
A continuación, un pequeño ejemplo en C# sobre como obtener este mensaje. Primero el código del constructor:
| //Creamos una ventana basada en el nombre conocido y creamos el puntero //Podemos comenzar escuchando las ventanas de mensajes. CreateParams Params = new CreateParams(); this.CreateHandle(Params); //Registramos el progreso del mensaje _ProgressMessage = RegisterWindowMessage("XEBKeepAlive"); |
Y el código del puntero puede verse de esta forma:
[DllImport("user32.dll")] |
Es importante notar que el porcentage esta localizado por encima de los 16 bit de WParam, Por lo tanto necesitas hacerlo en orden para obtener el porcentage actual.
Integración de la reproducción de ratDVD en otros programas.
Si estas familiarizado con la programación de DirectShow y quieres integrar la reproduccion .ratDVD en tu reproductor, puedes usar este paquete de tres filtros DirectShow de navegación y decodificadores.
Básicamente estos tres filtros construyen el gráfico que necesita ratDVD para reproducir. El xebnavigation.ax sirve como el filtro de origen para el fichero .ratDVD. El filtro de video tiene que conectarse a los conectores de salida de video y subtitulos del filtro de navegación, mientras que el decodificador de audio debe conectarse al conector de salida de audio. Los renderizadores de audio y video luego se conectan al correspondiente conector de salida del decodificador.
El xebnavigation.ax es un "reemplazo" para el filtro Microsoft DVD Navigator. Reemplazo significa, que reproducir un archivo ratDVD es identico a reproducir un DVD usando el filtro MS Navigator. Si tu construyes una aplicación que permita reproducir DVD, tu puedes reemplazar el GUID del MS DVD Navigator con el GUID del xebnavigation.ax para reproducir .ratDVD en tu aplicación.
Ejemplo de implementación para reproducir ratDVD en Media Player Classic
Media Player Classic es un famoso media player de código abierto. Puedes encontrar el código aquí.
A continuación os mostraré como de fácil es integrar la reproducción de ratDVD en este reproductor. Puedes descargar el binario compilado desde la web oficial de Media Player classic.
Media Player Classic soporta la reproducción de DVD así que solo con hacer que detecte el fichero ratDVD, debería de reproducir y usar el navegador de ratDVD instanciado del navegador de DVD. Ver el código siguiente (los cambios en el código original están en color rojo).
[uuid("482d10b6-376e-4411-8a17-833800A065DB")] class ratDVDNavigator {}; HRESULT CGraphBuilderDVD::Render(CString fn, CString& path) //comprueba si la extensión es .ratdvd //creado el filtro de origen (…) //obtener el interfaz e navegación //no se necesita restaurar esto para el .ratdvd (…) El siguiente paso era añadir la extensión .ratdvd a la lista de extensiones para que los métodos de renderización de DVD sean llamados (PlayerPlayListBar.cpp Line 594): (…) CPlaylistItem pli; (…) Finalmente añadimos la extensión .ratdvd a la lista de extensiones conocidas (MediaFormats.cpp Line 204): (…) ADDFMT((_T("ratdvd file"), _T("ratdvd"), false, _T("ratdvd media file"))); (…) |
Para más información sobre la reproducción de DVD/ratDVD con el filtro de navegación, mirar esta documentación de MSDN.
| ratDVD_filter.zip | Descargar |
Plug-Ins de ratDVD
ratDVD usa una arquitectura flexible de plug-ins que hacen seguro que pueda ser extendido sin tener que ocuparse de una arquitectura interna mucho más compleja. Todos los Plug-ins son diseñados con un interfaz COM que son muchso más independientes del lenguage de programación usado.
Plug-In de importación
Descripción del Plug-In de importación
El convertidor ratDVD usa plugins externos para tener acceso al material de la fuente. Actualmente ratDVD soporta solo la apertura de archivos en una carpeta VIDEO_TS. La creación de plugins adicionales permitiría a ratDVD abrir toda clase del material diferente como imágenes de ISO, toda clase de medios ópticos, etc.
Descripción de la arquitectura
Tienes que implementar una clase de tipo COM que abstraiga la lectura y la escritura a un contenedor cuya clase debe soportar el interfaz IFileContainer. Puedes encontrar la defiunición del interfaz en el directorio Intf.
UsoPara poder hacer tu clase contenedor manejable por ratDVD, tienes que registrar tu objeto COM en windows. Después, puedes crear un archivo llamado FileAccess.ini en tu directorio de ratDVD. Un ejemplo del archivo puede ser:
[read] [ReadDescription] |
Si tu quieres escribir un contenedor que pueda leer de los archivos .iso, simplemente coloca el identificador de la clase despues de "iso= extension" en la sección [read] de tu archivo .ini
Pruebas
Como depurar los errores con el XEBEncoder.exe puede ser muy largo, se ha incluido un programa de pruebas en este archivo: "FCTest.exe". El código fuente en Delphi de este programa también está incluido. El programa también leerá el FileAccess.ini si existe en algún directorio como el ejecutable. Esto debería depurar los errores de tu contenedor más facilmente.
Interfaces
A continuación se describirá en significado de varias funciones de FileContainer y ContainerFile:
IFileContainer
| HRESULT Add(BSTR AFileName, IContainerFile **AContainerFile) | |
| Crea un nuevo archivo en el contenedor y debe devolver un puntero al nuevo fichero.Creates a new file in the container and must return a pointer to the new file. Será llamado como Add("VIDEO_TS\VIDEO_TS.IFO", NewFile) | |
| HRESULT Delete() | |
| Borra todo el contenedor y será llamado en caso de error o si el usuario cancela. | |
| HRESULT FindFile(BSTR AFileName, IContainerFile **AContainerFile) | |
| Devuelve el archivo dado en una ruta determinada y devolverá un puntero anulo si el fichero no es encontrado. | |
| HRESULT get_Count(long *Value) | |
| Devuelve cuantos ficheros hay en el contenedor. | |
| HRESULT get_Files(long Index, IContainerFile **Value) | |
| Devuelve el archivo especificado por index. Index esta referenciado en el cero. | |
| HRESULT get_ReadOnly(BOOL *Value) | |
| Devuelve si el contenedor ha sido abierto para solo lectura o para escritura. | |
| HRESULT Open(BSTR AFileName, BOOL AReadOnly) | |
| Será llamado después de la creación de un objeto contenedor para abrir un archivo o un directorio. | |
IContainerFile
| HRESULT Delete() | |
| Borra este archivo del contenedor. | |
| HRESULT get_BaseName(BSTR *Value) | |
| Devuelve el nombre del fichero sin la ruta. Un archivo llamado "VIDEO_TS\VIDEO_TS.IFO" debería devolver "VIDEO_TS.IFO". | |
| HRESULT get_Name(BSTR *Value) | |
| Devuelve la ruta del contenedor. | |
| HRESULT get_Size(__int64 *Value) | |
| Devuelve el tamaño del archivo. | |
| HRESULT Open(IStream **Stream) | |
| Esta función devuelve un interfaz IStream. Se usará para leer cuando el contenedor is abierto en modo de solo lectura y se isará para escribir en caso contrario. | |
Descargar relacionadas
| Definición de las interfaces .idl, .h y .pas | Descargar |
| Código de fuente del plug-In de entrada-salida de la carpeta usada por ratDVD | Descargar |
| Código fuente del Plug-In de lectura de imagenes ISO usado por ratDVD desde la versión 0.76 | Descargar |
| Un programa en Delphi para testear la clase del contenedor (hace el testeo mucho más fácil que con el ratDVD) | Descargar |
Plug-In de exportación
Descripción del Plug-In de exportación
Los plugins de exportación pueden ser usados para recibir las señales codificadas, la información estructural y de navegación y transformar toods estos datos en un formato soportado por el plugin.
Actualmente sólo la salida a archivo/carpeta y (si Nero esta instalado) la salida a una imagen ISO y DVD es posible. Usando este plugin son posibles toda clase de destinos como por ej. imágenes, FTP o incluso la codificacion a formatos distintos como MPEG-4 o DivX 6 puede ser posible.
Descripción de la arquitectura
Tienes que implementar una clase de tipo COM que abstraiga la lectura y la escritura a un contenedor cuya clase debe soportar el interfaz IFileContainer. Puedes encontrar la defiunición del interfaz en el directorio Intf.
UsoPara poder hacer tu clase contenedor manejable por ratDVD, tienes que registrar tu objeto COM en windows. Después, puedes crear un archivo llamado FileAccess.ini en tu directorio de ratDVD. Un ejemplo del archivo puede ser:
| [write] .ratDVD={B10022ED-6E5B-45F4-8F1D-B25FB257C64E} .iso={??????-?????????-??????????-????????-???????} |
Si tu quieres escribir un contenedor que pueda escribir de los archivos .iso, simplemente coloca el identificador de la clase despues de "iso= extension" en la sección [write] de tu archivo .ini
Pruebas
Como depurar los errores con el XEBEncoder.exe puede ser muy largo, se ha incluido un programa de pruebas en este archivo: "FCTest.exe". El código fuente en Delphi de este programa también está incluido. El programa también leerá el FileAccess.ini si existe en algún directorio como el ejecutable. Esto debería depurar los errores de tu contenedor más facilmente.
Interfaces
A continuación se describirá en significado de varias funciones de FileContainer y ContainerFile:
IFileContainer
| HRESULT Add(BSTR AFileName, IContainerFile **AContainerFile) | |
| Crea un nuevo archivo en el contenedor y debe devolver un puntero al nuevo fichero.Creates a new file in the container and must return a pointer to the new file. Será llamado como Add("VIDEO_TS\VIDEO_TS.IFO", NewFile) | |
| HRESULT Delete() | |
| Borra todo el contenedor y será llamado en caso de error o si el usuario cancela. | |
| HRESULT FindFile(BSTR AFileName, IContainerFile **AContainerFile) | |
| Devuelve el archivo dado en una ruta determinada y devolverá un puntero anulo si el fichero no es encontrado. | |
| HRESULT get_Count(long *Value) | |
| Devuelve cuantos ficheros hay en el contenedor. | |
| HRESULT get_Files(long Index, IContainerFile **Value) | |
| Devuelve el archivo especificado por index. Index esta referenciado en el cero. | |
| HRESULT get_ReadOnly(BOOL *Value) | |
| Devuelve si el contenedor ha sido abierto para solo lectura o para escritura. | |
| HRESULT Open(BSTR AFileName, BOOL AReadOnly) | |
| Será llamado después de la creación de un objeto contenedor para abrir un archivo o un directorio. | |
IContainerFile
| HRESULT Delete() | |
| Borra este archivo del contenedor. | |
| HRESULT get_BaseName(BSTR *Value) | |
| Devuelve el nombre del fichero sin la ruta. Un archivo llamado "VIDEO_TS\VIDEO_TS.IFO" debería devolver "VIDEO_TS.IFO". | |
| HRESULT get_Name(BSTR *Value) | |
| Devuelve la ruta del contenedor. | |
| HRESULT get_Size(__int64 *Value) | |
| Devuelve el tamaño del archivo. | |
| HRESULT Open(IStream **Stream) | |
| Esta función devuelve un interfaz IStream. Se usará para leer cuando el contenedor is abierto en modo de solo lectura y se isará para escribir en caso contrario. | |
Descargar relacionadas
| Definición de las interfaces .idl, .h y .pas | Descargar |
| Un ejemplo de directorioas de entrada/salida (actualmente usado por ratDVD para escribir/leer de/a directorios) | Descargar |
| Un programa en Delphi para testear la clase del contenedor (hace el testeo mucho más fácil que con el ratDVD) | Descargar |
Plug-In de navegación
El filtro intermedio del origen del formato del ratDVD puede utilizar la información de la navegación de un Plug-In COM de navegación para realizar acciones especiales a ciertos medios (generalmente ratDVD) durante la ejecución.
Descripción de la arquitectura
El plug-in tiene que estar fuera del servidor de procesos COM y debe implementarse el interfaz IDVDNav tal y como se indica a conticuación:
| HRESULT Open([in] BSTR path) | |
| Abre un archivo especificado en la variable path. | |
| HRESULT Close(void) | |
| Cierra el archivo abierto. | |
| HRESULT Reset(void) | |
| Resetea la navegación a la posición cero. | |
| HRESULT Path([out] BSTR* path) | |
| Devuelve la ruta del archivo abierto actualmente. Será nulo si no hay ninguno abierto actualmente. | |
| HRESULT Err_To_String([out] BSTR* error) | |
| Devuelve una cadena con la descripción del último error ocurrido. | |
| HRESULT Set_Region_Mask([in] LONG mask) | |
| Selecciona la máscara de la región del DVD a reproducir. El rango de valores válidos esta entre 0 y 9. | |
| HRESULT Get_Region_Mask([out] LONG* mask) | |
| Obtiene la máscara de la región del DVD a reproducir. | |
| HRESULT Set_Readahead_Flag([in] LONG flag) | |
| 1: REaliza un readahead 0: No realiza un readahead. | |
| HRESULT Get_Readahead_Flag([out] LONG* flag) | |
| Devuelve el valor actual del readahead. | |
| HRESULT Set_PGC_Positioning_Flag([in] LONG flag) | |
| Selecciona la bandera de posicionamiento pgc. Esta bandera determina si la busqueda es programada o programada basada en una cadena. | |
| HRESULT Get_PGC_Positioning_Flag([out] LONG* flag) | |
| Obtiene la bandera de posicionamiento pgc. Esta bandera determina si la busqueda es programada o programada basada en una cadena. | |
| HRESULT Get_Next_Block([in,out] VARIANT* buf, [in,out] LONG* event, [in,out] LONG* len, [in,out] __int64* value1, [in,out] __int64* value2, [in,out] __int64* value3, [in,out] __int64* value4, [in,out] __int64* value5, [in,out] __int64* value6, [in,out] __int64* value7, [in,out] __int64* value8) |
|
| Obtiene el proximo bloque del Plug-In de navegación.
buf almacena el siguiente buffer de lectura de un archivo. len almacena el tamaño del buffer. event puede ser uno de los siguientes valores: 0: es un bloque normal de datos 1: no es necesaria ninguna operación 2: estamos en un frame fijo value1 almacena la longitus del actual frame fijo 3: el stream de subtitulo actual a cambiado value1 almacena el valor del stream físico para widescreen value2 almacena el valor del stream físico para letterbox value3 almacena el valor del stream físico para pan-scan value4 almacena el valor del stream lógico 4: el actual stream de audio ha cambiado value1 = ((dvdnav_audio_stream_change_event_t*)buffer)->physical; value2 = ((dvdnav_audio_stream_change_event_t*)buffer)->logical; 5: el videotitle set ha cambiado value1 = ((dvdnav_vts_change_event_t*)buffer)->old_vtsN; value2 = ((dvdnav_vts_change_event_t*)buffer)->old_domain; value3 = ((dvdnav_vts_change_event_t*)buffer)->new_vtsN; value4 = ((dvdnav_vts_change_event_t*)buffer)->new_domain; 6: introducimos una nueva celda value1 = ((dvdnav_cell_change_event_t*)buffer)->cellN; value2 = ((dvdnav_cell_change_event_t*)buffer)->pgN; value3 = ((dvdnav_cell_change_event_t*)buffer)->cell_length; value4 = ((dvdnav_cell_change_event_t*)buffer)->pg_length; value5 = ((dvdnav_cell_change_event_t*)buffer)->pgc_length; value6 = ((dvdnav_cell_change_event_t*)buffer)->cell_start; value7 = ((dvdnav_cell_change_event_t*)buffer)->pg_start; 7: bloque que contiene un paquete de navegación 8: parar la reproducción 9: nueva información del tono de luz value1 = ((dvdnav_highlight_event_t*)buffer)->display; value2 = ((dvdnav_highlight_event_t*)buffer)->palette; value3 = ((dvdnav_highlight_event_t*)buffer)->sx; value4 = ((dvdnav_highlight_event_t*)buffer)->sy; value5 = ((dvdnav_highlight_event_t*)buffer)->ex; value6 = ((dvdnav_highlight_event_t*)buffer)->ey; value7 = ((dvdnav_highlight_event_t*)buffer)->pts; 10: el color en la table de búsqueda a cambiado 12: la navegación causa una "nonseamless branch" 13: espera a tener la navegación de nuevo sincronizada |
|
| HRESULT Get_Next_Cache_Block([in,out] BSTR* buf, [in,out] LONG* event, [in,out] LONG* len, [in,out] __int64* value1, [in,out] __int64* value2, [in,out] __int64* value3, [in,out] __int64* value4, [in,out] __int64* value5, [in,out] __int64* value6, [in,out] __int64* value7, [in,out] __int64* value8) |
|
| Obtiene el proximo bloque del
Plug-In de navegación en un buffer de caché. buf almacena el buffer actual leido de un archivo. len almacena el tamaño del buffer. event puede ser uno de los siguientes valores : 0: es un bloque normal de datos 1: no es necesaria ninguna operación 2: estamos en un frame fijo value1 almacena la longitus del actual frame fijo 3: el stream de subtitulo actual ha cambiado value1 almacena el valor del stream físico para widescreen value2 almacena el valor del stream físico para letterbox value3 almacena el valor del stream físico para pan-scan value4 almacena el valor del stream lógico 4: el actual stream de audio ha cambiado value1 = ((dvdnav_audio_stream_change_event_t*)buffer)->physical; value2 = ((dvdnav_audio_stream_change_event_t*)buffer)->logical; 5: el videotitle set ha cambiado value1 = ((dvdnav_vts_change_event_t*)buffer)->old_vtsN; value2 = ((dvdnav_vts_change_event_t*)buffer)->old_domain; value3 = ((dvdnav_vts_change_event_t*)buffer)->new_vtsN; value4 = ((dvdnav_vts_change_event_t*)buffer)->new_domain; 6: se ha introducido una nueva celda value1 = ((dvdnav_cell_change_event_t*)buffer)->cellN; value2 = ((dvdnav_cell_change_event_t*)buffer)->pgN; value3 = ((dvdnav_cell_change_event_t*)buffer)->cell_length; value4 = ((dvdnav_cell_change_event_t*)buffer)->pg_length; value5 = ((dvdnav_cell_change_event_t*)buffer)->pgc_length; value6 = ((dvdnav_cell_change_event_t*)buffer)->cell_start; value7 = ((dvdnav_cell_change_event_t*)buffer)->pg_start; 7: bloque que contiene un paquete de navegación 8: parar la reproducción 9: nueva información del tono de luz value1 = ((dvdnav_highlight_event_t*)buffer)->display; value2 = ((dvdnav_highlight_event_t*)buffer)->palette; value3 = ((dvdnav_highlight_event_t*)buffer)->sx; value4 = ((dvdnav_highlight_event_t*)buffer)->sy; value5 = ((dvdnav_highlight_event_t*)buffer)->ex; value6 = ((dvdnav_highlight_event_t*)buffer)->ey; value7 = ((dvdnav_highlight_event_t*)buffer)->pts; 10: el color en la table de búsqueda a cambiado 12: la navegación causa una "nonseamless branch" 13: espera a tener la navegación de nuevo sincronizada |
|
| HRESULT Free_Cache_Block([in,out] UCHAR* buf) | |
| Libera el último bloque de caché indicado por Get_Next_Cache_Block | |
| HRESULT Still_Skip(void) | |
| Mantiene el actual frame fijo | |
| HRESULT Wait_Skip(void) | |
| Mantiene el actual estado de espera | |
| HRESULT Get_Next_Still_Flag([in,out] LONG* flag) | |
| Determina si estamos en un frame fijo | |
| HRESULT Stop(void) | |
| Detiene la reproducción | |
| HRESULT Get_Number_Of_Titles([in,out] LONG* titles) | |
| Obtiene la cantidad actual de títulos presentas en el DVD/ratDVD | |
| HRESULT Get_Number_Of_Parts([in] LONG title, [in,out] LONG* parts) | |
| Determina el número departes del título dado. | |
| HRESULT Title_Play([in] LONG title) | |
| Comienza la reproducción del primer capítulo del título dado. | |
| HRESULT Part_Play([in] LONG title, [in] LONG part) | |
| Comienza la reproducción de un capítulo dado de un título dado. | |
| HRESULT Part_Play_Auto_Stop([in] LONG title, [in] LONG part, [in] LONG parts_to_play) | |
| Comienza la reproducción de un capítulo dado de un título determinado y reproduce el número de capítulos dado por parts_to_play | |
| HRESULT Time_Play([in] LONG title, [in] LONGLONG time) | |
| Reproduce un título dado por una cantidad de tiempo indicado en time | |
| HRESULT Menu_Call([in] LONG menu) | |
| Detiene la reproducción en curso y salta al menú indicado | |
| HRESULT Current_Title_Info([in,out] LONG* title, [in,out] LONG* part) | |
| Obtiene el título actual de reproducción y la parte | |
| HRESULT Get_Position_In_Title([in,out] LONG* pos, [in,out] LONG* len) | |
| Obtiene la posición y la longitus del título actual en señales PTS. | |
| HRESULT Part_Search([in] LONG part) | |
| Comienza la reproducción de una parte dada en el primer título si es encontrada. | |
| HRESULT Sector_Search([in] LONGLONG offset, [in] LONG origin) | |
| Comenzar reproducción en un sector determinado. la busqueda dependerá de la bandera PGC_positioning. Basándose en PGC: busca en la cadena de programa actual. Basándose en PG: busca solo en el programa actual. | |
| HRESULT Time_Search([in] LONGLONG time) | |
| Comienza la reproducción en un tiempo dado. la busqueda dependerá de la bandera PGC_positioning. Basándose en PGC: busca en la cadena de programa actual. Basándose en PG: busca solo en el programa actual. | |
| HRESULT Go_Up(void) | |
| Comienza la reproducción en la cadena de programa "GoUp" (usualmente significa título o nivel superior del menú) | |
| HRESULT Prev_Pg_Search(void) | |
| Start playback at the previous program | |
| HRESULT Top_Pg_Search(void) | |
| Comienza la reproducción en el programa padre. | |
| HRESULT Next_Pg_Search(void) | |
| Comienza la reproducción en el próximo programa. | |
| HRESULT Get_Position([in,out] LONG* pos, [in,out] LONG* len) | |
| Obtiene la actual posición y longitud del título actual. | |
| HRESULT Get_Current_Highlight([in,out] LONG* button) | |
| Obtiene el actual tono de luz. | |
| HRESULT Get_Highlight_Area([in] LONG button, [in] LONG mode, [in,out] int* palette, [in,out] short* startx, [in,out] short* starty, [in,out] short* endx, [in,out] short* endy, [in,out] int* startpts, [in,out] int* endpts, [in,out] int* cbutton) |
|
| Obtiene el area del "highlight" | |
| HRESULT Upper_Button_Select() | |
| Selecciona el botón superior relativo. | |
| HRESULT Lower_Button_Select() | |
| Selecciona el botón inferior relativo | |
| HRESULT Left_Button_Select() | |
| Selecciona el botón izquierdo relativo | |
| HRESULT Right_Button_Select() | |
| Selecciona el botón derecho relativo | |
| HRESULT Button_Activate() | |
| Activa el botón seleccionado | |
| HRESULT Button_Select([in] LONG button) | |
| Selecciona el botón indicado | |
| HRESULT Button_Select_And_Activate([in] LONG button) | |
| Selecciona y activa el botón indicado | |
| HRESULT Button_Activate_Cmd([in] LONG button, [in] __int64* cmd) | |
| Activa el botón indicado y el proceso indicado | |
| HRESULT Mouse_Select([in] LONG x, [in] LONG y) | |
| Selecciona el botón en la posición x/y | |
| HRESULT Mouse_Activate([in] LONG x, [in] LONG y) | |
| Activa el botón en la posición x/y | |
| HRESULT Menu_Language_Select([in] CHAR* code) | |
| Selecciona el me´nu de idioma por defecto. code contiene el código de idioma de acuerdo a ISO-639 | |
| HRESULT Audio_Language_Select([in] CHAR* code) | |
| Selecciona el idioma de audio por defecto | |
| HRESULT Spu_Language_Select([in] CHAR* code) | |
| Selecciona el idioma de subtítulo por defecto. | |
| HRESULT Get_Total_Play_Time([in,out] int* totaltime) | |
| Obtiene el tiempo total de reproducción del fichero. | |
| HRESULT Get_Volume_Info([in,out] LONG* volumecount, [in,out] LONG* volume, [in,out] LONG* side, [in,out] LONG* titlecount) | |
| Obtiene información sobre el volumen DVD/ratDVD. Para ratDVD volumecount, volume y side son a | |
| HRESULT Get_Current_Time_Position([in,out] LONGLONG* pos, [in,out] LONGLONG* len) | |
| Obtiene la posición actual y la longitus del título en señales pts. | |
| HRESULT Convert_Time([in,out] int* time, [in,out] LONGLONG* pts) | |
| Convierte el tiempo actual HMSF a señales pts. | |
| HRESULT Get_Title_String([in,out] CHAR** title_string) | |
| Obtiene el actual DVD ID | |
| HRESULT Get_Video_Aspect([in,out] CHAR* aspect) | |
| Obtiene el aspecto de vídeo activo 0: 4:3 3: 16:9 | |
| HRESULT Get_Video_Info([in,out] unsigned char* permitted_df, [in,out] unsigned char* display_aspect_ratio, [in,out] unsigned char* video_format, [in,out] unsigned char* mpeg_version, [in,out] unsigned char* film_mode, [in,out] unsigned char* letterboxed, [in,out] unsigned char* picture_size, [in,out] unsigned char* bit_rate, [in,out] unsigned char* line21_cc_2, [in,out] unsigned char* line21_cc_1) |
|
| Obtiene información sobre el stream de vídeo. | |
| HRESULT Get_Video_Size([in,out] LONG* width, [in,out] LONG* height) | |
| Obtiene la altura y la anchura del stream de vídeo actual. | |
| HRESULT Audio_Stream_To_Lang([in] CHAR stream, [in,out] SHORT* lang) | |
| Convierte el stream lógico de audio en un código de lenguage. | |
| HRESULT Spu_Stream_To_Lang([in] CHAR stream, [in,out] SHORT* lang) | |
| Convierte el stream SPU lógico en un código de lenguage | |
| HRESULT Get_Audio_Logical_Stream([in] CHAR stream, [in,out] CHAR* logical_stream) | |
| Obtiene el stream lógico de audio para un stream físico ("stream"). | |
| HRESULT Get_Spu_Logical_Stream([in] CHAR stream, [in,out] CHAR* logical_stream) | |
| Obtiene el stream lógico de la subimagen para un stream físico ("stream"). | |
| HRESULT Get_Active_Audio_Stream([in,out] CHAR* stream) | |
| Obtiene el stream activo de audio. | |
| HRESULT Get_Active_Spu_Stream([in,out] CHAR* stream) | |
| Obtiene el stream SPU activo. | |
| HRESULT Get_Restrictions([in,out] unsigned long* restrictions) | |
| Obtiene las actuales operaciones restringidas del usuario. | |
| HRESULT Get_Audio_Stream_Count([in,out] LONG* count) | |
| Obtiene el número de streams de audio. | |
| HRESULT Get_Spu_Stream_Count([in,out] LONG* count) | |
| Obtiene el número de streams SPU. | |
| HRESULT Get_Audio_Info([in] LONG streamid, [in,out] unsigned char* application_mode, [in,out] unsigned char* lang_type, [in,out] unsigned char* multichannel_extension, [in,out] unsigned char* audio_format, [in,out] unsigned char* channels, [in,out] unsigned char* sample_frequency, [in,out] unsigned char* quantization, [in,out] unsigned short* lang_code, [in,out] unsigned char* lang_extension, [in,out] unsigned char* code_extension, [in,out] unsigned char* dolby_encoded) |
|
| Obtiene información sobre el stream de audio "streamid" | |
| HRESULT Get_Spu_Info([in] LONG streamid, [in,out] unsigned char* code_mode, [in,out] unsigned char* type, [in,out] unsigned short* lang_code, [in,out] unsigned char* lang_ext, [in,out] unsigned char* code_ext) |
|
| Obtiene información sobre el stream SPU "streamid" | |
| HRESULT Audio_Enabled([in] LONG stream, [in,out] SHORT* enabled) | |
| Determina si el stream de audio indicado esta habilitado | |
| HRESULT Spu_Enabled([in] LONG stream, [in,out] SHORT* enabled) | |
| Determina si el stream SPU indicado esta habilitado | |
| HRESULT Audio_Change([in] LONG audio) | |
| Cambia el stream de audio al stream "audio" | |
| HRESULT Spu_Change([in] LONG spu) | |
| Cambia el stream SPU al stream "spu" | |
| HRESULT Menu_Stream_Count([in,out] LONG* streamcount) | |
| Devuelve el número disponibles de streams de menús | |
| HRESULT Menu_Available([in,out] UCHAR* menus) | |
| Determina que menus estan disponibles. | |
| HRESULT Angle_Change([in] LONG angle) | |
| Cambia el angulo | |
| HRESULT Get_Angle_Info([in,out] LONG* current_angle, [in,out] LONG* angle_count) | |
| Determina el ángulo actual y la cantidad de ángulos disponibles. | |
| HRESULT Is_Domain_Fp([in,out] CHAR* result) | |
| Si esta es la primera reproducción del dominio. | |
| HRESULT Is_Domain_VMGM([in,out] CHAR* result) | |
| Si estamos en el dominio del menú de video maestro | |
| HRESULT Is_Domain_VTSM([in,out] CHAR* result) | |
| Si estamos en el dominio del menú del video titleset | |
| HRESULT Is_Domain_VTS([in,out] CHAR* result) | |
| Si estamos en un titleset de vídeo. | |
| HRESULT Get_Length([in,out] LONGLONG* len) | |
| Obtiene la longitus del pgc | |
| HRESULT Get_Force_Highlight([in,out] BOOL* highlight) | |
| Comprueba si hay un forzado de brillo presente | |
| HRESULT Get_Button_Count([in,out] INT* cbutton) | |
| Obtiene el número de botones. | |
| HRESULT Get_Button_At_Position([in] LONG x, [in] LONG y, [in,out] LONG* button) | |
| Obtiene el número de botón del botón en la posición x/y | |
| HRESULT Get_Button_Rect([in] LONG button, [out] LONG* startx, [out] LONG* starty, [out] LONG* endx, [out] LONG* endy) | |
| Obtiene la dimensión del botón dado. | |
Libdvdnav, Plug-In de navegación por defecto: ejemplo y código fuente
El Plug-In de navegación por defecto es un implementación de servidor fuera-de-proceso COM de libdvdnav originalmente de http://dvd.sf.net y contiene los metodos para navegar el DVD. Lo incorpore en un servidor Win32 COM y lo amplié con varios métodos para el control de corriente de audio y spu. Además puse en práctica la parte_play_auto_stop y metodos de busqueda de tiempo de libdvdnav. Esto ahora puede ser usado para la navegación DVD de cualquier aplicación Win32.
| dvdnavlib.zip | Descargar |
Plug-In de etiquetación
Las funciones de etiquetación de ratDVD, pueden utilizar Plug-Ins de etiquetación para proveer información de etiquetado a un medio determinado (usualmente DVD).
Imdbexport Tagging Plug-In Sample and Source CodeEste servidor COM exporta tres interfaces para solicitar datos de una película de la base de datos IMDB.
| Iimdbquery: : | Contiene métodos para realizar la busqueda actual (FindMovie) y navegar por la lista de resultados. (Reset, Skip, Next, Count). Además se puede solicitar detalles sobre el resultado de una película vía esta interface (GetDetail) y descargar la imagen correspondiente. |
| Iimdbresult: | Representa el resultado de una búsqueda. Puedes traer la información del nombre de una película (GetTitle) y su URL (GetURL) |
| Iimdbdetail: | Permite traer todos los detalles importantes sobre una película en forma de strings que entonces podras usar para completar la información de rotulado |
El imdbexport usa algo de la utilidad HTML Scraper de XBMC. Lo incorpore en un servidor Win32 COM. Y esto ahora puede usarse para recuperar los datos de rotulado desde imdb.com bajo Win32.
Una versión binaria compilada de este puede ser instalada junto a ratDVD por el instalador ratDVD. El codigo binario y el código fuente pueden ser descargados desde aquí:
| imdbexport.zip | Descargar |
ratDVD DVD analyze data sharing
Para estimar correctamente el tamaño del archivo transcodificado de ratDVD, los datos del DVD necesitan ser analizados. Si tú cambias en el UI a "Bibrate de media constante" o seleccionas "analizar" del menú "Conversion" el proceso de análisis comenzará.
Analizando significa que analiza los datos del DVD de forma rápida para encontrar datos adicionales existentes en el vídeo. Esta información es la que se usa para estimar el tamaño del resultado, basado en el DVD sobre el bibrate definido por el usuario en la configuración de vídeo.
Para guardar el tiempo de analisis para otros usuarios si un DVD ha sido convertido, los resultados del analisis pueden ser almacenados en un servidor de ratDVD y si alguien intenta convertir un DVD que ya ha sido convertido antes, el puede obtener esta información directamente del servidor y guardar el tiempo de analisis. Esto es totalmente anónimo y no se transfiere información personal (ver los detalles siguientes). Para aumentar la privacidad, ratDVD pregunta si tú quieres compartir tus datos de analisis antes de conectar a internet por primera vez. Todas estas opciones pueden ser cambiadas en el dialogo de opciones.
El proceso
1. Comprueba si existe analisis de datos.
- Si esta es la primera vez, ratDVD pregunta si tu quieres compartir tus datos del analisis. si respondes que no, ratDVD se salta el siguiente paso y va directamente al paso 2. El paso 5 también se lo salta, porque no se ha creado ninguna conexión a internet.
- Si comienzas la conversión, ratDVD comprueba en tu disco duro si has analizado este DVD anteriormente. si es asi, ysará esos datos y no continua con el siguiente paso y se irá directamente al paso 3.
- ratDVD construye un único y opaco identificador de la estructura del DVD y la usa para descargar eventualmente datos de analisis existentes sobre este DVD de data.ratdvd.dk (este servidor ha dejado de existir). Si los resultados de analisis pueden ser obtenidos, salta el paso 2 y va al paso 3.
2. Analisis del origen.
- ratDVD analiza el DVD en modo rápido y almacena el resultado del analisis en tu disco duro.
3. Convertir a ratDVD
- ratDVD hace la conversión y mientras hace esto, recoge datos más detallados del analisis.
4. Almacenar los datos del analisis detallado en tu disco duro.
- Cuando la conversión está completada, ratDVD actualiza el analisis rápido de datos del analisis inicial de datos de tu disco duro con más detalles del proceso de conversión.
5. Almacenar los datos detallados del analisis en data.ratdvd.dk (ya no es posible)
- Los datos del analisis detallado del proceso de conversión es transmitido al servidor data.ratdvd.dk para compartirlo con la comunidad (este servidor ha dejado de existir).
Que se transmite (si tu compartes tus datos analizados)
Solo se transmite los datos del DVD que tú has analizado. Para todos los stream de audio y subimagenes el número de paquetes contenidos se guardará. En ningún momento habrá datos contenidos datos en los datos de analisis que puedan identificar tu ordenadorAt no point there will be any data contained in the analyzedata that may identify your computer or incluso el título de la película que usted está convirtiendo.
<VMGCellSets> .... |

