summaryrefslogtreecommitdiff
path: root/libavdevice/decklink_dec.cpp
diff options
context:
space:
mode:
authorDevin Heitmueller <devin.heitmueller@ltnglobal.com>2023-04-28 14:40:51 -0400
committerMarton Balint <cus@passwd.hu>2023-05-11 22:46:15 +0200
commit4fd729a1f8a48dfb9b9a5a0ebf72f0733afe3300 (patch)
tree117f0d2ac5072176783fba52dd1fae142f098239 /libavdevice/decklink_dec.cpp
parent4373dadc39be32611c5366fdae89ffb3e103279c (diff)
downloadffmpeg-4fd729a1f8a48dfb9b9a5a0ebf72f0733afe3300.tar.gz
avdevice/decklink: move AVPacketQueue into decklink_common and rename it to DecklinkPacketQueue
Move the AVPacketQueue functionality that is currently only used for the decklink decode module into decklink_common, so it can be shared by the decklink encoder (i.e. for VANC insertion when we receive data packets separate from video). The threadsafe queue used within the decklink module was named "AVPacketQueue" which implies that it is part of the public API, which it is not. Rename the functions and the name of the queue struct to make clear it is used exclusively by decklink, per Marton Balint's suggestion. Signed-off-by: Devin Heitmueller <dheitmueller@ltnglobal.com> Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'libavdevice/decklink_dec.cpp')
-rw-r--r--libavdevice/decklink_dec.cpp130
1 files changed, 8 insertions, 122 deletions
diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp
index 7bf5e3724c..66abee1268 100644
--- a/libavdevice/decklink_dec.cpp
+++ b/libavdevice/decklink_dec.cpp
@@ -471,120 +471,6 @@ skip_packet:
return tgt;
}
-static void avpacket_queue_init(AVFormatContext *avctx, AVPacketQueue *q)
-{
- struct decklink_cctx *ctx = (struct decklink_cctx *)avctx->priv_data;
- memset(q, 0, sizeof(AVPacketQueue));
- pthread_mutex_init(&q->mutex, NULL);
- pthread_cond_init(&q->cond, NULL);
- q->avctx = avctx;
- q->max_q_size = ctx->queue_size;
-}
-
-static void avpacket_queue_flush(AVPacketQueue *q)
-{
- PacketListEntry *pkt, *pkt1;
-
- pthread_mutex_lock(&q->mutex);
- for (pkt = q->pkt_list.head; pkt != NULL; pkt = pkt1) {
- pkt1 = pkt->next;
- av_packet_unref(&pkt->pkt);
- av_freep(&pkt);
- }
- q->pkt_list.head = NULL;
- q->pkt_list.tail = NULL;
- q->nb_packets = 0;
- q->size = 0;
- pthread_mutex_unlock(&q->mutex);
-}
-
-static void avpacket_queue_end(AVPacketQueue *q)
-{
- avpacket_queue_flush(q);
- pthread_mutex_destroy(&q->mutex);
- pthread_cond_destroy(&q->cond);
-}
-
-static unsigned long long avpacket_queue_size(AVPacketQueue *q)
-{
- unsigned long long size;
- pthread_mutex_lock(&q->mutex);
- size = q->size;
- pthread_mutex_unlock(&q->mutex);
- return size;
-}
-
-static int avpacket_queue_put(AVPacketQueue *q, AVPacket *pkt)
-{
- PacketListEntry *pkt1;
-
- // Drop Packet if queue size is > maximum queue size
- if (avpacket_queue_size(q) > (uint64_t)q->max_q_size) {
- av_packet_unref(pkt);
- av_log(q->avctx, AV_LOG_WARNING, "Decklink input buffer overrun!\n");
- return -1;
- }
- /* ensure the packet is reference counted */
- if (av_packet_make_refcounted(pkt) < 0) {
- av_packet_unref(pkt);
- return -1;
- }
-
- pkt1 = (PacketListEntry *)av_malloc(sizeof(*pkt1));
- if (!pkt1) {
- av_packet_unref(pkt);
- return -1;
- }
- av_packet_move_ref(&pkt1->pkt, pkt);
- pkt1->next = NULL;
-
- pthread_mutex_lock(&q->mutex);
-
- if (!q->pkt_list.tail) {
- q->pkt_list.head = pkt1;
- } else {
- q->pkt_list.tail->next = pkt1;
- }
-
- q->pkt_list.tail = pkt1;
- q->nb_packets++;
- q->size += pkt1->pkt.size + sizeof(*pkt1);
-
- pthread_cond_signal(&q->cond);
-
- pthread_mutex_unlock(&q->mutex);
- return 0;
-}
-
-static int avpacket_queue_get(AVPacketQueue *q, AVPacket *pkt, int block)
-{
- int ret;
-
- pthread_mutex_lock(&q->mutex);
-
- for (;; ) {
- PacketListEntry *pkt1 = q->pkt_list.head;
- if (pkt1) {
- q->pkt_list.head = pkt1->next;
- if (!q->pkt_list.head) {
- q->pkt_list.tail = NULL;
- }
- q->nb_packets--;
- q->size -= pkt1->pkt.size + sizeof(*pkt1);
- *pkt = pkt1->pkt;
- av_free(pkt1);
- ret = 1;
- break;
- } else if (!block) {
- ret = 0;
- break;
- } else {
- pthread_cond_wait(&q->cond, &q->mutex);
- }
- }
- pthread_mutex_unlock(&q->mutex);
- return ret;
-}
static void handle_klv(AVFormatContext *avctx, decklink_ctx *ctx, IDeckLinkVideoInputFrame *videoFrame, int64_t pts)
{
@@ -682,7 +568,7 @@ static void handle_klv(AVFormatContext *avctx, decklink_ctx *ctx, IDeckLinkVideo
klv_packet.data = klv.data();
klv_packet.size = klv.size();
- if (avpacket_queue_put(&ctx->queue, &klv_packet) < 0) {
+ if (ff_decklink_packet_queue_put(&ctx->queue, &klv_packet) < 0) {
++ctx->dropped;
}
}
@@ -874,7 +760,7 @@ HRESULT decklink_input_callback::VideoInputFrameArrived(
if (videoFrame) {
AVPacket pkt = { 0 };
if (ctx->frameCount % 25 == 0) {
- unsigned long long qsize = avpacket_queue_size(&ctx->queue);
+ unsigned long long qsize = ff_decklink_packet_queue_size(&ctx->queue);
av_log(avctx, AV_LOG_DEBUG,
"Frame received (#%lu) - Valid (%liB) - QSize %fMB\n",
ctx->frameCount,
@@ -1038,7 +924,7 @@ HRESULT decklink_input_callback::VideoInputFrameArrived(
txt_pkt.stream_index = ctx->teletext_st->index;
txt_pkt.data = txt_buf0;
txt_pkt.size = txt_buf - txt_buf0;
- if (avpacket_queue_put(&ctx->queue, &txt_pkt) < 0) {
+ if (ff_decklink_packet_queue_put(&ctx->queue, &txt_pkt) < 0) {
++ctx->dropped;
}
}
@@ -1049,7 +935,7 @@ HRESULT decklink_input_callback::VideoInputFrameArrived(
if (pkt.buf)
videoFrame->AddRef();
- if (avpacket_queue_put(&ctx->queue, &pkt) < 0) {
+ if (ff_decklink_packet_queue_put(&ctx->queue, &pkt) < 0) {
++ctx->dropped;
}
}
@@ -1071,7 +957,7 @@ HRESULT decklink_input_callback::VideoInputFrameArrived(
pkt.stream_index = ctx->audio_st->index;
pkt.data = (uint8_t *)audioFrameBytes;
- if (avpacket_queue_put(&ctx->queue, &pkt) < 0) {
+ if (ff_decklink_packet_queue_put(&ctx->queue, &pkt) < 0) {
++ctx->dropped;
}
}
@@ -1153,7 +1039,7 @@ av_cold int ff_decklink_read_close(AVFormatContext *avctx)
}
ff_decklink_cleanup(avctx);
- avpacket_queue_end(&ctx->queue);
+ ff_decklink_packet_queue_end(&ctx->queue);
av_freep(&cctx->ctx);
@@ -1411,7 +1297,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
goto error;
}
- avpacket_queue_init (avctx, &ctx->queue);
+ ff_decklink_packet_queue_init(avctx, &ctx->queue);
if (ctx->dli->StartStreams() != S_OK) {
av_log(avctx, AV_LOG_ERROR, "Cannot start input stream\n");
@@ -1431,7 +1317,7 @@ int ff_decklink_read_packet(AVFormatContext *avctx, AVPacket *pkt)
struct decklink_cctx *cctx = (struct decklink_cctx *)avctx->priv_data;
struct decklink_ctx *ctx = (struct decklink_ctx *)cctx->ctx;
- avpacket_queue_get(&ctx->queue, pkt, 1);
+ ff_decklink_packet_queue_get(&ctx->queue, pkt, 1);
if (ctx->tc_format && !(av_dict_get(ctx->video_st->metadata, "timecode", NULL, 0))) {
size_t size;