Notify new frames via callbacks

Currently, a frame is available to the consumer as soon as it is pushed
by the producer (which can detect if the previous frame is skipped).

Notify the new frames (and frame skipped) via callbacks instead.

This paves the way to add (optional) buffering, which will introduce a
delay between the time when the frame is produced and the time it is
available to be consumed.
This commit is contained in:
Romain Vimont
2021-07-04 12:42:22 +02:00
parent 4d8bcfc68a
commit 408a301201
4 changed files with 68 additions and 32 deletions

View File

@@ -7,8 +7,20 @@
#include "util/log.h"
bool
sc_video_buffer_init(struct sc_video_buffer *vb) {
return sc_frame_buffer_init(&vb->fb);
sc_video_buffer_init(struct sc_video_buffer *vb,
const struct sc_video_buffer_callbacks *cbs,
void *cbs_userdata) {
bool ok = sc_frame_buffer_init(&vb->fb);
if (!ok) {
return false;
}
assert(cbs);
assert(cbs->on_new_frame);
vb->cbs = cbs;
vb->cbs_userdata = cbs_userdata;
return true;
}
void
@@ -17,9 +29,15 @@ sc_video_buffer_destroy(struct sc_video_buffer *vb) {
}
bool
sc_video_buffer_push(struct sc_video_buffer *vb, const AVFrame *frame,
bool *previous_frame_skipped) {
return sc_frame_buffer_push(&vb->fb, frame, previous_frame_skipped);
sc_video_buffer_push(struct sc_video_buffer *vb, const AVFrame *frame) {
bool previous_skipped;
bool ok = sc_frame_buffer_push(&vb->fb, frame, &previous_skipped);
if (!ok) {
return false;
}
vb->cbs->on_new_frame(vb, previous_skipped, vb->cbs_userdata);
return true;
}
void