summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
8 files changed, 40 insertions, 20 deletions
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)