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";
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