[prev in list] [next in list] [prev in thread] [next in thread] 

List:       helix-datatype-cvs
Subject:    [Datatype-cvs] mp4/payload mp4gpyld.cpp,1.17,1.17.20.1
From:       yuxinliu () helixcommunity ! org
Date:       2012-12-18 4:04:40
[Download RAW message or body]

Update of /cvsroot/datatype/mp4/payload
In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv22082

Modified Files:
      Tag: PRODUCER_14_1
	mp4gpyld.cpp 
Log Message:
Synopsis
========
This CR fix bug HLXPROD-27 Failed to Pass through both Audio&Video while receiving \
the stream from IP Camera.

Branch : PRODUCER_14_0_RN, PRODUCER_14_1_RN 

Review: Pending

Repro Steps:
1. Setup the IP Camere, we have 2 cameras now 2. Encode the stream from the IP camera \
with Pass through mode r

Root cause:
Now HMP only support pass through audio/MP4A-LATM. The audio of IP camera is \
audio/mpeg4-generic, so HMP will faile.

My solution:
Add new depacketizer for audio/mpeg4-generic.

Files affected:
=========
client/build/BIF/PRODUCER_14_1.bif
datatype/tools/dtdriver/decoder/common/decslcfn.cpp
producerapps_rn/installer/producer/make_tempdir
datatype/mp4/payload/mp4gpyld.cpp
datatype/mp4/payload/pub/mp4gpyld.h

Create new folder mp4gdepacketizer in datatype\mp4\audio.
	
Testing Performed:
================
Unit Tests:
1
Command: producer.exe -j PassThrough.VideoPass.xml Expect result: Create output.mp4.
Actual result: Yes. 


Unit Tests: None
Leak Tests: None
Performance Tests: N/A

Platforms Tested: win32-i386-vc9

Builds Verified: win32-i386-vc9

QA Hints
no



Index: mp4gpyld.cpp
===================================================================
RCS file: /cvsroot/datatype/mp4/payload/mp4gpyld.cpp,v
retrieving revision 1.17
retrieving revision 1.17.20.1
diff -u -d -r1.17 -r1.17.20.1
--- mp4gpyld.cpp	9 Oct 2009 16:23:01 -0000	1.17
+++ mp4gpyld.cpp	18 Dec 2012 04:04:32 -0000	1.17.20.1
@@ -79,6 +79,10 @@
 #include "sdptools.h"
 #include "mp4gpyld.h"
 
+#if MP4_DEPACK_IHXPACKET
+#include "mp4atoms.h"
+#include "aacconstants.h"
+#endif
 
 MP4GPayloadFormat::MP4GPayloadFormat()
     : m_lRefCount	    (0)
@@ -105,6 +109,7 @@
     , m_ulSamplesPerSecond  (1000)
     , m_ulRTPSamplesPerSecond(0)
     , m_ulAUDuration	    (0)
+    , m_usStreamNumber(MAX_UINT16)
 {
     ;
 }
@@ -397,10 +402,33 @@
 
     if (SUCCEEDED(retVal))
     {
-	m_pStreamHeader->GetPropertyULONG32("SamplesPerSecond",
-					    m_ulRTPSamplesPerSecond);
+        m_pStreamHeader->GetPropertyULONG32("SamplesPerSecond",
+                                            m_ulRTPSamplesPerSecond);
+    }
+
+#ifdef MP4_DEPACK_IHXPACKET
+    if (SUCCEEDED(retVal))
+    {
+         m_pStreamHeader->SetPropertyULONG32("SamplesPerSecond",
+             m_ulSamplesPerSecond);
     }
 
+    if (SUCCEEDED(retVal) &&
+        (strcasecmp(pMimeTypeData, "audio/mpeg4-generic") == 0))
+    {
+        UINT32 ulFrameDurationInMS = (eAACMaxFrameDurationInSamples * 1000) / \
m_ulRTPSamplesPerSecond; +        SetAUDuration(ulFrameDurationInMS);
+
+        //Set Outgoing Mime-Type
+        IHXBuffer* pMimeBuf = NULL;
+        m_pClassFactory->CreateInstance(IID_IHXBuffer, (void**)&pMimeBuf);
+        pMimeBuf->Set((const UCHAR*)"audio/X-RN-MP4-RAWAU", \
strlen("audio/X-RN-MP4-RAWAU") + 1); +        \
m_pStreamHeader->SetPropertyCString("MimeType", pMimeBuf); +        \
HX_RELEASE(pMimeBuf); +    }
+#endif //MP4_DEPACK_IHXPACKET
+
+
     HX_RELEASE(pMimeType);
 
     return retVal;
@@ -577,15 +605,81 @@
 		}
 	    }
 
