1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub _getoffset {
my ($shelf,$args) = @_;
my $frame = \$args->{'frame'};
my $index = \$args->{'index'};
my $startpos = ( $ACHT * ${$frame} ) ;
if ( not ( ${$index} ) ) { return ('index not found in _getoffset'); }
my $ok = 'false';
my $offsetrc = q{};
my $filenorc = q{};
my $buffer = \$shelf->_readindex({index=>${$index},frame=>${$frame},});
my ($frameoffset,undef,$independent,$filenumber) = unpack 'ssss', ${$buffer};
$offsetrc = hex $frameoffset;
$filenorc = hex $filenumber;
print "_getoffsetstart || frame ${$frame} hex $frameoffset <-> dez $offsetrc in file $filenorc\n";
return ($offsetrc,$filenorc);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
sub _readindex {
my ($shelf,$args) = @_;
my $frame = \$args->{'frame'};
my $index = \$args->{'index'};
my $buffer = q{};
open my $INDEX, '<', ${$index} or croak $shelf->_message({msg=>"Couldn't open ${$index} $ERRNO"});
seek $INDEX, ${$frame} ,'0' ;
read $INDEX, $buffer, $ACHT;
close $INDEX or croak $shelf->_message({msg=>"Couldn't close ${$index} $ERRNO"});
return ($buffer);
}
1 2
my $buffer = $shelf->_readindex({index=>${$index},frame=>${$frame},}); my ($frameoffset,$independent,$filenumber)=unpack('icc', $buffer);
Quote
1
2
3
4
5
6
struct tIndex
{ int offset; //(signed 32bit/4byte) Speicherposition des Frame, relativ zum Dateianfang der jeweiligen Datei, verweist auf PES header
uchar type; //(8bit/1byte) Type des Frames (no frame=0, I=1, P=2, B=3) nur an I-Frames kann geschnitten oder können beim Spulen ansprungen werden.
uchar number; //(8bit/1byte) Nummer der Datei (00x.vdr) in der das Frame zu finden ist.
short reserved; //(16bit/2byte)
};
2011-04-30T06:09:31 topegDie letzten beiden Bytes sind nur reserviert und zur Zeit nicht genutzt. Anhand des Codes von mark05 kann man vermuten, dass er den Wert auch nicht will. Weiterhin schneidet er aus der Datei die acht Byte heraus. Das bedeutet man kann den letzten Wert weg lassen.
1 2 3
my @l=unpack('(iccs)*',$file_data); my @index; push(@index,[splice(@l,0,4)]) while(@l);
2011-04-30T06:40:15 topegEr schnibbelt acht Byte bei einer definierten Position aus der Datei und schickt das durch unpack, der Zeiger in der Datei ist davon nicht betroffen. Zumal er die Datei für jeden Lesevorgang neu öffnet.
In seiner Anwendung ist das das letzte Short irrelevant :-)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#!/usr/bin/perl use strict; use warnings; my $werte=''; $werte.=pack('iccs',$_,-1,1,0) for(0..9); my @l=unpack('(iccs)*',$werte); while(@l) { my @back=splice(@l,0,4); pop(@back); print "@back\n"; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#!/usr/bin/perl use strict; use warnings; my $werte=''; $werte.=pack('iccs',$_,-1,1,0) for(0..9); my $cnt=0; while(($cnt*8) < length($werte)) { my @back=unpack('icc',substr($werte,$cnt*8,8)); print "@back\n"; $cnt++; }
1
2
3
4
5
6
7
8
9
10
11
12
13
# from recording.c vdr 1.7.18
# uint64_t offset:40; // up to 1TB per file (not using off_t here - must definitely be exactly 64 bit!) 8byte
# int reserved:7; // reserved for future use 1 byte
# int independent:1; // marks frames that can be displayed by themselves (for trick modes) 1 byte
# uint16_t number:16; // up to 64K files per recording 2 byte
# tIndexTs(off_t Offset, bool Independent, uint16_t Number)
# {
# offset = Offset;
# reserved = 0;
# independent = Independent;
# number = Number;
# }
# };
unpack "nssl", $buffer;
my ($offset, $independent,$number)=pack('QxCI' ,$buffer);
2011-04-30T16:22:34 topegOhne mehr Infos kann ich nicht helfen.
2011-05-10T19:55:43 topegIst das alles so geheim? Oder traust du anderen nicht zu das Problem auch zu lösen?
1
2
3
4
5
6
7
# from recording.c vdr 1.7.18
# uint64_t offset:40; // up to 1TB per file (not using off_t here - must definitely be exactly 64 bit!) 8byte
# int reserved:7; // reserved for future use 1 byte
# int independent:1; // marks frames that can be displayed by themselves (for trick modes) 1 byte
# uint16_t number:16; // up to 64K files per recording 2 byte
# tIndexTs(off_t Offset, bool Independent, uint16_t Number)
# {
my ($byteoffset,undef,$filenumber) = unpack 'lssQ', ${$buffer};
my ($byteoffset,undef,$independet,$filenumber) = unpack 'lssQ', ${$buffer};