1

Androidプラットフォーム用のsdlライブラリのクロスコンパイルに成功しました。SDL_SurfaceやSDL_RectなどのsdlフォームをAndroid画面に表示したいと考えています。そんなことがあるものか?

これが私の最初の試みです

  SDLRenderer::SDLRenderer    () :
         bmp            (NULL),
         screen         (NULL),
         imgConvertCtx  (NULL),
         isInit         (false),
         quitKeyPressed (false)
  {
  }
  SDLRenderer::~SDLRenderer   ()
  {
  }

  bool    SDLRenderer::init                   (int width, int height)
  {       LOGI("sdlrenderer init");
this->screen = SDL_SetVideoMode(width, height, 0, 0);

  if(!screen){
    LOGI("!screen");
    return false;
  }

this->bmp = SDL_CreateYUVOverlay(width, height, SDL_YV12_OVERLAY, this->screen);

LOGI("SDL_CreateYUVOverlay passed");

return true;
}
bool    SDLRenderer::processEvents          ()
{
 SDL_Event sdlEvent;
 while(SDL_PollEvent(&sdlEvent))
 {
     switch(sdlEvent.type)
     {
         case SDL_KEYDOWN:
             if(sdlEvent.key.keysym.sym == SDLK_ESCAPE)
                 this->quitKeyPressed = true;
             break;
         case SDL_QUIT: this->quitKeyPressed = true; break;
     } 
 }

 return true;
}
bool    SDLRenderer::isQuitKeyPressed       ()
{
return this->quitKeyPressed;
}
void    SDLRenderer::onVideoDataAvailable   (const uint8_t **data,         videoFrameProperties* props)
{LOGI("sdlrenderer data availabe");
   if(!this->isInit){
    this->isInit = this->init(props->width, props->height);
    LOGI("sdlrenderer data availabe calling render init"); 
   }
   LOGI("before     SDL_LockYUVOverlay(bmp);"); 

SDL_LockYUVOverlay(bmp);
LOGI("after     SDL_LockYUVOverlay(bmp);"); 

AVPicture pict;
LOGI("after    AVPicture pict;"); 

pict.data[0] = bmp->pixels[0];
pict.data[1] = bmp->pixels[2];
pict.data[2] = bmp->pixels[1];

pict.linesize[0] = bmp->pitches[0];
pict.linesize[1] = bmp->pitches[2];
pict.linesize[2] = bmp->pitches[1];
  LOGI("after     creating avpicture"); 

// Convert the image into YUV format that SDL uses
if(imgConvertCtx == NULL)
{
    int w = props->width;
    int h = props->height;

    imgConvertCtx = sws_getContext(props->width, props->height, (PixelFormat)props-     >pxlFmt, w, h, PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);

    if(imgConvertCtx == NULL)
    { LOGI("imgConvertCtx == NULL"); 

        fprintf(stderr, "Cannot initialize the conversion context!\n");
        exit(1);
    }
}

sws_scale(imgConvertCtx, data, props->linesize, 0, props->height, pict.data,   pict.linesize);
 LOGI("calling SDL_UnlockYUVOverlay(bmp);"); 

SDL_UnlockYUVOverlay(bmp);

rect.x = 0;
rect.y = 0;
rect.w = props->width;
rect.h = props->height;
LOGI("sdlrenderer displaying");
SDL_DisplayYUVOverlay(bmp, &rect);
}

私のメインがあります

int main(int argc, char *argv[])
{
    SDLRenderer     *renderer = new SDLRenderer();
    DASHReceiver    *receiver = new DASHReceiver(30); 

    receiver->Init("http://www----custom url here");

    LibavDecoder *decoder = new LibavDecoder(receiver);

    decoder->attachVideoObserver(renderer);
    decoder->setFrameRate(24);
    decoder->init();

    bool eos = false;

    while(!renderer->isQuitKeyPressed() && !eos)
  {
      eos = !decoder->decode();
      renderer->processEvents();
   }

   decoder->stop();

return 0;
  }

前もって感謝します!

4

2 に答える 2