From b4c22313c0ba28bb4b4f4dad4f0a28c2161cf6d2 Mon Sep 17 00:00:00 2001
From: houxiao <houxiao@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期二, 28 二月 2017 14:36:00 +0800
Subject: [PATCH] add amcd

---
 RtspFace/main.cpp                             |   73 +++++---
 RtspFace/live555/config.android               |   13 +
 RtspFace/Logger/src/logger.hpp                |    1 
 RtspFace/PL_H264Encoder.h                     |    1 
 RtspFace/PL_AVFrameBGRA.h                     |   15 +
 RtspFace/make.sh                              |    3 
 RtspFace/PL_H264Decoder.cpp                   |    1 
 RtspFace/PL_AndroidMediaCodecDecoder.cpp      |  193 +++++++++++++++++++++
 RtspFace/PL_H264Encoder.cpp                   |    9 
 RtspFace/logger.h                             |   12 
 RtspFace/Logger/src/logger.cc                 |   12 +
 RtspFace/live555/testProgs/testRTSPClient.hpp |    6 
 RtspFace/PL_AVFrameBGRA.cpp                   |  107 +++++++++--
 RtspFace/PL_AndroidMediaCodecDecoder.h        |   63 +++++++
 14 files changed, 445 insertions(+), 64 deletions(-)

diff --git a/RtspFace/Logger/src/logger.cc b/RtspFace/Logger/src/logger.cc
index 06748f2..c956b21 100644
--- a/RtspFace/Logger/src/logger.cc
+++ b/RtspFace/Logger/src/logger.cc
@@ -14,6 +14,11 @@
 
 #include "logger.hpp"
 
+#ifdef __ANDROID__
+#define LOG_TAG "logger"
+#include <android/log.h>
+#endif
+
 Logger::Logger(std::ostream& s) : _file(), 
 				_log(s),
 				_level(INFO),
@@ -71,6 +76,11 @@
 {
     if (_line_level >= _level) {
 		_log << get_time() << " -- [" << level_str(_line_level) << "] -- " << str();
+#ifdef __ANDROID__
+        std::stringstream& _log_ss(static_cast<std::stringstream&>(_log));
+		__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, "%s", _log_ss.str().c_str());//#todo level convert
+        _log_ss.str("");
+#endif
 		if (_file.is_open())
 			_log.flush();
     }
@@ -121,6 +131,8 @@
 	return ("DBG");
     case INFO:
 	return ("INF");
+	case NOTICE:
+	return ("NOT");
     case WARNING:
 	return ("WRN");
     case ERROR:
diff --git a/RtspFace/Logger/src/logger.hpp b/RtspFace/Logger/src/logger.hpp
index a39cea1..3c3eb14 100644
--- a/RtspFace/Logger/src/logger.hpp
+++ b/RtspFace/Logger/src/logger.hpp
@@ -27,6 +27,7 @@
   VERBOSE = 0,
   DEBUG,
   INFO,
+  NOTICE,
   WARNING,
   ERROR,
   CRITICAL
diff --git a/RtspFace/PL_AVFrameBGRA.cpp b/RtspFace/PL_AVFrameBGRA.cpp
index 816a3db..addb967 100644
--- a/RtspFace/PL_AVFrameBGRA.cpp
+++ b/RtspFace/PL_AVFrameBGRA.cpp
@@ -20,9 +20,12 @@
 
 	bool payError;
 	
+	PL_AVFrameBGRA_Config config;
+	
 	PL_AVFrameBGRA_Internal() : 
 		buffSize(0), buffSizeMax(sizeof(buffer)), lastFrame(), 
-		payError(true)
+		payError(true),
+		config()
 	{
 	}
 	
@@ -37,6 +40,9 @@
 		
 		MB_Frame _lastFrame;
 		lastFrame = _lastFrame;
+		
+		PL_AVFrameBGRA_Config _config;
+		config = _config;
 	}
 };
 
@@ -59,6 +65,12 @@
 {
 	PL_AVFrameBGRA_Internal* in = (PL_AVFrameBGRA_Internal*)internal;
 	in->reset();
+	
+	if (args != nullptr)
+	{
+		PL_AVFrameBGRA_Config* _config = (PL_AVFrameBGRA_Config*)args;
+		in->config = *_config;
+	}
 
 	return true;
 }
@@ -84,46 +96,103 @@
 	if (pm.buffer == nullptr)
 		return false;
 	
