• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 #define IMPLEMENT_AVCConfigurationBox
19 
20 #include "avcsampleentry.h"
21 #include "atomutils.h"
22 #include "atomdefs.h"
23 
24 #define LENGTH_SIZE_MINUS_ONE_MASK 0x03
25 #define NUM_SEQUENCE_PARAM_SETS_MASK 0x01F
26 
27 typedef Oscl_Vector<AVCConfigurationBox::ParameterSet*, OsclMemAllocator> parameterSetVecType;
28 
AVCConfigurationBox(MP4_FF_FILE * fp,uint32 size,uint32 type)29 AVCConfigurationBox::AVCConfigurationBox(MP4_FF_FILE *fp, uint32 size, uint32 type)
30         : Atom(fp, size, type)
31 {
32     _mp4ErrorCode = READ_AVC_CONFIG_BOX_FAILED;
33 
34     _sequenceParameterSetVec = NULL;
35     _pictureParameterSetVec  = NULL;
36     _totalSeqParameterSetLength = 0;
37     _totalPicutureParameterSetLength = 0;
38 
39     if (_success)
40     {
41         _success = false;
42         _pparent = NULL;
43 
44         PV_MP4_FF_NEW(fp->auditCB, parameterSetVecType, (), _sequenceParameterSetVec);
45         PV_MP4_FF_NEW(fp->auditCB, parameterSetVecType, (), _pictureParameterSetVec);
46 
47         if (!AtomUtils::read8(fp, _configurationVersion))
48         {
49             return;
50         }
51         if (!AtomUtils::read8(fp, _avcProfileIndication))
52         {
53             return;
54         }
55         if (!AtomUtils::read8(fp, _profileCompatibility))
56         {
57             return;
58         }
59 
60         if (!AtomUtils::read8(fp, _avcLevelIndication))
61         {
62             return;
63         }
64 
65         _constraint_set0_flag = (uint8)((_profileCompatibility & ~0x7F) >> 7);
66         _constraint_set1_flag = (uint8)((_profileCompatibility & ~0xBF) >> 6);
67         _constraint_set2_flag = (uint8)((_profileCompatibility & ~0xDF) >> 5);
68         _reserved_zero_5bits = 0;
69 
70         if (!AtomUtils::read8(fp, _lengthSizeMinusOne))
71         {
72             return;
73         }
74         _lengthSizeMinusOne &= LENGTH_SIZE_MINUS_ONE_MASK;
75 
76         if (!AtomUtils::read8(fp, _numSequenceParameterSets))
77         {
78             return;
79         }
80         _numSequenceParameterSets &= NUM_SEQUENCE_PARAM_SETS_MASK;
81 
82         uint8 i;
83         uint16 parameterSetLen;
84 
85         for (i = 0; i < _numSequenceParameterSets; i++)
86         {
87             if (!AtomUtils::read16(fp, parameterSetLen))
88             {
89                 return;
90             }
91 
92             _totalSeqParameterSetLength += parameterSetLen;
93 
94             ParameterSet *paramSet = NULL;
95             PV_MP4_FF_NEW(fp->auditCB, ParameterSet, (parameterSetLen, fp), paramSet);
96 
97             if (!(paramSet->getSuccess()))
98             {
99                 PV_MP4_FF_DELETE(NULL, ParameterSet, paramSet);
100                 return;
101             }
102 
103             (*_sequenceParameterSetVec).push_back(paramSet);
104 
105         }
106 
107         if (!AtomUtils::read8(fp, _numPictureParameterSets))
108         {
109             return;
110         }
111 
112         for (i = 0; i < _numPictureParameterSets; i++)
113         {
114             if (!AtomUtils::read16(fp, parameterSetLen))
115             {
116                 return;
117             }
118 
119             _totalPicutureParameterSetLength += parameterSetLen;
120 
121             ParameterSet *paramSet = NULL;
122             PV_MP4_FF_NEW(fp->auditCB, ParameterSet, (parameterSetLen, fp), paramSet);
123 
124             if (!(paramSet->getSuccess()))
125             {
126                 PV_MP4_FF_DELETE(NULL, ParameterSet, paramSet);
127                 return;
128             }
129 
130             (*_pictureParameterSetVec).push_back(paramSet);
131 
132         }
133         _success = true;
134         _mp4ErrorCode = EVERYTHING_FINE;
135 
136     }
137 }
138 
getPictureParamSet(int32 index,uint16 & length,uint8 * & paramSet)139 OSCL_EXPORT_REF bool AVCConfigurationBox::getPictureParamSet(int32 index, uint16 &length, uint8* &paramSet)
140 {
141     if ((uint32)index < _pictureParameterSetVec->size())
142     {
143         ParameterSet *pSet = (*_pictureParameterSetVec)[index];
144 
145         length = pSet->getParameterSetLength();
146         paramSet = pSet->getParameterSet();
147 
148         return true;
149     }
150     else
151     {
152         length = 0;
153         paramSet = NULL;
154         return false;
155     }
156 }
157 
getSequenceParamSet(int32 index,uint16 & length,uint8 * & paramSet)158 OSCL_EXPORT_REF bool AVCConfigurationBox::getSequenceParamSet(int32 index, uint16 &length, uint8* &paramSet)
159 {
160     if ((uint32)index < _sequenceParameterSetVec->size())
161     {
162         ParameterSet *pSet = (*_sequenceParameterSetVec)[index];
163 
164         length = pSet->getParameterSetLength();
165         paramSet = pSet->getParameterSet();
166 
167         return true;
168     }
169     else
170     {
171         length = 0;
172         paramSet = NULL;
173         return false;
174     }
175 }
176 
ParameterSet(uint16 length,MP4_FF_FILE * fp)177 AVCConfigurationBox::ParameterSet::ParameterSet(uint16 length, MP4_FF_FILE *fp)
178 {
179     _parameterSetLength = 0;
180     _pParameterSet = NULL;
181     _success = false;
182 
183     if ((int16)(length) > 0)
184     {
185         _parameterSetLength = length;
186 
187         PV_MP4_FF_ARRAY_NEW(NULL, uint8, _parameterSetLength, _pParameterSet);
188 
189         if (!AtomUtils::readByteData(fp, _parameterSetLength, _pParameterSet))
190         {
191             return ;
192         }
193         _success = true;
194     }
195 }
196 
197 // Destructor
~AVCConfigurationBox()198 AVCConfigurationBox::~AVCConfigurationBox()
199 {
200     if (_sequenceParameterSetVec != NULL)
201     {
202         for (uint32 i = 0; i < _sequenceParameterSetVec->size(); i++)
203         {
204             PV_MP4_FF_DELETE(NULL, ParameterSet, (*_sequenceParameterSetVec)[i]);
205         }
206         PV_MP4_FF_TEMPLATED_DELETE(NULL, parameterSetVecType, Oscl_Vector, _sequenceParameterSetVec);
207     }
208     if (_pictureParameterSetVec != NULL)
209     {
210         for (uint32 i = 0; i < _pictureParameterSetVec->size(); i++)
211         {
212             PV_MP4_FF_DELETE(NULL, ParameterSet, (*_pictureParameterSetVec)[i]);
213         }
214         PV_MP4_FF_TEMPLATED_DELETE(NULL, parameterSetVecType, Oscl_Vector, _pictureParameterSetVec);
215     }
216 }
217