ratDVD - El unico formato de compresion de DVDs

 

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:


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")]
public static extern uint RegisterWindowMessage(string Message);
protected override void WndProc(ref Message m)
{
if (_ProgressMessage != 0)
{
if (m.Msg == _ProgressMessage)
{
if (OnProgress != null) OnProgress((int)m.WParam>>16);
}
}
base.WndProc(ref m);
}

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
//en el caso del filtro de origen debería ser el XEBNavigationfilter
//instancia del MS DVD Navigator
GUID clsid = CLSID_DVDNavigator;
if(fn.MakeLower().Find(_T(".ratdvd")) >= 0) clsid = __uuidof(ratDVDNavigator);

//creado el filtro de origen
CComPtr<IBaseFilter> pBF;
if(FAILED(hr = pBF.CoCreateInstance(clsid))) return E_FAIL;

(…)

//obtener el interfaz e navegación
m_pUnks.AddTail(pDVDC);
m_pUnks.AddTail(pDVDI);

//no se necesita restaurar esto para el .ratdvd
if(clsid == CLSID_DVDNavigator) CResetDVD tmp(path);

(…)
}

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;
if(!GetCur(pli)) return NULL;
CString fn = CString(pli.m_fns.GetHead()).MakeLower();
if(fn.Find(_T("video_ts.ifo")) >= 0 || fn.Find(_T(".ratdvd")) >= 0)
{
if(OpenDVDData* p = new OpenDVDData())
{

(…)

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.

Uso

Para 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]
Drive={8744EC2A-629C-474A-B992-A7930A4B9ED6}
Folder={8744EC2A-629C-474A-B992-A7930A4B9ED6}
.iso={??????-?????????-??????????-????????-???????}
.img={??????-?????????-??????????-????????-???????}

[ReadDescription]
.iso=ISO Image

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.

Uso

Para 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 Code

Este 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.

2. Analisis del origen.

3. Convertir a ratDVD

4. Almacenar los datos del analisis detallado en tu disco duro.

5. Almacenar los datos detallados del analisis en data.ratdvd.dk (ya no es posible)

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>
<!-- streams de Subpeliculas incluidos-->
<subpicturestreams>
<subpicturestream index="3" include="1"/>
</subpicturestreams>
<!-- Contador de paquetes de los streams analizados -->
<cellset index="0">
<streamdata index="255" packetcount="2048"/>
<streamdata index="32"/>
<streamdata index="239" packetcount="57344"/>
<streamdata index="0" packetcount="59392" analyzepacketcount="104448"/>
<streamdata index="224" packetcount="104448" analyzepacketcount="104448"/>
</cellset>

....
<!-- Datos para todos los VTS -->
<VTSCellSets index="1">
<!-- Datos para menus -->
<MenuCellSets/>
<!-- Datos para títulos-->
<VideoCellSets>
<!-- streams de audio incluidos (2 = AC3 VS Stream) -->
<audiostreams>
<audiostream index="0" include="2"/>
<audiostream index="1" include="2"/>
<audiostream index="2" include="2"/>
<audiostream index="3" include="1"/>
</audiostreams>
<subpicturestreams>
<subpicturestream index="0" include="1"/>
<subpicturestream index="1" include="1"/>
<subpicturestream index="2" include="1"/>
</subpicturestreams>
<cellset index="0">
<streamdata index="131" packetcount="66865152" analyzepacketcount="4239360"/>
<streamdata index="32"/>
<streamdata index="32"/>
<streamdata index="33" packetcount="2701312" analyzepacketcount="163840"/>
<streamdata index="224" packetcount="1724323840" analyzepacketcount="107157504"/>
<streamdata index="0" packetcount="464144384" analyzepacketcount="111560704"/>
<streamdata index="239" packetcount="385216512"/>
<streamdata index="255" packetcount="9361408"/>
</cellset>
</VideoCellSets>
</VTSCellSets>
</dvdinfo>