请freshui看看。在 C中实现Surface显示的问题。

HongMenzhouxiangang 2011-04-08 10:08:16
http://topic.csdn.net/u/20101224/19/8f3ef883-b950-444c-9b28-824d2d34341b.html

你这个回答我没看懂。
我现在想用JNI实现视频图像显示,java层传一个Surface给C,在C中做显示。
Surface::SurfaceInfo info;需要加什么头文件?
...全文
119 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
谢谢!
  • 打赏
  • 举报
回复
谢谢 OExpress
有简单的例子吗?
CyberLogix 2011-04-08
  • 打赏
  • 举报
回复
android_view_surface.cpp会用到colorconvert类,还有一下OPENCORE的转用类比如mediatransfer这些你可以不用,主要是调用surfaceflinger.so中的接口去显示的
  • 打赏
  • 举报
回复
不太明白,已经用java把surface传到C中了,不能直接用吗?android_view_surface.cpp与其它的文件有关联的,剥离出来也是比较麻烦的。不知道有没有必要。我只是想在C中实现显示图片的功能,用Bitmap画,效率实在太低了。
CyberLogix 2011-04-08
  • 打赏
  • 举报
回复
对,从android_view_surface.cpp中剥出来就可以了。
  • 打赏
  • 举报
回复
C/C++ code
int lock_surface(unsigned char **ppbuf, int *width, int *height, int *bpp){
unsigned short *surfaceBuffer;
Surface::SurfaceInfo info;
Region dirtyRegion;

// invalid the whole surface
dirtyRegion.set(Rect(0x3FFF, 0x3FFF));

if(g_surface == NULL){
LOGD("Error! surface not initialized!\n");
return -1;
}

status_t err = g_surface->lock(&info, &dirtyRegion);

if (err < 0) {
return -1;
}

*ppbuf = (unsigned char *)info.bits;
*width = info.w;
*height = info.h;

switch(info.format){
case PIXEL_FORMAT_RGBA_8888:
case PIXEL_FORMAT_RGBX_8888:
case PIXEL_FORMAT_BGRA_8888:
*bpp = 4;
break;
case PIXEL_FORMAT_RGB_888:
*bpp = 3;
break;

case PIXEL_FORMAT_RGB_565:
case PIXEL_FORMAT_RGBA_5551:
case PIXEL_FORMAT_RGBA_4444:
*bpp = 2;
break;

default:
return -1;
}

return 0;
}



C/C++ code
int unlock_and_post_surface(void){

if(g_surface == NULL){
LOGD("Error! surface not initialized!\n");
return -1;
}

return g_surface->unlockAndPost();
}



调用的地方:
C/C++ code
if(lock_surface(&graphic_buf, &output_width, &output_height, &bpp) < 0){
LOGE("ERROR! can not lock canvas");
continue;
}
yuv420_2_rgb565(yuv_location, graphic_buf,
output_width, output_height, output_width<<1);
unlock_and_post_surface();



怎么获取surfaceView的native surface,从android_view_surface.cpp中剥出来就可以了。
影子LEON 2011-04-08
  • 打赏
  • 举报
回复
int lock_surface(unsigned char **ppbuf, int *width, int *height, int *bpp)
这个函数中ppbuf传回是绘图的首地址
你只需要把解码处理的图片数据copy到这个地址里
然后调用unlock_and_post_surface让surfaceflinger去显示就OK了

其实freshui大侠的代码已经讲得很清楚
如果不明白的话建议去看下surface跟SurfaceFlinger这个部分

http://blog.csdn.net/DroidPhone/archive/2010/10/28/5972568.aspx

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