annotate parser.c @ 4852:8b92d313409d libavcodec

fix playback of odd_height.mov this isnt the most beautifull solution but at least it works independant of the random height in mov and it doesnt add any secholes
author michael
date Sat, 14 Apr 2007 22:22:34 +0000
parents 841ecebff8c8
children 40f3a7f2b1fd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1 /*
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
2 * Audio and Video frame extraction
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
3 * Copyright (c) 2003 Fabrice Bellard.
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
4 * Copyright (c) 2003 Michael Niedermayer.
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
5 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
6 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
7 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
12 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
16 * Lesser General Public License for more details.
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
17 *
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
21 */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
22 #include "avcodec.h"
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
23 #include "mpegvideo.h"
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
24 #include "mpegaudio.h"
4645
056127e5df89 remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents: 4501
diff changeset
25 #include "ac3.h"
4150
2205aefb22b7 move AVCodecParser prototypes and definitions to parser.h, and move mpegvideo parser to mpeg12.c
bcoudurier
parents: 4146
diff changeset
26 #include "parser.h"
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
27
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
28 AVCodecParser *av_first_parser = NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
29
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
30 void av_register_codec_parser(AVCodecParser *parser)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
31 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
32 parser->next = av_first_parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
33 av_first_parser = parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
34 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
35
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
36 AVCodecParserContext *av_parser_init(int codec_id)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
37 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
38 AVCodecParserContext *s;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
39 AVCodecParser *parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
40 int ret;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
41
2486
f2a9559db6ac 10l (array gets padded with 0 which is CODEC_ID_NONE -> parsers claim to support CODEC_ID_NONE)
michael
parents: 2480
diff changeset
42 if(codec_id == CODEC_ID_NONE)
f2a9559db6ac 10l (array gets padded with 0 which is CODEC_ID_NONE -> parsers claim to support CODEC_ID_NONE)
michael
parents: 2480
diff changeset
43 return NULL;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
44
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
45 for(parser = av_first_parser; parser != NULL; parser = parser->next) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
46 if (parser->codec_ids[0] == codec_id ||
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
47 parser->codec_ids[1] == codec_id ||
2348
d02fb928ca44 pnm parser
michael
parents: 2270
diff changeset
48 parser->codec_ids[2] == codec_id ||
d02fb928ca44 pnm parser
michael
parents: 2270
diff changeset
49 parser->codec_ids[3] == codec_id ||
d02fb928ca44 pnm parser
michael
parents: 2270
diff changeset
50 parser->codec_ids[4] == codec_id)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
51 goto found;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
52 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
53 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
54 found:
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
55 s = av_mallocz(sizeof(AVCodecParserContext));
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
56 if (!s)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
57 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
58 s->parser = parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
59 s->priv_data = av_mallocz(parser->priv_data_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
60 if (!s->priv_data) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
61 av_free(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
62 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
63 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
64 if (parser->parser_init) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
65 ret = parser->parser_init(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
66 if (ret != 0) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
67 av_free(s->priv_data);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
68 av_free(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
69 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
70 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
71 }
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
72 s->fetch_timestamp=1;
4739
9b4c5d2fb8ce set pict_type to I type during init so parsers which dont set it get all i frames, fixes mp3 seeking
michael
parents: 4679
diff changeset
73 s->pict_type = FF_I_TYPE;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
74 return s;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
75 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
76
3989
michael
parents: 3947
diff changeset
77 /**
michael
parents: 3947
diff changeset
78 *
michael
parents: 3947
diff changeset
79 * @param buf input
michael
parents: 3947
diff changeset
80 * @param buf_size input length, to signal EOF, this should be 0 (so that the last frame can be output)
michael
parents: 3947
diff changeset
81 * @param pts input presentation timestamp
michael
parents: 3947
diff changeset
82 * @param dts input decoding timestamp
michael
parents: 3947
diff changeset
83 * @param poutbuf will contain a pointer to the first byte of the output frame
michael
parents: 3947
diff changeset
84 * @param poutbuf_size will contain the length of the output frame
michael
parents: 3947
diff changeset
85 * @return the number of bytes of the input bitstream used
michael
parents: 3947
diff changeset
86 *
michael
parents: 3947
diff changeset
87 * Example:
michael
parents: 3947
diff changeset
88 * @code
michael
parents: 3947
diff changeset
89 * while(in_len){
michael
parents: 3947
diff changeset
90 * len = av_parser_parse(myparser, AVCodecContext, &data, &size,
michael
parents: 3947
diff changeset
91 * in_data, in_len,
michael
parents: 3947
diff changeset
92 * pts, dts);
michael
parents: 3947
diff changeset
93 * in_data += len;
michael
parents: 3947
diff changeset
94 * in_len -= len;
michael
parents: 3947
diff changeset
95 *
4310
a0c0c7bebd64 minor doc fix
michael
parents: 4177
diff changeset
96 * if(size)
a0c0c7bebd64 minor doc fix
michael
parents: 4177
diff changeset
97 * decode_frame(data, size);
3989
michael
parents: 3947
diff changeset
98 * }
michael
parents: 3947
diff changeset
99 * @endcode
michael
parents: 3947
diff changeset
100 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
101 int av_parser_parse(AVCodecParserContext *s,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
102 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
103 uint8_t **poutbuf, int *poutbuf_size,
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
104 const uint8_t *buf, int buf_size,
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
105 int64_t pts, int64_t dts)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
106 {
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
107 int index, i, k;
1694
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
108 uint8_t dummy_buf[FF_INPUT_BUFFER_PADDING_SIZE];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
109
1694
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
110 if (buf_size == 0) {
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
111 /* padding is always necessary even if EOF, so we add it here */
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
112 memset(dummy_buf, 0, sizeof(dummy_buf));
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
113 buf = dummy_buf;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
114 } else {
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
115 /* add a new packet descriptor */
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
116 k = (s->cur_frame_start_index + 1) & (AV_PARSER_PTS_NB - 1);
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
117 s->cur_frame_start_index = k;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
118 s->cur_frame_offset[k] = s->cur_offset;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
119 s->cur_frame_pts[k] = pts;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
120 s->cur_frame_dts[k] = dts;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
121
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
122 /* fill first PTS/DTS */
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
123 if (s->fetch_timestamp){
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
124 s->fetch_timestamp=0;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
125 s->last_pts = pts;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
126 s->last_dts = dts;
4846
841ecebff8c8 timestamps generation improvement when parsing avi
benoit
parents: 4795
diff changeset
127 s->last_offset = 0;
2107
bec4623c2201 timestamp duplication bugfix
michael
parents: 2030
diff changeset
128 s->cur_frame_pts[k] =
bec4623c2201 timestamp duplication bugfix
michael
parents: 2030
diff changeset
129 s->cur_frame_dts[k] = AV_NOPTS_VALUE;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
130 }
1694
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
131 }
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
132
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
133 /* WARNING: the returned index can be negative */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
134 index = s->parser->parser_parse(s, avctx, poutbuf, poutbuf_size, buf, buf_size);
4122
daae66c03857 Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 4104
diff changeset
135 //av_log(NULL, AV_LOG_DEBUG, "parser: in:%"PRId64", %"PRId64", out:%"PRId64", %"PRId64", in:%d out:%d id:%d\n", pts, dts, s->last_pts, s->last_dts, buf_size, *poutbuf_size, avctx->codec_id);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
136 /* update the file pointer */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
137 if (*poutbuf_size) {
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
138 /* fill the data for the current frame */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
139 s->frame_offset = s->last_frame_offset;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
140 s->pts = s->last_pts;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
141 s->dts = s->last_dts;
4846
841ecebff8c8 timestamps generation improvement when parsing avi
benoit
parents: 4795
diff changeset
142 s->offset = s->last_offset;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
143
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
144 /* offset of the next frame */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
145 s->last_frame_offset = s->cur_offset + index;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
146 /* find the packet in which the new frame starts. It
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
147 is tricky because of MPEG video start codes
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
148 which can begin in one packet and finish in
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
149 another packet. In the worst case, an MPEG
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
150 video start code could be in 4 different
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
151 packets. */
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
152 k = s->cur_frame_start_index;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
153 for(i = 0; i < AV_PARSER_PTS_NB; i++) {
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
154 if (s->last_frame_offset >= s->cur_frame_offset[k])
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
155 break;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
156 k = (k - 1) & (AV_PARSER_PTS_NB - 1);
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
157 }
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
158
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
159 s->last_pts = s->cur_frame_pts[k];
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
160 s->last_dts = s->cur_frame_dts[k];
4846
841ecebff8c8 timestamps generation improvement when parsing avi
benoit
parents: 4795
diff changeset
161 s->last_offset = s->last_frame_offset - s->cur_frame_offset[k];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
162
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
163 /* some parsers tell us the packet size even before seeing the first byte of the next packet,
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
164 so the next pts/dts is in the next chunk */
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
165 if(index == buf_size){
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
166 s->fetch_timestamp=1;
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
167 }
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
168 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
169 if (index < 0)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
170 index = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
171 s->cur_offset += index;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
172 return index;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
173 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
174
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
175 /**
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
176 *
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
177 * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed
3421
b7826511f7b6 AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents: 3395
diff changeset
178 * @deprecated use AVBitstreamFilter
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
179 */
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
180 int av_parser_change(AVCodecParserContext *s,
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
181 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
182 uint8_t **poutbuf, int *poutbuf_size,
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
183 const uint8_t *buf, int buf_size, int keyframe){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
184
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
185 if(s && s->parser->split){
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
186 if((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) || (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)){
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
187 int i= s->parser->split(avctx, buf, buf_size);
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
188 buf += i;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
189 buf_size -= i;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
190 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
191 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
192
2864
95bac7109ff0 Kill some compiler warnings. Compiled code verified identical after changes.
mru
parents: 2846
diff changeset
193 /* cast to avoid warning about discarding qualifiers */
95bac7109ff0 Kill some compiler warnings. Compiled code verified identical after changes.
mru
parents: 2846
diff changeset
194 *poutbuf= (uint8_t *) buf;
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
195 *poutbuf_size= buf_size;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
196 if(avctx->extradata){
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
197 if( (keyframe && (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER))
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
198 /*||(s->pict_type != I_TYPE && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_NOKEY))*/
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
199 /*||(? && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_BEGIN)*/){
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
200 int size= buf_size + avctx->extradata_size;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
201 *poutbuf_size= size;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
202 *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
203
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
204 memcpy(*poutbuf, avctx->extradata, avctx->extradata_size);
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
205 memcpy((*poutbuf) + avctx->extradata_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
206 return 1;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
207 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
208 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
209
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
210 return 0;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
211 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
212
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
213 void av_parser_close(AVCodecParserContext *s)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
214 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
215 if (s->parser->parser_close)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
216 s->parser->parser_close(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
217 av_free(s->priv_data);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
218 av_free(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
219 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
220
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
221 /*****************************************************/
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
222
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
223 /**
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
224 * combines the (truncated) bitstream to a complete frame
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
225 * @returns -1 if no complete frame could be created
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
226 */
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
227 int ff_combine_frame(ParseContext *pc, int next, uint8_t **buf, int *buf_size)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
228 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
229 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
230 if(pc->overread){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
231 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
232 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
233 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
234 #endif
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
235
4795
522e52c630bd typos/grammar
diego
parents: 4739
diff changeset
236 /* Copy overread bytes from last frame into buffer. */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
237 for(; pc->overread>0; pc->overread--){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
238 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
239 }
2386
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
240
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
241 /* flush remaining if EOF */
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
242 if(!*buf_size && next == END_NOT_FOUND){
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
243 next= 0;
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
244 }
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
245
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
246 pc->last_index= pc->index;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
247
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
248 /* copy into buffer end return */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
249 if(next == END_NOT_FOUND){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
250 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, (*buf_size) + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
251
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
252 memcpy(&pc->buffer[pc->index], *buf, *buf_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
253 pc->index += *buf_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
254 return -1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
255 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
256
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
257 *buf_size=
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
258 pc->overread_index= pc->index + next;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
259
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
260 /* append to buffer */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
261 if(pc->index){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
262 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
263
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
264 memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
265 pc->index = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
266 *buf= pc->buffer;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
267 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
268
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
269 /* store overread bytes */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
270 for(;next < 0; next++){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
271 pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
272 pc->overread++;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
273 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
274
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
275 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
276 if(pc->overread){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
277 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
278 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
279 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
280 #endif
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
281
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
282 return 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
283 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
284
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
285 void ff_parse_close(AVCodecParserContext *s)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
286 {
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
287 ParseContext *pc = s->priv_data;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
288
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
289 av_free(pc->buffer);
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
290 }
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
291
4150
2205aefb22b7 move AVCodecParser prototypes and definitions to parser.h, and move mpegvideo parser to mpeg12.c
bcoudurier
parents: 4146
diff changeset
292 void ff_parse1_close(AVCodecParserContext *s)
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
293 {
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
294 ParseContext1 *pc1 = s->priv_data;
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
295
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
296 av_free(pc1->pc.buffer);
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
297 av_free(pc1->enc);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
298 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
299
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
300 /*************************/
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
301
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
302 #ifdef CONFIG_MPEG4VIDEO_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
303 /* used by parser */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
304 /* XXX: make it use less memory */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
305 static int av_mpeg4_decode_header(AVCodecParserContext *s1,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
306 AVCodecContext *avctx,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
307 const uint8_t *buf, int buf_size)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
308 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
309 ParseContext1 *pc = s1->priv_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
310 MpegEncContext *s = pc->enc;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
311 GetBitContext gb1, *gb = &gb1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
312 int ret;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
313
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
314 s->avctx = avctx;
1614
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
315 s->current_picture_ptr = &s->current_picture;
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
316
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
317 if (avctx->extradata_size && pc->first_picture){
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
318 init_get_bits(gb, avctx->extradata, avctx->extradata_size*8);
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
319 ret = ff_mpeg4_decode_picture_header(s, gb);
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
320 }
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
321
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
322 init_get_bits(gb, buf, 8 * buf_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
323 ret = ff_mpeg4_decode_picture_header(s, gb);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
324 if (s->width) {
2270
21f450be6cb5 lowres width/height cleanup 3rd try
michael
parents: 2269
diff changeset
325 avcodec_set_dimensions(avctx, s->width, s->height);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
326 }
2837
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
327 s1->pict_type= s->pict_type;
1614
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
328 pc->first_picture = 0;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
329 return ret;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
330 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
331
2024
f65d87bfdd5a some of the warning fixes by (Michael Roitzsch <mroi at users dot sourceforge dot net>)
michael
parents: 1988
diff changeset
332 static int mpeg4video_parse_init(AVCodecParserContext *s)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
333 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
334 ParseContext1 *pc = s->priv_data;
1614
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
335
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
336 pc->enc = av_mallocz(sizeof(MpegEncContext));
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
337 if (!pc->enc)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
338 return -1;
1614
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
339 pc->first_picture = 1;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
340 return 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
341 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
342
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
343 static int mpeg4video_parse(AVCodecParserContext *s,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
344 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
345 uint8_t **poutbuf, int *poutbuf_size,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
346 const uint8_t *buf, int buf_size)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
347 {
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
348 ParseContext *pc = s->priv_data;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
349 int next;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
350
2837
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
351 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
352 next= buf_size;
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
353 }else{
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
354 next= ff_mpeg4_find_frame_end(pc, buf, buf_size);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
355
2837
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
356 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
357 *poutbuf = NULL;
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
358 *poutbuf_size = 0;
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
359 return buf_size;
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
360 }
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
361 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
362 av_mpeg4_decode_header(s, avctx, buf, buf_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
363
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
364 *poutbuf = (uint8_t *)buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
365 *poutbuf_size = buf_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
366 return next;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
367 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
368 #endif
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
369
4175
b3328ed50a5e make mpeg4video_split public as ff_mpeg4video_split
stefang
parents: 4150
diff changeset
370 int ff_mpeg4video_split(AVCodecContext *avctx,
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
371 const uint8_t *buf, int buf_size)
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
372 {
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
373 int i;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
374 uint32_t state= -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
375
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
376 for(i=0; i<buf_size; i++){
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
377 state= (state<<8) | buf[i];
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
378 if(state == 0x1B3 || state == 0x1B6)
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
379 return i-3;
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
380 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
381 return 0;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
382 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
383
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
384 /*************************/
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
385
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
386 #ifdef CONFIG_MPEGAUDIO_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
387 typedef struct MpegAudioParseContext {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
388 uint8_t inbuf[MPA_MAX_CODED_FRAME_SIZE]; /* input buffer */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
389 uint8_t *inbuf_ptr;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
390 int frame_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
391 int free_format_frame_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
392 int free_format_next_header;
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
393 uint32_t header;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
394 int header_count;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
395 } MpegAudioParseContext;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
396
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
397 #define MPA_HEADER_SIZE 4
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
398
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
399 /* header + layer + bitrate + freq + lsf/mpeg25 */
2522
e25782262d7d kill warnings patch by (M?ns Rullg?rd <mru inprovide com>)
michael
parents: 2486
diff changeset
400 #undef SAME_HEADER_MASK /* mpegaudio.h defines different version */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
401 #define SAME_HEADER_MASK \
2480
5252700f61df 10000l vbr mp3 fix
michael
parents: 2470
diff changeset
402 (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
403
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
404 static int mpegaudio_parse_init(AVCodecParserContext *s1)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
405 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
406 MpegAudioParseContext *s = s1->priv_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
407 s->inbuf_ptr = s->inbuf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
408 return 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
409 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
410
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
411 static int mpegaudio_parse(AVCodecParserContext *s1,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
412 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
413 uint8_t **poutbuf, int *poutbuf_size,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
414 const uint8_t *buf, int buf_size)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
415 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
416 MpegAudioParseContext *s = s1->priv_data;
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
417 int len, ret, sr;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
418 uint32_t header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
419 const uint8_t *buf_ptr;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
420
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
421 *poutbuf = NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
422 *poutbuf_size = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
423 buf_ptr = buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
424 while (buf_size > 0) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
425 len = s->inbuf_ptr - s->inbuf;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
426 if (s->frame_size == 0) {
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
427 /* special case for next header for first frame in free
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
428 format case (XXX: find a simpler method) */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
429 if (s->free_format_next_header != 0) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
430 s->inbuf[0] = s->free_format_next_header >> 24;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
431 s->inbuf[1] = s->free_format_next_header >> 16;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
432 s->inbuf[2] = s->free_format_next_header >> 8;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
433 s->inbuf[3] = s->free_format_next_header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
434 s->inbuf_ptr = s->inbuf + 4;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
435 s->free_format_next_header = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
436 goto got_header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
437 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
438 /* no header seen : find one. We need at least MPA_HEADER_SIZE
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
439 bytes to parse it */
3639
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
440 len = FFMIN(MPA_HEADER_SIZE - len, buf_size);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
441 if (len > 0) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
442 memcpy(s->inbuf_ptr, buf_ptr, len);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
443 buf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
444 buf_size -= len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
445 s->inbuf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
446 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
447 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) {
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
448 got_header:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
449 header = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
450 (s->inbuf[2] << 8) | s->inbuf[3];
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
451
4104
04ff8026d9c0 dont set the sampling rate just because 1 mp3 packet header says so (fixes playback speed on some old mencoder generated avis which where then dumped to mp3)
michael
parents: 3989
diff changeset
452 ret = mpa_decode_header(avctx, header, &sr);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
453 if (ret < 0) {
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
454 s->header_count= -2;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
455 /* no sync found : move by one byte (inefficient, but simple!) */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
456 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
457 s->inbuf_ptr--;
4652
6679d37a3338 Give context to dprintf
mbardiaux
parents: 4648
diff changeset
458 dprintf(avctx, "skip %x\n", header);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
459 /* reset free format frame size to give a chance
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
460 to get a new bitrate */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
461 s->free_format_frame_size = 0;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
462 } else {
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
463 if((header&SAME_HEADER_MASK) != (s->header&SAME_HEADER_MASK) && s->header)
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
464 s->header_count= -3;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
465 s->header= header;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
466 s->header_count++;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
467 s->frame_size = ret;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
468
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
469 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
470 /* free format: prepare to compute frame size */
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
471 if (decode_header(s, header) == 1) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
472 s->frame_size = -1;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
473 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
474 #endif
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
475 }
4104
04ff8026d9c0 dont set the sampling rate just because 1 mp3 packet header says so (fixes playback speed on some old mencoder generated avis which where then dumped to mp3)
michael
parents: 3989
diff changeset
476 if(s->header_count > 1)
04ff8026d9c0 dont set the sampling rate just because 1 mp3 packet header says so (fixes playback speed on some old mencoder generated avis which where then dumped to mp3)
michael
parents: 3989
diff changeset
477 avctx->sample_rate= sr;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
478 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
479 } else
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
480 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
481 if (s->frame_size == -1) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
482 /* free format : find next sync to compute frame size */
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
483 len = MPA_MAX_CODED_FRAME_SIZE - len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
484 if (len > buf_size)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
485 len = buf_size;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
486 if (len == 0) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
487 /* frame too long: resync */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
488 s->frame_size = 0;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
489 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
490 s->inbuf_ptr--;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
491 } else {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
492 uint8_t *p, *pend;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
493 uint32_t header1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
494 int padding;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
495
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
496 memcpy(s->inbuf_ptr, buf_ptr, len);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
497 /* check for header */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
498 p = s->inbuf_ptr - 3;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
499 pend = s->inbuf_ptr + len - 4;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
500 while (p <= pend) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
501 header = (p[0] << 24) | (p[1] << 16) |
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
502 (p[2] << 8) | p[3];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
503 header1 = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
504 (s->inbuf[2] << 8) | s->inbuf[3];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
505 /* check with high probability that we have a
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
506 valid header */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
507 if ((header & SAME_HEADER_MASK) ==
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
508 (header1 & SAME_HEADER_MASK)) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
509 /* header found: update pointers */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
510 len = (p + 4) - s->inbuf_ptr;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
511 buf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
512 buf_size -= len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
513 s->inbuf_ptr = p;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
514 /* compute frame size */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
515 s->free_format_next_header = header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
516 s->free_format_frame_size = s->inbuf_ptr - s->inbuf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
517 padding = (header1 >> 9) & 1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
518 if (s->layer == 1)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
519 s->free_format_frame_size -= padding * 4;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
520 else
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
521 s->free_format_frame_size -= padding;
4652
6679d37a3338 Give context to dprintf
mbardiaux
parents: 4648
diff changeset
522 dprintf(avctx, "free frame size=%d padding=%d\n",
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
523 s->free_format_frame_size, padding);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
524 decode_header(s, header1);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
525 goto next_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
526 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
527 p++;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
528 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
529 /* not found: simply increase pointers */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
530 buf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
531 s->inbuf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
532 buf_size -= len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
533 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
534 } else
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
535 #endif
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
536 if (len < s->frame_size) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
537 if (s->frame_size > MPA_MAX_CODED_FRAME_SIZE)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
538 s->frame_size = MPA_MAX_CODED_FRAME_SIZE;
3639
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
539 len = FFMIN(s->frame_size - len, buf_size);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
540 memcpy(s->inbuf_ptr, buf_ptr, len);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
541 buf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
542 s->inbuf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
543 buf_size -= len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
544 }
3639
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
545
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
546 if(s->frame_size > 0 && buf_ptr - buf == s->inbuf_ptr - s->inbuf
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
547 && buf_size + buf_ptr - buf >= s->frame_size){
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
548 if(s->header_count > 0){
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
549 *poutbuf = buf;
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
550 *poutbuf_size = s->frame_size;
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
551 }
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
552 buf_ptr = buf + s->frame_size;
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
553 s->inbuf_ptr = s->inbuf;
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
554 s->frame_size = 0;
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
555 break;
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
556 }
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
557
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
558 // next_data:
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
559 if (s->frame_size > 0 &&
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
560 (s->inbuf_ptr - s->inbuf) >= s->frame_size) {
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
561 if(s->header_count > 0){
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
562 *poutbuf = s->inbuf;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
563 *poutbuf_size = s->inbuf_ptr - s->inbuf;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
564 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
565 s->inbuf_ptr = s->inbuf;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
566 s->frame_size = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
567 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
568 }
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
569 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
570 return buf_ptr - buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
571 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
572 #endif /* CONFIG_MPEGAUDIO_PARSER */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
573
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
574 #if defined(CONFIG_AC3_PARSER) || defined(CONFIG_AAC_PARSER)
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
575 /* also used for ADTS AAC */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
576 typedef struct AC3ParseContext {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
577 uint8_t *inbuf_ptr;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
578 int frame_size;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
579 int header_size;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
580 int (*sync)(const uint8_t *buf, int *channels, int *sample_rate,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
581 int *bit_rate, int *samples);
3344
f9d739057d6c The AAC frame header uses 13 bits for the frame size, so the buffer should
mru
parents: 3104
diff changeset
582 uint8_t inbuf[8192]; /* input buffer */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
583 } AC3ParseContext;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
584
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
585 #define AC3_HEADER_SIZE 7
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
586 #define AAC_HEADER_SIZE 7
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
587
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
588 #ifdef CONFIG_AC3_PARSER
4397
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
589
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
590 static const uint8_t eac3_blocks[4] = {
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
591 1, 2, 3, 6
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
592 };
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
593
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
594 #endif /* CONFIG_AC3_PARSER */
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
595
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
596 #ifdef CONFIG_AAC_PARSER
3456
fa0b285144f0 make some tables const
mru
parents: 3455
diff changeset
597 static const int aac_sample_rates[16] = {
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
598 96000, 88200, 64000, 48000, 44100, 32000,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
599 24000, 22050, 16000, 12000, 11025, 8000, 7350
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
600 };
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
601
3456
fa0b285144f0 make some tables const
mru
parents: 3455
diff changeset
602 static const int aac_channels[8] = {
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
603 0, 1, 2, 3, 4, 5, 6, 8
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
604 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
605 #endif
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
606
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
607 #ifdef CONFIG_AC3_PARSER
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
608 static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
609 int *bit_rate, int *samples)
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
610 {
4648
5683b496ffbc move AC-3 header parsing to ac3.c
jbr
parents: 4645
diff changeset
611 int err;
5683b496ffbc move AC-3 header parsing to ac3.c
jbr
parents: 4645
diff changeset
612 unsigned int fscod, acmod, bsid, lfeon;
4397
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
613 unsigned int strmtyp, substreamid, frmsiz, fscod2, numblkscod;
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
614 GetBitContext bits;
4648
5683b496ffbc move AC-3 header parsing to ac3.c
jbr
parents: 4645
diff changeset
615 AC3HeaderInfo hdr;
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
616
4648
5683b496ffbc move AC-3 header parsing to ac3.c
jbr
parents: 4645
diff changeset
617 err = ff_ac3_parse_header(buf, &hdr);
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
618
4648
5683b496ffbc move AC-3 header parsing to ac3.c
jbr
parents: 4645
diff changeset
619 if(err < 0 && err != -2)
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
620 return 0;
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
621
4648
5683b496ffbc move AC-3 header parsing to ac3.c
jbr
parents: 4645
diff changeset
622 bsid = hdr.bsid;
4501
665d7cd95fd3 fix parsing of RealAudio AC-3/DolbyNet
jbr
parents: 4398
diff changeset
623 if(bsid <= 10) { /* Normal AC-3 */
4648
5683b496ffbc move AC-3 header parsing to ac3.c
jbr
parents: 4645
diff changeset
624 *sample_rate = hdr.sample_rate;
5683b496ffbc move AC-3 header parsing to ac3.c
jbr
parents: 4645
diff changeset
625 *bit_rate = hdr.bit_rate;
5683b496ffbc move AC-3 header parsing to ac3.c
jbr
parents: 4645
diff changeset
626 *channels = hdr.channels;
5683b496ffbc move AC-3 header parsing to ac3.c
jbr
parents: 4645
diff changeset
627 *samples = AC3_FRAME_SIZE;
5683b496ffbc move AC-3 header parsing to ac3.c
jbr
parents: 4645
diff changeset
628 return hdr.frame_size;
4501
665d7cd95fd3 fix parsing of RealAudio AC-3/DolbyNet
jbr
parents: 4398
diff changeset
629 } else if (bsid > 10 && bsid <= 16) { /* Enhanced AC-3 */
4648
5683b496ffbc move AC-3 header parsing to ac3.c
jbr
parents: 4645
diff changeset
630 init_get_bits(&bits, &buf[2], (AC3_HEADER_SIZE-2) * 8);
4397
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
631 strmtyp = get_bits(&bits, 2);
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
632 substreamid = get_bits(&bits, 3);
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
633
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
634 if (strmtyp != 0 || substreamid != 0)
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
635 return 0; /* Currently don't support additional streams */
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
636
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
637 frmsiz = get_bits(&bits, 11) + 1;
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
638 fscod = get_bits(&bits, 2);
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
639 if (fscod == 3) {
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
640 fscod2 = get_bits(&bits, 2);
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
641 numblkscod = 3;
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
642
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
643 if(fscod2 == 3)
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
644 return 0;
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
645
4645
056127e5df89 remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents: 4501
diff changeset
646 *sample_rate = ff_ac3_freqs[fscod2] / 2;
4397
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
647 } else {
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
648 numblkscod = get_bits(&bits, 2);
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
649
4645
056127e5df89 remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents: 4501
diff changeset
650 *sample_rate = ff_ac3_freqs[fscod];
4397
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
651 }
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
652
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
653 acmod = get_bits(&bits, 3);
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
654 lfeon = get_bits1(&bits);
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
655
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
656 *samples = eac3_blocks[numblkscod] * 256;
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
657 *bit_rate = frmsiz * (*sample_rate) * 16 / (*samples);
4645
056127e5df89 remove redundancy in AC-3 parser by using common tables from ac3tab.h
jbr
parents: 4501
diff changeset
658 *channels = ff_ac3_channels[acmod] + lfeon;
4397
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
659
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
660 return frmsiz * 2;
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
661 }
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
662
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
663 /* Unsupported bitstream version */
acb9faabab8d Allows the AC3 parser to read the frame size and codec parameters from E-AC3 streams,
gpoirier
parents: 4310
diff changeset
664 return 0;
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
665 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
666 #endif /* CONFIG_AC3_PARSER */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
667
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
668 #ifdef CONFIG_AAC_PARSER
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
669 static int aac_sync(const uint8_t *buf, int *channels, int *sample_rate,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
670 int *bit_rate, int *samples)
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
671 {
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
672 GetBitContext bits;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
673 int size, rdb, ch, sr;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
674
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
675 init_get_bits(&bits, buf, AAC_HEADER_SIZE * 8);
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
676
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
677 if(get_bits(&bits, 12) != 0xfff)
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
678 return 0;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
679
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
680 skip_bits1(&bits); /* id */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
681 skip_bits(&bits, 2); /* layer */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
682 skip_bits1(&bits); /* protection_absent */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
683 skip_bits(&bits, 2); /* profile_objecttype */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
684 sr = get_bits(&bits, 4); /* sample_frequency_index */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
685 if(!aac_sample_rates[sr])
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
686 return 0;
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
687 skip_bits1(&bits); /* private_bit */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
688 ch = get_bits(&bits, 3); /* channel_configuration */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
689 if(!aac_channels[ch])
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
690 return 0;
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
691 skip_bits1(&bits); /* original/copy */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
692 skip_bits1(&bits); /* home */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
693
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
694 /* adts_variable_header */
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
695 skip_bits1(&bits); /* copyright_identification_bit */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
696 skip_bits1(&bits); /* copyright_identification_start */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
697 size = get_bits(&bits, 13); /* aac_frame_length */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
698 skip_bits(&bits, 11); /* adts_buffer_fullness */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
699 rdb = get_bits(&bits, 2); /* number_of_raw_data_blocks_in_frame */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
700
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
701 *channels = aac_channels[ch];
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
702 *sample_rate = aac_sample_rates[sr];
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
703 *samples = (rdb + 1) * 1024;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
704 *bit_rate = size * 8 * *sample_rate / *samples;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
705
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
706 return size;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
707 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
708 #endif /* CONFIG_AAC_PARSER */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
709
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
710 #ifdef CONFIG_AC3_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
711 static int ac3_parse_init(AVCodecParserContext *s1)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
712 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
713 AC3ParseContext *s = s1->priv_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
714 s->inbuf_ptr = s->inbuf;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
715 s->header_size = AC3_HEADER_SIZE;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
716 s->sync = ac3_sync;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
717 return 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
718 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
719 #endif
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
720
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
721 #ifdef CONFIG_AAC_PARSER
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
722 static int aac_parse_init(AVCodecParserContext *s1)
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
723 {
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
724 AC3ParseContext *s = s1->priv_data;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
725 s->inbuf_ptr = s->inbuf;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
726 s->header_size = AAC_HEADER_SIZE;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
727 s->sync = aac_sync;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
728 return 0;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
729 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
730 #endif
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
731
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
732 /* also used for ADTS AAC */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
733 static int ac3_parse(AVCodecParserContext *s1,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
734 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
735 uint8_t **poutbuf, int *poutbuf_size,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
736 const uint8_t *buf, int buf_size)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
737 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
738 AC3ParseContext *s = s1->priv_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
739 const uint8_t *buf_ptr;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
740 int len, sample_rate, bit_rate, channels, samples;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
741
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
742 *poutbuf = NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
743 *poutbuf_size = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
744
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
745 buf_ptr = buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
746 while (buf_size > 0) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
747 len = s->inbuf_ptr - s->inbuf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
748 if (s->frame_size == 0) {
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
749 /* no header seen : find one. We need at least s->header_size
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
750 bytes to parse it */
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
751 len = FFMIN(s->header_size - len, buf_size);
3082
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
752
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
753 memcpy(s->inbuf_ptr, buf_ptr, len);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
754 buf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
755 s->inbuf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
756 buf_size -= len;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
757 if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
758 len = s->sync(s->inbuf, &channels, &sample_rate, &bit_rate,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
759 &samples);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
760 if (len == 0) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
761 /* no sync found : move by one byte (inefficient, but simple!) */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
762 memmove(s->inbuf, s->inbuf + 1, s->header_size - 1);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
763 s->inbuf_ptr--;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
764 } else {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
765 s->frame_size = len;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
766 /* update codec info */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
767 avctx->sample_rate = sample_rate;
1987
d9e067853051 >2 channels decoding fix
michael
parents: 1696
diff changeset
768 /* set channels,except if the user explicitly requests 1 or 2 channels, XXX/FIXME this is a bit ugly */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
769 if(avctx->codec_id == CODEC_ID_AC3){
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
770 if(avctx->channels!=1 && avctx->channels!=2){
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
771 avctx->channels = channels;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
772 }
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
773 } else {
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
774 avctx->channels = channels;
1987
d9e067853051 >2 channels decoding fix
michael
parents: 1696
diff changeset
775 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
776 avctx->bit_rate = bit_rate;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
777 avctx->frame_size = samples;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
778 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
779 }
3082
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
780 } else {
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
781 len = FFMIN(s->frame_size - len, buf_size);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
782
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
783 memcpy(s->inbuf_ptr, buf_ptr, len);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
784 buf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
785 s->inbuf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
786 buf_size -= len;
3082
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
787
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
788 if(s->inbuf_ptr - s->inbuf == s->frame_size){
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
789 *poutbuf = s->inbuf;
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
790 *poutbuf_size = s->frame_size;
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
791 s->inbuf_ptr = s->inbuf;
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
792 s->frame_size = 0;
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
793 break;
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
794 }
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
795 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
796 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
797 return buf_ptr - buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
798 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
799 #endif /* CONFIG_AC3_PARSER || CONFIG_AAC_PARSER */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
800
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
801 #ifdef CONFIG_MPEG4VIDEO_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
802 AVCodecParser mpeg4video_parser = {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
803 { CODEC_ID_MPEG4 },
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
804 sizeof(ParseContext1),
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
805 mpeg4video_parse_init,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
806 mpeg4video_parse,
4150
2205aefb22b7 move AVCodecParser prototypes and definitions to parser.h, and move mpegvideo parser to mpeg12.c
bcoudurier
parents: 4146
diff changeset
807 ff_parse1_close,
4175
b3328ed50a5e make mpeg4video_split public as ff_mpeg4video_split
stefang
parents: 4150
diff changeset
808 ff_mpeg4video_split,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
809 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
810 #endif
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
811 #ifdef CONFIG_MPEGAUDIO_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
812 AVCodecParser mpegaudio_parser = {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
813 { CODEC_ID_MP2, CODEC_ID_MP3 },
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
814 sizeof(MpegAudioParseContext),
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
815 mpegaudio_parse_init,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
816 mpegaudio_parse,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
817 NULL,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
818 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
819 #endif
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
820 #ifdef CONFIG_AC3_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
821 AVCodecParser ac3_parser = {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
822 { CODEC_ID_AC3 },
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
823 sizeof(AC3ParseContext),
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
824 ac3_parse_init,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
825 ac3_parse,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
826 NULL,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
827 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
828 #endif
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
829 #ifdef CONFIG_AAC_PARSER
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
830 AVCodecParser aac_parser = {
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
831 { CODEC_ID_AAC },
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
832 sizeof(AC3ParseContext),
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
833 aac_parse_init,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
834 ac3_parse,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
835 NULL,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
836 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
837 #endif