Seite 1 von 1
Ein paar Fragen zur libFireBird / WSSKiller source
Verfasst: Mo 19. Mär 2007, 14:46
von Stevie2k
Hallo ihr alle!
Da ihr unschwer an der Anzahl meiner Beiträge erkennt, dass ich relativ neu hier bin bitte ich um Nachsicht, falls meine Fragen irgendwo schon 100mal beantwortet wurden... ich habe die Antworten dann wohl nicht gefunden...
Ich versuche gerade ein eigenes Tap zu schreiben und brauche dafür eine Funktion, um die Farbinformationen einer X und Y Koordinate auslesen zu können... bzw um genau zu sein die Helligkeitsinformation.
Mittels TAP_CaptureScreen erschien mir das wenig sinnvoll, da ich nur EIN Pixel und nicht alle Pixel brauche...
Nach ein wenig Source-Code leserei im WSSKiller habe ich dort dann die Funktion isActiveArea gefunden die wohl scheinbar zusammen mit der libFireBird mir die gewünschte Information heraussucht...
Nur verstehe ich den Code nicht so ganz, insbesonder den If-Block bei dem gegen den Schwarzwert getestet wird.... kann mir das evtl. mal irgendwer erklären oder mir zumidest sagen, ob ich damit den betreffenden Helligkeitswert herausfinden kann?
Was hat es mit den (libFireBird) Werten EMMA_MPEG_PARAM_SEQ und EMMA_WMIF_ATBLO_Y auf sich?
Ist der zweite Wert die Hauptspeicheradresse an der sich der Grafikspeicher befindet?
Wäre echt supernett wenn mir hier irgendwer weiterhelfen könnte....
Viele Grüße,
Stevie
AW: Ein paar Fragen zur libFireBird / WSSKiller source
Verfasst: Mo 19. Mär 2007, 15:07
von FireBird
Hi Stevie,
(jetzt wird es mit dem Auseinanderhalten bald wirklich schwierig

)
[quote=""Stevie2k""]Nach ein wenig Source-Code leserei im WSSKiller habe ich dort dann die Funktion isActiveArea gefunden die wohl scheinbar zusammen mit der libFireBird mir die gewünschte Information heraussucht...
Nur verstehe ich den Code nicht so ganz, insbesonder den If-Block bei dem gegen den Schwarzwert getestet wird.... kann mir das evtl. mal irgendwer erklären oder mir zumidest sagen, ob ich damit den betreffenden Helligkeitswert herausfinden kann?[/quote]
EMMA_MPEG_PARAM_SEQ enthält die X- und Y-Grösse der aktuellen Videoframes und EMMA_WMIF_ATBL0_Y zeigt auf den ersten der 8 Frame-Buffer. Die Routine ist deshalb kompliziert, weil sie den OSD-Buffer mit konstant 720x576 auf die aktuelle Framegrösse umrechnen muss. Zusätzlich ist der Framebuffer nicht ein zweidimensionales Gebilde, sondern wird noch in 32x32 Pixel Blöcke unterteilt. Also wenn Du die Farbe eines Punktes haben möchtest, dann entferne die beiden Schleifen und übernimm den Rest so gut wie möglich. (eigentlich sollte man die ganze Routine in die FBLib assimilieren

)
MfG. Alex
AW: Ein paar Fragen zur libFireBird / WSSKiller source
Verfasst: Mo 19. Mär 2007, 15:22
von StevieC
[quote=""FireBird""]Hi Stevie,
(jetzt wird es mit dem Auseinanderhalten bald wirklich schwierig

)
[/quote]
Wüsste jetzt nicht, was du meinst
Gruß
StevieC
AW: Ein paar Fragen zur libFireBird / WSSKiller source
Verfasst: Mo 19. Mär 2007, 15:52
von ibbi
[quote=""FireBird""](eigentlich sollte man die ganze Routine in die FBLib assimilieren

)[/quote]
Sir. Yes, Sir.

AW: Ein paar Fragen zur libFireBird / WSSKiller source
Verfasst: Mo 19. Mär 2007, 16:11
von FireBird
[quote=""ibbi""]Sir. Yes, Sir.

[/quote]
So war's aber nicht gemeint.

:
AW: Ein paar Fragen zur libFireBird / WSSKiller source
Verfasst: Mo 19. Mär 2007, 16:13
von ibbi
[quote=""FireBird""]So war's aber nicht gemeint.

