C++Guns – RoboBlog

19.05.2012

Nochmal Linux + Canon Powershot SX 130

Filed under: Allgemein — Tags: , — Thomas @ 10:05

Ich hatte ja schon mal kurz gtkam erwähnt um an die Dateien der Kamera zu kommen. Siehe [1]
Nun ist es so, wenn man eine 2GB Datei (HD Videos) laden will, erst mal 2GB Speicher reserviert werden. Leider hat nicht jeder 2GB am Stück frei. Wenn man die Datei überhaupt laden kann, kann es sehr sehr lange dauern (SWAP).

Warum ist das so? Ich habe mich auf die Suche gemacht.
Erstmal den Code von gtkam angesehen. Shit, ist das ein Kraut und Rüben Salat. Da blickt ja kein Mensch durch. Alles nur hingeklatsch. Hauptsache die GUI ist benutzbar und stürzt nicht allzu oft ab. Warum wohl nutze ich wenn möglich Konsolenprogramme.

Aber das bringt auch nichts, wenn die dazugehörige lib (libgphoto2) genauso bescheuert aufgebaut, programmiert und rar dokumentiert ist. Sicher, das ist alles kompliziert und so. Aber genau deswegen sollte man seine Sache gut machen.

Wir sind uns sicher einig, dass das Schreiber einer GUI längst nicht so kompliziert ist, als eine Kamera über USB anzuzapfen, wenn man keine Doku hat wie das geht. Genauso spiegelt sich das auch im Code wird. Der GUI Teil ist miserabel. Aber die Codezeilen, die direkt mit der Kamera reden, die sind gut.
Ein Lob an die Programmierer der Dateien libgphoto2-2.4.14/camlibs/canon/* Es gibt wohl kaum etwas komplizierteres als einer Kamera eine Handvoll Bytes vorzuwerfen, und sie liefert einem die gewünschten Daten.
Auch wenn ich mir nicht mal die Mühe gemacht habe den Code gut nachzuvollziehen, ich habe sofort gesehen wo mein Problem mit dem RAM ist. Und es ist sogar dokumentiert!

usb.c Zeile 1715

...
 * It calls #canon_usb_dialogue(), if it gets a good response it will malloc()
 * memory and read the entire returned data into this malloc'd memory and store
 * a pointer to the malloc'd memory in 'data'
...

...
while (bytes_received < total_data_size) {
...
bytes_read = gp_port_read (camera->port, (char *)*data + bytes_received, read_bytes);

So wie ich das sehe ist es sehr wohl möglich die Daten stückweise von der Kamera zu bekommen. Man hat die Möglichkeit einfach nur nicht vorgesehen.
Es ist nicht so einfach diese Funktion durch all die Abstraktionsebenen durchzuschleusen. Der Kamera spezifische Code muss es können. Dann die Lib. Und die GUI... die nicht.

Aber das nachträglich einzubauen halte ich für unmöglich. Man muss ja ALLES umbauen. Nun, niemand trifft die Schuld. Als man die ersten Codezeilen vor 10 Jahren oder so geschrieben hat, da hat man nicht dran gedacht. Man kann ja nicht an alles denken. Aber sein Code so zu strukturieren, dass nachträgliche Änderungen leicht möglich sind, das ist wohl erst in den letzten Jahren in Mode gekommen. Obwohl.. ich glaube nicht.

[1] http://roboblog.fatal-fury.de/?p=1220

No Comments »

No comments yet.

RSS feed for comments on this post.

Leave a comment

You must be logged in to post a comment.

Powered by WordPress