Android下基于SDL的YUV渲染
实战篇
本文主要参考我之前整理的文章windows下使用SDL进行YUV渲染。
相对于之前写的位图渲染部分(http://www.cnblogs.com/tocy/p/android-sdl-bitmap-render-coding.html),yuv渲染主要是增加了yuv加载、texture更新部分。注意本部分的介绍内容是在Android位图渲染框架下增加的YUV渲染部分(具体参考Android下基于SDL的位图渲染(二)理论篇)。
主要执行流程如下:
- 初始化SDL window和render
- 加载yuv数据
- 创建SDL texture
- 使用yuv数据更新texture
- texture通过render渲染到window上
- 资源销毁及释放
- 调用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渲染的更多相关文章
- Android下基于SDL的位图渲染(二)理论篇
理论篇 上一篇中介绍了如何将SDL2源码应用到Android渲染中,实际上SDL本身提供的android-project实现了基于android的c运行时环境,通过上面实践篇的介绍,就是完成这个环境搭 ...
- Android下基于SDL的位图渲染(一)
环境准备 安装Android开发环境(java.android-sdk.android ndk.gcc). 我使用的ndk版本是r10b/r10d,在win10/ubutu 15.04编译 下载sdl ...
- Android下基于PCM的音频渲染
环境准备 请按照我之前的文章-Android下基于SDL的位图渲染,安装必要的开发环境. 实践篇 这里主要参考Beginning SDL 2.0(6) 音频渲染及wav播放,只不过将源从WAV文件改成 ...
- Android下基于线程池的网络访问基础框架
引言 现在的Android开发很多都使用Volley.OkHttp.Retrofit等框架,这些框架固然有优秀的地方(以后会写代码学习分享),但是我们今天介绍一种基于Java线程池的网络访问框架. 实 ...
- Dalvik模式下基于Android运行时类加载的函数dexFindClass脱壳
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78003184 前段时间在看雪论坛发现了<发现一个安卓万能脱壳方法>这篇 ...
- SDL播放YUV——循环
#include "SDL.h" #include "as_lesson_log.h" #define PATH_YUV420 "/sdcard/ou ...
- SDL 开发实战(六): 使用 SDL 实现 YUV 播放器
前面铺垫了这么多,现在终于进入核心的主题了,那就是使用SDL播放视频,本节我们将使用SDL播放YUV视频,也就是做一个YUV播放器. 下面说明一下使用SDL播放YUV视频的基本流程,主要分为两大部分: ...
- Android下OpenCV的环境搭建
目录(?)[-] 前言 系统环境 相关工具 Android ADT环境搭建 Android SDK环境变量的配置 Android NDK的安装与配置 OpenCV for Android 环境搭建 基 ...
- android下的数据存储
android下数据存储的几种方式:(简单讨论) 1.文件 举例:登陆时“记住密码” 因为是基于Linux系统,直接建文件,文件会出现在项目工程:而手机登陆时,应该把文件放在手机里,通常数据放在dat ...
随机推荐
- java struts2入门学习--基于xml文件的声明式验证
一.知识点总结 后台验证有两种实现方式: 1 手工验证顺序:validateXxx(针对Action中某个业务方法验证)--> validate(针对Action中所有的业务方法验证) 2 声明 ...
- struts2基本配置详解2
接上篇struts2基本配置详解,还有一些配置没有讲到,下面将继续. struts.xml <package name="com.amos.web.action" names ...
- iOS 关于 GIF 图片那点事
前言 前几天我们项目组的群里提了这么一件事情:在我们的应用中存储动态的GIF图到相册,保存的图片变成了静态图片.而微博则能正确保存,可见这并不是一个技术不可实现的.前不久刚好看了苹果关于ImageIO ...
- C 简单1
#include <stdio.h> #define Height 10 int main(){ int width; int clong; int result; printf(&quo ...
- hashCode和identityHashCode 的关系
1:首先看一下JDk API的观点 1-1:hashCode方法相关 1-2:identityHashCode()方法相关 2:此例的核心程序,对应的观点在注释中已经有所说明,请自己也动手实验一下看看 ...
- 基于matplotlib的数据可视化 - 热图imshow
热图: Display an image on the axes. 可以用来比较两个矩阵的相似程度 mp.imshow(z, cmap=颜色映射,origin=垂直轴向) imshow( X, cma ...
- mvc 文件压缩 减少文件大小
using System; using System.Collections.Generic; using System.IO.Compression; using System.Linq; usin ...
- python 爬虫 重复下载 二次请求
在写爬虫的时候,难免会遇到报错,比如 4XX ,5XX,有些可能是网络的原因,或者一些其他的原因,这个时候我们希望程序去做第二次下载, 有一种很low的解决方案,比如是用 try except t ...
- JPA之@GeneratedValue注解(转)
JPA的@GeneratedValue注解,在JPA中,@GeneratedValue注解存在的意义主要就是为一个实体生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键), ...
- appium通过同级别(兄弟关系)元素找到元素
在做appium测试用例的时候,要获取金额值,用uiautomatorviewer查看该元素,该元素没有特别明显的个性特点,唯一有特点的定位是有content-desc值,但是该值是变动的,所以无法通 ...