+	int src_height = 0;
+	int src_width = 0;
+	const uint8* src_y = nullptr;
+	const uint8* src_u = nullptr;
+    const uint8* src_v = nullptr;
+	
 	MB_Frame* frame = (MB_Frame*)pm.buffer;
-	if (frame->type != MB_Frame::MBFT_PTR_AVFRAME)
+	if (frame->type == MB_Frame::MBFT_PTR_AVFRAME)
+	{
+		AVFrame* pAVFrame = (AVFrame*)frame->buffer;
+		if (pAVFrame == nullptr)
+			return false;
+		
+		src_height = pAVFrame->height;
+		src_width = pAVFrame->width;
+		
+		src_y = pAVFrame->data[0];
+		src_u = pAVFrame->data[1];
+		src_v = pAVFrame->data[2];
+	}
+	if (frame->type == MB_Frame::MBFT_YUV420)
+	{
+		if (frame->buffer == nullptr)
+			return false;
+		
+		src_height = frame->height;
+		src_width = frame->width;
+		
+		src_y = (const uint8*)(frame->buffer);
+		src_u = (const uint8*)(src_y + (src_height * src_width));
+		src_v = (const uint8*)(src_u + (src_height * src_width / 4));
+	}
+	else
 	{
 		LOG_ERROR << "Only support MBFT_PTR_AVFRAME" << std::endl;
 		return false;
 	}
 
-	AVFrame* pAVFrame = (AVFrame*)frame->buffer;
-	if (pAVFrame == nullptr)
-		return false;
-
-	const int height = pAVFrame->height;
-	const int width = pAVFrame->width;
-
 //int I420ToBGRA(const uint8* src_y, int src_stride_y,
 //               const uint8* src_u, int src_stride_u,
 //               const uint8* src_v, int src_stride_v,
 //               uint8* dst_argb, int dst_stride_argb,
-//			   int width, int height);
+//			   int width, int src_height);
 
-	libyuv::I420ToBGRA(pAVFrame->data[0], width, 
-						pAVFrame->data[1], SUBSAMPLE(width, 2), 
-						pAVFrame->data[2], SUBSAMPLE(width, 2), 
-						in->buffer, 4 * width, 
-						width, height);
+	if (in->config.convertTo == PL_AVFrameBGRA_Config::I420_TO_BGRA8888)
+	{
+		libyuv::I420ToBGRA(src_y, src_width, 
+							src_u, SUBSAMPLE(src_width, 2), 
+							src_v, SUBSAMPLE(src_width, 2), 
+							in->buffer, 4 * src_width, 
+							src_width, src_height);
 
-	in->buffSize = in->buffSizeMax;
+		in->buffSize = src_width * src_height * 4; // #todo use ret value?
+	}
+	else if (in->config.convertTo == PL_AVFrameBGRA_Config::I420_TO_ARGB8888)
+	{
+		libyuv::I420ToARGB(src_y, src_width, 
+							src_u, SUBSAMPLE(src_width, 2), 
+							src_v, SUBSAMPLE(src_width, 2), 
+							in->buffer, 4 * src_width, 
+							src_width, src_height);
+
+		in->buffSize = src_width * src_height * 4; // #todo use ret value?
+	}
+	else if (in->config.convertTo == PL_AVFrameBGRA_Config::I420_TO_ARGB8888)
+	{
+		libyuv::I420ToARGB(src_y, src_width, 
+							src_u, SUBSAMPLE(src_width, 2), 
+							src_v, SUBSAMPLE(src_width, 2), 
+							in->buffer, 4 * src_width, 
+							src_width, src_height);
+
+		in->buffSize = src_width * src_height * 4; // #todo use ret value?
+	}
+	else if (in->config.convertTo == PL_AVFrameBGRA_Config::I420_TO_ARGB4444)
+	{
+		
+	}
+	else
+	{
+		LOG_ERROR << "PL_AVFrameBGRA_Config.convertTo not support" << std::endl;
+		return false;
+	}
+
 	//in->buffer readly
 	
 	in->lastFrame.type = MB_Frame::MBFT_BGRA;
 	in->lastFrame.buffer = in->buffer;
 	in->lastFrame.buffSize = in->buffSize;
-	in->lastFrame.width = width;
-	in->lastFrame.height = height;
+	in->lastFrame.width = src_width;
+	in->lastFrame.height = src_height;
 	in->lastFrame.pts = frame->pts;
 
 	//#test
 	//static size_t f=0;
 	//char fname[50];
-	//sprintf(fname, "%u.bgra", ++f);
+	//sprintf(fname, "%u.argb", ++f);
 	//FILE * pFile = fopen (fname,"wb");
 	//fwrite (in->buffer , sizeof(char), in->buffSize, pFile);
 	//fclose(pFile);
diff --git a/RtspFace/PL_AVFrameBGRA.h b/RtspFace/PL_AVFrameBGRA.h
index 19c1381..ad130bd 100644
--- a/RtspFace/PL_AVFrameBGRA.h
+++ b/RtspFace/PL_AVFrameBGRA.h
@@ -3,6 +3,21 @@
 
 #include "PipeLine.h"
 
+struct PL_AVFrameBGRA_Config
+{
+	enum
+	{
+		I420_TO_BGRA8888,
+		I420_TO_ARGB8888,
+		I420_TO_ARGB4444,
+		I420_TO_RGB565
+	} convertTo;
+	
+	PL_AVFrameBGRA_Config() : convertTo(I420_TO_BGRA8888)
+	{
+	}
+};
+
 class PL_AVFrameBGRA : public PipeLineElem
 {
 public:
diff --git a/RtspFace/PL_AndroidMediaCodecDecoder.cpp b/RtspFace/PL_AndroidMediaCodecDecoder.cpp
new file mode 100644
index 0000000..23ed474
--- /dev/null
+++ b/RtspFace/PL_AndroidMediaCodecDecoder.cpp
@@ -0,0 +1,193 @@
+#include "PL_AndroidMediaCodecDecoder.h"
+#include "MaterialBuffer.h"
+#include "logger.h"
+
+struct PL_AMCD_Internal
+{
+	uint8_t buffer[1920*1080*4];//#todo from config
+	size_t buffSize;
+	size_t buffSizeMax;
+	MB_Frame lastFrame;
+	PL_AndroidMediaCodecDecoder_Config config;
+
+	bool payError;
+	
+	AMediaCodec* codec;
+	
+	PL_AMCD_Internal() : 
+		buffSize(0), buffSizeMax(sizeof(buffer)), lastFrame(), 
+		config(), 
+		payError(true),
+		codec(nullptr)
+	{
+	}
+	
+	~PL_AMCD_Internal()
+	{
+	}
+	
+	void reset()
+	{
+		buffSize = 0;
+		payError = true;
+		
+		MB_Frame _lastFrame;
+		lastFrame = _lastFrame;
+		
+		PL_AndroidMediaCodecDecoder_Config _config;
+		config = _config;
+		
+		codec = nullptr;
+	}
+};
+
+PipeLineElem* create_PL_AndroidMediaCodecDecoder()
+{
+	return new PL_AndroidMediaCodecDecoder;
+}
+
+PL_AndroidMediaCodecDecoder::PL_AndroidMediaCodecDecoder() : internal(new PL_AMCD_Internal)
+{
+}
+
+PL_AndroidMediaCodecDecoder::~PL_AndroidMediaCodecDecoder()
+{
+	delete (PL_AMCD_Internal*)internal;
+	internal= nullptr;
+}
+
+bool PL_AndroidMediaCodecDecoder::init(void* args)
+{
+	PL_AMCD_Internal* in = (PL_AMCD_Internal*)internal;
+	in->reset();
+
+	PL_AndroidMediaCodecDecoder_Config* config = (PL_AndroidMediaCodecDecoder_Config*)args;
+	in->config = *config;
+
+    AMediaFormat* format = AMediaFormat_new();
+
+    AMediaFormat_setString(format, AMEDIAFORMAT_KEY_MIME, config.ak_mime.c_str());
+    AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_HEIGHT, config.ak_height);
+    AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_WIDTH, config.ak_width);
+
+    // should like:
+    // mime: string(video/avc), durationUs: int64(10000000), width: int32(480), height: int32(360), max-input-size: int32(55067), csd-0: data, csd-1: data}
+    LOG_INFO << "AMediaFormat_toString: " << AMediaFormat_toString(format) << LOG_ENDL;
+
+    in->codec = AMediaCodec_createDecoderByType(config.ak_mime.c_str());
+    if (AMediaCodec_configure(in->codec, format, data.window, NULL, 0) != AMEDIA_OK)
+        LOG_ERROR << "AMediaCodec_configure error" << LOG_ENDL;
+
+    if (AMediaCodec_start(in->codec) != AMEDIA_OK)
+        LOG_ERROR << "AMediaCodec_start error" << LOG_ENDL;
+
+    AMediaFormat_delete(format);
+
+	return true;
+}
+
+void PL_AndroidMediaCodecDecoder::finit()
+{
+	PL_AMCD_Internal* in = (PL_AMCD_Internal*)internal;
+	//todo release codec
+}
+
+bool PL_AndroidMediaCodecDecoder::pay(const PipeMaterial& pm)
+{
+	PL_AMCD_Internal* in = (PL_AMCD_Internal*)internal;
+	
+	if (pm.type != PipeMaterial::PMT_FRAME)
+	{
+		LOG_ERROR << "Only support PMT_FRAME" << std::endl;
+		return false;
+	}
+	
+	if (pm.buffer == nullptr)
+		return false;
+	
+	MB_Frame* frame = (MB_Frame*)pm.buffer;
+	if (frame->type != MB_Frame::MBFT_H264_NALU)
+	{
+		LOG_ERROR << "Only support MBFT_H264_NALU" << std::endl;
+		return false;
+	}
+	
+	
+	
+	
+    ssize_t bufidx = AMediaCodec_dequeueInputBuffer(in->codec, 2000);
+    static int framecount = 0;
+    LOGP(DEBUG, "input buffer bufidx=%zd, framecount=%d", bufidx, framecount++);
+
+    if (bufidx >= 0)
+	{
+        size_t bufsize;
+        uint8_t* buf = AMediaCodec_getInputBuffer(in->codec, bufidx, &bufsize);
+        size_t sampleSize = std::min(bufsize, frame->buffSize);
+        memcpy(buf, buffer, sampleSize);
+        //auto sampleSize = AMediaExtractor_readSampleData(d->ex, buf, bufsize);
+        //if (sampleSize < 0) {
+        //    sampleSize = 0;
+        //    d->sawInputEOS = true;
+        //    LOGV("EOS");
+        //}
+        //auto presentationTimeUs = AMediaExtractor_getSampleTime(d->ex);
+        uint64_t presentationTimeUs = presentationTime.tv_sec * 1000 * 1000 + presentationTime.tv_usec; //microseconds
+
+        media_status_t ms = AMediaCodec_queueInputBuffer(data.codec, bufidx, 0, sampleSize, presentationTimeUs, 0);
+        //LOGV("media_status_t=%d", ms);
+        //AMediaExtractor_advance(d->ex);
+    }
+	
+	
+//
+//	AVFrame* pAVFrame = (AVFrame*)frame->buffer;
+//	if (pAVFrame == nullptr)
+//		return false;
+//
+//	const int height = pAVFrame->height;
+//	const int width = pAVFrame->width;
+//
+////int I420ToBGRA(const uint8* src_y, int src_stride_y,
+////               const uint8* src_u, int src_stride_u,
+////               const uint8* src_v, int src_stride_v,
+////               uint8* dst_argb, int dst_stride_argb,
+////			   int width, int height);
+//
+//	libyuv::I420ToBGRA(pAVFrame->data[0], width, 
+//						pAVFrame->data[1], SUBSAMPLE(width, 2), 
+//						pAVFrame->data[2], SUBSAMPLE(width, 2), 
+//						in->buffer, 4 * width, 
+//						width, height);
+//
+//	in->buffSize = in->buffSizeMax;
+//	//in->buffer readly
+//	
+//	in->lastFrame.type = MB_Frame::MBFT_BGRA;
+//	in->lastFrame.buffer = in->buffer;
+//	in->lastFrame.buffSize = in->buffSize;
+//	in->lastFrame.width = width;
+//	in->lastFrame.height = height;
+//	in->lastFrame.pts = frame->pts;
+//
+//	//#test
+//	//static size_t f=0;
+//	//char fname[50];
+//	//sprintf(fname, "%u.bgra", ++f);
+//	//FILE * pFile = fopen (fname,"wb");
+//	//fwrite (in->buffer , sizeof(char), in->buffSize, pFile);
+//	//fclose(pFile);
+//
+	return true;
+}
+
+bool PL_AndroidMediaCodecDecoder::gain(PipeMaterial& pm)
+{
+	PL_AMCD_Internal* in = (PL_AMCD_Internal*)internal;
+
+	pm.type = PipeMaterial::PMT_FRAME;
+	pm.buffer = &(in->lastFrame);
+	pm.buffSize = 0;
+	pm.former = this;
+	return true;
+}
diff --git a/RtspFace/PL_AndroidMediaCodecDecoder.h b/RtspFace/PL_AndroidMediaCodecDecoder.h
new file mode 100644
index 0000000..98ef7ee
--- /dev/null
+++ b/RtspFace/PL_AndroidMediaCodecDecoder.h
@@ -0,0 +1,63 @@
+#ifndef _PL_ANDROIDMEDIACODECDECODER_H_
+#define _PL_ANDROIDMEDIACODECDECODER_H_
+
+#include "PipeLine.h"
+
+struct PL_AndroidMediaCodecDecoder_Config
+{
+	// D:\adk\ndk-bundle\platforms\android-21\arch-arm64\usr\include\media\NdkMediaFormat.h
+	// AMEDIAFORMAT_KEY_AAC_PROFILE;
+	// AMEDIAFORMAT_KEY_BIT_RATE;
+	// AMEDIAFORMAT_KEY_CHANNEL_COUNT;
+	// AMEDIAFORMAT_KEY_CHANNEL_MASK;
+	// AMEDIAFORMAT_KEY_COLOR_FORMAT;
+	// AMEDIAFORMAT_KEY_DURATION;
+	// AMEDIAFORMAT_KEY_FLAC_COMPRESSION_LEVEL;
+	// AMEDIAFORMAT_KEY_FRAME_RATE;
+	uint32_t ak_height; // AMEDIAFORMAT_KEY_HEIGHT;
+	// AMEDIAFORMAT_KEY_IS_ADTS;
+	// AMEDIAFORMAT_KEY_IS_AUTOSELECT;
+	// AMEDIAFORMAT_KEY_IS_DEFAULT;
+	// AMEDIAFORMAT_KEY_IS_FORCED_SUBTITLE;
+	// AMEDIAFORMAT_KEY_I_FRAME_INTERVAL;
+	// AMEDIAFORMAT_KEY_LANGUAGE;
+	// AMEDIAFORMAT_KEY_MAX_HEIGHT;
+	// AMEDIAFORMAT_KEY_MAX_INPUT_SIZE;
+	// AMEDIAFORMAT_KEY_MAX_WIDTH;
+	std::string ak_mime; // AMEDIAFORMAT_KEY_MIME; // video/avc
+	// AMEDIAFORMAT_KEY_PUSH_BLANK_BUFFERS_ON_STOP;
+	// AMEDIAFORMAT_KEY_REPEAT_PREVIOUS_FRAME_AFTER;
+	// AMEDIAFORMAT_KEY_SAMPLE_RATE;
+	uint32_t ak_width; // AMEDIAFORMAT_KEY_WIDTH;
+	// AMEDIAFORMAT_KEY_STRIDE;
+	
+	void* windowSurface;
+	
+	PL_AndroidMediaCodecDecoder_Config() : 
+		ak_height(0), 
+		ak_mime(), 
+		ak_width(0),
+
+		windowSurface(nullptr)
+	{}
+};
+
+class PL_AndroidMediaCodecDecoder : public PipeLineElem
+{
+public:
+	PL_AndroidMediaCodecDecoder();
+	virtual ~PL_AndroidMediaCodecDecoder();
+
+	virtual bool init(void* args);
+	virtual void finit();
+
+	virtual bool pay(const PipeMaterial& pm);
+	virtual bool gain(PipeMaterial& pm);
+	
+private:
+	void* internal;
+};
+
+PipeLineElem* create_PL_AndroidMediaCodecDecoder();
+
+#endif
diff --git a/RtspFace/PL_H264Decoder.cpp b/RtspFace/PL_H264Decoder.cpp
index 0391e6a..87d8735 100644
--- a/RtspFace/PL_H264Decoder.cpp
+++ b/RtspFace/PL_H264Decoder.cpp
@@ -200,6 +200,7 @@
 	}
 	else
 	{
+		//#todo  sps sps changing
 		LOG_WARN << "incomplete frame" << std::endl;
 		return false;
 	}
diff --git a/RtspFace/PL_H264Encoder.cpp b/RtspFace/PL_H264Encoder.cpp
index 2af9e3e..68c502c 100644
--- a/RtspFace/PL_H264Encoder.cpp
+++ b/RtspFace/PL_H264Encoder.cpp
@@ -18,8 +18,8 @@
 	resetPTS(false), 
 	bytesBufferImageWidth(0), bytesBufferImageHeight(0), 
 	avc_bit_rate(1*1024*1024*8), //1Mbit
-	avc_fps(25), avc_gop(25), avc_max_b_frames(0), avc_profile(FF_PROFILE_H264_MAIN), 
-	av_opt_preset("superfast"), av_opt_tune("")
+	avc_fps(25), avc_gop(25), avc_max_b_frames(0), avc_profile(FF_PROFILE_H264_BASELINE), 
+	av_opt_preset("superfast"), av_opt_tune(""), avc_profile_str("")
 {
 	// av_opt_tune: zerolatency
 }
@@ -135,13 +135,16 @@
     in->pAVCodecContext->time_base.den = in->config.avc_fps;
     in->pAVCodecContext->gop_size = in->config.avc_gop;
     in->pAVCodecContext->max_b_frames = in->config.avc_max_b_frames;
-	in->pAVCodecContext->profile = in->config.avc_profile;
     in->pAVCodecContext->pix_fmt = AV_PIX_FMT_YUV420P;
 	
 	if (!in->config.av_opt_preset.empty())
 		av_opt_set(in->pAVCodecContext->priv_data, "preset", in->config.av_opt_preset.c_str(), 0);
 	if (!in->config.av_opt_tune.empty())
 		av_opt_set(in->pAVCodecContext->priv_data, "tune", in->config.av_opt_tune.c_str(), 0);
+	if (!in->config.avc_profile_str.empty())
+		av_opt_set(in->pAVCodecContext->priv_data, "profile", in->config.avc_profile_str.c_str(), 0);
+	else
+		in->pAVCodecContext->profile = in->config.avc_profile;
 
 	if(avcodec_open2(in->pAVCodecContext, avCodec, NULL) >= 0)
 	{
diff --git a/RtspFace/PL_H264Encoder.h b/RtspFace/PL_H264Encoder.h
index e01f0af..c5c9c22 100644
--- a/RtspFace/PL_H264Encoder.h
+++ b/RtspFace/PL_H264Encoder.h
@@ -19,6 +19,7 @@
 
 	std::string av_opt_preset;
 	std::string av_opt_tune;
+	std::string avc_profile_str;
 	
 	PL_H264Encoder_Config();
 };
diff --git a/RtspFace/live555/config.android b/RtspFace/live555/config.android
index cca14b6..49594dd 100644
--- a/RtspFace/live555/config.android
+++ b/RtspFace/live555/config.android
@@ -7,14 +7,21 @@
 # $ make NDKROOT="$HOME/.local/share/android/android-ndk-r13b" TOOLCHAINPREFIX="$HOME/.local/share/android/android-ndk-r13b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-"
 # ```
 
-# set ARCH, NDKLEVEL
+# for ARM
+# set ARCH = arm, NDKLEVEL = 23
 # ./genMakefiles android
 # make NDKROOT="/opt/android-ndk-r13b" TOOLCHAINPREFIX="/opt/android-ndk-r13b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-" clean
 # make NDKROOT="/opt/android-ndk-r13b" TOOLCHAINPREFIX="/opt/android-ndk-r13b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-"
 # make NDKROOT="/opt/android-ndk-r13b" TOOLCHAINPREFIX="/opt/android-ndk-r13b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-" PREFIX="/opt/live.android/inst" install
 
-ARCH = arm
-NDKLEVEL = 22
+#for x86
+# ./genMakefiles android
+# make NDKROOT="/opt/android-ndk-r13b" TOOLCHAINPREFIX="/opt/android-ndk-r13b/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-" clean
+# make NDKROOT="/opt/android-ndk-r13b" TOOLCHAINPREFIX="/opt/android-ndk-r13b/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-"
+# make NDKROOT="/opt/android-ndk-r13b" TOOLCHAINPREFIX="/opt/android-ndk-r13b/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-" PREFIX="/opt/live.android/inst" install
+
+ARCH = x86
+NDKLEVEL = 23
 ifeq ($(ARCH), arm)
   ifneq ($(APP_ABI), armeabi)
     CFLAGS += -march=armv7-a -mfloat-abi=softfp
diff --git a/RtspFace/live555/testProgs/testRTSPClient.hpp b/RtspFace/live555/testProgs/testRTSPClient.hpp
index f346165..75cc022 100644
--- a/RtspFace/live555/testProgs/testRTSPClient.hpp
+++ b/RtspFace/live555/testProgs/testRTSPClient.hpp
@@ -29,7 +29,7 @@
 
 // By default, we request that the server stream its data using RTP/UDP.
 // If, instead, you want to request that the server stream via RTP-over-TCP, change the following to True:
