1*a62be085SSadaf Ebrahimi #ifndef DYNAMIC_DEPTH_INCLUDES_XMPMETA_JPEG_IO_H_ // NOLINT 2*a62be085SSadaf Ebrahimi #define DYNAMIC_DEPTH_INCLUDES_XMPMETA_JPEG_IO_H_ // NOLINT 3*a62be085SSadaf Ebrahimi 4*a62be085SSadaf Ebrahimi #include <string> 5*a62be085SSadaf Ebrahimi #include <vector> 6*a62be085SSadaf Ebrahimi 7*a62be085SSadaf Ebrahimi #include "base/port.h" 8*a62be085SSadaf Ebrahimi 9*a62be085SSadaf Ebrahimi namespace dynamic_depth { 10*a62be085SSadaf Ebrahimi namespace xmpmeta { 11*a62be085SSadaf Ebrahimi 12*a62be085SSadaf Ebrahimi // Contains the data for a section in a JPEG file. 13*a62be085SSadaf Ebrahimi // A JPEG file contains many sections in addition to image data. 14*a62be085SSadaf Ebrahimi struct Section { 15*a62be085SSadaf Ebrahimi // Constructors. 16*a62be085SSadaf Ebrahimi Section() = default; 17*a62be085SSadaf Ebrahimi explicit Section(const string& buffer); 18*a62be085SSadaf Ebrahimi 19*a62be085SSadaf Ebrahimi // Returns true if the section's marker matches an APP1 marker. 20*a62be085SSadaf Ebrahimi bool IsMarkerApp1(); 21*a62be085SSadaf Ebrahimi 22*a62be085SSadaf Ebrahimi int marker; 23*a62be085SSadaf Ebrahimi bool is_image_section; 24*a62be085SSadaf Ebrahimi string data; 25*a62be085SSadaf Ebrahimi }; 26*a62be085SSadaf Ebrahimi 27*a62be085SSadaf Ebrahimi struct ParseOptions { 28*a62be085SSadaf Ebrahimi // If set to true, keeps only the EXIF and XMP sections (with 29*a62be085SSadaf Ebrahimi // marker kApp1) and ignores others. Otherwise, keeps everything including 30*a62be085SSadaf Ebrahimi // image data. 31*a62be085SSadaf Ebrahimi bool read_meta_only = false; 32*a62be085SSadaf Ebrahimi 33*a62be085SSadaf Ebrahimi // If section_header is set, this boolean controls whether only the 1st 34*a62be085SSadaf Ebrahimi // section matching the section_header will be returned. If not set 35*a62be085SSadaf Ebrahimi // (the default), all the sections that math the section header will be 36*a62be085SSadaf Ebrahimi // returned. 37*a62be085SSadaf Ebrahimi bool section_header_return_first = false; 38*a62be085SSadaf Ebrahimi 39*a62be085SSadaf Ebrahimi // A filter that keeps all the sections whose data starts with the 40*a62be085SSadaf Ebrahimi // given string. Ignored if empty. 41*a62be085SSadaf Ebrahimi string section_header; 42*a62be085SSadaf Ebrahimi }; 43*a62be085SSadaf Ebrahimi 44*a62be085SSadaf Ebrahimi // Parses the JPEG image file. 45*a62be085SSadaf Ebrahimi std::vector<Section> Parse(const ParseOptions& options, 46*a62be085SSadaf Ebrahimi std::istream* input_stream); 47*a62be085SSadaf Ebrahimi 48*a62be085SSadaf Ebrahimi // Writes JPEG data sections to a file. 49*a62be085SSadaf Ebrahimi void WriteSections(const std::vector<Section>& sections, 50*a62be085SSadaf Ebrahimi std::ostream* output_stream); 51*a62be085SSadaf Ebrahimi 52*a62be085SSadaf Ebrahimi } // namespace xmpmeta 53*a62be085SSadaf Ebrahimi } // namespace dynamic_depth 54*a62be085SSadaf Ebrahimi 55*a62be085SSadaf Ebrahimi #endif // DYNAMIC_DEPTH_INCLUDES_XMPMETA_JPEG_IO_H_ // NOLINT 56