原来用过android的ColorConverter,里面的cropLeft, cropTop...等等参数原来没有注意过,因为当时解码器解出来的图像是原始的没经过填充的。这次在测android 4.0 的硬解,用的是sumsung 的 nexusprime.结果发现 OMXCode 出来的数据是经过填充的。这时才注意到CropXXX这些参数。这里记录一下AwesomePlayer的render 流程。

onVideoEvent(){  ....  if (mVideoRenderer != NULL) {    mSinceLastDropped++;    mVideoRenderer->render(mVideoBuffer);  }  ....}mVideoRenderer 在 initRenderer_l 创建 initRender_l (){  .......  if(strncmp(component, "OMX.", 4))  {    mVideoRenderer =  new AwesomeNativeWindowRenderer(mNativeWindow, rotationDegrees);  }  else  {   mVideoRenderer = new AwesomeLocalRenderer(mNativeWindow, meta);   //可能awesome会创建 hardrender,但在这里看下softrender  }  ..........}

看下AwesomeLocalRenderer 的构造函数

struct AwesomeLocalRenderer : public AwesomeRenderer {
  AwesomeLocalRenderer(
  const sp<ANativeWindow> &nativeWindow, const sp<MetaData> &meta)
  : mTarget(new SoftwareRenderer(nativeWindow, meta)) {        ///是个softwareRender
  }

....
}

这时再来看
 mVideoRenderer->render(mVideoBuffer);这行,展开后
    

virtual void render(MediaBuffer *buffer) {
  render((const uint8_t *)buffer->data() + buffer->range_offset(),    //注意这里会有一个偏移
  buffer->range_length());
}

最终调用的是

void render(const void *data, size_t size) {
mTarget->render(data, size, NULL);
}

继续往下走 看下SoftwareRenderer 的构造函数

SoftwareRenderer::SoftwareRenderer(....)

{

.....

注意这里

  if (!meta->findRect(
  kKeyCropRect,
  &mCropLeft, &mCropTop, &mCropRight, &mCropBottom)) {        ////实际这些CropXXX 参数是从meta 中得到了
  mCropLeft = mCropTop = 0;
  mCropRight = mWidth - 1;
  mCropBottom = mHeight - 1;
  }

  

  

  }

拿到了这些参数 再参考ColorConverter 中的用法,就可以了。

再贴上 ColorConverter.cpp 中一些关于TI_YUV420SP 的定义。

/*
The TIYUV420PackedSemiPlanar format is same as YUV420PackedSemiPlanar but with
additional padding as shown in the diagram below. The padded width and padded
height is different for different compression formats and it is read from the
codec. In this color conversion routine, the padded resolution is obtained from
src bitmap.

*/

android stagefright 的 render

更多相关文章

  1. 【Android 异步操作】AsyncTask 异步任务 ( 参数简介 | 方法简介
  2. Android开发笔记之adb参数指南
  3. 【Android FFMPEG 开发】Android Studio 工程配置 FFMPEG ( 动态
  4. Android客户端性能参数监控
  5. Android中切换屏幕方向时Activity生命周期函数执行情况分析
  6. Android中图形参数及图形内存信息获取
  7. Android 读取SIM卡参数
  8. Android页面跳转是如何传递参数的
  9. Android 加载图片文件 函数

随机推荐

  1. Android Path的使用详解
  2. Android SHA1加密实现
  3. 分享一些Android免费课程给大家
  4. android ksoap2下webservice的 https请求
  5. ANDROID取CPU序列号
  6. Android实现水印效果
  7. Android之Activity的几种跳转方式
  8. Android跳转淘宝商品详情页代码
  9. Android 开源项目地址备份(持续更新。。。
  10. Android实现即时音效和背景音乐(整理自用)