Отображение AVFrame на экране с помощью SDL 2.0

Я работаю над некоторым кодом с помощью этот учебник и использую последние библиотеки разработки ffmpeg и SDL. Я застрял в точке, где мне нужно отобразить декодированный кадр (AVFrame) на экране. Я склонен выполнять указанную выше задачу, то есть, отображение AVFrame на экране с использованием новейшего API SDL 2.0 (с использованием средств визуализации и текстур наряду с использованием SDL_Window). Честно говоря, я не эксперт в SDL_Renderer, SDL_Texture и связанных с ними функциях. Но я читаю документацию на официальном сайте SDL 2.0 и прорабатываю ее.

Есть ли способ сделать следующее с помощью API SDL 2.0:

  • Преобразуйте исходный формат кадра в вариант YUV и отобразите его.

    (ИЛИ)

  • Если возможно, отобразите фрейм, не конвертируя его из исходного формата.

Я хочу сделать это, используя Renderers и Textures. Не похоже, чтобы с ними было легко работать.

Может ли кто-нибудь помочь мне выполнить описанные выше задачи?

PS: Хотя я явно не пробовал, я наткнулся на несколько способов отображения AVFrame на экране путем преобразования формата AVFrame (собственного) в RGB. Но я не хочу, чтобы родной формат кадра (в основном YUV) преобразовывался в RGB, так как это требует больших вычислительных ресурсов.

Преобразование между форматами выполняется с помощью sws_scale().


person progammer    schedule 18.09.2013    source источник
comment
возможно, вы можете найти вдохновение в моей программе просмотра YCbCr (YUV), которая отображает довольно много форматов YUV с использованием SDL. github.com/figgis/yuv-viewer   -  person Fredrik Pihl    schedule 18.09.2013
comment
@Fredrik Pihl, спасибо за ссылку, но я хочу как можно больше использовать SDL 2.0.   -  person progammer    schedule 19.09.2013


Ответы (1)


Попробуйте один из форматов пикселей YUV SDL2.

Они имеют несколько планарных и упакованных вариантов:

SDL_PIXELFORMAT_YV12: планарный режим: Y + V + U (3 плоскости)

SDL_PIXELFORMAT_IYUV: планарный режим: Y + U + V (3 плоскости)

SDL_PIXELFORMAT_YUY2: упакованный режим: Y0+U0+Y1+V0 (1 плоскость)

SDL_PIXELFORMAT_UYVY: упакованный режим: U0+Y0+V0+Y1 (1 плоскость)

SDL_PIXELFORMAT_YVYU: упакованный режим: Y0+V0+Y1+U0 (1 плоскость)

person genpfault    schedule 18.09.2013
comment
Я пытался использовать этот флаг. Можете ли вы привести небольшой пример с фрагментом кода? Я не знаю, как его использовать, особенно вместе с AVFrame. Я пытался искать, но не нашел никакого контента. - person progammer; 19.09.2013
comment
Пожалуйста. libav иногда любит создавать несмежные плоские кадры YUV, поэтому код вокруг здесь создает непрерывный буфер с поддержкой SDL. - person genpfault; 19.09.2013
comment
@jsp99: SDL2 ›= 2.0.1 имеет SDL_UpdateYUVTexture() для обновления плоских текстур YUV, поэтому у вас нет вручную объединять буферы libav. - person genpfault; 07.04.2014