| Index: media/mp4/box_reader.h
|
| diff --git a/media/mp4/box_reader.h b/media/mp4/box_reader.h
|
| index 211d99ac6109cb2cb58bf904570343834f53a518..967bf93071695f8621b735c663fcbaa0c361af7c 100644
|
| --- a/media/mp4/box_reader.h
|
| +++ b/media/mp4/box_reader.h
|
| @@ -118,6 +118,7 @@ class MEDIA_EXPORT BoxReader : public BufferReader {
|
|
|
| // Read all children, regardless of FourCC. This is used from exactly one box,
|
| // corresponding to a rather significant inconsistency in the BMFF spec.
|
| + // Note that this method is mutually exclusive with ScanChildren().
|
| template<typename T> bool ReadAllChildren(
|
| std::vector<T>* children) WARN_UNUSED_RESULT;
|
|
|
| @@ -185,19 +186,20 @@ bool BoxReader::MaybeReadChildren(std::vector<T>* children) {
|
|
|
| template<typename T>
|
| bool BoxReader::ReadAllChildren(std::vector<T>* children) {
|
| - DCHECK(scanned_);
|
| - DCHECK(children->empty());
|
| - RCHECK(!children_.empty());
|
| -
|
| - children->resize(children_.size());
|
| - typename std::vector<T>::iterator child_itr = children->begin();
|
| - for (ChildMap::iterator itr = children_.begin();
|
| - itr != children_.end(); ++itr) {
|
| - RCHECK(child_itr->Parse(&itr->second));
|
| - ++child_itr;
|
| + DCHECK(!scanned_);
|
| + scanned_ = true;
|
| +
|
| + bool err = false;
|
| + while (pos() < size()) {
|
| + BoxReader child_reader(&buf_[pos_], size_ - pos_);
|
| + if (!child_reader.ReadHeader(&err)) break;
|
| + T child;
|
| + RCHECK(child.Parse(&child_reader));
|
| + children->push_back(child);
|
| + pos_ += child_reader.size();
|
| }
|
| - children_.clear();
|
| - return true;
|
| +
|
| + return !err;
|
| }
|
|
|
| } // namespace mp4
|
|
|