[FFmpeg-devel] Added HW H.264 and HEVC encoding for AMD GPUs based on AMF SDK
Marton Balint
cus at passwd.hu
Tue Oct 31 20:05:35 EET 2017
On Tue, 31 Oct 2017, Mironov, Mikhail wrote:
[...]
>> I see some confusion. The user can call send_frame/receive_packet in any
>> order, and you can implement send_frame and receive_packet any way you
>> want, the only thing you have to guarantee is that you cannot return EAGAIN
>> for both send_frame and receive_packet. Not even temporarily.
>>
>> If you returned EAGAIN in send_frame, you must return success or a normal
>> error in receive_packet. If you returned EAGAIN in receive_packet, you must
>> return success or a normal error in send_frame.
>>
>> By returning EAGAIN in receive_packet you make sure that the API user
>> submits as many frames as needed to fill your pipeline.
>>
>> The simplest solution really seems to me what Mark proposed:
>>
>> send_frame:
>>
>> if (have_stored_frame)
>> return EAGAIN;
>> if (amd_send_frame() == INPUT_FULL)
>> store_frame;
>> return 0;
>>
>> receive_packet:
>>
>> if (have_stored_frame) {
>> if (amd_send_frame() == OK)
>> unstore_frame;
>> block_until_have_packet
>> return packet
>> } else {
>> return EAGAIN
>> }
>>
>> I hope I did not mess it up, proper draining and error handling obviously
>> needs some minor changes.
>>
>
> The logic in receive_packet() will be slightly different but I will figure this out.
> My only note is that returning EAGAIN from send_frame() will not work with
> current ffmpeg calling code.
> I was assured that this will never happen but I
> don’t like possibility of the failure. What the calling code supposed to do
> getting EAGAIN from send_frame()? Resubmit? If so it would not work with
> the logic described.
> Anyway, lets try Mark's suggestion and see if alternations are needed.
ffmpeg.c is written in a way that it calls receive_packet repeatedly until
it gets EAGAIN. Due to the API requirements I mentioned (send_frame and
receive_packet both cannot return EAGAIN), it is OK to not handle EAGAIN
for send_frame in ffmpeg.c code.
Other applications might use other logic (e.g. call send_frame repeatedly,
and then call receive_packet once, or call send_frame and receive packet
alternating), in these cases the user application must be able to handle
EAGAIN for send_frame, and resubmit the frame next time.
But if ffmpeg.c gets an EAGAIN in send_frame, that means a bug in the
encoder because the encoder is breaking the API and it needs to be fixed.
Regards,
Marton
More information about the ffmpeg-devel
mailing list