Nach dem einrichten des FB's und Tune(frequency......) bild?

Deathmaker
Interessierter
Interessierter
Beiträge: 26
Registriert: Mittwoch 7. Januar 2004, 05:24

Nach dem einrichten des FB's und Tune(frequency......) bild?

Beitrag von Deathmaker »

Also wie schaffe ich es nach dem initialiseren
des FB's ein Sender angezeigt zu bekommen
(senderliste vorhanden + tune(frequncy ... etc integriert)

ich kann zwar den sender einstellen über die tune() funktion (modifikation der lcars version)
aber es bleibt duster *g*
es fehlt noch sowas wie nennen wir es mal BILD & TON-Routing...
irgendwie vpid apid auswahl technisch was aber ich bin da in den sources noch nicht fündig geworden ....

wär da für hinweise,tips und beispiel-schnippsel dankbar.

mfg Death
derget
Contributor
Beiträge: 1608
Registriert: Samstag 28. Juli 2001, 00:00

Beitrag von derget »

kuk dir mal zapit / pzapit in dem zusammenhang an
Deathmaker
Interessierter
Interessierter
Beiträge: 26
Registriert: Mittwoch 7. Januar 2004, 05:24

thx

Beitrag von Deathmaker »

hab immerhin schon rausbekommen das ich wohl noch sections filtern muss :\ aber das tüffel ich auch noch aus ... *hoff*
rasc
Senior Member
Beiträge: 5071
Registriert: Dienstag 18. September 2001, 00:00

Beitrag von rasc »

yep, du musst, falls du es aus der Senderliste noch nicht hast, ueber PAT->PMT die Audio-Pid(s) und Video-Pid (+ EMM-PIds) herausfischen und dem demux (+cam) mitteilen...
Deathmaker
Interessierter
Interessierter
Beiträge: 26
Registriert: Mittwoch 7. Januar 2004, 05:24

hmmmm

Beitrag von Deathmaker »

also ich hab mir das jetzt mal zusammen gesucht

ich hol aus der nutreon-senderliste die Frequenz, TSID,.... Diseq...
(die daten sind die selbe wie in der neutrino senderliste und das sie sozusagen als binary gespeichert sind)

tune(frequenz.......) ....

danach mach ich ein readPAT ?!...
um an die PMT Werte zukommen
mit dem PMT-Wert mach ich dann ein readPMT ...
womit ich dann die Video/Audio-Pid's bekomme
setze die filter auf die erhaltenen PID's und freu
mich übers Bild.
?

hm kann einer erklären was PAT PMT ist ?

hab so den verdacht PAT irgendein Informationsblock
den man für die Trennung der weiteren daten auf der frequenz benötigt und PMT ist dann der eigentlich gewollte info block ?!

oder weis jemand wo ich das genau nachlesen kann?
(die linuxtv.org api erzählt über das thema leider nicht so viel)
derget
Contributor
Beiträge: 1608
Registriert: Samstag 28. Juli 2001, 00:00

Beitrag von derget »

4 Service Information (SI) description
ISO/IEC 13818-1 [1] specifies SI which is referred to as PSI. The PSI data provides information to enable automatic
configuration of the receiver to demultiplex and decode the various streams of programs within the multiplex.
The PSI data is structured as four types of table. The tables are transmitted in sections.
1) Program Association Table (PAT):
- for each service in the multiplex, the PAT indicates the location (the Packet Identifier (PID) values of the
Transport Stream (TS) packets) of the corresponding Program Map Table (PMT). It also gives the
location of the Network Information Table (NIT).

2) Conditional Access Table (CAT):
- the CAT provides information on the CA systems used in the multiplex; the information is private (not
defined within the present document) and dependent on the CA system, but includes the location of the
EMM stream, when applicable.

3) Program Map Table (PMT):
- the PMT identifies and indicates the locations of the streams that make up each service, and the location
of the Program Clock Reference fields for a service.

