[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