Seite 1 von 1

[Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Sonntag 21. November 2010, 12:55
von bellum
Wenn der Berg nicht zum Propheten kommt, muss der Prophet zum Berg gehen...

Da bei mir noch einige Zeit dboxen zur Aufnahme im Einsatz sein werden und ich zum Abspielen auf der Coolstream das manuelle Patchen sehr umständlich finde,
habe ich basierend auf dem Thread "D-Box2 TS-Files" im DBox2World-Board Neutrino so angepasst, dass der Coolstream Movieplayer auch damit zurechtkommt...

Code: Alles auswählen

--- genpsi.c.org	2010-11-21 12:13:44.000000000 +0100
+++ genpsi.c	2010-11-21 12:13:59.000000000 +0100
@@ -20,7 +20,7 @@
  along with this program; if not, write to the Free Software Foundation,
  Inc., 675 Mass Ave, Cambridge MA 02139, USA.
 
- Mit diesem Programm koennen Neutrino TS Streams für das Abspielen unter Enigma gepatched werden 
+ Mit diesem Programm koennen Neutrino TS Streams für das Abspielen unter Enigma und Coolstream Neutrino-HD gepatched werden 
  */
 #include <transform.h>
 #include <driver/genpsi.h>
@@ -78,7 +78,7 @@
 	0x7F, 0x80, 0x24,
 	0x00, 0x00, 0x01, 0x00, 0x00,
 	0x00, 0x00, 0x6D, 0x66, 0x30, 0x19, 
-	0x80, 0x13, 'N','E','U','T','R','I','N','O','N','G',	// tag(8), len(8), text(10) -> NG hihi ;)
+	0x80, 0x13, 'N','E','U','T','R','I','N','O','N','G',	// tag(8), len(8), text(10)
 	0x00, 0x02, 0x00, 0x6e,				// cVPID(8), len(8), PID(16)
 	0x01, 0x03, 0x00, 0x78, 0x00,			// cAPID(8), len(8), PID(16), ac3flag(8)
 // 0x02, 0x02, 0x00, 0x82,// cTPID(8), len(8), ...
@@ -132,7 +132,6 @@
 
 //-- adjust len dependent to number of audio streams --
 	data_len += ((SIZE_ENIGMA_TAB_ROW+1) * (avPids.nba-1));
-
 	patch_len = data_len - OFS_HDR_2 + 1;
 	pkt[OFS_HDR_2+1] |= (patch_len>>8);
 	pkt[OFS_HDR_2+2]  = (patch_len & 0xFF); 
@@ -159,11 +158,24 @@
 	pkt[ofs+1] = 0x02;
 	pkt[ofs+2] = (avPids.vpid>>8);
 	pkt[ofs+3] = (avPids.vpid & 0xFF);
- 
 //-- calculate CRC --
 	calc_crc32psi(&pkt[data_len], &pkt[OFS_HDR_2], data_len-OFS_HDR_2 );
+//-- after all add dummy record length (60sec = 60000ms) to TS packet
+//   so that basic playback on Coolstream PVRs is possible
+//   correct record length is added in stream2file.cpp
+//   60sec = 60000ms (dez) -> 0000EA60 hex
+	pkt[SIZE_TS_PKT-8] = 0x60;
+	pkt[SIZE_TS_PKT-7] = 0xEA;
+	pkt[SIZE_TS_PKT-6] = 0x00;
+	pkt[SIZE_TS_PKT-5] = 0x00;
+//-- and finally add coolstream "magic bytes" to TS packet
+	pkt[SIZE_TS_PKT-4] = 0xBC;
+	pkt[SIZE_TS_PKT-3] = 0x00;
+	pkt[SIZE_TS_PKT-2] = 0x00;
+	pkt[SIZE_TS_PKT-1] = 0x00;
 //-- write TS packet --
 	bytes += write(fd2, pkt, SIZE_TS_PKT);
+
 //-- (II) build PAT --
 	data_len = COPY_TEMPLATE(pkt, pkt_pat);
 //-- calculate CRC --

Code: Alles auswählen

--- stream2file.cpp.org	2010-11-21 12:13:10.000000000 +0100
+++ stream2file.cpp	2010-11-21 12:17:33.000000000 +0100
@@ -118,6 +118,7 @@
 static unsigned int ringbuffersize;
 static time_t record_start_time = 0;
 static time_t record_end_time = 0;
+static unsigned long cs_record_time = 0;
 
 static char myfilename[512];
 static int mymode;
@@ -128,8 +129,8 @@
 	ringbuffer_t * ringbuffer;
 };
 
-static int sync_byte_offset(const unsigned char * buf, const unsigned int len) {
-
+static int sync_byte_offset(const unsigned char * buf, const unsigned int len)
+{
 	unsigned int i;
 
 	for (i = 0; i < len; i++)
@@ -303,7 +304,7 @@
 		all_bytes_written:
 			if (use_fdatasync)
 				fdatasync(fd2);
-			
+
 			remfile -= (unsigned long long)readsize;
 		}
 		else
@@ -315,8 +316,12 @@
 	}
  terminate_thread:
 	if (fd2 != -1)
+	{
+		//printf("DEBUG - stream2file.cpp: cs_record_time stored in ts file: %lX \n", cs_record_time);
+		lseek(fd2, 180, SEEK_SET);
+		write(fd2, &cs_record_time, 4);
 		close (fd2);
-
+	}
 	pthread_exit(NULL);
 }
 
@@ -680,7 +685,15 @@
 		mi.clearMovieInfo(&movieinfo);
 
 		time(&record_end_time);
-		printf("record time: %lu \n",record_end_time-record_start_time);
+		printf("record time: %lu \n",record_end_time - record_start_time);
+		// calculate record time for coolstream neutrino-hd (record time in ms, little endian format)
+																							// conversion into little endian
+		cs_record_time = ((((record_end_time - record_start_time) * 1000)>>24)&0xff) |		// move byte 3 to byte 0
+						 ((((record_end_time - record_start_time) * 1000)<<8)&0xff0000) |	// move byte 1 to byte 2
+						 ((((record_end_time - record_start_time) * 1000)>>8)&0xff00) |		// move byte 2 to byte 1
+						 ((((record_end_time - record_start_time) * 1000)<<24)&0xff000000); // byte 0 to byte 3
+		//printf("DEBUG - stream2file.cpp: cs_record_time in hex (big endian): %lX \n", ((record_end_time - record_start_time) * 1000));
+		//printf("DEBUG - stream2file.cpp: cs_record_time in hex (little endian): %lX \n", cs_record_time);
 		//load MovieInfo and set record time
 		movieinfo.file.Name = myfilename;
 		movieinfo.file.Name += ".ts";
Vielleicht können mal die Code-Gurus darüber schauen und bitte nicht die Hände über dem Kopf zusammen schlagen,
das letzte mal, dass ich Programmiert habe war vor ziemlich genau 10 Jahren...

Bei mir funktioniert, das gut. Wenn das noch mehrere so sehen, wäre es natürlich prima, wenn es ins CVS wandert...

Gruß bellum

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Sonntag 21. November 2010, 13:42
von seife
macht das nicht gesplittete Aufnahmen kaputt?

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Sonntag 21. November 2010, 14:22
von bellum
seife hat geschrieben:macht das nicht gesplittete Aufnahmen kaputt?
Wie meinst du das? Nicht gesplittete Aufnahmen, also Aufnahmen mit einem .ts und .xml bleiben ganz.
Ich habe meine Infrastruktur so an die dbox angepasst, dass gesplittete Aufnahmen quasi nie vorkommen und falls doch habe ich ein anderes Problem...

Gruß bellum

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Sonntag 21. November 2010, 14:25
von rhabarber1848
Auf Grund von Einschränkungen, deren Behebung einen unzumutbaren Aufwand bedeutet, habe ich die Größe von .ts-Dateien hier auf 2047 MB beschränken müssen. Das splitten von Dateien ist somit von mir gewollt und hat nichts mit performance-Problemen zu tun.

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Sonntag 21. November 2010, 14:29
von bellum
rhabarber1848 hat geschrieben:Auf Grund von Einschränkungen, deren Behebung einen unzumutbaren Aufwand bedeutet, habe ich die Größe von .ts-Dateien hier auf 2047 MB beschränken müssen. Das splitten von Dateien ist somit von mir gewollt und hat nichts mit performance-Problemen zu tun.
Aha, O.K.
... und was passiert dann mit meinem Patch?