4) Network Information Table (NIT):
- the location of the NIT is defined in the present document in compliance with ISO/IEC 13818-1 [1]
specification, but the data format is outside the scope of ISO/IEC 13818-1 [1]. It is intended to provide
information about the physical network. The syntax and semantics of the NIT are defined in the present
document.


quelle : ETSI EN 300 468 V1.5.1
Deathmaker
Interessierter
Interessierter
Beiträge: 26
Registriert: Mittwoch 7. Januar 2004, 05:24

thx =)

Beitrag von Deathmaker »

thx =) für die infos hat mir doch extrem geholfen zu checken was da abgeht *g*

Also könnte man sagen für unverschlüsselte Programm geht das so:

1. Tune(Frequenz, Diseq, TransponderID,.....)
2. PAT Lesen
3. PMT Lesen
4. Tune(VPid,APid)
5. Bild ist da ...

MfG Death
derget
Contributor
Beiträge: 1608
Registriert: Samstag 28. Juli 2001, 00:00

Beitrag von derget »

richtig

wobei du sohar pat und pmt weglassen kanst

wenn du die audio und video id es kennst

für die dvb2000 gabs früher so senderlisten

vorteil : es tuned ein wenig schneller weil pat pmt ja nicht ausgewertet werden müssen

nachteil: wenn sich was ändert bekommt man es nicht mit
geschweigeden dass es ab und zu 2 audio pid es gibt oder nicht etc ..
Deathmaker
Interessierter
Interessierter
Beiträge: 26
Registriert: Mittwoch 7. Januar 2004, 05:24

hmmm

Beitrag von Deathmaker »

ja das dacht ich mir schon also bringts das nur wenn ich pmt und pat auslese ... :| hmm ... oder ich die senderliste mit update-raten versehe ... *denk* ... naja später evtl mal das für den anfang etwas zuviel aufwand *g* thx für die hilfe
ich werd das gleich mal testen
Deathmaker
Interessierter
Interessierter
Beiträge: 26
Registriert: Mittwoch 7. Januar 2004, 05:24

