CoreAvc en Linux... un fiasco!!!

Enviado por darkblacklife el 10 Agosto, 2009 - 01:44.

Bueno, no se que es esto del blog, si alguien lo lee o no... quería comentar un pequeño experimento que hice...

Dejando de lado cuestiones morales y legales, desde un punto de vista netamente científico podría ser interesante evaluar un codec propietario (de como 15$ dolares), el "famoso" CoreAvc. En mi caso puede ser útil para reproducir una película que requiere del codec h264... El origen de esa película no es relevante para este estudio científico libre de todo tipo de restricción moral. Solo digamos que tiene las siguientes características:

***                 runtime : 188 mins                      ***
***                   video : 8537 kbps                     *** 
***                   audio : 1509 DTS                      ***
***              resolution : 1920x800                      ***
***                    size : 13402 MB                      ***

Bastante pesadita para mi pentium 4 de 64 bit (em64t) de 2.8Ghz con solo 512mb de ram y una placa de video geforce 6500 de esas que no tienen todos esos soportes de decodificación por hardware como las más modernas... Además mi monitor solo soporta hasta 1024x768, no le saco todo el jugo a la película pero planeo un día volverme rico (conociendo una chica rica) y comprarme otro monitor para ver con mas detalle la misma película que ya tengo en mi poder...

Esto me funciona pero desfasa audio:
$ mplayer -lavdopts skiploopfilter=all:fast=1 -vo xv PELICULA.mkv
Este otro no desfasa audio pero entrecorta un poco la imagen:
$ mplayer -lavdopts skipframe=nonref:skiploopfilter=all:fast=1 -vo xv PELICULA.mkv
Este entrecorta un poco menos:
$ mplayer -zoom -x 1024 -y 426 -demuxer lavf -demuxer mkv -vc ffh264 -vo xv -lavdopts threads=2:fast=1:skiploopfilter=all -sws 0 -framedrop -ni -nocache -nocorrect-pts PELICULA.mkv

Y no me van quedando muchas más posibilidades, así que cuando vi en la web de mplayer que existía una forma de patchearlo para que ande con el coreavc, decidí comprobarlo... Hacer esto parece que es completamente legal si no existe soporte oficial y siempre que se adquiera legalmente la copia de instalación para windows. Coreavc se jacta de ser lo mejor de lo mejor, así que me dispuse a hacer la prueba de compilar el mplayer en una carpeta para probar la eficiencia del super-codec comercial...

Lo siguiente a alguno podrá servirle como "guía de instalación" aunque no pretende serlo, solo un listado de pasos seguidos para que pueda ser reproducido por el interesado para corroborar o objetar mis conclusiones (dije que era un estudio científico :) ) ...

Nunca me ha parecido que exista una guía "elegante" de que paquetes de desarrollo se deben instalar para compilar mplayer según el interés de cada uno pero quizás es cosa mía... En particular yo tenía necesidades satisfechas por estos paquetes:

GNU make 3.81 or later
make (si alguna vez se compiló alguna aplicación seguro ya está instalado)

binutils - GNU binutils 2.11 or later is known to work.
Este programa es el responsable de generar instrucciones MMX/3DNow!/etc, por lo tanto muy importante.
binutils binutils-dev

compiler - We mostly use gcc, the recommended versions on x86 are 2.95 and 3.4+. On PowerPC, use 4.x+. icc 10.1+ is also known to work.
Son los paquetes: gcc gcc-X.X gcc-X.X-base (seguramente ya están instalados)

Xorg/XFree86 - recommended version is 4.3 or later. Make sure the development packages are installed, too, otherwise it won't work. You don't absolutely need X, some video output drivers work without it.
Versión sugerida siempre la más nueva (4.3). Normalmente, todos quieren esto, desde XFree 4.0.2, viene con la extensión XVideo (referida en varios lugares como Xv) que se usa en efecto para activar la aceleración YUV por hardware (mostrado rápido de imagen) en placas que lo soportan. Asegúrese que el paquete de desarrollo este también instalado, de otra manera no funcionará.
Si ya se están usando las 'X' solo harán falta: xorg-dev xserver-xorg-dev
Respecto a 'xv' quizás también se necesita: libxv-dev

