Commit 26513529 authored by Mark Thompson's avatar Mark Thompson

cbs: Allocate the context inside the init function

... instead of making callers allocate it themselves.  This is more
consistent with other APIs in libav.
parent cc1c94da
......@@ -39,9 +39,10 @@ static const CodedBitstreamType *cbs_type_table[] = {
#endif
};
int ff_cbs_init(CodedBitstreamContext *ctx,
int ff_cbs_init(CodedBitstreamContext **ctx_ptr,
enum AVCodecID codec_id, void *log_ctx)
{
CodedBitstreamContext *ctx;
const CodedBitstreamType *type;
int i;
......@@ -55,27 +56,40 @@ int ff_cbs_init(CodedBitstreamContext *ctx,
if (!type)
return AVERROR(EINVAL);
ctx = av_mallocz(sizeof(*ctx));
if (!ctx)
return AVERROR(ENOMEM);
ctx->log_ctx = log_ctx;
ctx->codec = type;
ctx->priv_data = av_mallocz(ctx->codec->priv_data_size);
if (!ctx->priv_data)
if (!ctx->priv_data) {
av_freep(&ctx);
return AVERROR(ENOMEM);
}
ctx->decompose_unit_types = NULL;
ctx->trace_enable = 0;
ctx->trace_level = AV_LOG_TRACE;
*ctx_ptr = ctx;
return 0;
}
void ff_cbs_close(CodedBitstreamContext *ctx)
void ff_cbs_close(CodedBitstreamContext **ctx_ptr)
{
CodedBitstreamContext *ctx = *ctx_ptr;
if (!ctx)
return;
if (ctx->codec && ctx->codec->close)
ctx->codec->close(ctx);
av_freep(&ctx->priv_data);
av_freep(ctx_ptr);
}
static void cbs_unit_uninit(CodedBitstreamContext *ctx,
......
......@@ -169,15 +169,15 @@ typedef struct CodedBitstreamContext {
/**
* Initialise a new context for the given codec.
* Create and initialise a new context for the given codec.
*/
int ff_cbs_init(CodedBitstreamContext *ctx,
int ff_cbs_init(CodedBitstreamContext **ctx,
enum AVCodecID codec_id, void *log_ctx);
/**
* Close a context and free all internal state.
*/
void ff_cbs_close(CodedBitstreamContext *ctx);
void ff_cbs_close(CodedBitstreamContext **ctx);
/**
......
......@@ -35,7 +35,7 @@ enum {
typedef struct H264MetadataContext {
const AVClass *class;
CodedBitstreamContext cbc;
CodedBitstreamContext *cbc;
CodedBitstreamFragment access_unit;
H264RawAUD aud_nal;
......@@ -214,7 +214,7 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *out)
if (err < 0)
goto fail;
err = ff_cbs_read_packet(&ctx->cbc, au, in);
err = ff_cbs_read_packet(ctx->cbc, au, in);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n");
goto fail;
......@@ -229,7 +229,7 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *out)
// If an AUD is present, it must be the first NAL unit.
if (au->units[0].type == H264_NAL_AUD) {
if (ctx->aud == REMOVE)
ff_cbs_delete_unit(&ctx->cbc, au, 0);
ff_cbs_delete_unit(ctx->cbc, au, 0);
} else {
if (ctx->aud == INSERT) {
static const int primary_pic_type_table[] = {
......@@ -269,7 +269,7 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *out)
aud->nal_unit_header.nal_unit_type = H264_NAL_AUD;
aud->primary_pic_type = j;
err = ff_cbs_insert_unit_content(&ctx->cbc, au,
err = ff_cbs_insert_unit_content(ctx->cbc, au,
0, H264_NAL_AUD, aud);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to insert AUD.\n");
......@@ -314,7 +314,7 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *out)
sei->nal_unit_header.nal_unit_type = H264_NAL_SEI;
err = ff_cbs_insert_unit_content(&ctx->cbc, au,
err = ff_cbs_insert_unit_content(ctx->cbc, au,
sei_pos, H264_NAL_SEI, sei);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to insert SEI.\n");
......@@ -375,7 +375,7 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *out)
++sei->payload_count;
}
err = ff_cbs_write_packet(&ctx->cbc, out, au);
err = ff_cbs_write_packet(ctx->cbc, out, au);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n");
goto fail;
......@@ -387,7 +387,7 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *out)
err = 0;
fail:
ff_cbs_fragment_uninit(&ctx->cbc, au);
ff_cbs_fragment_uninit(ctx->cbc, au);
av_freep(&sei_udu_string);
av_packet_free(&in);
......@@ -406,7 +406,7 @@ static int h264_metadata_init(AVBSFContext *bsf)
return err;
if (bsf->par_in->extradata) {
err = ff_cbs_read_extradata(&ctx->cbc, au, bsf->par_in);
err = ff_cbs_read_extradata(ctx->cbc, au, bsf->par_in);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to read extradata.\n");
goto fail;
......@@ -420,7 +420,7 @@ static int h264_metadata_init(AVBSFContext *bsf)
}
}
err = ff_cbs_write_extradata(&ctx->cbc, bsf->par_out, au);
err = ff_cbs_write_extradata(ctx->cbc, bsf->par_out, au);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to write extradata.\n");
goto fail;
......@@ -429,7 +429,7 @@ static int h264_metadata_init(AVBSFContext *bsf)
err = 0;
fail:
ff_cbs_fragment_uninit(&ctx->cbc, au);
ff_cbs_fragment_uninit(ctx->cbc, au);
return err;
}
......
......@@ -28,8 +28,8 @@
typedef struct H264RedundantPPSContext {
CodedBitstreamContext input;
CodedBitstreamContext output;
CodedBitstreamContext *input;
CodedBitstreamContext *output;
CodedBitstreamFragment access_unit;
......@@ -77,7 +77,7 @@ static int h264_redundant_pps_filter(AVBSFContext *bsf, AVPacket *out)
if (err < 0)
return err;
err = ff_cbs_read_packet(&ctx->input, au, in);
err = ff_cbs_read_packet(ctx->input, au, in);
if (err < 0)
return err;
......@@ -92,7 +92,7 @@ static int h264_redundant_pps_filter(AVBSFContext *bsf, AVPacket *out)
if (!au_has_sps) {
av_log(ctx, AV_LOG_VERBOSE, "Deleting redundant PPS "
"at %"PRId64".\n", in->pts);
ff_cbs_delete_unit(&ctx->input, au, i);
ff_cbs_delete_unit(ctx->input, au, i);
}
}
if (nal->type == H264_NAL_SLICE ||
......@@ -102,11 +102,11 @@ static int h264_redundant_pps_filter(AVBSFContext *bsf, AVPacket *out)
}
}
err = ff_cbs_write_packet(&ctx->output, out, au);
err = ff_cbs_write_packet(ctx->output, out, au);
if (err < 0)
return err;
ff_cbs_fragment_uninit(&ctx->output, au);
ff_cbs_fragment_uninit(ctx->output, au);
err = av_packet_copy_props(out, in);
if (err < 0)
......@@ -134,7 +134,7 @@ static int h264_redundant_pps_init(AVBSFContext *bsf)
ctx->global_pic_init_qp = 26;
if (bsf->par_in->extradata) {
err = ff_cbs_read_extradata(&ctx->input, au, bsf->par_in);
err = ff_cbs_read_extradata(ctx->input, au, bsf->par_in);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to read extradata.\n");
return err;
......@@ -145,13 +145,13 @@ static int h264_redundant_pps_init(AVBSFContext *bsf)
h264_redundant_pps_fixup_pps(ctx, au->units[i].content);
}
err = ff_cbs_write_extradata(&ctx->output, bsf->par_out, au);
err = ff_cbs_write_extradata(ctx->output, bsf->par_out, au);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to write extradata.\n");
return err;
}
ff_cbs_fragment_uninit(&ctx->output, au);
ff_cbs_fragment_uninit(ctx->output, au);
}
return 0;
......
......@@ -33,7 +33,7 @@ enum {
typedef struct H265MetadataContext {
const AVClass *class;
CodedBitstreamContext cbc;
CodedBitstreamContext *cbc;
CodedBitstreamFragment access_unit;
H265RawAUD aud_nal;
......@@ -241,7 +241,7 @@ static int h265_metadata_filter(AVBSFContext *bsf, AVPacket *out)
if (err < 0)
goto fail;
err = ff_cbs_read_packet(&ctx->cbc, au, in);
err = ff_cbs_read_packet(ctx->cbc, au, in);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n");
goto fail;
......@@ -256,7 +256,7 @@ static int h265_metadata_filter(AVBSFContext *bsf, AVPacket *out)
// If an AUD is present, it must be the first NAL unit.
if (au->units[0].type == HEVC_NAL_AUD) {
if (ctx->aud == REMOVE)
ff_cbs_delete_unit(&ctx->cbc, au, 0);
ff_cbs_delete_unit(ctx->cbc, au, 0);
} else {
if (ctx->aud == INSERT) {
H265RawAUD *aud = &ctx->aud_nal;
......@@ -288,7 +288,7 @@ static int h265_metadata_filter(AVBSFContext *bsf, AVPacket *out)
};
aud->pic_type = pic_type;
err = ff_cbs_insert_unit_content(&ctx->cbc, au,
err = ff_cbs_insert_unit_content(ctx->cbc, au,
0, HEVC_NAL_AUD, aud);
if (err) {
av_log(bsf, AV_LOG_ERROR, "Failed to insert AUD.\n");
......@@ -310,7 +310,7 @@ static int h265_metadata_filter(AVBSFContext *bsf, AVPacket *out)
}
}
err = ff_cbs_write_packet(&ctx->cbc, out, au);
err = ff_cbs_write_packet(ctx->cbc, out, au);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n");
goto fail;
......@@ -322,7 +322,7 @@ static int h265_metadata_filter(AVBSFContext *bsf, AVPacket *out)
err = 0;
fail:
ff_cbs_fragment_uninit(&ctx->cbc, au);
ff_cbs_fragment_uninit(ctx->cbc, au);
av_packet_free(&in);
......@@ -340,7 +340,7 @@ static int h265_metadata_init(AVBSFContext *bsf)
return err;
if (bsf->par_in->extradata) {
err = ff_cbs_read_extradata(&ctx->cbc, au, bsf->par_in);
err = ff_cbs_read_extradata(ctx->cbc, au, bsf->par_in);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to read extradata.\n");
goto fail;
......@@ -359,7 +359,7 @@ static int h265_metadata_init(AVBSFContext *bsf)
}
}
err = ff_cbs_write_extradata(&ctx->cbc, bsf->par_out, au);
err = ff_cbs_write_extradata(ctx->cbc, bsf->par_out, au);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to write extradata.\n");
goto fail;
......@@ -368,7 +368,7 @@ static int h265_metadata_init(AVBSFContext *bsf)
err = 0;
fail:
ff_cbs_fragment_uninit(&ctx->cbc, au);
ff_cbs_fragment_uninit(ctx->cbc, au);
return err;
}
......
......@@ -28,7 +28,7 @@
typedef struct MPEG2MetadataContext {
const AVClass *class;
CodedBitstreamContext cbc;
CodedBitstreamContext *cbc;
CodedBitstreamFragment fragment;
MPEG2RawExtensionData sequence_display_extension;
......@@ -165,7 +165,7 @@ static int mpeg2_metadata_update_fragment(AVBSFContext *bsf,
if (add_sde) {
int err;
err = ff_cbs_insert_unit_content(&ctx->cbc, frag, se_pos + 1,
err = ff_cbs_insert_unit_content(ctx->cbc, frag, se_pos + 1,
MPEG2_START_EXTENSION,
&ctx->sequence_display_extension);
if (err < 0) {
......@@ -189,7 +189,7 @@ static int mpeg2_metadata_filter(AVBSFContext *bsf, AVPacket *out)
if (err < 0)
goto fail;
err = ff_cbs_read_packet(&ctx->cbc, frag, in);
err = ff_cbs_read_packet(ctx->cbc, frag, in);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n");
goto fail;
......@@ -201,7 +201,7 @@ static int mpeg2_metadata_filter(AVBSFContext *bsf, AVPacket *out)
goto fail;
}
err = ff_cbs_write_packet(&ctx->cbc, out, frag);
err = ff_cbs_write_packet(ctx->cbc, out, frag);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n");
goto fail;
......@@ -215,7 +215,7 @@ static int mpeg2_metadata_filter(AVBSFContext *bsf, AVPacket *out)
err = 0;
fail:
ff_cbs_fragment_uninit(&ctx->cbc, frag);
ff_cbs_fragment_uninit(ctx->cbc, frag);
av_packet_free(&in);
......@@ -233,7 +233,7 @@ static int mpeg2_metadata_init(AVBSFContext *bsf)
return err;
if (bsf->par_in->extradata) {
err = ff_cbs_read_extradata(&ctx->cbc, frag, bsf->par_in);
err = ff_cbs_read_extradata(ctx->cbc, frag, bsf->par_in);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to read extradata.\n");
goto fail;
......@@ -245,7 +245,7 @@ static int mpeg2_metadata_init(AVBSFContext *bsf)
goto fail;
}
err = ff_cbs_write_extradata(&ctx->cbc, bsf->par_out, frag);
err = ff_cbs_write_extradata(ctx->cbc, bsf->par_out, frag);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to write extradata.\n");
goto fail;
......@@ -254,7 +254,7 @@ static int mpeg2_metadata_init(AVBSFContext *bsf)
err = 0;
fail:
ff_cbs_fragment_uninit(&ctx->cbc, frag);
ff_cbs_fragment_uninit(ctx->cbc, frag);
return err;
}
......
......@@ -27,7 +27,7 @@
typedef struct TraceHeadersContext {
CodedBitstreamContext cbc;
CodedBitstreamContext *cbc;
} TraceHeadersContext;
......@@ -40,21 +40,21 @@ static int trace_headers_init(AVBSFContext *bsf)
if (err < 0)
return err;
ctx->cbc.trace_enable = 1;
ctx->cbc.trace_level = AV_LOG_INFO;
ctx->cbc->trace_enable = 1;
ctx->cbc->trace_level = AV_LOG_INFO;
if (bsf->par_in->extradata) {
CodedBitstreamFragment ps;
av_log(bsf, AV_LOG_INFO, "Extradata\n");
err = ff_cbs_read_extradata(&ctx->cbc, &ps, bsf->par_in);
err = ff_cbs_read_extradata(ctx->cbc, &ps, bsf->par_in);
if (err < 0) {
av_log(bsf, AV_LOG_ERROR, "Failed to read extradata.\n");
return err;
}
ff_cbs_fragment_uninit(&ctx->cbc, &ps);
ff_cbs_fragment_uninit(ctx->cbc, &ps);
}
return 0;
......@@ -97,11 +97,11 @@ static int trace_headers(AVBSFContext *bsf, AVPacket *out)
av_log(bsf, AV_LOG_INFO, "Packet: %d bytes%s.\n", in->size, tmp);
err = ff_cbs_read_packet(&ctx->cbc, &au, in);
err = ff_cbs_read_packet(ctx->cbc, &au, in);
if (err < 0)
return err;
ff_cbs_fragment_uninit(&ctx->cbc, &au);
ff_cbs_fragment_uninit(ctx->cbc, &au);
av_packet_move_ref(out, in);
av_packet_free(&in);
......
......@@ -78,7 +78,7 @@ typedef struct VAAPIEncodeH264Context {
int cpb_delay;
int dpb_delay;
CodedBitstreamContext cbc;
CodedBitstreamContext *cbc;
CodedBitstreamFragment current_access_unit;
int aud_needed;
int sei_needed;
......@@ -104,7 +104,7 @@ static int vaapi_encode_h264_write_access_unit(AVCodecContext *avctx,
VAAPIEncodeH264Context *priv = ctx->priv_data;
int err;
err = ff_cbs_write_fragment_data(&priv->cbc, au);
err = ff_cbs_write_fragment_data(priv->cbc, au);
if (err < 0) {
av_log(avctx, AV_LOG_ERROR, "Failed to write packed header.\n");
return err;
......@@ -132,7 +132,7 @@ static int vaapi_encode_h264_add_nal(AVCodecContext *avctx,
H264RawNALUnitHeader *header = nal_unit;
int err;
err = ff_cbs_insert_unit_content(&priv->cbc, au, -1,
err = ff_cbs_insert_unit_content(priv->cbc, au, -1,
header->nal_unit_type, nal_unit);
if (err < 0) {
av_log(avctx, AV_LOG_ERROR, "Failed to add NAL unit: "
......@@ -168,7 +168,7 @@ static int vaapi_encode_h264_write_sequence_header(AVCodecContext *avctx,
err = vaapi_encode_h264_write_access_unit(avctx, data, data_len, au);
fail:
ff_cbs_fragment_uninit(&priv->cbc, au);
ff_cbs_fragment_uninit(priv->cbc, au);
return err;
}
......@@ -195,7 +195,7 @@ static int vaapi_encode_h264_write_slice_header(AVCodecContext *avctx,
err = vaapi_encode_h264_write_access_unit(avctx, data, data_len, au);
fail:
ff_cbs_fragment_uninit(&priv->cbc, au);
ff_cbs_fragment_uninit(priv->cbc, au);
return err;
}
......@@ -255,7 +255,7 @@ static int vaapi_encode_h264_write_extra_header(AVCodecContext *avctx,
if (err < 0)
goto fail;
ff_cbs_fragment_uninit(&priv->cbc, au);
ff_cbs_fragment_uninit(priv->cbc, au);
*type = VAEncPackedHeaderRawData;
return 0;
......@@ -277,7 +277,7 @@ static int vaapi_encode_h264_write_extra_header(AVCodecContext *avctx,
}
fail:
ff_cbs_fragment_uninit(&priv->cbc, au);
ff_cbs_fragment_uninit(priv->cbc, au);
return err;
}
......
......@@ -55,7 +55,7 @@ typedef struct VAAPIEncodeH265Context {
int slice_type;
int pic_type;
CodedBitstreamContext cbc;
CodedBitstreamContext *cbc;
CodedBitstreamFragment current_access_unit;
int aud_needed;
} VAAPIEncodeH265Context;
......@@ -76,7 +76,7 @@ static int vaapi_encode_h265_write_access_unit(AVCodecContext *avctx,
VAAPIEncodeH265Context *priv = ctx->priv_data;
int err;
err = ff_cbs_write_fragment_data(&priv->cbc, au);
err = ff_cbs_write_fragment_data(priv->cbc, au);
if (err < 0) {
av_log(avctx, AV_LOG_ERROR, "Failed to write packed header.\n");
return err;
......@@ -104,7 +104,7 @@ static int vaapi_encode_h265_add_nal(AVCodecContext *avctx,
H265RawNALUnitHeader *header = nal_unit;
int err;
err = ff_cbs_insert_unit_content(&priv->cbc, au, -1,
err = ff_cbs_insert_unit_content(priv->cbc, au, -1,
header->nal_unit_type, nal_unit);
if (err < 0) {
av_log(avctx, AV_LOG_ERROR, "Failed to add NAL unit: "
......@@ -144,7 +144,7 @@ static int vaapi_encode_h265_write_sequence_header(AVCodecContext *avctx,
err = vaapi_encode_h265_write_access_unit(avctx, data, data_len, au);
fail:
ff_cbs_fragment_uninit(&priv->cbc, au);
ff_cbs_fragment_uninit(priv->cbc, au);
return err;
}
......@@ -171,7 +171,7 @@ static int vaapi_encode_h265_write_slice_header(AVCodecContext *avctx,
err = vaapi_encode_h265_write_access_unit(avctx, data, data_len, au);
fail:
ff_cbs_fragment_uninit(&priv->cbc, au);
ff_cbs_fragment_uninit(priv->cbc, au);
return err;
}
......
......@@ -52,7 +52,7 @@ typedef struct VAAPIEncodeMPEG2Context {
unsigned int f_code_horizontal;
unsigned int f_code_vertical;
CodedBitstreamContext cbc;
CodedBitstreamContext *cbc;
CodedBitstreamFragment current_fragment;
} VAAPIEncodeMPEG2Context;
......@@ -65,7 +65,7 @@ static int vaapi_encode_mpeg2_write_fragment(AVCodecContext *avctx,
VAAPIEncodeMPEG2Context *priv = ctx->priv_data;
int err;
err = ff_cbs_write_fragment_data(&priv->cbc, frag);
err = ff_cbs_write_fragment_data(priv->cbc, frag);
if (err < 0) {
av_log(avctx, AV_LOG_ERROR, "Failed to write packed header.\n");
return err;
......@@ -92,7 +92,7 @@ static int vaapi_encode_mpeg2_add_header(AVCodecContext *avctx,
VAAPIEncodeMPEG2Context *priv = ctx->priv_data;
int err;
err = ff_cbs_insert_unit_content(&priv->cbc, frag, -1, type, header);
err = ff_cbs_insert_unit_content(priv->cbc, frag, -1, type, header);
if (err < 0) {
av_log(avctx, AV_LOG_ERROR, "Failed to add header: "
"type = %d.\n", type);
......@@ -132,7 +132,7 @@ static int vaapi_encode_mpeg2_write_sequence_header(AVCodecContext *avctx,
err = vaapi_encode_mpeg2_write_fragment(avctx, data, data_len, frag);
fail:
ff_cbs_fragment_uninit(&priv->cbc, frag);
ff_cbs_fragment_uninit(priv->cbc, frag);
return 0;
}
......@@ -157,7 +157,7 @@ static int vaapi_encode_mpeg2_write_picture_header(AVCodecContext *avctx,
err = vaapi_encode_mpeg2_write_fragment(avctx, data, data_len, frag);
fail:
ff_cbs_fragment_uninit(&priv->cbc, frag);
ff_cbs_fragment_uninit(priv->cbc, frag);
return 0;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment