houxiao
2017-07-19 a88fc40a16cefc8248baa4b6aab7b7577e0ba4cc
RtspFace/PL_Paint.cpp
@@ -7,6 +7,12 @@
#include <opencv2/core/mat.hpp>
#include <opencv2/imgproc.hpp>
~PLPLContext::PLPLContext()
{
   delete (CvxText*)cvxText;
   cvxText = nullptr;
}
struct PL_Paint_Internal
{
   uint8_t* buffer;
@@ -21,7 +27,7 @@
   PL_Paint_Internal() : 
      buffer(nullptr), buffSize(), config(), pmList(),
        lastMbfBuffOrigin(), lastMbfBuffCopy(),
      lastMbfBuffOrigin(), lastMbfBuffCopy(),
      payError(true)
   {
   }
@@ -79,20 +85,17 @@
      in->config = *config;
   }
    if(in->config.fontPath.empty())
    {
        LOG_ERROR << "fontPath is null!" << LOG_ENDL;
        return false;
    }
    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);
   if(in->config.fontPath.empty())
   {
      LOG_ERROR << "fontPath is null!" << LOG_ENDL;
      return false;
   }
   if(in->config.plplCtx->cvxText != nullptr)
   {
      delete (CvxText*)in->config.plplCtx->cvxText;
   }
   return true;
}
@@ -121,7 +124,7 @@
   // 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);
@@ -145,8 +148,8 @@
   // 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);
@@ -175,109 +178,121 @@
   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));
}
bool plplDraw_WText_NV12(PLPLContext* plplCtx, MB_Frame* paintMb, int& paramOffset)
{
    int LTX = plplCtx->params[paramOffset + 0].val_i;
    int LTY = plplCtx->params[paramOffset + 1].val_i;
    const char* TXT = plplCtx->params[paramOffset + 2].val_s;
    paramOffset += 3;
   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);
   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)
   // 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, 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));
   if (in->config.plplCtx->cvxText == nullptr)
   {
      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);
   }
   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"
}
bool plplExecutor_YUV(PL_Paint_Internal *in)
{
    MB_Frame* paintMb = &(in->lastMbfBuffOrigin);
   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
               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);
@@ -285,17 +300,17 @@
               ret = plplDraw_Text_NV12(plplCtx, paintMb, paramOffset);
            else
               ret = false;
                break;
            break;
            case PLPLC_WTEXT:
                //TEXT LTX,LTY,"STR"
                if (paintMb->type == MB_Frame::MBFT_NV12)
                    ret = plplDraw_WText_NV12(plplCtx, paintMb, paramOffset);
                else
                    ret = false;
                break;
        }
    }
         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;
      }
   }
   return ret;
}
@@ -337,8 +352,8 @@
{
   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);
   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);
   //#todo support RGB