5132|19

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

6410同时编解码问题 [复制链接]

下面函数实现从camera -> yuv -> encoder -> stream buffer -> decoder -> yuv buffer -> display
void H264codecLoopBack(void)
{
//编码变量初始化(encoder init)
                int            ret;
    unsigned int   width, height;
    unsigned int   frame_rate, bitrate, gop_num;
    unsigned int   intraqp, qpmax;
    float gamma;
    unsigned int   num_slices;


    width      = 640;
    height     = 480;
    frame_rate = 25;
    bitrate    = 900;
    gop_num    = 12;

    intraqp = 24;// (25 25)
    qpmax = 24;//32;//50;(12,20,22)
    gamma = 0.75;
                long sizef;

//====================================================================
    int      nLoop;
    DWORD    t1, t2, t_diff;    // tick for performance measurement
    int      perf_disp_period = 100;
    wchar_t  str_performance[8];
    float    fps;
//decoder
    unsigned char     *pStrmBuf;
    int                nFrameLeng;
    unsigned char     *pYUVBuf;
    int                nYUVLeng;

    FRAMEX_CTX        *pFrameExCtx;

    unsigned char     *delimiter;
    int                delimiter_leng;
                FRAMEX_STRM_PTR file_strm;
    SSBSIP_H264_STREAM_INFO stream_info;

    SIZE_IMG_IDX   size_img_idx;
//=================================================================================
       
#ifdef CODEC_FLAG
//Encoder init
//初始化编码器
    //////////////////////////////////////
    ///    1. Create new instance      ///
    ///      (SsbSipH264EncodeInit)    ///
    //////////////////////////////////////
    encoderHandle = SsbSipH264EncodeInit(width, height, frame_rate, bitrate, gop_num, intraqp, qpmax, gamma);
    RETAILMSG(1,(L"\n HANDLE = 0x%X.\n", (DWORD) encoderHandle));
    if (encoderHandle == NULL) {
        return ;
    }

    ////////////////////////////////////////////////////////////////////
    ///    2. Set some configuration parameter for initialization    ///
    ///       (SsbSipH264EncodeExe)                                  ///
    ////////////////////////////////////////////////////////////////////
    num_slices = 4;
//    SsbSipH264EncodeSetConfig(handle, H264_ENC_SETCONF_NUM_SLICES, &num_slices);


    ////////////////////////////////////////////////
    ///    3. Initialize the Encoder Instance    ///
    ///       (SsbSipH264EncodeExe)              ///
    ////////////////////////////////////////////////
    if (SsbSipH264EncodeExe(encoderHandle) != SSBSIP_H264_ENC_RET_OK) {
        RETAILMSG(1,(L"H.264 Encoder Instance Initialization Failed.\n"));
        return ;
    }

    p_inbuf = (unsigned char *)SsbSipH264EncodeGetInBuf(encoderHandle, 0);
    if (p_inbuf == NULL) {
        RETAILMSG(1,(L"\n (ERROR)Input buffer is NULL\n"));
        return ;
    }

//填充满H264流buffer //fill all H264 stream buffers
        encoderFrameBufCounter=inYUVbufCounter;
        for (nLoop=0; nLoop                 if(encoderFrameBufCounter!=inYUVbufCounter)
                {
                        memcpy(p_inbuf,inYUVbuf[encoderFrameBufCounter],BUFF_SIZE);
                        ret = SsbSipH264EncodeExe(encoderHandle);
                        p_outbuf = (unsigned char *)SsbSipH264EncodeGetOutBuf(encoderHandle, &sizef);
                       

                        memcpy(streamBufferInfo[encoderFrameBufCounter].strmBuf,p_outbuf,sizef);
                        streamBufferInfo[encoderFrameBufCounter].size=sizef;
                        nLoop++;
                        if(++encoderFrameBufCounter==MAX_STREAM_BUFFER_NUM)encoderFrameBufCounter=0;
                }
                Sleep(5);
        }
        //RETAILMSG(1,(L"\n Filled Frame buffer\n"));

//==========================================================================================
//Decoder
//初始化解码器
        delimiter      = delimiter_h264;
        delimiter_leng = sizeof(delimiter_h264);

        ///////////////////////////////////
        // FrameExtractor Initialization //
        ///////////////////////////////////
        pFrameExCtx = FrameExtractorInit(FRAMEX_IN_TYPE_MEM, delimiter, delimiter_leng, 1);

        //////////////////////////////////////
        ///    1. Create new instance      ///
        //////////////////////////////////////
        decoderHandle = SsbSipH264DecodeInit();
        if (decoderHandle == NULL) {
            RETAILMSG(1,(L"Decoder Init Failed.\n"));
            return ;
        }

        /////////////////////////////////////////////
        ///    2. Obtaining the Input Buffer      ///
        ///      (SsbSipH264DecodeGetInBuf)       ///
        /////////////////////////////////////////////
        pStrmBuf = (unsigned char *) SsbSipH264DecodeGetInBuf(decoderHandle, 204800);
        if (pStrmBuf == NULL) {
            RETAILMSG(1,(L"SsbSipH264DecodeGetInBuf Failed.\n"));
            SsbSipH264DecodeDeInit(decoderHandle);
            return ;
        }
                //copy first frame to decoder
                                memcpy(pStrmBuf,streamBufferInfo[encoderFrameBufCounter].strmBuf,streamBufferInfo[encoderFrameBufCounter].size);
                                nFrameLeng=streamBufferInfo[encoderFrameBufCounter].size;
        ////////////////////////////////////////////////////////////////
        ///    3. Configuring the instance with the config stream    ///
        ///       (SsbSipH264DecodeExe)                             ///
        ////////////////////////////////////////////////////////////////
        if (SsbSipH264DecodeExe(decoderHandle, nFrameLeng) != SSBSIP_H264_DEC_RET_OK) {
            RETAILMSG(1,(L"H.264 Decoder Configuration Failed.\n"));
            return ;
        }
   
        /////////////////////////////////////
        ///   4. Get stream information   ///
        /////////////////////////////////////
        SsbSipH264DecodeGetConfig(decoderHandle, H264_DEC_GETCONF_STREAMINFO, &(stream_info));
        //RETAILMSG(1,(L"\n\t width=%d   height=%d.\n", stream_info[pip].width, stream_info[pip].height));


    // Performance display interval setting
    if ((stream_info.width == 320) && (stream_info.height == 240)) {
        size_img_idx = SIZE_IMG_QVGA;
        perf_disp_period = 200;
    }
    else if ((stream_info.width == 640) && (stream_info.height == 480)) {
        size_img_idx = SIZE_IMG_VGA;
        perf_disp_period = 100;
    }
    else if ((stream_info.width == 720) && (stream_info.height == 480)) {
        size_img_idx = SIZE_IMG_SD;
        perf_disp_period = 60;
    }
    else if ((stream_info.width == 720) && (stream_info.height == 576)) {
        size_img_idx = SIZE_IMG_SD;
        perf_disp_period = 60;
    }
    else {
        size_img_idx = SIZE_IMG_UNDEF;
        perf_disp_period = 100;
    }
        decoderBufCounter = 0;


//===========================================================================================

        t1 = GetTickCount();

    for (nLoop=0; ; ) {
        //wait for camera one yuv  stream buffer
                if (WaitForSingleObject(hDecoderEvent, INFINITE) == WAIT_OBJECT_0) //等待送camera 一帧数据
                {

                        memcpy(p_inbuf,inYUVbuf[encoderFrameBufCounter],BUFF_SIZE); //送camera一帧YUV        数据到编码器 //send yuv frame to encoder
                        ret = SsbSipH264EncodeExe(encoderHandle);//编码
                        p_outbuf = (unsigned char *)SsbSipH264EncodeGetOutBuf(encoderHandle, &sizef);
                        memcpy(streamBufferInfo[encoderFrameBufCounter].strmBuf,p_outbuf,sizef); //copy编码后的H264数据流到解码buffer //get stream to decoder buffer
                        streamBufferInfo[encoderFrameBufCounter].size=sizef;//保留H264数据流

//直接copy到显示buffer //show camera  yuv  buffer to display
                        //memcpy(decoderOutBuf[decoderBufCounter],inYUVbuf[encoderFrameBufCounter],BUFF_SIZE);
                        //if(++decoderBufCounter==MAX_STREAM_BUFFER_NUM)decoderBufCounter=0;


#ifdef DECODER_FLAG
                        //////////////////////////////////
            ///       5. DECODE            ///
            ///    (SsbSipH264DecodeExe)   ///
            //////////////////////////////////
            if (SsbSipH264DecodeExe(decoderHandle, nFrameLeng) != SSBSIP_H264_DEC_RET_OK) {
//                sprintf(msg, "\n\t Error in decoding -th video, %d-th frame\n", nLoop);
                                                                RETAILMSG(1,(L"DECODE ERROR\n"));
                continue;
            }

            //////////////////////////////////////////////
            ///    6. Obtaining the Output Buffer      ///
            ///      (SsbSipH264DecodeGetOutBuf)       ///
            //////////////////////////////////////////////
            pYUVBuf = (unsigned char *) SsbSipH264DecodeGetOutBuf(decoderHandle, (long *) &(nYUVLeng));

                              //copy到显示buffer   获得解码后的yuv buffer到显示缓冲区   //copy decoder output yuv buffer to display buffer
                                                memcpy(decoderOutBuf[decoderBufCounter],pYUVBuf,nYUVLeng);
                                                if(++decoderBufCounter==MAX_STREAM_BUFFER_NUM)decoderBufCounter=0;

            ///////////////////////
            // Next VIDEO stream //
            ///////////////////////
            //将解码流数据buffer送入解码器 //copy next stream frame to decoder
                                                memcpy(pStrmBuf,streamBufferInfo[encoderFrameBufCounter].strmBuf,streamBufferInfo[encoderFrameBufCounter].size);
                                                nFrameLeng=streamBufferInfo[encoderFrameBufCounter].size;


#endif
//下一帧数据指针 //point++
                                        if(++encoderFrameBufCounter==MAX_STREAM_BUFFER_NUM)encoderFrameBufCounter=0;//=((cameraFrameBufCounter+2)%MAX_CAMERA_BUFFER_NUM);
                                        //RETAILMSG(1,(L"H.264 Encoder finish %x. %x\n",encoderFrameBufCounter,sizef));
                                        nLoop++;
                }
//计算帧率 //count frame rate
                if (nLoop == perf_disp_period) {
            t2 = GetTickCount();
            t_diff = t2 - t1;
            fps = (float)(1000 * nLoop) / t_diff;
            wsprintf(str_performance, L"%3.1f", fps);
                                                RETAILMSG(1,(L"Decoder =%s fps\n", str_performance));
            nLoop = 0;
            t1 = GetTickCount();
        }
    }

}


同时编解码附件是个从camera -> yuv -> encoder -> stream buffer -> decoder -> yuv buffer -> display buffer的一个函数,里面都是按demo程序设计。
问题:目前显示的没有马赛克,但图像显示会看到一帧一帧的不连贯(计算显示还是25帧)。
如果单编码的话(不执行解码)图像更可以非常流畅;甚至参数可以降低到:
{
    width      = 640;
    height     = 480;
    frame_rate = 25;
    bitrate    = 800;
    gop_num    = 50;

    intraqp = 1;
    qpmax = 32;//32;//50;
    gamma = 0.75;
}
也一样流畅,没有马赛克。这组参数放到同时编解码的话会运动图像有马赛克。
请帮看看参数设置不对还是流程不对,非常感谢。

最新回复

不知各位的问题有没有解决?我在同时编解码时,经常会出时超时,各位有没有碰到这样的问题?  详情 回复 发表于 2010-2-5 14:18
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
也在看这方面的东西帮顶一下.你的NK有没加那些FILTER?要不然怎么可以解码成功?!
 
 

回复

6

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
引用 1 楼 xqhrs232 的回复:
也在看这方面的东西帮顶一下.你的NK有没加那些FILTER?要不然怎么可以解码成功?!

没加什么东西
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
帮顶,留个位置
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
帮顶一下.
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

6
 
引用 1 楼 xqhrs232 的回复:
也在看这方面的东西帮顶一下.你的NK有没加那些FILTER?要不然怎么可以解码成功?!


我倒,这是6410的硬件编解码,直接调用MFC驱动完成的。需要啥filter?
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

7
 
其实6410下的MFC驱动还是被封装成了几DLL的,这个DLL其实也可以说是FILTER了.MFC只是最低层的一个流接口驱动,应该要用到三星提供的SAMPLES\DIRECTXSHOWFILTER里面的那些东西的.(也就是FILTER的DLL).
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 6 楼 xqhrs232 的回复:
其实6410下的MFC驱动还是被封装成了几DLL的,这个DLL其实也可以说是FILTER了.MFC只是最低层的一个流接口驱动,应该要用到三星提供的SAMPLES\DIRECTXSHOWFILTER里面的那些东西的.(也就是FILTER的DLL).


Filter是驱动之上的东西,在应用程序和驱动之间的。驱动其实可以不必支持dshow(不提供pin相关的接口),这样你Filter根本会用不了。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
FILTER也可以,不用FILTER也可以呀!用TCPMP来调用它吧!
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(中级)

10
 
没人做过?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
   我做过
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
能否分享一下经验?

应用是同时VGA编解码,datasheet上说同时可以达到30fps,现在我只做编码时设置编码初始化参数如下:
{
        width      = 640;    height     = 480;    frame_rate = 25;    bitrate    = 800;    gop_num    = 50;    intraqp = 1;    qpmax = 32;             gamma = 0.75;
       encoderHandle = SsbSipH264EncodeInit(width, height, frame_rate, bitrate, gop_num, intraqp, qpmax, gamma);
    }
图像非常流畅,没有马赛克。如果把解码进程加上,这时如果是多线程的话解码图像也会有不定时会出现编码文件图像。而且编码后得到的图像运动时会有马赛克。同时编码达不到25fps。理论上不应有这种情况。
所以现在是两个问题都在同时VGA编解码时出现:
1.同时编解码时,编码参数设置后达不到编码的效果。
2.同时编解码时,解码端得图像随机会出现编码文件(或摄像头)的图像。或者一个程序进行编码,另一个程序解码显示一样会出现同样问题。

有上面这些情况吗?

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 11 楼 myearth 的回复:
能否分享一下经验?

应用是同时VGA编解码,datasheet上说同时可以达到30fps,现在我只做编码时设置编码初始化参数如下:
{
? ? ? ? width? ? ? = 640;? ? height? ? = 480;? ? frame_rate = 25;? ? bitrate? ? = 800;? ? gop_num? ? = 50;? ? intraqp = 1;? ? qpmax = 32;? ? ? ? ? ? gamma = 0.75;
? ? ? encoderHandle = SsbSipH264EncodeInit(width, height, frame_rate, bitrate, gop_num, intraqp, qpmax, gamma);
? ? }
图像非常流畅,没有马赛克。如果把解码进程加上,这时如果是多线程的话解码图像也会有不定时会出现编码文件图像。而且编码后得到的图像运动时会有马赛克。同时编码达不到25fps。理论上不应有这种情况。
所以现在是两个问题都在同时VGA编解码时出现:
1.同时编解码时,编码参数设置后达不到编码的效果。
2.同时编解码时,解码端得图像随机会出现编码文件(或摄像头)的图像。或者一个程序进行编码,另一个程序解码显示一样会出现同样问题。

有上面这些情况吗?




我也出现,解码时,得到了编码的帧。。我是网络视频传输。自己方的图像是编码然后发送到对方去解码显示,自己也不断接收对方的数据显示。但是有时候我竟然显示出本地的图像。这就是在解码操作的时候,被编码的线程干扰了。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
你修改MFC的驱动还是MFC lib?
已经确定是三星的问题了。
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

15
 
关注
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 13 楼 myearth 的回复:
你修改MFC的驱动还是MFC lib?
已经确定是三星的问题了。


没改他驱动,除非你把他CPU手册关于MFC那块研究透了,否则很难改。我稍微看了下他的驱动和手册,据说是可以同时支持8个处理,我才同时进行2个,就出现这样的情况。我开始以为是用法不对,后面看他的例子,都是只解码,或者只编码的。就没有同时编解码的
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 15 楼 qwqwqw408 的回复:
引用 13 楼 myearth 的回复:
你修改MFC的驱动还是MFC lib?
已经确定是三星的问题了。


没改他驱动,除非你把他CPU手册关于MFC那块研究透了,否则很难改。我稍微看了下他的驱动和手册,据说是可以同时支持8个处理,我才同时进行2个,就出现这样的情况。我开始以为是用法不对,后面看他的例子,都是只解码,或者只编码的。就没有同时编解码的


那只有等三星修改过后处理这个问题了。这个问题我已反馈给他们了,可能要等一阵子才能回复。
有结果我会通知大家。
 
 
 

回复

1

帖子

0

TA的资源

禁止访问

18
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

19
 
引用 17 楼 qwqwqw408 的回复:
? 楼主,现在有什么消息了没。我用三星自己写的demo播放H264文件时,都有问题,屏幕会闪烁。

单编单解是没有问题的。三星的FAE真慢,还没反馈到三星总部。这个问题已经确认了。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

20
 
不知各位的问题有没有解决?我在同时编解码时,经常会出时超时,各位有没有碰到这样的问题?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表