Несколько окон SDL с наложением YUV - PullRequest
1 голос
/ 22 августа 2011

Кто-нибудь знает, как создать две Windows, и обе должны иметь собственное наложение YUV с библиотекой SDL 1.3?

Возможно или я пытаюсь использовать неправильную стратегию?

Если я попробовал следующий источник, я получил сообщение об ошибке: [!] Не могу создать локальный оверлей YUV дисплей поддерживается только на поверхности экрана

#include <SDL/SDL.h>
#include <stdio.h>
#include <stdlib.h>

static bool running = true;
static SDL_Window* win_local;
static SDL_Window* win_remote;

int main(int argc, char** argv) {

//    SDL_SetVideoMode

    if((SDL_Init(SDL_INIT_VIDEO) != 0))
    {
        printf("[!] can't initialize SDL %s\n", SDL_GetError());
        exit(-1);
    }

    if(!(win_local = SDL_CreateWindow("Local Video", 0, 0, 640, 480, SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS)))
    {
        printf("[!] can't create Window %s\n", SDL_GetError());
        exit(-1);

    }

    if(!(win_remote = SDL_CreateWindow("Remote Video", 700, 0, 640, 480, SDL_WINDOW_SHOWN)))
    {
        printf("[!] can't create Window %s\n", SDL_GetError());
        exit(-1);
    }


    SDL_Surface* surface_local; 
    SDL_Surface* surface_remote; 

    if(!(surface_local = SDL_GetWindowSurface(win_local)))
    {
        printf("[!] can't get local surface %s\n", SDL_GetError());
        exit(-1);
    }

    if(!(surface_remote = SDL_GetWindowSurface(win_remote)))
    {
        printf("[!] can't get remote surface %s", SDL_GetError());
        exit(-1);
    }

    SDL_Overlay* overlay_local;
    SDL_Overlay* overlay_remote;

    if(!(overlay_local = SDL_CreateYUVOverlay(640, 480, SDL_IYUV_OVERLAY, surface_local)))
    {
        printf("[!] can't create local overlay %s\n", SDL_GetError());
                exit(-1);
    }
//
//  if(!(overlay_remote = SDL_CreateYUVOverlay(640, 480, SDL_IYUV_OVERLAY, surface_remote)))
//  {
//      printf("[!] can't create remote overlay %s\n", SDL_GetError());
//                exit(-1);
//  }


    SDL_Event event;
    while(running)
    {

        while(SDL_PollEvent(&event))
        {
            switch(event.type)
            {
            case SDL_KEYDOWN:
                if (event.key.keysym.sym == SDLK_ESCAPE)
                    running = false;
                break;
            case SDL_QUIT:
                running = false;
                break;
            }
        }

        SDL_Delay(20);
    }

    //SDL_FreeSurface(local);
    //SDL_FreeSurface(remote);

    SDL_DestroyWindow(win_local);
    SDL_DestroyWindow(win_remote);
    SDL_Quit();
    exit(0);
    return 0;
}

1 Ответ

1 голос
/ 22 августа 2011

SDL_CreateYUVOverlay плохо работает с несколькими окнами, поскольку он не является частью API 1.3, он оставлен для обратной совместимости с SDL 1.2.

Я вижу три возможных решения:

  1. Позвоните SDL_CreateYUVOverlay сразу после SDL_CreateWindow для каждой поверхности. Вы, вероятно, избежите ошибки, но я не уверен, будет ли она работать правильно.

  2. Посмотрите, как SDL_CreateYUVOverlay реализован с использованием API 1.3 и выполните что-то подобное.

  3. Используйте OpenGL и шейдеры.

...