From cc2d748b73c0147c11089d63e4ff9836070a09a8 Mon Sep 17 00:00:00 2001
From: Uoti Urpala <uau@glyph.nonexistent.invalid>
Date: Thu, 9 Dec 2010 02:50:17 +0200
Subject: [PATCH] audio: FLAC: support new libavcodec parser, use lavf to demux

Parse FLAC data with new libavcodec parser if needed. Use libavformat
demuxer for raw FLAC files by default.
---
 libmpdemux/demux_audio.c | 1 +
 libmpdemux/demux_lavf.c  | 6 +++++-
 libmpdemux/demuxer.c     | 3 +++
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/libmpdemux/demux_audio.c b/libmpdemux/demux_audio.c
index f5c476d250..7f0bb5e55f 100644
--- a/libmpdemux/demux_audio.c
+++ b/libmpdemux/demux_audio.c
@@ -491,6 +491,7 @@ static int demux_audio_open(demuxer_t* demuxer) {
 	    }
 	    if (sh_audio->i_bps < 1) // guess value to prevent crash
 	      sh_audio->i_bps = 64 * 1024;
+            sh_audio->needs_parsing = 1;
 //	    get_flac_metadata (demuxer);
 	    break;
   }
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c
index 09999d80b5..6d3e68d9c0 100644
--- a/libmpdemux/demux_lavf.c
+++ b/libmpdemux/demux_lavf.c
@@ -234,8 +234,12 @@ static const char * const preferred_internal[] = {
     /* lavf Matroska demuxer doesn't support ordered chapters and fails
      * for more files */
     "matroska",
-    /* seeking won't work in lavf FLAC demuxer until a parser is committed */
+#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(52, 99, 0)
+    /* Seeking doesn't work with lavf FLAC demuxer in FFmpeg versions
+     * without a FLAC parser. In principle this could use a runtime check to
+     * switch if a shared library is updated. */
     "flac",
+#endif
     /* lavf gives neither pts nor dts for some video frames in .rm */
     "rm",
     NULL
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index 51343f1595..af7f40c004 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -464,6 +464,9 @@ static void allocate_parser(AVCodecContext **avctx, AVCodecParserContext **parse
     case 0x86:
         codec_id = CODEC_ID_DTS;
         break;
+    case MKTAG('f', 'L', 'a', 'C'):
+        codec_id = CODEC_ID_FLAC;
+        break;
     case MKTAG('M', 'L', 'P', ' '):
         codec_id = CODEC_ID_MLP;
         break;