annotate oggparseflac.c @ 5966:9a86b49201bb libavformat

Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext In order to sync RTP streams that get their initial RTCP timestamp at different times, propagate the NTP timestamp of the first RTCP packet to all other streams. This makes the timestamps of returned packets start at (near) zero instead of at any random offset.
author mstorsjo
date Tue, 20 Apr 2010 07:34:28 +0000
parents 536e5527c1e0
children
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>
4872
304a0ea063f0 Rename bitstream.h to get_bits.h.
stefano
parents: 4286
diff changeset
22 #include "libavcodec/get_bits.h"
4286
2af9d6b4db07 use function and definitions from libavcodec/flac.h in oggparseflac.c
jbr
parents: 4105
diff changeset
23 #include "libavcodec/flac.h"
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
24 #include "avformat.h"
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents: 2378
diff changeset
25 #include "oggdec.h"
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
26
4286
2af9d6b4db07 use function and definitions from libavcodec/flac.h in oggparseflac.c
jbr
parents: 4105
diff changeset
27 #define OGG_FLAC_METADATA_TYPE_STREAMINFO 0x7F
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
28
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
29 static int
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
30 flac_header (AVFormatContext * s, int idx)
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
31 {
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3770
diff changeset
32 struct ogg *ogg = s->priv_data;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3770
diff changeset
33 struct ogg_stream *os = ogg->streams + idx;
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
34 AVStream *st = s->streams[idx];
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
35 GetBitContext gb;
4286
2af9d6b4db07 use function and definitions from libavcodec/flac.h in oggparseflac.c
jbr
parents: 4105
diff changeset
36 FLACStreaminfo si;
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
37 int mdt;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
38
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
39 if (os->buf[os->pstart] == 0xff)
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
40 return 0;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
41
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
42 init_get_bits(&gb, os->buf + os->pstart, os->psize*8);
4105
8f778b7c07d0 oggflac: fix bitstream reader usage
mru
parents: 4016
diff changeset
43 skip_bits1(&gb); /* metadata_last */
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
44 mdt = get_bits(&gb, 7);
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
45
4286
2af9d6b4db07 use function and definitions from libavcodec/flac.h in oggparseflac.c
jbr
parents: 4105
diff changeset
46 if (mdt == OGG_FLAC_METADATA_TYPE_STREAMINFO) {
2af9d6b4db07 use function and definitions from libavcodec/flac.h in oggparseflac.c
jbr
parents: 4105
diff changeset
47 uint8_t *streaminfo_start = os->buf + os->pstart + 5 + 4 + 4 + 4;
4105
8f778b7c07d0 oggflac: fix bitstream reader usage
mru
parents: 4016
diff changeset
48 skip_bits_long(&gb, 4*8); /* "FLAC" */
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
49 if(get_bits(&gb, 8) != 1) /* unsupported major version */
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
50 return -1;
4105
8f778b7c07d0 oggflac: fix bitstream reader usage
mru
parents: 4016
diff changeset
51 skip_bits_long(&gb, 8 + 16); /* minor version + header count */
8f778b7c07d0 oggflac: fix bitstream reader usage
mru
parents: 4016
diff changeset
52 skip_bits_long(&gb, 4*8); /* "fLaC" */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
53
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
54 /* METADATA_BLOCK_HEADER */
2168
d095666dedf3 use get_bits_long() where needed
mru
parents: 1358
diff changeset
55 if (get_bits_long(&gb, 32) != FLAC_STREAMINFO_SIZE)
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
56 return -1;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
57
4286
2af9d6b4db07 use function and definitions from libavcodec/flac.h in oggparseflac.c
jbr
parents: 4105
diff changeset
58 ff_flac_parse_streaminfo(st->codec, &si, streaminfo_start);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
59
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5824
diff changeset
60 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
820
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);
4286
2af9d6b4db07 use function and definitions from libavcodec/flac.h in oggparseflac.c
jbr
parents: 4105
diff changeset
65 memcpy(st->codec->extradata, streaminfo_start, 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
66 st->codec->extradata_size = FLAC_STREAMINFO_SIZE;
1077
91677ac6fb19 set stream time_base properly
mru
parents: 896
diff changeset
67
91677ac6fb19 set stream time_base properly
mru
parents: 896
diff changeset
68 st->time_base.num = 1;
91677ac6fb19 set stream time_base properly
mru
parents: 896
diff changeset
69 st->time_base.den = st->codec->sample_rate;
4286
2af9d6b4db07 use function and definitions from libavcodec/flac.h in oggparseflac.c
jbr
parents: 4105
diff changeset
70 } else if (mdt == FLAC_METADATA_TYPE_VORBIS_COMMENT) {
5824
b9f21d75c81a oggdec: Metadata is per-stream; don't merge multiple streams' together
conrad
parents: 5823
diff changeset
71 ff_vorbis_comment (s, &st->metadata, os->buf + os->pstart + 4, os->psize - 4);
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
72 }
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
73
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
74 return 1;
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
75 }
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
76
2378
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
77 static int
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
78 old_flac_header (AVFormatContext * s, int idx)
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
79 {
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
80 AVStream *st = s->streams[idx];
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5824
diff changeset
81 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
2378
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
82 st->codec->codec_id = CODEC_ID_FLAC;
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
83
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
84 return 0;
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
85 }
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
86
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3770
diff changeset
87 const struct ogg_codec ff_flac_codec = {
756
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
88 .magic = "\177FLAC",
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
89 .magicsize = 5,
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
90 .header = flac_header
677bad57fca2 flac in ogg support
mru
parents:
diff changeset
91 };
2378
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
92
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3770
diff changeset
93 const struct ogg_codec ff_old_flac_codec = {
2378
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
94 .magic = "fLaC",
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
95 .magicsize = 4,
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
96 .header = old_flac_header
214978878a19 add support for old flac in ogg
michael
parents: 2168
diff changeset
97 };