[FFmpeg-cvslog] r17852 - in trunk: libavcodec/Makefile libavformat/Makefile libavformat/flacdec.c tests/seek.regression.ref

jbr subversion
Fri Mar 6 02:31:10 CET 2009


Author: jbr
Date: Fri Mar  6 02:31:10 2009
New Revision: 17852

Log:
flacdec: Parse the metadata header in the raw FLAC demuxer.

Modified:
   trunk/libavcodec/Makefile
   trunk/libavformat/Makefile
   trunk/libavformat/flacdec.c
   trunk/tests/seek.regression.ref

Modified: trunk/libavcodec/Makefile
==============================================================================
--- trunk/libavcodec/Makefile	Fri Mar  6 02:25:11 2009	(r17851)
+++ trunk/libavcodec/Makefile	Fri Mar  6 02:31:10 2009	(r17852)
@@ -344,6 +344,7 @@ OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER)     
 
 # libavformat dependencies
 OBJS-$(CONFIG_EAC3_DEMUXER)            += ac3_parser.o ac3tab.o aac_ac3_parser.o
+OBJS-$(CONFIG_FLAC_DEMUXER)            += flacdec.o
 OBJS-$(CONFIG_FLAC_MUXER)              += flacdec.o
 OBJS-$(CONFIG_GXF_DEMUXER)             += mpeg12data.o
 OBJS-$(CONFIG_MATROSKA_AUDIO_MUXER)    += xiph.o mpeg4audio.o flacdec.o

Modified: trunk/libavformat/Makefile
==============================================================================
--- trunk/libavformat/Makefile	Fri Mar  6 02:25:11 2009	(r17851)
+++ trunk/libavformat/Makefile	Fri Mar  6 02:31:10 2009	(r17852)
@@ -53,7 +53,7 @@ OBJS-$(CONFIG_EAC3_DEMUXER)             
 OBJS-$(CONFIG_EAC3_MUXER)                += raw.o
 OBJS-$(CONFIG_FFM_DEMUXER)               += ffmdec.o
 OBJS-$(CONFIG_FFM_MUXER)                 += ffmenc.o
-OBJS-$(CONFIG_FLAC_DEMUXER)              += flacdec.o raw.o id3v2.o
+OBJS-$(CONFIG_FLAC_DEMUXER)              += flacdec.o raw.o id3v2.o oggparsevorbis.o
 OBJS-$(CONFIG_FLAC_MUXER)                += flacenc.o
 OBJS-$(CONFIG_FLIC_DEMUXER)              += flic.o
 OBJS-$(CONFIG_FLV_DEMUXER)               += flvdec.o

Modified: trunk/libavformat/flacdec.c
==============================================================================
--- trunk/libavformat/flacdec.c	Fri Mar  6 02:25:11 2009	(r17851)
+++ trunk/libavformat/flacdec.c	Fri Mar  6 02:31:10 2009	(r17852)
@@ -19,15 +19,19 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavcodec/flac.h"
 #include "avformat.h"
 #include "raw.h"
 #include "id3v2.h"
+#include "oggdec.h"
 
 static int flac_read_header(AVFormatContext *s,
                              AVFormatParameters *ap)
 {
     uint8_t buf[ID3v2_HEADER_SIZE];
-    int ret;
+    int ret, metadata_last=0, metadata_type, metadata_size, found_streaminfo=0;
+    uint8_t header[4];
+    uint8_t *buffer=NULL;
     AVStream *st = av_new_stream(s, 0);
     if (!st)
         return AVERROR(ENOMEM);
@@ -44,6 +48,77 @@ static int flac_read_header(AVFormatCont
     } else {
         url_fseek(s->pb, 0, SEEK_SET);
     }
+
+    /* if fLaC marker is not found, assume there is no header */
+    if (get_le32(s->pb) != MKTAG('f','L','a','C'))
+        return 0;
+
+    /* process metadata blocks */
+    while (!url_feof(s->pb) && !metadata_last) {
+        get_buffer(s->pb, header, 4);
+        ff_flac_parse_block_header(header, &metadata_last, &metadata_type,
+                                   &metadata_size);
+        switch (metadata_type) {
+        /* allocate and read metadata block for supported types */
+        case FLAC_METADATA_TYPE_STREAMINFO:
+        case FLAC_METADATA_TYPE_VORBIS_COMMENT:
+            buffer = av_mallocz(metadata_size + FF_INPUT_BUFFER_PADDING_SIZE);
+            if (!buffer) {
+                return AVERROR_NOMEM;
+            }
+            if (get_buffer(s->pb, buffer, metadata_size) != metadata_size) {
+                av_freep(&buffer);
+                return AVERROR_IO;
+            }
+            break;
+        /* skip metadata block for unsupported types */
+        default:
+            ret = url_fseek(s->pb, metadata_size, SEEK_CUR);
+            if (ret < 0)
+                return ret;
+        }
+
+        if (metadata_type == FLAC_METADATA_TYPE_STREAMINFO) {
+            FLACStreaminfo si;
+            /* STREAMINFO can only occur once */
+            if (found_streaminfo) {
+                av_freep(&buffer);
+                return AVERROR_INVALIDDATA;
+            }
+            if (metadata_size != FLAC_STREAMINFO_SIZE) {
+                av_freep(&buffer);
+                return AVERROR_INVALIDDATA;
+            }
+            found_streaminfo = 1;
+            st->codec->extradata      = buffer;
+            st->codec->extradata_size = metadata_size;
+            buffer = NULL;
+
+            /* get codec params from STREAMINFO header */
+            ff_flac_parse_streaminfo(st->codec, &si, st->codec->extradata);
+
+            /* set time base and duration */
+            if (si.samplerate > 0) {
+                av_set_pts_info(st, 64, 1, si.samplerate);
+                if (si.samples > 0)
+                    st->duration = si.samples;
+            }
+        } else {
+            /* STREAMINFO must be the first block */
+            if (!found_streaminfo) {
+                av_freep(&buffer);
+                return AVERROR_INVALIDDATA;
+            }
+            /* process supported blocks other than STREAMINFO */
+            if (metadata_type == FLAC_METADATA_TYPE_VORBIS_COMMENT) {
+                if (vorbis_comment(s, buffer, metadata_size)) {
+                    av_log(s, AV_LOG_WARNING, "error parsing VorbisComment metadata\n");
+                }
+            }
+            av_freep(&buffer);
+        }
+    }
+
     return 0;
 }
 

