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
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel