⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsdemo.cpp

📁 强大的QT,GTK的学习Demo.包含DSP驱动以及所使用库文件资源。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include <SDL/SDL.h>

#include "exvideo.h"
#include "dsdemo.h"
#include <qapplication.h>
extern QApplication* app;

#define USLEEPTIME (20 * 1000)

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */

Dsclass::Dsclass(int port, int ChannelHandle, SDL_Surface* Screen)
{
    pOverlayScreen = Screen;
    logoptr = NULL;
    SignPort = port;

    dsdemo = (DSDEMO*)malloc(sizeof(DSDEMO));
    memset(dsdemo, 0, sizeof(DSDEMO));

    dsdemo->maskRect = (RECT*)malloc(5 * sizeof(RECT));
    memset(dsdemo->maskRect, 0, 5 * sizeof(RECT));

    sem_init(&(dsdemo->previewSem), 0, 0);
    dsdemo->previewconf.SyncSem = &(dsdemo->previewSem);

    logoptr = (unsigned char*)malloc(128 * 128 * 2);
    memset(logoptr, 0x0, 128 * 128 * 2 * sizeof(unsigned char));

    pthread_mutex_init(&(dsdemo->major_start), NULL);
    pthread_mutex_init(&(dsdemo->minor_start), NULL);
    pthread_mutex_init(&(dsdemo->imagefile_fd_start), NULL);

    dsdemo->ChannelHandle = ChannelHandle;

    GetVideoPara(dsdemo->ChannelHandle, &(dsdemo->videostandard), &((dsdemo->v_info).Brightness),
                 &((dsdemo->v_info).Contrast), &((dsdemo->v_info).Saturation),
                 &((dsdemo->v_info).Hue));
    memcpy(&(dsdemo->videoDefault), &(dsdemo->v_info), sizeof(video_info));

    GetCardInfo();
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::SetMotion(const int chan)
{
    dsdemo->motion_list.RectLeft = (SignPort % chan) * (WIN_W / chan);
    dsdemo->motion_list.RectTop = (SignPort / chan) * (WIN_H / chan);
    dsdemo->motion_list.RectRight = (SignPort % chan + 1) * (WIN_W / chan);
    dsdemo->motion_list.RectBottom = (SignPort / chan + 1) * (WIN_H / chan);
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::MotionEnable()
{
    dsdemo->motion_rect.RectLeft = 0;
    dsdemo->motion_rect.RectTop = 0;
    dsdemo->motion_rect.RectRight = 704 - 1;
    dsdemo->motion_rect.RectBottom = GetVideoHeight() - 1;

    if(SetupMotionDetection(dsdemo->ChannelHandle, &(dsdemo->motion_rect), 1) < 0)
        OutputErrorString("<demo_info> setup motion detect(port %d) failed\n", SignPort);
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::SetupMotion()
{
    OutputDebugString("in Dsclass::SetupMotion function\n");
    AdjustMotionDetectPrecision(dsdemo->ChannelHandle, dsdemo->motionSens, 2, 0);
    StartMotionDetection(dsdemo->ChannelHandle);
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::DestoryMotion()
{
    StopMotionDetection(dsdemo->ChannelHandle);
    memset(dsdemo->motion_data, 0, sizeof(dsdemo->motion_data));
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::SetdstRect(const int chan)
{
    if(chan < 2)
    {
        OutputErrorString("<demo_info> chan setting error \n");
        return;
    }
    (dsdemo->dstRect).x = (SignPort % chan) * (WIN_W / chan);
    (dsdemo->dstRect).y = (SignPort / chan) * (WIN_H / chan);
    (dsdemo->dstRect).w = WIN_W / chan;
    (dsdemo->dstRect).h = WIN_H / chan;
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::SetEncoderByFlag()
{
    Frame_info*     infoFrame = &(dsdemo->frameinfo);
    SetIBPMode(dsdemo->ChannelHandle, infoFrame->KeyFrameIntervals, infoFrame->BFrames,
               infoFrame->PFrames, infoFrame->FrameRate);
    SetDefaultQuant(dsdemo->ChannelHandle, infoFrame->IQuantVal, infoFrame->PQuantVal,
                    infoFrame->BQuantVal);
    SetEncoderPictureFormat(dsdemo->ChannelHandle, dsdemo->pictureFormat);

    if(dsdemo->cifqcif_flag)
    {
        SetupSubChannel(dsdemo->ChannelHandle, 1);
        SetIBPMode(dsdemo->ChannelHandle, infoFrame->KeyFrameIntervals, infoFrame->BFrames,
                   infoFrame->PFrames, infoFrame->FrameRate);
        SetDefaultQuant(dsdemo->ChannelHandle, infoFrame->IQuantVal, infoFrame->PQuantVal,
                        infoFrame->BQuantVal);
        SetSubEncoderPictureFormat(dsdemo->ChannelHandle, dsdemo->subpictureFormat);
        SetupSubChannel(dsdemo->ChannelHandle, 0);
    }
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::SetMaxBpsMode()
{
    int                     MaxBps = dsdemo->MaxBps;
    BitrateControlType_t    brc = dsdemo->brc;

    SetupBitrateControl(dsdemo->ChannelHandle, MaxBps);
    SetBitrateControlMode(dsdemo->ChannelHandle, brc);

    SetupSubChannel(dsdemo->ChannelHandle, 1);
    SetupBitrateControl(dsdemo->ChannelHandle, MaxBps);
    SetBitrateControlMode(dsdemo->ChannelHandle, brc);
    SetupSubChannel(dsdemo->ChannelHandle, 0);
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::SetOsddemo()
{
    unsigned short      Translucent = (dsdemo->osdinfo).Translucent;
    int                 Brightness = (dsdemo->osdinfo).Brightness;
    int                 PosX = (dsdemo->osdinfo).PosX;
    int                 PosY = (dsdemo->osdinfo).PosY;

    unsigned short*     p[2];
    unsigned short      format1[] = { PosX, PosY, '办', '公', '点', '\0' };
    unsigned short      format2[] =
    {
        PosX + 64,
        PosY,
        _OSD_YEAR4,
        '-',
        _OSD_MONTH2,
        '-',
        _OSD_DAY,
        ' ',
        _OSD_HOUR24,
        ':',
        _OSD_MINUTE,
        ':',
        _OSD_SECOND,
        '\0'
    };

    p[0] = format1;
    p[1] = format2;
    SetOsdDisplayModeEx(dsdemo->ChannelHandle, Brightness, Translucent, 0x2020000, 2, p);
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::SetDsLogo()
{
    int Translucent = (dsdemo->logoinfo).Translucent;
    int PosX = (dsdemo->logoinfo).PosX;
    int PosY = (dsdemo->logoinfo).PosY;

    int logo_w, logo_h;

    if(LoadYUVFromBmpFile("logo.bmp", logoptr, 128 * 128 * 2, &logo_w, &logo_h) < 0)
    {
        OutputErrorString("<demo_info> load bmp file error! error code is 0x%x!\n",
                          GetLastErrorNum());
        return;
    }

    if(dsdemo->videostandard == StandardNTSC)
    {
        if(SetLogo(dsdemo->ChannelHandle, PosX, PosY, logo_w, logo_h, logoptr) == 0)
            OutputErrorString("<demo_info> set the logo ok! chan%d\n", SignPort);
        else
        {
            OutputErrorString("<demo_info> set the logo failed!chan%d,w*h: %d*%d,error:0x%x\n",
                              SignPort, logo_w, logo_h, GetLastErrorNum());
        }
    }
    else
    {
        if(SetLogo(dsdemo->ChannelHandle, PosX, PosY, logo_w, logo_h, logoptr) == 0)
            OutputErrorString("<demo_info> set the logo ok! chan%d\n", SignPort);
        else
        {
            OutputErrorString("<demo_info> set the logo failed!chan%d,w*h: %d*%d,error:0x%x\n",
                              SignPort, logo_w, logo_h, GetLastErrorNum());
        }
    }

    SetLogoDisplayMode(dsdemo->ChannelHandle, 0xff, 0x0, 0x0, Translucent, 0);
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void Dsclass::GetCardInfo()
{
    int             j;
    unsigned int    boardtype;
    char            serialno[20], serialno_str[20];

    GetBoardInfo(dsdemo->ChannelHandle, &boardtype, serialno);

    for(j = 0; j < 12; j++)
    {
        serialno_str[j] = serialno[j] + 0x30;
    }

    serialno_str[j] = '\0';
    OutputDebugString("card[%d]'s serialno = %s\n", SignPort, serialno_str);
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
int Dsclass::GetVideoHeight()
{
    if(dsdemo->videostandard == StandardNTSC)
        return 480;
    else
        return 576;
}

/*
 =======================================================================================================================
 *
 =======================================================================================================================
 */
void* Dsclass::videopreview()
{
    while(dsdemo->bPreviewThreadRun)
    {
        dsdemo->bPreviewThreadRun = 2;
        usleep(USLEEPTIME);
        if(!(dsdemo->bPreviewOpen))
            continue;

        if(sem_wait(dsdemo->previewconf.SyncSem) == 0)
        {
            if(app)
            {
                app->lock();
            }

            SDL_LockYUVOverlay(dsdemo->pOverlaySurface);
            memcpy(*((dsdemo->pOverlaySurface)->pixels), dsdemo->previewconf.dataAddr,
                   dsdemo->previewconf.imageSize);
            SDL_UnlockYUVOverlay(dsdemo->pOverlaySurface);
            SDL_DisplayYUVOverlay(dsdemo->pOverlaySurface, &(dsdemo->dstRect));
    
            if(app)
            {
                app->unlock();
            }
        }
        else
        {
            usleep(USLEEPTIME);
        }
    }

    OutputDebugString(">>>>exit thread %d exit<<<<<<< \n", SignPort);
}

/*

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -