Xwork's Blog

The lord is waiting to take your hand.

Vamos a programar #105 - Enmascaramiento y secuencias de bits - Camino a ClockView 3.0

No hay comentarios.

Hola de nuevo a todos, el día de hoy vamos a ver como hacer uso del enmascaramiento y cómo ahorrar un poco de memoria para algunos tipos de variables.


 

 

Desde hace tiempo actualicé ClockView, si no sabes de lo que hablo, puedes darte una vuelta por el post de la versión dos.

Desde el principio planee poner una serie de alarmas muy similares a las de un reloj casio que tengo, este tiene la particularidad de que se puede establecer por fecha: es decir, si queremos que suene el tres de julio, eso hará; por mes: es decir, si establecemos solo el mes, sonará todos los días de octubre (por solo decir una fecha); por año: la alarma sonará todos los días del año. Además se podía establecer para que la alarma sonara ciertos días de la semana, está función me es realmente útil, ya que normalmente solo algunos días de la semana requiero de la alarma (aunque ya no tanto, creo que llegué a la edad en que le gano al despertador).

 


Si recordamos la versión anterior de clock view, este, carecía de una función de alarma, pero el modulo de reloj en tiempo real DS1302, además de llevar la cuenta del tiempo, posee la capacidad de llevar los días de la semana. Para poder guardar los datos de los días de la semana en los cuales queremos que la alarma suene, vamos a usar un solo byte.

Para eso, podemos estructurar los días de la semana cómo se muestra en la siguiente imagen:

Oportunamente para nosotros, la semana consta de siete días, y cada byte consta de ocho bits, con lo que podemos asignar un valor cómo se muestra en la imagen anterior. Pero mas que su valor numérico, debemos de ver cómo es su representación en binario.

 


Pero ahora que hemos asignado un valor a cada día de la semana ¿cómo debemos de usarlos? Antes de entrar esos detalles, supongamos que queremos que la alarma suene los días: domingo, jueves y sábado, deberíamos de hacer algo cómo lo que sigue:

  • Tomar el valor del primer día deseado.
  • Tomar el valor del segundo día deseado
  • Aplicar el operador "or" a ambos números y asignarlos a una variable.
  • Si se desean agregar mas días, al valor anterior se le aplica de nuevo el operador "or" junto con el día a agregar

Si lo convertimos a código en c, quedaría algo cómo lo que sigue:

uint8_t BuildTheDaysOfAlarms(uint8_t TheDay1, uint8_t TheDay2)
{
  return TheDay1|TheDay2;
}

Entonces los días que queremos usar en la alarma quedarían cómo:

  • 00000001 or 00100000 or 01000000 = 01010001.
  • que es igual en decimal a: 1 or 16 or 64 = 81.
¨Para probar si el día de hoy está dentro del rango marcado, bastará con aplicar la operación "and" entre los días a usar y el día de hoy, si el resultado es cualquier valor diferente a cero, quiere decir que el valor del día está en el rango. Para entender mejor lo que pasa, tomado como ejemplo que hoy es sábado y la alarma debería de sonar solo de lunes a viernes, tenemos:

  • Lunes a viernes = 00111110 = 62.
  • Sábado = 01000000 = 64
  • 62 and 64 = 0.
  • El día no está en el rango.
Ahora veamos otro ejemplo donde es miércoles y la alarma está ajustada para que suene lunes, martes y miércoles;
  • Lunes, miércoles y viernes = 00101010 = 42.
  • Miércoles = 00001000 = 8
  • 42 and 8 = 8
  • El día está en el rango.
La ventaja que hay al utilizar secuencias de bits, es sencilla, ya que estamos almacenando información en poca memoria (que en arduino es importante), pero además las operaciones cómo "or" o "and" normalmente requieren un solo ciclo del CPU para realizarse, con lo que se agrega velocidad al programa.

Y bien, por ahora es todo, en las próximas semanas, voy a ir liberando detalles del clock view para finalmente llegar a la versión tres que ya tengo lista desde hace algún tiempo, pero por una o por otra cuestión, no he podido liberar.

Los leo luego.


No hay comentarios. :

Publicar un comentario

Cumplimos 8 años.

No hay comentarios.

Hola de nuevo a todos. El día de hoy solo escribo para recordar que un día cómo hoy pero de hace ocho años, nació el Blog de Xwork. Siempre le voy a agradecer a todos los que se toman la molestia de venir a leer aunque sea un poco. Si bien la cantidad de publicaciones ha disminuido de forma drástica, tengan por seguro que va a seguir habiendo, a inicio de año planifique todo y de hecho se iba a ir publicando un post al mes, pero por razones que son difíciles de comprender aun para mi, algo salio mal en mayo y todos los post que se iban a publicar, simplemente desaparecieron. Estoy arreglando todo y en cuanto este listo, se subirán de uno por uno.


 

 Sin más que decir, solo quiero agradecer una vez mas a todos los que me leen.

