summaryrefslogtreecommitdiff
path: root/src/liana
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-05-11 15:10:54 -0400
committerAndrew Opalach <andrew@akon.city> 2025-05-11 15:10:54 -0400
commitcb342b234defc1205de5d8b10ddf79deae0a551a (patch)
tree135a8f17ef297dcfa71cfa24de0170797add999e /src/liana
parentbbdc4ed66aa171f89f675aa1c82316477d5fd47e (diff)
downloadcamu-cb342b234defc1205de5d8b10ddf79deae0a551a.tar.gz
camu-cb342b234defc1205de5d8b10ddf79deae0a551a.tar.bz2
camu-cb342b234defc1205de5d8b10ddf79deae0a551a.zip
Add keybind to disable scaling filter
- Fix no FFmpeg build. - Cleanup commented code from cmc ui. Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/liana')
-rw-r--r--src/liana/client.c75
-rw-r--r--src/liana/handlers/codec_server.c1
-rw-r--r--src/liana/process.c2
3 files changed, 58 insertions, 20 deletions
diff --git a/src/liana/client.c b/src/liana/client.c
index d926f9e..164a4d1 100644
--- a/src/liana/client.c
+++ b/src/liana/client.c
@@ -112,33 +112,68 @@ static u8 type_to_mask[] = {
[CAMU_STREAM_SUBTITLE] = CAMU_MASK_SUBTITLE
};
+static const char *type_to_str[] = {
+ [CAMU_STREAM_AUDIO] = "audio",
+ [CAMU_STREAM_VIDEO] = "video",
+ [CAMU_STREAM_SUBTITLE] = "subtitle"
+};
+
static void parse_info_packet(struct lia_client *client, struct nn_packet *packet)
{
str liana;
nn_packet_read_str(packet, &liana);
client->duration = nn_packet_read_u64(packet);
collect_streams(client, packet);
+ struct lia_prefs *prefs = &client->prefs;
u8 selected = 0;
- struct camu_codec_stream *stream;
- al_array_foreach_ptr(client->streams, i, stream) {
- u8 type_mask = type_to_mask[stream->type];
- if ((selected & type_mask) || !(client->prefs.enabled_mask & type_mask)) {
- continue;
- }
- selected |= type_mask;
- client->mask |= 1 << stream->index;
- struct lia_vcr_track *track = al_alloc_object(struct lia_vcr_track);
- track->stream = stream;
- track->client = lia_handler_by_name(&liana)->create_client_handler();
- track->client->callback = client->callback;
- track->client->userdata = client->userdata;
- if (!track->client->init(track->client, client->renderer, track->stream)) {
- track->client->free(&track->client);
- al_free(track);
- continue;
+ u32 accept_defaults = 0;
+ for (; accept_defaults < 2; accept_defaults++) {
+ struct camu_codec_stream *stream;
+ al_array_foreach_ptr(client->streams, i, stream) {
+ u8 type_mask = type_to_mask[stream->type];
+ if ((selected & type_mask) || !(prefs->enabled_mask & type_mask)) continue;
+#ifdef CAMU_HAVE_FFMPEG
+ const AVDictionaryEntry *title = NULL;
+ if (stream->mode == CAMU_FFMPEG_COMPAT) {
+ AVDictionary *metadata = stream->av.stream->metadata;
+ title = av_dict_get(metadata, "title", NULL, 0);
+ const AVDictionaryEntry *lang = av_dict_get(metadata, "language", NULL, 0);
+ if (lang && !accept_defaults) {
+ u8 lang_value = CAMU_LANG_UNKNOWN;
+ if (strcmp(lang->value, "eng") == 0) lang_value = CAMU_LANG_ENGLISH;
+ else if (strcmp(lang->value, "jpn") == 0) lang_value = CAMU_LANG_JAPANESE;
+ switch (stream->type) {
+ case CAMU_STREAM_AUDIO:
+ if (prefs->audio_lang != lang_value) continue;
+ break;
+ case CAMU_STREAM_SUBTITLE:
+ if (prefs->subtitle_lang != lang_value) continue;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ log_info("Selected %s stream (index: %u, title: %s).", type_to_str[stream->type], stream->index, title ? title->value : "(empty)");
+#else
+ log_info("Selected %s stream (index: %u).", type_to_str[stream->type], stream->index);
+#endif
+ selected |= type_mask;
+ client->mask |= 1 << stream->index;
+ struct lia_vcr_track *track = al_alloc_object(struct lia_vcr_track);
+ track->stream = stream;
+ track->client = lia_handler_by_name(&liana)->create_client_handler();
+ track->client->callback = client->callback;
+ track->client->userdata = client->userdata;
+ if (!track->client->init(track->client, client->renderer, track->stream)) {
+ track->client->free(&track->client);
+ al_free(track);
+ // This will NOT attempt to select another stream.
+ continue;
+ }
+ client->callback(client->userdata, LIANA_CLIENT_CONFIGURE, stream, track);
+ lia_vcr_add_track(&client->vcr, track);
}
- client->callback(client->userdata, LIANA_CLIENT_CONFIGURE, stream, track);
- lia_vcr_add_track(&client->vcr, track);
}
client->callback(client->userdata, LIANA_CLIENT_CONFIGURE_COMPLETE, NULL, NULL);
}
@@ -289,12 +324,14 @@ void lia_client_free(struct lia_client *client)
{
lia_vcr_free(&client->vcr);
nn_packet_stream_free(&client->data);
+#ifdef CAMU_HAVE_FFMPEG
struct camu_codec_stream *stream;
al_array_foreach_ptr(client->streams, i, stream) {
if (stream->mode == CAMU_FFMPEG_COMPAT) {
avformat_free_context(stream->av.format_context);
}
}
+#endif
al_array_free(client->streams);
al_str_free(&client->addr);
}
diff --git a/src/liana/handlers/codec_server.c b/src/liana/handlers/codec_server.c
index 042c05b..de2c927 100644
--- a/src/liana/handlers/codec_server.c
+++ b/src/liana/handlers/codec_server.c
@@ -5,7 +5,6 @@
#include "../../codec/ffmpeg/demuxer.h"
#include "../../codec/ffmpeg/packet_ext.h"
#endif
-
#include "../../codec/stb_image/demuxer.h"
#include "../../codec/spng/demuxer.h"
#include "../../codec/wuffs/demuxer.h"
diff --git a/src/liana/process.c b/src/liana/process.c
index c2e4ce4..0a6d6b6 100644
--- a/src/liana/process.c
+++ b/src/liana/process.c
@@ -14,6 +14,7 @@ struct raw_samples_data {
u32 index;
};
+#ifdef CAMU_HAVE_FFMPEG
static u32 append_samples(struct raw_samples_data *raw, u8 *data, u32 sample_count)
{
u32 bytes = sample_count * raw->channels * raw->bps;
@@ -111,3 +112,4 @@ out:
return data->samples != NULL;
}
+#endif