geht nicht :(

Beitrag von Deathmaker »

hab den Tune auf die Frequenz gemacht ....
aber wenn ich dann die PAT auslesen will bekommt er keine Daten ....
:| hab ich irgendwas vergessen? ... an der PAT-Funktion liegts glaub ich nicht die is von LCARS fast 1:1 übernommen.
Deathmaker
Interessierter
Interessierter
Beiträge: 26
Registriert: Mittwoch 7. Januar 2004, 05:24

*ps*

Beitrag von Deathmaker »

PS: Nach dem Tune(Frequency, Fec, Diseq, Symbol_rate ..);
(ebenfalls die LCARS-Funktion)
zeigt die Funktion auch ne nette Signal stärke an :| und SN an .. also es muss schon was drüber schiessen :\
Deathmaker
Interessierter
Interessierter
Beiträge: 26
Registriert: Mittwoch 7. Januar 2004, 05:24

So...

Beitrag von Deathmaker »

Hier mal der aktuelle Code:

Code: Alles auswählen

#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <memory.h>
#include <linux/kd.h>
#include <stdint.h>
#include <dbox/fb.h>
#include <linux/fb.h>
#include <linux/vt.h>
#include <stdint.h>
#include <string>
#include <sys/poll.h>
#include <frontend.h>
#include <video.h>
#include <pat.h>
#include <pmt.h>

int servicecount = 0;
int frontend;
fe_type type;

struct _tsdata {
 // Transponder Block
 char satname[20];
 char diseq,position;
 unsigned short int transponderid,onid;
 unsigned int frequency;
 char inversion;
 unsigned int symbol_rate;
 char fec,polar;
 unsigned short int serviceid;
 char name[30];
 char servicetyp;
};

typedef _tsdata servdata;
servdata services[5999];

void load_services() {
 FILE *f;
 int i = 0;
 int j;
 f = fopen("services.lst","r");
 while (!feof(f)) {
  fread(&services[i],sizeof(struct _tsdata),1,f);
/*
  printf("%d = ",i);
  for (j=0;j<services[i].name[0];j++) printf("%c",services[i].name[j+1]);
  printf("    ");
*/
  i++;
 }
 fclose(f);
 servicecount = i;
 printf("Services found: %d\n",i);
}

fe_code_rate_t getFEC(int fec)
{
	switch (fec) {
	case -1:
	case 15: return FEC_NONE;
	case 0:  return FEC_AUTO;
	case 1:  return FEC_1_2;
	case 2:  return FEC_2_3;
	case 3:  return FEC_3_4;
	case 4:  return FEC_5_6;
	case 5:  return FEC_7_8;
	default: return FEC_AUTO;
	}
}

bool tune(unsigned int frequ, unsigned int symbol, int polarization, int fec, int dis)
{
	struct dvb_frontend_parameters frontp;
	struct dvb_frontend_event event;
	struct dvb_diseqc_master_cmd cmd;
	fe_sec_mini_cmd_t mini_cmd;
	fe_sec_tone_mode_t tone_mode;
	fe_sec_voltage_t voltage;

	if (type == FE_QPSK)
	{
  	 if (frequ > 11700) {
 		frontp.frequency = (frequ * 1000)-10600000;
		tone_mode = SEC_TONE_ON;
	 } else	{
  		frontp.frequency = (frequ * 1000)-9750000;
		tone_mode = SEC_TONE_OFF;
	 }
  	 if (polarization == 0) voltage = SEC_VOLTAGE_18;
 	 else voltage = SEC_VOLTAGE_13;

 	 frontp.u.qpsk.fec_inner = getFEC(fec);
	 frontp.u.qpsk.symbol_rate = symbol * 1000;

	 // diseqc
	 cmd.msg_len = 4;
	 cmd.msg[0] = 0xe0;
	 cmd.msg[1] = 0x10;
	 cmd.msg[2] = 0x38;
	 cmd.msg[3] = 0xf0 | ((dis * 4) & 0x0f)
		| ((voltage == SEC_VOLTAGE_18) ? 2 : 0)
		| ((tone_mode == SEC_TONE_ON)  ? 1 : 0);

	 mini_cmd = (dis / 4) % 2 ? SEC_MINI_B : SEC_MINI_A;
	 if (ioctl(frontend, FE_SET_TONE, SEC_TONE_OFF) < 0) perror("FE_SET_TONE");
	 if (ioctl(frontend, FE_SET_VOLTAGE, voltage) < 0) perror("FE_SET_VOLTAGE");
 	 usleep(15 * 1000);
	 if (ioctl(frontend, FE_DISEQC_SEND_MASTER_CMD, &cmd) < 0) perror("FE_DISEQC_SEND_MASTER_CMD");
	 usleep(15 * 1000);
	 if (ioctl(frontend, FE_DISEQC_SEND_BURST, mini_cmd) < 0) perror("FE_DISEQC_SEND_BURST");
	 usleep(15 * 1000);
	 if (ioctl(frontend, FE_SET_TONE, tone_mode) < 0) perror("FE_SET_TONE");
	}

	if (type == FE_QAM) {
		frontp.frequency = frequ * 100000;
		frontp.u.qam.symbol_rate = symbol * 1000;
		frontp.u.qam.fec_inner = getFEC(fec);
		frontp.u.qam.modulation = QAM_64;
	}

	// -- Spektrum Inversion
	// -- should be configurable, fixed for now (rasc)
	frontp.inversion = INVERSION_AUTO;

	while (1) {
  	 if (ioctl(frontend, FE_GET_EVENT, &event) == -1) break;
	}

	if (ioctl(frontend, FE_SET_FRONTEND, &frontp) < 0) {
          perror("FE_SET_FRONTEND");
	  return 0;
	}

	do { memset(&event, 0, sizeof(event));
 	     ioctl(frontend, FE_GET_EVENT, &event);
	} while (!(event.status & (FE_HAS_LOCK | FE_TIMEDOUT)));

	printf (" Frequ: %u   ifreq: %u  Pol: %d  FEC: %d  Sym: %u  dis: %d\n",
	        frequ, frontp.frequency, (int)polarization , (int)fec,
	        symbol, (int)dis);
	printf ("... Tuner-Lock Status: %d\n",event.status);

	uint16_t state1, state2;

	if (ioctl(frontend, FE_READ_SNR, &state1) < 0)	perror("FE_READ_SNR");
        if (ioctl(frontend, FE_READ_SIGNAL_STRENGTH, &state2) < 0) perror("FE_READ_SIGNAL_STRENGTH");
	printf ("... S/N: %d  SigStrength: %d \n",state1,state2);
	if (event.status & FE_HAS_LOCK)	{
          printf("Has lock");
        } else {
          printf("Doesnt have lock");
        }
	return (event.status & FE_HAS_LOCK);
}




int gochannel(int idx) {
 int i = 0;
 int j = services[idx].name[0];
 int pmtc = 0;
 pat pat;
 pmt pmt;
 pmt_data pmtd;
 printf("Switching to ");
 while (i < j) {
  i++;
  printf("%c",services[idx].name[i]);
 }
 printf("\n");
 printf("Tuning...");
 tune( services[i].frequency, services[i].symbol_rate, services[i].polar,
       services[i].fec, services[i].diseq );
/* die tune funktion ist auch mehr oder weniger og. lcars :-|  */
 printf("ok\nreadPAT ..");
 pat.readPAT();
/* ^^^^^^ naja das geht nicht irgendwas muss ich vergessenhaben ?!? 
  readPAT ist org. Lcars ... :-| timeout ist auf 10 sek. erhöht ....
  müsste also gehn
*/
 printf("ok\ngetPMT = ");
 pmtc = pat.getPMT(services[i].serviceid);
 printf("%d!\n",pmtc);
 printf("Fetching Pids ...");
 pmtd = pmt.readPMT(pmtc);
 printf("ok\n");
 printf("Service Infos:\n");
 printf("PMT: %d\nSID: %d\nPID-Counter: %d\n",pmtd.pmt,pmtd.sid,pmtd.pid_counter);
 for (i=0;i<pmtd.pid_counter;i++) {
  printf("Nr.: %d\n Type: %d\n PID: %d\n SubType: %d\n Componet: %d\n ECM-Counter:\n",
         i,pmtd.type[i],pmtd.PID[i],pmtd.subtype[i],pmtd.component[i]);
 }
// tunePids();
}

main() {
 dvb_frontend_info info;

 // 1. Laden der Services
 printf("Loading Services...");
 load_services(); // << ueberrascht ?? *g*
 printf("ok\n");

 // 2. Oeffnen der dings ...
 printf("Opening Device...");
 frontend = open("/dev/dvb/adapter0/frontend0", O_RDWR|O_NONBLOCK);
 if (frontend < 0) {
  perror("FrontEnd-Device could not be open'd\n");
  exit(1);
 }
 printf("ok [%d]\n",frontend);

 printf("Trying infos...");
 if (ioctl(frontend, FE_GET_INFO, &info))
 {
  perror("io2ctl");
  exit(1);
 }
 printf("ok\n");
 type = info.type;

 // 3. Umschalten
 printf("Umschalten\n");
 for (int i = 0; i < 800; i = i + 10)  gochannel(i);

 // 4. Schliessen
 printf("Schliessen\n");
 close(frontend);
}

hier der output auf der box:

Code: Alles auswählen

# ./tuner1
Loading Services...Services found: 897
ok
Opening Device...ok [3]
Trying infos...ok
Umschalten
Switching to CLASSICA
Tuning... Frequ: 2701177856   ifreq: 3927794112  Pol: 0  FEC: 3  Sym: 3768427265  dis: 0
... Tuner-Lock Status: 32
... S/N: 0  SigStrength: 32125
Doesnt have lockok
readPAT ..Reading PAT from /dev/dvb/adapter0/demux0
PAT Read successfull!(-1)Transport ID: 0
Creating pat_list...
ok
getPMT = Pat list empty?!
0!
..... das geht dann immer so weiter
obi
Senior Member
Beiträge: 1282
Registriert: Montag 12. November 2001, 00:00

Beitrag von obi »

Tuning... Frequ: 2701177856 ifreq: 3927794112 Pol: 0 FEC: 3 Sym: 3768427265 dis: 0

was fuern sender soll das denn sein? ;)
Deathmaker
Interessierter
Interessierter
Beiträge: 26
Registriert: Mittwoch 7. Januar 2004, 05:24

