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

List:       helix-datatype-cvs
Subject:    [Datatype-cvs] tools/dtdriver/decoder/common decslcfn.cpp, 1.16, 1.16.128.1
From:       yuxinliu () helixcommunity ! org
Date:       2012-07-20 7:48:43
[Download RAW message or body]

Update of /cvsroot/datatype/tools/dtdriver/decoder/common
In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv11096

Modified Files:
      Tag: PRODUCER_14_0_RN
	decslcfn.cpp 
Log Message:
Synopsis
========
This CR implement Pass through feature for producer.

Branch : PRODUCER_14_0_RN
Suggested by Sujeet

Description:
==========
The most of IP camera support H.264 video encoding from the camera. In this case, HMP \
doesn't need to transcode it again.  It saves system resource and content quality.  \
If RTSP stream source has H.264/AAC codec, HMP pass through encoded data.

This CR support pass through all input stream at the same time. This CR never support \
pass through one stream and encoder another stream.

My solution:
1 Add two option in input: "PassThroughVideo" and "PassThroughAudio", their default \
value are false. Customer can set PassThroughVideo=true and PassThroughAudio=true to \
enable pass through. If the input video stream is h.264 and audio stream is AAC, and \
the PassThroughVideo and PassThroughAudio are true, HMP will pass through the input \
stream.

2 If pass through is enable, HMP will create a pass through pipeline, like the \
following:

Input filter(Dtdriver-> depacketizer->dtdrreader) ==>packetizer filter==> packetizer \
asm mux filter ==> destination filter(rbs)

Input filter(Dtdriver-> depacketizer->dtdrreader) ==>unpacketizer asm mux filter ==> \
destination filter(file write)

3 Implement audio depacketizer and video depacketizer plug-in so that Dtdriver \
plug-in can depacketizer H264 and AAC stream. 264depacketizer.rar and \
aacdepacketizer.rar are source code of the new depacketizer plug-in. Path of the two \
plug-in are: datatype\mp4\audio\aacdepacketizer.
datatype\mp4\video\264depacketizer.

4 Implement new class CAudioSourceDepacketizer in source file adepacker.cpp and \
adepacker.h. Dtdriver plug-in will through class CAudioSourceDepacketizer to search \
audio depacketizer plug-in, and depacketize input stream.

5 I add a new macro HELIX_FEATURE_PASS_THROUGH into source file h264pyld.cpp and \
mp4apyld.cpp so that Passthrough feature can share source file with other feature. I \
define macro HELIX_FEATURE_PASS_THROUGH at Umakefil of 264depacketizer folder and \
aacdepacketizer folder.

Files affected:
=========
datatype/mp4/payload/h264pyld.cpp
datatype/mp4/payload/mp4apyld.cpp
client_rn/encodesvc/plugins/input/dtdrreader/hxdtdrreader.cpp
client_rn/encodesvc/plugins/input/dtdrreader/hxdtdrreader.h
client_rn/encodesvc/plugins/input/dtdrreader/hxdtdrservice.cpp
client/encodesvc/include/ihxtconstants.h
producerapps/installer/root/xmlschemas/job.3.0.xsd
datatype/tools/dtdriver/decoder/audio/Umakefil
datatype/tools/dtdriver/decoder/common/decslcfn.cpp
datatype/tools/dtdriver/decoder/common/pub/decslcfn.h
datatype/tools/dtdriver/decoder/video/vdepacker.cpp
client/encodesvc/engine/encpipeline/inputpipeline.cpp
client/encodesvc/engine/encpipeline/outputpipeline.cpp
client/encodesvc/engine/encpipeline/outputpipeline.h
client/encodesvc/engine/encsession/inputsource.cpp
client/build/BIF/PRODUCER_14.bif
producerapps_rn/installer/producer/make_tempdir

Testing Performed:
================
Unit Tests:
1. enable pass through by set PassThroughVideo="true", PassThroughVideo="true"
Input: only one audio stream, type is AAC.
Output: save as a MP4 file.
Expected: HMP never decode and encode the input stream, just pass through it.
Real result: Yes

2. enable pass through by set PassThroughVideo="true", PassThroughVideo="true"
Input: only one video stream, type is  H264.
Output: save as a MP4 file.
Expected: HMP never decode and encode the input stream, just pass through it.
Real result: Yes

