LinuxForum.Fans
Тема

MPlayer и неверно указанные пути к встроенной libdvdread4

Автор: yars 24 сообщений 9575 просмотров
#310789

Доброго времени!
Собираю версию 1.1:

Показать
text

...
./configure \
--extra-cflags="$SLKCFLAGS" \
--target=$ARCH-slackware-linux \
--prefix=/usr \
--confdir=/etc/mplayer \
--mandir=/usr/man \
--libdir=/usr/lib${LIBDIRSUFFIX} \
--enable-gui \
--enable-menu \
--enable-dynamic-plugins \
--enable-gl \
--with-xvmclib=XvMCNVIDIA \
--with-vidix-drivers=nvidia \
--enable-fbdev \
--disable-arts \
--disable-pulse \
--disable-ossaudio \
--disable-esd \
--disable-jack \
--disable-nas \
--disable-sgiaudio \
--disable-sunaudio \
--disable-kai \
--disable-dart \
--disable-win32waveout \
--disable-radio \
--disable-radio-v4l2 \
--disable-radio-bsdbt848 \
--disable-tv \
--disable-tv-v4l1 \
--disable-tv-v4l2 \
--disable-tv-bsdbt848 \
--disable-bluray \
--disable-dvb \
--enable-libdvdcss-internal \
--enable-dvdread-internal \
--disable-unrarexec \
--disable-inet6 \
--disable-ftp \
--disable-win32dll \
--disable-pvr \
--disable-cddb \
--disable-w32threads \
--charset=utf-8 \
--language-doc=en,ru \
--language-man=en,ru \
--language-msg=ru \
--language=en,ru
...

Не собирается, ругается на разные файлы, что "нет такого файла", например, очередная попытка:

text
libdvdnav/read_cache.c:37:31: fatal error: dvdread/nav_types.h: No such file or directory
compilation terminated.

Исправляю патчем, утыкаюсь в следующий, снова делаю патч... Это все понятно и вопросов не вызывает. Но меня терзают сомнения, а на верном ли я пути? И стоит ли после победы отправить отчет и патчи разработчикам?
AlienBOB собирал по-другому, но там, по-моему, тоже куча проблем, логов не сохранилось.
UPD: Со штатным libdvdread-4.2.0 тоже не собирается...

#310834

У AlienBOB-а сейчас лежит слакбилд для 1.1.2 (там в одном месте случайный перевод строки, нужно поправить, это несложно, вот тут:
&& git checkout $(git rev-list -n 1 --before="`date -d $SRCVER`" $BRANC
H) \
), не пойдёт?
Попробовать собрать? Собранные пакеты там тоже рядом.

ps. http://taper.alienbase.nl/mirrors/people/alien/slackbuilds/ffmpeg/
pps. Собранные лучше брать там: http://taper.alienbase.nl/mirrors/people/alien/restricted_slackbuilds/ffmpeg/

#310844

Хм. Перевод строки - мелочь, я и сам бы нашел :)

"bormant" написал:
ps.
pps.

Спасибо, попробую, но сначала, пожалуй, дожму свой.

#310855

Приехали:

text
libdvdcss/ioctl.c:273:5: error: #error "DVD ioctls are unavailable on this system"

Это еще почему??? Закон был в Америке на эту тему?
И да, эта же версия (1.1) от Alien'а просит:

If you want to play encrypted DVD's you need to install libdvdcss separately.

и по умолчанию:

text
USE_PATENTS:-"NO"

и MPlayer будет собираться с

text
DO_PATENTED="--disable-libdvdcss-internal \
               --disable-mp3lame --disable-mp3lame-lavc \
               --disable-libopencore_amrnb \
               --disable-libopencore_amrwb"

Значит, в связи с этим законом, код, который позволяет смотреть DVD, удалили? Что ж, пойду собирать-ставить внешнюю libdvdcss...

#310880

У нас с вами какой-то разный Интернет, по ссылкам в ps

text

#USE_PATENTS="NO"
USE_PATENTS=${USE_PATENTS:-"YES"}

первая строка с комментарием -- "#" в начале строки.

#310885

Там 1.1.2, а я собирал 1.1, взятую с сайта MPlayer'a, слакбилдом Alien'а, который есть на диске с исходниками Slackware-14, еще есть checkout недельной давности, попробую с ним. Не получится (а, скорее всего, так и будет) - попробую тогда ваши ссылки. Но, думаю, тут дело не в версии плеера, а в том, что он почему-то не видит заголовки {dvd,dvdio}.h и еще какой-то.

#311000

При сборке версии 1.1 патчить пришлось файлы:

Показать
text

./libdvdnav/vm/decoder.c
./libdvdnav/dvdnav.c
./libdvdnav/dvdnav/dvdnav.h
./libdvdnav/highlight.c
./libdvdread4/dvdread/ifo_read.h
./libdvdread4/dvdread/ifo_types.h
./libdvdnav/navigation.c
./libdvdnav/read_cache.c
./libdvdnav/remap.c
./libdvdnav/searching.c
./libdvdnav/settings.c
./stream/stream_dvd_common.h
./stream/stream_dvd.h
./libdvdnav/vm/vm.c
./libdvdnav/vm/vmcmd.c

А все дело в том, что в них встречается следующее:

Показать
text
*** ./libdvdnav/vm/decoder.c.orig    2013-03-22 22:52:46.013316212 +0400
--- ./libdvdnav/vm/decoder.c    2013-03-22 22:53:19.459638556 +0400
***************
*** 30,37 ****
  #include <limits.h>
  #include <string.h>  /* For memset */
  #include <sys/time.h>
! #include <dvdread/nav_types.h>
! #include <dvdread/ifo_types.h> /* vm_cmd_t */
  
  #include "dvdnav/dvdnav.h"
  #include "remap.h"
--- 30,37 ----
  #include <limits.h>
  #include <string.h>  /* For memset */
  #include <sys/time.h>
! #include <libdvdread4/dvdread/nav_types.h>
! #include <libdvdread4/dvdread/ifo_types.h> /* vm_cmd_t */
  
  #include "dvdnav/dvdnav.h"
  #include "remap.h"

И примерно такие изменения нужно сделать во всех этих файлах. Цель - воспроизведение DVD без выкачивания "стороннего" ПО, например, того же ffmpeg - в MPlayer же все для этого и так есть.
Внешняя libdvdcss версии

text
ls -l /var/log/packages/libdvdcss-1.2.13-i486-1_yars 
-rw-r--r-- 1 root root 2862 марта 23 01:11 /var/log/packages/libdvdcss-1.2.13-i486-1_yars

была взята с http://developers.videolan.org/libdvdcss/. Но это все равно не решает проблему с DVD ioctl's, и выходит, ее отдельность значения не имеет. *SCRATCH*
UPD: Собственно проблема, с которой началась тема - решается патчами, подобными приведенному.

#311060

В таких случаях

-#include <dvdread/nav_types.h>
+#include <libdvdread4/dvdread/nav_types.h>

достаточно предать дополнительный путь к заголовочным файлам, добавить в CFLAGS / CXXFLAGS
-I/usr/include/libdvdread4

или, если используется pkgconfig, проверить и, если нужно, исправить пути к заголовкам в его файлах, а исходники патчить не надо.


ps. Правильно заданный вопрос всегда содержит более половины ответа. Указали бы на предмет патченья раньше, не пришлось бы выполнять бессмысленную работу.

pps. libdvdcss -- это про http://ru.wikipedia.org/wiki/Content_Scramble_System , а не про DVD ioctl.

#311065

Спасибо, учту на будущее.

#311069
"bormant" написал:
Указали бы на предмет патченья раньше

Ну, в первом сообщении же есть строчка с ошибкой...

"bormant" написал:
DVD ioctl.

C этим отдельная проблема, она вылезла уже после того, как я разобрался с патчами, вот теперь думаю, как бы ее победить. В системе заголовочные файлы dvd.h, cdio.h присутствуют, но нету dvdio.h, соответсвенно, configure выдает:

text

...
Checking for sys/dvdio.h ... no 
Checking for sys/cdio.h ... no 
Checking for linux/cdrom.h ... yes 
Checking for dvd.h ... no 
...
Checking for VCD support ... no (not supported on this OS)
...
Checking for dvdread ... yes (external)
Checking for internal libdvdcss ... no 
Checking for libcdio ... yes 
Checking for cdparanoia ... no (using libcdio)
...
Checking for DVD support (libdvdnav) ... no

Пойду искать пакет, в который dvdio.h входит...

#311084