ohhhhhhhhhhhhhhhhhhhh mein kopf *autsch*

Beitrag von Deathmaker »

aua aua aua *g* sowas tut weh ....
aber das passiert halt wenn man nachts um 5°° noch coded *ggggg*

big thx :) da geht wohl was beim auslesen schief ;D
Deathmaker
Interessierter
Interessierter
Beiträge: 26
Registriert: Mittwoch 7. Januar 2004, 05:24

Beitrag von Deathmaker »

Linux-Binary:
0 = CLASSICA Freq: 12069641
0 = BEATE-UHSE.TV Freq: 12069641
Services found: 1

DBox-Binary:
0 = CLASSICA Freq: 153860096
0 = BEATE-UHSE.TV Freq: 153860096
Services found: 1

:| beides mal die selben datentypen *seufz* tja so kanns gehn ...
jetzt muss ich wohl erstmal rauskreigen warum der beim compilen für die box das so verhunzt ... *g* sorry aber ich bin da noch etwas dau ..
Deathmaker
Interessierter
Interessierter
Beiträge: 26
Registriert: Mittwoch 7. Januar 2004, 05:24

hmm

Beitrag von Deathmaker »

mal abgesehn davon das mit den datentypen was nicht passt funktioniert es trotzdem nicht *denk* irgendwas fehlt da doch noch ... *grübels* muss man den transponder noch vorher festlegen?
Deathmaker
Interessierter
Interessierter
Beiträge: 26
Registriert: Mittwoch 7. Januar 2004, 05:24

