houxiao
2017-07-19 a08e6387a2fe736d23e9541ac00eb3b0a84d2afe
compile

git-svn-id: http://192.168.1.226/svn/proxy@742 454eff88-639b-444f-9e54-f578c98de674
2个文件已修改
120 ■■■■■ 已修改文件
RtspFace/PL_Paint.cpp 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
RtspFace/PL_Paint.h 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
RtspFace/PL_Paint.cpp
@@ -2,10 +2,19 @@
#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)
{
@@ -18,8 +27,10 @@
PLPLContext::~PLPLContext()
{
    delete (CvxText*)cvxText;
#ifdef ENABLE_WTEXT
    delete (CvxText*)cvxText;
    cvxText = nullptr;
#endif
}
struct PL_Paint_Internal
@@ -94,17 +105,13 @@
        in->config = *config;
    }
    if(in->config.plplCtx->cvxText != nullptr)
#ifdef ENABLE_WTEXT
    if(in->config.plplCtx->cvxText != nullptr)
    {
        delete (CvxText*)in->config.plplCtx->cvxText;
    }
    if(in->config.fontPath.empty())
    {
        LOG_ERROR << "fontPath is null!" << LOG_ENDL;
        return false;
    }
    else if (in->config.fontPath == " ")
    if(!in->config.fontPath.empty())
    {
        CvxText* cvxText = new CvxText(in->config.fontPath.c_str());
        in->config.plplCtx->cvxText = cvxText;
@@ -112,6 +119,7 @@
        CvScalar font = cvScalar(40, 1, 0.2, 1);
        cvxText->setFont(0, &font);
    }
#endif
    return true;
}
@@ -176,6 +184,27 @@
    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.toY();
    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;
@@ -208,6 +237,7 @@
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;
@@ -230,6 +260,9 @@
    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 plplExecutor_YUV(PL_Paint_Internal *in)
@@ -305,6 +338,8 @@
                    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;
@@ -315,14 +350,18 @@
                    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;
            case PLPLC_WTEXT:
                //WTEXT LTX,LTY,"STR"
                if (paintMb->type == MB_Frame::MBFT_NV12)
                if (paintMb->type == MB_Frame::MBFT_NV12)
                    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;
@@ -332,26 +371,10 @@
    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;
@@ -369,11 +392,30 @@
{
    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);
    //#todo support RGB
    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;
    switch(frame->type)
    {
        case MB_Frame::MBFT_YUV420:
        case MB_Frame::MBFT_NV12:
        case MB_Frame::MBFT_RGB565:
            pm.breake(PipeMaterial::PMT_FRAME, MB_Frame::MBFT_RGB565, PL_Paint::pay_breaker_MBFT, in);
            return !(in->payError);
        default:
            LOG_ERROR << "Only support MBFT_YUV420 / MBFT_NV12 / MBFT_RGB565" << LOG_ENDL;
            in->payError = true;
            break;
    }
    return !(in->payError);
}
RtspFace/PL_Paint.h
@@ -4,6 +4,8 @@
#include "PipeLine.h"
#include "GraphicHelper.h"
//#define ENABLE_WTEXT
/*
PLPaint Language:
COLOR F/B,R,G,B,A
@@ -36,11 +38,7 @@
    PLPLType() : val_i(0) {}
    PLPLType(int _val_i) : val_i(_val_i) {}
    PLPLType(float _val_f) : val_f(_val_f) {}
    PLPLType(const char* _val_s)
    {
        for (int i = 0; i < sizeof(val_s); i++)
            val_s[i] = _val_s[i];
    }
    PLPLType(const char* _val_s);
    PLPLType(const wchar_t* _val_s);
};
@@ -89,8 +87,8 @@
    virtual bool gain(PipeMaterial& pm);
    
private:
    static bool pay_breaker_MBFT_YUV(const PipeMaterial* pm, void* args);
    static bool pay_breaker_MBFT(const PipeMaterial* pm, void* args);
private:
    void* internal;
};