// 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 MEDIA_FORMATS_MP4_SAMPLE_TO_GROUP_ITERATOR_H_
#define MEDIA_FORMATS_MP4_SAMPLE_TO_GROUP_ITERATOR_H_

#include <stdint.h>

#include <vector>

#include "base/macros.h"
#include "media/formats/mp4/box_definitions.h"

namespace media {
namespace mp4 {

// Sample To Group Box ('sbgp') can be used to find the group that a sample
// belongs to and the associated description of that sample group. It is
// compactly coded though. This class implements the iterator to iterate
// through the compressed table to get the associated sample group description
// index.
class MEDIA_EXPORT SampleToGroupIterator {
 public:
  explicit SampleToGroupIterator(const SampleToGroup& sample_to_group);

  SampleToGroupIterator(const SampleToGroupIterator&) = delete;
  SampleToGroupIterator& operator=(const SampleToGroupIterator&) = delete;

  ~SampleToGroupIterator();

  // Advances the iterator to refer to the next sample. Return status
  // indicating whether the sample is still valid.
  bool Advance();

  // Returns whether the current sample is valid.
  bool IsValid() const;

  // Returns group description index for current sample.
  uint32_t group_description_index() const {
    return iterator_->group_description_index;
  }

 private:
  // Track how many samples remaining for current table entry.
  uint32_t remaining_samples_;
  const std::vector<SampleToGroupEntry>& sample_to_group_table_;
  std::vector<SampleToGroupEntry>::const_iterator iterator_;
};

}  // namespace mp4
}  // namespace media

#endif  // MEDIA_FORMATS_MP4_SAMPLE_TO_GROUP_ITERATOR_H_
