summaryrefslogtreecommitdiff
path: root/src/codec/spng
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-01-22 20:56:04 -0500
committerAndrew Opalach <andrew@akon.city> 2025-01-23 10:29:46 -0500
commit2daa31c0629f2eb4af84d6f4fed8ac89813de056 (patch)
treee90fdfa620a6a34361087edfe197a016e4828737 /src/codec/spng
parent5073f74aefb91616fb8e1df087747105e46e265d (diff)
downloadcamu-2daa31c0629f2eb4af84d6f4fed8ac89813de056.tar.gz
camu-2daa31c0629f2eb4af84d6f4fed8ac89813de056.tar.bz2
camu-2daa31c0629f2eb4af84d6f4fed8ac89813de056.zip
Big build update
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/codec/spng')
-rw-r--r--src/codec/spng/client.c77
-rw-r--r--src/codec/spng/impl.c164
-rw-r--r--src/codec/spng/meson.build3
-rw-r--r--src/codec/spng/server.c90
4 files changed, 170 insertions, 164 deletions
diff --git a/src/codec/spng/client.c b/src/codec/spng/client.c
new file mode 100644
index 0000000..6edb9c9
--- /dev/null
+++ b/src/codec/spng/client.c
@@ -0,0 +1,77 @@
+#include <spng.h>
+
+#include "../common.h"
+
+#include "decoder.h"
+
+static bool spng_decoder_init(struct camu_decoder *dec, struct camu_renderer *renderer, struct camu_codec_stream *stream,
+ void (*callback)(void *, struct camu_codec_frame *), void *userdata)
+{
+ struct camu_spng_decoder *spng = (struct camu_spng_decoder *)dec;
+ (void)renderer;
+ spng->stream = stream;
+ spng->callback = callback;
+ spng->userdata = userdata;
+ return true;
+}
+
+static s32 spng_decoder_push(struct camu_decoder *dec, struct camu_codec_packet *packet)
+{
+ struct camu_spng_decoder *spng = (struct camu_spng_decoder *)dec;
+ if (!packet) return CAMU_OK;
+
+ spng_ctx *ctx = spng_ctx_new(SPNG_CTX_IGNORE_ADLER32);
+ spng_set_png_buffer(ctx, nn_buffer_get_ptr(packet->buffer, 0), packet->buffer->size);
+ spng_set_option(ctx, SPNG_CHUNK_COUNT_LIMIT, 6250);
+ spng_set_crc_action(ctx, SPNG_CRC_DISCARD, SPNG_CRC_DISCARD);
+
+ size_t out_size;
+ spng_decoded_image_size(ctx, SPNG_FMT_RGBA8, &out_size);
+
+ struct camu_codec_frame *frame = al_alloc_object(struct camu_codec_frame);
+ frame->mode = CAMU_NORMAL;
+ frame->data = camu_page_alloc(out_size);
+ spng_decode_chunks(ctx);
+ spng_decode_image(ctx, frame->data, out_size, SPNG_FMT_RGBA8, 0);
+ spng_ctx_free(ctx);
+ frame->flags = 0;
+ frame->format = CAMU_PIXEL_FORMAT_RGBA;
+ struct camu_video_format *fmt = &spng->stream->video.fmt;
+ frame->video.width = fmt->width;
+ frame->video.height = fmt->height;
+ frame->pts = 0.0;
+
+ spng->callback(spng->userdata, frame);
+
+ return CAMU_OK;
+}
+
+static void spng_decoder_flush(struct camu_decoder *dec)
+{
+ (void)dec;
+}
+
+static s32 spng_decoder_process(struct camu_decoder *dec)
+{
+ (void)dec;
+ return CAMU_ERR_EOF;
+}
+
+static void spng_decoder_free(struct camu_decoder **dec)
+{
+ struct camu_spng_decoder *spng = (struct camu_spng_decoder *)*dec;
+ al_free(spng);
+ *dec = NULL;
+}
+
+struct camu_decoder *camu_spng_decoder_create(void)
+{
+ struct camu_spng_decoder *spng = al_alloc_object(struct camu_spng_decoder);
+ spng->dec.mode = CAMU_NORMAL;
+ spng->dec.init = spng_decoder_init;
+ spng->dec.push = spng_decoder_push;
+ spng->dec.process = spng_decoder_process;
+ spng->dec.flush = spng_decoder_flush;
+ spng->dec.free = spng_decoder_free;
+ return (struct camu_decoder *)spng;
+}
diff --git a/src/codec/spng/impl.c b/src/codec/spng/impl.c
index 3fb7e21..e69de29 100644
--- a/src/codec/spng/impl.c
+++ b/src/codec/spng/impl.c
@@ -1,164 +0,0 @@
-#include <al/lib.h>
-#include <nnwt/common.h>
-#include <spng.h>
-
-#include "../../cache/entry.h"
-
-#include "../common.h"
-
-#include "demuxer.h"
-#include "decoder.h"
-
-static bool spng_demuxer_init(struct camu_demuxer *demux, struct cch_handle *handle)
-{
- struct camu_spng_demuxer *spng = (struct camu_spng_demuxer *)demux;
-
- spng->handle = handle;
- nn_buffer_init(&spng->buffer);
- spng->eof = false;
-
- cch_handle_seek(spng->handle, 0, SEEK_SET);
- off_t size = cch_entry_get_size(spng->handle->entry);
- nn_buffer_ensure_space(&spng->buffer, size);
- cch_handle_read(spng->handle, nn_buffer_get_ptr(&spng->buffer, 0), size);
- spng->buffer.size = size;
-
- spng_ctx *ctx = spng_ctx_new(SPNG_CTX_IGNORE_ADLER32);
- spng_set_png_buffer(ctx, nn_buffer_get_ptr(&spng->buffer, 0), spng->buffer.size);
- spng_set_option(ctx, SPNG_CHUNK_COUNT_LIMIT, 6250);
- spng_set_crc_action(ctx, SPNG_CRC_DISCARD, SPNG_CRC_DISCARD);
-
- struct spng_ihdr ihdr;
- spng_get_ihdr(ctx, &ihdr);
-
- struct camu_codec_stream stream;
- stream.mode = CAMU_NORMAL;
- stream.type = CAMU_STREAM_VIDEO;
- stream.video.width = ihdr.width;
- stream.video.height = ihdr.height;
- stream.video.format = CAMU_PIXEL_FORMAT_RGBA;
-
- al_array_push(spng->demux.streams, stream);
-
- spng_ctx_free(ctx);
-
- return true;
-}
-
-static s32 spng_demuxer_get_packet(struct camu_demuxer *demux, struct camu_codec_packet *packet)
-{
- struct camu_spng_demuxer *spng = (struct camu_spng_demuxer *)demux;
- if (!spng->eof) {
- packet->mode = CAMU_NORMAL;
- packet->buffer = &spng->buffer;
- spng->eof = true;
- return CAMU_OK;
- }
- return CAMU_ERR_EOF;
-}
-
-static u64 spng_demuxer_get_duration(struct camu_demuxer *demux)
-{
- (void)demux;
- return 0;
-}
-
-static bool spng_demuxer_seek(struct camu_demuxer *demux, u64 pos)
-{
- (void)demux;
- (void)pos;
- return true;
-}
-
-static void spng_demuxer_free(struct camu_demuxer **demux)
-{
- struct camu_spng_demuxer *spng = (struct camu_spng_demuxer *)*demux;
- nn_buffer_free(&spng->buffer);
- al_array_free(spng->demux.streams);
- al_free(spng);
- *demux = NULL;
-}
-
-static bool spng_decoder_init(struct camu_decoder *dec, struct camu_renderer *renderer, struct camu_codec_stream *stream,
- void (*callback)(void *, struct camu_codec_frame *), void *userdata)
-{
- struct camu_spng_decoder *spng = (struct camu_spng_decoder *)dec;
- (void)renderer;
- spng->stream = stream;
- spng->callback = callback;
- spng->userdata = userdata;
- return true;
-}
-
-static s32 spng_decoder_push(struct camu_decoder *dec, struct camu_codec_packet *packet)
-{
- struct camu_spng_decoder *spng = (struct camu_spng_decoder *)dec;
- if (!packet) return CAMU_OK;
-
- spng_ctx *ctx = spng_ctx_new(SPNG_CTX_IGNORE_ADLER32);
- spng_set_png_buffer(ctx, nn_buffer_get_ptr(packet->buffer, 0), packet->buffer->size);
- spng_set_option(ctx, SPNG_CHUNK_COUNT_LIMIT, 6250);
- spng_set_crc_action(ctx, SPNG_CRC_DISCARD, SPNG_CRC_DISCARD);
-
- size_t out_size;
- spng_decoded_image_size(ctx, SPNG_FMT_RGBA8, &out_size);
-
- struct camu_codec_frame *frame = al_alloc_object(struct camu_codec_frame);
- frame->mode = CAMU_NORMAL;
- frame->data = camu_page_alloc(out_size);
- spng_decode_chunks(ctx);
- spng_decode_image(ctx, frame->data, out_size, SPNG_FMT_RGBA8, 0);
- spng_ctx_free(ctx);
- frame->flags = 0;
- frame->format = CAMU_PIXEL_FORMAT_RGBA;
- frame->width = spng->stream->video.width;
- frame->height = spng->stream->video.height;
- frame->pts = 0.0;
-
- spng->callback(spng->userdata, frame);
-
- return CAMU_OK;
-}
-
-static void spng_decoder_flush(struct camu_decoder *dec)
-{
- (void)dec;
-}
-
-static s32 spng_decoder_process(struct camu_decoder *dec)
-{
- (void)dec;
- return CAMU_ERR_EOF;
-}
-
-static void spng_decoder_free(struct camu_decoder **dec)
-{
- struct camu_spng_decoder *spng = (struct camu_spng_decoder *)*dec;
- al_free(spng);
- *dec = NULL;
-}
-
-struct camu_demuxer *camu_spng_demuxer_create(void)
-{
- struct camu_spng_demuxer *spng = al_alloc_object(struct camu_spng_demuxer);
- spng->demux.mode = CAMU_NORMAL;
- al_array_init(spng->demux.streams);
- spng->demux.init = spng_demuxer_init;
- spng->demux.get_packet = spng_demuxer_get_packet;
- spng->demux.get_duration = spng_demuxer_get_duration;
- spng->demux.seek = spng_demuxer_seek;
- spng->demux.free = spng_demuxer_free;
- return (struct camu_demuxer *)spng;
-}
-
-struct camu_decoder *camu_spng_decoder_create(void)
-{
- struct camu_spng_decoder *spng = al_alloc_object(struct camu_spng_decoder);
- spng->dec.mode = CAMU_NORMAL;
- spng->dec.init = spng_decoder_init;
- spng->dec.push = spng_decoder_push;
- spng->dec.process = spng_decoder_process;
- spng->dec.flush = spng_decoder_flush;
- spng->dec.free = spng_decoder_free;
- return (struct camu_decoder *)spng;
-}
diff --git a/src/codec/spng/meson.build b/src/codec/spng/meson.build
new file mode 100644
index 0000000..d8af781
--- /dev/null
+++ b/src/codec/spng/meson.build
@@ -0,0 +1,3 @@
+spng = dependency('spng')
+codec_server_deps += [declare_dependency(sources: ['server.c'], dependencies: spng)]
+codec_client_deps += [declare_dependency(sources: ['client.c'], dependencies: spng)]
diff --git a/src/codec/spng/server.c b/src/codec/spng/server.c
new file mode 100644
index 0000000..8eb941b
--- /dev/null
+++ b/src/codec/spng/server.c
@@ -0,0 +1,90 @@
+#include <spng.h>
+
+#include "../../cache/entry.h"
+
+#include "demuxer.h"
+
+static bool spng_demuxer_init(struct camu_demuxer *demux, struct cch_handle *handle)
+{
+ struct camu_spng_demuxer *spng = (struct camu_spng_demuxer *)demux;
+
+ spng->handle = handle;
+ nn_buffer_init(&spng->buffer);
+ spng->eof = false;
+
+ cch_handle_seek(spng->handle, 0, SEEK_SET);
+ off_t size = cch_entry_get_size(spng->handle->entry);
+ nn_buffer_ensure_space(&spng->buffer, size);
+ cch_handle_read(spng->handle, nn_buffer_get_ptr(&spng->buffer, 0), size);
+ spng->buffer.size = size;
+
+ spng_ctx *ctx = spng_ctx_new(SPNG_CTX_IGNORE_ADLER32);
+ spng_set_png_buffer(ctx, nn_buffer_get_ptr(&spng->buffer, 0), spng->buffer.size);
+ spng_set_option(ctx, SPNG_CHUNK_COUNT_LIMIT, 6250);
+ spng_set_crc_action(ctx, SPNG_CRC_DISCARD, SPNG_CRC_DISCARD);
+
+ struct spng_ihdr ihdr;
+ spng_get_ihdr(ctx, &ihdr);
+
+ struct camu_codec_stream stream = { 0 };
+ stream.mode = CAMU_NORMAL;
+ stream.type = CAMU_STREAM_VIDEO;
+ struct camu_video_format *fmt = &stream.video.fmt;
+ fmt->width = ihdr.width;
+ fmt->height = ihdr.height;
+ fmt->format = CAMU_PIXEL_FORMAT_RGBA;
+
+ al_array_push(spng->demux.streams, stream);
+
+ spng_ctx_free(ctx);
+
+ return true;
+}
+
+static s32 spng_demuxer_get_packet(struct camu_demuxer *demux, struct camu_codec_packet *packet)
+{
+ struct camu_spng_demuxer *spng = (struct camu_spng_demuxer *)demux;
+ if (!spng->eof) {
+ packet->mode = CAMU_NORMAL;
+ packet->buffer = &spng->buffer;
+ spng->eof = true;
+ return CAMU_OK;
+ }
+ return CAMU_ERR_EOF;
+}
+
+static u64 spng_demuxer_get_duration(struct camu_demuxer *demux)
+{
+ (void)demux;
+ return 0;
+}
+
+static bool spng_demuxer_seek(struct camu_demuxer *demux, u64 pos)
+{
+ (void)demux;
+ (void)pos;
+ return true;
+}
+
+static void spng_demuxer_free(struct camu_demuxer **demux)
+{
+ struct camu_spng_demuxer *spng = (struct camu_spng_demuxer *)*demux;
+ nn_buffer_free(&spng->buffer);
+ al_array_free(spng->demux.streams);
+ al_free(spng);
+ *demux = NULL;
+}
+
+
+struct camu_demuxer *camu_spng_demuxer_create(void)
+{
+ struct camu_spng_demuxer *spng = al_alloc_object(struct camu_spng_demuxer);
+ spng->demux.mode = CAMU_NORMAL;
+ al_array_init(spng->demux.streams);
+ spng->demux.init = spng_demuxer_init;
+ spng->demux.get_packet = spng_demuxer_get_packet;
+ spng->demux.get_duration = spng_demuxer_get_duration;
+ spng->demux.seek = spng_demuxer_seek;
+ spng->demux.free = spng_demuxer_free;
+ return (struct camu_demuxer *)spng;
+}