Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: media/formats/mp4/box_definitions.cc

Issue 260963002: Support parsing of sgpd and sbgp boxes (Closed) Base URL: http://git.chromium.org/chromium/src.git@temp
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/formats/mp4/box_definitions.h" 5 #include "media/formats/mp4/box_definitions.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "media/formats/mp4/es_descriptor.h" 8 #include "media/formats/mp4/es_descriptor.h"
9 #include "media/formats/mp4/rcheck.h" 9 #include "media/formats/mp4/rcheck.h"
10 10
(...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after
753 if (first_sample_flags_present) { 753 if (first_sample_flags_present) {
754 if (sample_flags.size() == 0) { 754 if (sample_flags.size() == 0) {
755 sample_flags.push_back(first_sample_flags); 755 sample_flags.push_back(first_sample_flags);
756 } else { 756 } else {
757 sample_flags[0] = first_sample_flags; 757 sample_flags[0] = first_sample_flags;
758 } 758 }
759 } 759 }
760 return true; 760 return true;
761 } 761 }
762 762
763 SampleToGroup::SampleToGroup() : grouping_type(0), grouping_type_parameter(0) {}
764 SampleToGroup::~SampleToGroup() {}
765 FourCC SampleToGroup::BoxType() const { return FOURCC_SBGP; }
766
767 bool SampleToGroup::Parse(BoxReader* reader) {
768 RCHECK(reader->ReadFullBoxHeader() &&
769 reader->Read4(&grouping_type));
770
771 if (reader->version() == 1)
772 RCHECK(reader->Read4(&grouping_type_parameter));
773
774 if (grouping_type != FOURCC_SEIG) {
775 DLOG(WARNING) << "SampleToGroup box with grouping_type '" << grouping_type
776 << "' is not supported.";
777 return true;
778 }
779
780 uint32 count;
781 RCHECK(reader->Read4(&count));
782 entries.resize(count);
783 for (uint32 i = 0; i < count; ++i) {
784 RCHECK(reader->Read4(&entries[i].sample_count) &&
785 reader->Read4(&entries[i].group_description_index));
786 }
787 return true;
788 }
789
790 CencSampleEncryptionInfoEntry::CencSampleEncryptionInfoEntry()
791 : is_encrypted(false), iv_size(0) {}
792 CencSampleEncryptionInfoEntry::~CencSampleEncryptionInfoEntry() {}
793
794 SampleGroupDescription::SampleGroupDescription() : grouping_type(0) {}
795 SampleGroupDescription::~SampleGroupDescription() {}
796 FourCC SampleGroupDescription::BoxType() const { return FOURCC_SGPD; }
797
798 bool SampleGroupDescription::Parse(BoxReader* reader) {
799 RCHECK(reader->ReadFullBoxHeader() &&
800 reader->Read4(&grouping_type));
801
802 if (grouping_type != FOURCC_SEIG) {
803 DLOG(WARNING) << "SampleGroupDescription box with grouping_type '"
804 << grouping_type << "' is not supported.";
805 return true;
806 }
807
808 const uint8 version = reader->version();
809
810 const size_t kKeyIdSize = 16;
811 const size_t kEntrySize = sizeof(uint32) + kKeyIdSize;
812 uint32 default_length = 0;
813 if (version == 1) {
814 RCHECK(reader->Read4(&default_length));
815 RCHECK(default_length == 0 || default_length == kEntrySize);
816 }
817
818 uint32 count;
819 RCHECK(reader->Read4(&count));
820 entries.resize(count);
821 for (uint32 i = 0; i < count; ++i) {
822 if (version == 1) {
823 if (default_length == 0) {
824 uint32 description_length = 0;
825 RCHECK(reader->Read4(&description_length));
826 RCHECK(description_length == kEntrySize);
827 }
828 }
829
830 uint8 flag;
831 RCHECK(reader->SkipBytes(2) && // reserved.
832 reader->Read1(&flag) &&
833 reader->Read1(&entries[i].iv_size) &&
834 reader->ReadVec(&entries[i].key_id, kKeyIdSize));
835
836 entries[i].is_encrypted = (flag != 0);
837 if (entries[i].is_encrypted) {
838 RCHECK(entries[i].iv_size == 8 || entries[i].iv_size == 16);
839 } else {
840 RCHECK(entries[i].iv_size == 0);
841 }
842 }
843 return true;
844 }
845
763 TrackFragment::TrackFragment() {} 846 TrackFragment::TrackFragment() {}
764 TrackFragment::~TrackFragment() {} 847 TrackFragment::~TrackFragment() {}
765 FourCC TrackFragment::BoxType() const { return FOURCC_TRAF; } 848 FourCC TrackFragment::BoxType() const { return FOURCC_TRAF; }
766 849
767 bool TrackFragment::Parse(BoxReader* reader) { 850 bool TrackFragment::Parse(BoxReader* reader) {
768 return reader->ScanChildren() && 851 RCHECK(reader->ScanChildren() &&
769 reader->ReadChild(&header) && 852 reader->ReadChild(&header) &&
770 // Media Source specific: 'tfdt' required 853 // Media Source specific: 'tfdt' required
771 reader->ReadChild(&decode_time) && 854 reader->ReadChild(&decode_time) &&
772 reader->MaybeReadChildren(&runs) && 855 reader->MaybeReadChildren(&runs) &&
773 reader->MaybeReadChild(&auxiliary_offset) && 856 reader->MaybeReadChild(&auxiliary_offset) &&
774 reader->MaybeReadChild(&auxiliary_size) && 857 reader->MaybeReadChild(&auxiliary_size) &&
775 reader->MaybeReadChild(&sdtp); 858 reader->MaybeReadChild(&sdtp));
859
860 // Continue reading until SEIG is found, or until run out of child boxes.
861 while (sample_group_description.grouping_type != FOURCC_SEIG &&
862 reader->HasChild(&sample_group_description)) {
863 RCHECK(reader->ReadChild(&sample_group_description));
864 }
865 while (sample_to_group.grouping_type != FOURCC_SEIG &&
866 reader->HasChild(&sample_to_group)) {
867 RCHECK(reader->ReadChild(&sample_to_group));
868 }
xhwang 2014/05/01 19:11:28 Why can't we use MaybeReadChild? Is it because the
kqyang 2014/05/01 20:26:35 Yes, MaybeReadChild does not tell us whether it re
869 return true;
776 } 870 }
777 871
778 MovieFragment::MovieFragment() {} 872 MovieFragment::MovieFragment() {}
779 MovieFragment::~MovieFragment() {} 873 MovieFragment::~MovieFragment() {}
780 FourCC MovieFragment::BoxType() const { return FOURCC_MOOF; } 874 FourCC MovieFragment::BoxType() const { return FOURCC_MOOF; }
781 875
782 bool MovieFragment::Parse(BoxReader* reader) { 876 bool MovieFragment::Parse(BoxReader* reader) {
783 RCHECK(reader->ScanChildren() && 877 RCHECK(reader->ScanChildren() &&
784 reader->ReadChild(&header) && 878 reader->ReadChild(&header) &&
785 reader->ReadChildren(&tracks) && 879 reader->ReadChildren(&tracks) &&
(...skipping 28 matching lines...) Expand all
814 SampleDependsOn IndependentAndDisposableSamples::sample_depends_on( 908 SampleDependsOn IndependentAndDisposableSamples::sample_depends_on(
815 size_t i) const { 909 size_t i) const {
816 if (i >= sample_depends_on_.size()) 910 if (i >= sample_depends_on_.size())
817 return kSampleDependsOnUnknown; 911 return kSampleDependsOnUnknown;
818 912
819 return sample_depends_on_[i]; 913 return sample_depends_on_[i];
820 } 914 }
821 915
822 } // namespace mp4 916 } // namespace mp4
823 } // namespace media 917 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698