2Danke
ERLEDIGT
JA
JA
ANTWORTEN
5
5
ZUGRIFFE
310
310
EMPFEHLEN
-
Hallo,
ich versuche mich im Moment an einem gstreamer plugin um die Bild-Daten und andere errechnete Daten über eine bestimmte Middleware an andere Komponenten verschicken zu können. Dafür muss ich die guint8 Daten die gstreamer in einem Buffer verschickt in eine Ice::ByteSeq verpacken um sie dann verschicken zu können. Im Moment mache ich das über folgenden Code:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
void XcfExporter::processBuffer(GstBuffer *buffer) { gst_buffer_ref(buffer); XCF::Binary::TransportVecBytePtr transport = new XCF::Binary::TransportVecByte(); std::vector<unsigned char> values(buffer->size); for (int i = 0; i < buffer->size; i++) { values[i] = (buffer->data)[i]; } transport->set(values); XCF::CTUPtr ctu = new XCF::CTU(); ctu->setXML("<MIXELGRAM></MIXELGRAM>"); ctu->addBinary("image", transport); mixelgramPublisher->send(ctu); gst_buffer_unref(buffer); }
Ich kann mir aber vorstellen, dass man das Kopieren der Daten bestimmt auch effizienter gestalten kann. Hat jemand da einen Vorschlag für mich?
Gruß
Der Wolf
-
27.08.10 13:51 #2
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
Hi.
Initialisiere den Vektor doch direkt mit den Daten:
Dies sollte im Normalfall dazu führen dass memcpy verwendet wird, welches um Größenordnungen schneller sein dürfte als eine Schleife.Code cpp:1
std::vector<unsigned char> values(buffer->data, buffer->data + buffer->size);
Vermutlich gibt es allerdings auch direkt einen ByteSeq Konstruktor welcher die Daten direkt aufnehmen kann, so dass man nicht noch einen temporären Vektor kreieren muss. Ich habe allerdings keine Doku gefunden...
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Ja, das mit der Doku war auch mein Problem. Auf jedenfall schonmal Danke für den Tipp.
Gruß
Der Wolf
-
Hi,
gleich die nächste Frage ... wenn in dem data->buffer ein Array mit guint8 was wohl ein anderer Name für unsigned char ist steckt und wenn ich annehme, dass da ursprünglich int Werte drin standen die jetzt als unsigned char codiert sind, müsste ich die dann nicht über folgenden code wieder in einen vector mit unsigned int Werten konvertieren können?
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
void AudioAnalyse::processData(GstBuffer *buffer) { gst_buffer_ref(buffer); std::cout << "Entering ... " << std::endl; std::string mimeType = getMimeType(buffer); std::cout << mimeType << std::endl; unsigned int *tmpData = (unsigned int*) buffer->data; std::vector<unsigned int> values(tmpData, tmpData + (buffer->size / sizeof(unsigned int))); float average = 0; for (int i = 0; i < buffer->size; i++) { average = average + values[i]; } std::cout << "Average: " << (average /= values.size()) << " Size: " << values.size() << std::endl; gst_buffer_unref(buffer); }
Ich bekomme allerdings teilweise errechnete average Werte raus die über dem liegen, was gstreamers alsasrc plugin angeblich rauswirft und ab und an bekomme ich auch einen SEGSEV Fehler.
Gruß
Der WolfGeändert von Der Wolf (27.08.10 um 23:30 Uhr)
-
Also den SIGSEV Fehler hab ich mittlerweile gefunden. Der lag darin begründet, dass meine Schleife einfach zu weit gelaufen ist, da ich über die Größe des Buffers und nicht des Vektors iteriere ... Zeile 17 muss also so lauten:
Code cpp:1
for (int i = 0; i < values.size(); i++) {
Und ich hab auch gesehen, dass die Werte die gstreamer mir liefert nicht unsigned sondern signed sind.
Trotzdem würde mich mal interessieren, ob der allgmeine Ansatz, dass ich so den Speicherbereich von byte nach int uminterpretieren kann, richtig ist, wie ich ihn hier angegangen bin.
Gruß
Der Wolf
-
29.08.10 18:25 #6
- Registriert seit
- Jun 2005
- Beiträge
- 7.983
Hi.Typen sind lediglich eine Hilfe des Compilers. Wenn du eine Byte-Sequenz übergeben bekommst, es aber besser weißt, da es sich dabei tatsächlich um eine Int-Sequenz handelt, dann ist es völlig OK zu casten.
Allerdings empfiehlt es sich in C++ die neuen Cast-Operatoren (reinterpret_cast etc.) zu verwenden.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
[MySQL] Geschwindigkeit Lesbarkeit Effizienz
Von chmee im Forum Relationale DatenbanksystemeAntworten: 3Letzter Beitrag: 21.09.09, 21:36 -
Mal wieder Frage zur verbesserung der Effizienz
Von NoGFX im Forum Flash PlattformAntworten: 2Letzter Beitrag: 08.05.07, 16:12 -
Frage zur Effizienz
Von kevkev im Forum Coders TalkAntworten: 5Letzter Beitrag: 24.04.06, 23:09 -
Formularverarbeitung Effizienz steigern
Von sirvival im Forum PHPAntworten: 2Letzter Beitrag: 28.02.06, 10:56 -
GGT Effizienz
Von Java/CppProgrammer im Forum Coders TalkAntworten: 3Letzter Beitrag: 05.02.05, 14:06





Zitieren

Login





