aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2014-08-28 10:13:25 +0000
committerAnton Khirnov <anton@khirnov.net>2014-11-06 09:02:25 +0100
commit7784f47762d59e859b4d0f74b3e021ad9368ee2c (patch)
tree41486f3a547794d187e4261a8716e4e7900aa38d
parent56dc46a1893251e74be1ad63e54fb38d754bb1fe (diff)
downloadffmpeg-7784f47762d59e859b4d0f74b3e021ad9368ee2c.tar.gz
lavf: stop using avpriv_flac_parse_streaminfo()
The only parameters needed by the demuxers are the sample rate and sample count, which can be trivially extracted manually, without resorting to an avpriv function.
-rw-r--r--libavcodec/Makefile4
-rw-r--r--libavformat/flacdec.c19
-rw-r--r--libavformat/oggparseflac.c11
3 files changed, 19 insertions, 15 deletions
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index b6a0c36359..627099798f 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -567,8 +567,6 @@ OBJS-$(CONFIG_VC1_VDPAU_HWACCEL) += vdpau_vc1.o
OBJS-$(CONFIG_ADTS_MUXER) += mpeg4audio.o
OBJS-$(CONFIG_CAF_DEMUXER) += mpeg4audio.o mpegaudiodata.o \
ac3tab.o
-OBJS-$(CONFIG_FLAC_DEMUXER) += flac.o flacdata.o \
- xiph.o
OBJS-$(CONFIG_FLAC_MUXER) += flac.o flacdata.o
OBJS-$(CONFIG_FLV_DEMUXER) += mpeg4audio.o
OBJS-$(CONFIG_GXF_DEMUXER) += mpeg12data.o
@@ -588,7 +586,7 @@ OBJS-$(CONFIG_MOV_MUXER) += mpeg4audio.o mpegaudiodata.o
OBJS-$(CONFIG_MPEGTS_MUXER) += mpeg4audio.o
OBJS-$(CONFIG_MPEGTS_DEMUXER) += mpeg4audio.o mpegaudiodata.o
OBJS-$(CONFIG_NUT_MUXER) += mpegaudiodata.o
-OBJS-$(CONFIG_OGG_DEMUXER) += xiph.o flac.o flacdata.o \
+OBJS-$(CONFIG_OGG_DEMUXER) += xiph.o \
mpeg12data.o \
dirac.o
OBJS-$(CONFIG_OGG_MUXER) += xiph.o flac.o flacdata.o
diff --git a/libavformat/flacdec.c b/libavformat/flacdec.c
index e044fd0b5a..8abdd9d5b4 100644
--- a/libavformat/flacdec.c
+++ b/libavformat/flacdec.c
@@ -27,7 +27,6 @@
#include "oggdec.h"
#include "vorbiscomment.h"
#include "replaygain.h"
-#include "libavcodec/bytestream.h"
static int flac_read_header(AVFormatContext *s)
{
@@ -76,7 +75,9 @@ static int flac_read_header(AVFormatContext *s)
}
if (metadata_type == FLAC_METADATA_TYPE_STREAMINFO) {
- FLACStreaminfo si;
+ uint32_t samplerate;
+ uint64_t samples;
+
/* STREAMINFO can only occur once */
if (found_streaminfo) {
av_freep(&buffer);
@@ -91,14 +92,16 @@ static int flac_read_header(AVFormatContext *s)
st->codec->extradata_size = metadata_size;
buffer = NULL;
- /* get codec params from STREAMINFO header */
- avpriv_flac_parse_streaminfo(st->codec, &si, st->codec->extradata);
+ /* get sample rate and sample count from STREAMINFO header;
+ * other parameters will be extracted by the parser */
+ samplerate = AV_RB24(st->codec->extradata + 10) >> 4;
+ samples = (AV_RB64(st->codec->extradata + 13) >> 24) & ((1ULL << 36) - 1);
/* set time base and duration */
- if (si.samplerate > 0) {
- avpriv_set_pts_info(st, 64, 1, si.samplerate);
- if (si.samples > 0)
- st->duration = si.samples;
+ if (samplerate > 0) {
+ avpriv_set_pts_info(st, 64, 1, samplerate);
+ if (samples > 0)
+ st->duration = samples;
}
} else if (metadata_type == FLAC_METADATA_TYPE_CUESHEET) {
uint8_t isrc[13];
diff --git a/libavformat/oggparseflac.c b/libavformat/oggparseflac.c
index f9c15f9a6d..57bba68079 100644
--- a/libavformat/oggparseflac.c
+++ b/libavformat/oggparseflac.c
@@ -34,7 +34,6 @@ flac_header (AVFormatContext * s, int idx)
struct ogg_stream *os = ogg->streams + idx;
AVStream *st = s->streams[idx];
GetBitContext gb;
- FLACStreaminfo si;
int mdt;
if (os->buf[os->pstart] == 0xff)
@@ -46,6 +45,8 @@ flac_header (AVFormatContext * s, int idx)
if (mdt == OGG_FLAC_METADATA_TYPE_STREAMINFO) {
uint8_t *streaminfo_start = os->buf + os->pstart + 5 + 4 + 4 + 4;
+ uint32_t samplerate;
+
skip_bits_long(&gb, 4*8); /* "FLAC" */
if(get_bits(&gb, 8) != 1) /* unsupported major version */
return -1;
@@ -56,8 +57,6 @@ flac_header (AVFormatContext * s, int idx)
if (get_bits_long(&gb, 32) != FLAC_STREAMINFO_SIZE)
return -1;
- avpriv_flac_parse_streaminfo(st->codec, &si, streaminfo_start);
-
st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
st->codec->codec_id = AV_CODEC_ID_FLAC;
st->need_parsing = AVSTREAM_PARSE_HEADERS;
@@ -67,7 +66,11 @@ flac_header (AVFormatContext * s, int idx)
memcpy(st->codec->extradata, streaminfo_start, FLAC_STREAMINFO_SIZE);
st->codec->extradata_size = FLAC_STREAMINFO_SIZE;
- avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
+ samplerate = AV_RB24(st->codec->extradata + 10) >> 4;
+ if (!samplerate)
+ return AVERROR_INVALIDDATA;
+
+ avpriv_set_pts_info(st, 64, 1, samplerate);
} else if (mdt == FLAC_METADATA_TYPE_VORBIS_COMMENT) {
ff_vorbis_stream_comment(s, st, os->buf + os->pstart + 4, os->psize - 4);
}