Цитата
кстати, а почему ты на channelscan решил обратить взор ? а не на reelchannelscan остаться ?
как ты думаешь ... а чем они отличаются?
Цитата
кстати, а почему ты на channelscan решил обратить взор ? а не на reelchannelscan остаться ?
как ты думаешь ... а чем они отличаются?
ну, channelscan и reelchannelscan - 2 разных плагина от двух авторов - imho
Первый плагин уже более 2 лет не обновлялся -
Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.
он у меня, кстати и не собрался
src/channelscan# make all
g++ -O2 -Wall -Woverloaded-virtual -fPIC -c -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"channelscan"' -I/usr/include/freetype2 -I../../../include -I../../../../DVB/include channelscan.c
channelscan.c:89: error: extra qualification 'cMainMenu::' on member 'ShowSatData'
make: *** [channelscan.o] Error 1
ну, а reelchannelscan обновился аж в мае - с ним то мы и работаем. Поэтому, когда Кураж заговорил про channelscan (имея ввиду reelchannelscan) я и насторожился - зачем он перешел на давно не обновляемый channelscan.
ээээ - плагин от одних авторов - от reel - только исходные 043 назывались почему то
chennelscan - хотя при сборке собираются reelchannelscan - отсюда и путаница ))))
решил для понимания вопроса о загрузке и редактирования channels.conf в вдр несколько распрямить и упростить извилистый путь
связанный с channels.conf в качестве подхода к пониманию как добавить в вдр возможность
1) работы с несколькими ссписками каналов
2) вставку канала не в конец списка а после текущего канала
3) вставку метки
ээээ - что я из всего этого распрямления понял
- считывается параметр ConfigDirectory
- считывается файл channels.conf в Channels через Channels.Load который в свою очередь выполняет
DeleteDuplicateChannels() и ReNumber() (которым в свою очередь нужны и HashChannel GroupSep ChannelSorter которым///
в-общем дальше не полезу - пока этого достаточно для понимания как производится загрузка channels.conf
- скидывается Channels в файл либо по таймауту либо после модификации - выполняется Channels.Lock -> Channels.Save -> Channels.Unlock
в-общем нужна помощь темному - как реализуется Channels.Load Channels.Lock Channels.Save Channels.Unlock ?
или можно не заморачиваться с поиском а просто ими пользоваться?
кусок из vdr.c отвечающий за загрузку и сохранение channels.conf
# устанавливаем конфиг дир или нулевую по умолчанию или берем из опций "с"
const char *ConfigDirectory = NULL;
int c;
while ((c = getopt_long(argc, argv, "a:c:dD:E:g:hl:L:mp:P:r:s:t:u:v:Vw:", long_options, NULL)) != -1) {
switch (c) {
case 'c': ConfigDirectory = optarg;
break;
}
}
fprintf(stderr, "Config directory: %s\n", ConfigDirectory);
# загружаем в Channels файл ConfigDirectory/channels.conf
Channels.Load(AddDirectory(ConfigDirectory, "channels.conf"), false, true) &&
# скидываем Channels в файл Channels если файл или был модифицирован или наступил таймаут по автосбросу на диск
bool timeout = ChannelSaveTimeout == 1 || ChannelSaveTimeout && time(NULL) > ChannelSaveTimeout ;
int modified = Channels.Modified();
if ((modified || timeout) && Channels.Lock(false, 100)) {
if (timeout) {
Channels.Save();
ChannelSaveTimeout = 0;
}
}
Channels.Unlock();
Показать весь код
(комментарии в тексте - мои а так же строка fprintf( ) - хочу отдельно сделать
тестовый файл для обкатки и понимания как что происходит
для загрузки выгрузки используются функции Channels.Load Channels.Modified Channels.Lock Channels.Save Channels.Unlock
Channels.Modified пока не интересует а вот Load Lock Save Unlock пригодятся и находятся таковые в channels.c
правда только Load и ReNumber
// -- cChannels --------------------------------------------------------------
cChannels Channels;
cChannels::cChannels(void)
{
maxNumber = 0;
modified = CHANNELSMOD_NONE;
}
bool cChannels::Load(const char *FileName, bool AllowComments, bool MustExist)
{
if (cConfig<cChannel>::Load(FileName, AllowComments, MustExist)) {
DeleteDuplicateChannels();
ReNumber();
return true;
}
return false;
}
void cChannels::ReNumber( void )
{
channelsHashSid.Clear();
int Number = 1;
for (cChannel *channel = First(); channel; channel = Next(channel)) {
if (channel->GroupSep()) {
if (channel->Number() > Number)
Number = channel->Number();
}
else {
HashChannel(channel);
maxNumber = Number;
channel->SetNumber(Number++);
}
}
}
Показать весь код
а это кусок из channels.h - хоть тресни не вижу Lock Save Unlock
class cChannels : public cRwLock, public cConfig<cChannel> {
private:
int maxNumber;
int modified;
int beingEdited;
cHash<cChannel> channelsHashSid;
void DeleteDuplicateChannels(void);
public:
cChannels(void);
bool Load(const char *FileName, bool AllowComments = false, bool MustExist = false);
void HashChannel(cChannel *Channel);
void UnhashChannel(cChannel *Channel);
int GetNextGroup(int Idx); // Get next channel group
int GetPrevGroup(int Idx); // Get previous channel group
int GetNextNormal(int Idx); // Get next normal channel (not group)
int GetPrevNormal(int Idx); // Get previous normal channel (not group)
void ReNumber(void); // Recalculate 'number' based on channel type
cChannel *GetByNumber(int Number, int SkipGap = 0);
cChannel *GetByServiceID(int Source, int Transponder, unsigned short ServiceID);
cChannel *GetByChannelID(tChannelID ChannelID, bool TryWithoutRid = false, bool TryWithoutPolariza
int BeingEdited(void) { return beingEdited; }
void IncBeingEdited(void) { beingEdited++; }
void DecBeingEdited(void) { beingEdited--; }
bool HasUniqueChannelID(cChannel *NewChannel, cChannel *OldChannel = NULL);
bool SwitchTo(int Number);
int MaxNumber(void) { return maxNumber; }
void SetModified(bool ByUser = false);
int Modified(void);
///< Returns 0 if no channels have been modified, 1 if an automatic
///< modification has been made, and 2 if the user has made a modification.
cChannel *NewChannel(const cChannel *Transponder, const char *Name, const char *ShortName, const c
};
extern cChannels Channels;
cString ChannelString(const cChannel *Channel, int Number);
Показать весь код
Цитата
класс cChannel наследует свойства класса cRwLock ... описан в thread.h
на 16Е наличествует открытый канал в формате sdtv 544 x 576 h264 - хороший
полигон для изучения возможности приема таких каналов
16Е 11294 H 13333-5/6 God TV UK & Ireland MPEG-4 видео пид 2014 аудиопид 3014 E
записал на дриме фрагмент этого канала и мплэйером попытался его крутить -
сразу видно что PAFF interlacing is not implemented -
эти дурацкие PAFF не обрабатываются мплэйром и когда будут - неизвестно
ну и второе - машинка при раскодировании грузится не-по-детски
MPlayer 1.0rc1-4.0.3 (C) 2000-2006 MPlayer Team
CPU: Intel(R) Celeron(R) CPU 2.40GHz (Family: 15, Model: 2, Stepping: 9)
CPUflags: MMX: 1 MMX2: 1 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1
Compiled for x86 CPU with extensions: MMX MMX2 SSE SSE2
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.
Terminal type `unknown' is not defined.
Playing /tmp/07-06-20 - GOD Europe - .ts.
TS file format detected.
VIDEO H264(pid=2014) AUDIO MPA(pid=3014) NO SUBS (yet)! PROGRAM N. 14
FPS seems to be: 25.000000
==========================================================================
Trying to force video codec driver family ffmpeg...
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
==========================================================================
Opening audio decoder: [mp3lib] MPEG layer-2, layer-3
AUDIO: 48000 Hz, 2 ch, s16le, 128.0 kbit/8.33% (ratio: 16000->192000)
Selected audio codec: [mp3] afm: mp3lib (mp3lib MPEG layer-2, layer-3)
==========================================================================
AO: [oss] 48000Hz 2ch s16le (2 bytes per sample)
Starting playback...
[h264 @ 0x86ee278]PAFF interlacing is not implemented
[h264 @ 0x86ee278]PAFF interlacing is not implemented
[h264 @ 0x86ee278]PAFF interlacing is not implemented
[h264 @ 0x86ee278]concealing 612 DC, 612 AC, 612 MV errors
VDec: vo config request - 544 x 576 (preferred colorspace: Planar YV12)
VDec: using Planar YV12 as output csp (no 0)
Movie-Aspect is 1.36:1 - prescaling to correct movie aspect.
VO: [x11] 544x576 => 786x576 Planar YV12 [zoom]
Показать весь код
а на вдр с помощью мплеер ты не пробовал ? типа
mplayer dvb: //God TV UK & Ireland
под виндовс повердвд 7 с h264 крутит ту запись довольно плавно - с загрузкой
около 70-80% hотя поток и не велик - около 0.8Мбпс
сорры фор транслит - в виндаh отказал по4ему то переклю4атель раскладок
черный квадрат вместо видео - потому что в сграбленый экран из видео буфера не сграбилось -
но поверьте - там была видео картинка ..... если есть желание покрутить эту запись
у себя - могу куда то положить ее - 16 мегабайт
ваще всплеск интереса к такому сдтв вызван тем что в таком формате вещают с 40Е
новых 2 транспондера и провайдер Рикор - с 60Е - правда уже в двб-с2
но на 40Е пока эти транспондеры у меня не лочаться - вернее изредка лочаться
у нас там в низу кнопочка, Русский
Array
итак - первым пунктом - возможность загрузки другого файла списка каналов
пока только при старте вдр - ввел новую опцию -b --bouquet .... загружает
список каналов из файла с заданным названием ....
пока только добавленые строки в vdr.c
#define DEFAULTBOUQUETFILENAME "channels.conf"
const char *BouquetFile = DEFAULTBOUQUETFILENAME;
{ "bouquet", required_argument, NULL, 'b' },
case 'b': BouquetFile = optarg;
break;
" -b FILE --bouquet=FILE read bouquet file from given FILE (default is \n"
" '%s')\n"
DEFAULTBOUQUETFILENAME,
Channels.Load(AddDirectory(ConfigDirectory, BouquetFile), false, true) &&
Показать весь код
потом когда более менее отладится - сделаю нормальный патчик .....
а счас нужна помощь - есть 2 момента которые для меня пока непонятны
1) надо внести проверку на наличие файла с каналами и если файл не найден - то
использовать DEFAULTBOUQUETFILENAME
2) надо решить идеологически и реализовать это в коде - ввести для каждого файла
с каналами свой CurrentChannel = и обрабатывать его при загрузке соответствующего списка
а посему - с моей колокольни - проще всего его держать в самом списке - напрмер
неким параметром типа [CurrentChannel = 123]
одно но - проверяльщик валидности списка такую запись не пропускает - а
использовать вначале двоеточие - типа это метка - не хочется - так как при этом
в вдр это будет отображаться как метка .....
и конечно нужен обработчик этого параметра - который бы его считывал - заносил
в переменную типа Setup.InitialChannel и аналогично бы записывал бы в процессе
работы в список
значение текущего канала
в общем пока изменения крошечные и поэтому работают - запускаю вдр с этой добавочной опцией и все пока работает
или
потом когда уже все заработает - можно наверно в самом вдр сделать загрузку
нового листа вместо текущего - неким дополнительным меню - но до этого пока как до москвы рачком ))))
по первому пункту - проверка наличия файла есть в вдр - правда при отсутствии файла она приводит к сообщению
vdr: error while reading '/vdr/channels.conf.tes'
а не загрузке файла по умолчанию - но пока этого достаточно
по второму пункту - тоже есть продвижка - второй параметр это AllowComments
Channels.Load(AddDirectory(ConfigDirectory, BouquetFile), false, true)
который обрабатывается в config.h
config.h
allowComments = AllowComments;
if (allowComments) {
char *p = strchr(s, '#');
if (p)
*p = 0;
}
т/е/ позвозяет вписывать комментарии в текст за #
все так да не так - при AllowComments = true
запись типа
Zone Europa;POLSAT#4:12284:H:S13.0E:27500:353:354=pol,355=hun:356:1801:10507:113:7900:0
- содержащая # в теле - приводит к сбою в чтении файла
к сожалению этот блок с моей колокольни несколько неточно отрабатывает комменты -
ищет # на любой позиции в строке - а надо только на первой - помогите - как сделать правильно?
моя ошибка - тот блок обработки комментов работает правильно - усекает строку -
отрезает все что в ней следует после # - но так как это не применимо к channels.conf
по совету старших товарищей сделал еще одну функцию LoadBouquets где комментами
считается только строка которая начинается с #
соответственно загружается теперь файл с каналами командой в vdr.c
и обрабатывается блоком в config.h
bool LoadBouquet(const char *FileName = NULL, bool AllowComments = false, bool MustExist = false)
{
cConfig<T>::Clear();
if (FileName) {
free(fileName);
fileName = strdup(FileName);
allowComments = AllowComments;
}
// fprintf(stderr, "allowComments '%i'\n", allowComments);
bool result = !MustExist;
if (fileName && access(fileName, F_OK) == 0) {
isyslog("loading %s", fileName);
FILE *f = fopen(fileName, "r");
if (f) {
char *s;
int line = 0;
cReadLine ReadLine;
result = true;
while ((s = ReadLine.Read(f)) != NULL) {
line++;
if (allowComments) {
int pos = strchr(s, '#')-s;
if (pos == 0)
*s = 0;
}
stripspace(s);
if (!isempty(s)) {
T *l = new T;
if (l->Parse(s))
Add(l);
else {
esyslog("ERROR: error in %s, line %d", fileName, line);
delete l;
result = false;
break;
}
}
}
fclose(f);
}
else {
LOG_ERROR_STR(fileName);
result = false;
}
}
if (!result)
fprintf(stderr, "vdr: error while reading '%s'\n", fileName);
return result;
}
Показать весь код
в котором моего то всего
но именно здесь потом можно и вписать блочок по загрузке CurrentChannel
после вынесения загрузки списка каналов в отдельный блок LoadBouquet что то стало с нумерацией
каналов - они все скинулись в 0 .... если же загружать список через функцию Load
то все нормально нумеруется .... в чем засада пока не ясно ...
чтобы не заьылось - кусочки кода отвечающие за то на какой канал вдр станет при
загрузке ....
vdr.c
if (Setup.InitialChannel > 0)
Setup.CurrentChannel = Setup.InitialChannel;
Channels.SwitchTo(Setup.CurrentChannel)
config.c
CurrentChannel = -1;
InitialChannel = 0;
else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value);
else if (!strcasecmp(Name, "InitialChannel")) InitialChannel = atoi(Value);
Store("CurrentChannel", CurrentChannel);
Store("InitialChannel", InitialChannel);
setup.conf
при загрузке читается setup.conf и из него эти 2 переменные - если задана не нулевая InitialChannel
то ее значение присваивается CurrentChannel ... если -1 ... то насройка будет на
сохраненный в setup.conf CurrentChannel
а есть еще и LastChannel в которой при нормальной работе содержится номер текущего
канала .... при нормальной работе он устанавливается в основном цикле vdr.c в 1
а при ненормальной работе - в 0
поставил закладку в vdr.c
fprintf(stderr, "LastChannel '%d'\n", LastChannel);
перед
if (!EITScanner.Active() && cDevice::CurrentChannel() != LastChannel) {
if (!Menu)
Menu = new cDisplayChannel(cDevice::CurrentChannel(), LastChannel >= 0);
LastChannel = cDevice::CurrentChannel();
LastChannelChanged = time(NULL);
}
и наблюдается следущее
LastChannel '0'
LastChannel '8'
т.е до запуска этого блока LastChannel '0' а потом устанавливается на CurrentChannel
в-общем Wanted место в котором каналы нумеруются - вознаграждение гарантируется ))))
в рамках Summer Of Code 2007 от Google команда ffmpeg выставила и такую тему
PAFF decoding for H.264/AVC
Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.
правда никто вроде за это не взялся .... а в девелоперс листе FFmpeg-devel
тоже обсуждалась эта тема - например эта ветка - пост из середки
Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.
правда победных реляций я не видел пока
в продолжении темы о возможности держать несколько списков каналов в вдр
пока реализовал только возможность загрузки файла-листа при загрузке вдр
и взятия канала для начальной настройки из соответствующего файла BouquetFile.idx
в котором хранится единственная переменная CurrentChannel = NUM
вообще то удобнее было бы хранить эту переменную прямо в файле списке
но тогда теряется совместимость с другими вдр - хотя конечно можно
спрятать переменную за двоеточием - типа это метка - но это не совсем хорошо
несколько изменил логику работу с переменными CurrentChannel InitialChannel
которые хранятся в setup.conf и на которые вдр настраивается при включении...
чтобы не было путаницы - при запуске вдр они вообще не используются )))
при запуске загружается указанный файл-список и ищется соответсьтвующий файл .idx
если в нем прописан CurrentChannel то вдр настраивается на него если же файла
нет или переменная не прописана - настраивается на первый канал в списке - ИМХО
это самый лучший вариант - никаких кроссов между листами типа сохраненный канал от одного
списка а сам список совсем другой .... полная прогнозируемость поведения ...
теперь надо научить вдр сохранять CurrentChannel который он записывает в файл setup.conf
в соответствующий .idx файл
патч пока не сделал по 2 причинам - потерял исходный вариант vdr.c ))) и во-вторых он
никому не нужен ))))
Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.
снова о ТТ3200 - все ждут что скажет Manu
Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.
HDTV-vdr
к сожалению с драйверами на ТТ3200 на какое то время придется погодить
автор патча на драйвер Ману laasa at gmx.de обиделся походу что кто то сказал
что драйвер похож на спагетти и забросил его вообще. было это в конце мая
- с тех пор ни слуху ни духу (((
Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.
Ману же объявился в середине июня и на то что кто то сказал что он собирал
драйвер из его репозитария + патч от Ласа - в недоумении сказал - а зачем собственно
этот патч?
я так понимаю что теперь этим драйвером еще полгода никто не будет заниматься...
вот ведь блин горелый - мог бы Технотренд заплатить даже этим людям чтобы они
довели драйвер до конца - тогда у них появилось бы огромное количество покупателей
на 3200 из линуксоидов ... экономят на копейках ....
а по поводу Рилбоксов - по трезвому размышлению за те 1000 евро что они хотят
можно собрать отличный комп с теми же возможностями но более универсальный....
правда у них уже двб-с2 уже рабочий и h264 yfcколько я понимаю- а когда 3200 в вдр
заработает - даже Самому не известно!
вот и неофициальная бетка вдр с поддержкой dvb-s2 вышла
This is a beta version of vdr which support dvb-s2.
So this version is able to watch TVHD through a streaming plugin
(streamdev plugin is include in archive).
Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.
The DVB-S2 channels must have 'M8' in modulation field of channels.conf,
for example:
ASTRAPROMO_HD:12721:hC23M8:S19.2E:22000:767:768:0:0:10202:1:1119:0
tested with:
- linux 2.6.19
- TT3200 card (manu drivers and laasa patch)
JLac
_______________________________________________
vdr mailing list
Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.
cпасибо за любопытную новость )))
кстати - там же есть ряд интересных вещей
Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.
воспоминание ...
итак как запустить streamdev-server c remux
- собираем streamdev плагин - про патчи лежащие в /patches благополучно забываем
- прописываем загрузку в командной строке вдр
- куда нибудь кладем скрипт с вызовом внешнего ремуксера - например такой
он перегоняет в мпег4 с горизонтальным размером 320 - правда ресурсов на
конверчение в мпег4 надо мама не горюй
лог mencoder пишется в /tmp/out.log
#! /bin/bash
rm -f /tmp/out.avi
/bin/mkfifo /tmp/out.avi
cat /tmp/out.avi & /bin/mencoder \
-ovc lavc \
-lavcopts vcodec=mpeg4:keyint=250:vqmax=10:vbitrate=500:mbd=2 \
-vop scale -zoom -xy 320 \
-oac copy \
-o /tmp/out.avi -- - &>/tmp/out.log
Показать весь код
пусть он будет в /vdr (путь к нему и указывается в опции '-r' для streamdev-server
встречались еще такие варианты строк кодировщика
cat /tmp/out.avi & /usr/bin/mencoder -ovc lavc -oac lavc -lavcopts vbitrate=400:abitrate=64 -vf scale=420:-2 -o /tmp/out.avi -- - &>/tmp/out.log
или такое
#!/bin/bash
#
# VDR streamdev-server external remux script
#
rm -f /var/vdr/tmp/out.avi /var/vdr/tmp/out.log
/usr/bin/mkfifo /var/vdr/tmp/out.avi
cat /var/vdr/tmp/out.avi & /usr/bin/mencoder -vc ffmpeg12, \
-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=400 \
-vf scale=320:-2 -ffourcc DX50 \
-oac mp3lame -lameopts cbr:br=80 \
-of avi -o /var/vdr/tmp/out.avi -- - &>/var/vdr/tmp/out.log
Показать весь код
или такое
#!/bin/sh
rm -f /tmp/out.avi
/usr/bin/mkfifo /tmp/out.avi
cat /tmp/out.avi & /usr/bin/ffmpeg -i - -f avi -vcodec mpeg4 -b 300 -g 300 -bf 2 -s cif /tmp/out.avi &>/tmp/out.log
в-общем у мэнкодера опций много - есть чем поиграться
- запускаем вдр
- цепляемся к ремуксенному потоку в плэйере который умеет брать поток по сети
Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу. --- последнее значение - номер канала на вдр
именно при таком обращении и запускается этот скрипт что можно увилеть
по появлению /tmp/out.avi /tmp/out.log
почему то в консоли нет от streamdev-server никаких сообщений - хотя раньше я их видел - типа
Apr 1 19:26:41 localhost vdr: [21446] Streamdev: Accepted new client (HTTP) 127.0.0.1:38575
интересно - куда эти логи делись