From 900cad1c378136885f131922c763095e0e12dcdc Mon Sep 17 00:00:00 2001
From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期二, 25 七月 2017 14:20:30 +0800
Subject: [PATCH]
---
RtspFace/PL_Paint.cpp | 344 +++++++++++++++++++++++++++++++++++++--------------------
1 files changed, 222 insertions(+), 122 deletions(-)
diff --git a/RtspFace/PL_Paint.cpp b/RtspFace/PL_Paint.cpp
index daaca0d..acfd90c 100644
--- a/RtspFace/PL_Paint.cpp
+++ b/RtspFace/PL_Paint.cpp
@@ -2,10 +2,35 @@
#include "MaterialBuffer.h"
#include "logger.h"
#include "MediaHelper.h"
-#include "CvUtil/CvxText.h"
#include <string.h> // for memcpy
#include <opencv2/core/mat.hpp>
#include <opencv2/imgproc.hpp>
+#ifdef ENABLE_WTEXT
+#include "CvUtil/CvxText.h"
+#endif
+
+PLPLType::PLPLType(const char* _val_s)
+{
+ for (int i = 0; i < sizeof(val_s); i++)
+ val_s[i] = _val_s[i];
+}
+
+PLPLType::PLPLType(const wchar_t* _val_s)
+{
+ //wchar_t* w_val_s = (wchar_t*)val_s;
+ //for (int i = 0; i < sizeof(val_s) / sizeof(wchar_t); i++)
+ // w_val_s[i] = _val_s[i];
+
+ memcpy(val_s, _val_s, sizeof(val_s));
+}
+
+PLPLContext::~PLPLContext()
+{
+#ifdef ENABLE_WTEXT
+ delete (CvxText*)cvxText;
+ cvxText = nullptr;
+#endif
+}
struct PL_Paint_Internal
{
@@ -21,7 +46,7 @@
PL_Paint_Internal() :
buffer(nullptr), buffSize(), config(), pmList(),
- lastMbfBuffOrigin(), lastMbfBuffCopy(),
+ lastMbfBuffOrigin(), lastMbfBuffCopy(),
payError(true)
{
}
@@ -79,20 +104,22 @@
in->config = *config;
}
- if(in->config.fontPath.empty())
- {
- LOG_ERROR << "fontPath is null!" << LOG_ENDL;
- return false;
- }
+#ifdef ENABLE_WTEXT
if(in->config.plplCtx->cvxText != nullptr)
- {
- delete(in->config.plplCtx->cvxText);
- }
- CvxText* cvxText =new CvxText(in->config.fontPath.c_str());
- in->config.plplCtx->cvxText = cvxText;
- cvxText->setBackColor(cvScalar(128, 33, 14));
- CvScalar font = cvScalar(40,1,0.2,1);
- cvxText->setFont(0, &font);
+ {
+ delete (CvxText*)in->config.plplCtx->cvxText;
+ }
+
+ if(!in->config.fontPath.empty())
+ {
+ CvxText* cvxText = new CvxText(in->config.fontPath.c_str());
+ in->config.plplCtx->cvxText = cvxText;
+ cvxText->setBackColor(cvScalar(128, 33, 14));
+ CvScalar font = cvScalar(40, 1, 0.2, 1);
+ cvxText->setFont(0, &font);
+ }
+#endif
+
return true;
}
@@ -121,11 +148,13 @@
// void rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
- const PLGH_Color_YUV yuvColor(plplCtx->color_front.toY(), plplCtx->color_front.toU(), plplCtx->color_front.toV());
+ const PLGH_Color_YUV yuvColor(plplCtx->color_front.toY(), plplCtx->color_front.toU(), plplCtx->color_front.toV());
cv::rectangle(yMat, cv::Point(LTX, LTY), cv::Point(RBX, RBY), CV_RGB(yuvColor.Y, yuvColor.Y, yuvColor.Y), 4);
cv::rectangle(uMat, cv::Point(MH_SUBSAMPLE1(LTX, 2), MH_SUBSAMPLE1(LTY, 2)), cv::Point(MH_SUBSAMPLE1(RBX, 2), MH_SUBSAMPLE1(RBY, 2)), CV_RGB(yuvColor.U, yuvColor.U, yuvColor.U), 2);
cv::rectangle(vMat, cv::Point(MH_SUBSAMPLE1(LTX, 2), MH_SUBSAMPLE1(LTY, 2)), cv::Point(MH_SUBSAMPLE1(RBX, 2), MH_SUBSAMPLE1(RBY, 2)), CV_RGB(yuvColor.V, yuvColor.V, yuvColor.V), 2);
+
+ return true;
}
bool plplDraw_Rect_NV12(PLPLContext* plplCtx, MB_Frame* paintMb, int& paramOffset)
@@ -145,15 +174,39 @@
// void rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
- const uint16_t Y = plplCtx->color_front.toY();
- const uint16_t UV = plplCtx->color_front.toUV();
+ const uint16_t Y = plplCtx->color_front.toY();
+ const uint16_t UV = plplCtx->color_front.toUV();
cv::rectangle(yMat, cv::Point(LTX, LTY), cv::Point(RBX, RBY), CV_RGB(Y, Y, Y), 4);
cv::rectangle(uvMat, cv::Point(MH_SUBSAMPLE1(LTX, 2), MH_SUBSAMPLE1(LTY, 2)), cv::Point(MH_SUBSAMPLE1(RBX, 2), MH_SUBSAMPLE1(RBY, 2)), CV_RGB(UV, UV, UV), 2);
+
+ return true;
+}
+
+bool plplDraw_Rect_RGB565(PLPLContext* plplCtx, MB_Frame* paintMb, int& paramOffset)
+{
+ int LTX = plplCtx->params[paramOffset + 0].val_i;
+ int LTY = plplCtx->params[paramOffset + 1].val_i;
+ int RBX = plplCtx->params[paramOffset + 2].val_i;
+ int RBY = plplCtx->params[paramOffset + 3].val_i;
+ paramOffset += 4;
+
+ int src_width = paintMb->width;
+ int src_height = paintMb->height;
+ uint8_t* src_rgb = (uint8_t*)(paintMb->buffer);
+ cv::Mat rgbMat(cv::Size(src_width, src_height), CV_16UC1, src_rgb);
+
+ // void rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
+
+ const uint16_t RGB565 = plplCtx->color_front.toRGB565();
+ cv::rectangle(rgbMat, cv::Point(LTX, LTY), cv::Point(RBX, RBY), CV_RGB(RGB565, RGB565, RGB565), 4);
+
+ return true;
}
bool plplDraw_Text_YUV420(PLPLContext* plplCtx, MB_Frame* paintMb, int& paramOffset)
{
+ return false;
}
bool plplDraw_Text_NV12(PLPLContext* plplCtx, MB_Frame* paintMb, int& paramOffset)
@@ -175,10 +228,13 @@
const uint16_t Y = plplCtx->color_front.toY();
const uint16_t UV = plplCtx->color_front.toUV();
- cv::putText(yMat, TXT, cv::Point(LTX, LTY), CV_FONT_HERSHEY_COMPLEX, 1, CV_RGB(Y, Y, Y));
- cv::putText(uvMat, TXT, cv::Point(MH_SUBSAMPLE1(LTX, 2), MH_SUBSAMPLE1(LTY, 2)), CV_FONT_HERSHEY_COMPLEX, 0.5, CV_RGB(UV, UV, UV));
+ cv::putText(yMat, TXT, cv::Point(LTX, LTY), CV_FONT_HERSHEY_COMPLEX, 1, CV_RGB(Y, Y, Y));
+ cv::putText(uvMat, TXT, cv::Point(MH_SUBSAMPLE1(LTX, 2), MH_SUBSAMPLE1(LTY, 2)), CV_FONT_HERSHEY_COMPLEX, 0.5, CV_RGB(UV, UV, UV));
+
+ return true;
}
-bool plplDraw_WText_NV12(PLPLContext* plplCtx, MB_Frame* paintMb, int& paramOffset)
+
+bool plplDraw_Text_RGB565(PLPLContext* plplCtx, MB_Frame* paintMb, int& paramOffset)
{
int LTX = plplCtx->params[paramOffset + 0].val_i;
int LTY = plplCtx->params[paramOffset + 1].val_i;
@@ -187,139 +243,181 @@
int src_width = paintMb->width;
int src_height = paintMb->height;
- uint8_t* src_y = (uint8_t*)(paintMb->buffer);
- uint8_t* src_uv = (uint8_t*)(src_y + (src_height * src_width));
- cv::Mat yMat(cv::Size(src_width, src_height), CV_8UC1, src_y);
- cv::Mat uvMat(cv::Size(MH_SUBSAMPLE1(src_width, 2), MH_SUBSAMPLE1(src_height, 2)), CV_16UC1, src_uv);
+ uint8_t* src_rgb = (uint8_t*)(paintMb->buffer);
+ cv::Mat rgbMat(cv::Size(src_width, src_height), CV_16UC1, src_rgb);
- // void rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
+ const uint16_t RGB565 = plplCtx->color_front.toRGB565();
+ cv::putText(rgbMat, TXT, cv::Point(LTX, LTY), CV_FONT_HERSHEY_COMPLEX, 1, CV_RGB(RGB565, RGB565, RGB565));
- const uint16_t Y = plplCtx->color_front.toY();
- const uint16_t UV = plplCtx->color_front.toUV();
- CvxText* cvText = (CvxText*)plplCtx->cvxText;
- cvText->putText(yMat, L"涓枃ABCDabcd", cv::Point(LTX, LTY), CV_RGB(Y, Y, Y));
- cvText->putText(uvMat, L"涓枃ABCDabcd", cv::Point(MH_SUBSAMPLE1(LTX, 2),MH_SUBSAMPLE1(LTY, 2)), CV_RGB(UV, UV, UV));
+ return true;
}
-bool plplExecutor_YUV(PL_Paint_Internal *in)
+
+bool plplDraw_WText_RGB565(PLPLContext* plplCtx, MB_Frame* paintMb, int& paramOffset)
{
- MB_Frame* paintMb = &(in->lastMbfBuffOrigin);
+#ifdef ENABLE_WTEXT
+ int LTX = plplCtx->params[paramOffset + 0].val_i;
+ int LTY = plplCtx->params[paramOffset + 1].val_i;
+ const char* WTXT = plplCtx->params[paramOffset + 2].val_s;
+ paramOffset += 3;
+
+ int src_width = paintMb->width;
+ int src_height = paintMb->height;
+ uint8_t* src_rgb = (uint8_t*)(paintMb->buffer);
+ cv::Mat rgbMat(cv::Size(src_width, src_height), CV_16UC1, src_rgb);
+
+ // void rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
+
+ const uint16_t RGB565 = plplCtx->color_front.toRGB565();
+
+ CvxText* cvText = (CvxText*)plplCtx->cvxText;
+ cvText->putText(rgbMat, (const wchar_t*)WTXT, cv::Point(LTX, LTY), CV_RGB(RGB565, RGB565, RGB565));
+
+ return true;
+#else
+ return false;
+#endif
+}
+
+bool plplDraw_WText_NV12(PLPLContext* plplCtx, MB_Frame* paintMb, int& paramOffset)
+{
+#ifdef ENABLE_WTEXT
+ int LTX = plplCtx->params[paramOffset + 0].val_i;
+ int LTY = plplCtx->params[paramOffset + 1].val_i;
+ const char* WTXT = plplCtx->params[paramOffset + 2].val_s;
+ paramOffset += 3;
+
+ int src_width = paintMb->width;
+ int src_height = paintMb->height;
+ uint8_t* src_y = (uint8_t*)(paintMb->buffer);
+ uint8_t* src_uv = (uint8_t*)(src_y + (src_height * src_width));
+ cv::Mat yMat(cv::Size(src_width, src_height), CV_8UC1, src_y);
+ cv::Mat uvMat(cv::Size(MH_SUBSAMPLE1(src_width, 2), MH_SUBSAMPLE1(src_height, 2)), CV_16UC1, src_uv);
+
+ // void rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
+
+ const uint16_t Y = plplCtx->color_front.toY();
+ const uint16_t UV = plplCtx->color_front.toUV();
+
+ CvxText* cvText = (CvxText*)plplCtx->cvxText;
+ cvText->putText(yMat, (const wchar_t*)WTXT, cv::Point(LTX, LTY), CV_RGB(Y, Y, Y)); // L"涓枃ABCDabcd"
+ cvText->putText(uvMat, (const wchar_t*)WTXT, cv::Point(MH_SUBSAMPLE1(LTX, 2), MH_SUBSAMPLE1(LTY, 2)), CV_RGB(UV, UV, UV)); // L"涓枃ABCDabcd"
+
+ return true;
+#else
+ return false;
+#endif
+}
+
+bool plpl_executor(PL_Paint_Internal *in)
+{
+ MB_Frame* paintMb = &(in->lastMbfBuffOrigin);
int ret = true;
- if (in->config.copyData)
- {
- if (in->buffer == nullptr)
- {
- in->buffer = new uint8_t[in->lastMbfBuffOrigin.buffSize];
- in->buffSize = in->lastMbfBuffOrigin.buffSize;
- }
+ if (in->config.copyData)
+ {
+ if (in->buffer == nullptr)
+ {
+ in->buffer = new uint8_t[in->lastMbfBuffOrigin.buffSize];
+ in->buffSize = in->lastMbfBuffOrigin.buffSize;
+ }
- in->lastMbfBuffCopy = in->lastMbfBuffOrigin;
- in->lastMbfBuffCopy.buffer = in->buffer;
- in->lastMbfBuffCopy.buffSize = in->buffSize;
+ in->lastMbfBuffCopy = in->lastMbfBuffOrigin;
+ in->lastMbfBuffCopy.buffer = in->buffer;
+ in->lastMbfBuffCopy.buffSize = in->buffSize;
- memcpy(in->lastMbfBuffCopy.buffer, in->lastMbfBuffOrigin.buffer, in->lastMbfBuffCopy.buffSize);
+ memcpy(in->lastMbfBuffCopy.buffer, in->lastMbfBuffOrigin.buffer, in->lastMbfBuffCopy.buffSize);
- paintMb = &(in->lastMbfBuffCopy);
- }
+ paintMb = &(in->lastMbfBuffCopy);
+ }
- //for (int i=640;i<2000;i++) ((uint8_t*)paintMb->buffer)[i]=255;
+ //for (int i=640;i<2000;i++) ((uint8_t*)paintMb->buffer)[i]=255;
- PLPLContext* plplCtx = in->config.plplCtx;
- int paramOffset = 0;
- for (int iCmd = 0; iCmd < in->config.plplCtx->cmds.size(); iCmd++)
- {
- PLPLCmd cmd = plplCtx->cmds[iCmd];
+ PLPLContext* plplCtx = in->config.plplCtx;
+ int paramOffset = 0;
+ for (int iCmd = 0; iCmd < in->config.plplCtx->cmds.size(); iCmd++)
+ {
+ PLPLCmd cmd = plplCtx->cmds[iCmd];
- switch(cmd)
- {
- case PLPLC_COLOR:
- //COLOR F/B,R,G,B,A
- if (plplCtx->params[paramOffset + 0].val_i == 'F')
- {
- plplCtx->color_front = PLGH_Color_RGBA(plplCtx->params[paramOffset + 1].val_i,
- plplCtx->params[paramOffset + 2].val_i,
- plplCtx->params[paramOffset + 3].val_i,
- plplCtx->params[paramOffset + 4].val_i);
- paramOffset += 5;
- }
- else if (plplCtx->params[paramOffset + 0].val_i == 'B')
- {
- plplCtx->color_back = PLGH_Color_RGBA(plplCtx->params[paramOffset + 1].val_i,
- plplCtx->params[paramOffset + 2].val_i,
- plplCtx->params[paramOffset + 3].val_i,
- plplCtx->params[paramOffset + 4].val_i);
- paramOffset += 5;
- }
- else
- {
- LOG_WARN << "plpl execute error" << LOG_ENDL;
- return false;
- }
- break;
+ switch(cmd)
+ {
+ case PLPLC_COLOR:
+ //COLOR F/B,R,G,B,A
+ if (plplCtx->params[paramOffset + 0].val_i == 'F')
+ {
+ plplCtx->color_front = PLGH_Color_RGBA(plplCtx->params[paramOffset + 1].val_i,
+ plplCtx->params[paramOffset + 2].val_i,
+ plplCtx->params[paramOffset + 3].val_i,
+ plplCtx->params[paramOffset + 4].val_i);
+ paramOffset += 5;
+ }
+ else if (plplCtx->params[paramOffset + 0].val_i == 'B')
+ {
+ plplCtx->color_back = PLGH_Color_RGBA(plplCtx->params[paramOffset + 1].val_i,
+ plplCtx->params[paramOffset + 2].val_i,
+ plplCtx->params[paramOffset + 3].val_i,
+ plplCtx->params[paramOffset + 4].val_i);
+ paramOffset += 5;
+ }
+ else
+ {
+ LOG_WARN << "plpl execute error" << LOG_ENDL;
+ return false;
+ }
+ break;
- case PLPLC_FILL:
- plplCtx->fill = plplCtx->params[paramOffset + 0].val_i;
- paramOffset += 1;
- break;
+ case PLPLC_FILL:
+ plplCtx->fill = plplCtx->params[paramOffset + 0].val_i;
+ paramOffset += 1;
+ break;
- case PLPLC_PEN:
- plplCtx->pen = PLGH_Pen(plplCtx->params[paramOffset + 0].val_i, plplCtx->params[paramOffset + 1].val_i);
- paramOffset += 2;
- break;
+ case PLPLC_PEN:
+ plplCtx->pen = PLGH_Pen(plplCtx->params[paramOffset + 0].val_i, plplCtx->params[paramOffset + 1].val_i);
+ paramOffset += 2;
+ break;
- case PLPLC_RECT:
- //RECT LTX,LTY,RBX,RBY
+ case PLPLC_RECT:
+ //RECT LTX,LTY,RBX,RBY
if (paintMb->type == MB_Frame::MBFT_YUV420)
ret = plplDraw_Rect_YUV420(plplCtx, paintMb, paramOffset);
else if (paintMb->type == MB_Frame::MBFT_NV12)
ret = plplDraw_Rect_NV12(plplCtx, paintMb, paramOffset);
+ else if (paintMb->type == MB_Frame::MBFT_RGB565)
+ ret = plplDraw_Rect_RGB565(plplCtx, paintMb, paramOffset);
else
ret = false;
- break;
+ break;
- case PLPLC_TEXT:
+ case PLPLC_TEXT:
//TEXT LTX,LTY,"STR"
if (paintMb->type == MB_Frame::MBFT_YUV420)
ret = plplDraw_Text_YUV420(plplCtx, paintMb, paramOffset);
else if (paintMb->type == MB_Frame::MBFT_NV12)
ret = plplDraw_Text_NV12(plplCtx, paintMb, paramOffset);
+ else if (paintMb->type == MB_Frame::MBFT_RGB565)
+ ret = plplDraw_Text_RGB565(plplCtx, paintMb, paramOffset);
else
ret = false;
- break;
+ break;
- case PLPLC_WTEXT:
- //TEXT LTX,LTY,"STR"
+ case PLPLC_WTEXT:
+ //WTEXT LTX,LTY,"STR"
if (paintMb->type == MB_Frame::MBFT_NV12)
- ret = plplDraw_WText_NV12(plplCtx, paintMb, paramOffset);
- else
- ret = false;
- break;
- }
- }
+ ret = plplDraw_WText_NV12(plplCtx, paintMb, paramOffset);
+ else if (paintMb->type == MB_Frame::MBFT_RGB565)
+ ret = plplDraw_WText_RGB565(plplCtx, paintMb, paramOffset);
+ else
+ ret = false;
+ break;
+ }
+ }
return ret;
}
-/*static*/ bool PL_Paint::pay_breaker_MBFT_YUV(const PipeMaterial* pm, void* args)
+/*static*/ bool PL_Paint::pay_breaker_MBFT(const PipeMaterial* pm, void* args)
{
PL_Paint_Internal* in = (PL_Paint_Internal*)args;
-
- if (pm->type != PipeMaterial::PMT_FRAME)
- {
- LOG_ERROR << "Only support PMT_FRAME" << LOG_ENDL;
- return false;
- }
-
- if (pm->buffer == nullptr)
- return false;
-
- MB_Frame* frame = (MB_Frame*)pm->buffer;
- if (frame->type != MB_Frame::MBFT_YUV420 && frame->type != MB_Frame::MBFT_NV12)
- {
- LOG_ERROR << "Only support MBFT_YUV420 and MBFT_NV12" << LOG_ENDL;
- in->payError = true;
- return false;
- }
+ MB_Frame* frame = (MB_Frame*)pm->buffer;
in->lastMbfBuffOrigin.type = frame->type;
in->lastMbfBuffOrigin.buffer = frame->buffer;
@@ -328,7 +426,7 @@
in->lastMbfBuffOrigin.height = frame->height;
in->lastMbfBuffOrigin.pts = frame->pts;
- in->payError = !plplExecutor_YUV(in);
+ in->payError = !plpl_executor(in);
return false;
}
@@ -337,11 +435,13 @@
{
PL_Paint_Internal* in = (PL_Paint_Internal*)internal;
in->payError = true;
- pm.breake(PipeMaterial::PMT_FRAME, MB_Frame::MBFT_YUV420, PL_Paint::pay_breaker_MBFT_YUV, in);
- pm.breake(PipeMaterial::PMT_FRAME, MB_Frame::MBFT_NV12, PL_Paint::pay_breaker_MBFT_YUV, in);
+ if (in->payError)
+ pm.breake(PipeMaterial::PMT_FRAME, MB_Frame::MBFT_YUV420, PL_Paint::pay_breaker_MBFT, in);
+ if (in->payError)
+ pm.breake(PipeMaterial::PMT_FRAME, MB_Frame::MBFT_NV12, PL_Paint::pay_breaker_MBFT, in);
+ if (in->payError)
+ pm.breake(PipeMaterial::PMT_FRAME, MB_Frame::MBFT_RGB565, PL_Paint::pay_breaker_MBFT, in);
- //#todo support RGB
-
return !(in->payError);
}
--
Gitblit v1.8.0