summaryrefslogtreecommitdiff
path: root/src/bimu/handlers
diff options
context:
space:
mode:
Diffstat (limited to 'src/bimu/handlers')
-rw-r--r--src/bimu/handlers/codec_client.c3
-rw-r--r--src/bimu/handlers/codec_server.c95
2 files changed, 40 insertions, 58 deletions
diff --git a/src/bimu/handlers/codec_client.c b/src/bimu/handlers/codec_client.c
index ffe8c16..eda453f 100644
--- a/src/bimu/handlers/codec_client.c
+++ b/src/bimu/handlers/codec_client.c
@@ -19,9 +19,6 @@ static bool codec_client_init(struct bmu_client_handler *handler, struct camu_re
{
struct bmu_codec_client *codec = (struct bmu_codec_client *)handler;
codec->dec = camu_lav_decoder_create();
- //codec->dec = camu_spng_decoder_create();
- //codec->dec = camu_stbi_decoder_create();
- //codec->dec = camu_wuffs_decoder_create();
codec->handler.stream = stream;
if (!codec->dec->init(codec->dec, renderer, &stream->stream)) {
return false;
diff --git a/src/bimu/handlers/codec_server.c b/src/bimu/handlers/codec_server.c
index b555370..3c27179 100644
--- a/src/bimu/handlers/codec_server.c
+++ b/src/bimu/handlers/codec_server.c
@@ -9,13 +9,11 @@
#include "codec.h"
-static bool codec_server_init(struct bmu_server_handler *handler, struct cch_handle *handle, struct aki_packet_pool *pool)
+static bool codec_server_init(struct bmu_server_handler *handler, struct cch_handle *handle,
+ struct aki_packet_pool *pool, void *userdata)
{
struct bmu_codec_server *codec = (struct bmu_codec_server *)handler;
codec->demux = camu_lav_demuxer_create();
- //codec->demux = camu_spng_demuxer_create();
- //codec->demux = camu_stbi_demuxer_create();
- //codec->demux = camu_wuffs_demuxer_create();
if (!codec->demux->init(codec->demux, handle)) {
return false;
}
@@ -29,6 +27,7 @@ static bool codec_server_init(struct bmu_server_handler *handler, struct cch_han
#endif
}
codec->pool = pool;
+ codec->handler.userdata = userdata;
return true;
}
@@ -54,6 +53,14 @@ static void codec_server_write_info(struct bmu_server_handler *handler, struct a
}
}
+static void codec_server_subscribe(struct bmu_server_handler *handler, s32 index, bool subscribe)
+{
+ struct bmu_codec_server *codec = (struct bmu_codec_server *)handler;
+ if (subscribe) {
+ al_array_push(codec->demux->subscribed, index);
+ }
+}
+
static s64 codec_server_get_duration(struct bmu_server_handler *handler)
{
struct bmu_codec_server *codec = (struct bmu_codec_server *)handler;
@@ -71,61 +78,38 @@ static bool codec_server_step(struct bmu_server_handler *handler)
struct bmu_codec_server *codec = (struct bmu_codec_server *)handler;
struct aki_packet *packet = aki_packet_pool_get(codec->pool);
if (!packet) return false;
- aki_packet_write_u8(packet, 0);
+ packet->userdata = codec->handler.userdata;
s32 ret = codec->demux->get_packet(codec->demux, &codec->packet);
- do {
- if (ret == CAMU_OK) {
- switch (codec->packet.type) {
- case CAMU_NORMAL: {
- aki_packet_write_s32(packet, 0);
- aki_packet_write_u8(packet, 0);
- aki_packet_write_u8(packet, codec->packet.type);
- aki_packet_write_buffer(packet, codec->packet.buffer);
- break;
- }
-#ifdef HAVE_FFMPEG
- case CAMU_FFMPEG_COMPAT: {
- AVPacket *pkt = codec->packet.av.pkt;
- aki_packet_write_s32(packet, pkt->stream_index);
- aki_packet_write_u8(packet, 0);
- aki_packet_write_u8(packet, codec->packet.type);
- aki_packet_write_av_packet(packet, pkt);
- av_packet_unref(pkt);
- break;
- }
-#endif
- }
- aki_packet_pool_submit(codec->pool, packet);
- } else if (ret == CAMU_ERR_EOF) {
- struct camu_stream *stream;
- al_array_foreach_ptr(codec->demux->streams, i, stream) {
- if (i != 0) { // HACK
- packet = aki_packet_pool_get(codec->pool);
- if (!packet) return false;
- aki_packet_write_u8(packet, 0);
- }
- switch (stream->type) {
- case CAMU_NORMAL:
- aki_packet_write_s32(packet, 0);
- break;
+ if (ret == CAMU_OK) {
+ aki_packet_write_u8(packet, 0);
+ switch (codec->packet.type) {
+ case CAMU_NORMAL: {
+ aki_packet_write_s32(packet, 0);
+ aki_packet_write_u8(packet, codec->packet.type);
+ aki_packet_write_buffer(packet, codec->packet.buffer);
+ break;
+ }
#ifdef HAVE_FFMPEG
- case CAMU_FFMPEG_COMPAT:
- aki_packet_write_s32(packet, stream->av.stream->index);
- break;
+ case CAMU_FFMPEG_COMPAT: {
+ AVPacket *pkt = codec->packet.av.pkt;
+ aki_packet_write_s32(packet, pkt->stream_index);
+ aki_packet_write_u8(packet, codec->packet.type);
+ aki_packet_write_av_packet(packet, pkt);
+ av_packet_unref(pkt);
+ break;
+ }
#endif
- }
- aki_packet_write_u8(packet, 1);
- aki_packet_pool_submit(codec->pool, packet);
- }
- return false;
- } else {
- aki_packet_write_s32(packet, -2);
- aki_packet_write_u8(packet, 2);
- aki_packet_pool_submit(codec->pool, packet);
- return false;
}
- break;
- } while (1);
+ aki_packet_pool_submit(codec->pool, packet);
+ } else if (ret == CAMU_ERR_EOF) {
+ aki_packet_write_u8(packet, 1);
+ aki_packet_pool_submit(codec->pool, packet);
+ return false;
+ } else {
+ aki_packet_write_u8(packet, 2);
+ aki_packet_pool_submit(codec->pool, packet);
+ return false;
+ }
return true;
}
@@ -151,6 +135,7 @@ struct bmu_server_handler *bmu_codec_server_create(void)
struct bmu_codec_server *codec = al_alloc_object(struct bmu_codec_server);
codec->handler.init = codec_server_init;
codec->handler.write_info = codec_server_write_info;
+ codec->handler.subscribe = codec_server_subscribe;
codec->handler.get_duration = codec_server_get_duration;
codec->handler.seek = codec_server_seek;
codec->handler.step = codec_server_step;