auf der dbox2 gibts Probleme mit Sendern die mit hoher Bitrate senden wie ARD, ZDF. Ich habe den Buffer in record.cpp halbiert und bekomme jetzt bei den genannten Sendern bessere Aufnahmen, anstatt 512k, kleinerer 256k Buffer, da ts Filegrösse ein vielfaches von 188 Bytes sein muss ist der Buffer nicht exakt 256x1024 Bytes gross, etwas kleiner, um mir die ganze Rechnerei zu ersparen, habe ich einfach CVS Werte halbiert, habe anschliessend Testaufnahmen gemacht, die Programme melden kein icorrect File Size, auch keine Probleme mit Slices (Schnippseln), habe 1GB Schnippsel angelegt, ProjectX fügt sie anstandslos zusammen, habe den Code vorerst für dbox2 abgetrennt, kannst du mal mit 256k Buffer auf der Dream testen, fals OK könnte man dann den Code vereinfachen.dbluelle 10/09/19 14:24:40
Modified: tuxbox/enigma/lib/dvb servicedvb.cpp
Log:
better skipping on recordings with low bitrate (still not really good because I don't fully understand how the buffering works...)
record.cpp.diff
Code: Alles auswählen
--- record.cpp Mon Jan 04 22:24:56 2010
+++ record.cpp Fri May 14 18:31:38 2010
@@ -10,6 +10,7 @@
#include <lib/dvb/servicedvb.h>
#include <lib/system/file_eraser.h>
#include <lib/system/econfig.h>
+#include <lib/system/info.h>
#include <signal.h>
#ifndef DMX_LOW_BITRATE
@@ -210,7 +211,7 @@
PatPmtWrite();
while (state == stateRunning)
{
- int rd = 524144-bufptr;
+ int rd = eSystemInfo::getInstance()->getHwType() < 3 ? (262072-bufptr) : (524144-bufptr);
if ( rd > 65424 )
rd = 65424;
int r = ::read(dvrfd, buf+bufptr, rd);
@@ -241,13 +242,14 @@
/* note that some dvr devices occasionally return EOF, we should ignore that */
bufptr += r;
+ int buf2 = eSystemInfo::getInstance()->getHwType() < 3 ? 262071 : 524143;
if ( writePatPmt ) // is set in SAHandler
{
PatPmtWrite();
writePatPmt=false;
}
- else if ( bufptr > 524143 )
+ else if ( bufptr > buf2 )
flushBuffer();
}
alarm(0);
@@ -271,6 +273,7 @@
for (ePtrList<PMTEntry>::iterator i(pmt->streams); i != pmt->streams.end(); ++i)
{
int record=0;
+ int isUndocumentedNA = 0;
switch (i->stream_type)
{
case 1: // video..
@@ -281,6 +284,11 @@
case 4:
record=1;
break;
+ case 0x80:
+ case 0x81:
+ case 0x82:
+ case 0x83:
+ isUndocumentedNA = 1;
case 6:
for (ePtrList<Descriptor>::iterator it(i->ES_info); it != i->ES_info.end(); ++it)
{
@@ -294,6 +302,12 @@
record=1;
break;
}
+ case DESCR_ISO639_LANGUAGE:
+ if (isUndocumentedNA)
+ {
+ record = 1;
+ }
+ break;
#ifdef RECORD_TELETEXT
case DESCR_TELETEXT:
{
@@ -667,10 +681,11 @@
__u8 secbuf[4300]; // with ts overhead...
int len = section2ts(secbuf, (__u8*)data, pid, cc);
+ int buf2 = eSystemInfo::getInstance()->getHwType() < 3 ? 262071 : 524143;
if ( len )
{
- if ( (bufptr+len) > 524143 )
+ if ( (bufptr+len) > buf2 )
flushBuffer();
memcpy(buf+bufptr, secbuf, len);
edvb.cpp.diff
Code: Alles auswählen
--- edvb.cpp Sun Jul 19 14:59:28 2009
+++ edvb.cpp Fri May 14 00:13:19 2010
@@ -259,6 +259,7 @@
for (ePtrList<PMTEntry>::iterator i(pmt->streams); i != pmt->streams.end(); ++i)
{
int record=0;
+ int isUndocumentedNA = 0;
switch (i->stream_type)
{
case 1: // video..
@@ -269,6 +270,11 @@
case 4:
record=1;
break;
+ case 0x80:
+ case 0x81:
+ case 0x82:
+ case 0x83:
+ isUndocumentedNA = 1;
case 6:
for (ePtrList<Descriptor>::iterator it(i->ES_info); it != i->ES_info.end(); ++it)
{
@@ -282,6 +288,12 @@
record=1;
break;
}
+ case DESCR_ISO639_LANGUAGE:
+ if (isUndocumentedNA)
+ {
+ record = 1;
+ }
+ break;
#ifdef RECORD_TELETEXT
case DESCR_TELETEXT:
{