[/quote]
Ist schon ok.

:
AW: Ein paar Fragen zur libFireBird / WSSKiller source
Verfasst: Di 20. Mär 2007, 07:29
von Stevie2k
Schönen guten morgen mal an alle und erst mal danke für die Antworten...
Sehe ich das richtig, dass folgender Code dann funktionieren müsste? (Bei ersten Versuchen gestern ist mein Toppy (5200 PVRc, FW vom Dez 06) abgestürzt... allerdings hatte ich da noch die Schleife drin. )
Code: Alles auswählen
int giveColorExample (dword x, dword y) {
dword i, j, fx, fy;
dword picAddr;
dword Width, Height;
int result;
Width = (*EMMA_MPEG_PARAM_SEQ & 0x000000ff) << 4;
Height = (*EMMA_MPEG_PARAM_SEQ & 0x0000ff00) >> 4;
picAddr = (((*EMMA_WMIF_ATBL0_Y & 0xffff0000) >> 6) | 0xa0000000);
//If the horizontal size of the frame is not 720 pixel, scale down the x coordinate
fx = (Width != 720) ? x * Width / 720 : x;
//If the vertical size of the frame is not 576 pixel (e.g. NTSC), scale down the y coordinate
fy = (Height != 576) ? y * Height / 576 : y;
result = *(byte *) (picAddr + (fx & 0x1f) + ((fy & 0x1f) << 5) + ((fx & 0xffe0) << 5) + ((fy & 0xffe0) * 736));
return result;
}
Muss ich die LibFireBird erst irgendwie initialisieren? Oder kann ich direkt in meinen Progs damit arbeiten...
Was liefert mit result dann eigentlich genau? Den Y-Anteil aus dem YUV Farbraum?Zwischen 0 (Schwarz) und 255 (weiß)? Kann ich auf diese Weise auch U und V irgendwie erhalten?
Mir geht es zwar primär um den Helligkeitswert, aber für andere Dinge wären die Farbinformationen schon ganz nett...
Ach noch was: so wie ich das verstanden habe, erhalte ich damit den Helligkeitswert bei X,Y im gerade dekodierten MPEG-Frame, hoffentlich ohne OSD... (genau das will ich ja auch)
Gibt es ein Register mit dem ich feststellen kann, ob es sich bei dem aktuellen Frame um einen I-Frame handelt?
Viele Grüße und danke schon mal...
Stevie2k (==> 2k zur Unterscheidung mit den ganzen anderen Stevie's die hier rumschreiben ^^)
AW: Ein paar Fragen zur libFireBird / WSSKiller source
Verfasst: Di 20. Mär 2007, 08:27
von Sigittarius-E
OT: mit dem # Symbol im Editor (oder mit Code: Alles auswählen bzw. [/CODE ] kannst du deinen Source Code besser im Thread darstellen. Schaut übersichtlicher (auch für die anderen Boardleser) aus.
z.B.
[code]int giveColorExample (dword x, dword y) {
dword i, j, fx, fy;
dword picAddr;
.....
|
AW: Ein paar Fragen zur libFireBird / WSSKiller source
Verfasst: Di 20. Mär 2007, 08:37
von FireBird
[quote=""Stevie2k""]Muss ich die LibFireBird erst irgendwie initialisieren? [/quote]
Ja, nämlich mit InitTAPex(), sonst sind die EMMA_*-Pointer nicht initialisiert.
Was liefert mit result dann eigentlich genau? Den Y-Anteil aus dem YUV Farbraum?Zwischen 0 (Schwarz) und 255 (weiß)?
Genau.
Kann ich auf diese Weise auch U und V irgendwie erhalten?
EMMA_WMIF_ATBL0_C zeigt auf den UV-Buffer. Dort stehen dann 2 Byte per Pixel aber abgesehen davon ist die Formel die Selbe. Es wird im nächsten Release der FBLib eine entsprechende Funktion existieren.
Gibt es ein Register mit dem ich feststellen kann, ob es sich bei dem aktuellen Frame um einen I-Frame handelt?
Ist mir zumindest nicht bekannt.
MfG. Alex
AW: Ein paar Fragen zur libFireBird / WSSKiller source
Verfasst: Di 20. Mär 2007, 08:50
von ibbi
[quote=""FireBird""]Es wird im nächsten Release der FBLib eine entsprechende Funktion existieren.[/quote]
... in der dann eine explizite Initialisierung für die EMMA_*-Pointer auch nicht mehr nötig ist.

:
AW: Ein paar Fragen zur libFireBird / WSSKiller source
Verfasst: Di 20. Mär 2007, 09:30
von Stevie2k
Um also die YUV Werte eines beliebigen Pixels zu erhalten würde folgende Funktion gehen? (Ich kann das hier atm leider nicht ausprobieren... meine Entwicklungsumgebung und mein Topf sind ca. 30 km voneinander getrennt :-))
Code: Alles auswählen
void giveColor (dword x, dword y, int *Y, int *U, int *V) {
dword fx, fy;
dword brightAddr;
dword uvAddr;
dword Width, Height;
int result;
Width = (*EMMA_MPEG_PARAM_SEQ & 0x000000ff) << 4;
Height = (*EMMA_MPEG_PARAM_SEQ & 0x0000ff00) >> 4;
// get the Y frame adress
brightAddr = (((*EMMA_WMIF_ATBL0_Y & 0xffff0000) >> 6) | 0xa0000000);
// get the U and V frame adress
uvAddr = (((*EMMA_WMIF_ATBL0_C & 0xffff0000) >> 6) | 0xa0000000);
//If the horizontal size of the frame is not 720 pixel, scale down the x coordinate
fx = (Width != 720) ? x * Width / 720 : x;
//If the vertical size of the frame is not 576 pixel, scale down the y coordinate
fy = (Height != 576) ? y * Height / 576 : y;
// get the right byte for the adress (calculating the 32 x 32 superblocks) for Y
*Y = *(byte *) (brightAddr + (fx & 0x1f) + ((fy & 0x1f) << 5) + ((fx & 0xffe0) << 5) + ((fy & 0xffe0) * 736));
// get the right byte for the adress (calculating the 32 x 32 superblocks) for U
*U = *(byte *) (uvAddr + (fx & 0x1f) + ((fy & 0x1f) << 5) + ((fx & 0xffe0) << 5) + ((fy & 0xffe0) * 736));
// get the right byte for the adress (calculating the 32 x 32 superblocks) for V
*V = *(byte *) (uvAddr + 1 + (fx & 0x1f) + ((fy & 0x1f) << 5) + ((fx & 0xffe0) << 5) + ((fy & 0xffe0) * 736));
}
@Sigittarius-E: Danke für den Hinweis... ich hab hier kein Java-Script deshalb ist das etwas mühsam mit den Tags...
AW: Ein paar Fragen zur libFireBird / WSSKiller source
Verfasst: Di 20. Mär 2007, 09:38
von FireBird
Bei der Adressierung der Farbinformation sehe ich kein 2*.
AW: Ein paar Fragen zur libFireBird / WSSKiller source
Verfasst: Di 20. Mär 2007, 09:39
von Stevie2k
Das eine Byte für U hole ich mir aus uvAddr, das andere für V aus uvAddr + 1
Oder kommt erst der gesamte U Aressraum und dann der gesamte V Adress-Raum?
AW: Ein paar Fragen zur libFireBird / WSSKiller source
Verfasst: Di 20. Mär 2007, 09:48
von FireBird
Vielleicht ist es wirklich noch zu zeitig in der Nacht für mich:
Code: Alles auswählen
uvAddr = (((*EMMA_WMIF_ATBL0_C & 0xffff0000) >> 6) | 0xa0000000);
dword Offset = (fx & 0x1f) + ((fy & 0x1f) << 5) + ((fx & 0xffe0) << 5) + ((fy & 0xffe0) * 736);
*U = *(byte *) (uvAddr + [color=Red]2 *[/color] Offset);
*V = *(byte *) (uvAddr + [color=red]2 *[/color] Offset + 1);
Das Springen um 2 Bytes sehe ich nicht in Deinem Code. Was ich jetzt nicht beschwören möchte, aber ich glaube, dass das erste der beiden Bytes V ist.
AW: Ein paar Fragen zur libFireBird / WSSKiller source
Verfasst: Di 20. Mär 2007, 09:58
von Stevie2k
[quote=""FireBird""]Vielleicht ist es wirklich noch zu zeitig in der Nacht für mich[/quote]
Eher für mich... ich hab das mit den 2 Bytes nicht gescheit umgesetzt... (erst denken dann schreiben hilft :-)