Gruß bellum

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Sonntag 21. November 2010, 17:40
von seife
Meine Frage war anders rum: ob gesplittete dateien davon nicht kaputtgemacht werden. Ja, war missverständlich.
Nur weil du es nicht brauchst ist es trotzdem nicht fair denen gegenüber, die es brauchen.
Ich ignoriere ja auch oft bugs, die mich nicht betreffen, aber ich gebe mir schon wenigstens Mühe keine neuen einzubauen, auch wenn sie für mich irrelevant wären :-)

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Sonntag 21. November 2010, 18:26
von bellum
seife hat geschrieben:Meine Frage war anders rum: ob gesplittete dateien davon nicht kaputtgemacht werden. Ja, war missverständlich.
Nur weil du es nicht brauchst ist es trotzdem nicht fair denen gegenüber, die es brauchen.
Ich ignoriere ja auch oft bugs, die mich nicht betreffen, aber ich gebe mir schon wenigstens Mühe keine neuen einzubauen, auch wenn sie für mich irrelevant wären :-)
Ich ignoriere doch gar keine Bugs, meine Aussage oben sollte lediglich aussagen, dass ich diesen Fall gar nicht bedacht habe, da er bei mir nicht auftritt.
Außerdem habe ich jetzt mal rhabarber1848's Fall (mit 50MB) probiert und jetzt nicht gesehen dass da was kaputt geht.
Die gesplitteten Files bekommen den neuen Header mit der Dummy-Zeit und der letzte Teil hat dann die Gesamt-Zeit drin.
Alle einzelnen Files konnte ich auf der dbox problemlos über das Filmarchiv (MP1) abspielen. Zusammen hintereinander kann da ja glaube ich nur der MP2.
Den benutze ich nicht und entspr. Feedback habe ich noch nicht. Insofern, denke ich, habe ich auch keine neuen Bugs eingebaut.

Aber um mit Dir zu sprechen, ich schaue es mir noch mal an (insbesondere wie die gesplitteten Files der Coolstream aussehen).

Gruß bellum

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Sonntag 21. November 2010, 20:33
von seife
Dann ist es gut. Ich hatte nur (anscheinend falsch ;) vermutet, dass bei gesplitteten dateien nur die letzte am Offset 180 irgendwas reingeschrieben bekommt, was da nicht reingehört, evtl. an eine Stelle an der was ganz anderes sein sollte. ;)

Die Coolstream splittet die Aufnahmedateien nicht soweit ich weiss, also ist es dort nicht relevant.

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Sonntag 21. November 2010, 21:27
von rhabarber1848
@bellum: Ich werde Deinen Patch hier testen und in den nächsten Tagen berichten :)

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Sonntag 19. Dezember 2010, 23:25
von bellum
Ich habe das ganze noch einmal verfeinert, so dass auch gesplittete Aufnahmen jeweils die richtige Zeit haben.
Bei mir ist das schon einige Zeit im Einsatz und bisher konnte ich keine negativen Auswirkungen feststellen...
Was meinen die Code-Profis dazu?

Gruß bellum

Code: Alles auswählen

--- genpsi.c.cvs	2010-11-28 17:24:40.000000000 +0100
+++ genpsi.c	2010-11-28 17:26:08.000000000 +0100
@@ -20,7 +20,7 @@
  along with this program; if not, write to the Free Software Foundation,
  Inc., 675 Mass Ave, Cambridge MA 02139, USA.
 
- Mit diesem Programm koennen Neutrino TS Streams für das Abspielen unter Enigma gepatched werden 
+ Mit diesem Programm koennen Neutrino TS Streams für das Abspielen unter Enigma und Coolstream Neutrino-HD gepatched werden 
  */
 #include <transform.h>
 #include <driver/genpsi.h>
@@ -78,7 +78,7 @@
 	0x7F, 0x80, 0x24,
 	0x00, 0x00, 0x01, 0x00, 0x00,
 	0x00, 0x00, 0x6D, 0x66, 0x30, 0x19, 
-	0x80, 0x13, 'N','E','U','T','R','I','N','O','N','G',	// tag(8), len(8), text(10) -> NG hihi ;)
+	0x80, 0x13, 'N','E','U','T','R','I','N','O','N','G',	// tag(8), len(8), text(10)
 	0x00, 0x02, 0x00, 0x6e,				// cVPID(8), len(8), PID(16)
 	0x01, 0x03, 0x00, 0x78, 0x00,			// cAPID(8), len(8), PID(16), ac3flag(8)
 // 0x02, 0x02, 0x00, 0x82,// cTPID(8), len(8), ...
@@ -132,7 +132,6 @@
 
 //-- adjust len dependent to number of audio streams --
 	data_len += ((SIZE_ENIGMA_TAB_ROW+1) * (avPids.nba-1));
-
 	patch_len = data_len - OFS_HDR_2 + 1;
 	pkt[OFS_HDR_2+1] |= (patch_len>>8);
 	pkt[OFS_HDR_2+2]  = (patch_len & 0xFF); 
@@ -159,11 +158,24 @@
 	pkt[ofs+1] = 0x02;
 	pkt[ofs+2] = (avPids.vpid>>8);
 	pkt[ofs+3] = (avPids.vpid & 0xFF);
