Linux - Convertir un programa en una libreria dinamica

 
Vista:

Convertir un programa en una libreria dinamica

Publicado por kapachov (12 intervenciones) el 19/10/2006 11:13:52
Holas...

Me he bajado el codigo del xawtv4 para integrarlo con mi aplicacion, en la cual necesito visualizar video, capturar video, capturar fotos.

La interfaz del xawtv4 (ejecutable) viene con la GTK, de momento todo bien; en la interfaz hay una opcion de grabar "recording"... pero no funciona.

Entonces que se me ha ocurrido, ya que el xawtv4 me permite visualizar PERO no grabar video, ni capturar fotos... lo he convertido a una libreria dinamica...

MUY BIEN tengo una de las partes que necesito... pero ahora nencesito el programa que me captura video/fotos.

el xawtv4 instala unas herramientas entre ellas el "streamer" (ejecutable) el cual me hace lo que yo necesito capturar video/fotos. Modifico el codigo, y creo la libreria dinamica...

hmmm lo PRUEBO y VIOLACION DE SEGMENTO...

Algo no cuadra... vuelvo a crear el programa con el mismo codigo fuente que he creado la libreria... FUNCIONA!...

no se que puede estar pasando, alguna idea?
que informacion tengo que tener pendiente a la hora de pasar un programa a libreria dinamica?

Paso 1:
Cambio el fichero "xawtv/console/Subdir.mk":

--
#console/streamer : LDLIBS += $(THREAD_LIBS) $(ICONV_LIBS) -ljpeg -lm
console/streamer : LDLIBS += -shared $(THREAD_LIBS) $(ICONV_LIBS) -ljpeg -lm -o libstreamer.so
--

Paso 2:
Modifico el codigo de "xawtv/streamer.c":

--
int
//main(int argc, char **argv) //kapachov 13-10-2006
main_streamer()
{
char *argv[] = { "streamer", "-d", "-s", "352x240", "-t", "0:20", "-r", "24", "-o", "fichero.yuv", NULL };
int argc = 10;
int c,queued=0,noaudio=0;
char *raw_length=NULL;
char *val;

/* parse options */
ng_init();
read_config();

cfg_parse_cmdline(&argc,argv,cmd_opts_devices);

for (;;) {
if (-1 == (c = getopt(argc, argv, "haqdp:w:"
"o:f:r:s:t:b:j:" "O:F:R:")))
break;
switch (c) {
// general options //
case 'q':
quiet = 1;
break;
case 'a':
noaudio = 1;
break;
case 'd':
debug++;
ng_debug++;
break;
case 'w':
wait_seconds = atoi(optarg);
break;
case 'p':
parallel = atoi(optarg);
break;
// video options //
case 'o':
moviename = optarg;
break;
case 'f':
vfmt_name = optarg;
break;
case 'r':
fps = (int)(atof(optarg) * 1000 + 0.5);
break;
case 's':
if (2 != sscanf(optarg,"%dx%d",&video.width,&video.height))
video.width = video.height = 0;
break;

case 't':
raw_length = optarg;
break;
case 'b':
bufcount = atoi(optarg);
break;
case 'j':
ng_jpeg_quality = atoi(optarg);
break;

// audio options //
case 'O':
audioname = optarg;
break;
case 'F':
afmt_name = optarg;
break;
case 'R':
audio.rate = atoi(optarg);
break;

// errors / help //
case 'h':
usage(stdout);
exit(0);
default:
usage(stderr);
exit(1);
}
}
--

Paso 3:

Compilo la libreria "libstreamer.so";
Y ejecuto mi programa que llama a la funcion main_streamer.

--
checking writer files [multiple image files] ...
video name=ppm ext=ppm: ext mismatch [need yuv]
video name=pgm ext=pgm: ext mismatch [need yuv]
video name=jpeg ext=jpeg: ext mismatch [need yuv]
checking writer raw [single file, raw video data] ...
video name=rgb ext=raw: ext mismatch [need yuv]
video name=gray ext=raw: ext mismatch [need yuv]
video name=422 ext=raw: ext mismatch [need yuv]
video name=422p ext=raw: ext mismatch [need yuv]
video name=4mpeg ext=yuv: OK
raw / video: 12 bit YUV 4:2:0 (planar) / audio: none
devlist_probe: checking existing entries ...
devlist_probe: probing dvb devices ...
open(/dev/dvb/adapter0/frontend0): No such file or directory
open(/dev/dvb/adapter0/frontend0): No such file or directory
open(/dev/dvb/adapter1/frontend0): No such file or directory
open(/dev/dvb/adapter1/frontend0): No such file or directory
open(/dev/dvb/adapter2/frontend0): No such file or directory
open(/dev/dvb/adapter2/frontend0): No such file or directory
open(/dev/dvb/adapter3/frontend0): No such file or directory
open(/dev/dvb/adapter3/frontend0): No such file or directory
devlist_probe: probing v4l2 devices ...
open(/dev/video1): No such file or directory
open(/dev/video2): No such file or directory
open(/dev/video3): No such file or directory
device_probe_video: /dev/video0: add
devlist_probe: probing v4l devices ...
open(/dev/video1): No such file or directory
open(/dev/video2): No such file or directory
open(/dev/video3): No such file or directory
device_probe_video: /dev/video0: seen, skipping
devlist_probe: probing xv devices ...
Violación de segmento
--

Hmm... algo no cuadra...

Paso 4:
Cambio el fichero "xawtv/console/Subdir.mk":

--
console/streamer : LDLIBS += $(THREAD_LIBS) $(ICONV_LIBS) -ljpeg -lm
#console/streamer : LDLIBS += -shared $(THREAD_LIBS) $(ICONV_LIBS) -ljpeg -lm -o libstreamer.so
--

Paso 5:
Compilo el ejecutable "streamer";
ejecuto el programa "streamer"

--
checking writer files [multiple image files] ...
video name=ppm ext=ppm: ext mismatch [need yuv]
video name=pgm ext=pgm: ext mismatch [need yuv]
video name=jpeg ext=jpeg: ext mismatch [need yuv]
checking writer raw [single file, raw video data] ...
video name=rgb ext=raw: ext mismatch [need yuv]
video name=gray ext=raw: ext mismatch [need yuv]
video name=422 ext=raw: ext mismatch [need yuv]
video name=422p ext=raw: ext mismatch [need yuv]
video name=4mpeg ext=yuv: OK
raw / video: 12 bit YUV 4:2:0 (planar) / audio: none
devlist_probe: checking existing entries ...
devlist_probe: probing dvb devices ...
open(/dev/dvb/adapter0/frontend0): No such file or directory
open(/dev/dvb/adapter0/frontend0): No such file or directory
open(/dev/dvb/adapter1/frontend0): No such file or directory
open(/dev/dvb/adapter1/frontend0): No such file or directory
open(/dev/dvb/adapter2/frontend0): No such file or directory
open(/dev/dvb/adapter2/frontend0): No such file or directory
open(/dev/dvb/adapter3/frontend0): No such file or directory
open(/dev/dvb/adapter3/frontend0): No such file or directory
devlist_probe: probing v4l2 devices ...
open(/dev/video1): No such file or directory
open(/dev/video2): No such file or directory
open(/dev/video3): No such file or directory
device_probe_video: /dev/video0: add
devlist_probe: probing v4l devices ...
open(/dev/video1): No such file or directory
open(/dev/video2): No such file or directory
open(/dev/video3): No such file or directory
device_probe_video: /dev/video0: seen, skipping
devlist_probe: probing done
using: device configuration "BT878 video (AVerMedia TVCaptur":
bus = PCI:0000:05:09.0
video = /dev/video0
dvb = [unset]
sndrec = [unset, using default]
sndplay = [unset, using default]
mixer = [unset, using default]
control = [unset]
movie_init_writer start
setformat: 12 bit YUV 4:2:0 (planar) (352x240): ok
writer_video_thread start [pid=20599]
movie_init_writer end (h=0x9079c68)
movie_writer_start
movie_writer_stop/r: -0.00s [0], a/v: -0.00s [0]
writer_video_thread done
Oops: fifos is 1 (expected 0) [common/fifo.c:fifo_check:13
--

Saludos...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Convertir un programa en una libreria dinamica

Publicado por n0str0m0 (1503 intervenciones) el 19/10/2006 21:43:08
Hola,

Joe, menuda duda que tienes! Bueno, no soy un experto en bibliotecas, pero me ha extrañado no ver el -fPIC:

gcc -c -fPIC streamer.c

y luego ya hacer el -shared?

el PIC le dice al código que haga un Place Independent Code, para que el código se cargue en una zona no fija del espacio de memoria del proceso. No sé si será eso.

De cualquier modo, yo haría una traza con gdb.

Salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Convertir un programa en una libreria dinamica

Publicado por Tom (482 intervenciones) el 23/10/2006 11:38:58
Pues no sé, a mí me parece que lo estás haciendo bien. Sólo se me ocurre que mires los permisos con que ejecutas "streamer" (el que funciona) y los que tiene tu programa (el que linkas con libstreamer.so).

Y, ¿has comprobado con cuidado que "streamer" (programa) no usa variables globales de las que te has olvidado en libstreamer.so?

Otra tontería, haz "ldd streamer" para ver las libs con que está linkado y comparalo con "ldd miprograma" no sea que alguna versión de alguna no sea la misma ...

(ah! y lo que te han comentado del -fPIC, tambien)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar