- 浏览: 690000 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (440)
- c++学习笔记 (89)
- 如何适应变化 (1)
- VC常见问题 (7)
- Brew开发12月9日至12月26日 (1)
- 软件架构 (3)
- 自己动手写C语言编译器之文档翻译工作 (1)
- 自己动手写C语言编译器 (6)
- 网站资源 (1)
- 郝彬英文教程 (1)
- 45度斜角地图 (0)
- 35.264等角视图 (0)
- 30等角视图 (1)
- 如何搞opengl (1)
- 卷积。 (1)
- Android解析日记 (5)
- Linux基础教学 (9)
- Android游戏框架 (9)
- Android游戏开发之OpenGL之坐标矩阵 (2)
- Android异常处理 (1)
- 资源网站 (1)
- ARM汇编学习 (1)
- game (0)
- 自己动手实现OpenGL(准备开始!后面有空补充) (3)
- 云计算 (1)
- Android面试题目 (17)
- 深度学习 (1)
- OpenGL实践 (1)
- 神经网络学习-翻译 (4)
最新评论
-
3482561:
Android 面试题目之 线程池 -
daojin:
直接布局。
安卓高手之路之图形系统(6)requestLayout的流程 -
hety163:
没明白楼主所说的最后两段。如果一个相对布局中有多个子view, ...
安卓高手之路之图形系统(6)requestLayout的流程 -
jackuhan:
100篇!!!膜拜
安卓高手之路之 图形系统之 图形框架(1) -
ritterliu:
不错,按照流程把关键代码都贴出来了。谢谢分享
Android输入输出系统之TouchEvent流程
公司经常组织一些培训,培训的都是些奇技淫巧。什么设计模式啦,开发策略啦,git啦,repo啦,另外就是培训一些开发流程的东东,例如CMMI啦。可是,却忘记了,程序员终究要归结到三个问题上:
1.解决什么问题?
2.为什么这样解决问题?
3.有没有更好的解决方案?
这些东东才是最核心的东东。但是却是一个程序员一辈子都无法完全掌握的东西。很多人以为写出了高难度的反射代码就是很牛,也有人认为利用C++模板来进行编程就多牛多牛,还有人觉得会写makefile文件,掌握了某种高难度语言很牛。但是我认为这些都不重要,重要的是要有思想。思考者比行动者在关键时候定大局。中国人的技术书籍缺乏的就是思想。在中国,可以肯定,没有几个人能写出像thinking in java这样的鸿篇巨著,更没有人能够超越 design pattern,来描述其思想。反之,像《自己动手写操作系统》,《21天学java》,《程序员的自我修养》,《面试宝典》,《C++面试一百例》, android内核开发要点等等等等一系列的书籍在中国却是层出不穷。为什么,因为缺乏思考,来不及思考,更或者懒得思考。然而,作为一名专业级的程序员,不思考就意味着退步,不学习就意味着淘汰。
这几天一直在思考ANativeWindow是个什么东西,今天终于找到了,代码贴出来,大家参考一下。
struct ANativeWindow { #ifdef __cplusplus ANativeWindow() : flags(0), minSwapInterval(0), maxSwapInterval(0), xdpi(0), ydpi(0) { common.magic = ANDROID_NATIVE_WINDOW_MAGIC; common.version = sizeof(ANativeWindow); memset(common.reserved, 0, sizeof(common.reserved)); } /* Implement the methods that sp<ANativeWindow> expects so that it can be used to automatically refcount ANativeWindow's. */ void incStrong(const void* id) const { common.incRef(const_cast<android_native_base_t*>(&common)); } void decStrong(const void* id) const { common.decRef(const_cast<android_native_base_t*>(&common)); } #endif struct android_native_base_t common; /* flags describing some attributes of this surface or its updater */ const uint32_t flags; /* min swap interval supported by this updated */ const int minSwapInterval; /* max swap interval supported by this updated */ const int maxSwapInterval; /* horizontal and vertical resolution in DPI */ const float xdpi; const float ydpi; /* Some storage reserved for the OEM's driver. */ intptr_t oem[4]; /* * Set the swap interval for this surface. * * Returns 0 on success or -errno on error. */ int (*setSwapInterval)(struct ANativeWindow* window, int interval); /* * Hook called by EGL to acquire a buffer. After this call, the buffer * is not locked, so its content cannot be modified. This call may block if * no buffers are available. * * The window holds a reference to the buffer between dequeueBuffer and * either queueBuffer or cancelBuffer, so clients only need their own * reference if they might use the buffer after queueing or canceling it. * Holding a reference to a buffer after queueing or canceling it is only * allowed if a specific buffer count has been set. * * Returns 0 on success or -errno on error. */ int (*dequeueBuffer)(struct ANativeWindow* window, struct ANativeWindowBuffer** buffer); /* * hook called by EGL to lock a buffer. This MUST be called before modifying * the content of a buffer. The buffer must have been acquired with * dequeueBuffer first. * * Returns 0 on success or -errno on error. */ int (*lockBuffer)(struct ANativeWindow* window, struct ANativeWindowBuffer* buffer); /* * Hook called by EGL when modifications to the render buffer are done. * This unlocks and post the buffer. * * The window holds a reference to the buffer between dequeueBuffer and * either queueBuffer or cancelBuffer, so clients only need their own * reference if they might use the buffer after queueing or canceling it. * Holding a reference to a buffer after queueing or canceling it is only * allowed if a specific buffer count has been set. * * Buffers MUST be queued in the same order than they were dequeued. * * Returns 0 on success or -errno on error. */ int (*queueBuffer)(struct ANativeWindow* window, struct ANativeWindowBuffer* buffer); /* * hook used to retrieve information about the native window. * * Returns 0 on success or -errno on error. */ int (*query)(const struct ANativeWindow* window, int what, int* value); /* * hook used to perform various operations on the surface. * (*perform)() is a generic mechanism to add functionality to * ANativeWindow while keeping backward binary compatibility. * * DO NOT CALL THIS HOOK DIRECTLY. Instead, use the helper functions * defined below. * * (*perform)() returns -ENOENT if the 'what' parameter is not supported * by the surface's implementation. * * The valid operations are: * NATIVE_WINDOW_SET_USAGE * NATIVE_WINDOW_CONNECT (deprecated) * NATIVE_WINDOW_DISCONNECT (deprecated) * NATIVE_WINDOW_SET_CROP * NATIVE_WINDOW_SET_BUFFER_COUNT * NATIVE_WINDOW_SET_BUFFERS_GEOMETRY (deprecated) * NATIVE_WINDOW_SET_BUFFERS_TRANSFORM * NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP * NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS * NATIVE_WINDOW_SET_BUFFERS_FORMAT * NATIVE_WINDOW_SET_SCALING_MODE * NATIVE_WINDOW_LOCK (private) * NATIVE_WINDOW_UNLOCK_AND_POST (private) * NATIVE_WINDOW_API_CONNECT (private) * NATIVE_WINDOW_API_DISCONNECT (private) * */ int (*perform)(struct ANativeWindow* window, int operation, ... ); /* * Hook used to cancel a buffer that has been dequeued. * No synchronization is performed between dequeue() and cancel(), so * either external synchronization is needed, or these functions must be * called from the same thread. * * The window holds a reference to the buffer between dequeueBuffer and * either queueBuffer or cancelBuffer, so clients only need their own * reference if they might use the buffer after queueing or canceling it. * Holding a reference to a buffer after queueing or canceling it is only * allowed if a specific buffer count has been set. */ int (*cancelBuffer)(struct ANativeWindow* window, struct ANativeWindowBuffer* buffer); void* reserved_proc[2]; };
发表评论
-
Android游戏开发之OpenGL之视图-投影矩阵 杂谈
2011-11-28 01:17 2372本文的内容有: 1.控制观察角度和观察位置。 2.模型中 ... -
Android自定义组件
2011-11-22 22:15 1000http://developer.android.com/gu ... -
Android输入输出机制之来龙去脉之前生后世
2011-11-20 14:58 13728密码太多记不了,怎么办? http://a.app.qq ... -
Android输入输出机制之来龙去脉
2011-11-20 12:35 3786openInputChannelPair( 阅读本 ... -
Android之基础建设之IWindow和IWindowSession
2011-11-19 00:31 6413static class W extends IWindow. ... -
Anroid基础建设之View,Window,Activity
2011-11-16 22:15 18091.PhoneWindow DecorView存在于P ... -
Android之linux之基础建设之窗口系统
2011-11-16 00:49 1326活动窗口(Active),焦点窗口(Focus)和前景 ... -
Android基础建设之View全注释
2011-11-16 00:19 3package android.view; impo ... -
Android游戏框架之基础之AA碰撞系统
2011-11-11 23:38 1702AA 碰撞体 就是将所有的物体设置为矩形框进行碰撞计算。下面是 ... -
Android游戏框架解读之总体结构
2011-11-11 01:08 1457Android游戏开发的框架图无偿奉上。 -
Linux下的IDE环境
2011-09-04 10:12 1048<script type="t ... -
Android学习日记(1)
2011-08-13 12:19 1994直接上代码: IBinder类: /* * Copyr ... -
Android学习日记(1)
2011-08-13 12:19 1014/* * Copyright (C) 2006 The A ...
相关推荐
在Android平台上,结合FFmpeg库和ANativeWindow,可以构建一个原生的视频解码播放器。ANativeWindow是Android系统提供的原生接口,用于在硬件加速的图形上下文中显示图像数据,它在低级渲染方面提供了高效能。 一、...
FFmpegANativeWindow是一个项目,它展示了如何使用FFmpeg库在Android平台上将解码后的视频帧渲染到Android的ANativeWindow。FFmpeg是一个强大的开源多媒体处理框架,支持各种音视频编码、解码、转码、封装和过滤。...
在这个主题中,“FFMPEG+ANativeWindow渲染播放视频”指的是使用FFmpeg库配合Android的ANativeWindow接口来实现本地窗口的视频播放。下面将详细介绍这个过程涉及的关键知识点。 1. FFMPEG库: FFMPEG是用C语言编写...
这里主要涉及到ANativeWindow的2个核心回调函数,OpenGLES在应用层的eglSwapBuffers就是调用了QueueBuffer和DequeueBuffer两个函数来完成的。在介绍上面两个函数的实现时,有必要把BufferQueue这个类再提出来。他是...
首先,我们需要创建一个本地方法(native method)在Java类中声明,这个方法将在C/C++代码中实现。例如: ```java public class MainActivity extends AppCompatActivity { static { System.loadLibrary("test_...
在实际使用中,你需要先在Java层创建一个JNI接口,然后在C/C++层实现这个接口,获取屏幕的原始像素数据,并转换成`Bitmap`对象。以下是一个简单的JNI函数声明示例: ```java public native Bitmap screenshot(); ``...
在Android平台上,FFmpeg是一个非常重要的库,它用于处理音视频数据,包括编码、解码、转码、流媒体等任务。在这个特定的例子中,我们关注的是FFmpeg 3.4.2版本,该版本提供了对Android设备硬件解码和软解码的支持,...
Android系统的`SurfaceFlinger`服务负责合成屏幕上所有视图的最终图像,`libGetPicSo.so`可能就是通过调用相应的系统API,如`ANativeWindow`,来直接从`SurfaceFlinger`获取屏幕的像素数据。 在使用过程中,应用...
- `Surface`类继承自`EGLNativeBase<ANativeWindow, Surface, RefBase>`,其中包含了初始化方法`Surface::init()`,用于设置相关的参数和配置。 - **SharedBufferClient**: - 当创建`Surface`时,会创建一个`...
下面将详细介绍这个“android JNI video工程”的核心知识点。 1. **JNI基础**:JNI是Android系统提供的一种接口,用于Java代码与本地(C/C++)代码之间的通信。开发者可以通过JNI调用C/C++库,提高性能或利用已有的C/...
在这个场景下,JNI被用来创建一个能够捕获Android设备屏幕图像的解决方案。 在Android 2.3(也称为Gingerbread)时代,系统API可能并不直接提供截图接口,因此开发者需要通过更底层的方式来实现。下面我们将详细...
Surface类作为EGLNativeBase的子类,实现了ANativeWindow接口,提供了一种安全的引用计数机制,用于在图形上下文中的渲染。 总的来说,Skia在Android图形系统中承担了图形绘制和处理的主要任务,而...
最后,它获取NDK ANativeWindow并显示图像以供实时预览 演示版 先决条件 Android API 24(牛轧糖)或更高版本 Android Studio 2.3以上版本 如何设定 克隆或下载仓库,然后打开OpenCV-NDK文件夹。 (第二个是孩子) ...
- `EGLNativeWindowType`: 对应于`ANativeWindow *`。 #### 4. 数据类型定义 - `unsigned int EGLBoolean`: 表示布尔值,通常用于函数返回值表示成功或失败。 - `unsigned int EGLenum`: 用于表示枚举类型的值。 -...
在Android平台上,使用AudioTrack和ANativeWindow API进行音频和视频渲染。 当前,该播放器可以流畅地播放许多视频文件,而其cpu和内存使用率却较低(与ffmpeg官方ffffeg相比),高性能,兼容性和稳定性,并且音频...
FFmpeg 开发(02):FFmpeg + ANativeWindow 实现视频解码播放 FFmpeg 开发(03):FFmpeg + OpenSLES 实现音频解码播放 FFmpeg 开发(04):FFmpeg + OpenGLES 实现音频可视化播放 FFmpeg 开发(05):FFmpeg + ...