VP9SFSplitContext *s = ctx->priv_data;
AVPacket *in;
int i, j, ret, marker;
- int is_superframe = !!s->buffer_pkt;
+ int is_superframe = !!s->buffer_pkt->data;
- if (!s->buffer_pkt) {
- ret = ff_bsf_get_packet(ctx, &s->buffer_pkt);
+ if (!s->buffer_pkt->data) {
+ ret = ff_bsf_get_packet_ref(ctx, s->buffer_pkt);
if (ret < 0)
return ret;
in = s->buffer_pkt;
s->next_frame++;
if (s->next_frame >= s->nb_frames)
- av_packet_free(&s->buffer_pkt);
+ av_packet_unref(s->buffer_pkt);
ret = init_get_bits8(&gb, out->data, out->size);
if (ret < 0)
} else {
av_packet_move_ref(out, s->buffer_pkt);
- av_packet_free(&s->buffer_pkt);
}
return 0;
fail:
- av_packet_free(&s->buffer_pkt);
+ if (ret < 0)
+ av_packet_unref(out);
+ av_packet_unref(s->buffer_pkt);
return ret;
}
+static int vp9_superframe_split_init(AVBSFContext *ctx)
+{
+ VP9SFSplitContext *s = ctx->priv_data;
+
+ s->buffer_pkt = av_packet_alloc();
+ if (!s->buffer_pkt)
+ return AVERROR(ENOMEM);
+
+ return 0;
+}
+
+static void vp9_superframe_split_flush(AVBSFContext *ctx)
+{
+ VP9SFSplitContext *s = ctx->priv_data;
+ av_packet_unref(s->buffer_pkt);
+}
+
static void vp9_superframe_split_uninit(AVBSFContext *ctx)
{
VP9SFSplitContext *s = ctx->priv_data;
const AVBitStreamFilter ff_vp9_superframe_split_bsf = {
.name = "vp9_superframe_split",
.priv_data_size = sizeof(VP9SFSplitContext),
+ .init = vp9_superframe_split_init,
+ .flush = vp9_superframe_split_flush,
.close = vp9_superframe_split_uninit,
.filter = vp9_superframe_split_filter,
.codec_ids = (const enum AVCodecID []){ AV_CODEC_ID_VP9, AV_CODEC_ID_NONE },