Nos seguimos leyendo.

Att. Xwork.

No hay comentarios. :

Publicar un comentario

El Video Correcto #10 - VEncoder y subtitulos.

No hay comentarios.

Hola de nuevo a todos, el día de hoy vamos a ver cómo insertar subtitulos en los videos que se codifiquen con VEncoder.


Hay que recordar que VEncoder es una interfaz de usuario para FFMPEG; si bien la idea es mantener los mas simple posible todo, para lograr resultados complejos, es necesario hacer ajustes complejos. Antes de continuar, me gustaría recapitular cual fue la idea de VEncoder. El programa inicialmente nació cómo una herramienta para convertir los videos para que el Play Station Portable pudiera reproducirlos, incluso era parte de un programa llamado PSP Manager, y cómo su nombre lo pudiera sugerir, servía para manejar el contenido multimedia de la consola. Poco a poco cada una de las partes se separó y dieron origen a VEncoder y AEncoder que a diferencia de PSP Manager, no tuvieron tanta relevancia.


He usado mi PSP desde el 2010 y de las pocas cosas que no he logrado entender, es cómo funciona la opción de los subtítulos en el reproductor de video.


Recientemente me he encontrado con gente para la cual la consola es algo totalmente nuevo y he compartido algunos videos con esas personas, pero cómo los tiempos cambian, ahora resulta más sencillo encontrar contenido que no está en nuestro idioma por lo que resulta necesario encontrar una forma de incluirlos. Cómo mencioné hace poco, a pesar de que la PSP tiene (o eso según el menú) la capacidad de reproducir subtítulos, nunca supe cómo usarlos. 

FFMPEG tiene la capacidad de reproducir subtítulos, pero antes de detallar cómo es que funcionan, hay que resaltar algo importante. Hay dos formas de incrustar los subtítulos; la primera es sencilla, se dota de un archivo que tiene la transcripción de los diálogos con los tiempos para cada uno, el reproductor los lee y los muestra sobre el video, a esto le podemos llamar "subtítulos por software". La otra forma es similar, tenemos un archivo con las transcripciones pero solo las usamos al momento de codificar el video y justo en la codificación, vamos a modificar la imagen correspondiente al tiempo del fotograma, de tal forma que el texto quede cómo parte de la misma, con eso bastará para que los subtítulos queden de forma permanente en el video.

Para lograr esto, usaremos FFMPEG junto con VEncoder (el cual actualizare pronto para que la opción "Si hay subtítulos 'quemarlos'" funcione). En VEncoder, hay una ficha llamada "Parámetros adicionales" dentro, hay una ficha llamada "video". FFMPEG soporta varios tipos de subtítulos, archivos SRT o archivos ASS, los primeros son mas sencillos, pues solo incluyen el dialogo y el tiempo en que deben de aparecer; los segundos incluyen "estilos" y efectos (transiciones, diferentes ubicaciones para el texto).

Primero veamos un ejemplo de cómo insertar un archivo SRT.

 -vf "subtitles='I\:\\\VIDEOS\\\Track3.srt'"
En VEncoder, bastará con agregar la línea anterior a los parámetros adicionales del video, para este caso, tenemos que nuestro archivo de subtítulos se llama "Track3.srt" y que su ruta completa es "I:\VIDEOS\Track3.srt", en FFMPEG para escapar las contra-diagonales, necesitamos usar doble "\". Supongamos que tenemos la siguiente ruta "c:\VIDEOS \Dr House\Season 1\Pilot.srt", la ruta para usarla en FFMPEG quedaria: "c\:\\\VIDEOS\\\Dr House\\\Season 1\\\Pilot.srt".

Si usamos archivos ASS, la sintaxis es similar.

-vf "ass='I\:\\\VIDEOS\\\Track3.srt'"

La codificación para los archivos ass tardará mas tiempo, dependiendo de los estilos y los efectos, por lo que en la medida de lo posible recomiendo usar archivos SRT.

No es precisamente el mismo cuadro, pero se ven lo subtítulos "quemados"

Y bien, por ahora es todo, aun quedan varias cosas que tratar para poder visualizar los videos de forma correcta en el PSP, una de las cosas más comunes, es encontrar la relación de aspecto adecuada para cada video, la resolucion y la calidad, pero eso lo veremos en el siguiente post.

Los leo luego.

No hay comentarios. :

Publicar un comentario

Learning machine #18 - Programando en Pascal - Estructuras de datos (Record).

No hay comentarios.

Hola de nuevo a todos, el día de hoy vamos a continuar con mas del aprendizaje del lenguaje de programación en pascal.

"En el capítulo anterior de <<Learning machine>>" vimos cómo es que se usan los arreglos de una o varias dimensiones. Hoy vamos a ver cómo es que se usan las estructuras de datos o "Record" (registro en español). Un registro  básicamente es un conjunto de variables bajo un mismo nombre o tipo.

