Я пытался отформатировать ввод, который я получаю из потока rtsp, предоставленного моей камерой c611w4. Я могу транслировать его напрямую через VLCPlayer, и я также могу отображать один кадр, если я пропускаю часть libvlc_video_set_format, но как только я пытаюсь отформатировать изображение, приложение терпит неудачу.
Вот код:
void CRemoteC611W4Camera::Init(int _width, int _height, int _channelCount) {
m_VLCArgumentVector.push_back("--no-audio");
m_VLCArgumentVector.push_back("--no-xlib");
m_VLCArgumentVector.push_back("-vvv");
int argc = m_VLCArgumentVector.size();
const char* argv[argc];
for(unsigned int i = 0; i < m_VLCArgumentVector.size(); i++) {
argv[i] = m_VLCArgumentVector.at(i).c_str();
}
m_VLCInstance = libvlc_new(argc, argv);
m_VLCMedia = libvlc_media_new_location(m_VLCInstance, "rtsp://admin:admin@192.168.0.100:554/11");
m_VLCPlayer = libvlc_media_player_new_from_media(m_VLCMedia);
libvlc_media_release(m_VLCMedia);
m_CurrentImage.Create(_width, _height, 4);
auto lock = [](void *_data, void **_pixels) -> void* {
CRemoteC611W4Camera* thisContext = (CRemoteC611W4Camera*)_data;
thisContext->m_ImageFetchMutex.Lock();
return *_pixels = thisContext->m_CurrentImage.GetDataPointer();
};
auto unlock = [](void* _data, void* _id, void *const *_pixels) {
CRemoteC611W4Camera* thisContext = (CRemoteC611W4Camera*)_data;
thisContext->m_ImageFetchMutex.Unlock();
};
auto display = [](void *_data, void *_id) {
(void) _data;
};
libvlc_video_set_callbacks(m_VLCPlayer, lock, unlock, display, this);
libvlc_video_set_format(m_VLCPlayer, "RGBA", _width, _height, _width*4);
libvlc_media_player_play(m_VLCPlayer);
usleep(10000000);
}
Обратите внимание, что m_CurrentImage является членом класса CRemoteC611W4Camera с его определением:
struct CImageFormat {
public:
int m_Width;
int m_Height;
int m_ChannelCount;
CImageFormat(int _width, int _height, int _channelCount) : m_Width(_width), m_Height(_height), m_ChannelCount(_channelCount) {}
};
class CRGB24Image {
public:
CRGB24Image() : m_Data(nullptr), m_Format(0, 0, 3) {}
virtual ~CRGB24Image() {}
size_t Create(const CRGB24Image& _img);
size_t Create(int _w, int _h, int _channelCount);
void Destroy();
int At(int _w, int _h, int _c) const;
unsigned char* GetDataPointer() const { return m_Data; }
int GetWidth() const { return m_Format.m_Width; }
int GetHeight() const { return m_Format.m_Height; }
int GetChannelCount() const { return m_Format.m_ChannelCount; }
private:
unsigned char* m_Data;
CImageFormat m_Format;
};
size_t CRGB24Image::Create(int _w, int _h, int _channelCount) {
Destroy();
m_Data = (unsigned char*)aligned_alloc(32, _w*_h*_channelCount);
m_Format.m_Width = _w;
m_Format.m_Height = _h;
m_Format.m_ChannelCount = _channelCount;
return _w*_h*_channelCount;
}
size_t CRGB24Image::Create(const CRGB24Image& _img) {
Destroy();
size_t retVal = Create(_img.m_Format.m_Width, _img.m_Format.m_Height, _img.m_Format.m_ChannelCount);
memcpy(m_Data, _img.m_Data, retVal);
return retVal;
}