annotate parser.c @ 4714:fc70a43a4f01 libavcodec

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