Para crear un registro, hay que crear un tipo usando la palabra "Type" seguido del nombre o identificador que le daremos al registro, hasta aquí todo es igual a cuando creamos los tipos, ahora la diferencia viene en que hay que asignarlo al tipo "Record", es decir tendríamos algo cómo: "Type NombreDelRegistro = Record" una vez creado, dentro de este nuevo tipo, agregaremos "campos"; cada campo sera una variable de cualquiera de los tipos soportados por Pascal. Una vez agregados todos los campos, finalizaremos la declaracion, con la palabra reservada "end;". Para apreciar un poco mejor cómo es todo el proceso, tomemos el siguiente ejemplo:

Type MiCancion = Record
	Cancion,Artista,Album : string;
	Year : Integer;
	BeatPerMinute : single
end;

Con esto habremos creado un nuevo registro llamado "MiCancion"; este contendrá los campos: "Cancion, Artista, Album, Year y BeatPerMinute" del tipo "string, string, string, integer y single" respectivamente. Para poder usar el registro, crearemos variables del tipo que acabamos de crear.

Si queremos acceder a los campos, bastará con escribir el nombre de la variable seguido de "." y despues el nombre del campo. Para visualizar mejor cómo es que se hace, observemos el siguiente código:

        KillerQueen.Cancion := 'Killer Queen.flac';
	KillerQueen.Artista := 'Queen';
	KillerQueen.Album := 'Sheer Heart Attack';
	KillerQueen.Year := 1974;
	KillerQueen.BeatPerMinute := 117.27;

	writeln(KillerQueen.Cancion);
	writeln(KillerQueen.Artista);
	writeln(KillerQueen.Album);
	writeln(KillerQueen.Year);
	writeln(KillerQueen.BeatPerMinute);

Una forma de agilizar el acceso al registro, es hacer uso de la palabra reservada "with", para ello, escribiremos "with" seguido del nombre del registro al cual queremos acceder seguido de de la palabra reservada "do", luego "begin", para poder acceder a los miembros solo bastará con escribir el nombre de cada campo; y cómo cada sección, la finalizaremos con su respectivo "end;". Ahora revisemos el siguiente código que ejemplifica lo anterior.

with Epitaph do
	begin
		Cancion := 'Epitaph.flac';	
		Artista := 'King Crimson';
		Album := 'In the court of the crimson king';
		Year := 1969;
		BeatPerMinute := 100.37;
	end;

Los registros son utiles a la hora de trabajar con estructuras de datos ya que una vez que se crean y se asignan los valores correspondientes, todo el conjunto pasara a ser parte de la misma variable y si por ejemplo asignamos "KillerQueen := Epitaph" tendremos una copia exacta del primero.

Solo por si se ofrece, dejo el código de un programa completo que hace uso de los registros.

program Registros(output);

uses crt, sysutils;

Type MiCancion = Record
	Cancion,Artista,Album : string;
	Year : Integer;
	BeatPerMinute : single
end;

var

KillerQueen, Epitaph : MiCancion;

begin
	KillerQueen.Cancion := 'Killer Queen.flac';
	KillerQueen.Artista := 'Queen';
	KillerQueen.Album := 'Sheer Heart Attack';
	KillerQueen.Year := 1974;
	KillerQueen.BeatPerMinute := 117.27;

	writeln(KillerQueen.Cancion);
	writeln(KillerQueen.Artista);
	writeln(KillerQueen.Album);
	writeln(KillerQueen.Year);
	writeln(KillerQueen.BeatPerMinute);

	with Epitaph do
	begin
		Cancion := 'Epitaph.flac';	
		Artista := 'King Crimson';
		Album := 'In the court of the crimson king';
		Year := 1969;
		BeatPerMinute := 100.37;
	end;
    
	writeln(Epitaph.Cancion);
	writeln(Epitaph.Artista);
	writeln(Epitaph.Album);
	writeln(Epitaph.Year);
	writeln(Epitaph.BeatPerMinute);
	
	readln();

end.

Y bien, por ahora es todo. El código lo puedes copiar para probarlo. Antes de terminar, hay que aclarar algo, si bien en español, se puede leer "Record" cómo registro, no hay que confundirlo con "Register" que es una cosa completamente diferente (que eventualmente veremos).

Los leo luego.

No hay comentarios. :

Publicar un comentario

Bienvenido el 2024

No hay comentarios.

Hola de nuevo a todos, el día de hoy solo escribo para desearles a todos un buen año 2024. Cómo ya se va haciendo costumbre este año trataré de publicar al menos una entrada al mes; el año 2023 fue particularmente bueno y contrario a lo que se pensaría, esa fue la razón por la cual la actividad del blog bajo a niveles no vistos antes. Es bueno ver que aun hay gente que espera seguir leyendo los artículos y que los temas son bastante atinados para ellos. Sin más que decir, espero que sigan pasando a leer.

Si, 2024 y sigo usando mi PSP.


Los leo luego.

No hay comentarios. :

Publicar un comentario