![]() |
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 02:12 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-2025 by Thomas Breitkreuz