OJODIGITAL |
|
|
|
| Debates sobre la programación Para tratar temas sobre programación |
![]() |
|
||||
|
Compilar para Linux
Hola, en qué estado se encuentran las fuentes y/o el uso de librerías para intentar compilar alguna de las versiones existentes bajo linux?
Saludos
__________________
ToniLupi Mis imágenes en http://www.pbase.com/tonilupi Eos 400D + 100mm macro f2.8 USM |
| Publicidad |
|
||||
|
Pues es una buena pregunta. Voy a intentar contestarte.
Puedes acceder al código fuente instrucciones aquí http://code.google.com/p/perfectraw/source/checkout Un saludo y suerte si te pones a ello: |
|
||||
|
PerroVerd, de momento llevo unos días intentando que corriera perfectRAW sobre wine pero no hay forma, me da errores de asignación de memoria y además me pide que instale las librerías para windows de mono y ya le he instalado la v7 y la v8.
Si así funcionara pues estaría solucionado de momento, pero como no es así me decidí a abrí ir este post. Saludos
__________________
ToniLupi Mis imágenes en http://www.pbase.com/tonilupi Eos 400D + 100mm macro f2.8 USM |
|
||||
|
PerroVerd, ¿cómo tienes el tema?
Yo, después de pelearme unos días con el mono-develop parece que lo tengo funcionando (el mono, no el dcraw ), ahora estoy en la tarea de generar esa librería dinámica.Necesito ayuda para esto para hacerlo con el mono. Saludos
__________________
ToniLupi Mis imágenes en http://www.pbase.com/tonilupi Eos 400D + 100mm macro f2.8 USM |
|
||||
|
Cita:
Tengo instalado un Ubuntu, algún día me pondré a probar gcc+Mono, pero de momento yo no puedo ayudarte más. Un saludo: |
|
||||
|
Bueno, dcraw ha compilado sin problemas y ya tengo la librería dcraw.so, ahora estoy intentando compilar perfectRAW con mono.
De momento estoy parado con el WindowsApplication4 , en los repositorios de los fuentes no encuentro ninguna archivo con ese nombre. Por lo que he podido encontrar ese parece un nombre por defecto que VB "noseque versión" le pone a sus proyectos, además por hacer referencia a los botones parece un form. Venga, decid algo que estoy parao ![]() ![]() ![]() Saludos
__________________
ToniLupi Mis imágenes en http://www.pbase.com/tonilupi Eos 400D + 100mm macro f2.8 USM |
|
||||
|
Cita:
![]() Cita:
Código:
private void InitializeComponent()
{
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
this.label3 = new System.Windows.Forms.Label();
this.button3 = new WindowsApplication4.pButton(); // Cambiar por new Button();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.FreeMem = new System.Windows.Forms.Label();
this.button1 = new WindowsApplication4.pButton();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.label2 = new System.Windows.Forms.Label();
this.numericUpDown3 = new System.Windows.Forms.NumericUpDown();
this.label7 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.label8 = new System.Windows.Forms.Label();
this.numericUpDown4 = new System.Windows.Forms.NumericUpDown();
this.label10 = new System.Windows.Forms.Label();
this.label9 = new System.Windows.Forms.Label();
this.numericUpDown5 = new System.Windows.Forms.NumericUpDown();
this.trackBar1 = new System.Windows.Forms.TrackBar();
this.numericUpDown2 = new System.Windows.Forms.NumericUpDown();
this.label4 = new System.Windows.Forms.Label();
this.numericUpDown1 = new System.Windows.Forms.NumericUpDown();
this.label5 = new System.Windows.Forms.Label();
this.trackBar2 = new System.Windows.Forms.TrackBar();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.textBox1 = new System.Windows.Forms.TextBox();
this.pButton1 = new WindowsApplication4.pButton();
this.label6 = new System.Windows.Forms.Label();
this.label11 = new System.Windows.Forms.Label();
this.thresholdControl = new System.Windows.Forms.NumericUpDown();
this.medianControl = new System.Windows.Forms.NumericUpDown();
this.label12 = new System.Windows.Forms.Label();
this.label13 = new System.Windows.Forms.Label();
this.listBox1 = new System.Windows.Forms.ListBox();
this.label14 = new System.Windows.Forms.Label();
this.listBox2 = new System.Windows.Forms.ListBox();
this.numericUpDown6 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown7 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown8 = new System.Windows.Forms.NumericUpDown();
this.numericUpDown9 = new System.Windows.Forms.NumericUpDown();
this.label15 = new System.Windows.Forms.Label();
this.label16 = new System.Windows.Forms.Label();
this.label17 = new System.Windows.Forms.Label();
this.label18 = new System.Windows.Forms.Label();
this.label20 = new System.Windows.Forms.Label();
this.listBox3 = new System.Windows.Forms.ListBox();
this.levelEdgeStr = new System.Windows.Forms.Label();
this.levelCellSld = new System.Windows.Forms.TrackBar();
this.levelCellNum = new System.Windows.Forms.NumericUpDown();
this.pButton2 = new WindowsApplication4.pButton();
this.pButton3 = new WindowsApplication4.pButton();
this.pButton4 = new WindowsApplication4.pButton();
this.groupBox2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown5)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.trackBar2)).BeginInit();
this.groupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.thresholdControl)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.medianControl)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown6)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown7)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown8)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown9)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.levelCellSld)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.levelCellNum)).BeginInit();
this.SuspendLayout();
[...]
Código:
// Código no portable a otras plataformas
[DllImport("kernel32")]
static extern void GlobalMemoryStatus(ref MEMORYSTATUS buf);
Me vas a hacer la puñeta con ésto ![]() ![]() , yo pensaba pasar de conectarme en vacaciones, pero tendré que pedirle a alguien que me mantenga informado de tus progresos... ¡que suspense! Si conseguimos compilarlo para Linux lo siguiente es MacOS, tiene que ser muy parecido porque tiene gcc y Mono.Un saludo: Última edición por ManuelLlorens; 12-jul-2008 a las 02:03. |
|
||||
|
Bueno, esto, ejem..., donde dije digo digo diego.
El hecho es que me lie y lo que compilé sin problemas fue el dcraw de Coffin ![]() El otro hecho es que hoy me he puesto con el DCRAW modificado y me da un error, En la función DCRAW_Process el gcc me devuelve un error de incompatibilidad de tipos entre dos punteros, concretamente donde se iguala image=img image se define al principio del archivo como variable global siendo un puntero a un array de 4 unsigned shorts y en el módulo DCRAW_Processss no se redefine mientras que img se define como variable local en esa función siendo un puntero a un unsigned short. No me cuadra esa asignación y no entiendo cómo habéis podido compilarlo tal cual. ![]() ![]() ![]() Saludos
__________________
ToniLupi Mis imágenes en http://www.pbase.com/tonilupi Eos 400D + 100mm macro f2.8 USM |
|
||||
|
Cita:
.Cita:
Solucionarlo es fácil, basta con hacer un cast entre los dos tipos de punteros: Cambia ésto: Código:
image=img; Código:
image=(ushort (*)[4]) img; Un saludo: |
|
||||
|
Oño, Manuel, el cast era lo que buscaba, recordaba una manera de forzar un desacuerdo de tipos como este pero como me centré en repasar todo lo competente a punteros pasé por alto esto. Es que estoy un poco oxidado
![]() Esta noche lo probaré. Sobre lo de cambiar otras cosas ya lo he tenido que hacer, pero bueno, cuando lo termine (si lo llego a terminar Salut
__________________
ToniLupi Mis imágenes en http://www.pbase.com/tonilupi Eos 400D + 100mm macro f2.8 USM |
|
||||
|
Esto ya compila!!!!
Manuel, ya he conseguido generar la libería dinámica libdcraw.so y linkarla con el un ejecutable "test" de mi creación.
A tu código de dcraw le he añadido una función mía para probar, simplemente me devuelve la suma de dos enteros. Generando la librería .so y linkándola con mi test.c consigo que me devuelva el valor de la suma. Esto pinta bien. Ahora a por tu test.c, luego a por perfectRAW. Salut _________________________________ Creo que ya tengo funcionando el programita test.c de Manuel enlazado con la librería dinámica dcraw modificado. Os pongo el resultado del archivo raw 1.cr2 del repositorio svn Código:
Saved state 1 Resultado de leer el RAW: 0 Model: EOS 30D 0.500000 Restored state 1 Scaling with darkness 128, saturation 4095, and multipliers 1.900861 1.000000 1.429502 1.002098 Saved state 2 Bilinear interpolation... Saved state 3 Saved state 4 Exposure correction without highlight preservation Converting to sRGB colorspace using sRGB gamma ... Saved state 5 ![]() Saludos
__________________
ToniLupi Mis imágenes en http://www.pbase.com/tonilupi Eos 400D + 100mm macro f2.8 USM Última edición por tonilupi; 19-jul-2008 a las 02:01. Razón: Fusión automática de mensajes para prevenir autosubir post |
|
|||
|
Pues parece que sí compila...
Hola a todos,
Llevo un tiempo siguiendo el proyecto desde la distancia, y bueno, he visto que andais tratando de compilar esto en linux, no sé si al final lo habeis conseguido o no. Yo por mi parte, he estado trasteando con el código que hay en el SVN de google, y con las indicaciones de este hilo y alguna cosa más he sacado esto: ![]() ![]() ![]() Parece que funciona ![]() De todas formas no sé cual es el estado actual del proyecto. Por lo que he leido, para la versión 1.0 vais a incorporar openGL entre otras cosas, y creo (igual me equivoco) que en el svn no esta subido lo último que estais desarrollando. En fin, ya me direis algo y si hace falta os cuento los detalles para la adaptación. De hecho me encontrado con un problema un poco "oscuro" que impedia que funcionase correctamente, aunque la solución es aparentemente facil. Un saludo. |
|
||||
|
Esto es absolutamente fantástico... ¿qué tal va de velocidad? Comenta, comenta los problemas que has encontrado.
Efectivamente, el código actual no es el último, estamos remodelando varias cosas. Un saludo: |
|
|||
|
Pues de velocidad... con el raw de ejemplo (1.cr2) tarda unos 15-20 segundos en un AMD64 3000 / 1 GB de ram.
No sé si es mucho o poco la verdad, ahora mismo solo tengo windows en una máquina virtual y no puedo comparar. Mañana cuando tenga un rato os cuento más cosas ![]() Saludos. |
|
|||
|
Bien por tí, TUR. :xmas: :xmas:
Ahora el código está un poco partido en tres cachos, pruebas de opengl, lo del revelador y cambios en la interface. Nosotros mismos tendremos que juntarlo. Cuando se junte y haya una versión funcional será estupendo si lo puedes pasar a linux. En principio no debería ser complicado, salvo algunos detalles con los que ya te has peleado, porque las librerías están en C, la interface en .NET (eso correrá con mono) y luego está la parte de opengl que está hecha utilizando Tao y que sí que requerirá algún ajuste, porque Tao parece que usa controles diferentes en windows y en linux.
__________________
Canon EOS 300D + Tamron SP AF 17-55mm f2.8 XR LD Aspherical (IF) + Canon EFS 60mm f2.8 Macro USM + Canon EF 70-200mm f/4 L USM+ Canon SpeedLite 420EX |
|
|||
|
Cita:
Lo que os vaya contando podeis (si quereis, claro) ir incorporandolo para la siguiente versión. _________________________________ Voy a empezar por la parte "oscura", la verdad es que esto me costo un buen rato darme cuenta. Y es que despues de que todo compilara correctamente, el programa hacia unos revelados un poco extraños, todo negro o con colores aleatorios ![]() ![]() El problema esta en las estructuras que se comparten entre la libreria de dcraw y el codigo en C#. En principio parece que usar un struct como interfaz de una dll es un poco peligroso, pero bueno, tiene solución. Resulta que gcc por defecto empaqueta las estructuras de diferente manera que mingw/.net/mono. Es decir, gcc pone los campos unos detras de otro sin huecos entre medio y los otros tres compiladores por defecto tratan de alinear las variables a multiplos de su tamaño (por temas de rendimiento y esas cosas). Un poco de literatura sobre esto: aqui o aqui . Por tanto el struct DLL_PARAMETERS compilado en gcc tiene tamaño 120 bytes, y compilado en mono/.net/mingw el tamaño es 128 bytes. Con lo cual se descuadra el acceso a los campos. Solución A: Ordenar los campos de los structs de forma que se evite el padding, esto sería poner los campos de tipos de dato mas largos antes que los tipos mas pequeños. En este caso sería mover dentro de DLL_PARAMETERS la variable 'double aber[4]' al principio del struct. Solución B: Un poco más limpia, forzar el mismo empaquetado en el lado de C y de C#. En el codigo en C (dcraw.h), la estructura DLL_PARAMETERS quedaría: Código:
typedef struct DCRAW_Parameters
{
float threshold; // -n -> buffer 2 *
double aber[4]; // -r/-C -> buffer 2 *
int use_auto_wb; // -a -> buffer 2 *
int use_camera_wb; // -w -> buffer 2 *
unsigned greybox[4]; // -A -> buffer 2
int user_black; // -K -> buffer 2 *
int user_sat; // -S -> buffer 2 *
int test_pattern; // -> buffer 2 -
int level_greens; // -l -> buffer 2 *
float level_edge; // -> buffer 2 *
int level_cell; // -> buffer 2 *
int user_qual; // -q -> buffer 3 *
int four_color_rgb; // -f -> buffer 3 *
int med_passes; // -m -> buffer 4 *
int highlight; // -H -> buffer 4 *
int output_color; // -o -> buffer 5
int use_fuji_rotate; // -J -> buffer 5
float user_gamma; // -g -> buffer 5
float exposure; // -> buffer 4 *
float preserve; // -> buffer 4 *
} __attribute__((packed)) DLL_PARAMETERS;
Código:
[StructLayout(LayoutKind.Sequential,Pack=1)]
public struct DLL_PARAMETERS
{
public float threshold;
public fixed double aber[4];
public int use_auto_wb;
public int use_camera_wb;
public fixed uint greybox[4];
public int user_black;
public int user_sat;
public int test_pattern;
public int level_greens;
public float level_edge;
public int level_cell;
public int user_qual;
public int four_color_rgb;
public int med_passes;
public int highlight;
public int output_color;
public int use_fuji_rotate;
public float user_gamma;
public float exposure;
public float preserve;
}
Luego sigo con los detalles para la compilación, que sino esto queda muy largo. Venga, un saludo. Última edición por Tur; 27-oct-2008 a las 13:26. Razón: Fusión automática de mensajes para prevenir autosubir post |
|
||||
|
Hola Tur, veo que dominas bastante este tema de la programación en Linux.
Yo me perdí y lo dejé hasta ver si salía alguien con más conocimientos que yo. Visto lo visto me gustaría que compartieras tus avances. Veo que has usado Mono, podrías publicar el proyecto y yo intentaría compilarlo? Salut
__________________
ToniLupi Mis imágenes en http://www.pbase.com/tonilupi Eos 400D + 100mm macro f2.8 USM |
|
|||
|
Hola,
Cita:
_________________________________ Os pongo los detalles de la compilación de las librerias dcraw y colormng. Es bastante sencillo ![]() Libreria DCRAW: Cambios en el código: -> Modificar los structs IMAGE_INFO, DLL_PARAMETERS, DLL_STATE con __attribute__((packed)) tal y como se indica en el post anterior. -> La cabecera windows.h solo habría que incluirla si se compila para windows: Código:
#ifdef WIN32 #include <windows.h> // added by Manuel Llorens #endif Compilación: Este es el makefile que he usado, para probarlo se coloca en la carpeta dcraw (donde estan ahora los ficheros .dev), luego situandonos en ese directorio y ejecutando 'make' se genera dentro del directorio 'bin' la libreria libdcraw.so y el ejecutable normal. Código:
CC=gcc
CFLAGS_DCRAW=-DNO_LCMS -DNO_JPEG
CFLAGS_OPT=-pipe -m3dnow -msse -msse2 -mmmx -mfpmath=sse -ffast-math -O2
CFLAGS_PORT="-D__declspec(x)=" -DDLLIMPORT=
CFLAGS_LIB=-fPIC -c -Wall $(CFLAGS_DCRAW) $(CFLAGS_OPT) $(CFLAGS_PORT) -DBUILDING_DLL=1
CFLAGS_EXE=-lm -Wall $(CFLAGS_DCRAW) $(CFLAGS_OPT) $(CFLAGS_PORT)
LDFLAGS_LIB=-fPIC -shared -lm
all: library executable
library: bin/libdcraw.so
executable: bin/dcraw
bin/libdcraw.so: obj/libdcraw.o
$(CC) $(LDFLAGS_LIB) -o $@ $^
obj/libdcraw.o: src/dcraw.c
$(CC) -c -o $@ $^ $(CFLAGS_LIB)
bin/dcraw: src/dcraw.c
$(CC) -o $@ $^ $(CFLAGS_EXE)
clean:
rm -rf obj/*.o bin/*.so bin/dcraw
Libreria COLORMNG: Cambios en el código: -> Igual que con dcraw, los include windows.h hay que rodearlos con un #ifdef WIN32 -> Lo mismo para la función DllMain, rodearla con un #ifdef WIN32 -> Y lo mismo con las definiciones de DLLIMPORT y __declspec, al igual que antes es opcional ya que se anulan despues en el makefile. Compilación: El makefile para colormng, este habria que colocarlo y ejecutarlo en el directorio 'src' dentro de perfectRAW. Se genera libcolormng.so Código:
CC=gcc
CFLAGS_OPT=-pipe -m3dnow -msse -msse2 -mmmx -mfpmath=sse -ffast-math -O2
CFLAGS_PORT="-D__declspec(x)=" -DDLLIMPORT=
CFLAGS=-fPIC -c -Wall $(CFLAGS_OPT) $(CFLAGS_PORT) -DBUILDING_DLL=1
LDFLAGS=-fPIC -shared
all: libcolormng.so
libcolormng.so: cmscam02.o cmscgats.o cmserr.o cmsgmt.o cmsio0.o cmslut.o cmsmtrx.o cmspack.o cmsps2.o cmsvirt.o cmsxform.o cmscam97.o cmscnvrt.o cmsgamma.o cmsintrp.o cmsio1.o cmsmatsh.o cmsnamed.o cmspcs.o cmssamp.o cmswtpnt.o colormng.o
$(CC) $(LDFLAGS) -o $@ $^
clean:
rm -f *.so *.o
Y ya esta, no es muy traumatico, ¿verdad? PD: en el siguiente fascículo, compilación de perfectRAW con mono. Última edición por Tur; 27-oct-2008 a las 22:08. Razón: Fusión automática de mensajes para prevenir autosubir post |
|
||||
|
Genial... cuando subamos el próximo código iremos metiendo cambios permanentes para que compile en linux a partir de ahora. Ya solo nos queda MacOS.
Aunque lo cierto es que la velocidad que comentas es lentísima en comparación con la velocidad en Windows (a mí con una máquina menos potente que la que dices unos 3/5 segundos)... no entiendo muy bien porqué, porque dcraw.dll debería ir igual de rápido, más o menos y es la que se lleva todo el tiempo de ejecución. Un saludo: |
![]() |
| Marcadores |