diff options
| author | 2024-01-01 11:23:22 -0500 | |
|---|---|---|
| committer | 2024-01-01 11:23:22 -0500 | |
| commit | 130a0edc0405e53b45f8b2f8da0b94356480a644 (patch) | |
| tree | 76cda2f7e0098bdcb6c54dc152bf3e95467fd44e /src/bimu/handlers | |
| parent | 099126fdca625c5f6c219c5a1a7ecbc0e145988f (diff) | |
| download | camu-130a0edc0405e53b45f8b2f8da0b94356480a644.tar.gz camu-130a0edc0405e53b45f8b2f8da0b94356480a644.tar.bz2 camu-130a0edc0405e53b45f8b2f8da0b94356480a644.zip | |
wip
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/bimu/handlers')
| -rw-r--r-- | src/bimu/handlers/codec_client.c | 3 | ||||
| -rw-r--r-- | src/bimu/handlers/codec_server.c | 95 |
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; |