FreeType - 2.0.9 or later is required for the OSD and subtitles
libfreetype6 libfreetype6-dev

ALSA - optional, for ALSA audio output support. At least 0.9.0rc4 is required.
alsa-base (ya debe estar instalado si se tiene audio)
para que la compilación reconozca harán falta: libasound2-dev libsoundtouch1-dev

directfb - optional, 0.9.13 or later required for the directfb video output driver
libdirectfb-1.2-0 libdirectfb-dev

zlib - recommended, many codecs use it.
zlib1g zlib1g-dev

codecs... para por la dudas tener el h264 original y para tener el codec de audio de la película a la que hago referencia
harán falta libdts-dev libdca-dev libx264-dev

A mí solo me faltó instalar:
# aptitude install binutils-dev xorg-dev xserver-xorg-dev libxv-dev libasound2-dev libsoundtouch1-dev libdts-dev libdca-dev libx264-dev
(y sus dependencias)

El fuente de 'mplayer' se descarga haciendo:
$ svn checkout svn://svn.mplayerhq.hu/mplayer/trunk mplayer

El patch junto con aplicaciones a compilar se descarga de googlecode:
$ svn checkout http://coreavc-for-linux.googlecode.com/svn/trunk/ coreavc-for-linux
(En este momento dice que "Revisión obtenida: 82")

A mi lo único que me sirve (con mis 64 bit) es el patch en 'coreavc-for-linux/mplayer/dshowserver.patch'

Pero ese patch tiene problemas por que el fuente de 'mplayer' cambió un poco...
No importa, corrijo el patch a mano solo es cuestión de cambiar los números de línea revisando los archivos a patchear, lo cual es algo tedioso pero posible... finalmente se aplica exitosamente el patch:

$ cd mplayer
$ patch -p0 < ../dshowserver.patch
patchea a 'libmpcodecs/vd.c' y 'Makefile' y crea 'libmpcodecs/vd_dshowserver.c'

La carpeta 'coreavc-for-linux' tiene otras aplicaciones que en 64 bit no compilan y que a mi me queda más cómodo bajar el binario (que hacerme de un sistema de 32 bit)...

Bueh... para no estropear demasiado mi actual instalación de mplayer, hago otro pequeño patch a mano, en 'get_path.c' (fuentes del mplayer)
remplazo: static char *config_dir = "/.mplayer";
por es otro: static char *config_dir = "/.mplayer-coreavc";
(así usa directorio de configuración distinto)

Además ajusto configuración para que mplayer se instale en una carpeta del home llamada 'mplayer_coreavc':
$ ./configure --disable-mencoder --enable-fbdev --enable-tdfxfb --prefix=$HOME/mplayer_coreavc --bindir=$HOME/mplayer_coreavc --datadir=$HOME/mplayer_coreavc --mandir=$HOME/mplayer_coreavc --confdir=$HOME/mplayer_coreavc --libdir=$HOME/mplayer_coreavc --codecsdir=$HOME/mplayer_coreavc --win32codecsdir=$HOME/mplayer_coreavc --xanimcodecsdir=$HOME/mplayer_coreavc --realcodecsdir=$HOME/mplayer_coreavc

Compilo
$ make
$ make install

A decir verdad daba una pequeña falla como usuario ordinario ... igual no parecía afectar el funcionamiento luego de instalado... acá las dos salidas como usuario y como root:

$ make install
cc -MM -Wundef -Wdisabled-optimization -Wno-pointer-sign -Wdeclaration-after-statement -std=gnu99 -Wall -Wno-switch -Wpointer-arith -Wredundant-decls -O4 -march=native -mtune=native -pipe -ffast-math -fomit-frame-pointer -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -Ilibdvdread4 -I.  -D_REENTRANT -I/usr/include/directfb  -I/usr/include/freetype2   libmpcodecs/ve_x264.c | sed -e "s,[0-9a-z._-]*: \([a-z0-9/]*/\)[^/]* ,\1&," -e "s,\(.*\)\.o: ,\1.d &," > libmpcodecs/ve_x264.d
/bin/sh: cannot create libmpcodecs/ve_x264.d: Permission denied
cc -MM -Wundef -Wdisabled-optimization -Wno-pointer-sign -Wdeclaration-after-statement -std=gnu99 -Wall -Wno-switch -Wpointer-arith -Wredundant-decls -O4 -march=native -mtune=native -pipe -ffast-math -fomit-frame-pointer -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -Ilibdvdread4 -I.  -D_REENTRANT -I/usr/include/directfb  -I/usr/include/freetype2   libao2/ao_alsa.c | sed -e "s,[0-9a-z._-]*: \([a-z0-9/]*/\)[^/]* ,\1&," -e "s,\(.*\)\.o: ,\1.d &," > libao2/ao_alsa.d
/bin/sh: cannot create libao2/ao_alsa.d: Permission denied
cc -MM -Wundef -Wdisabled-optimization -Wno-pointer-sign -Wdeclaration-after-statement -std=gnu99 -Wall -Wno-switch -Wpointer-arith -Wredundant-decls -O4 -march=native -mtune=native -pipe -ffast-math -fomit-frame-pointer -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -Ilibdvdread4 -I.  -D_REENTRANT -I/usr/include/directfb  -I/usr/include/freetype2   stream/ai_alsa1x.c | sed -e "s,[0-9a-z._-]*: \([a-z0-9/]*/\)[^/]* ,\1&," -e "s,\(.*\)\.o: ,\1.d &," > stream/ai_alsa1x.d
/bin/sh: cannot create stream/ai_alsa1x.d: Permission denied
install -d /home/Mi_usuario/mplayer_coreavc /home/Mi_usuario/mplayer_coreavc /home/Mi_usuario/mplayer_coreavc
install -m 755 -s mplayer /home/Mi_usuario/mplayer_coreavc
install -d /home/Mi_usuario/mplayer_coreavc/man1
install -m 644 DOCS/man/en/mplayer.1 /home/Mi_usuario/mplayer_coreavc/man1/
$ su
# make install
cc -MM -Wundef -Wdisabled-optimization -Wno-pointer-sign -Wdeclaration-after-statement -std=gnu99 -Wall -Wno-switch -Wpointer-arith -Wredundant-decls -O4 -march=native -mtune=native -pipe -ffast-math -fomit-frame-pointer -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -Ilibdvdread4 -I.  -D_REENTRANT -I/usr/include/directfb  -I/usr/include/freetype2   libmpcodecs/ve_x264.c | sed -e "s,[0-9a-z._-]*: \([a-z0-9/]*/\)[^/]* ,\1&," -e "s,\(.*\)\.o: ,\1.d &," > libmpcodecs/ve_x264.d
cc -MM -Wundef -Wdisabled-optimization -Wno-pointer-sign -Wdeclaration-after-statement -std=gnu99 -Wall -Wno-switch -Wpointer-arith -Wredundant-decls -O4 -march=native -mtune=native -pipe -ffast-math -fomit-frame-pointer -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -Ilibdvdread4 -I.  -D_REENTRANT -I/usr/include/directfb  -I/usr/include/freetype2   libao2/ao_alsa.c | sed -e "s,[0-9a-z._-]*: \([a-z0-9/]*/\)[^/]* ,\1&," -e "s,\(.*\)\.o: ,\1.d &," > libao2/ao_alsa.d
cc -MM -Wundef -Wdisabled-optimization -Wno-pointer-sign -Wdeclaration-after-statement -std=gnu99 -Wall -Wno-switch -Wpointer-arith -Wredundant-decls -O4 -march=native -mtune=native -pipe -ffast-math -fomit-frame-pointer -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -Ilibdvdread4 -I.  -D_REENTRANT -I/usr/include/directfb  -I/usr/include/freetype2   stream/ai_alsa1x.c | sed -e "s,[0-9a-z._-]*: \([a-z0-9/]*/\)[^/]* ,\1&," -e "s,\(.*\)\.o: ,\1.d &," > stream/ai_alsa1x.d
install -d /home/Mi_usuario/mplayer_coreavc /home/Mi_usuario/mplayer_coreavc /home/Mi_usuario/mplayer_coreavc
install -m 755 -s mplayer /home/Mi_usuario/mplayer_coreavc
install -d /home/Mi_usuario/mplayer_coreavc/man1
install -m 644 DOCS/man/en/mplayer.1 /home/Mi_usuario/mplayer_coreavc/man1/

Luego se crea esta carpeta:
$ mkdir ~/.mplayer-coreavc
Y se copia la información de los codecs (desde la carpeta de compilación):
$ cp ./etc/codecs.conf ~/.mplayer-coreavc/
Y se agrega esto al final de ese archivo:

videocodec coreserve
  info "CoreAVC DShow H264 decoder 1.3 for x86 - http://corecodec.org/"
  status working
  format 0x10000005
  fourcc H264,h264 H264
  fourcc X264,x264
  fourcc avc1,AVC1 AVC1
  fourcc davc,DAVC
  fourcc VSSH
  driver dshowserver
  dll "CoreAVCDecoder.ax"
  guid 0x09571a4b, 0xf1fe, 0x4c60, 0x97, 0x60, 0xde, 0x6d, 0x31, 0x0c, 0x7c, 0x31
  out YV12,IYUV,I420,YUY2

Necesito un par de archivos para usar las aplicaciones que no puedo compilar en 64 bit:
http://coreavc-for-linux.googlecode.com/files/dshowserver-ia32-r63-gento...
http://itsuki.fkraiem.org/stuff/dshowserver-ia32-r82.tar.bz2

Resulta que debo usar el 'registercodec' de r63 y el 'dshowserver' del r82 (por que los otros no andan)
Ya se que es una mezcla re-chota pero la otra alternativa es compilarlos uno mismo en un sistema de 32 bits. A estos programas los debo ubicar en '/usr/local/bin' o poner enlaces en estos a la verdadera ubicación de los archivos. Quizás esto se podría evitar si se patcheara y compilaran (en vez de usar binarios) para que todo sea leído en la carpeta 'mplayer-coreavc' (y tener todo este software apócrifo en una carpeta aislada del resto del software libre y bello)... pero bueno, es una alternativa

A su vez, a no ser que se implemente ese patch que decía, estas aplicaciones requieren que 'CoreAVCDecoder.ax' (instalada por el instalador para windows, en windows o wine en '/Archivos de programa/CoreCodec/CoreAVC Professional Edition/') sea copiada y ubicada o linkeada en '/usr/lib/win32' junto con una libreria de windows 'nvcuvid.dll'... Una copia de este .dll se puede conseguir en esta dirección (dentro del zip)... desconozco si es legal o no la utilización y distribución de esta .dll pero asumo que si lo es (¡Es solo una inocente .dll! no nos pongamos paranoicos)

Debe entonces registrarse el codec...

Nuevamente el archivo que se genera con el registro debe estar ubicado en ~/.mplayer y no en ~/.mplayer-coreavc a no ser que se haga un patch en las aplicaciones y se las compile personalmente, sino habrá fallas al ejecutar el mplayer para ese codec...
$ export REGISTRY=$HOME/.mplayer/registry32
$ registercodec -r $REGISTRY -k "HKLM\\Software\\CoreCodec\\CoreAVC Pro\\Serial" -v "7GIGU-7QTED-CORE-80GR0-3BP7C"
Creating new registry
00000037 -- 29

(Aca se debería cambiar '7GIGU-7QTED-CORE-80GR0-3BP7C' por el número de registro que corresponda a la copia legalmente adquirida del codec 'coreavc'...)

