Use turbo jpeg for compression
This commit is contained in:
parent
8a8b388170
commit
7f23d062b7
@ -81,6 +81,26 @@ void AVIWriter::resetFrameBufferImage()
|
|||||||
m_accumulated_time = 0.0f;
|
m_accumulated_time = 0.0f;
|
||||||
} // resetFrameBufferImage
|
} // resetFrameBufferImage
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
int bmpToJPG(uint8_t* raw, unsigned width, unsigned height,
|
||||||
|
uint8_t** jpeg_buffer, unsigned long* jpeg_size)
|
||||||
|
{
|
||||||
|
tjhandle handle = NULL;
|
||||||
|
int ret = 0;
|
||||||
|
handle = tjInitCompress();
|
||||||
|
ret = tjCompress2(handle, raw, width, 0, height, TJPF_BGR, jpeg_buffer,
|
||||||
|
jpeg_size, TJSAMP_420, UserConfigParams::m_recorder_jpg_quality,
|
||||||
|
TJFLAG_FASTDCT);
|
||||||
|
if (ret != 0)
|
||||||
|
{
|
||||||
|
char* err = tjGetErrorStr();
|
||||||
|
Log::error("vpxEncoder", "Jpeg encode error: %s.", err);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
tjDestroy(handle);
|
||||||
|
return ret;
|
||||||
|
} // bmpToJPG
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
int jpgToYuv(uint8_t* jpeg_buffer, unsigned jpeg_size, uint8_t** yuv_buffer,
|
int jpgToYuv(uint8_t* jpeg_buffer, unsigned jpeg_size, uint8_t** yuv_buffer,
|
||||||
TJSAMP* yuv_type, unsigned* yuv_size)
|
TJSAMP* yuv_type, unsigned* yuv_size)
|
||||||
@ -230,11 +250,11 @@ void* AVIWriter::vpxEncoder(void *obj)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
delete [] yuv;
|
delete [] yuv;
|
||||||
free(jpg);
|
tjFree(jpg);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
assert(yuv_type == TJSAMP_420 && yuv_size != 0);
|
assert(yuv_type == TJSAMP_420 && yuv_size != 0);
|
||||||
free(jpg);
|
tjFree(jpg);
|
||||||
vpx_image_t each_frame;
|
vpx_image_t each_frame;
|
||||||
vpx_img_wrap(&each_frame, VPX_IMG_FMT_I420, width, height, 1, yuv);
|
vpx_img_wrap(&each_frame, VPX_IMG_FMT_I420, width, height, 1, yuv);
|
||||||
while (frame_count != 0)
|
while (frame_count != 0)
|
||||||
@ -353,19 +373,12 @@ void* AVIWriter::videoRecord(void *obj)
|
|||||||
p2 -= pitch;
|
p2 -= pitch;
|
||||||
}
|
}
|
||||||
delete [] tmp_buf;
|
delete [] tmp_buf;
|
||||||
size = area * 3;
|
uint8_t* jpg = NULL;
|
||||||
uint8_t* jpg = (uint8_t*)malloc(size);
|
unsigned long jpg_size = 0;
|
||||||
size = avi_writer->bmpToJpg(orig_fbi + area, jpg, size);
|
bmpToJPG(orig_fbi + area, width, height, &jpg, &jpg_size);
|
||||||
delete [] orig_fbi;
|
delete[] orig_fbi;
|
||||||
uint8_t* shrinken = (uint8_t*)realloc(jpg, size);
|
|
||||||
if (shrinken == NULL)
|
|
||||||
{
|
|
||||||
free(jpg);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
jpg = shrinken;
|
|
||||||
jpg_data.lock();
|
jpg_data.lock();
|
||||||
jpg_data.getData().emplace_back(jpg, size, frame_count);
|
jpg_data.getData().emplace_back(jpg, jpg_size, frame_count);
|
||||||
pthread_cond_signal(vpx_ei.m_enc_request);
|
pthread_cond_signal(vpx_ei.m_enc_request);
|
||||||
jpg_data.unlock();
|
jpg_data.unlock();
|
||||||
}
|
}
|
||||||
@ -425,9 +438,7 @@ void AVIWriter::captureFrameBufferImage()
|
|||||||
int pbo_use = m_pbo_use++ % 3;
|
int pbo_use = m_pbo_use++ % 3;
|
||||||
assert(pbo_read == -1 || pbo_use == pbo_read);
|
assert(pbo_read == -1 || pbo_use == pbo_read);
|
||||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, m_pbo[pbo_use]);
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, m_pbo[pbo_use]);
|
||||||
glReadPixels(0, 0, m_width, m_height,
|
glReadPixels(0, 0, m_width, m_height, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
|
||||||
m_avi_format == AVI_FORMAT_JPG ? GL_RGBA: GL_BGRA,
|
|
||||||
GL_UNSIGNED_BYTE, NULL);
|
|
||||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
|
||||||
} // captureFrameBufferImage
|
} // captureFrameBufferImage
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user