1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// found in the LICENSE file.
4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#ifndef CHROME_UTILITY_MEDIA_GALLERIES_IMAGE_METADATA_EXTRACTOR_H_
6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define CHROME_UTILITY_MEDIA_GALLERIES_IMAGE_METADATA_EXTRACTOR_H_
7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <string>
9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/basictypes.h"
11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/callback_forward.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/ref_counted.h"
13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace media {
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass DataSource;
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace net {
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass DrainableIOBuffer;
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace metadata {
23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Extracts a basic set of image metadata tags. Users must initialize the
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// library before use. Each class instance is 'one-time-use', and cannot be used
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// to extract metadata from multiple images.
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass ImageMetadataExtractor {
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public:
29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  typedef base::Callback<void(bool)> DoneCallback;
30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // One of these two is required before use of this class.
32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  static bool InitializeLibrary();
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  static bool InitializeLibraryForTesting();
34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ImageMetadataExtractor();
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ~ImageMetadataExtractor();
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // |callback| called with whether or not the extraction succeeded. Should
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // only be called once.
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void Extract(media::DataSource* source, const DoneCallback& callback);
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // All below methods require Extract to have already succeeded.
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Returns -1 if file does not define a width or height.
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int width() const;
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int height() const;
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // In degrees.
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int rotation() const;
49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // In pixels per inch.
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  double x_resolution() const;
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  double y_resolution() const;
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // In the same string form as the original file.
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const std::string& date() const;
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const std::string& camera_make() const;
58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const std::string& camera_model() const;
59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  double exposure_time_sec() const;
60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool flash_fired() const;
61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  double f_number() const;
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  double focal_length_mm() const;
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int iso_equivalent() const;
64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private:
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Second half of the Extract method.
67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void FinishExtraction(const DoneCallback& callback,
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        const scoped_refptr<net::DrainableIOBuffer>& buffer);
69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool extracted_;
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int width_;
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int height_;
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int rotation_;
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  double x_resolution_;
78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  double y_resolution_;
79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string date_;
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string camera_make_;
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string camera_model_;
84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  double exposure_time_sec_;
85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool flash_fired_;
86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  double f_number_;
87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  double focal_length_mm_;
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int iso_equivalent_;
89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ImageMetadataExtractor);
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch};
92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}  // namespace metadata
94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif  // CHROME_UTILITY_MEDIA_GALLERIES_IMAGE_METADATA_EXTRACTOR_H_
96