michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include michael@0: #include "ISOControl.h" michael@0: #include "ISOMediaBoxes.h" michael@0: #include "MP4ESDS.h" michael@0: michael@0: namespace mozilla { michael@0: michael@0: nsresult michael@0: MP4AudioSampleEntry::Generate(uint32_t* aBoxSize) michael@0: { michael@0: uint32_t box_size; michael@0: nsresult rv = es->Generate(&box_size); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: size += box_size; michael@0: michael@0: *aBoxSize = size; michael@0: return NS_OK; michael@0: } michael@0: michael@0: nsresult michael@0: MP4AudioSampleEntry::Write() michael@0: { michael@0: BoxSizeChecker checker(mControl, size); michael@0: nsresult rv; michael@0: rv = AudioSampleEntry::Write(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: rv = es->Write(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: MP4AudioSampleEntry::MP4AudioSampleEntry(ISOControl* aControl) michael@0: : AudioSampleEntry(NS_LITERAL_CSTRING("mp4a"), aControl) michael@0: { michael@0: es = new ESDBox(aControl); michael@0: MOZ_COUNT_CTOR(MP4AudioSampleEntry); michael@0: } michael@0: michael@0: MP4AudioSampleEntry::~MP4AudioSampleEntry() michael@0: { michael@0: MOZ_COUNT_DTOR(MP4AudioSampleEntry); michael@0: } michael@0: michael@0: nsresult michael@0: ESDBox::Generate(uint32_t* aBoxSize) michael@0: { michael@0: uint32_t box_size; michael@0: es_descriptor->Generate(&box_size); michael@0: size += box_size; michael@0: *aBoxSize = size; michael@0: return NS_OK; michael@0: } michael@0: michael@0: nsresult michael@0: ESDBox::Write() michael@0: { michael@0: WRITE_FULLBOX(mControl, size) michael@0: es_descriptor->Write(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: ESDBox::ESDBox(ISOControl* aControl) michael@0: : FullBox(NS_LITERAL_CSTRING("esds"), 0, 0, aControl) michael@0: { michael@0: es_descriptor = new ES_Descriptor(aControl); michael@0: MOZ_COUNT_CTOR(ESDBox); michael@0: } michael@0: michael@0: ESDBox::~ESDBox() michael@0: { michael@0: MOZ_COUNT_DTOR(ESDBox); michael@0: } michael@0: michael@0: nsresult michael@0: ES_Descriptor::Find(const nsACString& aType, michael@0: nsTArray>& aOperations) michael@0: { michael@0: // ES_Descriptor is not a real ISOMediaBox, so we return nothing here. michael@0: return NS_OK; michael@0: } michael@0: michael@0: nsresult michael@0: ES_Descriptor::Write() michael@0: { michael@0: mControl->Write(tag); michael@0: mControl->Write(length); michael@0: mControl->Write(ES_ID); michael@0: mControl->WriteBits(streamDependenceFlag.to_ulong(), streamDependenceFlag.size()); michael@0: mControl->WriteBits(URL_Flag.to_ulong(), URL_Flag.size()); michael@0: mControl->WriteBits(reserved.to_ulong(), reserved.size()); michael@0: mControl->WriteBits(streamPriority.to_ulong(), streamPriority.size()); michael@0: mControl->Write(DecodeSpecificInfo.Elements(), DecodeSpecificInfo.Length()); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: nsresult michael@0: ES_Descriptor::Generate(uint32_t* aBoxSize) michael@0: { michael@0: nsresult rv; michael@0: // 14496-1 '8.3.4 DecoderConfigDescriptor' michael@0: // 14496-1 '10.2.3 SL Packet Header Configuration' michael@0: FragmentBuffer* frag = mControl->GetFragment(Audio_Track); michael@0: rv = frag->GetCSD(DecodeSpecificInfo); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: length = sizeof(ES_ID) + 1; michael@0: length += DecodeSpecificInfo.Length(); michael@0: michael@0: *aBoxSize = sizeof(tag) + sizeof(length) + length; michael@0: return NS_OK; michael@0: } michael@0: michael@0: ES_Descriptor::ES_Descriptor(ISOControl* aControl) michael@0: : tag(ESDescrTag) michael@0: , length(0) michael@0: , ES_ID(0) michael@0: , streamDependenceFlag(0) michael@0: , URL_Flag(0) michael@0: , reserved(0) michael@0: , streamPriority(0) michael@0: , mControl(aControl) michael@0: { michael@0: MOZ_COUNT_CTOR(ES_Descriptor); michael@0: } michael@0: michael@0: ES_Descriptor::~ES_Descriptor() michael@0: { michael@0: MOZ_COUNT_DTOR(ES_Descriptor); michael@0: } michael@0: michael@0: }