Modified: trunk/tests/seek.regression.ref
==============================================================================
--- trunk/tests/seek.regression.ref	Fri Mar  6 02:25:11 2009	(r17851)
+++ trunk/tests/seek.regression.ref	Fri Mar  6 02:31:10 2009	(r17852)
@@ -585,31 +585,31 @@ ret: 0 st: 0 dts:0.480000 pts:0.480000 p
 ret:-1 st:-1 ts:-0.645825 flags:1
 ----------------
 tests/data/a-flac.flac
-ret: 0 st: 0 dts:-102481911520608.625000 pts:-102481911520608.625000 pos:0 size:1024 flags:1
+ret: 0 st: 0 dts:-209146758205323.718750 pts:-209146758205323.718750 pos:42 size:1024 flags:1
 ret:-1 st:-1 ts:-1.000000 flags:0
 ret:-1 st:-1 ts:1.894167 flags:1
-ret:-1 st: 0 ts:0.788333 flags:0
-ret:-1 st: 0 ts:-0.317500 flags:1
+ret:-1 st: 0 ts:0.788345 flags:0
+ret:-1 st: 0 ts:-0.317506 flags:1
 ret:-1 st:-1 ts:2.576668 flags:0
 ret:-1 st:-1 ts:1.470835 flags:1
-ret:-1 st: 0 ts:0.365000 flags:0
-ret:-1 st: 0 ts:-0.740833 flags:1
+ret:-1 st: 0 ts:0.365011 flags:0
+ret:-1 st: 0 ts:-0.740839 flags:1
 ret:-1 st:-1 ts:2.153336 flags:0
 ret:-1 st:-1 ts:1.047503 flags:1
-ret:-1 st: 0 ts:-0.058333 flags:0
-ret:-1 st: 0 ts:2.835833 flags:1
+ret:-1 st: 0 ts:-0.058322 flags:0
+ret:-1 st: 0 ts:2.835828 flags:1
 ret:-1 st:-1 ts:1.730004 flags:0
 ret:-1 st:-1 ts:0.624171 flags:1
-ret:-1 st: 0 ts:-0.481667 flags:0
-ret:-1 st: 0 ts:2.412500 flags:1
+ret:-1 st: 0 ts:-0.481655 flags:0
+ret:-1 st: 0 ts:2.412494 flags:1
 ret:-1 st:-1 ts:1.306672 flags:0
 ret:-1 st:-1 ts:0.200839 flags:1
 ret:-1 st: 0 ts:-0.904989 flags:0
-ret:-1 st: 0 ts:1.989178 flags:1
+ret:-1 st: 0 ts:1.989184 flags:1
 ret:-1 st:-1 ts:0.883340 flags:0
 ret:-1 st:-1 ts:-0.222493 flags:1
 ret:-1 st: 0 ts:2.671678 flags:0
-ret:-1 st: 0 ts:1.565844 flags:1
+ret:-1 st: 0 ts:1.565850 flags:1
 ret:-1 st:-1 ts:0.460008 flags:0
 ret:-1 st:-1 ts:-0.645825 flags:1
 ----------------




More information about the ffmpeg-cvslog mailing list