[client] initial support for compressed frames

This commit is contained in:
Geoffrey McRae 2017-12-29 21:20:51 +11:00
parent b5f2092e9c
commit c239306d82
3 changed files with 36 additions and 15 deletions

View File

@ -63,13 +63,21 @@ typedef struct LG_RendererParams
} }
LG_RendererParams; LG_RendererParams;
typedef enum LG_RendererComp
{
LG_COMPRESSION_NONE,
LG_COMPRESSION_H264
}
LG_RendererComp;
typedef struct LG_RendererFormat typedef struct LG_RendererFormat
{ {
LG_RendererComp comp; // compression format
unsigned int width; // image width unsigned int width; // image width
unsigned int height; // image height unsigned int height; // image height
unsigned int stride; // scanline width unsigned int stride; // scanline width (zero if compresed)
unsigned int pitch; // scanline bytes unsigned int pitch; // scanline bytes (or compressed size)
unsigned int bpp; // bits per pixel unsigned int bpp; // bits per pixel (zero if compressed)
} }
LG_RendererFormat; LG_RendererFormat;

View File

@ -309,7 +309,6 @@ int frameThread(void * unused)
header.detail.frame.type >= FRAME_TYPE_MAX || header.detail.frame.type >= FRAME_TYPE_MAX ||
header.detail.frame.width == 0 || header.detail.frame.width == 0 ||
header.detail.frame.height == 0 || header.detail.frame.height == 0 ||
header.detail.frame.stride == 0 ||
header.detail.frame.pitch == 0 || header.detail.frame.pitch == 0 ||
header.detail.frame.dataPos == 0 || header.detail.frame.dataPos == 0 ||
header.detail.frame.dataPos > state.shmSize || header.detail.frame.dataPos > state.shmSize ||
@ -329,11 +328,13 @@ int frameThread(void * unused)
switch(header.detail.frame.type) switch(header.detail.frame.type)
{ {
case FRAME_TYPE_ARGB: case FRAME_TYPE_ARGB:
lgrFormat.comp = LG_COMPRESSION_NONE;
lgrFormat.bpp = 32; lgrFormat.bpp = 32;
break; break;
case FRAME_TYPE_RGB: case FRAME_TYPE_H264:
lgrFormat.bpp = 24; lgrFormat.comp = LG_COMPRESSION_H264;
lgrFormat.bpp = 0;
break; break;
default: default:

View File

@ -265,7 +265,13 @@ bool opengl_on_frame_event(void * opaque, const LG_RendererFormat format, const
return true; return true;
} }
if (!this->configured || memcmp(&this->format, &format, sizeof(LG_RendererFormat)) != 0) if (!this->configured ||
this->format.comp != format.comp ||
this->format.width != format.width ||
this->format.height != format.height ||
this->format.stride != format.stride ||
this->format.bpp != format.bpp
)
{ {
memcpy(&this->format, &format, sizeof(LG_RendererFormat)); memcpy(&this->format, &format, sizeof(LG_RendererFormat));
this->reconfigure = true; this->reconfigure = true;
@ -543,14 +549,20 @@ static bool configure(struct Inst * this, SDL_Window *window)
return false; return false;
} }
// assume 24 and 32 bit formats are RGB and RGBA switch(this->format.comp)
switch(this->format.bpp)
{ {
case 24: case LG_COMPRESSION_NONE:
this->intFormat = GL_RGB8;
this->vboFormat = GL_BGR;
break; break;
case LG_COMPRESSION_H264:
DEBUG_INFO("h264 not supported yet");
LG_UNLOCK(this->formatLock);
return false;
}
// assume 32 bit formats are BGRA
switch(this->format.bpp)
{
case 32: case 32:
this->intFormat = GL_RGBA8; this->intFormat = GL_RGBA8;
this->vboFormat = GL_BGRA; this->vboFormat = GL_BGRA;