3. enable pass through by set PassThroughVideo="true", PassThroughVideo="true"
Input: two input stream, video is H264, audio is AAC
Output: save as a MP4 file.
Expected: HMP never decode and encode the input stream, just pass through it.
Real result: Yes

4. enable pass through by set PassThroughVideo="true", PassThroughVideo="true"
Input: two input stream, video is H264, audio is AAC
Output: RBS.
Expected: HMP never decode and encode the input stream, just pass through it to \
server. Real result: Yes. But there are some warning message.

5. disable pass through by set PassThroughVideo="false", PassThroughVideo="false"
Input: two input stream, video is H264, audio is AAC
Output: save as a MP4 file.
Expected: HMP will decode and encode the input stream.
Real 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: decslcfn.cpp
===================================================================
RCS file: /cvsroot/datatype/tools/dtdriver/decoder/common/decslcfn.cpp,v
retrieving revision 1.16
retrieving revision 1.16.128.1
diff -u -d -r1.16 -r1.16.128.1
--- decslcfn.cpp	14 Mar 2005 19:24:55 -0000	1.16
+++ decslcfn.cpp	20 Jul 2012 07:46:39 -0000	1.16.128.1
@@ -57,11 +57,17 @@
 #include "adecoder.h"
 #include "vdecoder.h"
 #include "vdepacker.h"
+#include "adepacker.h"
+
 
 
 #include "hxccf.h"
 #include "packedvalues.h"
 
+#define PASSTHROUGH_AUDIO_TYPE	"audio/MP4A-LATM"
+#define PASSTHROUGH_VIDEO_TYPE	"video/H264"
+
+
 HX_RESULT CSourceDecoderSelector::CreateHandler(IHXSourceHandler** pDecoderOut,
 					       IHXValues* pSourceFileHeader,
 					       IHXValues* pSourceStreamHeader,
@@ -220,6 +226,18 @@
 	    {
 		bDecoderPassThrough = TRUE;
 	    }
+        else if (ulDecodeVideoMode == DECODE_OPTION_MODE_DEPACK)
+        {
+            if(!strcasecmp(pMimeType, PASSTHROUGH_AUDIO_TYPE))
+            {
+                retVal = CreateAudioDepacker(&pDecoder, pContext);
+            }
+            else
+            {
+                ::ReportError(pContext, HXR_NOTIMPL, "Audio type never support pass \
through"); +                retVal = HXR_FAIL;
+            }
+        }
 	    else if (!bDecoderPassThrough)
 	    {
 		retVal = CreateAudioDecoder(&pDecoder, pContext);
@@ -236,10 +254,18 @@
 	    {
 		bDecoderPassThrough = TRUE;
 	    }
-	    else if (ulDecodeVideoMode == DECODE_OPTION_MODE_DEPACK)
-	    {
-		retVal = CreateVideoDepacker(&pDecoder, pContext);
-	    }
+        else if (ulDecodeVideoMode == DECODE_OPTION_MODE_DEPACK)
+        {
+            if(!strcasecmp(pMimeType, PASSTHROUGH_VIDEO_TYPE))
+            {
+                retVal = CreateVideoDepacker(&pDecoder, pContext);
+            }
+            else
+            {
+                ::ReportError(pContext, HXR_NOTIMPL, "Audio type never support pass \
through"); +                retVal = HXR_FAIL;
+            }
+        }
 	    else if (!bDecoderPassThrough)
 	    {
 		retVal = CreateVideoDecoder(&pDecoder, pContext);
@@ -328,6 +354,18 @@
 #endif	// HELIX_FEATURE_DTDR_VIDEO_DEPACKER
 }
 
+HX_RESULT CSourceDecoderSelector::CreateAudioDepacker(IHXSourceHandler** ppDecoder, \
IUnknown* pContext) +{
+#if defined(HELIX_FEATURE_DTDR_VIDEO_DEPACKER)
+    return CAudioSourceDepacketizer::Create(ppDecoder, pContext);
+#else	// HELIX_FEATURE_DTDR_VIDEO_DEPACKER
+    ::ReportError(pContext, HXR_NOTIMPL, "Audio depacker support missing");
+
+    return HXR_FAIL;
+#endif	// HELIX_FEATURE_DTDR_VIDEO_DEPACKER
+}
+
+
 HX_RESULT CSourceDecoderSelector::CreateDecoderByMimeType(IHXSourceHandler** \
ppDecoder, IUnknown* pContext, const char* pMimeType)  {
     *ppDecoder = NULL;


_______________________________________________
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