Zu den Aufzeichnungen der tutorials.de-Live-Workshops
Like Tree2Danke
  • 1 Beitrag von deepthroat
  • 1 Beitrag von deepthroat
ERLEDIGT
JA
ANTWORTEN
5
ZUGRIFFE
310
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Der Wolf Der Wolf ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    153
    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
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    7.983
    Hi.

    Initialisiere den Vektor doch direkt mit den Daten:
    Code cpp:
    1
    
    std::vector<unsigned char> values(buffer->data, buffer->data + buffer->size);
    Dies sollte im Normalfall dazu führen dass memcpy verwendet wird, welches um Größenordnungen schneller sein dürfte als eine Schleife.

    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ß
    Der Wolf bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Der Wolf Der Wolf ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    153
    Ja, das mit der Doku war auch mein Problem. Auf jedenfall schonmal Danke für den Tipp.

    Gruß
    Der Wolf
     

  4. #4
    Der Wolf Der Wolf ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    153
    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 Wolf
    Geändert von Der Wolf (27.08.10 um 23:30 Uhr)
     

  5. #5
    Der Wolf Der Wolf ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    153
    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
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    7.983
    Hi.
    Zitat Zitat von Der Wolf Beitrag anzeigen
    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.
    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ß
    Der Wolf bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. [MySQL] Geschwindigkeit Lesbarkeit Effizienz
    Von chmee im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 21.09.09, 21:36
  2. Mal wieder Frage zur verbesserung der Effizienz
    Von NoGFX im Forum Flash Plattform
    Antworten: 2
    Letzter Beitrag: 08.05.07, 16:12
  3. Frage zur Effizienz
    Von kevkev im Forum Coders Talk
    Antworten: 5
    Letzter Beitrag: 24.04.06, 23:09
  4. Formularverarbeitung Effizienz steigern
    Von sirvival im Forum PHP
    Antworten: 2
    Letzter Beitrag: 28.02.06, 10:56
  5. GGT Effizienz
    Von Java/CppProgrammer im Forum Coders Talk
    Antworten: 3
    Letzter Beitrag: 05.02.05, 14:06