29
29
#define DELAY_MAX 30
36
extern char *video_base;
39
static webcam_t *cams[MAX_CAMS];
40
static pthread_t thr[MAX_CAMS];
46
Context_open_webcam(Context_t *ctx)
53
for (i = 0; i < MAX_CAMS; i++)
54
pthread_mutex_init(&ctx->cam_mtx[i], NULL);
56
for (i = 0; (i < webcams) && (try < MAX_TRIES); i++) {
58
cams[i] = xmalloc(sizeof(webcam_t));
60
cams[i]->io = IO_METHOD_MMAP;
65
if (-1 != open_device(cams[i], try)) {
66
if (-1 != init_device(cams[i])) {
67
enumerate_cids(cams[i]);
69
start_capturing(cams[i]);
71
pthread_create(&thr[i], NULL, loop, (void *)cams[i]);
73
fprintf(stderr, "[i] Webcam: failed to initialize device #%d\n", i);
74
close_device(cams[i]);
36
91
Context_t *ctx = xcalloc(1, sizeof(Context_t));
45
100
ctx->buffers[i] = Buffer8_new();
105
for (k = 0; k < webcams; k++) {
106
for (i = 0; i < CAM_SAVE; i++)
107
ctx->cam_save[k][i] = Buffer8_new();
108
ctx->cam_ref[k] = Buffer8_new();
109
ctx->rgba_cam_buffers[k] = BufferRGBA_new();
113
ctx->rgba_buffers[ACTIVE_BUFFER] = BufferRGBA_new();
114
if (libbiniou_verbose)
118
glGenTextures(NSCREENS, ctx->textures); // TODO: delete on exit
119
glGenTextures(MAX_CAMS, ctx->cam_textures); // TODO: delete on exit
49
122
if (pictures != NULL) {
50
123
if (libbiniou_verbose)
91
166
ctx->outputs = NULL;
169
ctx->target = 1; /* maybe someday we want a switch to disable,
170
or worse, a global variable :) */
171
ctx->target_pic = Picture8_new();
174
extern char *data_dir;
178
tmp = g_strdup_printf("%s/%s", data_dir, "/images/zebulon/z-biniou-tv-1.png");
179
printf("[+] Loading '%s'\n", tmp);
180
res = Picture8_load_PNG(ctx->target_pic, tmp);
183
xerror("Picture8_load_PNG(%s)\n", tmp);
189
printf("[i] Initialiazing %d webcams base: %s\n", webcams, video_base);
192
Context_open_webcam(ctx);
194
for (i = 0; i < webcams; i++)
195
Buffer8_copy(ctx->target_pic->buff, ctx->cam_save[i][0]);
204
Context_close_webcam(const u_char cam_no)
206
if (NULL != cams[cam_no]) {
207
pthread_join(thr[cam_no], NULL);
208
stop_capturing(cams[cam_no]);
209
uninit_device(cams[cam_no]);
210
close_device(cams[cam_no]);
98
217
Context_delete(Context_t *ctx)
101
220
GSList *outputs = ctx->outputs;
226
for (i = 0; i < webcams; i++)
227
Context_close_webcam(i);
103
232
if (libbiniou_verbose)
104
233
printf("[i] %lu frames, %lu events\n", ctx->frames, ctx->nb_events);
120
249
printf("%d ", i);
121
250
Buffer8_delete(ctx->buffers[i]);
255
for (k = 0; k < webcams; k++) {
256
for (i = 0; i < CAM_SAVE; i++)
257
Buffer8_delete(ctx->cam_save[k][i]);
258
Buffer8_delete(ctx->cam_ref[k]);
259
BufferRGBA_delete(ctx->rgba_cam_buffers[k]);
263
BufferRGBA_delete(ctx->rgba_buffers[ACTIVE_BUFFER]);
123
264
if (libbiniou_verbose)
455
601
Sequence_t *seq = Sequences_find(id);
604
if (ctx->sm->transient->id == id)
605
seq = ctx->sm->transient;
457
607
assert(NULL != seq);
458
608
ctx->sm->curseq = seq->layers;
459
609
Sequence_copy(seq, ctx->sm->next);
466
Context_use_bank(Context_t *ctx, const u_char bank)
616
Context_use_sequence_bank(Context_t *ctx, const u_char bank)
470
id = ctx->sm->banks[ctx->sm->cur_bankset][bank];
620
id = ctx->banks[SEQUENCES][ctx->bankset[SEQUENCES]][bank];
624
printf("[i] Using sequence in bank #%d\n", (bank+1));
474
626
if (libbiniou_verbose)
475
627
printf("[s] Set sequence: %li\n", id);
477
629
seq = Sequences_find(id);
631
if (ctx->sm->transient->id == id)
632
seq = ctx->sm->transient;
478
633
assert(NULL != seq);
479
634
ctx->sm->curseq = seq->layers;
480
635
Sequence_copy(seq, ctx->sm->next);
482
ctx->bank = bank; /* ca sert a quoi de garder ctx->bank ? --oliv3 */
637
ctx->bank[SEQUENCES] = bank;
484
639
Context_set(ctx);
486
printf("[i] Bank %d/%d is empty\n", ctx->sm->cur_bankset+1, bank+1);
641
printf("[i] Bank %d/%d is empty\n", ctx->bankset[SEQUENCES]+1, bank+1);
491
646
Context_clear_bank(Context_t *ctx, const u_char bank)
493
ctx->sm->banks[ctx->sm->cur_bankset][bank] = 0;
648
ctx->banks[ctx->bank_mode][ctx->bankset[ctx->bank_mode]][bank] = 0;
507
662
return ctx->buffers[PASSIVE_BUFFER];
668
Context_push_webcam(Context_t *ctx, Buffer8_t *buff, const int cam)
672
Buffer8_delete(ctx->cam_save[cam][CAM_SAVE-1]);
673
for (i = CAM_SAVE-1; i >= 1; i--)
674
ctx->cam_save[cam][i] = ctx->cam_save[cam][i-1];
675
ctx->cam_save[cam][0] = buff;