annotate oggparseflac.c @ 1960:c0289552590f libavformat

Change the vhook code to send real timestamps to the filters instead of the current time of day, which is useless, and which the filters could just as easily query for themselves. patch by Bobby Bingham, uhmmmm gmail com
author diego
date Thu, 29 Mar 2007 05:24:35 +0000
parents 0899bfe4105c
children d095666dedf3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
1 /*
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
2 * Copyright (C) 2005 Matthieu CASTET
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
3 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1077
diff changeset
4 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1077
diff changeset
5 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1077
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1077
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
10 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1077
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
14 * Lesser General Public License for more details.
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
15 *
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1077
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 885
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
19 */
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
20
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
21 #include <stdlib.h>
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
22 #include "avformat.h"
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
23 #include "bitstream.h"
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
24 #include "ogg2.h"
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
25
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
26 #define FLAC_STREAMINFO_SIZE 0x22
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
27
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
28 static int
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
29 flac_header (AVFormatContext * s, int idx)
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
30 {
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
31 ogg_t *ogg = s->priv_data;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
32 ogg_stream_t *os = ogg->streams + idx;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
33 AVStream *st = s->streams[idx];
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
34 GetBitContext gb;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
35 int mdt;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
36
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
37 if (os->buf[os->pstart] == 0xff)
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
38 return 0;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
39
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
40 init_get_bits(&gb, os->buf + os->pstart, os->psize*8);
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
41 get_bits(&gb, 1); /* metadata_last */
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
42 mdt = get_bits(&gb, 7);
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
43
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
44 if (mdt == 0x7f) {
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
45 skip_bits(&gb, 4*8); /* "FLAC" */
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
46 if(get_bits(&gb, 8) != 1) /* unsupported major version */
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
47 return -1;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
48 skip_bits(&gb, 8 + 16); /* minor version + header count */
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
49 skip_bits(&gb, 4*8); /* "fLaC" */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
50
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
51 /* METADATA_BLOCK_HEADER */
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
52 if (get_bits(&gb, 32) != FLAC_STREAMINFO_SIZE)
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
53 return -1;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
54
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
55 skip_bits(&gb, 16*2+24*2);
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
56
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 756
diff changeset
57 st->codec->sample_rate = get_bits_long(&gb, 20);
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 756
diff changeset
58 st->codec->channels = get_bits(&gb, 3) + 1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
59
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 756
diff changeset
60 st->codec->codec_type = CODEC_TYPE_AUDIO;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 756
diff changeset
61 st->codec->codec_id = CODEC_ID_FLAC;
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
62
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 756
diff changeset
63 st->codec->extradata =
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
64 av_malloc(FLAC_STREAMINFO_SIZE + FF_INPUT_BUFFER_PADDING_SIZE);
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 756
diff changeset
65 memcpy (st->codec->extradata, os->buf + os->pstart + 5 + 4 + 4 + 4,
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
66 FLAC_STREAMINFO_SIZE);
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 756
diff changeset
67 st->codec->extradata_size = FLAC_STREAMINFO_SIZE;
1077
91677ac6fb19 set stream time_base properly
mru
parents: 896
diff changeset
68
91677ac6fb19 set stream time_base properly
mru
parents: 896
diff changeset
69 st->time_base.num = 1;
91677ac6fb19 set stream time_base properly
mru
parents: 896
diff changeset
70 st->time_base.den = st->codec->sample_rate;
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
71 } else if (mdt == 4) {
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
72 vorbis_comment (s, os->buf + os->pstart + 4, os->psize - 4);
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
73 }
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
74
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
75 return 1;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
76 }
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
77
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
78 ogg_codec_t flac_codec = {
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
79 .magic = "\177FLAC",
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
80 .magicsize = 5,
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
81 .header = flac_header
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
82 };