avcodec/bsf/dts2pts: use a RefStruct pool to allocate nodes

Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
James Almer 2024-09-13 21:45:33 -03:00
parent 99ec7a8ced
commit fec6a8df31

View File

@ -34,6 +34,7 @@
#include "cbs_h264.h"
#include "h264_parse.h"
#include "h264_ps.h"
#include "refstruct.h"
typedef struct DTS2PTSNode {
int64_t dts;
@ -61,6 +62,7 @@ typedef struct DTS2PTSH264Context {
typedef struct DTS2PTSContext {
struct AVTreeNode *root;
AVFifo *fifo;
FFRefStructPool *node_pool;
// Codec specific function pointers and constants
int (*init)(AVBSFContext *ctx);
@ -110,7 +112,7 @@ static int dec_poc(void *opaque, void *elem)
static int free_node(void *opaque, void *elem)
{
DTS2PTSNode *node = elem;
av_free(node);
ff_refstruct_unref(&node);
return 0;
}
@ -124,7 +126,7 @@ static int alloc_and_insert_node(AVBSFContext *ctx, int64_t ts, int64_t duration
DTS2PTSNode *poc_node, *ret;
if (!node)
return AVERROR(ENOMEM);
poc_node = av_malloc(sizeof(*poc_node));
poc_node = ff_refstruct_pool_get(s->node_pool);
if (!poc_node) {
av_free(node);
return AVERROR(ENOMEM);
@ -135,7 +137,7 @@ static int alloc_and_insert_node(AVBSFContext *ctx, int64_t ts, int64_t duration
ret = av_tree_insert(&s->root, poc_node, cmp_insert, &node);
if (ret && ret != poc_node) {
*ret = *poc_node;
av_free(poc_node);
ff_refstruct_unref(&poc_node);
av_free(node);
}
}
@ -394,6 +396,11 @@ static int dts2pts_init(AVBSFContext *ctx)
if (!s->fifo)
return AVERROR(ENOMEM);
s->node_pool = ff_refstruct_pool_alloc(sizeof(DTS2PTSNode), 0);
if (!s->node_pool)
return AVERROR(ENOMEM);
ret = ff_cbs_init(&s->cbc, ctx->par_in->codec_id, ctx);
if (ret < 0)
return ret;
@ -459,7 +466,7 @@ static int dts2pts_filter(AVBSFContext *ctx, AVPacket *out)
if (!poc_node || poc_node->dts != out->pts)
continue;
av_tree_insert(&s->root, poc_node, cmp_insert, &node);
av_free(poc_node);
ff_refstruct_unref(&poc_node);
av_free(node);
poc_node = av_tree_find(s->root, &dup, cmp_find, NULL);
}
@ -521,6 +528,7 @@ static void dts2pts_close(AVBSFContext *ctx)
dts2pts_flush(ctx);
av_fifo_freep2(&s->fifo);
ff_refstruct_pool_uninit(&s->node_pool);
ff_cbs_fragment_free(&s->au);
ff_cbs_close(&s->cbc);
}