summaryrefslogtreecommitdiff
path: root/src/codec/wuffs
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2024-10-21 19:22:50 -0400
committerAndrew Opalach <andrew@akon.city> 2024-10-21 19:22:50 -0400
commit60b4ebfbf3be78dba9dc7c65ab2bdaa0b218c0c2 (patch)
tree08ff2ce7975f523112e7ad2fe4f797b4fc7db5de /src/codec/wuffs
parent2f9a0945bfeee3296cec3d38d094e4c49f9cb65f (diff)
downloadcamu-60b4ebfbf3be78dba9dc7c65ab2bdaa0b218c0c2.tar.gz
camu-60b4ebfbf3be78dba9dc7c65ab2bdaa0b218c0c2.tar.bz2
camu-60b4ebfbf3be78dba9dc7c65ab2bdaa0b218c0c2.zip
Everything before initial synced list
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/codec/wuffs')
-rw-r--r--src/codec/wuffs/decoder.h3
-rw-r--r--src/codec/wuffs/impl.c110
2 files changed, 52 insertions, 61 deletions
diff --git a/src/codec/wuffs/decoder.h b/src/codec/wuffs/decoder.h
index 71f0290..bd79236 100644
--- a/src/codec/wuffs/decoder.h
+++ b/src/codec/wuffs/decoder.h
@@ -5,8 +5,9 @@
struct camu_wuffs_decoder {
struct camu_decoder dec;
+ struct camu_codec_stream *stream;
u8 file_type;
- void (*callback)(void *, struct camu_frame *);
+ void (*callback)(void *, struct camu_codec_frame *);
void (*userdata);
};
diff --git a/src/codec/wuffs/impl.c b/src/codec/wuffs/impl.c
index 26e9011..4d9ea7e 100644
--- a/src/codec/wuffs/impl.c
+++ b/src/codec/wuffs/impl.c
@@ -1,3 +1,4 @@
+#include <aki/common.h>
#define WUFFS_IMPLEMENTATION
#define WUFFS_CONFIG__STATIC_FUNCTIONS
#define WUFFS_CONFIG__MODULES
@@ -11,8 +12,6 @@
#define WUFFS_CONFIG__MODULE__IMAGE
#include <wuffs-unsupported-snapshot.c>
-#include <aki/common.h>
-
#include "../../cache/entry.h"
#include "demuxer.h"
@@ -32,44 +31,47 @@ static bool wuffs_demuxer_init(struct camu_demuxer *demux, struct cch_handle *ha
cch_handle_read(wfs->handle, aki_buffer_get_ptr(&wfs->buffer, 0), size);
wfs->buffer.size = size;
- wuffs_png__decoder wf_dec = {0};
+ wuffs_png__decoder wf_dec = { 0 };
wuffs_base__status status = wuffs_png__decoder__initialize(&wf_dec, sizeof(wf_dec), WUFFS_VERSION, 0);
- (void)status;
- //if (!wuffs_base__status__is_ok(&status)) goto err;
+ if (!wuffs_base__status__is_ok(&status)) goto err;
wuffs_png__decoder__set_quirk(&wf_dec, WUFFS_BASE__QUIRK_IGNORE_CHECKSUM, true);
- //wuffs_png__decoder__set_report_metadata(&wf_dec, WUFFS_BASE__FOURCC__ICCP, true);
-
- wuffs_base__io_buffer src = {0};
+ wuffs_base__io_buffer src = { 0 };
src.data.ptr = aki_buffer_get_ptr(&wfs->buffer, 0);
src.data.len = wfs->buffer.size;
src.meta.wi = wfs->buffer.size;
src.meta.closed = true;
- wuffs_base__image_config ic = {0};
+ wuffs_base__image_config ic = { 0 };
status = wuffs_png__decoder__decode_image_config(&wf_dec, &ic, &src);
- //if (!wuffs_base__status__is_ok(&status)) goto err;
- //if (!wuffs_base__image_config__is_valid(&ic)) goto err;
+ if (!wuffs_base__status__is_ok(&status)) goto err;
+ if (!wuffs_base__image_config__is_valid(&ic)) goto err;
- struct camu_stream stream;
- stream.type = CAMU_NORMAL;
+ struct camu_codec_stream stream;
+ stream.mode = CAMU_NORMAL;
+ stream.type = CAMU_STREAM_VIDEO;
stream.video.width = wuffs_base__pixel_config__width(&ic.pixcfg);
stream.video.height = wuffs_base__pixel_config__height(&ic.pixcfg);
+ stream.video.format = CAMU_PIXEL_FORMAT_RGBA;
al_array_push(wfs->demux.streams, stream);
return true;
+err:
+ return false;
}
-static s32 wuffs_demuxer_get_packet(struct camu_demuxer *demux, struct camu_packet *packet)
+static s32 wuffs_demuxer_get_packet(struct camu_demuxer *demux, struct camu_codec_packet *packet)
{
struct camu_wuffs_demuxer *wfs = (struct camu_wuffs_demuxer *)demux;
- if (wfs->eof) return CAMU_ERR_EOF;
- packet->type = CAMU_NORMAL;
- packet->buffer = &wfs->buffer;
- wfs->eof = true;
- return CAMU_OK;
+ if (!wfs->eof) {
+ packet->mode = CAMU_NORMAL;
+ packet->buffer = &wfs->buffer;
+ wfs->eof = true;
+ return CAMU_OK;
+ }
+ return CAMU_ERR_EOF;
}
static u64 wuffs_demuxer_get_duration(struct camu_demuxer *demux)
@@ -88,85 +90,74 @@ static bool wuffs_demuxer_seek(struct camu_demuxer *demux, u64 pos)
static void wuffs_demuxer_free(struct camu_demuxer **demux)
{
struct camu_wuffs_demuxer *wfs = (struct camu_wuffs_demuxer *)*demux;
+ aki_buffer_free(&wfs->buffer);
+ al_array_free(wfs->demux.streams);
al_free(wfs);
*demux = NULL;
}
-static bool wuffs_decoder_init(struct camu_decoder *dec, struct camu_renderer *renderer, struct camu_stream *stream)
+static bool wuffs_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_wuffs_decoder *wfs = (struct camu_wuffs_decoder *)dec;
- (void)wfs;
- (void)stream;
(void)renderer;
- return true;
-}
-
-static void wuffs_decoder_set_callback(struct camu_decoder *dec, void (*callback)(void *, struct camu_frame *), void *userdata)
-{
- struct camu_wuffs_decoder *wfs = (struct camu_wuffs_decoder *)dec;
+ wfs->stream = stream;
wfs->callback = callback;
wfs->userdata = userdata;
+ return true;
}
-static s32 wuffs_decoder_push(struct camu_decoder *dec, struct camu_packet *packet)
+static s32 wuffs_decoder_push(struct camu_decoder *dec, struct camu_codec_packet *packet)
{
+ struct camu_wuffs_decoder *wfs = (struct camu_wuffs_decoder *)dec;
if (!packet) return CAMU_OK;
- struct camu_wuffs_decoder *wfs = (struct camu_wuffs_decoder *)dec;
+ struct camu_codec_frame *frame = al_alloc_object(struct camu_codec_frame);
+ frame->mode = CAMU_NORMAL;
+ frame->data = NULL;
+ frame->flags = 0;
+ frame->width = wfs->stream->video.width;
+ frame->height = wfs->stream->video.height;
+ frame->format = CAMU_PIXEL_FMT_RGBA;
- wuffs_png__decoder wf_dec = {0};
+ wuffs_png__decoder wf_dec = { 0 };
wuffs_base__status status = wuffs_png__decoder__initialize(&wf_dec, sizeof(wf_dec), WUFFS_VERSION, 0);
- //if (!wuffs_base__status__is_ok(&status)) goto err;
+ if (!wuffs_base__status__is_ok(&status)) goto err;
wuffs_png__decoder__set_quirk(&wf_dec, WUFFS_BASE__QUIRK_IGNORE_CHECKSUM, true);
- //wuffs_png__decoder__set_report_metadata(&wf_dec, WUFFS_BASE__FOURCC__ICCP, true);
-
- wuffs_base__io_buffer src = {0};
+ wuffs_base__io_buffer src = { 0 };
src.data.ptr = aki_buffer_get_ptr(packet->buffer, 0);
src.data.len = packet->buffer->size;
src.meta.wi = packet->buffer->size;
src.meta.closed = true;
- //wf_dec.private_impl.p_decode_iccp[0] = 1;
-
- wuffs_base__image_config ic = {0};
+ wuffs_base__image_config ic = { 0 };
status = wuffs_png__decoder__decode_image_config(&wf_dec, &ic, &src);
- //if (!wuffs_base__status__is_ok(&status)) goto err;
- //if (!wuffs_base__image_config__is_valid(&ic)) goto err;
-
- struct camu_frame *frame = al_alloc_object(struct camu_frame);
- frame->type = CAMU_NORMAL;
- frame->width = wfs->dec.stream->video.width;
- frame->height = wfs->dec.stream->video.height;
- frame->fmt = CAMU_PIXEL_FMT_RGBA;
+ if (!wuffs_base__status__is_ok(&status)) goto err;
+ if (!wuffs_base__image_config__is_valid(&ic)) goto err;
u32 pixsub = WUFFS_BASE__PIXEL_SUBSAMPLING__NONE;
u32 pixfmt = WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL;
wuffs_base__pixel_config__set(&ic.pixcfg, pixfmt, pixsub, frame->width, frame->height);
- wuffs_base__pixel_buffer pb = {0};
+ wuffs_base__pixel_buffer pb = { 0 };
size_t dst_size = frame->width * frame->height * 4;
size_t wrk_size = wuffs_png__decoder__workbuf_len(&wf_dec).max_incl;
- /*
- void *device_ptr = dec->renderer->get_device_ptr(dec->renderer, dst_size + wrk_size);
- wuffs_base__slice_u8 wrk = wuffs_base__make_slice_u8(device_ptr + dst_size, wrk_size);
- status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg,
- wuffs_base__make_slice_u8(device_ptr, dst_size));
- */
frame->data = camu_page_alloc(dst_size + wrk_size);
- status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg,
- wuffs_base__make_slice_u8(frame->data, dst_size));
- //if (!wuffs_base__status__is_ok(&status)) goto err;
+ status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg, wuffs_base__make_slice_u8(frame->data, dst_size));
+ if (!wuffs_base__status__is_ok(&status)) goto err;
wuffs_base__slice_u8 wrk = wuffs_base__make_slice_u8(frame->data + dst_size, wrk_size);
status = wuffs_png__decoder__decode_frame(&wf_dec, &pb, &src, 0, wrk, NULL);
- (void)status;
- //if (!wuffs_base__status__is_ok(&status)) goto err;
+ if (!wuffs_base__status__is_ok(&status)) goto err;
wfs->callback(wfs->userdata, frame);
return CAMU_OK;
+err:
+ camu_codec_frame_discard(frame);
+ return CAMU_ERR_ERROR;
}
static void wuffs_decoder_flush(struct camu_decoder *dec)
@@ -190,7 +181,7 @@ static void wuffs_decoder_free(struct camu_decoder **dec)
struct camu_demuxer *camu_wuffs_demuxer_create(void)
{
struct camu_wuffs_demuxer *wfs = al_alloc_object(struct camu_wuffs_demuxer);
- wfs->demux.type = CAMU_NORMAL;
+ wfs->demux.mode = CAMU_NORMAL;
al_array_init(wfs->demux.streams);
wfs->demux.init = wuffs_demuxer_init;
wfs->demux.get_packet = wuffs_demuxer_get_packet;
@@ -204,7 +195,6 @@ struct camu_decoder *camu_wuffs_decoder_create(void)
{
struct camu_wuffs_decoder *wfs = al_alloc_object(struct camu_wuffs_decoder);
wfs->dec.init = wuffs_decoder_init;
- wfs->dec.set_callback = wuffs_decoder_set_callback;
wfs->dec.push = wuffs_decoder_push;
wfs->dec.process = wuffs_decoder_process;
wfs->dec.flush = wuffs_decoder_flush;