Flutter Engine
The Flutter Engine
SkJpegMultiPicture.h
Go to the documentation of this file.
1/*
2 * Copyright 2023 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkJpegMultiPicture_codec_DEFINED
9#define SkJpegMultiPicture_codec_DEFINED
10
12
13#include <cstdint>
14#include <memory>
15#include <vector>
16
17class SkData;
18
19/*
20 * Parsed Jpeg Multi-Picture Format structure as specified in CIPA DC-x007-2009. An introduction to
21 * the format can be found in Figure 1 (Basic MP File format data structure) and Figure 6 (Internal
22 * Structure of the MP Index IFD) in that document. This parsing will extract only the size and
23 * offset parameters from the images in the Index Image File Directory.
24 */
26 explicit SkJpegMultiPictureParameters(size_t numberOfImages) : images(numberOfImages) {}
27
28 // An individual image.
29 struct Image {
30 // The size of the image in bytes.
31 uint32_t size = 0;
32 // The offset of the image in bytes. This offset is specified relative to the address of
33 // the MP Endian field in the MP Header, unless the image is a First Individual Image, in
34 // which case the value of the offest [sic] shall be NULL (from section 5.2.3.3).
35 uint32_t dataOffset = 0;
36 };
37
38 // The images listed in the Index Image File Directory.
39 std::vector<Image> images;
40
41 /*
42 * Parse Jpeg Multi-Picture Format parameters. The specified data should be APP2 segment
43 * parameters, which, if they are MPF parameter, should start with the {'M', 'P', 'F', 0}
44 * signature. Returns nullptr the parameters do not start with the MPF signature, or if there
45 * is an error in parsing the parameters.
46 */
47 static std::unique_ptr<SkJpegMultiPictureParameters> Make(
48 const sk_sp<const SkData>& segmentParameters);
49
50 /*
51 * Serialize Jpeg Multi-Picture Format segment parameters for the indicated individual image.
52 * This segment will start with the {'M', 'P', 'F', 0} signature (it will not include the
53 * segment marker or parameter length).
54 */
55 sk_sp<SkData> serialize(uint32_t individualImageNumber) const;
56
57 /*
58 * Compute the absolute offset (from the start of the image) for the offset in the multi-picture
59 * parameters, given the absolute offset of the MPF segment (the offset of the {0xFF, 0xE2}
60 * marker from the start of the image.
61 */
62 static size_t GetImageAbsoluteOffset(uint32_t dataOffset, size_t mpSegmentOffset);
63
64 /*
65 * Compute the data offset (as stored in the multi-picture params) for an image given its
66 * absolute offset (from the start of the first individual image), and the absolute offset
67 * of the MPF segment in the first individual image. This will return 0 for an image at
68 * absolute offset 0.
69 */
70 static uint32_t GetImageDataOffset(size_t imageAbsoluteOffset, size_t mpSegmentOffset);
71};
72
73#endif
Definition: SkData.h:25
static uint32_t GetImageDataOffset(size_t imageAbsoluteOffset, size_t mpSegmentOffset)
SkJpegMultiPictureParameters(size_t numberOfImages)
sk_sp< SkData > serialize(uint32_t individualImageNumber) const
static size_t GetImageAbsoluteOffset(uint32_t dataOffset, size_t mpSegmentOffset)
static std::unique_ptr< SkJpegMultiPictureParameters > Make(const sk_sp< const SkData > &segmentParameters)