mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-24 13:56:33 +02:00
decode: add a mechanism for performing delayed processing on the decoded frames
This will be useful in the CUVID hwaccel. Merges Libav commit badf0951f54c1332e77455dc40398f3512540c1b.
This commit is contained in:
parent
9f1cfd88af
commit
7fa64514c8
@ -620,6 +620,18 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
|
||||
av_assert0((frame->private_ref && frame->private_ref->size == sizeof(FrameDecodeData)) ||
|
||||
!(avctx->codec->capabilities & AV_CODEC_CAP_DR1));
|
||||
|
||||
if (frame->private_ref) {
|
||||
FrameDecodeData *fdd = (FrameDecodeData*)frame->private_ref->data;
|
||||
|
||||
if (fdd->post_process) {
|
||||
ret = fdd->post_process(avctx, frame);
|
||||
if (ret < 0) {
|
||||
av_frame_unref(frame);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
av_buffer_unref(&frame->private_ref);
|
||||
}
|
||||
|
||||
@ -1566,6 +1578,9 @@ static void decode_data_free(void *opaque, uint8_t *data)
|
||||
{
|
||||
FrameDecodeData *fdd = (FrameDecodeData*)data;
|
||||
|
||||
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"
|
||||
|
||||
@ -30,6 +31,19 @@
|
||||
* private_ref.
|
||||
*/
|
||||
typedef struct FrameDecodeData {
|
||||
/**
|
||||
* 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;
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user