diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-02-23 22:25:49 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-02-23 23:15:09 +0100 |
commit | 82d79289db03ddc85ea6d5c81a5151e1ad64b2b5 (patch) | |
tree | f882aff50823f797468f0547ef847bc328bd7584 | |
parent | 285485ac5f896cc450e0183daa41a8ee63d17076 (diff) | |
download | ffmpeg-82d79289db03ddc85ea6d5c81a5151e1ad64b2b5.tar.gz |
avformat: Allocate duration_error separately
This significantly reduces the memory needed per AVStream when the
array is not needed.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavformat/avformat.h | 2 | ||||
-rw-r--r-- | libavformat/avidec.c | 2 | ||||
-rw-r--r-- | libavformat/utils.c | 12 |
3 files changed, 13 insertions, 3 deletions
diff --git a/libavformat/avformat.h b/libavformat/avformat.h index c2bd849332..9b72279a89 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -754,7 +754,7 @@ typedef struct AVStream { int64_t last_dts; int64_t duration_gcd; int duration_count; - double duration_error[2][2][MAX_STD_TIMEBASES]; + double (*duration_error)[2][MAX_STD_TIMEBASES]; int64_t codec_info_duration; int64_t codec_info_duration_fields; int found_decoder; diff --git a/libavformat/avidec.c b/libavformat/avidec.c index 2f248b1b2f..00ac3de2af 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -484,6 +484,8 @@ static int avi_read_header(AVFormatContext *s) ast = s->streams[0]->priv_data; av_freep(&s->streams[0]->codec->extradata); av_freep(&s->streams[0]->codec); + if (s->streams[0]->info) + av_freep(&s->streams[0]->info->duration_error); av_freep(&s->streams[0]->info); av_freep(&s->streams[0]); s->nb_streams = 0; diff --git a/libavformat/utils.c b/libavformat/utils.c index a4218db8ed..9bd2d0c34b 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2891,9 +2891,12 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) double dts= (is_relative(pkt->dts) ? pkt->dts - RELATIVE_TS_BASE : pkt->dts) * av_q2d(st->time_base); int64_t duration= pkt->dts - last; + if (!st->info->duration_error) + st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2); + // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO) // av_log(NULL, AV_LOG_ERROR, "%f\n", dts); - for (i=0; i<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); i++) { + for (i=0; i<MAX_STD_TIMEBASES; i++) { int framerate= get_std_framerate(i); double sdts= dts*framerate/(1001*12); for(j=0; j<2; j++){ @@ -3026,7 +3029,7 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) int num = 0; double best_error= 0.01; - for (j=0; j<FF_ARRAY_ELEMS(st->info->duration_error[0][0]); j++) { + for (j=0; j<MAX_STD_TIMEBASES; j++) { int k; if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j)) @@ -3087,8 +3090,11 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) find_stream_info_err: for (i=0; i < ic->nb_streams; i++) { + st = ic->streams[i]; if (ic->streams[i]->codec) ic->streams[i]->codec->thread_count = 0; + if (st->info) + av_freep(&st->info->duration_error); av_freep(&ic->streams[i]->info); } if(ic->pb) @@ -3208,6 +3214,8 @@ void ff_free_stream(AVFormatContext *s, AVStream *st){ av_freep(&st->codec->subtitle_header); av_freep(&st->codec); av_freep(&st->priv_data); + if (st->info) + av_freep(&st->info->duration_error); av_freep(&st->info); av_freep(&st->probe_data.buf); av_freep(&s->streams[ --s->nb_streams ]); |