实战篇

本文主要参考我之前整理的文章windows下使用SDL进行YUV渲染

相对于之前写的位图渲染部分(http://www.cnblogs.com/tocy/p/android-sdl-bitmap-render-coding.html),yuv渲染主要是增加了yuv加载、texture更新部分。注意本部分的介绍内容是在Android位图渲染框架下增加的YUV渲染部分(具体参考Android下基于SDL的位图渲染(二)理论篇)。

主要执行流程如下:

  1. 初始化SDL window和render
  2. 加载yuv数据
  3. 创建SDL texture
  4. 使用yuv数据更新texture
  5. texture通过render渲染到window上
  6. 资源销毁及释放
  7. 调用SDL_Quit通知Activity退出

实现的代码如下:

extern "C" int yuv_main(int argc, char *argv[])
{
// init sdl
if (!init())
{
LOGE("%s %d SDL init failed", __FUNCTION__, __LINE__);
deinit();
return -1;
} // load yuv
const char *yuv_path = "/sdcard/test_720x576.yuv";
LOGI("natvie_SDL %s", yuv_path);
yuv_frame.width = 720;
yuv_frame.height = 576;
if (!load_yuv(yuv_path))
{
LOGE("%s %d load yuv failed", __FUNCTION__, __LINE__);
deinit();
return -2;
} // texture operation
texture_create(yuv_frame.width, yuv_frame.height);
texture_update();
texture_render(); SDL_Delay(2000); // free resources
unload_yuv();
texture_destory();
deinit(); // Quit SDL
SDL_Quit(); return 0;
}

其中texture_update实现代码如下:

static void texture_update()
{
void * pixel = NULL;
int pitch = 0;
if(0 == SDL_LockTexture(texture, NULL, &pixel, &pitch))
{
// 如果不考虑数据对齐,直接拷贝YUV数据是没有问题的
if (pitch == yuv_frame.width)
{
memcpy(pixel, yuv_frame.data[0], yuv_frame.frame_size);
}
else // 可能发生pitch > width的情况
{
// 如果有数据对齐的情况,单独拷贝每一行数据
// for Y
int h = yuv_frame.height;
int w = yuv_frame.width;
unsigned char * dst = reinterpret_cast<unsigned char *>(pixel);
unsigned char * src = yuv_frame.data[0]; for (int i = 0; i < h; ++i)
{
memcpy(dst, src, w);
dst += pitch;
src += w;
} h >>= 1;
w >>= 1;
pitch >>= 1; // for U
src = yuv_frame.data[1];
for (int i = 0; i < h; ++i)
{
memcpy(dst, src, w);
dst += pitch;
src += w;
} // for V
src = yuv_frame.data[2];
for (int i = 0; i < h; ++i)
{
memcpy(dst, src, w);
dst += pitch;
src += w;
}
} SDL_UnlockTexture(texture);
}
}

关于texture也可以调用SDL_UpdateTexture

附加说明

源码下载

本文中涉及所有源码可以从我的git@OSC,下载之后需要切换到yuv_render的tag即可。

其他

本文主要目的是说明如何通过SDL在Android下渲染yuv数据。

重复调用texture_update()和texture_render()并更新yuv数据即可实现YUV视频序列的渲染。

如果配合ffmpeg的解码器就可以实现视频播放器的功能(ffmpeg解码器多数输出是基于YUV420的原始视频数据),当然需要考虑同步和缓冲相关问题。

Android下基于SDL的YUV渲染的更多相关文章

  1. Android下基于SDL的位图渲染(二)理论篇

    理论篇 上一篇中介绍了如何将SDL2源码应用到Android渲染中,实际上SDL本身提供的android-project实现了基于android的c运行时环境,通过上面实践篇的介绍,就是完成这个环境搭 ...

  2. Android下基于SDL的位图渲染(一)

    环境准备 安装Android开发环境(java.android-sdk.android ndk.gcc). 我使用的ndk版本是r10b/r10d,在win10/ubutu 15.04编译 下载sdl ...

  3. Android下基于PCM的音频渲染

    环境准备 请按照我之前的文章-Android下基于SDL的位图渲染,安装必要的开发环境. 实践篇 这里主要参考Beginning SDL 2.0(6) 音频渲染及wav播放,只不过将源从WAV文件改成 ...

  4. Android下基于线程池的网络访问基础框架

    引言 现在的Android开发很多都使用Volley.OkHttp.Retrofit等框架,这些框架固然有优秀的地方(以后会写代码学习分享),但是我们今天介绍一种基于Java线程池的网络访问框架. 实 ...

  5. Dalvik模式下基于Android运行时类加载的函数dexFindClass脱壳

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78003184 前段时间在看雪论坛发现了<发现一个安卓万能脱壳方法>这篇 ...

  6. SDL播放YUV——循环

    #include "SDL.h" #include "as_lesson_log.h" #define PATH_YUV420 "/sdcard/ou ...

  7. SDL 开发实战(六): 使用 SDL 实现 YUV 播放器

    前面铺垫了这么多,现在终于进入核心的主题了,那就是使用SDL播放视频,本节我们将使用SDL播放YUV视频,也就是做一个YUV播放器. 下面说明一下使用SDL播放YUV视频的基本流程,主要分为两大部分: ...

  8. Android下OpenCV的环境搭建

    目录(?)[-] 前言 系统环境 相关工具 Android ADT环境搭建 Android SDK环境变量的配置 Android NDK的安装与配置 OpenCV for Android 环境搭建 基 ...

  9. android下的数据存储

    android下数据存储的几种方式:(简单讨论) 1.文件 举例:登陆时“记住密码” 因为是基于Linux系统,直接建文件,文件会出现在项目工程:而手机登陆时,应该把文件放在手机里,通常数据放在dat ...

随机推荐

  1. libev ev_init分析

    /* these may evaluate ev multiple times, and the other arguments at most once */ /* either use ev_in ...

  2. 工程部署从tomcat6.0迁移到jboss6.0错误总结

    2014-11-08 内容存档在evernote,笔记名"工程部署从tomcat6.0迁移到jboss6.0错误总结"

  3. POJ 1486 Sorting Slides (KM)

    Sorting Slides Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2831   Accepted: 1076 De ...

  4. 图形对象函数figure() 及 子图创建函数subplot()

    1 图像对象创建函数figure 创建图形Creates a new figure, 图形名既可以作为显示在图形窗口标题栏中的文本,也是该对象的名称 也可以通过mp.figure()获取(或激活)已创 ...

  5. Docker 的技术组件

    Docker可以运行于任何安装了现代Linux内核的x64主机上.推荐的内核版本是3.8或者更高.Docker的开销比较低,可用于服务器.台式机或者笔记本.它包括以下几个部分. 一个原生的Linux容 ...

  6. iOS自己主动化測试的那些干货

    前言 假设有測试大佬发现内容不正确.欢迎指正,我会及时改动. 大多数的iOS App(没有持续集成)迭代流程是这种 也就是说.測试是公布之前的最后一道关卡.假设bug不能在測试中发现,那么bug 就会 ...

  7. ARGB和PARGB

    原文链接: http://blog.csdn.net/lnwaycool/article/details/8610313 ARGB和PARGB是针对32位图像而言的,Windows下图像可以是1位.4 ...

  8. T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他

    简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能.但索引可以在大多数情况下大大提升查询性能,在OLAP中尤其明显.要完全理解索 ...

  9. springcloud中概念辨析

    1 什么是微服务? 微服务架构是一种架构模式或者一种架构风格,他提倡将单一应用程序划分成一组小的服务,每个服务运行在独立进程中,服务之间相互协调.相互配合.服务之间采用轻量级的通信机制(一般是基于HT ...

  10. MySQL8的新特性CTE

    [瞎BB] 十一长假的最后一天,想到明天要就回去上班了:内心的激动无法用平常的言语来表达,可能是国人的感情向来比较内敛(这个锅不能我一个人背) 也可能是我们比较重行动(Just Do IT).但... ...