Как получить формат видеокадра nvdec из декодирования ffmpeg? Как использовать его в структурах cuda?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как получить формат видеокадра nvdec из декодирования ffmpeg? Как использовать его в структурах cuda?

Сообщение Anonymous »

Я использую код, почти точно https://github.com/FFmpeg/FFmpeg/blob/m ... w_decode.c, но я не передаю декодированные данные на хост, я оставляю их включенными устройство для последующего использования с кодом cuda (моей целью будет использование данных RGB 8–12 бит на канал).
Интересная часть:

Код: Выделить всё

//after decoding/encoding
status = avcodec_receive_frame(avctx, frame);
if (status != AVERROR(EAGAIN) && status != AVERROR_EOF)
LogMessage(L"frame timestamp: %i\n", (int)frame->best_effort_timestamp);
if (status == AVERROR(EAGAIN) || status == AVERROR_EOF)
{
av_frame_free(&frame);
return 0;
}
if (status < 0)
{
LogMessage(L"Error while decoding\n");
goto finish;
}
{
auto descr = AVPixelFormatMap[(AVPixelFormat)frame->format];
std::wstring dsdescr(descr.begin(), descr.end());
LogMessage(L"Pixelformat: %s", dsdescr.c_str());

cudaPitchedPtr CUdeviceptr0{}; // !! hypothetical usage of cudaPitchedPtr !!
CUdeviceptr0.ptr = frame->data[0];
CUdeviceptr0.pitch = frame->linesize[0]; //2048 == pitch ?
CUdeviceptr0.ysize = frame->height; //1080
CUdeviceptr0.xsize = frame->width; //1920
cudaPitchedPtr CUdeviceptr1{};
CUdeviceptr1.ptr = frame->data[1];
CUdeviceptr1.pitch = frame->linesize[1];
CUdeviceptr1.ysize = frame->height;
CUdeviceptr1.xsize = frame->width;
}
Мне не удалось найти способ получить формат данных (

Код: Выделить всё

(AVPixelFormat)frame->formatЗначение 
— AV_PIX_FMT_CUDA, что переводится как: «Аппаратное ускорение через CUDA. data содержат указатели CUdeviceptr точно так же, как и для кадров системной памяти».).
К сожалению это ничего не говорит о формате пикселей. Я полагаю, что это YUV, но у меня нет более подробной информации.
Я понимаю, что у меня есть два массива: кадр->данные[0] и кадр->данные[1] .
  • Что такое каждый?
  • Код: Выделить всё

    frame->data[0]
    содержит данные, соответствующие Y или одному из каналов RGB, и имеет высоту тона. Когда я сохранил это изображение как черно-белое, я распознал его, за исключением того, что оно одноканальное.
  • Код: Выделить всё

    frame->data[1]
    установлен, но не содержит данных. Следовательно, это не является частью содержимого изображения.
  • Код: Выделить всё

    frame->data[2]
    имеет значение NULL.
Похоже, что U и V находятся где-то еще.
Я хотел бы перевести данные в собственную структуру cuda, например:

Код: Выделить всё

cudaPitchedPtr CUdeviceptr{};
CUdeviceptr.ptr = frame->data[0];
CUdeviceptr.ysize = frame->height;
CUdeviceptr.xsize = frame->width;
Это нормально, но неполно, поскольку ширина == 1920 высота == 1080 (я думаю, только Y от YUV).
  • Если это Y YUV, где данные U и V?
  • Как узнать подробнее о формат данных (RGB, BGR, YUV, 8/10/12 бит на канал, 444, 422, 420 и т. д.) ?


Подробнее здесь: https://stackoverflow.com/questions/791 ... -to-use-it
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»