avcodec/bsf/dts2pts: use a RefStruct pool to allocate nodes
Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
99ec7a8ced
commit
fec6a8df31
@ -34,6 +34,7 @@
|
|||||||
#include "cbs_h264.h"
|
#include "cbs_h264.h"
|
||||||
#include "h264_parse.h"
|
#include "h264_parse.h"
|
||||||
#include "h264_ps.h"
|
#include "h264_ps.h"
|
||||||
|
#include "refstruct.h"
|
||||||
|
|
||||||
typedef struct DTS2PTSNode {
|
typedef struct DTS2PTSNode {
|
||||||
int64_t dts;
|
int64_t dts;
|
||||||
@ -61,6 +62,7 @@ typedef struct DTS2PTSH264Context {
|
|||||||
typedef struct DTS2PTSContext {
|
typedef struct DTS2PTSContext {
|
||||||
struct AVTreeNode *root;
|
struct AVTreeNode *root;
|
||||||
AVFifo *fifo;
|
AVFifo *fifo;
|
||||||
|
FFRefStructPool *node_pool;
|
||||||
|
|
||||||
// Codec specific function pointers and constants
|
// Codec specific function pointers and constants
|
||||||
int (*init)(AVBSFContext *ctx);
|
int (*init)(AVBSFContext *ctx);
|
||||||
@ -110,7 +112,7 @@ static int dec_poc(void *opaque, void *elem)
|
|||||||
static int free_node(void *opaque, void *elem)
|
static int free_node(void *opaque, void *elem)
|
||||||
{
|
{
|
||||||
DTS2PTSNode *node = elem;
|
DTS2PTSNode *node = elem;
|
||||||
av_free(node);
|
ff_refstruct_unref(&node);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,7 +126,7 @@ static int alloc_and_insert_node(AVBSFContext *ctx, int64_t ts, int64_t duration
|
|||||||
DTS2PTSNode *poc_node, *ret;
|
DTS2PTSNode *poc_node, *ret;
|
||||||
if (!node)
|
if (!node)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
poc_node = av_malloc(sizeof(*poc_node));
|
poc_node = ff_refstruct_pool_get(s->node_pool);
|
||||||
if (!poc_node) {
|
if (!poc_node) {
|
||||||
av_free(node);
|
av_free(node);
|
||||||
return AVERROR(ENOMEM);
|
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);
|
ret = av_tree_insert(&s->root, poc_node, cmp_insert, &node);
|
||||||
if (ret && ret != poc_node) {
|
if (ret && ret != poc_node) {
|
||||||
*ret = *poc_node;
|
*ret = *poc_node;
|
||||||
av_free(poc_node);
|
ff_refstruct_unref(&poc_node);
|
||||||
av_free(node);
|
av_free(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -394,6 +396,11 @@ static int dts2pts_init(AVBSFContext *ctx)
|
|||||||
if (!s->fifo)
|
if (!s->fifo)
|
||||||
return AVERROR(ENOMEM);
|
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);
|
ret = ff_cbs_init(&s->cbc, ctx->par_in->codec_id, ctx);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
@ -459,7 +466,7 @@ static int dts2pts_filter(AVBSFContext *ctx, AVPacket *out)
|
|||||||
if (!poc_node || poc_node->dts != out->pts)
|
if (!poc_node || poc_node->dts != out->pts)
|
||||||
continue;
|
continue;
|
||||||
av_tree_insert(&s->root, poc_node, cmp_insert, &node);
|
av_tree_insert(&s->root, poc_node, cmp_insert, &node);
|
||||||
av_free(poc_node);
|
ff_refstruct_unref(&poc_node);
|
||||||
av_free(node);
|
av_free(node);
|
||||||
poc_node = av_tree_find(s->root, &dup, cmp_find, NULL);
|
poc_node = av_tree_find(s->root, &dup, cmp_find, NULL);
|
||||||
}
|
}
|
||||||
@ -521,6 +528,7 @@ static void dts2pts_close(AVBSFContext *ctx)
|
|||||||
dts2pts_flush(ctx);
|
dts2pts_flush(ctx);
|
||||||
|
|
||||||
av_fifo_freep2(&s->fifo);
|
av_fifo_freep2(&s->fifo);
|
||||||
|
ff_refstruct_pool_uninit(&s->node_pool);
|
||||||
ff_cbs_fragment_free(&s->au);
|
ff_cbs_fragment_free(&s->au);
|
||||||
ff_cbs_close(&s->cbc);
|
ff_cbs_close(&s->cbc);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user