Firefly开源社区

12
发表新贴
打印 上一主题 下一主题

请问直接调用surface c++层有旋转的函数吗

31

积分

0

威望

0

贡献

技术小白

积分
31

请问直接调用surface c++层有旋转的函数吗

发表于 2015-7-27 09:11:17      浏览:16288 | 回复:11        打印      只看该作者   [复制链接] 楼主
我调用的surface c++层接口来直接显示的yuv数据,在特殊的情景下,我得到的jpeg是倒得,想在显示的时候旋转过来,不知道用什么方法可以,下面是部分代码。谢谢

static RK_S32 surface_init()
{
        if (init_flag == 0)
        {
                DisplayInfo dinfo;  

                // create a client to surfaceflinger   
                client = new SurfaceComposerClient();  
                sp<IBinder> dtoken(SurfaceComposerClient::getBuiltInDisplay(  
                                        ISurfaceComposer::eDisplayIdMain));  

                //获取屏幕的宽高等信息   
                status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &dinfo);  
                SHOW_YUV_LOGI("w=%d,h=%d,xdpi=%f,ydpi=%f,fps=%f,ds=%f\n",   
                                dinfo.w, dinfo.h, dinfo.xdpi, dinfo.ydpi, dinfo.fps, dinfo.density);  
                if (status)  
                        return -1;  

                //创建surface   
                surfaceControl = client->createSurface(String8("surface"),  
                                dinfo.w, dinfo.h, PIXEL_FORMAT_RGBA_8888, 0);  

                init_flag = 1;
        }
        return 0;
}

RK_S32 show_yuv(RK_U8 *yuv_data, RK_U32 frameSize, jpeg_info jpg_info)
{
        if (yuv_data == NULL)
        {
                SHOW_YUV_LOGW("input yuv_data is null\n");
                return -1;
        }

        surface_init();

        /*************************get yuv data from file;****************************************/            
        SHOW_YUV_LOGI("frameSize:%d\n", frameSize);
        unsigned char *data = new unsigned char[frameSize];  
        memcpy(data, yuv_data, frameSize);

        /*********************配置surface************************************/  
        SurfaceComposerClient::openGlobalTransaction();  
        surfaceControl->setLayer(100000);//设定Z坐标   
        SHOW_YUV_LOGI("left:%d top:%d\n", jpg_info.left, jpg_info.top);
        surfaceControl->setPosition(jpg_info.left, jpg_info.top);//以左上角为(0,0)设定显示位置   
        surfaceControl->setSize(jpg_info.width, jpg_info.height);//设定视频显示大小   
        SurfaceComposerClient::closeGlobalTransaction();  
        sp<Surface> surface = surfaceControl->getSurface();  

        /**********************显示yuv数据*****************************************/     
        render(data,frameSize,surface,jpg_info.width,jpg_info.height);  //这个函数的实现没有贴出来
        delete [] data;
        data = NULL;
        return 0;
}
回复

使用道具 举报

63

积分

0

威望

0

贡献

技术小白

积分
63
发表于 2015-7-27 09:25:42        只看该作者  沙发
你贴的代码是哪个文件的,给个文件路径看看。
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2015-7-27 09:42:01        只看该作者  板凳
我是从网上找的,关于用surface显示yuv数据的代码,经测试这个例子可以使用,就是遇到翻转的问题了。


谢谢
回复

使用道具 举报

63

积分

0

威望

0

贡献

技术小白

积分
63
发表于 2015-7-27 10:07:07        只看该作者  地板
楼主的jpeg是摄像头的数据吗?
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2015-7-27 10:09:33        只看该作者  5#
是通过spice连接远程桌面后,播放视频的数据
回复

使用道具 举报

63

积分

0

威望

0

贡献

技术小白

积分
63
发表于 2015-7-27 11:38:03        只看该作者  6#
好像没有直接旋转的方法,但是SurfaceControl有个setMatrix的方法好像可以实现旋转。试一下用这个方法,默认是1,0,0,1,应该是cosX,-sinX,sinX,cosX的值。试一下surfaceControl->setMatrix(-1,0,0,-1);看有没有效。
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2015-7-27 11:48:37        只看该作者  7#
surfaceControl->setMatrix(-1,0,0,-1);加上后,不显示了
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2015-7-27 13:55:55        只看该作者  8#
请问opengl可以显示yuv格式的数据吗
回复

使用道具 举报

63

积分

0

威望

0

贡献

技术小白

积分
63
发表于 2015-7-27 16:39:56        只看该作者  9#
surfaceControl->setMatrix(-1,0,0,-1);加上后,不显示了,说明这个setMatirx是有用的。你要调对这个四个参数就应该可以了。你可以试一下cosX,-sinX,sinX,cosX把X的值取小一点,比如10度,然后看它旋转的规律,然后变化X来调。
回复

使用道具 举报

63

积分

0

威望

0

贡献

技术小白

积分
63
发表于 2015-7-27 16:41:18        只看该作者  10#
->请问opengl可以显示yuv格式的数据吗

是可以的,要使用opengl es 2.0的shader功能是可以显示yuv的。
回复

使用道具 举报

返回列表
12
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表