diff libbpg.h @ 0:772086c29cc7

Initial import.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 16 Nov 2016 11:16:33 +0200
parents
children 33594243ce31
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libbpg.h	Wed Nov 16 11:16:33 2016 +0200
@@ -0,0 +1,138 @@
+/*
+ * BPG decoder
+ * 
+ * Copyright (c) 2014 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef _LIBBPG_H
+#define _LIBBPG_H
+
+#include <inttypes.h>
+
+typedef struct BPGDecoderContext BPGDecoderContext;
+
+typedef enum {
+    BPG_FORMAT_GRAY,
+    BPG_FORMAT_420, /* chroma at offset (0.5, 0.5) (JPEG) */
+    BPG_FORMAT_422, /* chroma at offset (0.5, 0) (JPEG) */
+    BPG_FORMAT_444,
+    BPG_FORMAT_420_VIDEO, /* chroma at offset (0, 0.5) (MPEG2) */
+    BPG_FORMAT_422_VIDEO, /* chroma at offset (0, 0) (MPEG2) */
+} BPGImageFormatEnum;
+
+typedef enum {
+    BPG_CS_YCbCr,
+    BPG_CS_RGB,
+    BPG_CS_YCgCo,
+    BPG_CS_YCbCr_BT709,
+    BPG_CS_YCbCr_BT2020,
+
+    BPG_CS_COUNT,
+} BPGColorSpaceEnum;
+
+typedef struct {
+    uint32_t width;
+    uint32_t height;
+    uint8_t format; /* see BPGImageFormatEnum */
+    uint8_t has_alpha; /* TRUE if an alpha plane is present */
+    uint8_t color_space; /* see BPGColorSpaceEnum */
+    uint8_t bit_depth;
+    uint8_t premultiplied_alpha; /* TRUE if the color is alpha premultiplied */
+    uint8_t has_w_plane; /* TRUE if a W plane is present (for CMYK encoding) */
+    uint8_t limited_range; /* TRUE if limited range for the color */
+    uint8_t has_animation; /* TRUE if the image contains animations */
+    uint16_t loop_count; /* animations: number of loop, 0 = infinity */
+} BPGImageInfo;
+
+typedef enum {
+    BPG_EXTENSION_TAG_EXIF = 1,
+    BPG_EXTENSION_TAG_ICCP = 2,
+    BPG_EXTENSION_TAG_XMP = 3,
+    BPG_EXTENSION_TAG_THUMBNAIL = 4,
+    BPG_EXTENSION_TAG_ANIM_CONTROL = 5,
+} BPGExtensionTagEnum;
+
+typedef struct BPGExtensionData {
+    BPGExtensionTagEnum tag;
+    uint32_t buf_len;
+    uint8_t *buf;
+    struct BPGExtensionData *next;
+} BPGExtensionData;
+
+typedef enum {
+    BPG_OUTPUT_FORMAT_RGB24,
+    BPG_OUTPUT_FORMAT_RGBA32, /* not premultiplied alpha */
+    BPG_OUTPUT_FORMAT_RGB48,
+    BPG_OUTPUT_FORMAT_RGBA64, /* not premultiplied alpha */
+    BPG_OUTPUT_FORMAT_CMYK32,
+    BPG_OUTPUT_FORMAT_CMYK64,
+} BPGDecoderOutputFormat;
+
+#define BPG_DECODER_INFO_BUF_SIZE 16
+
+BPGDecoderContext *bpg_decoder_open(void);
+
+/* If enable is true, extension data are kept during the image
+   decoding and can be accessed after bpg_decoder_decode() with
+   bpg_decoder_get_extension(). By default, the extension data are
+   discarded. */
+void bpg_decoder_keep_extension_data(BPGDecoderContext *s, int enable);
+
+/* return 0 if 0K, < 0 if error */
+int bpg_decoder_decode(BPGDecoderContext *s, const uint8_t *buf, int buf_len);
+
+/* Return the first element of the extension data list */
+BPGExtensionData *bpg_decoder_get_extension_data(BPGDecoderContext *s);
+
+/* return 0 if 0K, < 0 if error */
+int bpg_decoder_get_info(BPGDecoderContext *s, BPGImageInfo *p);
+
+/* return 0 if 0K, < 0 if error */
+int bpg_decoder_start(BPGDecoderContext *s, BPGDecoderOutputFormat out_fmt);
+
+/* return the frame delay for animations as a fraction (*pnum) / (*pden)
+   in seconds. In case there is no animation, 0 / 1 is returned. */
+void bpg_decoder_get_frame_duration(BPGDecoderContext *s, int *pnum, int *pden);
+
+/* return 0 if 0K, < 0 if error */
+int bpg_decoder_get_line(BPGDecoderContext *s, void *buf);
+
+void bpg_decoder_close(BPGDecoderContext *s);
+
+/* only useful for low level access to the image data */
+uint8_t *bpg_decoder_get_data(BPGDecoderContext *s, int *pline_size, int plane);
+
+/* Get information from the start of the image data in 'buf' (at least
+   min(BPG_DECODER_INFO_BUF_SIZE, file_size) bytes must be given).
+
+   If pfirst_md != NULL, the extension data are also parsed and the
+   first element of the list is returned in *pfirst_md. The list must
+   be freed with bpg_decoder_free_extension_data().
+
+   BPGImageInfo.loop_count is only set if extension data are parsed.
+
+   Return 0 if OK, < 0 if unrecognized data. */
+int bpg_decoder_get_info_from_buf(BPGImageInfo *p, 
+                                  BPGExtensionData **pfirst_md,
+                                  const uint8_t *buf, int buf_len);
+/* Free the extension data returned by bpg_decoder_get_info_from_buf() */
+void bpg_decoder_free_extension_data(BPGExtensionData *first_md);
+
+#endif /* _LIBBPG_H */