-#define REQUEST_STREAMING_OVER_TCP False
+#define REQUEST_STREAMING_OVER_TCP True
 
 // Even though we're not going to be doing anything with the incoming data, we still need to receive it.
 // Define the size of the buffer that we'll use:
@@ -62,13 +62,13 @@
 void shutdownStream(RTSPClient* rtspClient, int exitCode = 1);
 
 // A function that outputs a string that identifies each stream (for debugging output).  Modify this if you wish:
-log4cpp::CategoryStream& operator<<(log4cpp::CategoryStream& logRoot, const RTSPClient& rtspClient)
+Logger& operator<<(Logger& logRoot, const RTSPClient& rtspClient)
 {
 	return logRoot << "[URL:\"" << rtspClient.url() << "\"]: ";
 }
 
 // A function that outputs a string that identifies each subsession (for debugging output).  Modify this if you wish:
-log4cpp::CategoryStream& operator<<(log4cpp::CategoryStream& logRoot, const MediaSubsession& subsession)
+Logger& operator<<(Logger& logRoot, const MediaSubsession& subsession)
 {
 	return logRoot << subsession.mediumName() << "/" << subsession.codecName();
 }
diff --git a/RtspFace/logger.h b/RtspFace/logger.h
index d541876..63f4882 100644
--- a/RtspFace/logger.h
+++ b/RtspFace/logger.h
@@ -1,24 +1,22 @@
 #ifndef LOGGER_H
 #define LOGGER_H
 
-#include <Logger/src/logger.hpp>
+#include "Logger/src/logger.hpp"
 #include <string.h>
 #include <unistd.h>
 
-#ifndef LOG_TAG
-#define LOG_TAG "logger"
-#endif
-
 extern Logger g_logger;
 
-#define LOG(__level)  g_logger << __level << __FILE__ << ":" << __LINE__ << "\t" 
+#define LOG(__level)  g_logger << __level << __FILE__ << ":" << __LINE__ << "\t"
 #define LOGP(__level, __format, arg...)  { char msg[1024]; sprintf(msg, "%s:%d\t" __format, __FILE__, __LINE__, ##arg); g_logger << __level << msg << std::endl; }
 
 #define LOG_DEBUG    LOG(DEBUG) // Debug message do not care in any production environment
 #define LOG_INFO     LOG(INFO) // Not significant event but useful for deal with online problem
 #define LOG_NOTICE   LOG(NOTICE) // Important event
-#define LOG_WARN     LOG(WARN) // Important event or input which will lead to errors
+#define LOG_WARN     LOG(WARNING) // Important event or input which will lead to errors
 #define LOG_ERROR    LOG(ERROR) // Error message means program running in an abnormal (not expected) way
 
+#define LOG_ENDL     std::endl
+
 #endif
 
diff --git a/RtspFace/main.cpp b/RtspFace/main.cpp
index bbedf4d..0ab3414 100644
--- a/RtspFace/main.cpp
+++ b/RtspFace/main.cpp
@@ -14,8 +14,9 @@
 #include "PL_DlibFaceTrack.h"
 
 #include "logger.h"
+#include <iostream>
 
-Logger g_logger(stdout);
+Logger g_logger(std::cout);
 
 int main(int argc, char** argv)
 {
@@ -27,6 +28,7 @@
 	PipeLine::register_global_elem_creator("PL_RTSPServer", create_PL_RTSPServer);
 	PipeLine::register_global_elem_creator("PL_H264Decoder", create_PL_H264Decoder);
 	PipeLine::register_global_elem_creator("PL_AVFrameYUV420", create_PL_AVFrameYUV420);
+	PipeLine::register_global_elem_creator("PL_AVFrameBGRA", create_PL_AVFrameBGRA);
 	PipeLine::register_global_elem_creator("PL_H264Encoder", create_PL_H264Encoder);
 	PipeLine::register_global_elem_creator("PL_Queue", create_PL_Queue);
 	PipeLine::register_global_elem_creator("PL_Scale", create_PL_Scale);
@@ -75,8 +77,8 @@
 	
 	{
 		PL_Scale_Config config;
-		config.toWidth = 800;
-		config.toHeight = 600;
+		config.toWidth = 480;
+		config.toHeight = 360;
 		PL_Scale* ple = (PL_Scale*)pipeLine.push_elem("PL_Scale");
 		bool ret = ple->init(&config);
 		if (!ret)
@@ -85,13 +87,25 @@
 			exit(EXIT_FAILURE);
 		}
 	}
-
+	
 	{
-		SensetimeFaceTrackConfig config;
-		//config.generate_face_feature = true;
-		PL_SensetimeFaceTrack* ple = (PL_SensetimeFaceTrack*)pipeLine.push_elem("PL_SensetimeFaceTrack");
-		ple->init(&config);
+		PL_AVFrameBGRA_Config config;
+		config.convertTo = PL_AVFrameBGRA_Config::I420_TO_ARGB8888;
+		PL_AVFrameBGRA* ple = (PL_AVFrameBGRA*)pipeLine.push_elem("PL_AVFrameBGRA");
+		bool ret = ple->init(&config);
+		if (!ret)
+		{
+			LOG_ERROR << "PL_AVFrameBGRA.init error" << std::endl;
+			exit(EXIT_FAILURE);
+		}
 	}
+
+	//{
+	//	SensetimeFaceTrackConfig config;
+	//	//config.generate_face_feature = true;
+	//	PL_SensetimeFaceTrack* ple = (PL_SensetimeFaceTrack*)pipeLine.push_elem("PL_SensetimeFaceTrack");
+	//	ple->init(&config);
+	//}
 	
 	//PipeLine pipeLine2;
 	//{
@@ -126,26 +140,29 @@
 	//	}
 	//}
 
-	{
-		PL_H264Encoder_Config config;
-		PL_H264Encoder* h264Encoder = (PL_H264Encoder*)pipeLine.push_elem("PL_H264Encoder");
-		bool ret = h264Encoder->init(&config);
-		if (!ret)
-		{
-			LOG_ERROR << "PL_H264Encoder.init error" << std::endl;
-			exit(EXIT_FAILURE);
-		}
-	}
-    
-	{
-		PL_RTSPServer* rtspServer = (PL_RTSPServer*)pipeLine.push_elem("PL_RTSPServer");
-		bool ret = rtspServer->init(nullptr);
-		if (!ret)
-		{
-			LOG_ERROR << "rtspServer.init error" << std::endl;
-			exit(EXIT_FAILURE);
-		}
-	}
+	//{
+	//	PL_H264Encoder_Config config;
+	//	config.av_opt_preset = "superfast";
+	//	config.av_opt_tune = "zerolatency";
+	//	config.avc_profile_str = "baseline";
+	//	PL_H264Encoder* h264Encoder = (PL_H264Encoder*)pipeLine.push_elem("PL_H264Encoder");
+	//	bool ret = h264Encoder->init(&config);
+	//	if (!ret)
+	//	{
+	//		LOG_ERROR << "PL_H264Encoder.init error" << std::endl;
+	//		exit(EXIT_FAILURE);
+	//	}
+	//}
+    //
+	//{
+	//	PL_RTSPServer* rtspServer = (PL_RTSPServer*)pipeLine.push_elem("PL_RTSPServer");
+	//	bool ret = rtspServer->init(nullptr);
+	//	if (!ret)
+	//	{
+	//		LOG_ERROR << "rtspServer.init error" << std::endl;
+	//		exit(EXIT_FAILURE);
+	//	}
+	//}
 	
 	while(true)
 	{
diff --git a/RtspFace/make.sh b/RtspFace/make.sh
index 1fa56b8..3faa727 100644
--- a/RtspFace/make.sh
+++ b/RtspFace/make.sh
@@ -94,5 +94,6 @@
   $LDFLAGS -o rtsp_face
 
 #export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIBX264_BASE/lib:$FFMPEG_BASE/lib:$SENSETIMEFACESDK_BASE/libs/linux-x86_64:$LOGGER_BASE/lib64:$DLIB_BASE/build/dlib
-#./rtsp_face rtsp://admin:admin12345@192.168.1.70:554/h264/ch1/main/av_stream
+#./rtsp_face rtsp://admin:a1234567@192.168.1.68:554/h264/ch1/main/av_stream
 #rtsp://admin:a1234567@192.168.1.68:554/h264/ch1/main/av_stream
+#rtsp://admin:admin12345@192.168.1.70:554/h264/ch1/main/av_stream

--
Gitblit v1.8.0