mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-03-11 10:03:43 +00:00
compress only lastest frame
This commit is contained in:
@@ -104,9 +104,9 @@ int us_queue_get(us_queue_s *queue, void **item, ldf timeout) {
|
|||||||
|
|
||||||
#undef _WAIT_OR_UNLOCK
|
#undef _WAIT_OR_UNLOCK
|
||||||
|
|
||||||
/*int us_queue_get_free(us_queue_s *queue) {
|
bool us_queue_is_empty(us_queue_s *queue) {
|
||||||
US_MUTEX_LOCK(queue->mutex);
|
US_MUTEX_LOCK(queue->mutex);
|
||||||
const uint size = queue->size;
|
const uint size = queue->size;
|
||||||
US_MUTEX_UNLOCK(queue->mutex);
|
US_MUTEX_UNLOCK(queue->mutex);
|
||||||
return queue->capacity - size;
|
return (bool)(queue->capacity - size);
|
||||||
}*/
|
}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ typedef struct {
|
|||||||
|
|
||||||
#define US_QUEUE_DELETE_WITH_ITEMS(x_queue, x_free_item) { \
|
#define US_QUEUE_DELETE_WITH_ITEMS(x_queue, x_free_item) { \
|
||||||
if (x_queue) { \
|
if (x_queue) { \
|
||||||
while (!us_queue_get_free(x_queue)) { \
|
while (!us_queue_is_empty(x_queue)) { \
|
||||||
void *m_ptr; \
|
void *m_ptr; \
|
||||||
if (!us_queue_get(x_queue, &m_ptr, 0)) { \
|
if (!us_queue_get(x_queue, &m_ptr, 0)) { \
|
||||||
US_DELETE(m_ptr, x_free_item); \
|
US_DELETE(m_ptr, x_free_item); \
|
||||||
@@ -61,4 +61,4 @@ void us_queue_destroy(us_queue_s *queue);
|
|||||||
|
|
||||||
int us_queue_put(us_queue_s *queue, void *item, ldf timeout);
|
int us_queue_put(us_queue_s *queue, void *item, ldf timeout);
|
||||||
int us_queue_get(us_queue_s *queue, void **item, ldf timeout);
|
int us_queue_get(us_queue_s *queue, void **item, ldf timeout);
|
||||||
// int us_queue_get_free(us_queue_s *queue);
|
bool us_queue_is_empty(us_queue_s *queue);
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#include <stdatomic.h>
|
#include <stdatomic.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
@@ -303,6 +304,10 @@ static void *_jpeg_thread(void *v_ctx) {
|
|||||||
if (us_queue_get(ctx->queue, (void**)&hw, 0.1) < 0) {
|
if (us_queue_get(ctx->queue, (void**)&hw, 0.1) < 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
while (!us_queue_is_empty(ctx->queue)) { // Берем только самый свежий кадр
|
||||||
|
us_device_buffer_decref(hw);
|
||||||
|
assert(!us_queue_get(ctx->queue, (void**)&hw, 0));
|
||||||
|
}
|
||||||
|
|
||||||
if ( // Если никто не смотрит MJPEG - пропускаем кадр
|
if ( // Если никто не смотрит MJPEG - пропускаем кадр
|
||||||
!atomic_load(&stream->run->http_has_clients)
|
!atomic_load(&stream->run->http_has_clients)
|
||||||
@@ -344,6 +349,10 @@ static void *_h264_thread(void *v_ctx) {
|
|||||||
if (us_queue_get(ctx->queue, (void**)&hw, 0.1) < 0) {
|
if (us_queue_get(ctx->queue, (void**)&hw, 0.1) < 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
while (!us_queue_is_empty(ctx->queue)) { // Берем только самый свежий кадр
|
||||||
|
us_device_buffer_decref(hw);
|
||||||
|
assert(!us_queue_get(ctx->queue, (void**)&hw, 0));
|
||||||
|
}
|
||||||
|
|
||||||
if (!us_memsink_server_check(ctx->h264->sink, NULL)) {
|
if (!us_memsink_server_check(ctx->h264->sink, NULL)) {
|
||||||
us_device_buffer_decref(hw);
|
us_device_buffer_decref(hw);
|
||||||
|
|||||||
Reference in New Issue
Block a user