Checkeando que todo está ok (así dice la web del projecto que se haga el checkeo)...
$ dshowserver -c CoreAVCDecoder.ax -s 1280x720 -g 09571a4b-f1fe-4c60-9760de6d310c7c31 -b 12 -f 0x34363248 -o 0x30323449

No id specified, assuming test mode
Opening device
Called unk_IsDebuggerPresent
len: 992
ProductVersion: 1.9.5
Decoder supports the following YUV formats: YUY2 UYVY YV12 I420
Decoder is capable of YUV output (flags 0x2b)
Setting fmt
Starting
Initialization is complete

Esta es una posible configuración para el codec (más info en la web del projecto):
$ registercodec -r $REGISTRY -k "HKLM\\Software\\IniFileMapping\\CoreAVC\\Settings\\C:\\coreavc.ini" -v "ilevels=2 olevels=2 di=3 deblock=7 ai=0 crop1088=0 vmr_ar=0"

Acá intentos de reproducir la película en mi monitor a 1024x768:
$ cd ~/mplayer-coreavc

Esto se ve bien pero va más lento que el sonido y se va desfasando cada vez más:

$ ./mplayer -zoom -x 1024 -y 426 -demuxer mkv -vc coreserve PELICULA.mkv

Este corre a buena velocidad pero la imagen se deforma toda:

$ ./mplayer -zoom -x 1024 -y 426 -demuxer lavf -demuxer mkv -vc coreserve -vo xv -lavdopts threads=2:fast=1:skiploopfilter=all -sws 0 -framedrop -ni -nocache -nocorrect-pts PELICULA.mkv

La verdad es que me anda mejor el codec gratuito que usa mplayer, osea se me desfasa el sonido pero mucho menos que con este super codec comercial... Ahora se que hubiese sido un desperdicio de dinero... :) jejeje

Pero hablando en serio, yo había leído maravillas de este codec y resulta que la opción libre tiene un mejor desempeño (insuficiente pero mejor)... Claro que uno de los problemas es que el codec debe ser wrapeado con el 'dshowserver' para que ande en 64 bit... además en varios lados dicen que es un codec que aprovecha mejor los núcleos múltiples... pero el mío es un núcleo simple... Al menos en mi equipo y siguiendo estos pasos anda mejor la alternativa libre...

Imagen de MinistroPepon
Enviado por MinistroPepon el 10 Agosto, 2009 - 12:52.

Tiene un alto consumo de cpu?

si es así, kizá con un múltiple núcleo se arregle, pero si no es así, te va a dar igual, no?

Imagen de darkblacklife
Enviado por darkblacklife el 10 Agosto, 2009 - 15:51.

durante la reproducción el 'htop' arroja un 100% de uso de cpu con cualquiera de los dos codecs, y como dije, anda mejor el que es libre...

Ya en un pasado había observado que el desempeño en windows xp (32 bit) mismo configuración de equipo para el CoreAvc era inferior al desempeño en linux de 64 bit... supuse que era por culpa del gran consumo de recursos que el windows en si se lleva y que quizás usando un sistema operativo como linux que consume menos recursos y con el extra de correr a 64 bit tenía una ventaja.... También probé el mplayer para windows y andaba un poco mejor y supuse que se debía a que el CoreAvc no se aprovechaba bien ejecutandolo con el reproductor de windows (mediaplayer?) y que de tener la posibilidad de usarlo en mplayer hubiera andado mejor....

Bueno ahora tuve la posibilidad de testearlo en linux, a 64 bit, y con el mplayer, todo a favor y sin embargo el desempeño no aumenta... quizás funcionaría mejor que el codec libre si tuviera núcleos múltiples y sospecho que por otro lado no debe tener optimización a 64 bit e incluso el hecho de tener que wrappearlo debe jugar en contra... la cosa es que si me equipo tuviera un poquito más de "potencia" por encima de los aproximadamente 2.8 Ghz (valor que no se si se llega a alcanzar nunca) debería funcionar adecuadamente con el codec libre y el coreavc seguiría siendo insuficiente...


Autor

Archivo

    Categorías