|
|
@@ -114,6 +114,12 @@ |
|
|
|
* are filled. This situation is handled transparently if you follow the steps |
|
|
|
* outlined above. |
|
|
|
* |
|
|
|
* In theory, sending input can result in EAGAIN - this should happen only if |
|
|
|
* not all output was received. You can use this to structure alternative decode |
|
|
|
* or encode loops other than the one suggested above. For example, you could |
|
|
|
* try sending new input on each iteration, and try to receive output if that |
|
|
|
* returns EAGAIN. |
|
|
|
* |
|
|
|
* End of stream situations. These require "flushing" (aka draining) the codec, |
|
|
|
* as the codec might buffer multiple frames or packets internally for |
|
|
|
* performance or out of necessity (consider B-frames). |
|
|
@@ -148,7 +154,8 @@ |
|
|
|
* Unlike with the old video decoding API, multiple frames might result from |
|
|
|
* a packet. For audio, splitting the input packet into frames by partially |
|
|
|
* decoding packets becomes transparent to the API user. You never need to |
|
|
|
* feed an AVPacket to the API twice. |
|
|
|
* feed an AVPacket to the API twice (unless it is rejected with EAGAIN - then |
|
|
|
* no data was read from the packet). |
|
|
|
* Additionally, sending a flush/draining packet is required only once. |
|
|
|
* - avcodec_encode_video2()/avcodec_encode_audio2(): |
|
|
|
* Use avcodec_send_frame() to feed input to the encoder, then use |
|
|
@@ -161,7 +168,22 @@ |
|
|
|
* and will result in arbitrary behavior. |
|
|
|
* |
|
|
|
* Some codecs might require using the new API; using the old API will return |
|
|
|
* an error when calling it. |
|
|
|
* an error when calling it. All codecs support the new API. |
|
|
|
* |
|
|
|
* A codec is not allowed to return EAGAIN for both sending and receiving. This |
|
|
|
* would be an invalid state, which could put the codec user into an endless |
|
|
|
* loop. The API has no concept of time either: it cannot happen that trying to |
|
|
|
* do avcodec_send_packet() results in EAGAIN, but a repeated call 1 second |
|
|
|
* later accepts the packet (with no other receive/flush API calls involved). |
|
|
|
* The API is a strict state machine, and the passage of time is not supposed |
|
|
|
* to influence it. Some timing-dependent behavior might still be deemed |
|
|
|
* acceptable in certain cases. But it must never result in both send/receive |
|
|
|
* returning EAGAIN at the same time at any point. It must also absolutely be |
|
|
|
* avoided that the current state is "unstable" and can "flip-flop" between |
|
|
|
* the send/receive APIs allowing progress. For example, it's not allowed that |
|
|
|
* the codec randomly decides that it actually wants to consume a packet now |
|
|
|
* instead of returning a frame, after it just returned EAGAIN on an |
|
|
|
* avcodec_send_packet() call. |
|
|
|
* @} |
|
|
|
*/ |
|
|
|
|
|
|
@@ -4339,8 +4361,10 @@ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, |
|
|
|
* a flush packet. |
|
|
|
* |
|
|
|
* @return 0 on success, otherwise negative error code: |
|
|
|
* AVERROR(EAGAIN): input is not accepted right now - the packet must be |
|
|
|
* resent after trying to read output |
|
|
|
* AVERROR(EAGAIN): input is not accepted in the current state - user |
|
|
|
* must read output with avcodec_receive_frame() (once |
|
|
|
* all output is read, the packet should be resent, and |
|
|
|
* the call will not fail with EAGAIN). |
|
|
|
* AVERROR_EOF: the decoder has been flushed, and no new packets can |
|
|
|
* be sent to it (also returned if more than 1 flush |
|
|
|
* packet is sent) |
|
|
@@ -4361,7 +4385,7 @@ int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt); |
|
|
|
* |
|
|
|
* @return |
|
|
|
* 0: success, a frame was returned |
|
|
|
* AVERROR(EAGAIN): output is not available right now - user must try |
|
|
|
* AVERROR(EAGAIN): output is not available in this state - user must try |
|
|
|
* to send new input |
|
|
|
* AVERROR_EOF: the decoder has been fully flushed, and there will be |
|
|
|
* no more output frames |
|
|
@@ -4394,8 +4418,10 @@ int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame); |
|
|
|
* avctx->frame_size for all frames except the last. |
|
|
|
* The final frame may be smaller than avctx->frame_size. |
|
|
|
* @return 0 on success, otherwise negative error code: |
|
|
|
* AVERROR(EAGAIN): input is not accepted right now - the frame must be |
|
|
|
* resent after trying to read output packets |
|
|
|
* AVERROR(EAGAIN): input is not accepted in the current state - user |
|
|
|
* must read output with avcodec_receive_packet() (once |
|
|
|
* all output is read, the packet should be resent, and |
|
|
|
* the call will not fail with EAGAIN). |
|
|
|
* AVERROR_EOF: the encoder has been flushed, and no new frames can |
|
|
|
* be sent to it |
|
|
|
* AVERROR(EINVAL): codec not opened, refcounted_frames not set, it is a |
|
|
@@ -4413,8 +4439,8 @@ int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame); |
|
|
|
* encoder. Note that the function will always call |
|
|
|
* av_frame_unref(frame) before doing anything else. |
|
|
|
* @return 0 on success, otherwise negative error code: |
|
|
|
* AVERROR(EAGAIN): output is not available right now - user must try |
|
|
|
* to send input |
|
|
|
* AVERROR(EAGAIN): output is not available in the current state - user |
|
|
|
* must try to send input |
|
|
|
* AVERROR_EOF: the encoder has been fully flushed, and there will be |
|
|
|
* no more output packets |
|
|
|
* AVERROR(EINVAL): codec not opened, or it is an encoder |
|
|
|