![]() |
HEX und String (Bit 6 auslesen)
Ich hab ein Problem.
Ich code grad an einem kleinen Tool um D2V-Dateien in Delphi zu prasen. Hier mal die relevanten Auszüge aus dem ![]() Zitat:
bit 6 Progressive_Frame Flag (See notes below) 0 (Interlaced) 1 (Progressive) Nur wie? ![]() |
Re: HEX und String (Bit 6 auslesen)
Delphi-Quellcode:
;)
if (value and $00100000) <> 0 then
// Bit gesetzt |
Re: HEX und String (Bit 6 auslesen)
Bit 6? Julius? :shock: War Bit 6 in Hex nicht $40? :gruebel:
Edit: so wie ich das sehe meinst du Bit 1 von Nibble 6 ;) |
Re: HEX und String (Bit 6 auslesen)
Delphi-Quellcode:
... bringt mich nicht weiter, da Delphi jedes Zeichen einzeln sieht.
if pos(uppercase(' '),uppercase(listbox1.items[i])) > 0 then
if (strtoint(listbox1.items[i]) and $00100000) <> 0 then checkbox1.checked:=true else checkbox1.checked:=false; Wie komme ich z.B. auf b0? b0 ist doch HEX oder? Mit Copy? Tempstring > Copy > Value und dann den Code ... |
Re: HEX und String (Bit 6 auslesen)
Mit folgenden Codes kann ich nun die Werte in grün auslesen:
d00 1 0 2048 1 1 92 b2 a2 b2 b2 a2 b2 b2 a2 b2 b2 a2
Delphi-Quellcode:
function GetTok(const Str: string; const Idx: Integer; const Sep: Char): string;
var StrLen: Integer; StrIdx: Integer; ResLen: Integer; TokIdx: Integer; begin Result := ''; if Idx > 0 then begin StrLen := Length(Str); SetLength(Result, StrLen); ResLen := 0; TokIdx := 0; for StrIdx := 1 to StrLen do begin if (Str[StrIdx] <> Sep) and ((StrIdx = 1) or (Str[StrIdx-1] = Sep)) then Inc(TokIdx); if TokIdx > Idx then Break else if (TokIdx = Idx) and (Str[StrIdx] <> Sep) then begin Inc(ResLen); Result[ResLen] := Str[StrIdx]; end; end; SetLength(Result, ResLen); end; end;
Delphi-Quellcode:
nur value währe kein gültiger integer:
if pos(uppercase(' '),uppercase(listbox1.items[i])) > 0 then
begin temp:=listbox1.Items[i]; for tempi := 7 to length(temp) do begin value:=GetTok(temp, tempi, ' '); //Showmessage(value); if (strtoint(value) and $00100000) <> 0 then checkbox1.checked:=true else checkbox1.checked:=false; end; end; if (strtoint(value) and $00100000) <> 0 then checkbox1.checked:=true else checkbox1.checked:=false; |
Re: HEX und String (Bit 6 auslesen)
Zitat:
Aber Bit 6 ist imho $20 und nicht $40 (Bit 7 ...) :mrgreen: Btw.: Was ist ein Nibble ? :gruebel: |
Re: HEX und String (Bit 6 auslesen)
Zitat:
Zitat:
|
Re: HEX und String (Bit 6 auslesen)
Ich will euch ja nicht unterbrechen ;), aber könnte mir einer von Euch "Gurus" ein Beispiel posten?
Es könnte ja sein, dass ich mit meinem Ansatz total falsch liege ...
Delphi-Quellcode:
... damit kommt immer noch ne Fehlermeldung alla 'b2' ist ein gülter Integer Wert.
if pos(uppercase(' '),uppercase(listbox1.items[i])) > 0 then
begin temp:=listbox1.Items[i]; for tempi := 7 to length(temp) do begin value:=GetTok(temp, tempi, ' '); //Showmessage(value); i2:=strtoint(Inttohex(strtoint('x'+value),2)); showmessage(inttostr(i2)); if (i2 and $20) <> 0 then checkbox1.checked:=true else checkbox1.checked:=false; end; end; |
Re: HEX und String (Bit 6 auslesen)
Dann müsste das ja die Lösung sein:
Delphi-Quellcode:
Da ja mein zu prasender Text so aussieht:
if pos(uppercase(' '),uppercase(listbox1.items[i])) > 0 then
begin temp:=listbox1.Items[i]; for tempi := 7 to length(temp) do begin value:=GetTok(temp, tempi, ' '); Showmessage(value+'-'+inttostr($20)); //i2:=strtoint(Inttohex(strtoint('x'+value),2)); //showmessage(inttostr(i2)); //if (i2 and $20) <> 0 then if value = inttostr($20) then thirtytwo:=thirtytwo+1; if thirtytwo > 0 then checkbox1.checked:=true else checkbox1.checked:=false; end; end;
Code:
d00 1 0 2048 1 1 92 b2 a2 b2 b2 a2 b2 b2 a2 b2 b2 a2
900 1 0 53248 1 1 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 900 1 0 133120 1 1 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 900 1 0 423936 1 1 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 900 1 0 712704 1 1 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 900 1 0 917504 1 1 32 32 92 b2 b2 a2 a2 b2 b2 a2 900 1 0 1273856 1 1 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 900 1 0 1644544 1 1 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 900 1 0 1910784 1 1 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 900 1 0 2201600 1 1 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 900 1 0 2516992 1 1 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 900 1 0 2838528 1 1 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 |
Re: HEX und String (Bit 6 auslesen)
Hmm, stimmt jetzt doch nicht, da folgender Code auch progressiv ist:
Code:
d00 1 0 2048 1 1 d2 f2 f2 e2 f2 f2 e2 f2 f2 e2 f2 e2
900 1 0 65536 1 1 72 72 d2 f2 f2 e2 f2 f2 e2 f2 f2 e2 900 1 0 176128 1 1 72 72 d2 f2 f2 e2 f2 f2 e2 f2 f2 e2 900 1 0 284672 1 1 72 72 d2 f2 f2 e2 f2 f2 e2 f2 f2 e2 900 1 0 391168 1 1 72 72 d2 f2 f2 e2 f2 f2 e2 f2 f2 e2 900 1 0 505856 1 1 72 72 d2 f2 f2 e2 f2 f2 e2 f2 f2 e2 900 1 0 630784 1 1 72 72 d2 f2 f2 e2 f2 f2 e2 f2 f2 e2 900 1 0 794624 1 1 72 d2 f2 f2 e2 e2 f2 f2 e2 f2 f2 e2 900 1 0 1011712 1 1 72 72 d2 f2 f2 e2 f2 e2 f2 f2 e2 e2 900 1 0 1280000 1 1 72 72 d2 f2 e2 f2 f2 e2 e2 f2 f2 e2 900 1 0 1585152 1 1 72 d2 f2 f2 e2 e2 f2 f2 e2 f2 f2 e2 900 1 0 1943552 1 1 72 72 d2 f2 f2 e2 f2 f2 e2 f2 f2 e2 900 1 0 2318336 1 1 72 72 d2 e2 f2 f2 e2 f2 e2 f2 f2 e2 |
Re: HEX und String (Bit 6 auslesen)
|
Re: HEX und String (Bit 6 auslesen)
Ich habe mir mal die v0.06a angesehen.
Als erstes ist mir negativ aufgefallen, dass teilweise nichts eingerückt wird. Dann finden sich zwei Verzweigungen zu Frame_Rate:
Delphi-Quellcode:
Theoretisch könnte man diese zusammenfassen. Allerdings wäre es sinnvoller, die zweite Stelle in
if pos(uppercase('Frame_Rate'),uppercase(memo.lines[i])) > 0 then
begin temp:=stringreplace(uppercase(memo.lines[i]),uppercase('Frame_Rate='),'',[rfReplaceAll]); temp:=stringreplace(uppercase(temp),uppercase('/'),' ',[rfReplaceAll]); temp:=stringreplace(uppercase(temp),uppercase('('),' ',[rfReplaceAll]); temp:=stringreplace(uppercase(temp),uppercase(')'),' ',[rfReplaceAll]); text:=GetTok(temp, 2, ' '); value:=GetTok(temp, 3, ' '); Edit11.text:=formatfloat('0.00',strtofloat(text)/strtofloat(value)); end; ... if pos(uppercase('Frame_Rate'),uppercase(memo.lines[i])) > 0 then {nothing} else if pos(uppercase(' '),uppercase(memo.lines[i])) > 0 then begin ...
Delphi-Quellcode:
zu ändern.
if (pos(uppercase(' '), uppercase(memo.lines[i])) > 0)
and (pos(uppercase(':\'),uppercase(memo.lines[i])) = 0) then begin ... Die function GetTok lieferte mir bei der Frame_Rate nur leere Strings zurück. Warum, habe ich nicht weiter untersucht. |
Re: HEX und String (Bit 6 auslesen)
@Garfield:
Das Problem ist noch nicht ganz gelöst. Ich komm mit der Bit-Auslesung nicht klar. 0.06a war nur so ein Versuch. 0.06 war eigentlich die letzte Version. Das mit den zwei Frame_rate ist so: Wenn ich nach Leerzeichen suche kommt automatisch auch die Zeile mit Frame_rate. Hier nochmal ein Ausschnitt der zu bearbeiteten Datei:
Code:
Der Leerzeichencode hat eh noch einen Bug, da ich erst ab der Zeile Stream_Type= anfangen zu Suchen müsste. Es würd ein Fehler passieren, wenn die Dateienpfade (hier im Beispiel 'I:\Delphi\D2VCreateCLI\test\test.vob') Leerzeichen enthalten. (Edit: habs grad getestet. Passiert anscheinend doch nichts ...)
DGIndexProjectFile13
1 I:\Delphi\D2VCreateCLI\test\test.vob Stream_Type=1 MPEG_Type=2 iDCT_Algorithm=2 YUVRGB_Scale=1 Luminance_Filter=0,0 Clipping=0,0,0,0 Aspect_Ratio=16:9 Picture_Size=704x576 Field_Operation=2 Frame_Rate=25000 (25/1) Location=0,0,0,26F7F 900 1 0 190464 1 16 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 900 1 0 638976 1 16 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 900 1 0 1081344 1 16 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 900 1 0 1523712 1 16 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 900 1 0 1921024 1 16 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 900 1 0 2351104 1 16 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 900 1 0 2754560 1 16 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 900 1 0 3147776 1 16 32 32 92 b2 b2 a2 b2 b2 a2 b2 b2 a2 Mit dem neuen Tool D2VCreate hab ich einen Weg gefunden, die Datei über das Programm DGIndex auszulesen, welches auch die Dateien erstellt hat. Nur würd ich gern das Gleiche auch anhand der D2V-Datei mit D2VParse können wollen. Falls Du also noch nen Tip für mich hättest, wie ich das mit den Bit6 machen kann, währe ich dankbar. Auch über folgendes müsste ich mir noch Gedanken machen: Zitat:
|
Re: HEX und String (Bit 6 auslesen)
Zitat:
Zitat:
Zitat:
$20 ist vom Typ Integer. Da Du Strings hast, muss konvertiert werden. Aus dem String musst Du die beiden Zeichen, welche Du auswerten willst - zum Beispiel 'B0' - extrahieren. Dann kannst Du es so auswerten:
Delphi-Quellcode:
Die anderen Bits lassen sich entsprechend auswerten.
...
var Wert : String; Zahl : Byte; // $00 bis $FF ... begin ... Wert := 'B0'; Zahl := StrToInt ('$' + Wert); if Zahl AND $20 > 0 then { Bit 6 gesetzt } else { Bit 6 nicht gesetzt }; ... |
Re: HEX und String (Bit 6 auslesen)
@Garfield: Hmm, so ähnlich hab ichs schon. Schau Dir auch mal diesen
![]() |
Re: HEX und String (Bit 6 auslesen)
Zitat:
Offensichtlich werden die Informationen neu zusammengestellt. Denn ob ein Picture progressive ist, steht zum Beispiel in der PICTURE_CODING_EXTENSION
Delphi-Quellcode:
oder der SEQUENCE_EXTENSION:
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//*************************** iso 13818-2 **************************** // 32 bslbf - extension_start_code // 4 uimsbf - extension_start_code_identifier // picture_coding_extension() // { // 4 uimsbf - f_code[0][0] - forward_horizontal // 4 uimsbf - f_code[0][1] - forward_vertical // 4 uimsbf - f_code[1][0] - backward_horizontal // 4 uimsbf - f_code[1][1] - backward_vertical // 2 uimsbf - intra_dc_precision // 2 uimsbf - picture_structure // 1 uimsbf - top_field_first // 1 uimsbf - frame_pred_frame_dct // 1 uimsbf - concealment_motion_vectors // 1 uimsbf - q_scale_type // 1 uimsbf - intra_vlc_format // 1 uimsbf - alternate_scan // 1 uimsbf - repeat_first_field // 1 uimsbf - chroma_420_type // 1 uimsbf - progressive_frame // 1 uimsbf - composite_display_flag // if ( composite_display_flag ) // { // 1 uimsbf - v_axis // 3 uimsbf - field_sequence // 1 uimsbf - sub_carrier // 7 uimsbf - burst_amplitude // 8 uimsbf - sub_carrier_phase // } // next_start_code() // } //********************************************************************
Delphi-Quellcode:
während der Frametyp im PICTURE_HEADER steht:
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//************************** iso 13818-2 *************************** // sequence_extension() { // 32 - bslbf - extension_start_code // 4 - uimsb - fextension_start_code_identifier // 8 - uimsbf - profile_and_level_indication // 1 - uimsbf - progressive_sequence // 2 - uimsbf - chroma_format // 2 - uimsbf - horizontal_size_extension // 2 - uimsbf - vertical_size_extension // 12 - uimsbf - bit_rate_extension // 1 - bslbf - marker_bit // 8 - uimsbf - vbv_buffer_size_extension // 1 - uimsbf - low_delay // 2 - uimsbf - frame_rate_extension_n // 5 - uimsbf - frame_rate_extension_d // next_start_code() // } //******************************************************************
Delphi-Quellcode:
Allerdings ist der picture_coding_type in der Spez nicht mit 2 sondern 3 Bit angegeben:
//***************************** iso 13818-2 ******************************
// picture_header() // { // 32 bslbf - picture_start_code // 10 uimsbf - temporal_reference // 3 uimsbf - picture_coding_type // 16 uimsbf - vbv_delay // if ( picture_coding_type == 2 || picture_coding_type == 3) // { // 1 bslbf - full_pel_forward_vector // 3 bslbf - forward_f_code // } // if ( picture_coding_type == 3 ) // { // 1 bslbf - full_pel_backward_vector // 3 bslbf - backward_f_code // } // while ( nextbits() == ‘1' ) // { // 1 uimsbf - extra_bit_picture /* with the value ‘1' */ // 8 uimsbf - extra_information_picture // } // 1 uimsbf - extra_bit_picture /* with the value ‘0' */ // next_start_code() // } //************************************************************************
Delphi-Quellcode:
x = forbidden, r = reserved, D = Dropped.
// I_TYPE 1
// P_TYPE 2 // B_TYPE 3 // D_TYPE 4 // Frame_Type: Array [0..7] of CHAR = 'xIPBDrrr'; Da anscheinend Dein Bit 6 trotz progressiver Quelle den Wert 0 besitzt, nehme ich an, dass Deine Quelle eine DVD vermutlich mit einem amerikanischen Film ist. Wenn Du mal in Videoforen in den Beiträgen von 2002/2003 nachsiehst, dürftest Du einige Diskussionen finden, in denen darüber diskutiert wurde, ob eine DVD interlaced oder progressive ist. Denn der Bitrateviewer gab oft interlaced an, obwohl der Sichttest progressive ergab. DVDs sind meist progressive, während das Ausgangsmaterial interlaced gewesen sein kann. Der Encoder hat dann nur das Flag nicht gesetzt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz