diff options
Diffstat (limited to 'src/codec/wuffs')
| -rw-r--r-- | src/codec/wuffs/decoder.h | 3 | ||||
| -rw-r--r-- | src/codec/wuffs/impl.c | 110 |
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; |