zoukankan      html  css  js  c++  java
  • stagefright框架(五)-Video Rendering

    AwesomePlayer::onVideoEvent除了透過OMXCodec::read取得解碼後的資料外,還必須將這些資料(mVideoBuffer)傳給video renderer,以便畫到螢幕上去。

    (1) 要將mVideoBuffer中的資料畫出來之前,必須先建立mVideoRenderer

    void AwesomePlayer::onVideoEvent()
    {
      ...

      if (mVideoRenderer =NULL)
      {
        initRenderer_l();
      }

      ...
    }

    void AwesomePlayer::initRenderer_l()
    {
      if (!strncmp("OMX.", component, 4))
      {
        mVideoRenderer new AwesomeRemoteRenderer(
                               mClient.interface()->createRenderer(
                                                      mISurface,
                                                      component,
                                                      ...)).........(2)
      }
      else
      {
        mVideoRenderer new AwesomeLocalRenderer(
                               ...,
                               component,
                               mISurface)...........................(3)
      }
    }


    (2) 如果video decoderOMX component,則建立一個AwesomeRemoteRenderer作為mVideoRenderer

    從上段的程式碼(1)來看,AwesomeRemoteRenderer的本質是由OMX::createRenderer所創建的。createRenderer會先建立一個hardware renderer -- SharedVideoRenderer (libstagefrighthw.so);若失敗,則建立software renderer -- SoftwareRenderer (surface)


    sp<IOMXRenderer> OMX::createRenderer(...)
    {
      VideoRenderer *impl NULL;

      libHandle = dlopen("libstagefrighthw.so", RTLD_NOW);

      if (libHandle)
      {
        CreateRendererFunc func = dlsym(libHandle...);

        impl (*func)(...)<----------------- Hardware Renderer
      }

      if (!impl)
      {
        impl new SoftwareRenderer(...)<---- Software Renderer
      }
    }


    (3) 如果video decodersoftware component,則建立一個AwesomeLocalRenderer作為mVideoRenderer

    AwesomeLocalRendererconstructor會呼叫本身的init函式,其所做的事和OMX::createRenderer一模一樣。


    void AwesomeLocalRenderer::init(...)
    {
      mLibHandle = dlopen("libstagefrighthw.so", RTLD_NOW);

      if (mLibHandle)
      {
        CreateRendererFunc func = dlsym(...);

        mTarget (*func)(...)<---------------- Hardware Renderer
      }

      if (mTarget =NULL)
      {
        mTarget new SoftwareRenderer(...)<--- Software Renderer
      }
    }


    stagefright框架(五)-Video <wbr>Rendering

    (4) mVideoRenderer一經建立就可以開始將解碼後的資料傳給它


    void AwesomePlayer::onVideoEvent()
    {
      if (!mVideoBuffer)
      {
        mVideoSource->read(&mVideoBuffer...);
      }

      [Check Timestamp]

      if (mVideoRenderer =NULL)
      {
        initRenderer_l();
      }

      mVideoRenderer->render(mVideoBuffer)<----- Render Data
    }


    stagefright框架(五)-Video <wbr>Rendering

    stagefright框架(五)-Video <wbr>Rendering
  • 相关阅读:
    tar解压时如何去掉第一级目录并解压到指定目录?
    ubuntu下容器无法启动报错"failed to start daemon: failed to dial "/run/containerd/containerd.sock": unknown service containerd.services.namespaces.v1.Namespaces: not implemented"如何处理?
    redis用法介绍
    Map.putAll()用法
    Random,ThreadLocalRandom,SecureRandom的几点思考
    SOAPUI---使用断言
    AutoUpdater迁移到Github
    VirtualBox: linux 没有权限访问共享文件夹的问题
    MakeFIle: 解决“/bin/bash^M: bad interpreter: No such file or directory”的问题
    ubuntu 备忘录
  • 原文地址:https://www.cnblogs.com/shakin/p/4097118.html
Copyright © 2011-2022 走看看