1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
4  * You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #include <climits>
7 #include "ISOControl.h"
8 #include "ISOMediaBoxes.h"
9 #include "MP4ESDS.h"
10 
11 namespace mozilla {
12 
13 nsresult
Generate(uint32_t * aBoxSize)14 MP4AudioSampleEntry::Generate(uint32_t* aBoxSize)
15 {
16   uint32_t box_size;
17   nsresult rv = es->Generate(&box_size);
18   NS_ENSURE_SUCCESS(rv, rv);
19   size += box_size;
20 
21   *aBoxSize = size;
22   return NS_OK;
23 }
24 
25 nsresult
Write()26 MP4AudioSampleEntry::Write()
27 {
28   BoxSizeChecker checker(mControl, size);
29   nsresult rv;
30   rv = AudioSampleEntry::Write();
31   NS_ENSURE_SUCCESS(rv, rv);
32   rv = es->Write();
33   NS_ENSURE_SUCCESS(rv, rv);
34 
35   return NS_OK;
36 }
37 
MP4AudioSampleEntry(ISOControl * aControl)38 MP4AudioSampleEntry::MP4AudioSampleEntry(ISOControl* aControl)
39   : AudioSampleEntry(NS_LITERAL_CSTRING("mp4a"), aControl)
40 {
41   es = new ESDBox(aControl);
42   MOZ_COUNT_CTOR(MP4AudioSampleEntry);
43 }
44 
~MP4AudioSampleEntry()45 MP4AudioSampleEntry::~MP4AudioSampleEntry()
46 {
47   MOZ_COUNT_DTOR(MP4AudioSampleEntry);
48 }
49 
50 nsresult
Generate(uint32_t * aBoxSize)51 ESDBox::Generate(uint32_t* aBoxSize)
52 {
53   uint32_t box_size;
54   es_descriptor->Generate(&box_size);
55   size += box_size;
56   *aBoxSize = size;
57   return NS_OK;
58 }
59 
60 nsresult
Write()61 ESDBox::Write()
62 {
63   WRITE_FULLBOX(mControl, size)
64   es_descriptor->Write();
65   return NS_OK;
66 }
67 
ESDBox(ISOControl * aControl)68 ESDBox::ESDBox(ISOControl* aControl)
69   : FullBox(NS_LITERAL_CSTRING("esds"), 0, 0, aControl)
70 {
71   es_descriptor = new ES_Descriptor(aControl);
72   MOZ_COUNT_CTOR(ESDBox);
73 }
74 
~ESDBox()75 ESDBox::~ESDBox()
76 {
77   MOZ_COUNT_DTOR(ESDBox);
78 }
79 
80 nsresult
Find(const nsACString & aType,nsTArray<RefPtr<MuxerOperation>> & aOperations)81 ES_Descriptor::Find(const nsACString& aType,
82                     nsTArray<RefPtr<MuxerOperation>>& aOperations)
83 {
84   // ES_Descriptor is not a real ISOMediaBox, so we return nothing here.
85   return NS_OK;
86 }
87 
88 nsresult
Write()89 ES_Descriptor::Write()
90 {
91   mControl->Write(tag);
92   mControl->Write(length);
93   mControl->Write(ES_ID);
94   mControl->WriteBits(streamDependenceFlag.to_ulong(), streamDependenceFlag.size());
95   mControl->WriteBits(URL_Flag.to_ulong(), URL_Flag.size());
96   mControl->WriteBits(reserved.to_ulong(), reserved.size());
97   mControl->WriteBits(streamPriority.to_ulong(), streamPriority.size());
98   mControl->Write(DecodeSpecificInfo.Elements(), DecodeSpecificInfo.Length());
99 
100   return NS_OK;
101 }
102 
103 nsresult
Generate(uint32_t * aBoxSize)104 ES_Descriptor::Generate(uint32_t* aBoxSize)
105 {
106   nsresult rv;
107   //   14496-1 '8.3.4 DecoderConfigDescriptor'
108   //   14496-1 '10.2.3 SL Packet Header Configuration'
109   FragmentBuffer* frag = mControl->GetFragment(Audio_Track);
110   rv = frag->GetCSD(DecodeSpecificInfo);
111   NS_ENSURE_SUCCESS(rv, rv);
112 
113   length = sizeof(ES_ID) + 1;
114   length += DecodeSpecificInfo.Length();
115 
116   *aBoxSize = sizeof(tag) + sizeof(length) + length;
117   return NS_OK;
118 }
119 
ES_Descriptor(ISOControl * aControl)120 ES_Descriptor::ES_Descriptor(ISOControl* aControl)
121   : tag(ESDescrTag)
122   , length(0)
123   , ES_ID(0)
124   , streamDependenceFlag(0)
125   , URL_Flag(0)
126   , reserved(0)
127   , streamPriority(0)
128   , mControl(aControl)
129 {
130   MOZ_COUNT_CTOR(ES_Descriptor);
131 }
132 
~ES_Descriptor()133 ES_Descriptor::~ES_Descriptor()
134 {
135   MOZ_COUNT_DTOR(ES_Descriptor);
136 }
137 
138 }
139