ffmpeg YUV420 в RGB24 преобразует только одну строку

Я пытаюсь преобразовать мое изображение YUV420p в RGB24 в C++ и создать растровое изображение из байтового массива в C#.

Размер моего изображения составляет 1920 Вт * 1020 ч, а декодер ffmpeg дает мне 3 планара для данных с размерами линий = {1920, 960, 960}. Но после sws_scale я получаю RGB-изображение только с одной плоскостью с размером строки = 5760. Это не выглядит правильно: я должен получить (5760 * ч), а не только одну строку данных. Что я делаю не так?

 //c++ part
    if (avcodec_receive_frame(m_decoderContext, pFrame) == 0)
    {
        //RGB
        sws_ctx = sws_getContext(m_decoderContext->width,
            m_decoderContext->height,
            m_decoderContext->pix_fmt,
            m_decoderContext->width,
            m_decoderContext->height,
            AV_PIX_FMT_RGB24,
            SWS_BILINEAR,
            NULL,
            NULL,
            NULL
        );

        sws_scale(sws_ctx, (uint8_t const * const *)pFrame->data, pFrame->linesize,
            0, pFrame->height,
            pFrameRGB->data, pFrameRGB->linesize);


//c# part (im reading data from pipe and its equal to c++ part)------------------------------------------------------------------
        byte[] rgbch = new byte[frameLen];
        for (int i=0; i<frameLen; i++)
        {
            rgbch[i] = Convert.ToByte(pipe.ReadByte());
        }

        if (rgbch.Length > 0)
        {
            var arrayHandle = System.Runtime.InteropServices.GCHandle.Alloc(rgbch,
    System.Runtime.InteropServices.GCHandleType.Pinned);

            var bmp = new Bitmap(1920, 1080,
                3,
                System.Drawing.Imaging.PixelFormat.Format24bppRgb,
                arrayHandle.AddrOfPinnedObject()
            );

            pictureBox1.Image = bmp;
        }

1 ответ

Решение

Ваше предположение, что linesize Поле AVFrame - общий объем данных, не является правильным. В качестве имени переменной указано, что это длина одной строки, а возвращаемое значение sws_scale дает вам количество строк. Таким образом, общий размер диапазона памяти для выходного растрового изображения linesize умножается на возвращаемое значение.

Другие вопросы по тегам