Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
decode: add a mechanism for performing delayed processing on the deco…
…ded frames
This will be useful in the CUVID hwaccel.
- Loading branch information
Showing
with
26 additions
and
0 deletions.
-
+11
−0
libavcodec/decode.c
-
+15
−0
libavcodec/decode.h
|
|
@@ -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; |
|
|
|
|
|
/** |
|
|
|