- 
 //-- calculate CRC --
 	calc_crc32psi(&pkt[data_len], &pkt[OFS_HDR_2], data_len-OFS_HDR_2 );
+//-- after all add dummy record length (60sec = 60000ms) to TS packet
+//   so that basic playback on Coolstream PVRs is possible
+//   correct record length is added in stream2file.cpp
+//   60sec = 60000ms (dez) -> 0000EA60 hex
+	pkt[SIZE_TS_PKT-8] = 0x60;
+	pkt[SIZE_TS_PKT-7] = 0xEA;
+	pkt[SIZE_TS_PKT-6] = 0x00;
+	pkt[SIZE_TS_PKT-5] = 0x00;
+//-- and finally add coolstream "magic bytes" to TS packet
+	pkt[SIZE_TS_PKT-4] = 0xBC;
+	pkt[SIZE_TS_PKT-3] = 0x00;
+	pkt[SIZE_TS_PKT-2] = 0x00;
+	pkt[SIZE_TS_PKT-1] = 0x00;
 //-- write TS packet --
 	bytes += write(fd2, pkt, SIZE_TS_PKT);
+
 //-- (II) build PAT --
 	data_len = COPY_TEMPLATE(pkt, pkt_pat);
 //-- calculate CRC --

Code: Alles auswählen

--- stream2file.cpp.cvs	2010-11-28 17:25:03.000000000 +0100
+++ stream2file.cpp	2010-12-19 23:12:19.000000000 +0100
@@ -128,8 +128,8 @@
 	ringbuffer_t * ringbuffer;
 };
 
