Browse Source

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

This will be useful in the CUVID hwaccel.

Merges Libav commit badf0951f5.
tags/n4.0
Anton Khirnov Timo Rothenpieler 8 years ago
parent
commit
7fa64514c8
2 changed files with 29 additions and 0 deletions
  1. +15
    -0
      libavcodec/decode.c
  2. +14
    -0
      libavcodec/decode.h

+ 15
- 0
libavcodec/decode.c View File

@@ -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);
}



+ 14
- 0
libavcodec/decode.h View File

@@ -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…
Cancel
Save