Nvidia resizing, init failure check

video
Lauri Kasanen 4 years ago
parent c768e70fba
commit f8c9983d9b

@ -401,7 +401,8 @@ void EncodeManager::doUpdate(bool allowLossy, const Region& changed_,
/* /*
* In extra-low-quality mode, if x264 is enabled, send entire screen frames * In extra-low-quality mode, if x264 is enabled, send entire screen frames
*/ */
if (rfb::Server::x264Bitrate && videoDetected) { if (rfb::Server::x264Bitrate && videoDetected &&
((TightX264Encoder *) encoders[encoderTightX264])->tryInit(pb)) {
std::vector<Rect> rects; std::vector<Rect> rects;
changed.get_rects(&rects); changed.get_rects(&rects);
updateVideoStats(rects, pb); updateVideoStats(rects, pb);

@ -45,7 +45,7 @@ TightX264Encoder::TightX264Encoder(SConnection* conn, EncCache *cache_, uint8_t
keyframe(true), mux(NULL), muxstate(NULL), framectr(0), keyframe(true), mux(NULL), muxstate(NULL), framectr(0),
nvidia_init_done(false), nvidia_init_done(false),
encCache(cache_), cacheType(cacheType_), encCache(cache_), cacheType(cacheType_),
framebuf(NULL), framelen(0), bitbuf(NULL) framebuf(NULL), framelen(0), bitbuf(NULL), myw(0), myh(0)
{ {
framebuf = new uint8_t[MAX_FRAMELEN]; framebuf = new uint8_t[MAX_FRAMELEN];
bitbuf = new uint8_t[MAX_FRAMELEN]; bitbuf = new uint8_t[MAX_FRAMELEN];
@ -98,12 +98,22 @@ void TightX264Encoder::writeRect(const PixelBuffer* pb, const Palette& palette)
/*w += w & 1; /*w += w & 1;
h += h & 1;*/ h += h & 1;*/
if (w != myw || h != myh) {
if (nvidia_init_done)
nvidia_unload();
nvidia_init_done = false;
}
if (!nvidia_init_done) { if (!nvidia_init_done) {
if (nvidia_init(w, h, rfb::Server::x264Bitrate, if (nvidia_init(w, h, rfb::Server::x264Bitrate,
rfb::Server::frameRate) != 0) { rfb::Server::frameRate) != 0) {
vlog.error("nvidia init failed"); vlog.error("nvidia init failed, disabling h264");
rfb::Server::x264Bitrate.setParam(0);
return;
} }
nvidia_init_done = true; nvidia_init_done = true;
myw = w;
myh = h;
} }
os = conn->getOutStream(); os = conn->getOutStream();
@ -315,3 +325,23 @@ void TightX264Encoder::writeCompact(rdr::U32 value, rdr::OutStream* os) const
} }
} }
} }
bool TightX264Encoder::tryInit(const PixelBuffer* pb) {
if (nvidia_init_done)
return true;
uint32_t w, h;
w = pb->width();
h = pb->height();
if (nvidia_init(w, h, rfb::Server::x264Bitrate,
rfb::Server::frameRate) != 0) {
vlog.error("nvidia init failed, disabling h264");
rfb::Server::x264Bitrate.setParam(0);
return false;
}
nvidia_init_done = true;
myw = w;
myh = h;
}

@ -50,6 +50,8 @@ namespace rfb {
virtual void setKeyframe() { keyframe = true; } virtual void setKeyframe() { keyframe = true; }
bool tryInit(const PixelBuffer* pb);
protected: protected:
void writeCompact(rdr::U32 value, rdr::OutStream* os) const; void writeCompact(rdr::U32 value, rdr::OutStream* os) const;
void mp4_write_callback(const void *buffer, size_t size); void mp4_write_callback(const void *buffer, size_t size);
@ -69,6 +71,8 @@ namespace rfb {
uint32_t framelen; uint32_t framelen;
uint8_t *bitbuf; uint8_t *bitbuf;
uint16_t myw, myh;
}; };
} }
#endif #endif

@ -387,7 +387,7 @@ int nvenc_frame(const uint8_t *data, unsigned pts, uint8_t *out, uint32_t &outle
return 0; return 0;
} }
static void unload() { void nvidia_unload() {
NV_ENC_PIC_PARAMS params; NV_ENC_PIC_PARAMS params;
memset(&params, 0, sizeof(NV_ENC_PIC_PARAMS)); memset(&params, 0, sizeof(NV_ENC_PIC_PARAMS));
params.version = NV_ENC_PIC_PARAMS_VER; params.version = NV_ENC_PIC_PARAMS_VER;

@ -6,5 +6,6 @@
int nvidia_init(const unsigned w, const unsigned h, const unsigned kbps, int nvidia_init(const unsigned w, const unsigned h, const unsigned kbps,
const unsigned fps); const unsigned fps);
int nvenc_frame(const uint8_t *data, unsigned pts, uint8_t *out, uint32_t &outlen); int nvenc_frame(const uint8_t *data, unsigned pts, uint8_t *out, uint32_t &outlen);
void nvidia_unload();
#endif #endif

Loading…
Cancel
Save