-	    if (SUCCEEDED(retVal))
-	    {
-		m_pConfig = pConfigBuffer;
+        if (SUCCEEDED(retVal))
+        {
+            m_pConfig = pConfigBuffer;
 
-		if (m_pConfig)
-		{
-		    m_pConfig->AddRef();
-		}
-	    }
+            if (m_pConfig)
+            {
+                m_pConfig->AddRef();
+#if MP4_DEPACK_IHXPACKET                              
+                ULONG32 ulAudioConfigSize;
+                IHXBuffer* pBuffer = NULL;
+
+                ulAudioConfigSize = m_pConfig->GetSize();               
+                
+                retVal = pClassFactory->CreateInstance(CLSID_IHXBuffer, \
(void**)&pBuffer); +                if (SUCCEEDED(retVal))
+                {
+                    pBuffer->SetSize(ulAudioConfigSize);
+                    memcpy(pBuffer->GetBuffer(), m_pConfig->GetBuffer(), \
ulAudioConfigSize); +                    \
pStreamHeader->SetPropertyBuffer("AudioSpecificConfig", pBuffer); +                }  \
 +
+                //Set OpaqueData
+                IHXBuffer* pIOpaqueDataBuffer = NULL;
+                IHXBuffer* pDecoderSpecificConfig = pBuffer;
+                retVal = pClassFactory->CreateInstance(CLSID_IHXBuffer, (void**) \
&pIOpaqueDataBuffer); +                
+                if(SUCCEEDED(retVal))
+                {
+                    UINT32 ulBitrate = 0;
+                    retVal = pStreamHeader->GetPropertyULONG32("AvgBitRate", \
ulBitrate); +                    //What we get from the encoding codec, is just the \
ASC. This needs +                    //to be wrapped in an ESD before it is sent \
along. +                    CMP4Atom_esds* pESDAtom = new CMP4Atom_esds();
+                    
+                    if(pESDAtom)
+                    {
+                        pESDAtom->SetObjectType(CMP4Atom_esds::OTI_Audio_14496_3);
+                        pESDAtom->SetStreamType(CMP4Atom_esds::ST_AudioStream);
+                        pESDAtom->SetAvgBitrate( ulBitrate );
+                        pESDAtom->SetMaxBitrate( ulBitrate );
+                        pESDAtom->SetBufferSizeDB( 6 * 1024 ); //XXXgfw ?? Taken \
from mp4 file writer. +                        \
pESDAtom->SetDecoderSpecificInfo(pDecoderSpecificConfig->GetBuffer(), \
pDecoderSpecificConfig->GetSize()); +                        
+                        UINT32 ulAtomSize = pESDAtom->GetCurrentSize();
+                        UCHAR* pBuf      = new UCHAR[ulAtomSize];
+                        if(pBuf)
+                        {
+                            UCHAR* pTmp = pBuf;
+                            //Remember, WriteToBuffer gets incremented.
+                            retVal = pESDAtom->WriteToBuffer( pTmp );
+                            
+                            //Need to strip off the Atom and Version info that the \
ESD Atom +                            //writes out, the rest is the raw ESD that we \
need to pass up the +                            //line. The length of the lead in \
bytes, 12, never changes. +                            const int knLeadInBytes = 12;
+                            if(SUCCEEDED(retVal))
+                            {
+                                \
pIOpaqueDataBuffer->SetSize(ulAtomSize-knLeadInBytes); +                              \
pTmp = pIOpaqueDataBuffer->GetBuffer(); +                                memcpy( \
pTmp, pBuf+knLeadInBytes, ulAtomSize-knLeadInBytes); +                            }
+                        }
+                        HX_VECTOR_DELETE(pBuf);
+                    }
+                    HX_DELETE(pESDAtom);
+                }
+                if(SUCCEEDED(retVal))
+                {
+                    retVal = pStreamHeader->SetPropertyBuffer( "OpaqueData", \
pIOpaqueDataBuffer ); +                }        
+                HX_RELEASE( pIOpaqueDataBuffer );
+                HX_RELEASE(pBuffer);  
+#endif //HELIX_FEATURE_SERVER
+            }
+        }
 
 	    HX_RELEASE(pConfigBuffer);
 	}
