summaryrefslogtreecommitdiff
path: root/libavcodec/nvdec.c
diff options
context:
space:
mode:
authorPhilip Langdale <philipl@overt.org>2017-11-18 20:29:15 -0800
committerPhilip Langdale <philipl@overt.org>2017-11-20 07:03:26 -0800
commit4c7b023d56e09a78a587d036db1b64bf7c493b3d (patch)
tree31237bc67175fc5dba0eefa015be18a8fe6bafb0 /libavcodec/nvdec.c
parent16d67fabb1eb781d800b76e7843e39c349f15d24 (diff)
downloadffmpeg-4c7b023d56e09a78a587d036db1b64bf7c493b3d.tar.gz
avcodec: Refactor common nvdec hwaccel logic
The 'simple' hwaccels (not h.264 and hevc) all use the same bitstream management and reference lookup logic so let's refactor all that into common functions. I verified that casting a signed int -1 to unsigned char produces 255 according to the C language specification.
Diffstat (limited to 'libavcodec/nvdec.c')
-rw-r--r--libavcodec/nvdec.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/libavcodec/nvdec.c b/libavcodec/nvdec.c
index 3d62840e9f..97ff605f0f 100644
--- a/libavcodec/nvdec.c
+++ b/libavcodec/nvdec.c
@@ -475,6 +475,36 @@ finish:
return ret;
}
+int ff_nvdec_simple_end_frame(AVCodecContext *avctx)
+{
+ NVDECContext *ctx = avctx->internal->hwaccel_priv_data;
+ int ret = ff_nvdec_end_frame(avctx);
+ ctx->bitstream = NULL;
+ return ret;
+}
+
+int ff_nvdec_simple_decode_slice(AVCodecContext *avctx, const uint8_t *buffer,
+ uint32_t size)
+{
+ NVDECContext *ctx = avctx->internal->hwaccel_priv_data;
+ void *tmp;
+
+ tmp = av_fast_realloc(ctx->slice_offsets, &ctx->slice_offsets_allocated,
+ (ctx->nb_slices + 1) * sizeof(*ctx->slice_offsets));
+ if (!tmp)
+ return AVERROR(ENOMEM);
+ ctx->slice_offsets = tmp;
+
+ if (!ctx->bitstream)
+ ctx->bitstream = (uint8_t*)buffer;
+
+ ctx->slice_offsets[ctx->nb_slices] = buffer - ctx->bitstream;
+ ctx->bitstream_len += size;
+ ctx->nb_slices++;
+
+ return 0;
+}
+
int ff_nvdec_frame_params(AVCodecContext *avctx,
AVBufferRef *hw_frames_ctx,
int dpb_size)
@@ -520,3 +550,19 @@ int ff_nvdec_frame_params(AVCodecContext *avctx,
return 0;
}
+
+int ff_nvdec_get_ref_idx(AVFrame *frame)
+{
+ FrameDecodeData *fdd;
+ NVDECFrame *cf;
+
+ if (!frame || !frame->private_ref)
+ return -1;
+
+ fdd = (FrameDecodeData*)frame->private_ref->data;
+ cf = (NVDECFrame*)fdd->hwaccel_priv;
+ if (!cf)
+ return -1;
+
+ return cf->idx;
+}