zoukankan      html  css  js  c++  java
  • android stagefright 的 render

    原来用过android的ColorConverter,里面的cropLeft, cropTop...等等参数原来没有注意过,因为当时解码器解出来的图像是原始的没经过填充的。这次在测android 4.0 的硬解,用的是sumsung 的 nexus prime.结果发现  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.

    */

  • 相关阅读:
    C#|.NET从控制反转(依赖注入)想到事件注入 (非AOP)
    libevent 2.1.3 for VS2008 source code
    如何进行object以及Array(数组)的深复制
    Flash ProgressEvent.bytesTotal为0的原因和解决
    Flash字体嵌入方法总结—(4)进阶篇
    mysql分组取每组前几条记录(排名) 附group by与order by的研究
    Flash游戏优化技巧
    教程:深入理解Flash的沙箱 – Application Domains
    Flash Player 11异步解码Bitmap
    常用公式
  • 原文地址:https://www.cnblogs.com/soniclq/p/2499470.html
Copyright © 2011-2022 走看看