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
---

The original commit message also says that use of AVCodecContext.frame_size is
discouraged, but the documentation on the field says, "may be set by some
decoders to indicate constant frame size". Should the documentation around this
field be updated, or was that just a mistake?

 libavformat/internal.h |  2 ++
 libavformat/utils.c    | 23 ++++++++++++++++++++++-
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/libavformat/internal.h b/libavformat/internal.h
index 9921ce1..2824436 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 4cc246d..973ab94 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;
--
2.1.0.rc1

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to