Commit badf0951 authored by Anton Khirnov's avatar Anton Khirnov

decode: add a mechanism for performing delayed processing on the decoded frames

This will be useful in the CUVID hwaccel.
parent 359a8a3e
......@@ -419,6 +419,14 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
fdd = (FrameDecodeData*)frame->opaque_ref->data;
if (fdd->post_process) {
ret = fdd->post_process(avctx, frame);
if (ret < 0) {
av_frame_unref(frame);
return ret;
}
}
user_opaque_ref = fdd->user_opaque_ref;
fdd->user_opaque_ref = NULL;
av_buffer_unref(&frame->opaque_ref);
......@@ -1014,6 +1022,9 @@ static void decode_data_free(void *opaque, uint8_t *data)
av_buffer_unref(&fdd->user_opaque_ref);
if (fdd->post_process_opaque_free)
fdd->post_process_opaque_free(fdd->post_process_opaque);
av_freep(&fdd);
}
......
......@@ -22,6 +22,7 @@
#define AVCODEC_DECODE_H
#include "libavutil/buffer.h"
#include "libavutil/frame.h"
#include "avcodec.h"
......@@ -34,6 +35,20 @@ typedef struct FrameDecodeData {
* The original user-set opaque_ref.
*/
AVBufferRef *user_opaque_ref;
/**
* The callback to perform some delayed processing on the frame right
* before it is returned to the caller.
*
* @note This code is called at some unspecified point after the frame is
* returned from the decoder's decode/receive_frame call. Therefore it cannot rely
* on AVCodecContext being in any specific state, so it does not get to
* access AVCodecContext directly at all. All the state it needs must be
* stored in the post_process_opaque object.
*/
int (*post_process)(void *logctx, AVFrame *frame);
void *post_process_opaque;
void (*post_process_opaque_free)(void *opaque);
} FrameDecodeData;
/**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment