Revision: 201014 RCL_3 PDK_3.0.i
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 27 Apr 2010 16:49:58 +0300
branchRCL_3
changeset 16 130a995b5096
parent 13 eb8cd2e3974b
child 20 fc5f27757cbe
Revision: 201014 Kit: 201017
camcordermmfplugin/filecomposer/Inc/CamC3GPDataSinkImp.h
camcordermmfplugin/filecomposer/Src/CamC3GPDataSinkImp.cpp
configmanagers/imagingconfigmanager/conf/imagingconfigmanager.confml
--- a/camcordermmfplugin/filecomposer/Inc/CamC3GPDataSinkImp.h	Wed Apr 14 16:09:12 2010 +0300
+++ b/camcordermmfplugin/filecomposer/Inc/CamC3GPDataSinkImp.h	Tue Apr 27 16:49:58 2010 +0300
@@ -235,6 +235,30 @@
         * @return None
         */
         void ConvertNALEncapsulationToNALSizes( CCMRMediaBuffer* aBuffer );
+        
+        /**
+        * Compose UDTA (User Data) to video file
+        * @since 5.2
+        * @param None
+        * @return None
+        */
+        void ComposeUDTAL();
+        
+        /**
+        * Convert 32bit unsigned value to little endian format into buffer
+        * @since 5.2
+        * @param None
+        * @return None
+        */
+        void LittleEndianPut32(TUint8 *aPtr, TUint32 aVal);
+
+        /**
+        * Convert 16bit unsigned value to little endian format into buffer
+        * @since 5.2
+        * @param None
+        * @return None
+        */
+        void LittleEndianPut16(TUint8 *aPtr, TUint16 aVal);
 
     private:
 
--- a/camcordermmfplugin/filecomposer/Src/CamC3GPDataSinkImp.cpp	Wed Apr 14 16:09:12 2010 +0300
+++ b/camcordermmfplugin/filecomposer/Src/CamC3GPDataSinkImp.cpp	Tue Apr 27 16:49:58 2010 +0300
@@ -740,6 +740,15 @@
         PRINT((_L("CCamC3GPDataSinkImp::OpenFileL Setting async file remover handler FAILED")));
         }
 
+    if ((iFileCodecType & MP4_TYPE_MPEG4_VIDEO)    ||
+        (iFileCodecType & MP4_TYPE_AVC_PROFILE_BASELINE) ||
+        (iFileCodecType & MP4_TYPE_AVC_PROFILE_MAIN) ||
+        (iFileCodecType & MP4_TYPE_AVC_PROFILE_HIGH))
+        {
+        PRINT((_L("CCamC3GPDataSinkImp::OpenFileL Composing UDTA atom")));
+        ComposeUDTAL();
+        }
+
     PRINT((_L("CCamC3GPDataSinkImp::OpenFileL exit")));
     OstTrace0( CAMERASRV_PERFORMANCE, DUP1_CCAMC3GPDATASINKIMP_OPENFILEL, "e_CCamC3GPDataSinkImp::OpenFileL 0" );
     }
@@ -2225,6 +2234,73 @@
     }
 
 // -----------------------------------------------------------------------------
+// CCamC3GPDataSinkImp::ComposeUDTA
+//
+// Compose UDTA (User Data) to video file
+// -----------------------------------------------------------------------------
+//
+void CCamC3GPDataSinkImp::ComposeUDTAL()
+    {
+    mp4_u32 udtaBufferSize = 10240;
+    HBufC8* udtaBuffer = HBufC8::NewL(udtaBufferSize);
+    TUint8* buf = CONST_CAST(TUint8*, udtaBuffer->Ptr());
+    CleanupStack::PushL(udtaBuffer);
+    udtaBuffer->Des().FillZ(udtaBuffer->Des().MaxLength());
+
+    mp4_u32  i = 0;
+    
+    // Compose free atom 
+    // BoxHeader.Size      Unsigned int(32)  size of free atom
+    LittleEndianPut32(buf+i, (mp4_u32)udtaBufferSize-i);
+    i += 4;
+    // BoxHeader.Type      Unsigned int(32)    'free'
+    LittleEndianPut32(buf+i, (mp4_u32)0x66726565); //'free' indentifier for free atom
+    
+    
+    MP4Err error;
+    mp4_u8 udtalocation = MP4_UDTA_MOOV; // store UDTA to moov e.g. movie structure instead of individual track.
+    error = MP4ComposeSetUserDataAtom(iMP4Handle, udtalocation, (mp4_u8 *)udtaBuffer->Des().Ptr(), udtaBufferSize);
+    
+    if ( error )
+        {
+        PRINT((_L("CCamC3GPDataSinkImp::MP4ComposeSetUserDataAtom error=%d"), error));
+        User::Leave(KErrGeneral);    
+        }
+
+    CleanupStack::PopAndDestroy(udtaBuffer);
+    }
+
+// -----------------------------------------------------------------------------
+// CCamC3GPDataSinkImp::LittleEndianPut32
+//
+// Convert 32bit unsigned value to little endian format into buffer
+// -----------------------------------------------------------------------------
+//
+void CCamC3GPDataSinkImp::LittleEndianPut32(TUint8 *aPtr, TUint32 aVal)
+    {
+    mp4_u32 result;
+    ((mp4_u8 *)&result)[0] = ((mp4_u8 *)&aVal)[3];
+    ((mp4_u8 *)&result)[1] = ((mp4_u8 *)&aVal)[2];
+    ((mp4_u8 *)&result)[2] = ((mp4_u8 *)&aVal)[1];
+    ((mp4_u8 *)&result)[3] = ((mp4_u8 *)&aVal)[0];
+    memcpy(aPtr, &result, 4);
+    }
+
+// -----------------------------------------------------------------------------
+// CCamC3GPDataSinkImp::LittleEndianPut16
+//
+// Convert 16bit unsigned value to little endian format into buffer
+// -----------------------------------------------------------------------------
+//
+void CCamC3GPDataSinkImp::LittleEndianPut16(TUint8 *aPtr, TUint16 aVal)
+    {
+    mp4_u16 result;
+    ((mp4_u8 *)&result)[0] = ((mp4_u8 *)&aVal)[1];
+    ((mp4_u8 *)&result)[1] = ((mp4_u8 *)&aVal)[0];
+    memcpy(aPtr, &result, 2);
+    }
+
+// -----------------------------------------------------------------------------
 // CCamC3GPDataSinkImp::M3GPMP4LibDeleteTempFileName
 // -----------------------------------------------------------------------------
 //
Binary file configmanagers/imagingconfigmanager/conf/imagingconfigmanager.confml has changed