hmmm

Beitrag von Deathmaker »

es funktioniert und funktioniert nicht :evil:
werd noch ganz plem plem :o
also irgendwas geht noch schief :\
am PAT auslesen liegts vermutlich nicht
*grübels* weil er ja 0 Byte ausliesst ...
hmm tuned wird jetzt fix rtl2 :| aber irgendwie
reicht das nicht um die PAT zu bekommen :\ aber was könnte da noch sein ?!?! :\ MUSS man vorher die CA initialiseren um die PAT zu bekommen ??
Deathmaker
Interessierter
Interessierter
Beiträge: 26
Registriert: Mittwoch 7. Januar 2004, 05:24

Problem entdeckt

Beitrag von Deathmaker »

also das problem ist wohl
"doenst have lock"

weis jemand woran das alles liegen kann ?

:| bzw warum ich kein lock bekomme ? [die dbox2 funktioniert *g* daran liegts nicht]

muss man vorher irgendwas initialiseren (Frontend device wird geöffnet und der fe_type abgefragt)
Deathmaker
Interessierter
Interessierter
Beiträge: 26
Registriert: Mittwoch 7. Januar 2004, 05:24

okay..........

Beitrag von Deathmaker »

habs geschafft *g*
war ein problem mit den daten *fg*
die tune( funktion von lcars is also wirklich nicht so gut *gg*
derget
Contributor
Beiträge: 1608
Registriert: Samstag 28. Juli 2001, 00:00

Beitrag von derget »

glückwunsch