From 75d1529c6e9069b240bf6471d64e5bc81e0b9013 Mon Sep 17 00:00:00 2001 From: Marton Balint Date: Sun, 22 Apr 2018 22:29:09 +0200 Subject: [PATCH] avdevice/decklink_dec: do not copy video data Create a buffer from the data instead and use the buffer destructor to free the DeckLink frame. This avoids a memcpy of the frame data. Signed-off-by: Marton Balint --- libavdevice/decklink_dec.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp index e97a4402ea..10535dc388 100644 --- a/libavdevice/decklink_dec.cpp +++ b/libavdevice/decklink_dec.cpp @@ -98,6 +98,14 @@ static VANCLineNumber vanc_line_numbers[] = { {bmdModeUnknown, 0, -1, -1, -1} }; +extern "C" { +static void decklink_object_free(void *opaque, uint8_t *data) +{ + IUnknown *obj = (class IUnknown *)opaque; + obj->Release(); +} +} + static int get_vanc_line_idx(BMDDisplayMode mode) { unsigned int i; @@ -797,6 +805,10 @@ HRESULT decklink_input_callback::VideoInputFrameArrived( } } + pkt.buf = av_buffer_create(pkt.data, pkt.size, decklink_object_free, videoFrame, 0); + if (pkt.buf) + videoFrame->AddRef(); + if (avpacket_queue_put(&ctx->queue, &pkt) < 0) { ++ctx->dropped; }