我已经成功为android平台交叉编译了sdl库,现在我想在android屏幕中显示我的sdl形式,例如SDL_Surface和SDL_Rect。 那怎么可能?

这是我的第一次尝试

  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;
  }

提前致谢!

===============>>#1 票数:1

你缺少一个SDL_FlipSDL_UpdateRect被叫做你的主要SDL_surface,这将更新它在屏幕上。

===============>>#2 票数:1

据我所知,您正在尝试移植bitmovin开源破折号播放器。 我已经做完了,将SDL移植到android之后,该软件的所有其他部分都可以正常工作。 我有与您完全相同的代码,并且此部分运行良好,请确保在Java部分中定义表面。使用SDLActivity尝试google,并使用此处提供的Java代码,然后在此处仔细查看http:// lists。 libsdl.org/pipermail/sdl-libsdl.org/2011-July/081481.html对Java代码进行一些小的修改

    // The Unimplemented OpenGL ES API notices *always* indicate you have
    // the incorrect context version, which has to be fixed in SDLActivity.java .
    int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
    int contextAttrs[] = new int[]{
                      EGL_CONTEXT_CLIENT_VERSION, majorVersion,
                      EGL10.EGL_NONE
                       };
     EGLContext ctx = egl.eglCreateContext(dpy, config,EGL10.EGL_NO_CONTEXT, contextAttrs);
     if (ctx == EGL10.EGL_NO_CONTEXT) {
          Log.e("SDL", "Couldn't create context");
          return false;
     }

    /*
    EGLContext ctx = egl.eglCreateContext(dpy, config, EGL10.EGL_NO_CONTEXT, null);
    if (ctx == EGL10.EGL_NO_CONTEXT) {
        Log.e("SDL", "Couldn't create context");
        return false;
    }
    */

  ask by Hadj Ali Oussama translate from so

未解决问题?本站智能推荐:

1回复

不推荐使用Android NDK SDL

我用SDL安装了NDK。 我将Windows 7与MinGW结合使用。 当我在Android Studio中编译源代码时,收到警告: [deprecation] AbsoluteLayout in android.widget has been deprecated 我从文件/
1回复

使用Android独立工具链为ARM构建SDL

如何使用Android NDK的独立工具链构建libsdl? 我不能使用标准的ndk-build,因为我必须与现有的构建系统集成。 我知道我可能必须分别在我的PATH和CC环境变量中放置交叉编译器的路径和名称,但我认为还有许多其他事情需要完成 - 例如SSE和3DNow可能需要禁用(目标
1回复

使用GLEW的Android SDL2编译

这是一个编译问题,特别是在使用NDK引用共享库时。 我的SDL2 + GLEW程序可以在我的Mac上正常运行(显然使用其他makefile / build系统),并且我也可以在Android上正常运行(只要我不使用GLEW)。 但是现在我需要使用GLEW,并且找不到有关在NDK中包含库的
1回复

如何使用ffmpeg和sdl为Android制作视频播放器?

我想使用ffmpeg和sdl为Android制作视频播放器。 我已经在笔记本电脑上从ffmpeg编译了Tutorial07.c。 如何使用SDL在Android上进行编译?
1回复

来自带有Android和sdl的c ++的Java回调

我正在尝试使用android / SDL c ++代码调用Java方法来弹出或更新Toast。 但我越来越 从Java端(例如从常规调用的Handler)进行更新时,Toast似乎可以工作,并且我的消息字符串将Log()确定,但是只要setText()中有任何内容(甚至是“ Hello
2回复

AdMob广告未在Android SDL应用中正确显示

在我的应用中实施AdMob广告时遇到了问题。 我正在使用SDL和本机代码。 广告是在onCreate方法中创建的,如下所示: 我认为此代码是正确的,因为广告位于屏幕上,但它不可见 。 我可以在广告所在的位置触摸屏幕并且浏览器开始打开,因此广告实际上已加载。 然后,广告在以下情
1回复

Qt(necessitas)+ SDL + Android

我已经用Qt编写了一个应用程序( 一个开放源代码的ROV控制器 ),该应用程序使用SDL在Windows和OSX上提供了操纵杆支持,我想将其移植到Android。 我唯一的问题是我需要在Android中获得USB游戏杆支持。 有人让SDL 在Android上使用Qt吗? 如果是这样,您是如
2回复

找不到-lgnustl_static:使用NDK r7编译Android SDL端口

我正在尝试使用新的Android NDK r7版本为Android构建libSDL的此端口: https://github.com/pelya/commandergenius 我知道我在某种程度上做“不受支持”的事情:尽管自述文件中提到不再支持,但我正在使用cygwin&window
1回复

与触摸屏交互时,SDL android应用程序崩溃

我正在尝试使用SDL库为Android开发游戏。 该应用程序本身可以完美启动,您可以使用除触摸屏以外的所有功能。 如果触摸屏与应用程序进行了交互,则会崩溃,并在logcat中留下以下消息: 如果我注释掉SDLActivity.onNativeTouch调用,则该应用程序不会崩溃,但是
1回复

构建适用于Android的SDL混合器

我已经为Android构建了SDL 。 但是,不幸的是,那里缺少SDL_mixer。 所以我想构建SDL混合器 。 问题是:SDL_mixer需要SDL,那么我如何将libsdl.so包括libsdl.so而SDL包括在我的Eclipse SDL_mixer项目中呢?