annotate parser.c @ 4166:eced83504436 libavcodec

mp3 header (de)compression bitstream filter this will make mp3 frames 4 bytes smaller, it will not give you binary identical mp3 files, but it will give you mp3 files which decode to binary identical output this will only work in containers providing at least packet size, sample_rate and number of channels bugreports about mp3 files for which this fails are welcome and this is experimental (dont expect compatibility and dont even expect to be able to decompress what you compressed, hell dont even expect this to work without editing the source a little)
author michael
date Fri, 10 Nov 2006 01:41:53 +0000
parents 2205aefb22b7
children b3328ed50a5e
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"
4150
2205aefb22b7 move AVCodecParser prototypes and definitions to parser.h, and move mpegvideo parser to mpeg12.c
bcoudurier
parents: 4146
diff changeset
25 #include "parser.h"
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
26
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
27 AVCodecParser *av_first_parser = NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
28
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
29 void av_register_codec_parser(AVCodecParser *parser)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
30 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
31 parser->next = av_first_parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
32 av_first_parser = parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
33 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
34
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
35 AVCodecParserContext *av_parser_init(int codec_id)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
36 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
37 AVCodecParserContext *s;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
38 AVCodecParser *parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
39 int ret;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
40
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
41 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
42 return NULL;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
43
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
44 for(parser = av_first_parser; parser != NULL; parser = parser->next) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
45 if (parser->codec_ids[0] == codec_id ||
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
46 parser->codec_ids[1] == codec_id ||
2348
d02fb928ca44 pnm parser
michael
parents: 2270
diff changeset
47 parser->codec_ids[2] == codec_id ||
d02fb928ca44 pnm parser
michael
parents: 2270
diff changeset
48 parser->codec_ids[3] == codec_id ||
d02fb928ca44 pnm parser
michael
parents: 2270
diff changeset
49 parser->codec_ids[4] == codec_id)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
50 goto found;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
51 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
52 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
53 found:
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
54 s = av_mallocz(sizeof(AVCodecParserContext));
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
55 if (!s)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
56 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
57 s->parser = parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
58 s->priv_data = av_mallocz(parser->priv_data_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
59 if (!s->priv_data) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
60 av_free(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
61 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
62 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
63 if (parser->parser_init) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
64 ret = parser->parser_init(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
65 if (ret != 0) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
66 av_free(s->priv_data);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
67 av_free(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
68 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
69 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
70 }
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
71 s->fetch_timestamp=1;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
72 return s;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
73 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
74
3989
michael
parents: 3947
diff changeset
75 /**
michael
parents: 3947
diff changeset
76 *
michael
parents: 3947
diff changeset
77 * @param buf input
michael
parents: 3947
diff changeset
78 * @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
79 * @param pts input presentation timestamp
michael
parents: 3947
diff changeset
80 * @param dts input decoding timestamp
michael
parents: 3947
diff changeset
81 * @param poutbuf will contain a pointer to the first byte of the output frame
michael
parents: 3947
diff changeset
82 * @param poutbuf_size will contain the length of the output frame
michael
parents: 3947
diff changeset
83 * @return the number of bytes of the input bitstream used
michael
parents: 3947
diff changeset
84 *
michael
parents: 3947
diff changeset
85 * Example:
michael
parents: 3947
diff changeset
86 * @code
michael
parents: 3947
diff changeset
87 * while(in_len){
michael
parents: 3947
diff changeset
88 * len = av_parser_parse(myparser, AVCodecContext, &data, &size,
michael
parents: 3947
diff changeset
89 * in_data, in_len,
michael
parents: 3947
diff changeset
90 * pts, dts);
michael
parents: 3947
diff changeset
91 * in_data += len;
michael
parents: 3947
diff changeset
92 * in_len -= len;
michael
parents: 3947
diff changeset
93 *
michael
parents: 3947
diff changeset
94 * decode_frame(data, size);
michael
parents: 3947
diff changeset
95 * }
michael
parents: 3947
diff changeset
96 * @endcode
michael
parents: 3947
diff changeset
97 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
98 int av_parser_parse(AVCodecParserContext *s,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
99 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
100 uint8_t **poutbuf, int *poutbuf_size,
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
101 const uint8_t *buf, int buf_size,
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
102 int64_t pts, int64_t dts)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
103 {
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
104 int index, i, k;
1694
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
105 uint8_t dummy_buf[FF_INPUT_BUFFER_PADDING_SIZE];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
106
1694
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
107 if (buf_size == 0) {
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
108 /* 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
109 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
110 buf = dummy_buf;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
111 } else {
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
112 /* add a new packet descriptor */
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
113 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
114 s->cur_frame_start_index = k;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
115 s->cur_frame_offset[k] = s->cur_offset;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
116 s->cur_frame_pts[k] = pts;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
117 s->cur_frame_dts[k] = dts;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
118
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
119 /* fill first PTS/DTS */
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
120 if (s->fetch_timestamp){
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
121 s->fetch_timestamp=0;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
122 s->last_pts = pts;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
123 s->last_dts = dts;
2107
bec4623c2201 timestamp duplication bugfix
michael
parents: 2030
diff changeset
124 s->cur_frame_pts[k] =
bec4623c2201 timestamp duplication bugfix
michael
parents: 2030
diff changeset
125 s->cur_frame_dts[k] = AV_NOPTS_VALUE;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
126 }
1694
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
127 }
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
128
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
129 /* WARNING: the returned index can be negative */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
130 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
131 //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
132 /* update the file pointer */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
133 if (*poutbuf_size) {
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
134 /* fill the data for the current frame */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
135 s->frame_offset = s->last_frame_offset;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
136 s->pts = s->last_pts;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
137 s->dts = s->last_dts;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
138
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
139 /* offset of the next frame */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
140 s->last_frame_offset = s->cur_offset + index;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
141 /* find the packet in which the new frame starts. It
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
142 is tricky because of MPEG video start codes
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
143 which can begin in one packet and finish in
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
144 another packet. In the worst case, an MPEG
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
145 video start code could be in 4 different
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
146 packets. */
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
147 k = s->cur_frame_start_index;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
148 for(i = 0; i < AV_PARSER_PTS_NB; i++) {
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
149 if (s->last_frame_offset >= s->cur_frame_offset[k])
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
150 break;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
151 k = (k - 1) & (AV_PARSER_PTS_NB - 1);
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
152 }
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
153
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
154 s->last_pts = s->cur_frame_pts[k];
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
155 s->last_dts = s->cur_frame_dts[k];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
156
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
157 /* 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
158 so the next pts/dts is in the next chunk */
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
159 if(index == buf_size){
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
160 s->fetch_timestamp=1;
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
161 }
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
162 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
163 if (index < 0)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
164 index = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
165 s->cur_offset += index;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
166 return index;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
167 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
168
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
169 /**
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
170 *
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
171 * @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
172 * @deprecated use AVBitstreamFilter
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
173 */
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
174 int av_parser_change(AVCodecParserContext *s,
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
175 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
176 uint8_t **poutbuf, int *poutbuf_size,
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
177 const uint8_t *buf, int buf_size, int keyframe){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
178
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
179 if(s && s->parser->split){
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
180 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
181 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
182 buf += i;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
183 buf_size -= i;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
184 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
185 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
186
2864
95bac7109ff0 Kill some compiler warnings. Compiled code verified identical after changes.
mru
parents: 2846
diff changeset
187 /* cast to avoid warning about discarding qualifiers */
95bac7109ff0 Kill some compiler warnings. Compiled code verified identical after changes.
mru
parents: 2846
diff changeset
188 *poutbuf= (uint8_t *) buf;
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
189 *poutbuf_size= buf_size;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
190 if(avctx->extradata){
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
191 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
192 /*||(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
193 /*||(? && (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
194 int size= buf_size + avctx->extradata_size;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
195 *poutbuf_size= size;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
196 *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
197
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
198 memcpy(*poutbuf, avctx->extradata, avctx->extradata_size);
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
199 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
200 return 1;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
201 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
202 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
203
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
204 return 0;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
205 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
206
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
207 void av_parser_close(AVCodecParserContext *s)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
208 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
209 if (s->parser->parser_close)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
210 s->parser->parser_close(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
211 av_free(s->priv_data);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
212 av_free(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
213 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
214
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
215 /*****************************************************/
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
216
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
217 /**
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
218 * combines the (truncated) bitstream to a complete frame
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
219 * @returns -1 if no complete frame could be created
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
220 */
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
221 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
222 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
223 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
224 if(pc->overread){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
225 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
226 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
227 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
228 #endif
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
229
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
230 /* copy overreaded bytes from last frame into buffer */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
231 for(; pc->overread>0; pc->overread--){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
232 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
233 }
2386
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
234
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
235 /* flush remaining if EOF */
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
236 if(!*buf_size && next == END_NOT_FOUND){
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
237 next= 0;
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
238 }
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
239
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
240 pc->last_index= pc->index;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
241
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
242 /* copy into buffer end return */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
243 if(next == END_NOT_FOUND){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
244 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
245
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
246 memcpy(&pc->buffer[pc->index], *buf, *buf_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
247 pc->index += *buf_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
248 return -1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
249 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
250
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
251 *buf_size=
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
252 pc->overread_index= pc->index + next;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
253
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
254 /* append to buffer */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
255 if(pc->index){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
256 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
257
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
258 memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
259 pc->index = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
260 *buf= pc->buffer;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
261 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
262
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
263 /* store overread bytes */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
264 for(;next < 0; next++){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
265 pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
266 pc->overread++;
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 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
270 if(pc->overread){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
271 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
272 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
273 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
274 #endif
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
275
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
276 return 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
277 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
278
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
279 void ff_parse_close(AVCodecParserContext *s)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
280 {
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
281 ParseContext *pc = s->priv_data;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
282
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
283 av_free(pc->buffer);
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
284 }
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
285
4150
2205aefb22b7 move AVCodecParser prototypes and definitions to parser.h, and move mpegvideo parser to mpeg12.c
bcoudurier
parents: 4146
diff changeset
286 void ff_parse1_close(AVCodecParserContext *s)
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
287 {
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
288 ParseContext1 *pc1 = s->priv_data;
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
289
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
290 av_free(pc1->pc.buffer);
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
291 av_free(pc1->enc);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
292 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
293
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
294 /*************************/
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
295
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
296 #ifdef CONFIG_MPEG4VIDEO_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
297 /* used by parser */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
298 /* XXX: make it use less memory */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
299 static int av_mpeg4_decode_header(AVCodecParserContext *s1,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
300 AVCodecContext *avctx,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
301 const uint8_t *buf, int buf_size)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
302 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
303 ParseContext1 *pc = s1->priv_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
304 MpegEncContext *s = pc->enc;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
305 GetBitContext gb1, *gb = &gb1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
306 int ret;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
307
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
308 s->avctx = avctx;
1614
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
309 s->current_picture_ptr = &s->current_picture;
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
310
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
311 if (avctx->extradata_size && pc->first_picture){
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
312 init_get_bits(gb, avctx->extradata, avctx->extradata_size*8);
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
313 ret = ff_mpeg4_decode_picture_header(s, gb);
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
314 }
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
315
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
316 init_get_bits(gb, buf, 8 * buf_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
317 ret = ff_mpeg4_decode_picture_header(s, gb);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
318 if (s->width) {
2270
21f450be6cb5 lowres width/height cleanup 3rd try
michael
parents: 2269
diff changeset
319 avcodec_set_dimensions(avctx, s->width, s->height);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
320 }
2837
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
321 s1->pict_type= s->pict_type;
1614
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
322 pc->first_picture = 0;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
323 return ret;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
324 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
325
2024
f65d87bfdd5a some of the warning fixes by (Michael Roitzsch <mroi at users dot sourceforge dot net>)
michael
parents: 1988
diff changeset
326 static int mpeg4video_parse_init(AVCodecParserContext *s)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
327 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
328 ParseContext1 *pc = s->priv_data;
1614
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
329
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
330 pc->enc = av_mallocz(sizeof(MpegEncContext));
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
331 if (!pc->enc)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
332 return -1;
1614
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
333 pc->first_picture = 1;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
334 return 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
335 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
336
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
337 static int mpeg4video_parse(AVCodecParserContext *s,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
338 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
339 uint8_t **poutbuf, int *poutbuf_size,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
340 const uint8_t *buf, int buf_size)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
341 {
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
342 ParseContext *pc = s->priv_data;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
343 int next;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
344
2837
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
345 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
346 next= buf_size;
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
347 }else{
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
348 next= ff_mpeg4_find_frame_end(pc, buf, buf_size);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
349
2837
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
350 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
351 *poutbuf = NULL;
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
352 *poutbuf_size = 0;
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
353 return buf_size;
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
354 }
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
355 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
356 av_mpeg4_decode_header(s, avctx, buf, buf_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
357
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
358 *poutbuf = (uint8_t *)buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
359 *poutbuf_size = buf_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
360 return next;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
361 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
362 #endif
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
363
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
364 #ifdef CONFIG_CAVSVIDEO_PARSER
3395
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
365 static int cavsvideo_parse(AVCodecParserContext *s,
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
366 AVCodecContext *avctx,
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
367 uint8_t **poutbuf, int *poutbuf_size,
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
368 const uint8_t *buf, int buf_size)
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
369 {
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
370 ParseContext *pc = s->priv_data;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
371 int next;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
372
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
373 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
374 next= buf_size;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
375 }else{
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
376 next= ff_cavs_find_frame_end(pc, buf, buf_size);
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
377
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
378 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
379 *poutbuf = NULL;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
380 *poutbuf_size = 0;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
381 return buf_size;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
382 }
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
383 }
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
384 *poutbuf = (uint8_t *)buf;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
385 *poutbuf_size = buf_size;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
386 return next;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
387 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
388 #endif /* CONFIG_CAVSVIDEO_PARSER */
3395
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
389
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
390 static int mpeg4video_split(AVCodecContext *avctx,
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
391 const uint8_t *buf, int buf_size)
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
392 {
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
393 int i;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
394 uint32_t state= -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
395
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
396 for(i=0; i<buf_size; i++){
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
397 state= (state<<8) | buf[i];
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
398 if(state == 0x1B3 || state == 0x1B6)
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
399 return i-3;
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
400 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
401 return 0;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
402 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
403
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
404 /*************************/
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
405
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
406 #ifdef CONFIG_MPEGAUDIO_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
407 typedef struct MpegAudioParseContext {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
408 uint8_t inbuf[MPA_MAX_CODED_FRAME_SIZE]; /* input buffer */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
409 uint8_t *inbuf_ptr;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
410 int frame_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
411 int free_format_frame_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
412 int free_format_next_header;
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
413 uint32_t header;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
414 int header_count;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
415 } MpegAudioParseContext;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
416
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
417 #define MPA_HEADER_SIZE 4
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
418
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
419 /* header + layer + bitrate + freq + lsf/mpeg25 */
2522
e25782262d7d kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents: 2486
diff changeset
420 #undef SAME_HEADER_MASK /* mpegaudio.h defines different version */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
421 #define SAME_HEADER_MASK \
2480
5252700f61df 10000l vbr mp3 fix
michael
parents: 2470
diff changeset
422 (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
423
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
424 static int mpegaudio_parse_init(AVCodecParserContext *s1)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
425 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
426 MpegAudioParseContext *s = s1->priv_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
427 s->inbuf_ptr = s->inbuf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
428 return 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
429 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
430
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
431 static int mpegaudio_parse(AVCodecParserContext *s1,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
432 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
433 uint8_t **poutbuf, int *poutbuf_size,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
434 const uint8_t *buf, int buf_size)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
435 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
436 MpegAudioParseContext *s = s1->priv_data;
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
437 int len, ret, sr;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
438 uint32_t header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
439 const uint8_t *buf_ptr;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
440
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
441 *poutbuf = NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
442 *poutbuf_size = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
443 buf_ptr = buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
444 while (buf_size > 0) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
445 len = s->inbuf_ptr - s->inbuf;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
446 if (s->frame_size == 0) {
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
447 /* special case for next header for first frame in free
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
448 format case (XXX: find a simpler method) */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
449 if (s->free_format_next_header != 0) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
450 s->inbuf[0] = s->free_format_next_header >> 24;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
451 s->inbuf[1] = s->free_format_next_header >> 16;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
452 s->inbuf[2] = s->free_format_next_header >> 8;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
453 s->inbuf[3] = s->free_format_next_header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
454 s->inbuf_ptr = s->inbuf + 4;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
455 s->free_format_next_header = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
456 goto got_header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
457 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
458 /* no header seen : find one. We need at least MPA_HEADER_SIZE
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
459 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
460 len = FFMIN(MPA_HEADER_SIZE - len, buf_size);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
461 if (len > 0) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
462 memcpy(s->inbuf_ptr, buf_ptr, len);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
463 buf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
464 buf_size -= len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
465 s->inbuf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
466 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
467 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) {
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
468 got_header:
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
469 header = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
470 (s->inbuf[2] << 8) | s->inbuf[3];
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
471
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
472 ret = mpa_decode_header(avctx, header, &sr);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
473 if (ret < 0) {
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
474 s->header_count= -2;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
475 /* no sync found : move by one byte (inefficient, but simple!) */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
476 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
477 s->inbuf_ptr--;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
478 dprintf("skip %x\n", header);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
479 /* reset free format frame size to give a chance
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
480 to get a new bitrate */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
481 s->free_format_frame_size = 0;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
482 } else {
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
483 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
484 s->header_count= -3;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
485 s->header= header;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
486 s->header_count++;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
487 s->frame_size = ret;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
488
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
489 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
490 /* free format: prepare to compute frame size */
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
491 if (decode_header(s, header) == 1) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
492 s->frame_size = -1;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
493 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
494 #endif
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
495 }
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
496 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
497 avctx->sample_rate= sr;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
498 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
499 } else
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
500 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
501 if (s->frame_size == -1) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
502 /* free format : find next sync to compute frame size */
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
503 len = MPA_MAX_CODED_FRAME_SIZE - len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
504 if (len > buf_size)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
505 len = buf_size;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
506 if (len == 0) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
507 /* frame too long: resync */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
508 s->frame_size = 0;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
509 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
510 s->inbuf_ptr--;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
511 } else {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
512 uint8_t *p, *pend;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
513 uint32_t header1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
514 int padding;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
515
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
516 memcpy(s->inbuf_ptr, buf_ptr, len);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
517 /* check for header */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
518 p = s->inbuf_ptr - 3;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
519 pend = s->inbuf_ptr + len - 4;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
520 while (p <= pend) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
521 header = (p[0] << 24) | (p[1] << 16) |
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
522 (p[2] << 8) | p[3];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
523 header1 = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
524 (s->inbuf[2] << 8) | s->inbuf[3];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
525 /* check with high probability that we have a
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
526 valid header */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
527 if ((header & SAME_HEADER_MASK) ==
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
528 (header1 & SAME_HEADER_MASK)) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
529 /* header found: update pointers */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
530 len = (p + 4) - s->inbuf_ptr;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
531 buf_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 s->inbuf_ptr = p;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
534 /* compute frame size */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
535 s->free_format_next_header = header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
536 s->free_format_frame_size = s->inbuf_ptr - s->inbuf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
537 padding = (header1 >> 9) & 1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
538 if (s->layer == 1)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
539 s->free_format_frame_size -= padding * 4;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
540 else
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
541 s->free_format_frame_size -= padding;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
542 dprintf("free frame size=%d padding=%d\n",
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
543 s->free_format_frame_size, padding);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
544 decode_header(s, header1);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
545 goto next_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
546 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
547 p++;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
548 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
549 /* not found: simply increase pointers */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
550 buf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
551 s->inbuf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
552 buf_size -= len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
553 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
554 } else
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
555 #endif
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
556 if (len < s->frame_size) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
557 if (s->frame_size > MPA_MAX_CODED_FRAME_SIZE)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
558 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
559 len = FFMIN(s->frame_size - len, buf_size);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
560 memcpy(s->inbuf_ptr, buf_ptr, len);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
561 buf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
562 s->inbuf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
563 buf_size -= len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
564 }
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
565
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
566 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
567 && 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
568 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
569 *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
570 *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
571 }
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
572 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
573 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
574 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
575 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
576 }
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
577
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
578 // next_data:
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
579 if (s->frame_size > 0 &&
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
580 (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
581 if(s->header_count > 0){
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
582 *poutbuf = s->inbuf;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
583 *poutbuf_size = s->inbuf_ptr - s->inbuf;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
584 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
585 s->inbuf_ptr = s->inbuf;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
586 s->frame_size = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
587 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
588 }
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
589 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
590 return buf_ptr - buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
591 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
592 #endif /* CONFIG_MPEGAUDIO_PARSER */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
593
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
594 #if defined(CONFIG_AC3_PARSER) || defined(CONFIG_AAC_PARSER)
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
595 /* also used for ADTS AAC */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
596 typedef struct AC3ParseContext {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
597 uint8_t *inbuf_ptr;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
598 int frame_size;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
599 int header_size;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
600 int (*sync)(const uint8_t *buf, int *channels, int *sample_rate,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
601 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
602 uint8_t inbuf[8192]; /* input buffer */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
603 } AC3ParseContext;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
604
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
605 #define AC3_HEADER_SIZE 7
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
606 #define AAC_HEADER_SIZE 7
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
607
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
608 #ifdef CONFIG_AC3_PARSER
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
609 static const int ac3_sample_rates[4] = {
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
610 48000, 44100, 32000, 0
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
611 };
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
612
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
613 static const int ac3_frame_sizes[64][3] = {
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
614 { 64, 69, 96 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
615 { 64, 70, 96 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
616 { 80, 87, 120 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
617 { 80, 88, 120 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
618 { 96, 104, 144 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
619 { 96, 105, 144 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
620 { 112, 121, 168 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
621 { 112, 122, 168 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
622 { 128, 139, 192 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
623 { 128, 140, 192 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
624 { 160, 174, 240 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
625 { 160, 175, 240 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
626 { 192, 208, 288 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
627 { 192, 209, 288 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
628 { 224, 243, 336 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
629 { 224, 244, 336 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
630 { 256, 278, 384 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
631 { 256, 279, 384 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
632 { 320, 348, 480 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
633 { 320, 349, 480 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
634 { 384, 417, 576 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
635 { 384, 418, 576 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
636 { 448, 487, 672 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
637 { 448, 488, 672 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
638 { 512, 557, 768 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
639 { 512, 558, 768 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
640 { 640, 696, 960 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
641 { 640, 697, 960 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
642 { 768, 835, 1152 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
643 { 768, 836, 1152 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
644 { 896, 975, 1344 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
645 { 896, 976, 1344 },
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
646 { 1024, 1114, 1536 },
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
647 { 1024, 1115, 1536 },
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
648 { 1152, 1253, 1728 },
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
649 { 1152, 1254, 1728 },
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
650 { 1280, 1393, 1920 },
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
651 { 1280, 1394, 1920 },
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
652 };
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
653
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
654 static const int ac3_bitrates[64] = {
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
655 32, 32, 40, 40, 48, 48, 56, 56, 64, 64, 80, 80, 96, 96, 112, 112,
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
656 128, 128, 160, 160, 192, 192, 224, 224, 256, 256, 320, 320, 384,
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
657 384, 448, 448, 512, 512, 576, 576, 640, 640,
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
658 };
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
659
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
660 static const int ac3_channels[8] = {
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
661 2, 1, 2, 3, 3, 4, 4, 5
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
662 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
663 #endif /* CONFIG_AC3_PARSER */
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
664
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
665 #ifdef CONFIG_AAC_PARSER
3456
fa0b285144f0 make some tables const
mru
parents: 3455
diff changeset
666 static const int aac_sample_rates[16] = {
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
667 96000, 88200, 64000, 48000, 44100, 32000,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
668 24000, 22050, 16000, 12000, 11025, 8000, 7350
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
669 };
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
670
3456
fa0b285144f0 make some tables const
mru
parents: 3455
diff changeset
671 static const int aac_channels[8] = {
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
672 0, 1, 2, 3, 4, 5, 6, 8
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
673 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
674 #endif
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
675
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
676 #ifdef CONFIG_AC3_PARSER
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
677 static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
678 int *bit_rate, int *samples)
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
679 {
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
680 unsigned int fscod, frmsizecod, acmod, bsid, lfeon;
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
681 GetBitContext bits;
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
682
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
683 init_get_bits(&bits, buf, AC3_HEADER_SIZE * 8);
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
684
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
685 if(get_bits(&bits, 16) != 0x0b77)
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
686 return 0;
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
687
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
688 skip_bits(&bits, 16); /* crc */
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
689 fscod = get_bits(&bits, 2);
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
690 frmsizecod = get_bits(&bits, 6);
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
691
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
692 if(!ac3_sample_rates[fscod])
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
693 return 0;
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
694
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
695 bsid = get_bits(&bits, 5);
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
696 if(bsid > 8)
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
697 return 0;
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
698 skip_bits(&bits, 3); /* bsmod */
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
699 acmod = get_bits(&bits, 3);
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
700 if(acmod & 1 && acmod != 1)
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
701 skip_bits(&bits, 2); /* cmixlev */
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
702 if(acmod & 4)
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
703 skip_bits(&bits, 2); /* surmixlev */
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
704 if(acmod & 2)
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
705 skip_bits(&bits, 2); /* dsurmod */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
706 lfeon = get_bits1(&bits);
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
707
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
708 *sample_rate = ac3_sample_rates[fscod];
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
709 *bit_rate = ac3_bitrates[frmsizecod] * 1000;
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
710 *channels = ac3_channels[acmod] + lfeon;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
711 *samples = 6 * 256;
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
712
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
713 return ac3_frame_sizes[frmsizecod][fscod] * 2;
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
714 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
715 #endif /* CONFIG_AC3_PARSER */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
716
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
717 #ifdef CONFIG_AAC_PARSER
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
718 static int aac_sync(const uint8_t *buf, int *channels, int *sample_rate,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
719 int *bit_rate, int *samples)
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
720 {
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
721 GetBitContext bits;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
722 int size, rdb, ch, sr;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
723
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
724 init_get_bits(&bits, buf, AAC_HEADER_SIZE * 8);
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
725
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
726 if(get_bits(&bits, 12) != 0xfff)
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
727 return 0;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
728
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
729 skip_bits1(&bits); /* id */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
730 skip_bits(&bits, 2); /* layer */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
731 skip_bits1(&bits); /* protection_absent */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
732 skip_bits(&bits, 2); /* profile_objecttype */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
733 sr = get_bits(&bits, 4); /* sample_frequency_index */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
734 if(!aac_sample_rates[sr])
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
735 return 0;
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
736 skip_bits1(&bits); /* private_bit */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
737 ch = get_bits(&bits, 3); /* channel_configuration */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
738 if(!aac_channels[ch])
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
739 return 0;
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
740 skip_bits1(&bits); /* original/copy */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
741 skip_bits1(&bits); /* home */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
742
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
743 /* adts_variable_header */
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
744 skip_bits1(&bits); /* copyright_identification_bit */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
745 skip_bits1(&bits); /* copyright_identification_start */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
746 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
747 skip_bits(&bits, 11); /* adts_buffer_fullness */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
748 rdb = get_bits(&bits, 2); /* number_of_raw_data_blocks_in_frame */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
749
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
750 *channels = aac_channels[ch];
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
751 *sample_rate = aac_sample_rates[sr];
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
752 *samples = (rdb + 1) * 1024;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
753 *bit_rate = size * 8 * *sample_rate / *samples;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
754
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
755 return size;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
756 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
757 #endif /* CONFIG_AAC_PARSER */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
758
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
759 #ifdef CONFIG_AC3_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
760 static int ac3_parse_init(AVCodecParserContext *s1)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
761 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
762 AC3ParseContext *s = s1->priv_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
763 s->inbuf_ptr = s->inbuf;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
764 s->header_size = AC3_HEADER_SIZE;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
765 s->sync = ac3_sync;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
766 return 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
767 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
768 #endif
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
769
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
770 #ifdef CONFIG_AAC_PARSER
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
771 static int aac_parse_init(AVCodecParserContext *s1)
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
772 {
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
773 AC3ParseContext *s = s1->priv_data;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
774 s->inbuf_ptr = s->inbuf;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
775 s->header_size = AAC_HEADER_SIZE;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
776 s->sync = aac_sync;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
777 return 0;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
778 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
779 #endif
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
780
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
781 /* also used for ADTS AAC */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
782 static int ac3_parse(AVCodecParserContext *s1,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
783 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
784 uint8_t **poutbuf, int *poutbuf_size,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
785 const uint8_t *buf, int buf_size)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
786 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
787 AC3ParseContext *s = s1->priv_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
788 const uint8_t *buf_ptr;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
789 int len, sample_rate, bit_rate, channels, samples;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
790
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
791 *poutbuf = NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
792 *poutbuf_size = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
793
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
794 buf_ptr = buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
795 while (buf_size > 0) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
796 len = s->inbuf_ptr - s->inbuf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
797 if (s->frame_size == 0) {
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
798 /* no header seen : find one. We need at least s->header_size
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
799 bytes to parse it */
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
800 len = FFMIN(s->header_size - len, buf_size);
3082
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
801
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
802 memcpy(s->inbuf_ptr, buf_ptr, len);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
803 buf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
804 s->inbuf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
805 buf_size -= len;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
806 if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
807 len = s->sync(s->inbuf, &channels, &sample_rate, &bit_rate,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
808 &samples);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
809 if (len == 0) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
810 /* no sync found : move by one byte (inefficient, but simple!) */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
811 memmove(s->inbuf, s->inbuf + 1, s->header_size - 1);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
812 s->inbuf_ptr--;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
813 } else {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
814 s->frame_size = len;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
815 /* update codec info */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
816 avctx->sample_rate = sample_rate;
1987
d9e067853051 >2 channels decoding fix
michael
parents: 1696
diff changeset
817 /* 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
818 if(avctx->codec_id == CODEC_ID_AC3){
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
819 if(avctx->channels!=1 && avctx->channels!=2){
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
820 avctx->channels = channels;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
821 }
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
822 } else {
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
823 avctx->channels = channels;
1987
d9e067853051 >2 channels decoding fix
michael
parents: 1696
diff changeset
824 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
825 avctx->bit_rate = bit_rate;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
826 avctx->frame_size = samples;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
827 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
828 }
3082
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
829 } else {
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
830 len = FFMIN(s->frame_size - len, buf_size);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
831
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
832 memcpy(s->inbuf_ptr, buf_ptr, len);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
833 buf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
834 s->inbuf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
835 buf_size -= len;
3082
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
836
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
837 if(s->inbuf_ptr - s->inbuf == s->frame_size){
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
838 *poutbuf = s->inbuf;
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
839 *poutbuf_size = s->frame_size;
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
840 s->inbuf_ptr = s->inbuf;
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
841 s->frame_size = 0;
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
842 break;
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
843 }
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
844 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
845 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
846 return buf_ptr - buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
847 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
848 #endif /* CONFIG_AC3_PARSER || CONFIG_AAC_PARSER */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
849
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
850 #ifdef CONFIG_MPEG4VIDEO_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
851 AVCodecParser mpeg4video_parser = {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
852 { CODEC_ID_MPEG4 },
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
853 sizeof(ParseContext1),
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
854 mpeg4video_parse_init,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
855 mpeg4video_parse,
4150
2205aefb22b7 move AVCodecParser prototypes and definitions to parser.h, and move mpegvideo parser to mpeg12.c
bcoudurier
parents: 4146
diff changeset
856 ff_parse1_close,
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
857 mpeg4video_split,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
858 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
859 #endif
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
860 #ifdef CONFIG_CAVSVIDEO_PARSER
3395
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
861 AVCodecParser cavsvideo_parser = {
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
862 { CODEC_ID_CAVS },
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
863 sizeof(ParseContext1),
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
864 NULL,
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
865 cavsvideo_parse,
4150
2205aefb22b7 move AVCodecParser prototypes and definitions to parser.h, and move mpegvideo parser to mpeg12.c
bcoudurier
parents: 4146
diff changeset
866 ff_parse1_close,
3395
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
867 mpeg4video_split,
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
868 };
3432
ab49baf4adad Fix compilation with --disable-decoders.
diego
parents: 3421
diff changeset
869 #endif
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
870 #ifdef CONFIG_MPEGAUDIO_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
871 AVCodecParser mpegaudio_parser = {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
872 { CODEC_ID_MP2, CODEC_ID_MP3 },
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
873 sizeof(MpegAudioParseContext),
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
874 mpegaudio_parse_init,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
875 mpegaudio_parse,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
876 NULL,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
877 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
878 #endif
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
879 #ifdef CONFIG_AC3_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
880 AVCodecParser ac3_parser = {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
881 { CODEC_ID_AC3 },
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
882 sizeof(AC3ParseContext),
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
883 ac3_parse_init,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
884 ac3_parse,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
885 NULL,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
886 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
887 #endif
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
888 #ifdef CONFIG_AAC_PARSER
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
889 AVCodecParser aac_parser = {
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
890 { CODEC_ID_AAC },
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
891 sizeof(AC3ParseContext),
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
892 aac_parse_init,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
893 ac3_parse,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
894 NULL,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
895 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
896 #endif