summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-02-19 17:38:59 -0500
committerAndrew Opalach <andrew@akon.city> 2025-02-19 17:45:26 -0500
commit152bf64d7da624dd6401e6529300bfc4b817dbbe (patch)
tree1b1b138eed8a9ac4ea560b514d08f2da028b441d
parent2bee71a7e032c0972418e324bb1d7e6b02330b18 (diff)
downloadcamu-152bf64d7da624dd6401e6529300bfc4b817dbbe.tar.gz
camu-152bf64d7da624dd6401e6529300bfc4b817dbbe.tar.bz2
camu-152bf64d7da624dd6401e6529300bfc4b817dbbe.zip
Small fixes and update deps
Signed-off-by: Andrew Opalach <andrew@akon.city>
-rw-r--r--flake.lock12
-rw-r--r--flake.nix2
-rw-r--r--src/buffer/audio.c8
-rw-r--r--src/buffer/audio.h2
-rw-r--r--src/buffer/video.c6
-rw-r--r--src/codec/ffmpeg/decoder.c6
-rw-r--r--src/codec/ffmpeg/meson.build2
-rw-r--r--src/codec/ffmpeg/packet_ext.c24
-rw-r--r--src/libsink/sink.c10
-rw-r--r--src/screen/screen.c2
-rw-r--r--subprojects/libnaunet.wrap2
-rw-r--r--subprojects/stela.wrap2
12 files changed, 49 insertions, 29 deletions
diff --git a/flake.lock b/flake.lock
index 1be7340..1e1611e 100644
--- a/flake.lock
+++ b/flake.lock
@@ -23,11 +23,11 @@
]
},
"locked": {
- "lastModified": 1739815344,
- "narHash": "sha256-onBUUObtFXauBU42IlCMtvVUv8vmluEFfCSxNG6guKM=",
+ "lastModified": 1739992710,
+ "narHash": "sha256-9kEscmGnXHjSgcqyJR4TzzHhska4yz1inSQs6HuO9qU=",
"owner": "nix-community",
"repo": "home-manager",
- "rev": "f4f6dd26985f1e44721325cb6d783d0cf4cd4dbc",
+ "rev": "1c189f011447810af939a886ba7bee33532bb1f9",
"type": "github"
},
"original": {
@@ -91,11 +91,11 @@
},
"nixpkgs_2": {
"locked": {
- "lastModified": 1739736696,
- "narHash": "sha256-zON2GNBkzsIyALlOCFiEBcIjI4w38GYOb+P+R4S8Jsw=",
+ "lastModified": 1739866667,
+ "narHash": "sha256-EO1ygNKZlsAC9avfcwHkKGMsmipUk1Uc0TbrEZpkn64=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "d74a2335ac9c133d6bbec9fc98d91a77f1604c1f",
+ "rev": "73cf49b8ad837ade2de76f87eb53fc85ed5d4680",
"type": "github"
},
"original": {
diff --git a/flake.nix b/flake.nix
index afb2058..c38f6b3 100644
--- a/flake.nix
+++ b/flake.nix
@@ -98,13 +98,13 @@
python-pkgs.pip
python-pkgs.cython
]))
+ ffmpeg-headless # native for ffprobe
] ++ lib.optionals (system == "x86_64-linux") [ ant jdk8 ];
buildInputs = [
(curl.override { websocketSupport = true; })
jansson
libblake3
libspng
- ffmpeg-headless
soxr
libcdio
libcdio-paranoia
diff --git a/src/buffer/audio.c b/src/buffer/audio.c
index 8e0d428..e9ba16c 100644
--- a/src/buffer/audio.c
+++ b/src/buffer/audio.c
@@ -150,7 +150,7 @@ static bool push_internal(struct camu_audio_buffer *buf, f64 pts, u8 **data, s32
// The maximum space is buf->size - 1.
ptrdiff_t space = al_ring_buffer_space(&buf->rb);
if (!buf->buffered && (buf->size - 1) - space >= buf->mark.buffered) {
- al_log_debug("audio_buffer", "Buffered (mark: %.1fkb).", buf->mark.buffered / 1024.0);
+ al_log_debug("audio_buffer", "Buffered (mark: %.1fKB).", buf->mark.buffered / 1024.0);
buf->callback(buf->userdata, CAMU_BUFFER_BUFFERED);
buf->buffered = true;
}
@@ -248,13 +248,11 @@ void camu_audio_buffer_reset(struct camu_audio_buffer *buf)
}
}
-void camu_audio_buffer_unpause(struct camu_audio_buffer *buf)
+void camu_audio_buffer_resync(struct camu_audio_buffer *buf)
{
al_atomic_add(u32)(&buf->unpause, 1, AL_ATOMIC_RELAXED);
}
-// PAUSE_PAUSED signifies that the last read was silence.
-// This means we can skip around in the buffer without worrying about pops.
ptrdiff_t camu_audio_buffer_read(struct camu_audio_buffer *buf, u8 *data, ptrdiff_t req)
{
struct camu_audio_format *fmt = &buf->fmt.req;
@@ -331,6 +329,8 @@ ptrdiff_t camu_audio_buffer_read(struct camu_audio_buffer *buf, u8 *data, ptrdif
#endif
// Unpause and possibly attempt syncing to the clock.
+ // PAUSE_PAUSED signifies that the last read was silence, meaning we
+ // can skip around in the buffer without worrying about pops.
if (UNLIKELY(buf->pause == PAUSE_PAUSED)) {
if (!buf->ignore_desync) {
pts -= base_pts;
diff --git a/src/buffer/audio.h b/src/buffer/audio.h
index 5fa2473..78a12dc 100644
--- a/src/buffer/audio.h
+++ b/src/buffer/audio.h
@@ -70,6 +70,6 @@ void camu_audio_buffer_set_no_video(struct camu_audio_buffer *buf, bool no_video
void camu_audio_buffer_push(struct camu_audio_buffer *buf, struct camu_codec_frame *frame);
void camu_audio_buffer_flush(struct camu_audio_buffer *buf);
void camu_audio_buffer_reset(struct camu_audio_buffer *buf);
-void camu_audio_buffer_unpause(struct camu_audio_buffer *buf);
+void camu_audio_buffer_resync(struct camu_audio_buffer *buf);
ptrdiff_t camu_audio_buffer_read(struct camu_audio_buffer *buf, u8 *data, ptrdiff_t req);
void camu_audio_buffer_free(struct camu_audio_buffer *buf);
diff --git a/src/buffer/video.c b/src/buffer/video.c
index 34672fb..1f2aa3c 100644
--- a/src/buffer/video.c
+++ b/src/buffer/video.c
@@ -12,9 +12,9 @@
#include "../codec/ffmpeg/scaler.h"
#endif
-#define BUFFER_MARK_LOW ((1.0 / 30.0) * 8)
-#define BUFFER_MARK_BUFFERED ((1.0 / 30.0) * 4) // Must be >1.
-#define BUFFER_MARK_HIGH ((1.0 / 30.0) * 12)
+#define BUFFER_MARK_LOW ((1.0 / 30.0) * 4)
+#define BUFFER_MARK_BUFFERED ((1.0 / 30.0) * 6) // Must be >1.
+#define BUFFER_MARK_HIGH ((1.0 / 30.0) * 8)
#define BUFFER_MARK_RESET (BUFFER_MARK_HIGH * 2.0)
bool camu_video_buffer_init(struct camu_video_buffer *buf, struct camu_clock *clock)
diff --git a/src/codec/ffmpeg/decoder.c b/src/codec/ffmpeg/decoder.c
index 02f077d..affe9fa 100644
--- a/src/codec/ffmpeg/decoder.c
+++ b/src/codec/ffmpeg/decoder.c
@@ -182,9 +182,9 @@ static bool ff_decoder_init(struct camu_decoder *dec, struct camu_renderer *rend
goto err;
}
+#ifdef CAMU_FF_DECODER_HWACCEL
bool attempt_hwdec = stream->duration > 0 && codecpar->codec_type == AVMEDIA_TYPE_VIDEO;
-#ifdef CAMU_FF_DECODER_HWACCEL
if (attempt_hwdec) {
collect_supported_hwaccels(av);
@@ -243,7 +243,11 @@ static bool ff_decoder_init(struct camu_decoder *dec, struct camu_renderer *rend
(void)renderer;
#endif
+#ifdef CAMU_FF_DECODER_HWACCEL
if ((!attempt_hwdec || av->hw_device_type == AV_HWDEVICE_TYPE_NONE) && stream->duration > 0) {
+#else
+ if (codecpar->codec_type == AVMEDIA_TYPE_VIDEO && stream->duration > 0) {
+#endif
s32 cpus = 0;
if (av->codec_context->codec_type == AVMEDIA_TYPE_VIDEO) {
cpus = av_cpu_count();
diff --git a/src/codec/ffmpeg/meson.build b/src/codec/ffmpeg/meson.build
index b93e556..cd6c7d3 100644
--- a/src/codec/ffmpeg/meson.build
+++ b/src/codec/ffmpeg/meson.build
@@ -53,7 +53,7 @@ if not (libavutil.found() and libavformat.found() and libavcodec.found() and lib
ffmpeg_version_string = ffmpeg_proj.get_variable('ffmpeg_version_string')
endif
else
- ffmpeg_version_string = run_command('./version.sh', check: true).stdout().strip()
+ ffmpeg_version_string = run_command('sh', join_paths(meson.current_source_dir(), 'version.sh'), check: true).stdout().strip()
endif
# This is probably meaningless compared to libav* versions, it's just something I wanted.
diff --git a/src/codec/ffmpeg/packet_ext.c b/src/codec/ffmpeg/packet_ext.c
index 9aa1992..e7b1da8 100644
--- a/src/codec/ffmpeg/packet_ext.c
+++ b/src/codec/ffmpeg/packet_ext.c
@@ -26,8 +26,13 @@ void nn_packet_write_av_codec_parameters(struct nn_packet *packet, AVCodecParame
NNWT_PACKET_WRITE_TYPE(packet, enum AVColorSpace, codecpar->color_space);
NNWT_PACKET_WRITE_TYPE(packet, enum AVChromaLocation, codecpar->chroma_location);
NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->video_delay);
- NNWT_PACKET_WRITE_TYPE(packet, u64, codecpar->ch_layout.u.mask);
- //NNWT_PACKET_WRITE_TYPE(packet, AVChannelLayout, codecpar->ch_layout);
+ // Incomplete.
+ NNWT_PACKET_WRITE_TYPE(packet, enum AVChannelOrder, codecpar->ch_layout.order);
+ if (codecpar->ch_layout.order == AV_CHANNEL_ORDER_NATIVE) {
+ NNWT_PACKET_WRITE_TYPE(packet, u64, codecpar->ch_layout.u.mask);
+ } else {
+ NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->ch_layout.nb_channels);
+ }
NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->sample_rate);
NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->block_align);
NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->frame_size);
@@ -125,10 +130,17 @@ void nn_packet_read_av_codec_parameters(struct nn_packet *packet, AVCodecParamet
NNWT_PACKET_READ_TYPE(packet, enum AVColorSpace, codecpar->color_space);
NNWT_PACKET_READ_TYPE(packet, enum AVChromaLocation, codecpar->chroma_location);
NNWT_PACKET_READ_TYPE(packet, s32, codecpar->video_delay);
- u64 ch_layout_mask;
- NNWT_PACKET_READ_TYPE(packet, u64, ch_layout_mask);
- av_channel_layout_from_mask(&codecpar->ch_layout, ch_layout_mask);
- //NNWT_PACKET_READ_TYPE(packet, AVChannelLayout, codecpar->ch_layout);
+ enum AVChannelOrder order;
+ NNWT_PACKET_READ_TYPE(packet, enum AVChannelOrder, order);
+ if (order == AV_CHANNEL_ORDER_NATIVE) {
+ u64 ch_layout_mask;
+ NNWT_PACKET_READ_TYPE(packet, u64, ch_layout_mask);
+ av_channel_layout_from_mask(&codecpar->ch_layout, ch_layout_mask);
+ } else {
+ s32 nb_channels;
+ NNWT_PACKET_READ_TYPE(packet, s32, nb_channels);
+ av_channel_layout_default(&codecpar->ch_layout, nb_channels);
+ }
NNWT_PACKET_READ_TYPE(packet, s32, codecpar->sample_rate);
NNWT_PACKET_READ_TYPE(packet, s32, codecpar->block_align);
NNWT_PACKET_READ_TYPE(packet, s32, codecpar->frame_size);
diff --git a/src/libsink/sink.c b/src/libsink/sink.c
index 0eca9f5..4aa1d51 100644
--- a/src/libsink/sink.c
+++ b/src/libsink/sink.c
@@ -308,6 +308,8 @@ static void handle_sink_cmd(struct camu_sink *sink, struct camu_sink_cmd *cmd)
if (sink->video.state == SINK_PLAYING) {
sink->callback(sink->userdata, CAMU_SINK_STOP, CAMU_SINK_VIDEO, NULL);
sink->video.state = SINK_PAUSED;
+ } else {
+ sink->callback(sink->userdata, CAMU_SINK_REFRESH_VIDEO, 0, NULL);
}
break;
#endif
@@ -743,7 +745,7 @@ static void switch_to(struct camu_sink *sink, struct camu_sink_entry *target)
sink->current = target;
sink->current->audio.ignore_paused = false;
if (!sink->current->buffers_paused) {
- camu_audio_buffer_unpause(&sink->current->audio.buf);
+ camu_audio_buffer_resync(&sink->current->audio.buf);
}
}
@@ -1438,7 +1440,7 @@ static bool set_command_callback(void *userdata, struct nn_rpc_connection *conn,
if (entry != current) {
switch_to(sink, entry);
} else {
- camu_audio_buffer_unpause(&entry->audio.buf);
+ camu_audio_buffer_resync(&entry->audio.buf);
}
camu_clock_resume(&entry->clock, at);
break;
@@ -1471,7 +1473,7 @@ static bool set_command_callback(void *userdata, struct nn_rpc_connection *conn,
sink->target = entry;
} else {
sink->target = NULL;
- camu_audio_buffer_unpause(&entry->audio.buf);
+ camu_audio_buffer_resync(&entry->audio.buf);
}
camu_clock_pause(&prev_target->clock, at);
} else {
@@ -1528,7 +1530,7 @@ static bool pause_command_callback(void *userdata, struct nn_rpc_connection *con
entry->buffers_paused = false;
camu_clock_resume(&entry->clock, at);
if (!AUDIO_EMPTY(entry)) {
- camu_audio_buffer_unpause(&entry->audio.buf);
+ camu_audio_buffer_resync(&entry->audio.buf);
queue_cmd(entry->sink, (struct camu_sink_cmd){
.op = START,
.value.i = CAMU_SINK_AUDIO
diff --git a/src/screen/screen.c b/src/screen/screen.c
index 3312d77..77fbd8d 100644
--- a/src/screen/screen.c
+++ b/src/screen/screen.c
@@ -42,6 +42,8 @@ static void resize_callback(void *userdata, u32 width, u32 height)
al_array_foreach_ptr(scr->videos, i, video) {
camu_view_calculate(&video->view, scr->width, scr->height);
}
+ // No buffers resize.
+ al_atomic_store(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED);
}
static void refresh_callback(void *userdata)
diff --git a/subprojects/libnaunet.wrap b/subprojects/libnaunet.wrap
index b87715d..0fb98e4 100644
--- a/subprojects/libnaunet.wrap
+++ b/subprojects/libnaunet.wrap
@@ -1,4 +1,4 @@
[wrap-git]
url = https://git.akon.city/libnaunet
-revision = 0e4440d9235da485a75e52466bbffe9511ba6d97
+revision = c4023623b89d7518c92f675f44355f5ae1196264
depth = 1
diff --git a/subprojects/stela.wrap b/subprojects/stela.wrap
index dcbade6..faac747 100644
--- a/subprojects/stela.wrap
+++ b/subprojects/stela.wrap
@@ -1,4 +1,4 @@
[wrap-git]
url = https://git.akon.city/stela
-revision = dda9ba19bb94947cf7d2f176f0d6760078598b69
+revision = c0cd683e98f357d4b81cfd44444dbc909dcb2386
depth = 1