-static int sync_byte_offset(const unsigned char * buf, const unsigned int len) {
-
+static int sync_byte_offset(const unsigned char * buf, const unsigned int len)
+{
 	unsigned int i;
 
 	for (i = 0; i < len; i++)
@@ -205,6 +205,9 @@
 {
 	ringbuffer_data_t vec[2];
 	size_t readsize;
+	time_t file_start_time = 0;
+	time_t file_end_time = 0;
+	unsigned long cs_file_time = 0;
 	unsigned int filecount = 0;
 	char radio_extension[5];
 	const unsigned long long splitsize = (limit / TS_SIZE) * TS_SIZE;
@@ -235,8 +238,23 @@
 				printf("[stream2file] filename: '%s'\n"
 				       "            myfilename: '%s'\n", filename, myfilename);
 				if (fd2 != -1)
+				{
+					time(&file_end_time);
+					// calculate record time for coolstream neutrino-hd (record time in ms, little endian format)
+					printf("[stream2file] file record time is: %lu sec \n", file_end_time - file_start_time);
+					//printf("DEBUG - stream2file.cpp: CS file_record_time is: %lX \n", (file_end_time - file_start_time) * 1000);
+																									// conversion into little endian
+					cs_file_time =  ((((file_end_time - file_start_time) * 1000)>>24)&0xff) |		// move byte 3 to byte 0
+									((((file_end_time - file_start_time) * 1000)<<8)&0xff0000) |	// move byte 1 to byte 2
+									((((file_end_time - file_start_time) * 1000)>>8)&0xff00) |		// move byte 2 to byte 1
+									((((file_end_time - file_start_time) * 1000)<<24)&0xff000000);	// byte 0 to byte 3 
+					//printf("DEBUG - stream2file.cpp: CS file_record_time stored in ts file: %lX \n", cs_file_time);
+					lseek(fd2, 180, SEEK_SET);
+					write(fd2, &cs_file_time, 4);
 					close(fd2);
+				}
 
+				time(&file_start_time);
 				if ((fd2 = open(filename, flags, REC_FILE_PERMISSIONS)) < 0)
 				{
 					if (errno == EEXIST) {
@@ -302,8 +320,9 @@
 
 		all_bytes_written:
 			if (use_fdatasync)
+			{
 				fdatasync(fd2);
-			
+			}
 			remfile -= (unsigned long long)readsize;
 		}
 		else
@@ -315,8 +334,21 @@
 	}
  terminate_thread:
 	if (fd2 != -1)
-		close (fd2);
-
+	{
+		time(&file_end_time);
+		// calculate record time for coolstream neutrino-hd (record time in ms, little endian format)
+		printf("[stream2file] file record time is: %lu sec \n", file_end_time - file_start_time);
+		//printf("DEBUG - stream2file.cpp: CS file_record_time is: %lX \n", (file_end_time - file_start_time) * 1000);
+																						// conversion into little endian
+		cs_file_time =  ((((file_end_time - file_start_time) * 1000)>>24)&0xff) |		// move byte 3 to byte 0
+						((((file_end_time - file_start_time) * 1000)<<8)&0xff0000) |	// move byte 1 to byte 2
+						((((file_end_time - file_start_time) * 1000)>>8)&0xff00) |		// move byte 2 to byte 1
+						((((file_end_time - file_start_time) * 1000)<<24)&0xff000000);	// byte 0 to byte 3 
+		//printf("DEBUG - stream2file.cpp: CS file_record_time stored in ts file: %lX \n", cs_file_time);
+		lseek(fd2, 180, SEEK_SET);
+		write(fd2, &cs_file_time, 4);
+		close(fd2);
+	}
 	pthread_exit(NULL);
 }
 
@@ -668,6 +700,7 @@
 	   stopped recording. */
 	if (record_start_time == 0)
 		time(&record_start_time);
+
 	return STREAM2FILE_OK;
 }
 
@@ -680,7 +713,7 @@
 		mi.clearMovieInfo(&movieinfo);
 
 		time(&record_end_time);
-		printf("record time: %lu \n",record_end_time-record_start_time);
+		printf("[stream2file] record time: %lu sec \n",record_end_time - record_start_time);
 		//load MovieInfo and set record time
 		movieinfo.file.Name = myfilename;
 		movieinfo.file.Name += ".ts";

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Donnerstag 28. Mai 2015, 08:28
von GetAway
Hi,

wie sieht es mit diesem Patch aus? Wenn der unkritisch ist, könnte er ins Git.

Wäre nett wenn einer der Streamprofis nochmal draufschaut.

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Freitag 12. Juni 2015, 11:34
von GetAway
Ich habe den Patch nun committed, nachdem ich ihn selber nochmal getestet habe.
Die Zeiten werden astrein auf der Cooli berechnet, dabei ist mir aufgefallen, dass die
Berechnung in Neutrino SD wohl als die eines Schätzeisens anzusehen ist. Beispielsweise
werden 900 Sekunden Aufnahme als 11 Minuten angezeigt.

Ich habe der ganzen Sache noch ein Menü zum deaktivieren angehängt - default ist
also "ein".

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Freitag 12. Juni 2015, 12:41
von seife
Der movieplayer2 berechnet die Timestamps korrekt IIRC. Der originale movieplayer schätzt die Zeit anhand der Dateiposition.

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Freitag 12. Juni 2015, 20:21
von Gaucho316
seife hat geschrieben:Der originale movieplayer schätzt die Zeit anhand der Dateiposition.
Ja, so ist das. Der Standardfaktor, mit dem dann die abgespielte Zeit berechnet wird, ist ziemlich willkürlich gewählt. Deshalb habe ich vor einiger Zeit die Aufnahmezeit aus der Aufnahme-XML mit in die Berechnung der abgespielten Zeit miteinbezogen. Dann ist es schon besser. Da aber auch das ein wenig ungenau ist und nur funktioniert, wenn die Aufnahme ungesplittet ist, muss man erst die Einstellung "streaming_use_reclength" von Hand auf "true" setzen, damit das aktiv ist.

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Freitag 12. Juni 2015, 21:16
von mrvica
Ich wollte die Windows Version erstellen, komme aber an genpsi.h und genpsi.c nicht ran, ich sehe hier die Änderungen von GetAway, kann aber nichts herunterladen, habe keine Lust ganzes git herunterzuladen
http://sourceforge.net/p/tuxbox-cvs/mai ... nth=201506
früher war das alles einfacher z.B.
http://blog.gmane.org/gmane.comp.video.tuxbox.scm/
oder ich kann das einfach nicht bedienen, kann die Dateien jemand hier hochladen

mrvica

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Freitag 12. Juni 2015, 21:38
von Gaucho316
Zur Not folge einfach den folgenden beiden Links:
http://sourceforge.net/p/tuxbox-cvs/app ... format=raw
http://sourceforge.net/p/tuxbox-cvs/app ... format=raw

Von der Projektseite bei SourceForge aus, kannst du dich über "Browse Code" übrigens auch selbst zu benötigten Dateien durchklicken.

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Freitag 12. Juni 2015, 23:55
von mrvica
muss ich passen, ist ja kein stand alone genpsi, es fehlt main(), wenn jemand genpsi.c im Anhang mit den Änderungen von heute umstricken will, mache ich es gerne, das compiliert unter Windows einwandfrei, grad getestet

mrvica

Re: [Patch] Coolstream Neutrino-HD "kompatible" TS-Dateien

Verfasst: Samstag 13. Juni 2015, 12:33
von seife
Das Standalone genpsi weiß ja sowieso die Länge der Aufnahme nicht und kann deswegen diesen Wert auch nicht in den Header schreiben.