diff options
Diffstat (limited to 'include/gst/codecparsers/gstjpegparser.h')
-rw-r--r-- | include/gst/codecparsers/gstjpegparser.h | 412 |
1 files changed, 412 insertions, 0 deletions
diff --git a/include/gst/codecparsers/gstjpegparser.h b/include/gst/codecparsers/gstjpegparser.h new file mode 100644 index 0000000000..ca96e89abb --- /dev/null +++ b/include/gst/codecparsers/gstjpegparser.h @@ -0,0 +1,412 @@ +/* GStreamer JPEG parser + * Copyright (C) 2011-2012 Intel Corporation + * Copyright (C) 2015 Tim-Philipp Müller <tim@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifndef GST_JPEG_PARSER_H +#define GST_JPEG_PARSER_H + +#ifndef GST_USE_UNSTABLE_API +# warning "The JPEG parsing library is unstable API and may change in future." +# warning "You can define GST_USE_UNSTABLE_API to avoid this warning." +#endif + +#include <gst/gst.h> +#include <gst/codecparsers/codecparsers-prelude.h> + +G_BEGIN_DECLS + +/** + * GST_JPEG_MAX_FRAME_COMPONENTS: + * + * Maximum number of image components in a frame (Nf). + * + * Since: 1.6 + */ +#define GST_JPEG_MAX_FRAME_COMPONENTS 256 + +/** + * GST_JPEG_MAX_SCAN_COMPONENTS: + * + * Maximum number of image components in a scan (Ns). + * + * Since: 1.6 + */ +#define GST_JPEG_MAX_SCAN_COMPONENTS 4 + +/** + * GST_JPEG_MAX_QUANT_ELEMENTS: + * + * Number of elements in the quantization table. + * + * Since: 1.6 + */ +#define GST_JPEG_MAX_QUANT_ELEMENTS 64 + +typedef struct _GstJpegQuantTable GstJpegQuantTable; +typedef struct _GstJpegQuantTables GstJpegQuantTables; +typedef struct _GstJpegHuffmanTable GstJpegHuffmanTable; +typedef struct _GstJpegHuffmanTables GstJpegHuffmanTables; +typedef struct _GstJpegScanComponent GstJpegScanComponent; +typedef struct _GstJpegScanHdr GstJpegScanHdr; +typedef struct _GstJpegFrameComponent GstJpegFrameComponent; +typedef struct _GstJpegFrameHdr GstJpegFrameHdr; +typedef struct _GstJpegSegment GstJpegSegment; + +/** + * GstJpegMarker: + * @GST_JPEG_MARKER_SOF0: Start of frame marker code (Baseline) + * @GST_JPEG_MARKER_SOF1: Start of frame marker code (Extended Sequential, Huffman) + * @GST_JPEG_MARKER_SOF2: Start of frame marker code (Progressive, Huffman) + * @GST_JPEG_MARKER_SOF3: Start of frame marker code (Lossless, Huffman) + * @GST_JPEG_MARKER_SOF5: Start of frame marker code (Differential Sequential, Huffman) + * @GST_JPEG_MARKER_SOF6: Start of frame marker code (Differential Progressive, Huffman) + * @GST_JPEG_MARKER_SOF7: Start of frame marker code (Differential Lossless, Huffman) + * @GST_JPEG_MARKER_SOF9: Start of frame marker code (Extended Sequential, Arithmetic) + * @GST_JPEG_MARKER_SOF10: Start of frame marker code (Progressive, Arithmetic) + * @GST_JPEG_MARKER_SOF11: Start of frame marker code (Lossless, Arithmetic) + * @GST_JPEG_MARKER_SOF13: Start of frame marker code (Differential Sequential, Arithmetic) + * @GST_JPEG_MARKER_SOF14: Start of frame marker code (Differential Progressive, Arithmetic) + * @GST_JPEG_MARKER_SOF15: Start of frame marker code (Differential Lossless, Arithmetic) + * @GST_JPEG_MARKER_DHT: Huffman table marker code + * @GST_JPEG_MARKER_DAC: Arithmetic coding marker code + * @GST_JPEG_MARKER_RST_MIN: Restart interval min marker code + * @GST_JPEG_MARKER_RST_MAX: Restart interval max marker code + * @GST_JPEG_MARKER_SOI: Start of image marker code + * @GST_JPEG_MARKER_EOI: End of image marker code + * @GST_JPEG_MARKER_SOS: Start of scan marker code + * @GST_JPEG_MARKER_DQT: Define quantization table marker code + * @GST_JPEG_MARKER_DNL: Define number of lines marker code + * @GST_JPEG_MARKER_DRI: Define restart interval marker code + * @GST_JPEG_MARKER_APP0: Application segment 0 marker code + * @GST_JPEG_MARKER_APP1: Application segment 1 marker code + * @GST_JPEG_MARKER_APP2: Application segment 2 marker code + * @GST_JPEG_MARKER_APP3: Application segment 3 marker code + * @GST_JPEG_MARKER_APP4: Application segment 4 marker code + * @GST_JPEG_MARKER_APP5: Application segment 5 marker code + * @GST_JPEG_MARKER_APP6: Application segment 6 marker code + * @GST_JPEG_MARKER_APP7: Application segment 7 marker code + * @GST_JPEG_MARKER_APP8: Application segment 8 marker code + * @GST_JPEG_MARKER_APP9: Application segment 9 marker code + * @GST_JPEG_MARKER_APP10: Application segment 10 marker code + * @GST_JPEG_MARKER_APP11: Application segment 11 marker code + * @GST_JPEG_MARKER_APP12: Application segment 12 marker code + * @GST_JPEG_MARKER_APP13: Application segment 13 marker code + * @GST_JPEG_MARKER_APP14: Application segment 14 marker code + * @GST_JPEG_MARKER_APP15: Application segment 15 marker code + * @GST_JPEG_MARKER_COM: Comment marker code + * + * Indicates the type of JPEG segment. + * + * Since: 1.6 + */ +typedef enum { + GST_JPEG_MARKER_SOF0 = 0xC0, + GST_JPEG_MARKER_SOF1 = 0xC1, + GST_JPEG_MARKER_SOF2 = 0xC2, + GST_JPEG_MARKER_SOF3 = 0xC3, + /* 0xC4 = DHT see below */ + GST_JPEG_MARKER_SOF5 = 0xC5, + GST_JPEG_MARKER_SOF6 = 0xC6, + GST_JPEG_MARKER_SOF7 = 0xC7, + /* 0xC8 = reserved */ + GST_JPEG_MARKER_SOF9 = 0xC9, + GST_JPEG_MARKER_SOF10 = 0xCA, + GST_JPEG_MARKER_SOF11 = 0xCB, + /* 0xCC = DAC see below */ + GST_JPEG_MARKER_SOF13 = 0xCD, + GST_JPEG_MARKER_SOF14 = 0xCE, + GST_JPEG_MARKER_SOF15 = 0xCF, + GST_JPEG_MARKER_DHT = 0xC4, + GST_JPEG_MARKER_DAC = 0xCC, + GST_JPEG_MARKER_RST0 = 0xD0, + GST_JPEG_MARKER_RST1 = 0xD1, + GST_JPEG_MARKER_RST2 = 0xD2, + GST_JPEG_MARKER_RST3 = 0xD3, + GST_JPEG_MARKER_RST4 = 0xD4, + GST_JPEG_MARKER_RST5 = 0xD5, + GST_JPEG_MARKER_RST6 = 0xD6, + GST_JPEG_MARKER_RST7 = 0xD7, + GST_JPEG_MARKER_SOI = 0xD8, + GST_JPEG_MARKER_EOI = 0xD9, + GST_JPEG_MARKER_SOS = 0xDA, + GST_JPEG_MARKER_DQT = 0xDB, + GST_JPEG_MARKER_DNL = 0xDC, + GST_JPEG_MARKER_DRI = 0xDD, + GST_JPEG_MARKER_APP0 = 0xE0, + GST_JPEG_MARKER_APP1 = 0xE1, + GST_JPEG_MARKER_APP2 = 0xE2, + GST_JPEG_MARKER_APP3 = 0xE3, + GST_JPEG_MARKER_APP4 = 0xE4, + GST_JPEG_MARKER_APP5 = 0xE5, + GST_JPEG_MARKER_APP6 = 0xE6, + GST_JPEG_MARKER_APP7 = 0xE7, + GST_JPEG_MARKER_APP8 = 0xE8, + GST_JPEG_MARKER_APP9 = 0xE9, + GST_JPEG_MARKER_APP10 = 0xEA, + GST_JPEG_MARKER_APP11 = 0xEB, + GST_JPEG_MARKER_APP12 = 0xEC, + GST_JPEG_MARKER_APP13 = 0xED, + GST_JPEG_MARKER_APP14 = 0xEE, + GST_JPEG_MARKER_APP15 = 0xEF, + GST_JPEG_MARKER_COM = 0xFE, +} GstJpegMarker; + +#define GST_JPEG_MARKER_SOF_MIN GST_JPEG_MARKER_SOF0 +#define GST_JPEG_MARKER_SOF_MAX GST_JPEG_MARKER_SOF15 + +#define GST_JPEG_MARKER_APP_MIN GST_JPEG_MARKER_APP0 +#define GST_JPEG_MARKER_APP_MAX GST_JPEG_MARKER_APP15 + +#define GST_JPEG_MARKER_RST_MIN GST_JPEG_MARKER_RST0 +#define GST_JPEG_MARKER_RST_MAX GST_JPEG_MARKER_RST7 + +/** + * GstJpegProfile: + * @GST_JPEG_PROFILE_BASELINE: Baseline DCT + * @GST_JPEG_PROFILE_EXTENDED: Extended sequential DCT + * @GST_JPEG_PROFILE_PROGRESSIVE: Progressive DCT + * @GST_JPEG_PROFILE_LOSSLESS: Lossless (sequential) + * + * JPEG encoding processes. + * + * Since: 1.6 + */ +typedef enum { + GST_JPEG_PROFILE_BASELINE = 0x00, + GST_JPEG_PROFILE_EXTENDED = 0x01, + GST_JPEG_PROFILE_PROGRESSIVE = 0x02, + GST_JPEG_PROFILE_LOSSLESS = 0x03, +} GstJpegProfile; + +/** + * GstJpegEntropyCodingMode: + * @GST_JPEG_ENTROPY_CODING_HUFFMAN: Huffman coding + * @GST_JPEG_ENTROPY_CODING_ARITHMETIC: arithmetic coding + * + * JPEG entropy coding mode. + * + * Since: 1.6 + */ +typedef enum { + GST_JPEG_ENTROPY_CODING_HUFFMAN = 0x00, + GST_JPEG_ENTROPY_CODING_ARITHMETIC = 0x08 +} GstJpegEntropyCodingMode; + +/** + * GstJpegQuantTable: + * @quant_precision: Quantization table element precision (Pq) + * @quant_table: Quantization table elements (Qk) + * @valid: If the quantization table is valid, which means it has + * already been parsed + * + * Quantization table. + * + * Since: 1.6 + */ +struct _GstJpegQuantTable +{ + guint8 quant_precision; + guint16 quant_table[GST_JPEG_MAX_QUANT_ELEMENTS]; + gboolean valid; +}; + +/** + * GstJpegQuantTables: + * @quant_tables: All quantization tables + * + * Helper data structure that holds all quantization tables used to + * decode an image. + * + * Since: 1.6 + */ +struct _GstJpegQuantTables +{ + GstJpegQuantTable quant_tables[GST_JPEG_MAX_SCAN_COMPONENTS]; +}; + +/** + * GstJpegHuffmanTable: + * @huf_bits: Number of Huffman codes of length i + 1 (Li) + * @huf_vales: Value associated with each Huffman code (Vij) + * @valid: If the Huffman table is valid, which means it has already + * been parsed + * + * Huffman table. + * + * Since: 1.6 + */ +struct _GstJpegHuffmanTable +{ + guint8 huf_bits[16]; + guint8 huf_values[256]; + gboolean valid; +}; + +/** + * GstJpegHuffmanTables: + * @dc_tables: DC Huffman tables + * @ac_tables: AC Huffman tables + * + * Helper data structure that holds all AC/DC Huffman tables used to + * decode an image. + * + * Since: 1.6 + */ +struct _GstJpegHuffmanTables +{ + GstJpegHuffmanTable dc_tables[GST_JPEG_MAX_SCAN_COMPONENTS]; + GstJpegHuffmanTable ac_tables[GST_JPEG_MAX_SCAN_COMPONENTS]; +}; + +/** + * GstJpegScanComponent: + * @component_selector: Scan component selector (Csj) + * @dc_selector: DC entropy coding table destination selector (Tdj) + * @ac_selector: AC entropy coding table destination selector (Taj) + + * Component-specification parameters. + * + * Since: 1.6 + */ +struct _GstJpegScanComponent +{ + guint8 component_selector; /* 0 .. 255 */ + guint8 dc_selector; /* 0 .. 3 */ + guint8 ac_selector; /* 0 .. 3 */ +}; + +/** + * GstJpegScanHdr: + * @num_components: Number of image components in scan (Ns) + * @components: Image components + * + * Scan header. + * + * Since: 1.6 + */ +struct _GstJpegScanHdr +{ + guint8 num_components; /* 1 .. 4 */ + GstJpegScanComponent components[GST_JPEG_MAX_SCAN_COMPONENTS]; + + /*< private >*/ + guint8 _reserved1; /* Ss */ + guint8 _reserved2; /* Se */ + guint8 _reserved3; /* Al */ + guint8 _reserved4; /* Ah */ +}; + +/** + * GstJpegFrameComponent: + * @identifier: Component identifier (Ci) + * @horizontal_factor: Horizontal sampling factor (Hi) + * @vertical_factor: Vertical sampling factor (Vi) + * @quant_table_selector: Quantization table destination selector (Tqi) + * + * Component-specification parameters. + * + * Since: 1.6 + */ +struct _GstJpegFrameComponent +{ + guint8 identifier; /* 0 .. 255 */ + guint8 horizontal_factor; /* 1 .. 4 */ + guint8 vertical_factor; /* 1 .. 4 */ + guint8 quant_table_selector; /* 0 .. 3 */ +}; + +/** + * GstJpegFrameHdr: + * @sample_precision: Sample precision (P) + * @height: Number of lines (Y) + * @width: Number of samples per line (X) + * @num_components: Number of image components in frame (Nf) + * @components: Image components + * @restart_interval: Number of MCU in the restart interval (Ri) + * + * Frame header. + * + * Since: 1.6 + */ +struct _GstJpegFrameHdr +{ + guint8 sample_precision; /* 2 .. 16 */ + guint16 width; /* 1 .. 65535 */ + guint16 height; /* 0 .. 65535 */ + guint8 num_components; /* 1 .. 255 */ + GstJpegFrameComponent components[GST_JPEG_MAX_FRAME_COMPONENTS]; +}; + +/** + * GstJpegSegment: + * @marker: The type of the segment that starts at @offset + * @data: the data containing the jpeg segment starting at @offset + * @offset: The offset to the segment start in bytes. This is the + * exact start of the segment, no marker code included + * @size: The size of the segment in bytes, or -1 if the end was not + * found. It is the exact size of the segment, without the sync byte and + * marker code but including any length bytes. + * + * A structure that contains the type of a segment, its offset and its size. + * + * Since: 1.6 + */ +struct _GstJpegSegment +{ + GstJpegMarker marker; + const guint8 *data; + guint offset; + gssize size; +}; + +GST_CODEC_PARSERS_API +gboolean gst_jpeg_parse (GstJpegSegment * seg, + const guint8 * data, + gsize size, + guint offset); + +GST_CODEC_PARSERS_API +gboolean gst_jpeg_segment_parse_frame_header (const GstJpegSegment * segment, + GstJpegFrameHdr * frame_hdr); + +GST_CODEC_PARSERS_API +gboolean gst_jpeg_segment_parse_scan_header (const GstJpegSegment * segment, + GstJpegScanHdr * scan_hdr); + +GST_CODEC_PARSERS_API +gboolean gst_jpeg_segment_parse_huffman_table (const GstJpegSegment * segment, + GstJpegHuffmanTables * huff_tables); + +GST_CODEC_PARSERS_API +gboolean gst_jpeg_segment_parse_restart_interval (const GstJpegSegment * segment, + guint * interval); + +GST_CODEC_PARSERS_API +gboolean gst_jpeg_segment_parse_quantization_table (const GstJpegSegment * segment, + GstJpegQuantTables * quant_tables); + +GST_CODEC_PARSERS_API +void gst_jpeg_get_default_quantization_tables (GstJpegQuantTables * quant_tables); + +GST_CODEC_PARSERS_API +void gst_jpeg_get_default_huffman_tables (GstJpegHuffmanTables * huff_tables); + +G_END_DECLS + +#endif /* GST_JPEG_PARSER_H */ |