From 527c2e64295671bfcd9c86ca2cfd75e0f4d79f73 Mon Sep 17 00:00:00 2001
From: Howard Chu <hyc@highlandsun.com>
Date: Thu, 1 Apr 2010 08:02:20 +0000
Subject: [PATCH] Fix flvdec start-of-frame. Patch by Howard Chu hyc
 highlandsun com

Originally committed as revision 22757 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 libavformat/flvdec.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
index 3481885e0dc..437ec9b785c 100644
--- a/libavformat/flvdec.c
+++ b/libavformat/flvdec.c
@@ -270,6 +270,7 @@ static int flv_read_header(AVFormatContext *s,
 
     offset = get_be32(s->pb);
     url_fseek(s->pb, offset, SEEK_SET);
+    url_fskip(s->pb, 4);
 
     s->start_time = 0;
 
@@ -295,9 +296,8 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
     int64_t dts, pts = AV_NOPTS_VALUE;
     AVStream *st = NULL;
 
- for(;;){
+ for(;;url_fskip(s->pb, 4)){ /* pkt size is repeated at end. skip it */
     pos = url_ftell(s->pb);
-    url_fskip(s->pb, 4); /* size of previous packet */
     type = get_byte(s->pb);
     size = get_be24(s->pb);
     dts = get_be24(s->pb);
@@ -417,13 +417,16 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
                         st->codec->channels, st->codec->sample_rate);
             }
 
-            return AVERROR(EAGAIN);
+            ret = AVERROR(EAGAIN);
+            goto leave;
         }
     }
 
     /* skip empty data packets */
-    if (!size)
-        return AVERROR(EAGAIN);
+    if (!size) {
+        ret = AVERROR(EAGAIN);
+        goto leave;
+    }
 
     ret= av_get_packet(s->pb, pkt, size);
     if (ret < 0) {
@@ -439,6 +442,8 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
     if (is_audio || ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY))
         pkt->flags |= AV_PKT_FLAG_KEY;
 
+leave:
+    url_fskip(s->pb, 4);
     return ret;
 }
 
-- 
GitLab