diff options
author | Alex Converse <alex.converse@gmail.com> | 2012-06-04 16:07:48 -0700 |
---|---|---|
committer | Alex Converse <alex.converse@gmail.com> | 2012-06-05 09:51:51 -0700 |
commit | 62bebf6edbbccab013062f74a3093ed3ddbe04d8 (patch) | |
tree | 2c2745ed6c5de85e61e810905dee1d987843569b | |
parent | c6061443f766b31b6601c36a832760ebd917c8ad (diff) | |
download | ffmpeg-62bebf6edbbccab013062f74a3093ed3ddbe04d8.tar.gz |
avformat: Factorize codec probing.
-rw-r--r-- | libavformat/utils.c | 45 |
1 files changed, 25 insertions, 20 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c index 438752174e..60ba984066 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -612,6 +612,30 @@ fail: /*******************************************************/ +static void probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt) +{ + if(st->codec->codec_id == CODEC_ID_PROBE){ + AVProbeData *pd = &st->probe_data; + av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index); + --st->probe_packets; + + pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE); + memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size); + pd->buf_size += pkt->size; + memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE); + + if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){ + //FIXME we do not reduce score to 0 for the case of running out of buffer space in bytes + set_codec_from_probe_data(s, st, pd, st->probe_packets > 0 ? AVPROBE_SCORE_MAX/4 : 0); + if(st->codec->codec_id != CODEC_ID_PROBE){ + pd->buf_size=0; + av_freep(&pd->buf); + av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index); + } + } + } +} + int ff_read_packet(AVFormatContext *s, AVPacket *pkt) { int ret, i; @@ -675,26 +699,7 @@ int ff_read_packet(AVFormatContext *s, AVPacket *pkt) add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end); s->raw_packet_buffer_remaining_size -= pkt->size; - if(st->codec->codec_id == CODEC_ID_PROBE){ - AVProbeData *pd = &st->probe_data; - av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index); - --st->probe_packets; - - pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE); - memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size); - pd->buf_size += pkt->size; - memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE); - - if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){ - //FIXME we do not reduce score to 0 for the case of running out of buffer space in bytes - set_codec_from_probe_data(s, st, pd, st->probe_packets > 0 ? AVPROBE_SCORE_MAX/4 : 0); - if(st->codec->codec_id != CODEC_ID_PROBE){ - pd->buf_size=0; - av_freep(&pd->buf); - av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index); - } - } - } + probe_codec(s, st, pkt); } } |