"yars⇓" написал:
в первом сообщении же есть строчка с ошибкой...
но нет строчки с исправлением...
А как иначе догадаться, что проблема
fatal error: dvdread/nav_types.h: No such file or directory
не в том, что чего-то не хватает, а в том, что оно лежит по другому пути. А как только это стало видно:
-#include <dvdread/nav_types.h>
+#include <libdvdread4/dvdread/nav_types.h>
так и соответствующее решение сразу видно -- добавить в пути поиска заголовочных файлов, в которых происходит поиск (в угловых скобках #include <...>).
#311087
"bormant" написал:
но нет строчки с исправлением...

Ну, на тот момент у меня не все патчи были готовы, если кому-нибудь они нужны, могу выложить.
UPD: Конечно, да, указать эти пути в CFLAGS/CXXFLAGS правильнее, но раз в исходниках пути неверные, то нужен кто-то, кто бы их наконец исправил :)

#311088

yars,
не нужны там патчи исходников. Или слакбилда, или Makefile-а максимум.

#311120
bormant написал:
В таких случаях
достаточно предать дополнительный путь к заголовочным файлам, добавить в CFLAGS / CXXFLAGS
-I/usr/include/libdvdread4

Сорри за вторжение, но возник аналогичный вопрос по сборке hotot из git. Инклюды Qt разбросаны по директориям /usr/lib/qt/include/other_dir. Каким образом их указывать в CFLAGS / CXXFLAGS чтобы были видны инклюды из всех этих other_dir ?

#311128

Как-то так:

text
-I/usr/lib/qt/include/other_dir -I/usr/lib/include/some_dir
#311130

Компилятор ищет включаемые директивой #include <...> файлы в наборе путей, аналогично тому, как ищется исполняемый файл в путях переменной PATH.
Набор путей задаётся переменной окружения CPATH для всего набора gcc, C_INCLUDE_PATH для C, CPLUS_INCLUDE_PATH для C++, а также параметром командной строки -I, который может повторяться более одного раза, добавляя пути в набор поиска. Подробнее в gcc(1).
Если включение файлов выглядит как
#include <other_dir/header>
, достаточно добавить в пути поиска
/usr/lib/qt/include
. Если как
#include <header>
, то придётся перечислить необходимые
/usr/lib/qt/include/other_dir
.
Вообще говоря, указанная задача правильного указания набора путей, обеспечивающих сборку, лежит на разработчике. Ему в этом помогают autotools, pkgconfig, ... Но если дистрибутив имеет особенности, которые трудно было предвидеть при разработке, имеющимися средствами вполне возможно наставить на путь истинный в обоих смыслах.

#311136
yars написал:
Как-то так:
text
-I/usr/lib/qt/include/other_dir -I/usr/lib/include/some_dir

Да вот не катит почему то.

#311137

Задавал перечисления -I/1 -I/2 -I/3, видит только 1

#311151

SergMarkov,
можно конкретный пример того, что в файле в #include, и того, что в команде?

text

$ mkdir -p /home/bld/include/inc{1,2,3}
$ for n in 1 2 3; do echo -e "#define INC$n $n" > /home/bld/include/inc$n/inc$n.h; done
$ find /home/bld/include/
/home/bld/include/
/home/bld/include/inc1
/home/bld/include/inc1/inc1.h
/home/bld/include/inc2
/home/bld/include/inc2/inc2.h
/home/bld/include/inc3
/home/bld/include/inc3/inc3.h

$ cat <<EOF >tst.c #include <stdio.h> #include <inc1/inc1.h> #include <inc2/inc2.h> #include <inc3/inc3.h>

void main(void) { printf("%d, %d, %d\n", INC1, INC2, INC3); } EOF

$ gcc tst.c tst.c:2:23: фатальная ошибка: inc1/inc1.h: Нет такого файла или каталога компиляция прервана.

Добавляем пути к заголовкам:

text

$ gcc -I/home/bld/include -o tst tst.c
$ ./tst
1, 2, 3

Другой вариант:

text

$ cat <<EOF >tst2.c
#include <stdio.h>
#include <inc1.h>
#include <inc2.h>
#include <inc3.h>

void main(void) { printf("%d, %d, %d\n", INC1, INC2, INC3); } EOF $ gcc -I/home/bld/include/inc{1,2,3} -o tst2 tst2.c $ ./tst2 1, 2, 3

Башизм раскроется в 3 директивы -I/...

Войдите или зарегистрируйтесь, чтобы ответить.