libav: где получить ссылку на AV_PIX_FMT_NV12 при использовании cuda /cuvid?

#ffmpeg #libav

#ffmpeg #libav

Вопрос:

Допустим, я использую av_hwdevice_find_type_by_name("cuda") , как здесь. Мне нужно преобразовать декодированные кадры в RGB с помощью SwsContext . Я знаю по опыту, что при использовании декодера cuda / cuvid я получаю фреймы в AV_PIX_FMT_NV12 формате, хотя каждая структура, на которую я смотрю, говорит либо AV_PIX_FMT_NONE , либо AV_PIX_FMT_YUV420P .

В каком поле какой структуры я могу получить AV_PIX_FMT_NV12 значение, чтобы я мог удалить свой жестко заданный исходный формат при вызове SwsContext.sws_scale ? Спасибо!

Обновить:

Похоже, я могу получить это с помощью:

 AVCodecContext* avctx;
...
frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
AVPixelFormat pixel_fmt = frames_ctx->sw_format;
  

…как только хотя бы один кадр был декодирован. Хотя не уверен, что это правильный способ.

Ответ №1:

Что касается CUDA, то лучшим выбором будет, когда вы AV_PIX_FMT_YUV420P на AVHWFramesContext::sw_format рассматриваете это как AV_PIX_FMT_NV12 и когда AV_PIX_FMT_YUV420P10 это на самом деле AV_PIX_FMT_P010 .

Насколько я знаю, ни CUDA, ни NVDEC (был CUVID) не поддерживают ничего, кроме формата 420, в качестве декодированных кадров.

Комментарии:

1. Это в основном то, что я уже делаю, и чего я хочу избежать (например, предполагая что-то, основанное на предварительных знаниях). Но смотрите Мое обновление выше, я действительно могу получить AV_PIX_FMT_NV12 во время выполнения сейчас. Просто интересно, правильный ли это / универсальный способ.

2. Возможно, после декодирования то, что вы сделали, является правильным способом. Я предполагал перед декодированием.