diff options
| author | 2025-06-23 17:49:11 -0400 | |
|---|---|---|
| committer | 2025-06-23 17:49:11 -0400 | |
| commit | e0fcbf0910b52a6e66eb733a2850ec58a53cf0e3 (patch) | |
| tree | a24ff2b9313263666d121536064e01436b480571 /src/liana | |
| parent | e9475ce94ba69bd437d8cf0cf3f78062be928568 (diff) | |
| download | camu-e0fcbf0910b52a6e66eb733a2850ec58a53cf0e3.tar.gz camu-e0fcbf0910b52a6e66eb733a2850ec58a53cf0e3.tar.bz2 camu-e0fcbf0910b52a6e66eb733a2850ec58a53cf0e3.zip | |
Improve FFmpeg hwaccel fallback, VR emulation
- Optimize sink seeking with single video frame.
- Small cleanups.
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/liana')
| -rw-r--r-- | src/liana/common.h | 1 | ||||
| -rw-r--r-- | src/liana/handlers/cdio_client.c | 2 | ||||
| -rw-r--r-- | src/liana/handlers/cdio_server.c | 2 | ||||
| -rw-r--r-- | src/liana/handlers/codec.h | 6 | ||||
| -rw-r--r-- | src/liana/handlers/codec_client.c | 8 | ||||
| -rw-r--r-- | src/liana/handlers/dvd_server.c | 2 | ||||
| -rw-r--r-- | src/liana/list.c | 7 | ||||
| -rw-r--r-- | src/liana/vcr.c | 9 |
8 files changed, 23 insertions, 14 deletions
diff --git a/src/liana/common.h b/src/liana/common.h deleted file mode 100644 index 6f70f09..0000000 --- a/src/liana/common.h +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/src/liana/handlers/cdio_client.c b/src/liana/handlers/cdio_client.c index 6d61e59..af93dcc 100644 --- a/src/liana/handlers/cdio_client.c +++ b/src/liana/handlers/cdio_client.c @@ -24,7 +24,7 @@ static bool cdio_client_handle_packet(struct lia_client_handler *handler, struct frame->audio.sample_count = nn_packet_read_s32(packet); struct nn_buffer buffer; nn_packet_read_buffer(packet, &buffer); - frame->data = al_malloc(buffer.size); + frame->data = (u8 *)al_malloc(buffer.size); al_memcpy(frame->data, nn_buffer_get_ptr(&buffer, 0), buffer.size); cdio->handler.callback(cdio->handler.userdata, LIANA_CLIENT_DATA, cdio->handler.stream, frame); return true; diff --git a/src/liana/handlers/cdio_server.c b/src/liana/handlers/cdio_server.c index e1d574d..0fafae7 100644 --- a/src/liana/handlers/cdio_server.c +++ b/src/liana/handlers/cdio_server.c @@ -87,7 +87,7 @@ static void cdio_server_write_packet(struct lia_server_handler *handler, struct nn_packet_write_f64(packet, cdio->pts); s32 sample_count = ret / (camu_audio_format_bytes_per_sample(&cdio->fmt) * cdio->fmt.channel_count); nn_packet_write_s32(packet, sample_count); - nn_buffer_set_size(&cdio->buffer, ret); + cdio->buffer.size = ret; nn_packet_write_buffer(packet, &cdio->buffer); cdio->pts += camu_audio_format_samples_to_sec(&cdio->fmt, sample_count); } diff --git a/src/liana/handlers/codec.h b/src/liana/handlers/codec.h index 696cbb8..be43f63 100644 --- a/src/liana/handlers/codec.h +++ b/src/liana/handlers/codec.h @@ -5,6 +5,12 @@ #include "../server.h" #include "../handler.h" +// FFmpeg Independence: +// - [ ] CAMU_CODEC_* only for explicitly non-ffmpeg codecs. +// - [ ] Map between av_guess_format() and CAMU_CODEC_ +// - [ ] Runtime selection. +// - [ ] Audio support. + #ifdef LIANA_SERVER struct lia_codec_server { struct lia_server_handler handler; diff --git a/src/liana/handlers/codec_client.c b/src/liana/handlers/codec_client.c index b85fc43..267187f 100644 --- a/src/liana/handlers/codec_client.c +++ b/src/liana/handlers/codec_client.c @@ -39,8 +39,7 @@ static bool codec_client_init(struct lia_client_handler *handler, struct camu_re #ifdef CAMU_HAVE_FFMPEG static bool push_av_packet(struct lia_codec_client *codec, AVPacket *pkt) { - s32 ret = codec->dec->push_av_packet(codec->dec, pkt); - return ret == CAMU_OK; + return codec->dec->push_av_packet(codec->dec, pkt) == CAMU_OK; } static void passthrough_subtitle(struct lia_codec_client *codec, AVPacket *pkt) @@ -73,7 +72,7 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc break; #ifdef CAMU_HAVE_FFMPEG case CAMU_FFMPEG_COMPAT: - codec->dec->push_av_packet(codec->dec, NULL); + push_av_packet(codec, NULL); break; #endif } @@ -117,6 +116,9 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc } if (codec->dec) { success = push_av_packet(codec, pkt); + if (!success) { + success = push_av_packet(codec, pkt); + } } else { passthrough_subtitle(codec, pkt); success = true; diff --git a/src/liana/handlers/dvd_server.c b/src/liana/handlers/dvd_server.c index f564325..5a9c793 100644 --- a/src/liana/handlers/dvd_server.c +++ b/src/liana/handlers/dvd_server.c @@ -4,7 +4,7 @@ static s32 dvd_stream_read(void *userdata, void *buffer, s32 size) { struct lia_dvd_server *dvd = (struct lia_dvd_server *)userdata; - return cch_handle_read(dvd->handle, buffer, size); + return cch_handle_read(dvd->handle, (u8 *)buffer, size); } static s32 dvd_stream_seek(void *userdata, u64 pos) diff --git a/src/liana/list.c b/src/liana/list.c index 2a1458f..610ee80 100644 --- a/src/liana/list.c +++ b/src/liana/list.c @@ -456,8 +456,8 @@ static bool handle_end(struct lia_list *list, u32 id, u32 reset_id) // Looping: // - Main issue is rolling back an entry that skipped onto queued - // before it's looping state was synced. - // - Maybe we can track which sink END comes from. + // before it's looping state was synced. Maybe we can track which + // sink END comes from. if (reset_id != entry->reset_id) { log_warn("Got end() with out of order or incorrect reset id, ignoring."); @@ -815,7 +815,8 @@ void lia_list_clear(struct lia_list *list) void lia_list_close(struct lia_list *list) { - // @TODO: Consider sinks being in use. Wait for list->sinks to be empty? + // @TODO: Consider sinks being in use. + // Wait for list->sinks to be empty? struct lia_list_entry *entry; al_array_foreach(list->entries, i, entry) { entry_unload(list, entry); diff --git a/src/liana/vcr.c b/src/liana/vcr.c index 228d758..352fb03 100644 --- a/src/liana/vcr.c +++ b/src/liana/vcr.c @@ -66,7 +66,7 @@ static nn_thread_result NNWT_THREADCALL vcr_track_thread(void *userdata) nn_thread_set_priority(NNWT_THREAD_SCHED_FIFO, 32); struct lia_vcr_track *track = (struct lia_vcr_track *)userdata; struct lia_vcr *vcr = track->vcr; - const char thread_name[16]; // 16 = limit. + const char thread_name[16] = "\0"; // 16 = limit. al_snprintf((char *)thread_name, sizeof(thread_name), "vcr:%hu", vcr->node_id); nn_thread_set_name(thread_name); @@ -298,7 +298,7 @@ void lia_vcr_push_packet(struct lia_vcr *vcr, struct nn_packet *packet) break; } case LIANA_PACKET_EOF: - case LIANA_PACKET_ERROR: + case LIANA_PACKET_ERROR: { al_array_foreach(vcr->tracks, i, track) { nn_packet_cache_send_packet(&track->cache, NULL); } @@ -311,6 +311,7 @@ void lia_vcr_push_packet(struct lia_vcr *vcr, struct nn_packet *packet) log_warn("Forcing EOF because we got an error packet."); } break; + } default: log_warn("Erroneous packet."); break; @@ -332,8 +333,8 @@ void lia_vcr_uncork(struct lia_vcr_track *track) { if (al_atomic_load(s32)(&track->state, AL_ATOMIC_RELAXED) != VCR_TRACK_STOPPED) { // We will get here during normal operation. Early returning is historically - // tricky in vcr_uncork(). If I'm understanding correctly, asserting that cond_is_waiting() - // just below means we are safe. + // tricky in vcr_uncork(). If I'm understanding correctly, asserting that + // cond_is_waiting() just below means we are safe. return; } // Lock before setting track->state to avoid a race with cork(). |