- memset(out + total_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
- av_free(avctx->extradata);
- avctx->extradata = out;
- avctx->extradata_size = total_size;
- ctx->first_idr = 1;
- ctx->extradata_parsed = 1;
+static int h264_mp4toannexb_init(AVBSFContext *ctx)
+{
+ H264BSFContext *s = ctx->priv_data;
+ int extra_size = ctx->par_in->extradata_size;
+ int ret;
+
+ /* retrieve sps and pps NAL units from extradata */
+ if (!extra_size ||
+ (extra_size >= 3 && AV_RB24(ctx->par_in->extradata) == 1) ||
+ (extra_size >= 4 && AV_RB32(ctx->par_in->extradata) == 1)) {
+ av_log(ctx, AV_LOG_VERBOSE,
+ "The input looks like it is Annex B already\n");
+ } else if (extra_size >= 6) {
+ ret = h264_extradata_to_annexb(ctx, AV_INPUT_BUFFER_PADDING_SIZE);
+ if (ret < 0)
+ return ret;
+
+ s->length_size = ret;
+ s->first_idr = 1;
+ s->extradata_parsed = 1;
+ } else {
+ av_log(ctx, AV_LOG_ERROR, "Invalid extradata size: %d\n", extra_size);
+ return AVERROR_INVALIDDATA;