Revert "lavf: eliminate ff_get_audio_frame_size()"
authorAndrew Stone <andrew@clovar.com>
Mon, 18 Aug 2014 21:28:23 +0000 (17:28 -0400)
committerAnton Khirnov <anton@khirnov.net>
Fri, 22 Aug 2014 11:22:38 +0000 (11:22 +0000)
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>
libavformat/internal.h
libavformat/utils.c

index 9921ce11e05643546e1ddcb4a0766b1ac9428778..28244362862dcd1b91af6c8665c3bca272800871 100644 (file)
@@ -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);
index 4cc246d9eec1016ab77d2aa6f0fe75aef23378a3..973ab94d6f651b8208333d45816c9d160d32b17c 100644 (file)
@@ -453,6 +453,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.
  */
@@ -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;