summaryrefslogtreecommitdiff
path: root/src/liana
diff options
context:
space:
mode:
Diffstat (limited to 'src/liana')
-rw-r--r--src/liana/client.c18
-rw-r--r--src/liana/handlers.h2
-rw-r--r--src/liana/handlers/cdio.h2
-rw-r--r--src/liana/handlers/codec.h4
-rw-r--r--src/liana/handlers/codec_client.c11
-rw-r--r--src/liana/handlers/codec_server.c42
-rw-r--r--src/liana/handlers/dvd.h2
-rw-r--r--src/liana/handlers/handler.h (renamed from src/liana/handler.h)6
-rw-r--r--src/liana/server.c7
-rw-r--r--src/liana/vcr.c3
10 files changed, 48 insertions, 49 deletions
diff --git a/src/liana/client.c b/src/liana/client.c
index 5222d7a..d853acf 100644
--- a/src/liana/client.c
+++ b/src/liana/client.c
@@ -41,6 +41,10 @@ static void collect_streams(struct lia_client *client, struct nn_packet *packet)
for (u32 i = 0; i < count; i++) {
// Very important zero-initialization.
struct camu_codec_stream stream = { 0 };
+ str codec;
+ nn_packet_read_str(packet, &codec);
+ // @TODO: NULL unhandled.
+ stream.codec_info = camu_codec_info_by_name(&codec);
u8 mode = nn_packet_read_u8(packet);
u8 type = nn_packet_read_u8(packet);
u64 duration = nn_packet_read_u64(packet);
@@ -125,8 +129,8 @@ static const char *type_to_str[] = {
static void parse_info_packet(struct lia_client *client, struct nn_packet *packet)
{
- str liana;
- nn_packet_read_str(packet, &liana);
+ str handler;
+ nn_packet_read_str(packet, &handler);
client->duration = nn_packet_read_u64(packet);
collect_streams(client, packet);
struct lia_prefs *prefs = &client->prefs;
@@ -146,11 +150,9 @@ static void parse_info_packet(struct lia_client *client, struct nn_packet *packe
const AVDictionaryEntry *lang_entry = av_dict_get(metadata, "language", NULL, 0);
if (lang_entry && !accept_defaults) {
u8 lang = CAMU_LANG_UNKNOWN;
- if (strcmp(lang_entry->value, "eng") == 0) {
- lang = CAMU_LANG_ENGLISH;
- } else if (strcmp(lang_entry->value, "jpn") == 0) {
- lang = CAMU_LANG_JAPANESE;
- }
+ str lang_str = al_str_cr(lang_entry->value);
+ if (al_str_eq(&lang_str, &al_str_c("eng"))) lang = CAMU_LANG_ENGLISH;
+ else if (al_str_eq(&lang_str, &al_str_c("jpn"))) lang = CAMU_LANG_JAPANESE;
switch (stream->type) {
case CAMU_STREAM_AUDIO:
if (prefs->audio_lang != lang) continue;
@@ -173,7 +175,7 @@ static void parse_info_packet(struct lia_client *client, struct nn_packet *packe
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 = lia_handler_by_name(&handler)->create_client_handler();
track->client->callback = client->callback;
track->client->userdata = client->userdata;
if (!track->client->init(track->client, client->renderer, track->stream)) {
diff --git a/src/liana/handlers.h b/src/liana/handlers.h
index 223ead5..a72bdb9 100644
--- a/src/liana/handlers.h
+++ b/src/liana/handlers.h
@@ -1,6 +1,6 @@
#pragma once
-#include "handler.h"
+#include "handlers/handler.h"
struct lia_handler_entry {
str name;
diff --git a/src/liana/handlers/cdio.h b/src/liana/handlers/cdio.h
index 3b0e991..7fa0caf 100644
--- a/src/liana/handlers/cdio.h
+++ b/src/liana/handlers/cdio.h
@@ -1,6 +1,6 @@
#pragma once
-#include "../handler.h"
+#include "handler.h"
#ifdef LIANA_SERVER
struct lia_cdio_server {
diff --git a/src/liana/handlers/codec.h b/src/liana/handlers/codec.h
index be43f63..f179190 100644
--- a/src/liana/handlers/codec.h
+++ b/src/liana/handlers/codec.h
@@ -3,7 +3,8 @@
#include "../../codec/codec.h"
#include "../server.h"
-#include "../handler.h"
+
+#include "handler.h"
// FFmpeg Independence:
// - [ ] CAMU_CODEC_* only for explicitly non-ffmpeg codecs.
@@ -14,6 +15,7 @@
#ifdef LIANA_SERVER
struct lia_codec_server {
struct lia_server_handler handler;
+ struct camu_codec_info *codec_info;
struct camu_demuxer *demux;
#ifdef LIANA_SERVER_LOOP
u64 pts_offset;
diff --git a/src/liana/handlers/codec_client.c b/src/liana/handlers/codec_client.c
index 267187f..a3614bf 100644
--- a/src/liana/handlers/codec_client.c
+++ b/src/liana/handlers/codec_client.c
@@ -1,12 +1,8 @@
#include "../../codec/codec.h"
-
+#include "../../codec/codecs.h"
#ifdef CAMU_HAVE_FFMPEG
-#include "../../codec/ffmpeg/decoder.h"
#include "../../codec/ffmpeg/packet_ext.h"
#endif
-#include "../../codec/stb_image/decoder.h"
-#include "../../codec/spng/decoder.h"
-#include "../../codec/wuffs/decoder.h"
#include "../vcr.h"
#include "../client.h"
@@ -25,10 +21,7 @@ static bool codec_client_init(struct lia_client_handler *handler, struct camu_re
struct lia_codec_client *codec = (struct lia_codec_client *)handler;
codec->handler.stream = stream;
if (stream->type == CAMU_STREAM_AUDIO || stream->type == CAMU_STREAM_VIDEO) {
- codec->dec = camu_ff_decoder_create();
- //codec->dec = camu_stbi_decoder_create();
- //codec->dec = camu_spng_decoder_create();
- //codec->dec = camu_wuffs_decoder_create();
+ codec->dec = stream->codec_info->create_decoder();
if (!codec->dec->init(codec->dec, renderer, stream, data_callback, codec)) {
return false;
}
diff --git a/src/liana/handlers/codec_server.c b/src/liana/handlers/codec_server.c
index c324481..801a3e1 100644
--- a/src/liana/handlers/codec_server.c
+++ b/src/liana/handlers/codec_server.c
@@ -1,15 +1,12 @@
-#include "../../codec/codec.h"
-#include "../../server/common.h"
+#define AL_LOG_SECTION "codec_server"
+#include <al/log.h>
+#include "../../server/common.h"
+#include "../../codec/codec.h"
+#include "../../codec/codecs.h"
#ifdef CAMU_HAVE_FFMPEG
-#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"
-
-#include "../handler.h"
#include "codec.h"
@@ -17,11 +14,13 @@ static bool codec_server_init(struct lia_server_handler *handler, struct cch_han
{
struct lia_codec_server *codec = (struct lia_codec_server *)handler;
- codec->demux = camu_ff_demuxer_create();
- //codec->demux = camu_stbi_demuxer_create();
- //codec->demux = camu_spng_demuxer_create();
- //codec->demux = camu_wuffs_demuxer_create();
-
+ codec->demux = NULL;
+ codec->codec_info = camu_codec_info_by_type(cch_entry_guess_format(handle->entry));
+ if (!codec->codec_info) {
+ return false;
+ }
+ log_info("Selected demuxer: %.*s.", al_str_x(&codec->codec_info->name));
+ codec->demux = codec->codec_info->create_demuxer();
if (!codec->demux->init(codec->demux, handle)) {
return false;
}
@@ -55,6 +54,7 @@ static void codec_server_write_info(struct lia_server_handler *handler, struct n
nn_packet_write_u32(packet, codec->demux->streams.count);
struct camu_codec_stream *stream;
al_array_foreach_ptr(codec->demux->streams, i, stream) {
+ nn_packet_write_str(packet, &codec->codec_info->name);
nn_packet_write_u8(packet, stream->mode);
nn_packet_write_u8(packet, stream->type);
nn_packet_write_u64(packet, stream->duration);
@@ -159,18 +159,20 @@ static void codec_server_write_packet(struct lia_server_handler *handler, struct
static void codec_server_free(struct lia_server_handler **handler)
{
struct lia_codec_server *codec = (struct lia_codec_server *)*handler;
- switch (codec->demux->mode) {
- case CAMU_NORMAL:
- break;
+ if (codec->demux) {
+ switch (codec->demux->mode) {
+ case CAMU_NORMAL:
+ break;
#ifdef CAMU_HAVE_FFMPEG
- case CAMU_FFMPEG_COMPAT:
+ case CAMU_FFMPEG_COMPAT:
#ifndef CAMU_DIRECT_MODE
- av_packet_free(&codec->packet.av.pkt);
+ av_packet_free(&codec->packet.av.pkt);
#endif
- break;
+ break;
#endif
+ }
+ codec->demux->free(&codec->demux);
}
- codec->demux->free(&codec->demux);
al_free(codec);
*handler = NULL;
}
diff --git a/src/liana/handlers/dvd.h b/src/liana/handlers/dvd.h
index dd5ac0a..c0f0544 100644
--- a/src/liana/handlers/dvd.h
+++ b/src/liana/handlers/dvd.h
@@ -1,6 +1,6 @@
#pragma once
-#include "../handler.h"
+#include "handler.h"
#ifdef LIANA_SERVER
#include <dvdnav/dvdnav.h>
diff --git a/src/liana/handler.h b/src/liana/handlers/handler.h
index 1fa77a0..48fcef3 100644
--- a/src/liana/handler.h
+++ b/src/liana/handlers/handler.h
@@ -1,9 +1,9 @@
#pragma once
-#include <nnwt/packet_pool.h>
+#include <nnwt/packet.h>
-#include "../codec/codec.h"
-#include "../cache/handle.h"
+#include "../../cache/handle.h"
+#include "../../codec/codec.h"
enum {
LIANA_PACKET_DATA = 0,
diff --git a/src/liana/server.c b/src/liana/server.c
index d07cb8d..db61e20 100644
--- a/src/liana/server.c
+++ b/src/liana/server.c
@@ -1,5 +1,4 @@
#include "server.h"
-#include "handler.h"
#include "handlers.h"
#include "list.h"
@@ -217,7 +216,7 @@ static void handle_connection(struct lia_node_connection *conn, struct nn_packet
if (mask == 0) {
struct nn_packet *rpacket = nn_packet_create();
nn_packet_write_u32(rpacket, conn->id);
- nn_packet_write_str(rpacket, cch_entry_get_liana(conn->node->entry));
+ nn_packet_write_str(rpacket, cch_entry_get_handler(conn->node->entry));
conn->handler->write_info(conn->handler, rpacket);
stream->packet_callback = subscribe_packet_callback;
stream->packet_sent_callback = subscribe_packet_sent_callback;
@@ -363,7 +362,7 @@ static void packet_callback(void *userdata, struct nn_packet_stream *stream, str
nn_signal_init(&conn->signal, server->loop, signal_callback, conn);
nn_signal_start(&conn->signal);
cch_entry_get_handle(node->entry, &conn->handle);
- conn->handler = lia_handler_by_name(cch_entry_get_liana(node->entry))->create_server_handler();
+ conn->handler = lia_handler_by_name(cch_entry_get_handler(node->entry))->create_server_handler();
conn->errored = false;
conn->disconnected = false;
conn->ref = false;
@@ -468,7 +467,7 @@ void lia_node_get_duration(struct lia_node *node)
nn_signal_init(&node->signal, node->server->loop, duration_signal_callback, node);
nn_signal_start(&node->signal);
cch_entry_get_handle(node->entry, &node->handle);
- node->handler = lia_handler_by_name(cch_entry_get_liana(node->entry))->create_server_handler();
+ node->handler = lia_handler_by_name(cch_entry_get_handler(node->entry))->create_server_handler();
nn_thread_create(&node->thread, init_duration_thread, node);
}
diff --git a/src/liana/vcr.c b/src/liana/vcr.c
index 518311a..d2c6b33 100644
--- a/src/liana/vcr.c
+++ b/src/liana/vcr.c
@@ -1,8 +1,9 @@
#define AL_LOG_SECTION "vcr"
#include <al/log.h>
+#include "handlers/handler.h"
+
#include "vcr.h"
-#include "handler.h"
#define VCR_BUFFER_BUFFERED MB(2)