// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COBALT_MEDIA_BASE_AUDIO_VIDEO_METADATA_EXTRACTOR_H_
#define COBALT_MEDIA_BASE_AUDIO_VIDEO_METADATA_EXTRACTOR_H_

#include <map>
#include <string>
#include <vector>

#include "base/basictypes.h"
#include "cobalt/media/base/media_export.h"

struct AVDictionary;

namespace cobalt {
namespace media {

class DataSource;

// This class extracts a string dictionary of metadata tags for audio and video
// files. It also provides the format name.
class MEDIA_EXPORT AudioVideoMetadataExtractor {
 public:
  typedef std::map<std::string, std::string> TagDictionary;

  struct StreamInfo {
    StreamInfo();
    StreamInfo(const StreamInfo& other);
    ~StreamInfo();
    std::string type;
    TagDictionary tags;
  };

  typedef std::vector<StreamInfo> StreamInfoVector;

  AudioVideoMetadataExtractor();
  ~AudioVideoMetadataExtractor();

  // Returns whether or not the fields were successfully extracted. Should only
  // be called once.
  bool Extract(DataSource* source, bool extract_attached_pics);

  // Returns -1 if we cannot extract the duration. In seconds.
  double duration() const;

  // Returns -1 for containers without video.
  int width() const;
  int height() const;

  // Returns -1 if undefined.
  int rotation() const;

  // Returns -1 or an empty string if the value is undefined.
  const std::string& album() const;
  const std::string& artist() const;
  const std::string& comment() const;
  const std::string& copyright() const;
  const std::string& date() const;
  int disc() const;
  const std::string& encoder() const;
  const std::string& encoded_by() const;
  const std::string& genre() const;
  const std::string& language() const;
  const std::string& title() const;
  int track() const;

  // First element is the container. Subsequent elements are the child streams.
  const StreamInfoVector& stream_infos() const;

  // Empty if Extract call did not request attached images, or if no attached
  // images were found.
  const std::vector<std::string>& attached_images_bytes() const;

 private:
  void ExtractDictionary(AVDictionary* metadata, TagDictionary* raw_tags);

  bool extracted_;

  int duration_;
  int width_;
  int height_;

  std::string album_;
  std::string artist_;
  std::string comment_;
  std::string copyright_;
  std::string date_;
  int disc_;
  std::string encoder_;
  std::string encoded_by_;
  std::string genre_;
  std::string language_;
  int rotation_;
  std::string title_;
  int track_;

  StreamInfoVector stream_infos_;

  std::vector<std::string> attached_images_bytes_;

  DISALLOW_COPY_AND_ASSIGN(AudioVideoMetadataExtractor);
};

}  // namespace media
}  // namespace cobalt

#endif  // COBALT_MEDIA_BASE_AUDIO_VIDEO_METADATA_EXTRACTOR_H_
