summaryrefslogtreecommitdiff
path: root/src/liana/handlers
diff options
context:
space:
mode:
Diffstat (limited to 'src/liana/handlers')
-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.h34
6 files changed, 63 insertions, 32 deletions
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/handlers/handler.h b/src/liana/handlers/handler.h
new file mode 100644
index 0000000..48fcef3
--- /dev/null
+++ b/src/liana/handlers/handler.h
@@ -0,0 +1,34 @@
+#pragma once
+
+#include <nnwt/packet.h>
+
+#include "../../cache/handle.h"
+#include "../../codec/codec.h"
+
+enum {
+ LIANA_PACKET_DATA = 0,
+ LIANA_PACKET_EOF,
+ LIANA_PACKET_ERROR
+};
+
+struct lia_server_handler {
+ bool (*init)(struct lia_server_handler *, struct cch_handle *);
+ void (*write_info)(struct lia_server_handler *, struct nn_packet *);
+ void (*subscribe)(struct lia_server_handler *, u32);
+ u64 (*get_duration)(struct lia_server_handler *);
+ bool (*seek)(struct lia_server_handler *, u64);
+ void (*step)(struct lia_server_handler *);
+ void (*write_packet)(struct lia_server_handler *, struct nn_packet *);
+ void (*free)(struct lia_server_handler **);
+ s32 status;
+};
+
+struct lia_client_handler {
+ bool (*init)(struct lia_client_handler *, struct camu_renderer *, struct camu_codec_stream *);
+ bool (*handle_packet)(struct lia_client_handler *, struct nn_packet *);
+ void (*flush)(struct lia_client_handler *);
+ void (*free)(struct lia_client_handler **);
+ struct camu_codec_stream *stream;
+ void (*callback)(void *, u8, struct camu_codec_stream *stream, void *);
+ void *userdata;
+};