summaryrefslogtreecommitdiff
path: root/src/libffmpeg/libavcodec
diff options
context:
space:
mode:
authorMike Melanson <mike@multimedia.cx>2004-06-10 04:46:18 +0000
committerMike Melanson <mike@multimedia.cx>2004-06-10 04:46:18 +0000
commit7d61144f3cc52f58978c165ae023fb610aaab9e1 (patch)
treeca1c98013fc12236dd99cbcba7949b72c3dea193 /src/libffmpeg/libavcodec
parent5c21abe208938b0dbff4a4fea60b715bb58b9c36 (diff)
downloadxine-lib-7d61144f3cc52f58978c165ae023fb610aaab9e1.tar.gz
xine-lib-7d61144f3cc52f58978c165ae023fb610aaab9e1.tar.bz2
hook up ffmpeg's FLAC decoder
CVS patchset: 6664 CVS date: 2004/06/10 04:46:18
Diffstat (limited to 'src/libffmpeg/libavcodec')
-rw-r--r--src/libffmpeg/libavcodec/Makefile.am1
-rw-r--r--src/libffmpeg/libavcodec/flac.c24
2 files changed, 23 insertions, 2 deletions
diff --git a/src/libffmpeg/libavcodec/Makefile.am b/src/libffmpeg/libavcodec/Makefile.am
index 78752e5fe..f097127cb 100644
--- a/src/libffmpeg/libavcodec/Makefile.am
+++ b/src/libffmpeg/libavcodec/Makefile.am
@@ -29,6 +29,7 @@ libavcodec_la_SOURCES = \
error_resilience.c \
eval.c \
faandct.c \
+ flac.c \
flicvideo.c \
fft.c \
golomb.c \
diff --git a/src/libffmpeg/libavcodec/flac.c b/src/libffmpeg/libavcodec/flac.c
index 7e92fa59e..382082627 100644
--- a/src/libffmpeg/libavcodec/flac.c
+++ b/src/libffmpeg/libavcodec/flac.c
@@ -21,6 +21,14 @@
* @file flac.c
* FLAC (Free Lossless Audio Codec) decoder
* @author Alex Beregszaszi
+ *
+ * For more information on the FLAC format, visit:
+ * http://flac.sourceforge.net/
+ *
+ * This decoder can be used in 1 of 2 ways: Either raw FLAC data can be fed
+ * through, starting from the initial 'fLaC' signature; or by passing the
+ * 34-byte streaminfo structure through avctx->extradata[_size] followed
+ * by data starting with the 0xFFF8 marker.
*/
#include <limits.h>
@@ -33,6 +41,7 @@
#define MAX_CHANNELS 8
#define MAX_BLOCKSIZE 65535
+#define FLAC_STREAMINFO_SIZE 34
enum decorrelation_type {
INDEPENDENT,
@@ -144,8 +153,21 @@ static int get_crc8(const uint8_t *buf, int count){
return crc;
}
+static void metadata_streaminfo(FLACContext *s);
+static void dump_headers(FLACContext *s);
+
static int flac_decode_init(AVCodecContext * avctx)
{
+ FLACContext *s = avctx->priv_data;
+ s->avctx = avctx;
+
+ /* initialize based on the demuxer-supplied streamdata header */
+ if (avctx->extradata_size == FLAC_STREAMINFO_SIZE) {
+ init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size*8);
+ metadata_streaminfo(s);
+ dump_headers(s);
+ }
+
return 0;
}
@@ -546,8 +568,6 @@ static int flac_decode_frame(AVCodecContext *avctx,
int tmp = 0, i, j = 0, input_buf_size;
int16_t *samples = data, *left, *right;
- s->avctx = avctx;
-
if(s->max_framesize == 0){
s->max_framesize= 8192; // should hopefully be enough for the first header
s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);