原来用过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.

*/

更多相关文章

  1. Android(安卓)Handler机制 - handleMessage究竟在哪个线程执行
  2. 关于Android短信管理
  3. 分析Android(安卓)根文件系统启动过程(init守护进程分析)
  4. Flutter(Android(安卓)混合开发)
  5. Android客户端性能参数监控
  6. Android上运行Http Server
  7. Android(安卓)Studio中Xml的新建及shape绘图
  8. mybatisplus的坑 insert标签insert into select无参数问题的解决
  9. Python技巧匿名函数、回调函数和高阶函数

随机推荐

  1. Android源码50例汇总,欢迎各位下载 【转载
  2. Android更新UI的四种方法详解
  3. android Looper Message 代码分析
  4. Android学习笔记:布局
  5. Android中Activity常用功能设置小结(包括
  6. Android(安卓)Studio开发之JNI ---- 加载
  7. android webview中使用Java调用JavaScrip
  8. 网络数据请求实践一:android-async-http实
  9. Pro Android学习笔记(一二四):Telephony API
  10. Android(安卓)ListView中动态显示和隐藏H