C
Crymes
Guest
C++ RTP-Empfänger - welches Speichermanagement ?
Hallo,
ich möchte in C++ eine Empfängerklasse für die RTP Übertragung von Bildern erstellen. Folgendes habe ich schon (noch unvollständig) :
Die Klasse Fragment soll ein Stückchen eines Bildes beschreiben und die Klasse Picture bekommt nach und nach mehr Fragmente bis das Bild komplett ist.
Folgendes habe ich mir nun überlegt:
- Jedes Mal beim Eintreffen eines UDP Paketes mit new ein neues Fragment zu erstellen ist zu Fehleranfällig
--> Beste Lösung wäre das placement-new, da die Fragmente unterschiedlich groß sein können (aber schwierig zu implementieren)
--> Als Alternative am Anfang in einem Vector ca. 10000 Fragmente auf Vorrat erstellen
--> 3 Vektoren: AvailableFragmeents (unbenutzte Fragmente), AvailablePictures (unbenutzte Bilder, ca. 3 Bilder am Anfang), ReceivedPictures (Bilder unter konstruktion)
Somit hätte ich noch einen Vektor in Picture der je nach Anzahl der Fragmente wächst
Jetzt stellt sich die Frage ob ich die Fragmente zwischen den Vektoren hin und her kopiere oder ob ich stattdessen Pointer nehme und was passiert wenn pushBack() fehlschlägt (memleak?)
Oder würdet ihr eine komplett andere Speicherverwaltung nehmen ?
Hallo,
ich möchte in C++ eine Empfängerklasse für die RTP Übertragung von Bildern erstellen. Folgendes habe ich schon (noch unvollständig) :
Code:
#include "Capturable.h"
#include "Receivable.h"
#include <memory>
#include <cstdint>
#include <vector>
#define RTPRECEIVER_STANDARD_PICTURE_SIZE 5000000
#define RTPRECEIVER_STANDARD_PACKET_SIZE 1500
#define RTPRECEIVER_STANDARD_PICTURES_IN_FLIGHT 3
class RTPReceiver : public Receivable
{
public:
RTPReceiver(Capturable&, unsigned int = RTPRECEIVER_STANDARD_PICTURE_SIZE, unsigned int = RTPRECEIVER_STANDARD_PACKET_SIZE, unsigned int = RTPRECEIVER_STANDARD_PICTURES_IN_FLIGHT);
virtual ~RTPReceiver();
void receiveData(const char*, std::size_t);
protected:
class Fragment
{
public:
Fragment(unsigned int maxsize);
virtual ~Fragment();
void storeData(char* data, unsigned int size, uint16_t sequencenumber);
uint16_t getSequenceNumber();
unsigned int getDataSize();
char* getData();
unsigned int getMaxSize();
protected:
unsigned int fragmentsize;
uint16_t sn;
unsigned int datasize;
std::unique_ptr<char[]> fragmentdata;
};
class Picture
{
public:
Picture(unsigned int maxsize);
virtual ~Picture();
void releaseFragments(std::vector<Fragment> freefragments);
void addFragment(Fragment *fragment, bool isstartfragment, bool isendfragment);
bool isComplete();
unsigned int getSizeOfPicture();
void storePicture(char*data);
protected:
uint32_t timestamp;
bool hasstartfragment;
bool hasendfragment;
std::vector<Fragment> fragments;
};
Capturable &C;
std::unique_ptr<char[]> picturebuffer;
};
Die Klasse Fragment soll ein Stückchen eines Bildes beschreiben und die Klasse Picture bekommt nach und nach mehr Fragmente bis das Bild komplett ist.
Folgendes habe ich mir nun überlegt:
- Jedes Mal beim Eintreffen eines UDP Paketes mit new ein neues Fragment zu erstellen ist zu Fehleranfällig
--> Beste Lösung wäre das placement-new, da die Fragmente unterschiedlich groß sein können (aber schwierig zu implementieren)
--> Als Alternative am Anfang in einem Vector ca. 10000 Fragmente auf Vorrat erstellen
--> 3 Vektoren: AvailableFragmeents (unbenutzte Fragmente), AvailablePictures (unbenutzte Bilder, ca. 3 Bilder am Anfang), ReceivedPictures (Bilder unter konstruktion)
Somit hätte ich noch einen Vektor in Picture der je nach Anzahl der Fragmente wächst
Jetzt stellt sich die Frage ob ich die Fragmente zwischen den Vektoren hin und her kopiere oder ob ich stattdessen Pointer nehme und was passiert wenn pushBack() fehlschlägt (memleak?)
Oder würdet ihr eine komplett andere Speicherverwaltung nehmen ?