Skip to content

Commit

Permalink
Added a global deleter for managing static object variables.
Browse files Browse the repository at this point in the history
  • Loading branch information
hipersayanX committed Nov 7, 2018
1 parent bb3edd5 commit c40408e
Show file tree
Hide file tree
Showing 16 changed files with 219 additions and 147 deletions.
Empty file modified .gitignore 100755 → 100644
Empty file.
Empty file modified .travis.yml 100755 → 100644
Empty file.
3 changes: 3 additions & 0 deletions akvcam.pro
Expand Up @@ -38,6 +38,7 @@ lupdate_only {
src/format_types.h \
src/frame.h \
src/frame_types.h \
src/global_deleter.h \
src/ioctl.h \
src/list.h \
src/list_types.h \
Expand All @@ -47,6 +48,7 @@ lupdate_only {
src/node.h \
src/node_types.h \
src/object.h \
src/object_types.h \
src/rbuffer.h \
src/settings.h \
src/utils.h
Expand All @@ -62,6 +64,7 @@ lupdate_only {
src/file_read.c \
src/format.c \
src/frame.c \
src/global_deleter.c \
src/ioctl.c \
src/list.c \
src/log.c \
Expand Down
2 changes: 1 addition & 1 deletion share/config_example.ini
Expand Up @@ -74,7 +74,7 @@ formats/1/fps = 30
# RGB24 640x480 7.5 FPS
# YUY2 640x480 20 FPS
# YUY2 640x480 7.5 FPS
formats/2/format = RGB24, BGR24
formats/2/format = RGB24, YUY2
formats/2/width = 640
formats/2/height = 480
formats/2/fps = 20/1, 15/2
Expand Down
1 change: 1 addition & 0 deletions src/Makefile
Expand Up @@ -20,6 +20,7 @@ akvcam-objs := \
file_read.o \
format.o \
frame.o \
global_deleter.o \
ioctl.o \
list.o \
log.o \
Expand Down
57 changes: 19 additions & 38 deletions src/device.c
Expand Up @@ -30,20 +30,12 @@
#include "events.h"
#include "format.h"
#include "frame.h"
#include "global_deleter.h"
#include "list.h"
#include "node.h"
#include "object.h"
#include "settings.h"

static struct
{
akvcam_frame_t frame;
ssize_t ref;
} akvcam_default_frame = {NULL, 0};

void akvcam_default_frame_init(void);
void akvcam_default_frame_uninit(void);

struct akvcam_device
{
akvcam_object_t self;
Expand All @@ -69,13 +61,14 @@ struct akvcam_device
bool streaming_rw;
};

typedef int (*akvacam_thread_t)(void *data);
typedef int (*akvcam_thread_t)(void *data);

void akvcam_device_event_received(akvcam_device_t self,
struct v4l2_event *event);
void akvcam_device_frame_written(akvcam_device_t self,
const akvcam_frame_t frame);
int akvcam_device_send_frames(akvcam_device_t self);
akvcam_frame_t akvcam_default_frame(void);

akvcam_device_t akvcam_device_new(const char *name,
const char *description,
Expand Down Expand Up @@ -136,8 +129,6 @@ akvcam_device_t akvcam_device_new(const char *name,
(akvcam_frame_written_proc) akvcam_device_frame_written;
akvcam_buffers_set_frame_written_callback(self->buffers, frame_written);

akvcam_default_frame_init();

return self;
}

Expand All @@ -149,7 +140,6 @@ void akvcam_device_delete(akvcam_device_t *self)
if (akvcam_object_unref((*self)->self) > 0)
return;

akvcam_default_frame_uninit();
akvcam_buffers_delete(&((*self)->buffers));
akvcam_device_unregister(*self);
video_device_release((*self)->vdev);
Expand Down Expand Up @@ -314,7 +304,7 @@ void akvcam_device_set_streaming(akvcam_device_t self, bool streaming)
if (self->type == AKVCAM_DEVICE_TYPE_CAPTURE) {
if (!self->streaming && streaming) {
akvcam_buffers_reset_sequence(self->buffers);
self->thread = kthread_run((akvacam_thread_t)
self->thread = kthread_run((akvcam_thread_t)
akvcam_device_send_frames,
self,
"akvcam-thread-%llu",
Expand Down Expand Up @@ -431,6 +421,7 @@ bool akvcam_device_prepare_frame(akvcam_device_t self)
{
akvcam_device_t output_device;
akvcam_frame_t frame = NULL;
akvcam_frame_t default_frame = akvcam_default_frame();
bool result;

output_device = akvcam_list_front(self->connected_devices);
Expand All @@ -446,8 +437,8 @@ bool akvcam_device_prepare_frame(akvcam_device_t self)
spin_unlock(&self->slock);

if (!frame) {
if (akvcam_default_frame.frame) {
frame = akvcam_default_frame.frame;
if (default_frame) {
frame = default_frame;
akvcam_object_ref(AKVCAM_TO_OBJECT(frame));
} else {
frame = akvcam_frame_new(self->format, NULL, 0);
Expand Down Expand Up @@ -502,43 +493,33 @@ int akvcam_device_send_frames(akvcam_device_t self)
return 0;
}

void akvcam_default_frame_init(void)
akvcam_frame_t akvcam_default_frame(void)
{
static akvcam_frame_t frame = NULL;
akvcam_settings_t settings;
char *file_name;
bool loaded = false;

if (akvcam_default_frame.ref > 0) {
akvcam_default_frame.ref++;

return;
}
if (frame)
return frame;

settings = akvcam_settings_new();

if (akvcam_settings_load(settings, akvcam_settings_file())) {
akvcam_settings_begin_group(settings, "General");
file_name = akvcam_settings_value(settings, "default_frame");
akvcam_default_frame.frame = akvcam_frame_new(NULL, NULL, 0);
loaded = akvcam_frame_load(akvcam_default_frame.frame, file_name);
frame = akvcam_frame_new(NULL, NULL, 0);
loaded = akvcam_frame_load(frame, file_name);
akvcam_settings_end_group(settings);
}

akvcam_settings_delete(&settings);

if (!loaded)
akvcam_frame_delete(&akvcam_default_frame.frame);

akvcam_default_frame.ref++;
}

void akvcam_default_frame_uninit(void)
{
if (akvcam_default_frame.ref > 0)
akvcam_default_frame.ref--;

if (akvcam_default_frame.ref > 0)
return;
if (loaded)
akvcam_global_deleter_add(frame,
(akvcam_deleter_t) akvcam_frame_delete);
else
akvcam_frame_delete(&frame);

akvcam_frame_delete(&akvcam_default_frame.frame);
return frame;
}
1 change: 1 addition & 0 deletions src/driver.c
Expand Up @@ -26,6 +26,7 @@
#include "format.h"
#include "list.h"
#include "log.h"
#include "object.h"
#include "settings.h"

typedef struct
Expand Down

0 comments on commit c40408e

Please sign in to comment.