@@ -632,53 +726,58 @@
 
     if (!m_bRTPPacketTested)
     {
-	IHXRTPPacket* pRTPPacket = NULL;
+    	IHXRTPPacket* pRTPPacket = NULL;
 
-	m_bUsesRTPPackets = (pPacket->QueryInterface(
-				IID_IHXRTPPacket,
-				(void**) &pRTPPacket)
-			    == HXR_OK);
+    	m_bUsesRTPPackets = (pPacket->QueryInterface(
+    				IID_IHXRTPPacket,
+    				(void**) &pRTPPacket)
+    			    == HXR_OK);
 
-	m_bRTPPacketTested = TRUE;
+    	m_bRTPPacketTested = TRUE;
 
-	HX_RELEASE(pRTPPacket);
+    	HX_RELEASE(pRTPPacket);
 
-	if (m_bUsesRTPPackets)
-	{
-	    if (m_ulRTPSamplesPerSecond == 0)
-	    {
-		m_ulRTPSamplesPerSecond = m_ulSamplesPerSecond;
-	    }
+    	if (m_bUsesRTPPackets)
+    	{
+    	    if (m_ulRTPSamplesPerSecond == 0)
+    	    {
+    		m_ulRTPSamplesPerSecond = m_ulSamplesPerSecond;
+    	    }
 
-	    HX_ASSERT(m_ulSamplesPerSecond != 0);
-	}
-	else
-	{
-	    m_ulRTPSamplesPerSecond = 1000; // RDT time stamp
-	}
+    	    HX_ASSERT(m_ulSamplesPerSecond != 0);
+    	}
+    	else
+    	{
+    	    m_ulRTPSamplesPerSecond = 1000; // RDT time stamp
+    	}
 
-	m_TSConverter.SetBase(m_ulRTPSamplesPerSecond,
-			      m_ulSamplesPerSecond);
+    	m_TSConverter.SetBase(m_ulRTPSamplesPerSecond,
+    			      m_ulSamplesPerSecond);
+    }
+
+    if(m_usStreamNumber == MAX_UINT16)
+    {
+        m_usStreamNumber = pPacket->GetStreamNumber();
     }
 
     if (m_bPacketize)
     {
-	retVal = SetPacketizerPacket(pPacket);
+	    retVal = SetPacketizerPacket(pPacket);
     }
     else
     {
-	retVal = SetAssemblerPacket(pPacket);
+	    retVal = SetAssemblerPacket(pPacket);
     }
 
     if (retVal == HXR_OK)
     {
-	// Add this packet to our list of input packets
-	pPacket->AddRef();
-	m_InputQueue.AddTail(pPacket);
+    	// Add this packet to our list of input packets
+    	pPacket->AddRef();
+    	m_InputQueue.AddTail(pPacket);
     }
     else if (retVal == HXR_NO_DATA)
     {
-	retVal = HXR_OK;
+	    retVal = HXR_OK;
     }
 
     return retVal;
@@ -749,6 +848,52 @@
 {
     HX_RESULT retVal = HXR_NOTIMPL;
 
+#ifdef MP4_DEPACK_IHXPACKET
+    retVal = HXR_OK;
+    CMediaPacket* pMediaPacket = NULL;
+    IHXBuffer* pBuffer = NULL;
+    
+    retVal = CreateMediaPacket(pMediaPacket);
+
+    if (HXR_OK == retVal && pMediaPacket)
+    {
+        retVal = m_pClassFactory->CreateInstance(CLSID_IHXBuffer, (void \
**)&pBuffer); +
+        if (SUCCEEDED(retVal) && pBuffer)
+        {
+            retVal = pBuffer->Set(pMediaPacket->m_pData, \
pMediaPacket->m_ulDataSize); +        }
+
+        if (SUCCEEDED(retVal))
+        {
+            if(m_bUsesRTPPackets)
+            {
+                retVal = m_pClassFactory->CreateInstance(CLSID_IHXRTPPacket, (void \
**)&pOutPacket); +
+                ((IHXRTPPacket*)pOutPacket)->SetRTP(pBuffer,
+                                                    pMediaPacket->m_ulTime,
+                                                    pMediaPacket->m_ulTime,
+                                                    m_usStreamNumber,
+                                                    \
HX_ASM_SWITCH_ON|HX_ASM_SWITCH_OFF, +                                                 \
m_usBaseRule + 1); +            }
+            else
+            {
+                retVal = m_pClassFactory->CreateInstance(CLSID_IHXPacket, (void \
**)&pOutPacket); +
+                pOutPacket->Set(pBuffer,
+                                pMediaPacket->m_ulTime,
+                                m_usStreamNumber,
+                                HX_ASM_SWITCH_ON|HX_ASM_SWITCH_OFF,
+                                m_usBaseRule + 1);
+            }
+        }
+
+        HX_RELEASE(pBuffer);
+        CMediaPacket::DeletePacket(pMediaPacket);
+    }
+#endif //MP4_DEPACK_IHXPACKET
+
     return retVal;
 }
 


_______________________________________________
Datatype-cvs mailing list
Datatype-cvs@helixcommunity.org
http://lists.helixcommunity.org/mailman/listinfo/datatype-cvs


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic