diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/buffer/audio.c | 8 | ||||
| -rw-r--r-- | src/buffer/audio.h | 2 | ||||
| -rw-r--r-- | src/buffer/video.c | 6 | ||||
| -rw-r--r-- | src/codec/ffmpeg/decoder.c | 6 | ||||
| -rw-r--r-- | src/codec/ffmpeg/meson.build | 2 | ||||
| -rw-r--r-- | src/codec/ffmpeg/packet_ext.c | 24 | ||||
| -rw-r--r-- | src/libsink/sink.c | 10 | ||||
| -rw-r--r-- | src/screen/screen.c | 2 |
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) |