2022-02-02 19:37:28 +01:00
|
|
|
#ifndef SC_RECORDER_H
|
|
|
|
#define SC_RECORDER_H
|
2018-11-09 12:21:17 +01:00
|
|
|
|
2021-01-08 19:24:51 +01:00
|
|
|
#include "common.h"
|
|
|
|
|
2019-03-02 23:52:22 +01:00
|
|
|
#include <stdbool.h>
|
2018-11-09 12:21:17 +01:00
|
|
|
#include <libavformat/avformat.h>
|
|
|
|
|
2021-01-08 19:15:29 +01:00
|
|
|
#include "coords.h"
|
2021-10-27 18:43:47 +02:00
|
|
|
#include "options.h"
|
2021-04-11 15:01:05 +02:00
|
|
|
#include "trait/packet_sink.h"
|
2021-01-31 18:24:35 +01:00
|
|
|
#include "util/thread.h"
|
2023-03-01 21:42:51 +01:00
|
|
|
#include "util/vecdeque.h"
|
2018-11-09 12:21:17 +01:00
|
|
|
|
2023-03-01 21:42:51 +01:00
|
|
|
struct sc_recorder_queue SC_VECDEQUE(AVPacket *);
|
2019-07-31 01:55:40 +02:00
|
|
|
|
2023-06-03 14:41:40 +02:00
|
|
|
struct sc_recorder_stream {
|
|
|
|
int index;
|
2023-06-03 14:52:53 +02:00
|
|
|
int64_t last_pts;
|
2023-06-03 14:41:40 +02:00
|
|
|
};
|
|
|
|
|
2022-02-02 19:37:28 +01:00
|
|
|
struct sc_recorder {
|
2023-02-18 18:02:43 +01:00
|
|
|
struct sc_packet_sink video_packet_sink;
|
|
|
|
struct sc_packet_sink audio_packet_sink;
|
|
|
|
|
2023-02-18 18:09:18 +01:00
|
|
|
/* The audio flag is unprotected:
|
|
|
|
* - it is initialized from sc_recorder_init() from the main thread;
|
|
|
|
* - it may be reset once from the recorder thread if the audio is
|
|
|
|
* disabled dynamically.
|
|
|
|
*
|
|
|
|
* Therefore, once the recorder thread is started, only the recorder thread
|
|
|
|
* may access it without data races.
|
|
|
|
*/
|
2023-02-18 18:02:43 +01:00
|
|
|
bool audio;
|
2023-05-07 12:08:50 +02:00
|
|
|
bool video;
|
2021-04-11 15:01:05 +02:00
|
|
|
|
2023-11-20 14:02:46 +01:00
|
|
|
enum sc_orientation orientation;
|
|
|
|
|
2018-11-09 12:21:17 +01:00
|
|
|
char *filename;
|
2020-06-19 22:04:06 +02:00
|
|
|
enum sc_record_format format;
|
2018-11-09 12:21:17 +01:00
|
|
|
AVFormatContext *ctx;
|
2019-07-31 01:55:40 +02:00
|
|
|
|
2021-01-31 18:24:35 +01:00
|
|
|
sc_thread thread;
|
|
|
|
sc_mutex mutex;
|
2023-06-03 15:05:23 +02:00
|
|
|
sc_cond cond;
|
2023-02-14 09:25:50 +01:00
|
|
|
// set on sc_recorder_stop(), packet_sink close or recording failure
|
|
|
|
bool stopped;
|
2023-02-15 10:06:10 +01:00
|
|
|
struct sc_recorder_queue video_queue;
|
2023-02-18 18:02:43 +01:00
|
|
|
struct sc_recorder_queue audio_queue;
|
2023-02-10 18:10:24 +01:00
|
|
|
|
2023-02-18 18:02:43 +01:00
|
|
|
// wake up the recorder thread once the video or audio codec is known
|
2023-03-10 21:50:34 +01:00
|
|
|
bool video_init;
|
|
|
|
bool audio_init;
|
2023-02-18 18:02:43 +01:00
|
|
|
|
2023-11-13 09:35:18 +01:00
|
|
|
bool audio_expects_config_packet;
|
|
|
|
|
2023-06-03 14:41:40 +02:00
|
|
|
struct sc_recorder_stream video_stream;
|
|
|
|
struct sc_recorder_stream audio_stream;
|
2023-02-14 09:25:50 +01:00
|
|
|
|
2023-02-10 18:10:24 +01:00
|
|
|
const struct sc_recorder_callbacks *cbs;
|
|
|
|
void *cbs_userdata;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct sc_recorder_callbacks {
|
|
|
|
void (*on_ended)(struct sc_recorder *recorder, bool success,
|
|
|
|
void *userdata);
|
2018-11-09 12:21:17 +01:00
|
|
|
};
|
|
|
|
|
2019-03-02 23:52:22 +01:00
|
|
|
bool
|
2022-02-02 19:37:28 +01:00
|
|
|
sc_recorder_init(struct sc_recorder *recorder, const char *filename,
|
2023-05-07 12:08:50 +02:00
|
|
|
enum sc_record_format format, bool video, bool audio,
|
2023-11-20 14:02:46 +01:00
|
|
|
enum sc_orientation orientation,
|
2023-02-10 18:10:24 +01:00
|
|
|
const struct sc_recorder_callbacks *cbs, void *cbs_userdata);
|
2019-02-09 15:20:07 +01:00
|
|
|
|
2023-02-23 11:00:34 +01:00
|
|
|
bool
|
|
|
|
sc_recorder_start(struct sc_recorder *recorder);
|
|
|
|
|
2023-02-14 09:25:50 +01:00
|
|
|
void
|
|
|
|
sc_recorder_stop(struct sc_recorder *recorder);
|
|
|
|
|
|
|
|
void
|
|
|
|
sc_recorder_join(struct sc_recorder *recorder);
|
|
|
|
|
2019-03-02 20:09:56 +01:00
|
|
|
void
|
2022-02-02 19:37:28 +01:00
|
|
|
sc_recorder_destroy(struct sc_recorder *recorder);
|
2018-11-09 12:21:17 +01:00
|
|
|
|
|
|
|
#endif
|