Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavformat/internal.h9
-rw-r--r--libavformat/utils.c123
2 files changed, 13 insertions, 119 deletions
diff --git a/libavformat/internal.h b/libavformat/internal.h
index c856945ce9..63a1724cfa 100644
--- a/libavformat/internal.h
+++ b/libavformat/internal.h
@@ -178,15 +178,6 @@ struct AVStreamInternal {
enum AVCodecID orig_codec_id;
- /* the context for extracting extradata in find_stream_info()
- * inited=1/bsf=NULL signals that extracting is not possible (codec not
- * supported) */
- struct {
- AVBSFContext *bsf;
- AVPacket *pkt;
- int inited;
- } extract_extradata;
-
/**
* Whether the internal avctx needs to be updated from codecpar (after a late change to codecpar)
*/
diff --git a/libavformat/utils.c b/libavformat/utils.c
index e851251d66..a059046a2c 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -3370,104 +3370,6 @@ void ff_rfps_calculate(AVFormatContext *ic)
}
}
-static int extract_extradata_init(AVStream *st)
-{
- AVStreamInternal *i = st->internal;
- const AVBitStreamFilter *f;
- int ret;
-
- f = av_bsf_get_by_name("extract_extradata");
- if (!f)
- goto finish;
-
- i->extract_extradata.pkt = av_packet_alloc();
- if (!i->extract_extradata.pkt)
- return AVERROR(ENOMEM);
-
- ret = av_bsf_alloc(f, &i->extract_extradata.bsf);
- if (ret < 0)
- goto fail;
-
- ret = avcodec_parameters_copy(i->extract_extradata.bsf->par_in,
- st->codecpar);
- if (ret < 0)
- goto fail;
-
- i->extract_extradata.bsf->time_base_in = st->time_base;
-
- /* if init fails here, we assume extracting extradata is just not
- * supported for this codec, so we return success */
- ret = av_bsf_init(i->extract_extradata.bsf);
- if (ret < 0) {
- av_bsf_free(&i->extract_extradata.bsf);
- ret = 0;
- }
-
-finish:
- i->extract_extradata.inited = 1;
-
- return 0;
-fail:
- av_bsf_free(&i->extract_extradata.bsf);
- av_packet_free(&i->extract_extradata.pkt);
- return ret;
-}
-
-static int extract_extradata(AVStream *st, AVPacket *pkt)
-{
- AVStreamInternal *i = st->internal;
- AVPacket *pkt_ref;
- int ret;
-
- if (!i->extract_extradata.inited) {
- ret = extract_extradata_init(st);
- if (ret < 0)
- return ret;
- }
-
- if (i->extract_extradata.inited && !i->extract_extradata.bsf)
- return 0;
-
- pkt_ref = i->extract_extradata.pkt;
- ret = av_packet_ref(pkt_ref, pkt);
- if (ret < 0)
- return ret;
-
- ret = av_bsf_send_packet(i->extract_extradata.bsf, pkt_ref);
- if (ret < 0) {
- av_packet_unref(pkt_ref);
- return ret;
- }
-
- while (ret >= 0 && !i->avctx->extradata) {
- int extradata_size;
- uint8_t *extradata;
-
- ret = av_bsf_receive_packet(i->extract_extradata.bsf, pkt_ref);
- if (ret < 0) {
- if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
- return ret;
- continue;
- }
-
- extradata = av_packet_get_side_data(pkt_ref, AV_PKT_DATA_NEW_EXTRADATA,
- &extradata_size);
-
- if (extradata) {
- i->avctx->extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!i->avctx->extradata) {
- av_packet_unref(pkt_ref);
- return AVERROR(ENOMEM);
- }
- memcpy(i->avctx->extradata, extradata, extradata_size);
- i->avctx->extradata_size = extradata_size;
- }
- av_packet_unref(pkt_ref);
- }
-
- return 0;
-}
-
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
{
int i, count = 0, ret = 0, j;
@@ -3627,10 +3529,8 @@ FF_ENABLE_DEPRECATION_WARNINGS
if (count < fps_analyze_framecount)
break;
}
- if (!st->codecpar->extradata &&
- !st->internal->avctx->extradata &&
- (!st->internal->extract_extradata.inited ||
- st->internal->extract_extradata.bsf))
+ if (st->parser && st->parser->parser->split &&
+ !st->internal->avctx->extradata)
break;
if (st->first_dts == AV_NOPTS_VALUE &&
!(ic->iformat->flags & AVFMT_NOTIMESTAMPS) &&
@@ -3780,10 +3680,17 @@ FF_ENABLE_DEPRECATION_WARNINGS
if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
ff_rfps_add_frame(ic, st, pkt->dts);
#endif
- if (!st->internal->avctx->extradata) {
- ret = extract_extradata(st, pkt);
- if (ret < 0)
- goto find_stream_info_err;
+ if (st->parser && st->parser->parser->split && !avctx->extradata) {
+ int i = st->parser->parser->split(avctx, pkt->data, pkt->size);
+ if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
+ avctx->extradata_size = i;
+ avctx->extradata = av_mallocz(avctx->extradata_size +
+ AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!avctx->extradata)
+ return AVERROR(ENOMEM);
+ memcpy(avctx->extradata, pkt->data,
+ avctx->extradata_size);
+ }
}
/* If still no information, we try to open the codec and to
@@ -4043,8 +3950,6 @@ find_stream_info_err:
if (st->info)
av_freep(&st->info->duration_error);
av_freep(&ic->streams[i]->info);
- av_bsf_free(&ic->streams[i]->internal->extract_extradata.bsf);
- av_packet_free(&ic->streams[i]->internal->extract_extradata.pkt);
}
if (ic->pb)
av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
@@ -4232,8 +4137,6 @@ static void free_stream(AVStream **pst)
av_bsf_free(&st->internal->bsfcs[i]);
av_freep(&st->internal->bsfcs);
}
- av_bsf_free(&st->internal->extract_extradata.bsf);
- av_packet_free(&st->internal->extract_extradata.pkt);
}
av_freep(&st->internal);