• 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 #ifndef PVMF_MP4FFPARSER_NODE_H_INCLUDED
19 #define PVMF_MP4FFPARSER_NODE_H_INCLUDED
20 
21 
22 #ifndef OSCL_BASE_H_INCLUDED
23 #include "oscl_base.h"
24 #endif
25 
26 #ifndef PVMF_MEDIA_CLOCK_H_INCLUDED
27 #include "pvmf_media_clock.h"
28 #endif
29 
30 #ifndef OSCL_TIMER_H_INCLUDED
31 #include "oscl_timer.h"
32 #endif
33 
34 #ifndef OSCL_SCHEDULER_AO_H_INCLUDED
35 #include "oscl_scheduler_ao.h"
36 #endif
37 
38 #ifndef OSCL_FILE_IO_H_INCLUDED
39 #include "oscl_file_io.h"
40 #endif
41 
42 #ifndef OSCL_STRING_H_INCLUDED
43 #include "oscl_string.h"
44 #endif
45 
46 #ifndef PVLOGGER_H_INCLUDED
47 #include "pvlogger.h"
48 #endif
49 
50 #ifndef PVLOGGER_FILE_APPENDER_H_INCLUDED
51 #include "pvlogger_file_appender.h"
52 #endif
53 
54 #ifndef OSCL_BIN_STREAM_H_INCLUDED
55 #include "oscl_bin_stream.h"
56 #endif
57 
58 #ifndef PVMF_FORMAT_TYPE_H_INCLUDED
59 #include "pvmf_format_type.h"
60 #endif
61 
62 #ifndef PVMF_NODE_INTERFACE_H_INCLUDED
63 #include "pvmf_node_interface.h"
64 #endif
65 
66 #ifndef PVMF_NODE_UTILS_H_INCLUDED
67 #include "pvmf_node_utils.h"
68 #endif
69 
70 #ifndef OSCL_PRIQUEUE_H_INCLUDED
71 #include "oscl_priqueue.h"
72 #endif
73 
74 #ifndef PVMF_MEDIA_DATA_H_INCLUDED
75 #include "pvmf_media_data.h"
76 #endif
77 
78 #ifndef OSCL_MEM_MEMPOOL_H_INCLUDED
79 #include "oscl_mem_mempool.h"
80 #endif
81 
82 #ifndef PVMF_SIMPLE_MEDIA_BUFFER_H_INCLUDED
83 #include "pvmf_simple_media_buffer.h"
84 #endif
85 
86 #ifndef PVMF_MEDIA_FRAG_GROUP_H_INCLUDED
87 #include "pvmf_media_frag_group.h"
88 #endif
89 
90 #ifndef PVMF_MP4FFPARSER_DEFS_H_INCLUDED
91 #include "pvmf_mp4ffparser_defs.h"
92 #endif
93 
94 #ifndef PVMF_DATA_SOURCE_PLAYBACK_CONTROL_H_INCLUDED
95 #include "pvmf_data_source_playback_control.h"
96 #endif
97 
98 #ifndef PVMF_META_DATA_EXTENSION_H_INCLUDED
99 #include "pvmf_meta_data_extension.h"
100 #endif
101 
102 #ifndef PVMF_DATA_SOURCE_INIT_EXTENSION_H_INCLUDED
103 #include "pvmf_data_source_init_extension.h"
104 #endif
105 
106 #ifndef PVMF_TRACK_SELECTION_EXTENSION_H_INCLUDED
107 #include "pvmf_track_selection_extension.h"
108 #endif
109 
110 #ifndef PVMF_MEDIA_PRESENTATION_INFO_H_INCLUDED
111 #include "pvmf_media_presentation_info.h"
112 #endif
113 
114 #ifndef PVMF_TRACK_LEVEL_INFO_EXTENSION_H_INCLUDED
115 #include "pvmf_track_level_info_extension.h"
116 #endif
117 
118 #ifndef PVMF_MP4_PROGDOWNLOAD_SUPPORT_EXTENSION_H_INCLUDED
119 #include "pvmf_mp4_progdownload_support_extension.h"
120 #endif
121 
122 #ifndef CPM_H_INCLUDED
123 #include "cpm.h"
124 #endif
125 
126 #ifndef PVMF_CPMPLUGIN_ACCESS_INTERFACE_H_INCLUDED
127 #include "pvmf_cpmplugin_access_interface.h"
128 #endif
129 
130 #ifndef PVMF_LOCAL_DATA_SOURCE_H_INCLUDED
131 #include "pvmf_local_data_source.h"
132 #endif
133 
134 #ifndef PVMF_MEMPOOL_H_INCLUDED
135 #include "pvmf_mempool.h"
136 #endif
137 
138 #ifndef PVMF_TIMEDTEXT_H_INCLUDED
139 #include "pvmf_timedtext.h"
140 #endif
141 
142 #ifndef PV_GAU_H_
143 #include "pv_gau.h"
144 #endif
145 
146 #ifndef PVMF_FORMAT_PROGDOWNLOAD_SUPPORT_EXTENSION_H_INCLUDED
147 #include "pvmf_format_progdownload_support_extension.h"
148 #endif
149 
150 #ifndef PVMF_DOWNLOAD_PROGRESS_EXTENSION_H
151 #include "pvmf_download_progress_interface.h"
152 #endif
153 
154 #ifndef PVMI_DATASTREAMUSER_INTERFACE_H_INCLUDED
155 #include "pvmi_datastreamuser_interface.h"
156 #endif
157 
158 #ifndef PVMF_MP4FFPARSER_OUTPORT_H_INCLUDED
159 #include "pvmf_mp4ffparser_outport.h"
160 #endif
161 
162 #ifndef PVMF_SOURCE_CONTEXT_DATA_H_INCLUDED
163 #include "pvmf_source_context_data.h"
164 #endif
165 
166 #ifndef PVMF_CPMPLUGIN_LICENSE_INTERFACE_H_INCLUDED
167 #include "pvmf_cpmplugin_license_interface.h"
168 #endif
169 
170 #ifndef PVMI_KVP_UTIL_H_INCLUDED
171 #include "pvmi_kvp_util.h"
172 #endif
173 
174 #ifndef PVMF_BASIC_ERRORINFOMESSAGE_H_INCLUDED
175 #include "pvmf_basic_errorinfomessage.h"
176 #endif
177 
178 #ifndef PVMF_DATA_SOURCE_DIRECTION_CONTROL_H_INCLUDED
179 #include "pvmf_data_source_direction_control.h"
180 #endif
181 
182 /**
183 * Node command handling
184 */
185 
186 class PVMFMP4ParserNodeLoggerDestructDealloc : public OsclDestructDealloc
187 {
188     public:
destruct_and_dealloc(OsclAny * ptr)189         void destruct_and_dealloc(OsclAny* ptr)
190         {
191             PVLoggerAppender* p = OSCL_REINTERPRET_CAST(PVLoggerAppender*, ptr);
192             BinaryFileAppender* binPtr = OSCL_REINTERPRET_CAST(BinaryFileAppender*, p);
193             if (!binPtr)
194                 return;
195             OSCL_DELETE(binPtr);
196         }
197 };
198 
199 #define PVMF_MP4FFPARSERNODE_UNDERFLOW_STATUS_TIMER_ID 1
200 
201 #define PVMF_MP4FFPARSERNODE_MAX_CPM_METADATA_KEYS 256
202 
203 #define NORMAL_PLAYRATE 100000
204 
205 typedef PVMFGenericNodeCommand<OsclMemAllocator> PVMFMP4FFParserNodeCommandBase;
206 
207 enum PVMFMP4FFParserNodeCommandType
208 {
209     PVMP4FF_NODE_CMD_SETDATASOURCEPOSITION = PVMF_GENERIC_NODE_COMMAND_LAST
210     , PVMP4FF_NODE_CMD_QUERYDATASOURCEPOSITION
211     , PVMP4FF_NODE_CMD_SETDATASOURCERATE
212     , PVMP4FF_NODE_CMD_GETNODEMETADATAKEYS
213     , PVMP4FF_NODE_CMD_GETNODEMETADATAVALUES
214     , PVMP4FF_NODE_CMD_GET_LICENSE_W
215     , PVMP4FF_NODE_CMD_GET_LICENSE
216     , PVMP4FF_NODE_CMD_CANCEL_GET_LICENSE
217     , PVMF_MP4_PARSER_NODE_CAPCONFIG_SETPARAMS
218     , PVMP4FF_NODE_CMD_SETDATASOURCEDIRECTION
219 };
220 
221 class PVMFMP4FFParserNodeCommand : public PVMFMP4FFParserNodeCommandBase
222 {
223     public:
224 
225         // Constructor and parser for GetNodeMetadataKeys
Construct(PVMFSessionId s,int32 cmd,PVMFMetadataList & aKeyList,uint32 aStartingIndex,int32 aMaxEntries,char * aQueryKey,const OsclAny * aContext)226         void Construct(PVMFSessionId s, int32 cmd
227                        , PVMFMetadataList& aKeyList
228                        , uint32 aStartingIndex
229                        , int32 aMaxEntries
230                        , char* aQueryKey
231                        , const OsclAny* aContext)
232         {
233             PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
234             iParam1 = (OsclAny*) & aKeyList;
235             iParam2 = (OsclAny*)aStartingIndex;
236             iParam3 = (OsclAny*)aMaxEntries;
237             if (aQueryKey)
238             {
239                 //allocate a copy of the query key string.
240                 Oscl_TAlloc<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator> str;
241                 iParam4 = str.ALLOC_AND_CONSTRUCT(aQueryKey);
242             }
243         }
Parse(PVMFMetadataList * & MetaDataListPtr,uint32 & aStartingIndex,int32 & aMaxEntries,char * & aQueryKey)244         void Parse(PVMFMetadataList*& MetaDataListPtr, uint32 &aStartingIndex, int32 &aMaxEntries, char*& aQueryKey)
245         {
246             MetaDataListPtr = (PVMFMetadataList*)iParam1;
247             aStartingIndex = (uint32)iParam2;
248             aMaxEntries = (int32)iParam3;
249             aQueryKey = NULL;
250             if (iParam4)
251             {
252                 OSCL_HeapString<OsclMemAllocator>* keystring = (OSCL_HeapString<OsclMemAllocator>*)iParam4;
253                 aQueryKey = keystring->get_str();
254             }
255         }
256 
257         // Constructor and parser for GetNodeMetadataValue
Construct(PVMFSessionId s,int32 cmd,PVMFMetadataList & aKeyList,Oscl_Vector<PvmiKvp,OsclMemAllocator> & aValueList,uint32 aStartIndex,int32 aMaxEntries,const OsclAny * aContext)258         void Construct(PVMFSessionId s, int32 cmd, PVMFMetadataList& aKeyList, Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList, uint32 aStartIndex, int32 aMaxEntries, const OsclAny* aContext)
259         {
260             PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
261             iParam1 = (OsclAny*) & aKeyList;
262             iParam2 = (OsclAny*) & aValueList;
263             iParam3 = (OsclAny*)aStartIndex;
264             iParam4 = (OsclAny*)aMaxEntries;
265 
266         }
Parse(PVMFMetadataList * & aKeyList,Oscl_Vector<PvmiKvp,OsclMemAllocator> * & aValueList,uint32 & aStartingIndex,int32 & aMaxEntries)267         void Parse(PVMFMetadataList* &aKeyList, Oscl_Vector<PvmiKvp, OsclMemAllocator>* &aValueList, uint32 &aStartingIndex, int32 &aMaxEntries)
268         {
269             aKeyList = (PVMFMetadataList*)iParam1;
270             aValueList = (Oscl_Vector<PvmiKvp, OsclMemAllocator>*)iParam2;
271             aStartingIndex = (uint32)iParam3;
272             aMaxEntries = (int32)iParam4;
273         }
274 
275         /* Constructor and parser for setParametersAsync */
Construct(PVMFSessionId s,int32 cmd,PvmiMIOSession aSession,PvmiKvp * aParameters,int num_elements,PvmiKvp * & aRet_kvp,OsclAny * aContext)276         void Construct(PVMFSessionId s, int32 cmd, PvmiMIOSession aSession,
277                        PvmiKvp* aParameters, int num_elements,
278                        PvmiKvp*& aRet_kvp, OsclAny* aContext)
279         {
280             PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
281             iParam1 = (OsclAny*)aSession;
282             iParam2 = (OsclAny*)aParameters;
283             iParam3 = (OsclAny*)num_elements;
284             iParam4 = (OsclAny*) & aRet_kvp;
285         }
Parse(PvmiMIOSession & aSession,PvmiKvp * & aParameters,int & num_elements,PvmiKvp ** & ppRet_kvp)286         void Parse(PvmiMIOSession& aSession, PvmiKvp*& aParameters,
287                    int &num_elements, PvmiKvp** &ppRet_kvp)
288         {
289             aSession = (PvmiMIOSession)iParam1;
290             aParameters = (PvmiKvp*)iParam2;
291             num_elements = (int)iParam3;
292             ppRet_kvp = (PvmiKvp**)iParam4;
293         }
294 
295         // Constructor and parser for SetDataSourcePosition
Construct(PVMFSessionId s,int32 cmd,PVMFTimestamp aTargetNPT,PVMFTimestamp & aActualNPT,PVMFTimestamp & aActualMediaDataTS,bool aSeekToSyncPoint,uint32 aStreamID,const OsclAny * aContext)296         void Construct(PVMFSessionId s, int32 cmd, PVMFTimestamp aTargetNPT, PVMFTimestamp& aActualNPT, PVMFTimestamp& aActualMediaDataTS,
297                        bool aSeekToSyncPoint, uint32 aStreamID, const OsclAny*aContext)
298         {
299             PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
300             iParam1 = (OsclAny*)aTargetNPT;
301             iParam2 = (OsclAny*) & aActualNPT;
302             iParam3 = (OsclAny*) & aActualMediaDataTS;
303             iParam4 = (OsclAny*)aSeekToSyncPoint;
304             iParam5 = (OsclAny*)aStreamID;
305         }
Parse(PVMFTimestamp & aTargetNPT,PVMFTimestamp * & aActualNPT,PVMFTimestamp * & aActualMediaDataTS,bool & aSeekToSyncPoint,uint32 & aStreamID)306         void Parse(PVMFTimestamp& aTargetNPT, PVMFTimestamp*& aActualNPT, PVMFTimestamp*& aActualMediaDataTS, bool& aSeekToSyncPoint, uint32& aStreamID)
307         {
308             aTargetNPT = (PVMFTimestamp)iParam1;
309             aActualNPT = (PVMFTimestamp*)iParam2;
310             aActualMediaDataTS = (PVMFTimestamp*)iParam3;
311             aSeekToSyncPoint = (iParam4) ? true : false;
312             aStreamID = (uint32)iParam5;
313         }
314 
315         // Constructor and parser for QueryDataSourcePosition
Construct(PVMFSessionId s,int32 cmd,PVMFTimestamp aTargetNPT,PVMFTimestamp & aActualNPT,bool aSeekToSyncPoint,const OsclAny * aContext)316         void Construct(PVMFSessionId s, int32 cmd, PVMFTimestamp aTargetNPT, PVMFTimestamp &aActualNPT,
317                        bool aSeekToSyncPoint, const OsclAny*aContext)
318         {
319             PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
320             iParam1 = (OsclAny*)aTargetNPT;
321             iParam2 = (OsclAny*) & aActualNPT;
322             iParam3 = (OsclAny*)aSeekToSyncPoint;
323             iParam4 = NULL;
324             iParam5 = NULL;
325         }
326 
327         // Constructor and parser for QueryDataSourcePosition with aSeekPointBeforeTargetNPT and aSeekPointAfterTargetNPT
Construct(PVMFSessionId s,int32 cmd,PVMFTimestamp aTargetNPT,PVMFTimestamp & aSeekPointBeforeTargetNPT,PVMFTimestamp & aSeekPointAfterTargetNPT,const OsclAny * aContext,bool aSeekToSyncPoint)328         void Construct(PVMFSessionId s, int32 cmd, PVMFTimestamp aTargetNPT,
329                        PVMFTimestamp& aSeekPointBeforeTargetNPT, PVMFTimestamp& aSeekPointAfterTargetNPT,
330                        const OsclAny*aContext, bool aSeekToSyncPoint)
331         {
332             PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
333             iParam1 = (OsclAny*)aTargetNPT;
334             iParam3 = (OsclAny*)aSeekToSyncPoint;
335             iParam4 = (OsclAny*) & aSeekPointBeforeTargetNPT;
336             iParam5 = (OsclAny*) & aSeekPointAfterTargetNPT;
337         }
338 
339 
Parse(PVMFTimestamp & aTargetNPT,PVMFTimestamp * & aActualNPT,bool & aSeekToSyncPoint)340         void Parse(PVMFTimestamp& aTargetNPT, PVMFTimestamp*& aActualNPT, bool& aSeekToSyncPoint)
341         {
342             aTargetNPT = (PVMFTimestamp)iParam1;
343             aActualNPT = (PVMFTimestamp*)iParam2;
344             aSeekToSyncPoint = (iParam3) ? true : false;
345         }
346 
Parse(PVMFTimestamp & aTargetNPT,PVMFTimestamp * & aSeekPointBeforeTargetNPT,bool & aSeekToSyncPoint,PVMFTimestamp * & aSeekPointAfterTargetNPT)347         void Parse(PVMFTimestamp& aTargetNPT, PVMFTimestamp*& aSeekPointBeforeTargetNPT,
348                    bool& aSeekToSyncPoint, PVMFTimestamp*& aSeekPointAfterTargetNPT)
349         {
350             aTargetNPT = (PVMFTimestamp)iParam1;
351             aSeekPointBeforeTargetNPT = (PVMFTimestamp*)iParam4;
352             aSeekPointAfterTargetNPT = (PVMFTimestamp*)iParam5;
353             aSeekToSyncPoint = (iParam3) ? true : false;
354         }
355         /* Constructor and parser for SetDataSourceDirection */
Construct(PVMFSessionId s,int32 cmd,int32 aDirection,PVMFTimestamp & aActualNPT,PVMFTimestamp & aActualMediaDataTS,PVMFTimebase * aTimebase,OsclAny * aContext)356         void Construct(PVMFSessionId s, int32 cmd, int32 aDirection,
357                        PVMFTimestamp& aActualNPT, PVMFTimestamp& aActualMediaDataTS,
358                        PVMFTimebase* aTimebase, OsclAny* aContext)
359         {
360             PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
361             iParam1 = (OsclAny*)aDirection;
362             iParam2 = (OsclAny*) & aActualNPT;
363             iParam3 = (OsclAny*) & aActualMediaDataTS;
364             iParam4 = (OsclAny*)aTimebase;
365             iParam5 = NULL;
366         }
Parse(int32 & aDirection,PVMFTimestamp * & aActualNPT,PVMFTimestamp * & aActualMediaDataTS,PVMFTimebase * & aTimebase)367         void Parse(int32& aDirection,
368                    PVMFTimestamp*& aActualNPT,
369                    PVMFTimestamp*& aActualMediaDataTS,
370                    PVMFTimebase*& aTimebase)
371         {
372             aDirection = (int32)iParam1;
373             aActualNPT = (PVMFTimestamp*)iParam2;
374             aActualMediaDataTS = (PVMFTimestamp*)iParam3;
375             aTimebase = (PVMFTimebase*)iParam4;
376         }
377 
378         // Constructor and parser for SetDataSourceRate
Construct(PVMFSessionId s,int32 cmd,int32 aRate,PVMFTimebase * aTimebase,const OsclAny * aContext)379         void Construct(PVMFSessionId s, int32 cmd, int32 aRate, PVMFTimebase* aTimebase, const OsclAny*aContext)
380         {
381             PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
382             iParam1 = (OsclAny*)aRate;
383             iParam2 = (OsclAny*)aTimebase;
384             iParam3 = NULL;
385             iParam4 = NULL;
386             iParam5 = NULL;
387         }
Parse(int32 & aRate,PVMFTimebase * & aTimebase)388         void Parse(int32& aRate, PVMFTimebase*& aTimebase)
389         {
390             aRate = (int32)iParam1;
391             aTimebase = (PVMFTimebase*)iParam2;
392         }
393 
394         /* Constructor and parser for GetLicenseW */
Construct(PVMFSessionId s,int32 cmd,OSCL_wString & aContentName,OsclAny * aLicenseData,uint32 aDataSize,int32 aTimeoutMsec,OsclAny * aContext)395         void Construct(PVMFSessionId s,
396                        int32 cmd,
397                        OSCL_wString& aContentName,
398                        OsclAny* aLicenseData,
399                        uint32 aDataSize,
400                        int32 aTimeoutMsec,
401                        OsclAny* aContext)
402         {
403             PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
404             iParam1 = (OsclAny*) & aContentName;
405             iParam2 = (OsclAny*)aLicenseData;
406             iParam3 = (OsclAny*)aDataSize;
407             iParam4 = (OsclAny*)aTimeoutMsec;
408             iParam5 = NULL;
409         }
Parse(OSCL_wString * & aContentName,OsclAny * & aLicenseData,uint32 & aDataSize,int32 & aTimeoutMsec)410         void Parse(OSCL_wString*& aContentName,
411                    OsclAny*& aLicenseData,
412                    uint32& aDataSize,
413                    int32& aTimeoutMsec)
414         {
415             aContentName = (OSCL_wString*)iParam1;
416             aLicenseData = (PVMFTimestamp*)iParam2;
417             aDataSize = (uint32)iParam3;
418             aTimeoutMsec = (int32)iParam4;
419         }
420 
421         /* Constructor and parser for GetLicense */
Construct(PVMFSessionId s,int32 cmd,OSCL_String & aContentName,OsclAny * aLicenseData,uint32 aDataSize,int32 aTimeoutMsec,OsclAny * aContext)422         void Construct(PVMFSessionId s,
423                        int32 cmd,
424                        OSCL_String& aContentName,
425                        OsclAny* aLicenseData,
426                        uint32 aDataSize,
427                        int32 aTimeoutMsec,
428                        OsclAny* aContext)
429         {
430             PVMFMP4FFParserNodeCommandBase::Construct(s, cmd, aContext);
431             iParam1 = (OsclAny*) & aContentName;
432             iParam2 = (OsclAny*)aLicenseData;
433             iParam3 = (OsclAny*)aDataSize;
434             iParam4 = (OsclAny*)aTimeoutMsec;
435             iParam5 = NULL;
436         }
Parse(OSCL_String * & aContentName,OsclAny * & aLicenseData,uint32 & aDataSize,int32 & aTimeoutMsec)437         void Parse(OSCL_String*& aContentName,
438                    OsclAny*& aLicenseData,
439                    uint32& aDataSize,
440                    int32& aTimeoutMsec)
441         {
442             aContentName = (OSCL_String*)iParam1;
443             aLicenseData = (PVMFTimestamp*)iParam2;
444             aDataSize = (uint32)iParam3;
445             aTimeoutMsec = (int32)iParam4;
446         }
447 
448 
449         // Need to overlaod the base Destroy routine to cleanup metadata key.
Destroy()450         void Destroy()
451         {
452             PVMFGenericNodeCommand<OsclMemAllocator>::Destroy();
453             switch (iCmd)
454             {
455                 case PVMP4FF_NODE_CMD_GETNODEMETADATAKEYS:
456                     if (iParam4)
457                     {
458                         //cleanup the allocated string
459                         Oscl_TAlloc<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator> str;
460                         str.destruct_and_dealloc(iParam4);
461                     }
462                     break;
463                 default:
464                     break;
465             }
466         }
467 
468         // Need to overlaod the base Copy routine to copy metadata key.
Copy(const PVMFGenericNodeCommand<OsclMemAllocator> & aCmd)469         void Copy(const PVMFGenericNodeCommand<OsclMemAllocator>& aCmd)
470         {
471             PVMFGenericNodeCommand<OsclMemAllocator>::Copy(aCmd);
472             switch (aCmd.iCmd)
473             {
474                 case PVMP4FF_NODE_CMD_GETNODEMETADATAKEYS:
475                     if (aCmd.iParam4)
476                     {
477                         //copy the allocated string
478                         OSCL_HeapString<OsclMemAllocator>* aStr = (OSCL_HeapString<OsclMemAllocator>*)aCmd.iParam4;
479                         Oscl_TAlloc<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator> str;
480                         iParam4 = str.ALLOC_AND_CONSTRUCT(*aStr);
481                     }
482                     break;
483                 default:
484                     break;
485             }
486         }
487 
488 };
489 typedef PVMFNodeCommandQueue<PVMFMP4FFParserNodeCommand, OsclMemAllocator> PVMFMP4FFParserNodeCmdQueue;
490 
491 //Command queue type
492 typedef PVMFNodeCommandQueue<PVMFMP4FFParserNodeCommand, OsclMemAllocator> PVMFMP4FFParserNodeCmdQueue;
493 
494 
495 /**
496 * The Node class
497 */
498 class IMpeg4File;
499 class PVMFMP4FFParserOutPort;
500 class PVMFMP4FFPortIter;
501 class PVLogger;
502 class PVMFMediaClock;
503 
504 enum BaseKeys_SelectionType
505 {
506     INVALID = 0,
507     NET,
508     FILE_IO
509 };
510 
511 #define PVMFFFPARSERNODE_MAX_NUM_TRACKS 6
512 
513 class PVMFMP4FFParserNode : public OsclTimerObject,
514         public PVMFNodeInterface,
515         public PVMFDataSourceInitializationExtensionInterface,
516         public PVMFTrackSelectionExtensionInterface,
517         public PvmfDataSourcePlaybackControlInterface,
518         public PVMFMetadataExtensionInterface,
519         public PVMFTrackLevelInfoExtensionInterface,
520         public PVMFCPMStatusObserver,
521         public PvmiDataStreamObserver,
522         public PVMIDatastreamuserInterface,
523         public PVMFFormatProgDownloadSupportInterface,
524         public OsclTimerObserver,
525         public PVMFCPMPluginLicenseInterface,
526         public PvmiCapabilityAndConfig,
527         public PVMFMediaClockStateObserver, // For observing the playback clock states
528         public PvmfDataSourceDirectionControlInterface
529 {
530     public:
531         PVMFMP4FFParserNode(int32 aPriority = OsclActiveObject::EPriorityNominal);
532         virtual ~PVMFMP4FFParserNode();
533 
534         // From PVMFNodeInterface
535         PVMFStatus ThreadLogon();
536         PVMFStatus ThreadLogoff();
537         PVMFStatus GetCapability(PVMFNodeCapability& aNodeCapability);
538         PVMFPortIter* GetPorts(const PVMFPortFilter* aFilter = NULL);
539 
540         PVMFCommandId QueryUUID(PVMFSessionId aSessionId,
541                                 const PvmfMimeString& aMimeType,
542                                 Oscl_Vector<PVUuid, OsclMemAllocator>& aUuids,
543                                 bool aExactUuidsOnly = false,
544                                 const OsclAny* aContext = NULL);
545         PVMFCommandId QueryInterface(PVMFSessionId aSessionId,
546                                      const PVUuid& aUuid,
547                                      PVInterface*& aInterfacePtr,
548                                      const OsclAny* aContext = NULL);
549 
550         PVMFCommandId RequestPort(PVMFSessionId aSessionId, int32 aPortTag,
551                                   const PvmfMimeString* aPortConfig = NULL,
552                                   const OsclAny* aContext = NULL);
553         PVMFStatus ReleasePort(PVMFSessionId aSessionId, PVMFPortInterface& aPort,
554                                const OsclAny* aContext = NULL);
555 
556         PVMFCommandId Init(PVMFSessionId aSessionId, const OsclAny* aContext = NULL);
557         PVMFCommandId Prepare(PVMFSessionId aSessionId, const OsclAny* aContext = NULL);
558         PVMFCommandId Start(PVMFSessionId aSessionId, const OsclAny* aContext = NULL);
559         PVMFCommandId Stop(PVMFSessionId aSessionId, const OsclAny* aContext = NULL);
560         PVMFCommandId Flush(PVMFSessionId aSessionId, const OsclAny* aContext = NULL);
561         PVMFCommandId Pause(PVMFSessionId aSessionId, const OsclAny* aContext = NULL);
562         PVMFCommandId Reset(PVMFSessionId aSessionId, const OsclAny* aContext = NULL);
563 
564         PVMFCommandId CancelAllCommands(PVMFSessionId aSessionId, const OsclAny* aContextData = NULL);
565         PVMFCommandId CancelCommand(PVMFSessionId aSessionId, PVMFCommandId aCmdId, const OsclAny* aContextData = NULL);
566         PVMFStatus QueryInterfaceSync(PVMFSessionId aSession,
567                                       const PVUuid& aUuid,
568                                       PVInterface*& aInterfacePtr);
569 
570         /* cap config interface */
setObserver(PvmiConfigAndCapabilityCmdObserver * aObserver)571         virtual void setObserver(PvmiConfigAndCapabilityCmdObserver* aObserver)
572         {
573             ciObserver = aObserver;
574         }
575 
576         virtual PVMFStatus getParametersSync(PvmiMIOSession aSession,
577                                              PvmiKeyType aIdentifier,
578                                              PvmiKvp*& aParameters,
579                                              int& aNumParamElements,
580                                              PvmiCapabilityContext aContext);
581         virtual PVMFStatus releaseParameters(PvmiMIOSession aSession,
582                                              PvmiKvp* aParameters,
583                                              int num_elements);
584         virtual void createContext(PvmiMIOSession aSession, PvmiCapabilityContext& aContext);
585         virtual void setContextParameters(PvmiMIOSession aSession, PvmiCapabilityContext& aContext,
586                                           PvmiKvp* aParameters, int num_parameter_elements);
587         virtual void DeleteContext(PvmiMIOSession aSession,
588                                    PvmiCapabilityContext& aContext);
589         virtual void setParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters,
590                                        int num_elements, PvmiKvp * & aRet_kvp);
591         virtual PVMFCommandId setParametersAsync(PvmiMIOSession aSession,
592                 PvmiKvp* aParameters,
593                 int num_elements,
594                 PvmiKvp*& aRet_kvp,
595                 OsclAny* context = NULL);
596         virtual uint32 getCapabilityMetric(PvmiMIOSession aSession);
597         virtual PVMFStatus verifyParametersSync(PvmiMIOSession aSession,
598                                                 PvmiKvp* aParameters,
599                                                 int num_elements);
600 
601         PVMFStatus GetConfigParameter(PvmiKvp*& aParameters, int& aNumParamElements,
602                                       int32 aIndex, PvmiKvpAttr reqattr);
603         PVMFStatus VerifyAndSetConfigParameter(int index, PvmiKvp& aParameter, bool set);
604 
605 
606         // From PVInterface
607         void addRef();
608         void removeRef();
609         bool queryInterface(const PVUuid& uuid, PVInterface*& iface);
610 
611         // From PVMFDataSourceInitializationExtensionInterface
612         PVMFStatus SetSourceInitializationData(OSCL_wString& aSourceURL, PVMFFormatType& aSourceFormat, OsclAny* aSourceData);
613         PVMFStatus SetClientPlayBackClock(PVMFMediaClock* aClientClock);
614         PVMFStatus SetEstimatedServerClock(PVMFMediaClock* aClientClock);
615 
616         // From PVMFTrackSelectionExtensionInterface
617         PVMFStatus GetMediaPresentationInfo(PVMFMediaPresentationInfo& aInfo);
618         PVMFStatus SelectTracks(PVMFMediaPresentationInfo& aInfo);
619 
620         // From PVMFMetadataExtensionInterface
621         uint32 GetNumMetadataKeys(char* aQueryKeyString = NULL);
622         uint32 GetNumMetadataValues(PVMFMetadataList& aKeyList);
623         uint32 GetNumImotionMetadataValues(PVMFMetadataList& aKeyList);
624         PVMFCommandId GetNodeMetadataKeys(PVMFSessionId aSessionId, PVMFMetadataList& aKeyList, uint32 aStartingKeyIndex, int32 aMaxKeyEntries,
625                                           char* aQueryKeyString = NULL, const OsclAny* aContextData = NULL);
626         PVMFCommandId GetNodeMetadataValues(PVMFSessionId aSessionId, PVMFMetadataList& aKeyList,
627                                             Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList, uint32 aStartingValueIndex, int32 aMaxValueEntries, const OsclAny* aContextData = NULL);
628         PVMFStatus ReleaseNodeMetadataKeys(PVMFMetadataList& aKeyList, uint32 aStartingKeyIndex, uint32 aEndKeyIndex);
629         PVMFStatus ReleaseNodeMetadataValues(Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList, uint32 aStartingValueIndex, uint32 aEndValueIndex);
630 
631         // From PvmfDataSourcePlaybackControlInterface
632         PVMFCommandId SetDataSourcePosition(PVMFSessionId aSessionId, PVMFTimestamp aTargetNPT, PVMFTimestamp& aActualNPT,
633                                             PVMFTimestamp& aActualMediaDataTS, bool aSeekToSyncPoint = true, uint32 aStreamID = 0, OsclAny* aContext = NULL);
634         PVMFCommandId QueryDataSourcePosition(PVMFSessionId aSessionId, PVMFTimestamp aTargetNPT, PVMFTimestamp& aActualNPT,
635                                               bool aSeekToSyncPoint = true, OsclAny* aContext = NULL);
636         PVMFCommandId QueryDataSourcePosition(PVMFSessionId aSessionId, PVMFTimestamp aTargetNPT,
637                                               PVMFTimestamp& aSeekPointBeforeTargetNPT, PVMFTimestamp& aSeekPointAfterTargetNPT,  OsclAny* aContext = NULL, bool aSeekToSyncPoint = true);
638 
639         PVMFCommandId SetDataSourceRate(PVMFSessionId aSession, int32 aRate, PVMFTimebase* aTimebase = NULL, OsclAny* aContext = NULL);
640         PVMFCommandId SetDataSourceDirection(PVMFSessionId aSessionId, int32 aDirection, PVMFTimestamp& aActualNPT,
641                                              PVMFTimestamp& aActualMediaDataTS, PVMFTimebase* aTimebase, OsclAny* aContext);
642 
643         // From PVMFTrackLevelInfoExtensionInterface
644         PVMFStatus GetAvailableTracks(Oscl_Vector<PVMFTrackInfo, OsclMemAllocator>& aTracks);
645         PVMFStatus GetTimestampForSampleNumber(PVMFTrackInfo& aTrackInfo, uint32 aSampleNum, PVMFTimestamp& aTimestamp);
646         PVMFStatus GetSampleNumberForTimestamp(PVMFTrackInfo& aTrackInfo, PVMFTimestamp aTimestamp, uint32& aSampleNum);
647         PVMFStatus GetNumberOfSyncSamples(PVMFTrackInfo& aTrackInfo, int32& aNumSyncSamples);
648         PVMFStatus GetSyncSampleInfo(PVMFTrackInfo& aTrackInfo, PVMFSampleNumTSList& aList, uint32 aStartIndex = 0, int32 aMaxEntries = -1);
649         PVMFStatus GetSyncSampleInfo(PVMFSampleNumTSList& aList, PVMFTrackInfo& aTrackInfo, int32 aTargetTimeInMS, uint32 aHowManySamples = 1);
650         PVMFStatus GetTimestampForDataPosition(PVMFTrackInfo& aTrackInfo, uint32 aDataPosition, PVMFTimestamp& aTimestamp);
651         PVMFStatus GetDataPositionForTimestamp(PVMFTrackInfo& aTrackInfo, PVMFTimestamp aTimestamp, uint32& aDataPosition);
652 
653 
654         // From PVMFPortActivityHandler
655         void HandlePortActivity(const PVMFPortActivity& aActivity);
656 
657         // From PVMFCPMStatusObserver
658         void CPMCommandCompleted(const PVMFCmdResp& aResponse);
659 
660         /* From PVMIDatastreamuserInterface */
661         void PassDatastreamFactory(PVMFDataStreamFactory& aFactory,
662                                    int32 aFactoryTag,
663                                    const PvmfMimeString* aFactoryConfig = NULL);
664         void PassDatastreamReadCapacityObserver(PVMFDataStreamReadCapacityObserver* aObserver);
665 
666 
667         /* From PVMFFormatProgDownloadSupportInterface */
668         int32 convertSizeToTime(uint32 fileSize, uint32& aNPTInMS);
669         void setFileSize(const uint32 aFileSize);
670         void setDownloadProgressInterface(PVMFDownloadProgressInterface*);
671         void playResumeNotification(bool aDownloadComplete);
672         void notifyDownloadComplete();
673 
674         // From OsclTimer
675         void TimeoutOccurred(int32 timerID, int32 timeoutInfo);
676 
677         /* From PVMFCPMPluginLicenseInterface */
GetLicenseURL(PVMFSessionId aSessionId,OSCL_wString & aContentName,OSCL_wString & aLicenseURL)678         PVMFStatus GetLicenseURL(PVMFSessionId aSessionId,
679                                  OSCL_wString& aContentName,
680                                  OSCL_wString& aLicenseURL)
681         {
682             OSCL_UNUSED_ARG(aSessionId);
683             OSCL_UNUSED_ARG(aContentName);
684             OSCL_UNUSED_ARG(aLicenseURL);
685             //must use Async method.
686             return PVMFErrNotSupported;
687         }
GetLicenseURL(PVMFSessionId aSessionId,OSCL_String & aContentName,OSCL_String & aLicenseURL)688         PVMFStatus GetLicenseURL(PVMFSessionId aSessionId,
689                                  OSCL_String&  aContentName,
690                                  OSCL_String&  aLicenseURL)
691         {
692             OSCL_UNUSED_ARG(aSessionId);
693             OSCL_UNUSED_ARG(aContentName);
694             OSCL_UNUSED_ARG(aLicenseURL);
695             //must use Async method.
696             return PVMFErrNotSupported;
697         }
698 
699         PVMFCommandId GetLicense(PVMFSessionId aSessionId,
700                                  OSCL_wString& aContentName,
701                                  OsclAny* aData,
702                                  uint32 aDataSize,
703                                  int32 aTimeoutMsec,
704                                  OsclAny* aContextData) ;
705 
706         PVMFCommandId GetLicense(PVMFSessionId aSessionId,
707                                  OSCL_String&  aContentName,
708                                  OsclAny* aData,
709                                  uint32 aDataSize,
710                                  int32 aTimeoutMsec,
711                                  OsclAny* aContextData);
712 
713         PVMFCommandId CancelGetLicense(PVMFSessionId aSessionId
714                                        , PVMFCommandId aCmdId
715                                        , OsclAny* aContextData);
716 
717         PVMFStatus GetLicenseStatus(
718             PVMFCPMLicenseStatus& aStatus) ;
719 
720         //from PVMFMediaClockStateObserver
721         void ClockStateUpdated();
722         void NotificationsInterfaceDestroyed();
723 
724     private:
725         // from OsclTimerObject
726         void Run();
727 
728         //Command processing
729         PVMFCommandId QueueCommandL(PVMFMP4FFParserNodeCommand& aCmd);
730         void MoveCmdToCurrentQueue(PVMFMP4FFParserNodeCommand& aCmd);
731         void MoveCmdToCancelQueue(PVMFMP4FFParserNodeCommand& aCmd);
732         void ProcessCommand();
733         void CommandComplete(PVMFMP4FFParserNodeCmdQueue& aCmdQueue, PVMFMP4FFParserNodeCommand& aCmd, PVMFStatus aStatus, OsclAny* aData = NULL, PVUuid* aEventUUID = NULL, int32* aEventCode = NULL);
734         bool FlushPending();
735         PVMFMP4FFParserNodeCmdQueue iInputCommands;
736         PVMFMP4FFParserNodeCmdQueue iCurrentCommand;
737         PVMFMP4FFParserNodeCmdQueue iCancelCommand;
738 
739         // Event reporting
740         void ReportMP4FFParserErrorEvent(PVMFEventType aEventType, OsclAny* aEventData = NULL, PVUuid* aEventUUID = NULL, int32* aEventCode = NULL);
741         void ReportMP4FFParserInfoEvent(PVMFEventType aEventType, OsclAny* aEventData = NULL, PVUuid* aEventUUID = NULL, int32* aEventCode = NULL);
742         void ChangeNodeState(TPVMFNodeInterfaceState aNewState);
743 
744         // Node command handlers
745         PVMFStatus DoQueryUuid(PVMFMP4FFParserNodeCommand& aCmd);
746         PVMFStatus DoQueryInterface(PVMFMP4FFParserNodeCommand& aCmd);
747         PVMFStatus DoRequestPort(PVMFMP4FFParserNodeCommand& aCmd, PVMFPortInterface*&);
748         void GetTrackMaxParameters(PVMFFormatType aFormatType, uint32& aMaxDataSize, uint32& aMaxQueueDepth);
749         PVMFStatus DoReleasePort(PVMFMP4FFParserNodeCommand& aCmd);
750 
751         PVMFStatus DoInit(PVMFMP4FFParserNodeCommand& aCmd);
752         bool ParseMP4File(PVMFMP4FFParserNodeCmdQueue& aCmdQ,
753                           PVMFMP4FFParserNodeCommand& aCmd);
754         void PushToAvailableMetadataKeysList(const char* aKeystr, char* aOptionalParam = NULL);
755         PVMFStatus InitMetaData();
756         PVMFStatus InitImotionMetaData();
757         uint32 CountImotionMetaDataKeys();
758         int32 CountMetaDataKeys();
759         void CompleteInit(PVMFMP4FFParserNodeCmdQueue& aCmdQ,
760                           PVMFMP4FFParserNodeCommand& aCmd);
761         void CompleteCancelAfterInit();
762 
763 
764         PVMFStatus DoPrepare(PVMFMP4FFParserNodeCommand& aCmd);
765         void CompletePrepare(PVMFStatus aStatus);
766         PVMFStatus DoStart(PVMFMP4FFParserNodeCommand& aCmd);
767         PVMFStatus DoStop(PVMFMP4FFParserNodeCommand& aCmd);
768         PVMFStatus DoFlush(PVMFMP4FFParserNodeCommand& aCmd);
769         PVMFStatus DoPause(PVMFMP4FFParserNodeCommand& aCmd);
770 
771         PVMFStatus DoReset(PVMFMP4FFParserNodeCommand& aCmd);
772         void CompleteReset(PVMFMP4FFParserNodeCmdQueue& aCmdQ, PVMFMP4FFParserNodeCommand& aCmd);
773 
774         PVMFStatus DoCancelAllCommands(PVMFMP4FFParserNodeCommand& aCmd);
775         PVMFStatus DoCancelCommand(PVMFMP4FFParserNodeCommand& aCmd);
776         PVMFStatus DoCancelCurrentCommand(PVMFMP4FFParserNodeCommand& aCmd);
777 
778         // For metadata extention interface
779         PVMFStatus DoGetMetadataKeys(PVMFMP4FFParserNodeCommand& aCmd);
780         PVMFStatus CompleteGetMetadataKeys(PVMFMP4FFParserNodeCommand& aCmd);
781         PVMFStatus DoGetImotionMetadataValues(PVMFMP4FFParserNodeCommand& aCmd, int32 &numentriesadded);
782         PVMFStatus DoGetMetadataValues(PVMFMP4FFParserNodeCommand& aCmd);
783         void CompleteGetMetaDataValues();
784         int32 AddToValueList(Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList, PvmiKvp& aNewValue);
785         PVMFStatus GetIndexParamValues(const char* aString, uint32& aStartIndex, uint32& aEndIndex);
786         void DeleteAPICStruct(PvmfApicStruct*& aAPICStruct);
787         PVMFStatus GetVideoFrameWidth(uint32 aId, int32& aWidth, int32& aDisplayWidth);
788         PVMFStatus GetVideoFrameHeight(uint32 aId, int32& aHeight, int32& aDisplayHeight);
789         int32 FindVideoWidth(uint32 aId);
790         int32 FindVideoHeight(uint32 aId);
791         int32 FindVideoDisplayWidth(uint32 aId);
792         int32 FindVideoDisplayHeight(uint32 aId);
793         PVMFStatus PopulateVideoDimensions(uint32 aId);
794         uint32 GetNumAudioChannels(uint32 aId);
795         uint32 GetAudioSampleRate(uint32 aId);
796         uint32 GetAudioBitsPerSample(uint32 aId);
797         PVMFStatus FindBestThumbnailKeyFrame(uint32 aId, uint32& aKeyFrameNum);
798 
799         // For data source position extension interface
800         PVMFStatus DoSetDataSourcePosition(PVMFMP4FFParserNodeCommand& aCmd, PVMFStatus &aEventCode, PVUuid &aEventUuid);
801         PVMFStatus DoQueryDataSourcePosition(PVMFMP4FFParserNodeCommand& aCmd);
802         PVMFStatus DoSetDataSourceRate(PVMFMP4FFParserNodeCommand& aCmd);
803 
804         PVMFStatus DoSetDataSourceDirection(PVMFMP4FFParserNodeCommand& aCmd);
805 
806         void HandleTrackState();
807         bool RetrieveTrackConfigInfo(uint32 aTrackId,
808                                      PVMFFormatType aFormatType,
809                                      OsclRefCounterMemFrag &aConfig);
810         bool RetrieveTrackConfigInfoAndFirstSample(uint32 aTrackId,
811                 PVMFFormatType aFormatType,
812                 OsclRefCounterMemFrag &aConfig);
813         bool RetrieveTrackData(PVMP4FFNodeTrackPortInfo& aTrackPortInfo);
814         bool SendTrackData(PVMP4FFNodeTrackPortInfo& aTrackPortInfo);
815         bool GenerateAVCNALGroup(PVMP4FFNodeTrackPortInfo& aTrackPortInfo, OsclSharedPtr<PVMFMediaDataImpl>& aMediaFragGroup);
816         bool GenerateAACFrameFrags(PVMP4FFNodeTrackPortInfo& aTrackPortInfo, OsclSharedPtr<PVMFMediaDataImpl>& aMediaFragGroup);
817         bool GetAVCNALLength(OsclBinIStreamBigEndian& stream, uint32& lengthSize, int32& len);
818         bool UpdateTextSampleEntry(PVMP4FFNodeTrackPortInfo& aTrackPortInfo, uint32 aEntryIndex, PVMFTimedTextMediaData& aTextMediaData);
819         bool SendEndOfTrackCommand(PVMP4FFNodeTrackPortInfo& aTrackPortInfo);
820         bool SendBeginOfMediaStreamCommand(PVMP4FFNodeTrackPortInfo& aTrackPortInfo);
821 
822         // Port processing
823         void ProcessPortActivity();
824         void QueuePortActivity(const PVMFPortActivity& aActivity);
825         PVMFStatus ProcessIncomingMsg(PVMFPortInterface* aPort);
826         PVMFStatus ProcessOutgoingMsg(PVMFPortInterface* aPort);
827         Oscl_Vector<PVMFPortActivity, OsclMemAllocator> iPortActivityQueue;
828 
829         friend class PVMFMP4FFParserOutPort;
830 
831         PVMFFormatType GetFormatTypeFromMIMEType(PvmfMimeString* aMIMEString);
832 
833         void ResetAllTracks();
834         bool ReleaseAllPorts();
835         void RemoveAllCommands();
836         void CleanupFileSource();
837 
838         // For comparison with download progress clock
839         bool checkTrackPosition(PVMP4FFNodeTrackPortInfo& aTrackPortInfo, uint32 numsamples);
840 
841         bool GetTrackPortInfoForTrackID(PVMP4FFNodeTrackPortInfo*& aInfo,
842                                         uint32 aTrackID);
843 
844         bool GetTrackPortInfoForPort(PVMP4FFNodeTrackPortInfo*& aInfo,
845                                      PVMFPortInterface* aPort);
846 
847         OSCL_wHeapString<OsclMemAllocator> iFilename;
848         PVMFFormatType iSourceFormat;
849         PVMFMediaClock* iClientPlayBackClock;
850         PVMFMediaClockNotificationsInterface *iClockNotificationsInf;
851         bool iUseCPMPluginRegistry;
852         PVMFLocalDataSource iCPMSourceData;
853         PVMFSourceContextData iSourceContextData;
854         OsclFileHandle* iFileHandle;
855         Oscl_FileServer iFileServer;
856         uint32 iParsingMode;
857         bool iProtectedFile;
858         IMpeg4File* iMP4FileHandle;
859         Oscl_Vector<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator> iAvailableMetadataKeys;
860         uint32 iMP4ParserNodeMetadataValueCount;
861         Oscl_Vector<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator> iCPMMetadataKeys;
862         Oscl_Vector<PVMP4FFNodeTrackPortInfo, OsclMemAllocator> iNodeTrackPortList;
863         Oscl_Vector<PVMFTrackInfo, OsclMemAllocator> iSelectedTrackInfoList;
864         Oscl_Vector<VideoTrackDimensionInfo, OsclMemAllocator> iVideoDimensionInfoVec;
865 
866         PVMFMP4FFPortIter* iPortIter;
867 
868         // stream id
869         uint32 iStreamID;
870 
871         PVMFNodeCapability iCapability;
872         PVLogger* iLogger;
873         PVLogger* iDataPathLogger;
874         PVLogger* iAVCDataPathLogger;
875         PVLogger* iClockLogger;
876         PVLogger* iDiagnosticsLogger;
877         // Reference counter for extension
878         uint32 iExtensionRefCount;
879 
880         // variables to support download autopause
881         OsclSharedPtr<PVMFMediaClock> download_progress_clock;
882         PVMFDownloadProgressInterface* download_progress_interface;
883         uint32 iDownloadFileSize;
884         bool autopaused;
885 
886         void DataStreamCommandCompleted(const PVMFCmdResp& aResponse);
887         void DataStreamInformationalEvent(const PVMFAsyncEvent& aEvent);
888         void DataStreamErrorEvent(const PVMFAsyncEvent& aEvent);
889 
890         bool MapMP4ErrorCodeToEventCode(int32 aMP4ErrCode, PVUuid& aEventUUID, int32& aEventCode);
891 
892         GAU iGau;
893 
894         bool iThumbNailMode;
895 
896         // Content Policy Manager related
897         bool iSourceContextDataValid;
898         bool iPreviewMode;
899         PVMFCPM* iCPM;
900         PVMFSessionId iCPMSessionID;
901         PVMFCPMContentType iCPMContentType;
902         PVMFCPMPluginAccessInterfaceFactory* iCPMContentAccessFactory;
903         PVMFMetadataExtensionInterface* iCPMMetaDataExtensionInterface;
904         PVMFCPMPluginLicenseInterface* iCPMLicenseInterface;
905         PVInterface* iCPMLicenseInterfacePVI;
906         PVMFCPMPluginAccessUnitDecryptionInterface* iDecryptionInterface;
907         PvmiKvp iRequestedUsage;
908         PvmiKvp iApprovedUsage;
909         PvmiKvp iAuthorizationDataKvp;
910         PVMFCPMUsageID iUsageID;
911         bool oWaitingOnLicense;
912         bool iPoorlyInterleavedContentEventSent;
913 
914         PVMFCommandId iCPMInitCmdId;
915         PVMFCommandId iCPMOpenSessionCmdId;
916         PVMFCommandId iCPMRegisterContentCmdId;
917         PVMFCommandId iCPMRequestUsageId;
918         PVMFCommandId iCPMUsageCompleteCmdId;
919         PVMFCommandId iCPMCloseSessionCmdId;
920         PVMFCommandId iCPMResetCmdId;
921         PVMFCommandId iCPMGetMetaDataKeysCmdId;
922         PVMFCommandId iCPMGetMetaDataValuesCmdId;
923         PVMFCommandId iCPMGetLicenseInterfaceCmdId;
924         PVMFCommandId iCPMGetLicenseCmdId;
925         PVMFCommandId iCPMCancelGetLicenseCmdId;
926         void InitCPM();
927         void OpenCPMSession();
928         void CPMRegisterContent();
929         bool GetCPMContentAccessFactory();
930         void GetCPMContentType();
931         bool GetCPMMetaDataExtensionInterface();
932         void GetCPMLicenseInterface();
933         void RequestUsage(PVMP4FFNodeTrackOMA2DRMInfo* aInfo);
934         void SendUsageComplete();
935         void CloseCPMSession();
936         void ResetCPM();
937         void GetCPMMetaDataKeys();
938         PVMFStatus CheckCPMCommandCompleteStatus(PVMFCommandId, PVMFStatus);
939         PVMFStatus iCPMRequestUsageCommandStatus;
940 
941         PVMFStatus DoGetLicense(PVMFMP4FFParserNodeCommand& aCmd,
942                                 bool aWideCharVersion = false);
943         PVMFStatus DoCancelGetLicense(PVMFMP4FFParserNodeCommand& aCmd);
944         void CompleteGetLicense();
945 
946         void PopulateOMA1DRMInfo();
947         /*
948          * OMA2 DRM Related Methods
949          */
950         Oscl_Vector<PVMP4FFNodeTrackOMA2DRMInfo, OsclMemAllocator> iOMA2DRMInfoVec;
951         PVMP4FFNodeTrackOMA2DRMInfo* LookUpOMA2TrackInfoForTrack(uint32 aTrackID);
952         PVMFStatus InitOMA2DRMInfo();
953         void PopulateOMA2DRMInfo(PVMP4FFNodeTrackOMA2DRMInfo* aInfo);
954         PVMFStatus CheckForOMA2AuthorizationComplete(PVMP4FFNodeTrackOMA2DRMInfo*& aInfo);
955         void OMA2TrackAuthorizationComplete();
956         bool CheckForOMA2UsageApproval();
957         void ResetOMA2Flags();
958         uint8* iOMA2DecryptionBuffer;
959 
960         PVMFStatus GetFileOffsetForAutoResume(uint32& aOffset, bool aPortsAvailable = true);
961         PVMFStatus GetFileOffsetForAutoResume(uint32& aOffset, PVMP4FFNodeTrackPortInfo* aInfo);
962 
963         PVMFStatus CheckForUnderFlow(PVMP4FFNodeTrackPortInfo* aInfo);
964 
965         void getLanguageCode(uint16 langcode, int8 *LangCode);
966         void getBrand(uint32 langcode, char *LangCode);
967 
968         PVMFStatus CheckForMP4HeaderAvailability();
969         int32 CreateErrorInfoMsg(PVMFBasicErrorInfoMessage** aErrorMsg, PVUuid aEventUUID, int32 aEventCode);
970         void CreateDurationInfoMsg(uint32 adurationms);
971         PVMFStatus PushKVPToMetadataValueList(Oscl_Vector<PvmiKvp, OsclMemAllocator>* aVecPtr, PvmiKvp& aKvpVal);
972         PVMFStatus CreateNewArray(uint32** aTrackidList, uint32 aNumTracks);
973         PVMFStatus PushValueToList(Oscl_Vector<OSCL_HeapString<OsclMemAllocator>, OsclMemAllocator> &aRefMetadataKeys,
974                                    PVMFMetadataList *&aKeyListPtr,
975                                    uint32 aLcv);
976         PVMIDataStreamSyncInterface* iDataStreamInterface;
977         PVMFDataStreamFactory* iDataStreamFactory;
978         PVMFDataStreamReadCapacityObserver* iDataStreamReadCapacityObserver;
979         PvmiDataStreamSession iDataStreamSessionID;
980         PvmiDataStreamCommandId iRequestReadCapacityNotificationID;
981         uint32 iMP4HeaderSize;
982         bool iDownloadComplete;
983         bool iProgressivelyDownlodable;
984         uint32 iLastNPTCalcInConvertSizeToTime;
985         uint32 iFileSizeLastConvertedToTime;
986         bool iFastTrackSession;
987 
988         /* External PseudoStreaming related */
989         bool iExternalDownload;
990 
991         bool iUnderFlowEventReported;
992         PVMFStatus ReportUnderFlow();
993         OsclTimer<OsclMemAllocator> *iUnderFlowCheckTimer;
994 
995         /* bitstream logging */
996         void LogMediaData(PVMFSharedMediaDataPtr data,
997                           PVMFPortInterface* aPort);
998         bool iPortDataLog;
999         char iLogFileIndex;
1000         OSCL_HeapString<OsclMemAllocator> portLogPath;
1001 
1002         uint32 minTime;
1003         uint32 avgTime;
1004         uint32 maxTime;
1005         uint32 sumTime;
1006         bool iDiagnosticsLogged;
1007         void LogDiagnostics();
1008         uint32 iTimeTakenInReadMP4File;
1009         bool iBackwardReposFlag; /* To avoid backwardlooping :: A flag to remember backward repositioning */
1010         bool iForwardReposFlag;
1011         uint32 iCurPos;
1012         bool iEOTForTextSentToMIO;
1013 
1014         bool iSetTextSampleDurationZero;
1015 
1016         /* To take into account if we get negative TS for text track after repositionings*/
1017         bool iTextInvalidTSAfterReposition;
1018 
1019         uint32 iDelayAddToNextTextSample;
1020 
1021         uint32 iCacheSize;
1022         uint32 iAsyncReadBuffSize;
1023         bool iPVLoggerEnableFlag;
1024         bool iPVLoggerStateEnableFlag;
1025         uint32 iNativeAccessMode;
1026 
1027         BaseKeys_SelectionType iBaseKey;
1028         uint32 iJitterBufferDurationInMs;
1029         bool iDataStreamRequestPending;
1030         bool iCPMSequenceInProgress;
1031         bool oIsAACFramesFragmented;
1032 
1033         int32 iPlayBackDirection;
1034         int32 iStartForNextTSSearch;
1035         int32 iPrevSampleTS;
1036         bool iParseAudioDuringFF;
1037         bool iParseAudioDuringREW;
1038         bool iParseVideoOnly;
1039         int32 iDataRate;
1040 
1041         int32 minFileOffsetTrackID;
1042 };
1043 
1044 
1045 class PVMFMP4FFPortIter : public PVMFPortIter
1046 {
1047     public:
PVMFMP4FFPortIter(Oscl_Vector<PVMP4FFNodeTrackPortInfo,OsclMemAllocator> & aTrackList)1048         PVMFMP4FFPortIter(Oscl_Vector<PVMP4FFNodeTrackPortInfo, OsclMemAllocator>& aTrackList)
1049         {
1050             iIndex = 0;
1051             iTrackList = &aTrackList;
1052         };
1053 
~PVMFMP4FFPortIter()1054         virtual ~PVMFMP4FFPortIter() {};
1055 
NumPorts()1056         uint16 NumPorts()
1057         {
1058             if (iTrackList->size() < 0xFFFF)
1059             {
1060                 return (uint16)(iTrackList->size());
1061             }
1062             else
1063             {
1064                 return 0xFFFF;
1065             }
1066         };
1067 
GetNext()1068         PVMFPortInterface* GetNext()
1069         {
1070             if (iIndex < iTrackList->size())
1071             {
1072                 PVMFPortInterface* portiface = (*iTrackList)[iIndex].iPortInterface;
1073                 ++iIndex;
1074                 return portiface;
1075             }
1076             else
1077             {
1078                 return NULL;
1079             }
1080         };
1081 
Reset()1082         void Reset()
1083         {
1084             iIndex = 0;
1085         };
1086 
1087     private:
1088         Oscl_Vector<PVMP4FFNodeTrackPortInfo, OsclMemAllocator>* iTrackList;
1089         uint32 iIndex;
1090 };
1091 
1092 #endif // PVMF_MP4FFPARSER_NODE_H_INCLUDED
1093 
1094