缘由: google 在ICS 上graphicbuffer管理机制作了改动, 可是gralloc.xxx.so目前又不支持HAL_PIXEL_FORMAT_YV12。因此,解决办法是:注释掉SoftwareRenderer.cpp,65行,case OMX_COLOR_FormatYUV420Planar: 播放就有视频出来了。 框架
2. ide
作过Stagefright框架支持库开发的都知道,Android专门为数据传递封装了一个类:MediaBuffer,源码路径为: 工具
1)、头文件:frameworks/base/include/media/stagefright/MediaBuffer.h google
2)、实现源码:frameworks/base/media/libstagefright/MediaBuffer.cpp spa
该类专用于管理数据缓冲区,是Stagefright各组建间进行数据传递的交通工具。以解码为例,Extractor将读取到的Audio和Video数据分别放入不一样的MediaBuffer中,一个传入Video decoder进行视频解码,一个传入Audio decoder进行音频解码;Video Decoder将解码后的数据放入一个新的视频MediaBuffer中,传递给Render去显示,Audio decoder将解码后的数据也放入一个新的音频MediaBuffer中送到Render去放音。固然,在传递前还有不少附加的信息须要设置传递,这里不作说明。 code
下面就本人在使用MediaBuffer对其的理解是使用重点作详细说明。MediaBuffer对缓冲区的内部实现进行了很好的封装,使用者根本不须要关内心面的实现细节,并且全部咱们对缓冲区关心的问题,该类都已经提供了接口。 orm
常见数据区操做: MediaBuffer mBuffer;
视频
1)、获取数据缓冲区首地址:mBuffer->data( ); 接口
2)、获取数据缓冲区的大小:mBuffer->size( ); 开发
3)、获取缓冲区中有效数据区相对数据缓冲区起始地址的偏移:mBuffer->range_offset( );
4)、设置缓冲区中有效数据区的偏移和长度:mBuffer->set_range(size_t offset, size_t length);
5)、获取有效数据区的长度:mBuffer->range_length( );
6)、获取有效数据区的起始地址(偏移):mBuffer->data( ) + mBuffer->range_offset( );
易犯的错误:
1)、误用数据缓冲区首地址代替有效数据区首地址。即用mBuffer->data( )代替mBuffer->data( ) + mBuffer->range_offset( ),这样获得的是数据缓冲区的起始地址,而不必定时有效数据区的起始地址;实际使用中,有效数据区一般是数据缓冲区的一个有效子集而已。
2)、误用数据缓冲区的大小代替有效数据区的大小。即用mBuffer->size( )代替mBuffer->range_length( )