aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Stone <andrew@clovar.com>2014-08-18 17:28:23 -0400
committerAnton Khirnov <anton@khirnov.net>2014-08-22 11:22:38 +0000
commit04361427e65a687469a3bb0859971292d2dc11e4 (patch)
tree2486b2cc0d2139691f19c55b9f17a15b12aad548
parent67a7695c142561fe60f21adffe89c133385d37c9 (diff)
downloadffmpeg-04361427e65a687469a3bb0859971292d2dc11e4.tar.gz
Revert "lavf: eliminate ff_get_audio_frame_size()"
This reverts commit 30e50c50274f88f0f5ae829f401cd3c7f5266719. The original commit broke the ability to stream AAC over HTTP/Icecast. It looks like avformat_find_stream_info() gets stuck in an infinite loop, never hitting AVFormatContext.max_analyze_duration since duration is never set for any of the packets. Example stream: http://listen.classicrocklounge.com:8000/aac64 Signed-off-by: Anton Khirnov <anton@khirnov.net>
-rw-r--r--libavformat/internal.h2
-rw-r--r--libavformat/utils.c23
2 files changed, 24 insertions, 1 deletions
diff --git a/libavformat/internal.h b/libavformat/internal.h
index 9921ce11e0..2824436286 100644
--- a/libavformat/internal.h
+++ b/libavformat/internal.h
@@ -326,6 +326,8 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
void ff_compute_frame_duration(int *pnum, int *pden, AVStream *st,
AVCodecParserContext *pc, AVPacket *pkt);
+int ff_get_audio_frame_size(AVCodecContext *enc, int size, int mux);
+
unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id);
enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag);
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 4cc246d9ee..973ab94d6f 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -454,6 +454,27 @@ int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
/**********************************************************/
/**
+ * Get the number of samples of an audio frame. Return -1 on error.
+ */
+int ff_get_audio_frame_size(AVCodecContext *enc, int size, int mux)
+{
+ int frame_size;
+
+ /* give frame_size priority if demuxing */
+ if (!mux && enc->frame_size > 1)
+ return enc->frame_size;
+
+ if ((frame_size = av_get_audio_frame_duration(enc, size)) > 0)
+ return frame_size;
+
+ /* Fall back on using frame_size if muxing. */
+ if (enc->frame_size > 1)
+ return enc->frame_size;
+
+ return -1;
+}
+
+/**
* Return the frame duration in seconds. Return 0 if not available.
*/
void ff_compute_frame_duration(int *pnum, int *pden, AVStream *st,
@@ -488,7 +509,7 @@ void ff_compute_frame_duration(int *pnum, int *pden, AVStream *st,
}
break;
case AVMEDIA_TYPE_AUDIO:
- frame_size = av_get_audio_frame_duration(st->codec, pkt->size);
+ frame_size = ff_get_audio_frame_size(st->codec, pkt->size, 0);
if (frame_size <= 0 || st->codec->sample_rate <= 0)
break;
*pnum = frame_size;