On 12/14/16 9:25 AM, Anton Khirnov wrote:
> Quoting Luca Barbato (2016-12-12 16:01:18)
>> On 12/12/2016 13:09, Anton Khirnov wrote:
>>> Quoting Luca Barbato (2016-12-10 19:29:44)
>>>> On 10/12/2016 18:44, Mark Thompson wrote:
>>>>> Um, what?  The internet thinks that P208 is a YUV 4:2:2 two-plane format 
>>>>> analogous to NV12 (I guess named like P010), which does not in any way 
>>>>> resemble PAL8.
>>>>
>>>> I know ...
>>>>
>>>>> Also, the middle field there should be a VA_RT_FORMAT (I suggest using 
>>>>> the macro).
>>>>
>>>> I know ...
>>>>
>>>> Yet that's the way (TM), Intel examples are using to support hevc
>>>> encoding + vaapi...
>>>>
>>>> If you have better ideas I'm all ears.
>>>
>>> HEVC encoding seems to work here without any such things.
>>>
>>
>> avconv -hwaccel qsv -c:v h264_qsv \
>>     -i ~/Samples/bbb_sunflower_1080p_60fps_normal.mp4 \
>>     -r 25 -b:v 3M -q:v 20 -c:v hevc_qsv -load_plugin hevc_hw \
>>     -an -f null -
>>
>> this produces:
>>
>> [AVHWFramesContext @ 0x43d7ca0] Unsupported format: pal8.
>> [AVHWFramesContext @ 0x41ee5e0] Error initializing a child frames context
>> [AVHWFramesContext @ 0x41ee5e0] Error creating an internal frame pool
>> [hevc_qsv @ 0x30461a0] Error initializing a frames context for an
>> internal frame allocation request
>> [hevc_qsv @ 0x30461a0] Error initializing the encoder: failed to
>> allocate memory (-4)
>>
>> Without the patch.
> 
> Ah, I thought we are talking about vaapi for some reason. If you look at
> the QSV examples more closely, you'll see they don't actually allocate
> P208 surfaces. And your patch does not work for me, the encoder returns
> DEVICE_BUSY endlessly.
> 

I eventually have time to have a closer look and...

        if( VA_FOURCC_P208 != va_fourcc )
        {
           ... normal stuff ...
        } else {
            VAContextID context_id = request->AllocId;
            int codedbuf_size;

            int width32 = 32 * ((request->Info.Width + 31) >> 5);
            int height32 = 32 * ((request->Info.Height + 31) >> 5);

            VABufferType codedbuf_type;
            if (fourcc == MFX_FOURCC_VP8_SEGMAP)
            {
                codedbuf_size = request->Info.Width * request->Info.Height;
                codedbuf_type = (VABufferType)VAEncMacroblockMapBufferType;
            }
            else
            {
                codedbuf_size = static_cast<int>((width32 * height32) *
400LL / (16 * 16));
                codedbuf_type = VAEncCodedBufferType;
            }

            for (numAllocated = 0; numAllocated < surfaces_num;
numAllocated++)
            {
                VABufferID coded_buf;

                va_res = m_libva->vaCreateBuffer(m_dpy,
                                      context_id,
                                      codedbuf_type,
                                      codedbuf_size,
                                      1,
                                      NULL,
                                      &coded_buf);
                mfx_res = va_to_mfx_status(va_res);
                if (MFX_ERR_NONE != mfx_res) break;
                surfaces[numAllocated] = coded_buf;
            }

... Not exactly pretty.

lu

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to