annotate parser.c @ 3995:b00c06477dff libavcodec

write cabac low and range variables as early as possible to prevent stalls from reading them before they where written, the P4 is said to disslike that alot, on P3 its 2% faster (START/STOP_TIMER over decode_residual)
author michael
date Wed, 11 Oct 2006 16:11:41 +0000
parents eddcc352c0dc
children 04ff8026d9c0
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"
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
25
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
26 AVCodecParser *av_first_parser = NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
27
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
28 void av_register_codec_parser(AVCodecParser *parser)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
29 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
30 parser->next = av_first_parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
31 av_first_parser = parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
32 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
33
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
34 AVCodecParserContext *av_parser_init(int codec_id)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
35 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
36 AVCodecParserContext *s;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
37 AVCodecParser *parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
38 int ret;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
39
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
40 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
41 return NULL;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
42
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
43 for(parser = av_first_parser; parser != NULL; parser = parser->next) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
44 if (parser->codec_ids[0] == codec_id ||
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
45 parser->codec_ids[1] == codec_id ||
2348
d02fb928ca44 pnm parser
michael
parents: 2270
diff changeset
46 parser->codec_ids[2] == codec_id ||
d02fb928ca44 pnm parser
michael
parents: 2270
diff changeset
47 parser->codec_ids[3] == codec_id ||
d02fb928ca44 pnm parser
michael
parents: 2270
diff changeset
48 parser->codec_ids[4] == codec_id)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
49 goto found;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
50 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
51 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
52 found:
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
53 s = av_mallocz(sizeof(AVCodecParserContext));
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
54 if (!s)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
55 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
56 s->parser = parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
57 s->priv_data = av_mallocz(parser->priv_data_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
58 if (!s->priv_data) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
59 av_free(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
60 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
61 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
62 if (parser->parser_init) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
63 ret = parser->parser_init(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
64 if (ret != 0) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
65 av_free(s->priv_data);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
66 av_free(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
67 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
68 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
69 }
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
70 s->fetch_timestamp=1;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
71 return s;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
72 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
73
3989
michael
parents: 3947
diff changeset
74 /**
michael
parents: 3947
diff changeset
75 *
michael
parents: 3947
diff changeset
76 * @param buf input
michael
parents: 3947
diff changeset
77 * @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
78 * @param pts input presentation timestamp
michael
parents: 3947
diff changeset
79 * @param dts input decoding timestamp
michael
parents: 3947
diff changeset
80 * @param poutbuf will contain a pointer to the first byte of the output frame
michael
parents: 3947
diff changeset
81 * @param poutbuf_size will contain the length of the output frame
michael
parents: 3947
diff changeset
82 * @return the number of bytes of the input bitstream used
michael
parents: 3947
diff changeset
83 *
michael
parents: 3947
diff changeset
84 * Example:
michael
parents: 3947
diff changeset
85 * @code
michael
parents: 3947
diff changeset
86 * while(in_len){
michael
parents: 3947
diff changeset
87 * len = av_parser_parse(myparser, AVCodecContext, &data, &size,
michael
parents: 3947
diff changeset
88 * in_data, in_len,
michael
parents: 3947
diff changeset
89 * pts, dts);
michael
parents: 3947
diff changeset
90 * in_data += len;
michael
parents: 3947
diff changeset
91 * in_len -= len;
michael
parents: 3947
diff changeset
92 *
michael
parents: 3947
diff changeset
93 * decode_frame(data, size);
michael
parents: 3947
diff changeset
94 * }
michael
parents: 3947
diff changeset
95 * @endcode
michael
parents: 3947
diff changeset
96 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
97 int av_parser_parse(AVCodecParserContext *s,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
98 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
99 uint8_t **poutbuf, int *poutbuf_size,
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
100 const uint8_t *buf, int buf_size,
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
101 int64_t pts, int64_t dts)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
102 {
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
103 int index, i, k;
1694
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
104 uint8_t dummy_buf[FF_INPUT_BUFFER_PADDING_SIZE];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
105
1694
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
106 if (buf_size == 0) {
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
107 /* 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
108 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
109 buf = dummy_buf;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
110 } else {
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
111 /* add a new packet descriptor */
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
112 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
113 s->cur_frame_start_index = k;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
114 s->cur_frame_offset[k] = s->cur_offset;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
115 s->cur_frame_pts[k] = pts;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
116 s->cur_frame_dts[k] = dts;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
117
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
118 /* fill first PTS/DTS */
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
119 if (s->fetch_timestamp){
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
120 s->fetch_timestamp=0;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
121 s->last_pts = pts;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
122 s->last_dts = dts;
2107
bec4623c2201 timestamp duplication bugfix
michael
parents: 2030
diff changeset
123 s->cur_frame_pts[k] =
bec4623c2201 timestamp duplication bugfix
michael
parents: 2030
diff changeset
124 s->cur_frame_dts[k] = AV_NOPTS_VALUE;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
125 }
1694
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
126 }
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
127
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
128 /* WARNING: the returned index can be negative */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
129 index = s->parser->parser_parse(s, avctx, poutbuf, poutbuf_size, buf, buf_size);
2107
bec4623c2201 timestamp duplication bugfix
michael
parents: 2030
diff changeset
130 //av_log(NULL, AV_LOG_DEBUG, "parser: in:%lld, %lld, out:%lld, %lld, 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
131 /* update the file pointer */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
132 if (*poutbuf_size) {
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
133 /* fill the data for the current frame */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
134 s->frame_offset = s->last_frame_offset;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
135 s->pts = s->last_pts;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
136 s->dts = s->last_dts;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
137
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
138 /* offset of the next frame */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
139 s->last_frame_offset = s->cur_offset + index;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
140 /* find the packet in which the new frame starts. It
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
141 is tricky because of MPEG video start codes
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
142 which can begin in one packet and finish in
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
143 another packet. In the worst case, an MPEG
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
144 video start code could be in 4 different
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
145 packets. */
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
146 k = s->cur_frame_start_index;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
147 for(i = 0; i < AV_PARSER_PTS_NB; i++) {
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
148 if (s->last_frame_offset >= s->cur_frame_offset[k])
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
149 break;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
150 k = (k - 1) & (AV_PARSER_PTS_NB - 1);
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
151 }
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
152
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
153 s->last_pts = s->cur_frame_pts[k];
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
154 s->last_dts = s->cur_frame_dts[k];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
155
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
156 /* 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
157 so the next pts/dts is in the next chunk */
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
158 if(index == buf_size){
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
159 s->fetch_timestamp=1;
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
160 }
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
161 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
162 if (index < 0)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
163 index = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
164 s->cur_offset += index;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
165 return index;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
166 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
167
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
168 /**
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
169 *
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
170 * @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
171 * @deprecated use AVBitstreamFilter
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
172 */
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
173 int av_parser_change(AVCodecParserContext *s,
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
174 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
175 uint8_t **poutbuf, int *poutbuf_size,
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
176 const uint8_t *buf, int buf_size, int keyframe){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
177
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
178 if(s && s->parser->split){
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
179 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
180 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
181 buf += i;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
182 buf_size -= i;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
183 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
184 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
185
2864
95bac7109ff0 Kill some compiler warnings. Compiled code verified identical after changes.
mru
parents: 2846
diff changeset
186 /* cast to avoid warning about discarding qualifiers */
95bac7109ff0 Kill some compiler warnings. Compiled code verified identical after changes.
mru
parents: 2846
diff changeset
187 *poutbuf= (uint8_t *) buf;
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
188 *poutbuf_size= buf_size;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
189 if(avctx->extradata){
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
190 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
191 /*||(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
192 /*||(? && (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
193 int size= buf_size + avctx->extradata_size;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
194 *poutbuf_size= size;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
195 *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
196
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
197 memcpy(*poutbuf, avctx->extradata, avctx->extradata_size);
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
198 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
199 return 1;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
200 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
201 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
202
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
203 return 0;
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
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
206 void av_parser_close(AVCodecParserContext *s)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
207 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
208 if (s->parser->parser_close)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
209 s->parser->parser_close(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
210 av_free(s->priv_data);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
211 av_free(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
212 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
213
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
214 /*****************************************************/
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
215
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
216 //#define END_NOT_FOUND (-100)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
217
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
218 #define PICTURE_START_CODE 0x00000100
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
219 #define SEQ_START_CODE 0x000001b3
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
220 #define EXT_START_CODE 0x000001b5
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
221 #define SLICE_MIN_START_CODE 0x00000101
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
222 #define SLICE_MAX_START_CODE 0x000001af
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
223
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
224 typedef struct ParseContext1{
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
225 ParseContext pc;
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
226 /* XXX/FIXME PC1 vs. PC */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
227 /* MPEG2 specific */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
228 int frame_rate;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
229 int progressive_sequence;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
230 int width, height;
1614
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
231
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
232 /* XXX: suppress that, needed by MPEG4 */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
233 MpegEncContext *enc;
1614
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
234 int first_picture;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
235 } ParseContext1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
236
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
237 /**
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
238 * combines the (truncated) bitstream to a complete frame
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
239 * @returns -1 if no complete frame could be created
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
240 */
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
241 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
242 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
243 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
244 if(pc->overread){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
245 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
246 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
247 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
248 #endif
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
249
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
250 /* copy overreaded bytes from last frame into buffer */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
251 for(; pc->overread>0; pc->overread--){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
252 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
253 }
2386
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
254
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
255 /* flush remaining if EOF */
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
256 if(!*buf_size && next == END_NOT_FOUND){
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
257 next= 0;
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
258 }
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
259
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
260 pc->last_index= pc->index;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
261
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
262 /* copy into buffer end return */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
263 if(next == END_NOT_FOUND){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
264 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
265
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
266 memcpy(&pc->buffer[pc->index], *buf, *buf_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
267 pc->index += *buf_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
268 return -1;
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 *buf_size=
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
272 pc->overread_index= pc->index + next;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
273
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
274 /* append to buffer */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
275 if(pc->index){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
276 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
277
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
278 memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
279 pc->index = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
280 *buf= pc->buffer;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
281 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
282
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
283 /* store overread bytes */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
284 for(;next < 0; next++){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
285 pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
286 pc->overread++;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
287 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
288
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
289 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
290 if(pc->overread){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
291 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
292 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
293 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
294 #endif
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
295
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
296 return 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
297 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
298
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
299 /* XXX: merge with libavcodec ? */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
300 #define MPEG1_FRAME_RATE_BASE 1001
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
301
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
302 static const int frame_rate_tab[16] = {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
303 0,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
304 24000,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
305 24024,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
306 25025,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
307 30000,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
308 30030,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
309 50050,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
310 60000,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
311 60060,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
312 // Xing's 15fps: (9)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
313 15015,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
314 // libmpeg3's "Unofficial economy rates": (10-13)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
315 5005,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
316 10010,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
317 12012,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
318 15015,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
319 // random, just to avoid segfault !never encode these
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
320 25025,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
321 25025,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
322 };
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
323
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
324 #ifdef CONFIG_MPEGVIDEO_PARSER
2637
ef44d24680d1 switch to native time bases
michael
parents: 2565
diff changeset
325 //FIXME move into mpeg12.c
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
326 static void mpegvideo_extract_headers(AVCodecParserContext *s,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
327 AVCodecContext *avctx,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
328 const uint8_t *buf, int buf_size)
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;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
331 const uint8_t *buf_end;
3776
1843a85123b7 fix some signedness warnings
mru
parents: 3639
diff changeset
332 uint32_t start_code;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
333 int frame_rate_index, ext_type, bytes_left;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
334 int frame_rate_ext_n, frame_rate_ext_d;
2119
f8948ed6553a field pic timestamp fix
michael
parents: 2107
diff changeset
335 int picture_structure, top_field_first, repeat_first_field, progressive_frame;
2539
1fefaaee0fdc mpeg-es bitrate parsing
michael
parents: 2522
diff changeset
336 int horiz_size_ext, vert_size_ext, bit_rate_ext;
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
337 //FIXME replace the crap with get_bits()
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
338 s->repeat_pict = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
339 buf_end = buf + buf_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
340 while (buf < buf_end) {
3086
befacb1cb573 faster find_startcode()
michael
parents: 3082
diff changeset
341 start_code= -1;
befacb1cb573 faster find_startcode()
michael
parents: 3082
diff changeset
342 buf= ff_find_start_code(buf, buf_end, &start_code);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
343 bytes_left = buf_end - buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
344 switch(start_code) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
345 case PICTURE_START_CODE:
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
346 if (bytes_left >= 2) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
347 s->pict_type = (buf[1] >> 3) & 7;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
348 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
349 break;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
350 case SEQ_START_CODE:
2539
1fefaaee0fdc mpeg-es bitrate parsing
michael
parents: 2522
diff changeset
351 if (bytes_left >= 7) {
2269
535b7dfee202 lowres fixes for the parser
michael
parents: 2120
diff changeset
352 pc->width = (buf[0] << 4) | (buf[1] >> 4);
535b7dfee202 lowres fixes for the parser
michael
parents: 2120
diff changeset
353 pc->height = ((buf[1] & 0x0f) << 8) | buf[2];
2270
21f450be6cb5 lowres width/height cleanup 3rd try
michael
parents: 2269
diff changeset
354 avcodec_set_dimensions(avctx, pc->width, pc->height);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
355 frame_rate_index = buf[3] & 0xf;
2637
ef44d24680d1 switch to native time bases
michael
parents: 2565
diff changeset
356 pc->frame_rate = avctx->time_base.den = frame_rate_tab[frame_rate_index];
ef44d24680d1 switch to native time bases
michael
parents: 2565
diff changeset
357 avctx->time_base.num = MPEG1_FRAME_RATE_BASE;
2539
1fefaaee0fdc mpeg-es bitrate parsing
michael
parents: 2522
diff changeset
358 avctx->bit_rate = ((buf[4]<<10) | (buf[5]<<2) | (buf[6]>>6))*400;
1681
27a272442d6b fill codec info
bellard
parents: 1614
diff changeset
359 avctx->codec_id = CODEC_ID_MPEG1VIDEO;
27a272442d6b fill codec info
bellard
parents: 1614
diff changeset
360 avctx->sub_id = 1;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
361 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
362 break;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
363 case EXT_START_CODE:
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
364 if (bytes_left >= 1) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
365 ext_type = (buf[0] >> 4);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
366 switch(ext_type) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
367 case 0x1: /* sequence extension */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
368 if (bytes_left >= 6) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
369 horiz_size_ext = ((buf[1] & 1) << 1) | (buf[2] >> 7);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
370 vert_size_ext = (buf[2] >> 5) & 3;
2539
1fefaaee0fdc mpeg-es bitrate parsing
michael
parents: 2522
diff changeset
371 bit_rate_ext = ((buf[2] & 0x1F)<<7) | (buf[3]>>1);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
372 frame_rate_ext_n = (buf[5] >> 5) & 3;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
373 frame_rate_ext_d = (buf[5] & 0x1f);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
374 pc->progressive_sequence = buf[1] & (1 << 3);
2565
e7f2b8fadfb0 10l typo
michael
parents: 2539
diff changeset
375 avctx->has_b_frames= !(buf[5] >> 7);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
376
2269
535b7dfee202 lowres fixes for the parser
michael
parents: 2120
diff changeset
377 pc->width |=(horiz_size_ext << 12);
535b7dfee202 lowres fixes for the parser
michael
parents: 2120
diff changeset
378 pc->height |=( vert_size_ext << 12);
2539
1fefaaee0fdc mpeg-es bitrate parsing
michael
parents: 2522
diff changeset
379 avctx->bit_rate += (bit_rate_ext << 18) * 400;
2270
21f450be6cb5 lowres width/height cleanup 3rd try
michael
parents: 2269
diff changeset
380 avcodec_set_dimensions(avctx, pc->width, pc->height);
2637
ef44d24680d1 switch to native time bases
michael
parents: 2565
diff changeset
381 avctx->time_base.den = pc->frame_rate * (frame_rate_ext_n + 1);
ef44d24680d1 switch to native time bases
michael
parents: 2565
diff changeset
382 avctx->time_base.num = MPEG1_FRAME_RATE_BASE * (frame_rate_ext_d + 1);
1681
27a272442d6b fill codec info
bellard
parents: 1614
diff changeset
383 avctx->codec_id = CODEC_ID_MPEG2VIDEO;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
384 avctx->sub_id = 2; /* forces MPEG2 */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
385 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
386 break;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
387 case 0x8: /* picture coding extension */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
388 if (bytes_left >= 5) {
2120
872ac88d4e60 1000000l
michael
parents: 2119
diff changeset
389 picture_structure = buf[2]&3;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
390 top_field_first = buf[3] & (1 << 7);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
391 repeat_first_field = buf[3] & (1 << 1);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
392 progressive_frame = buf[4] & (1 << 7);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
393
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
394 /* check if we must repeat the frame */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
395 if (repeat_first_field) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
396 if (pc->progressive_sequence) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
397 if (top_field_first)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
398 s->repeat_pict = 4;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
399 else
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
400 s->repeat_pict = 2;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
401 } else if (progressive_frame) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
402 s->repeat_pict = 1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
403 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
404 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
405
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
406 /* the packet only represents half a frame
2119
f8948ed6553a field pic timestamp fix
michael
parents: 2107
diff changeset
407 XXX,FIXME maybe find a different solution */
f8948ed6553a field pic timestamp fix
michael
parents: 2107
diff changeset
408 if(picture_structure != 3)
f8948ed6553a field pic timestamp fix
michael
parents: 2107
diff changeset
409 s->repeat_pict = -1;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
410 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
411 break;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
412 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
413 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
414 break;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
415 case -1:
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
416 goto the_end;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
417 default:
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
418 /* we stop parsing when we encounter a slice. It ensures
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
419 that this function takes a negligible amount of time */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
420 if (start_code >= SLICE_MIN_START_CODE &&
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
421 start_code <= SLICE_MAX_START_CODE)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
422 goto the_end;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
423 break;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
424 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
425 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
426 the_end: ;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
427 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
428
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
429 static int mpegvideo_parse(AVCodecParserContext *s,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
430 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
431 uint8_t **poutbuf, int *poutbuf_size,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
432 const uint8_t *buf, int buf_size)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
433 {
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
434 ParseContext1 *pc1 = s->priv_data;
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
435 ParseContext *pc= &pc1->pc;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
436 int next;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
437
2837
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
438 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
439 next= buf_size;
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
440 }else{
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
441 next= ff_mpeg1_find_frame_end(pc, buf, buf_size);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
442
2837
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
443 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
444 *poutbuf = NULL;
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
445 *poutbuf_size = 0;
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
446 return buf_size;
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
447 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
448
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
449 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
450 /* we have a full frame : we just parse the first few MPEG headers
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
451 to have the full timing information. The time take by this
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
452 function should be negligible for uncorrupted streams */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
453 mpegvideo_extract_headers(s, avctx, buf, buf_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
454 #if 0
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
455 printf("pict_type=%d frame_rate=%0.3f repeat_pict=%d\n",
2637
ef44d24680d1 switch to native time bases
michael
parents: 2565
diff changeset
456 s->pict_type, (double)avctx->time_base.den / avctx->time_base.num, s->repeat_pict);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
457 #endif
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
458
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
459 *poutbuf = (uint8_t *)buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
460 *poutbuf_size = buf_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
461 return next;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
462 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
463
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
464 static int mpegvideo_split(AVCodecContext *avctx,
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
465 const uint8_t *buf, int buf_size)
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
466 {
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
467 int i;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
468 uint32_t state= -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
469
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
470 for(i=0; i<buf_size; i++){
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
471 state= (state<<8) | buf[i];
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
472 if(state != 0x1B3 && state != 0x1B5 && state < 0x200 && state >= 0x100)
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
473 return i-3;
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
474 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
475 return 0;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
476 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
477 #endif /* CONFIG_MPEGVIDEO_PARSER */
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
478
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
479 void ff_parse_close(AVCodecParserContext *s)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
480 {
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
481 ParseContext *pc = s->priv_data;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
482
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
483 av_free(pc->buffer);
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
484 }
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
485
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
486 static void parse1_close(AVCodecParserContext *s)
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
487 {
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
488 ParseContext1 *pc1 = s->priv_data;
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
489
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
490 av_free(pc1->pc.buffer);
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
491 av_free(pc1->enc);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
492 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
493
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
494 /*************************/
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
495
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
496 #ifdef CONFIG_MPEG4VIDEO_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
497 /* used by parser */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
498 /* XXX: make it use less memory */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
499 static int av_mpeg4_decode_header(AVCodecParserContext *s1,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
500 AVCodecContext *avctx,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
501 const uint8_t *buf, int buf_size)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
502 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
503 ParseContext1 *pc = s1->priv_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
504 MpegEncContext *s = pc->enc;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
505 GetBitContext gb1, *gb = &gb1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
506 int ret;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
507
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
508 s->avctx = avctx;
1614
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
509 s->current_picture_ptr = &s->current_picture;
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
510
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
511 if (avctx->extradata_size && pc->first_picture){
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
512 init_get_bits(gb, avctx->extradata, avctx->extradata_size*8);
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
513 ret = ff_mpeg4_decode_picture_header(s, gb);
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
514 }
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
515
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
516 init_get_bits(gb, buf, 8 * buf_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
517 ret = ff_mpeg4_decode_picture_header(s, gb);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
518 if (s->width) {
2270
21f450be6cb5 lowres width/height cleanup 3rd try
michael
parents: 2269
diff changeset
519 avcodec_set_dimensions(avctx, s->width, s->height);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
520 }
2837
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
521 s1->pict_type= s->pict_type;
1614
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
522 pc->first_picture = 0;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
523 return ret;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
524 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
525
2024
f65d87bfdd5a some of the warning fixes by (Michael Roitzsch <mroi at users dot sourceforge dot net>)
michael
parents: 1988
diff changeset
526 static int mpeg4video_parse_init(AVCodecParserContext *s)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
527 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
528 ParseContext1 *pc = s->priv_data;
1614
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
529
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
530 pc->enc = av_mallocz(sizeof(MpegEncContext));
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
531 if (!pc->enc)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
532 return -1;
1614
6c82ef97d3e6 also parse extradata for MPEG4
bellard
parents: 1613
diff changeset
533 pc->first_picture = 1;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
534 return 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
535 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
536
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
537 static int mpeg4video_parse(AVCodecParserContext *s,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
538 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
539 uint8_t **poutbuf, int *poutbuf_size,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
540 const uint8_t *buf, int buf_size)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
541 {
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
542 ParseContext *pc = s->priv_data;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
543 int next;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
544
2837
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
545 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
546 next= buf_size;
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
547 }else{
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
548 next= ff_mpeg4_find_frame_end(pc, buf, buf_size);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
549
2837
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
550 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
551 *poutbuf = NULL;
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
552 *poutbuf_size = 0;
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
553 return buf_size;
45ccf6842c34 parse pict_type for streams in avi
michael
parents: 2777
diff changeset
554 }
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
555 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
556 av_mpeg4_decode_header(s, avctx, buf, buf_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
557
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
558 *poutbuf = (uint8_t *)buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
559 *poutbuf_size = buf_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
560 return next;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
561 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
562 #endif
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
563
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
564 #ifdef CONFIG_CAVSVIDEO_PARSER
3395
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
565 static int cavsvideo_parse(AVCodecParserContext *s,
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
566 AVCodecContext *avctx,
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
567 uint8_t **poutbuf, int *poutbuf_size,
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
568 const uint8_t *buf, int buf_size)
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
569 {
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
570 ParseContext *pc = s->priv_data;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
571 int next;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
572
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
573 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
574 next= buf_size;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
575 }else{
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
576 next= ff_cavs_find_frame_end(pc, buf, buf_size);
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
577
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
578 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
579 *poutbuf = NULL;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
580 *poutbuf_size = 0;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
581 return buf_size;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
582 }
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
583 }
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
584 *poutbuf = (uint8_t *)buf;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
585 *poutbuf_size = buf_size;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
586 return next;
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
587 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
588 #endif /* CONFIG_CAVSVIDEO_PARSER */
3395
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
589
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
590 static int mpeg4video_split(AVCodecContext *avctx,
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
591 const uint8_t *buf, int buf_size)
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
592 {
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
593 int i;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
594 uint32_t state= -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
595
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
596 for(i=0; i<buf_size; i++){
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
597 state= (state<<8) | buf[i];
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
598 if(state == 0x1B3 || state == 0x1B6)
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
599 return i-3;
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
600 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
601 return 0;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
602 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
603
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
604 /*************************/
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
605
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
606 #ifdef CONFIG_MPEGAUDIO_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
607 typedef struct MpegAudioParseContext {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
608 uint8_t inbuf[MPA_MAX_CODED_FRAME_SIZE]; /* input buffer */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
609 uint8_t *inbuf_ptr;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
610 int frame_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
611 int free_format_frame_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
612 int free_format_next_header;
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
613 uint32_t header;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
614 int header_count;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
615 } MpegAudioParseContext;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
616
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
617 #define MPA_HEADER_SIZE 4
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
618
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
619 /* header + layer + bitrate + freq + lsf/mpeg25 */
2522
e25782262d7d kill warnings patch by (M?ns Rullg?rd <mru inprovide com>)
michael
parents: 2486
diff changeset
620 #undef SAME_HEADER_MASK /* mpegaudio.h defines different version */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
621 #define SAME_HEADER_MASK \
2480
5252700f61df 10000l vbr mp3 fix
michael
parents: 2470
diff changeset
622 (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
623
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
624 static int mpegaudio_parse_init(AVCodecParserContext *s1)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
625 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
626 MpegAudioParseContext *s = s1->priv_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
627 s->inbuf_ptr = s->inbuf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
628 return 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
629 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
630
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
631 static int mpegaudio_parse(AVCodecParserContext *s1,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
632 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
633 uint8_t **poutbuf, int *poutbuf_size,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
634 const uint8_t *buf, int buf_size)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
635 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
636 MpegAudioParseContext *s = s1->priv_data;
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
637 int len, ret, sr;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
638 uint32_t header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
639 const uint8_t *buf_ptr;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
640
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
641 *poutbuf = NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
642 *poutbuf_size = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
643 buf_ptr = buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
644 while (buf_size > 0) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
645 len = s->inbuf_ptr - s->inbuf;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
646 if (s->frame_size == 0) {
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
647 /* special case for next header for first frame in free
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
648 format case (XXX: find a simpler method) */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
649 if (s->free_format_next_header != 0) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
650 s->inbuf[0] = s->free_format_next_header >> 24;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
651 s->inbuf[1] = s->free_format_next_header >> 16;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
652 s->inbuf[2] = s->free_format_next_header >> 8;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
653 s->inbuf[3] = s->free_format_next_header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
654 s->inbuf_ptr = s->inbuf + 4;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
655 s->free_format_next_header = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
656 goto got_header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
657 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
658 /* no header seen : find one. We need at least MPA_HEADER_SIZE
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
659 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
660 len = FFMIN(MPA_HEADER_SIZE - len, buf_size);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
661 if (len > 0) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
662 memcpy(s->inbuf_ptr, buf_ptr, len);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
663 buf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
664 buf_size -= len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
665 s->inbuf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
666 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
667 if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) {
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
668 got_header:
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
669 sr= avctx->sample_rate;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
670 header = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
671 (s->inbuf[2] << 8) | s->inbuf[3];
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
672
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
673 ret = mpa_decode_header(avctx, header);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
674 if (ret < 0) {
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
675 s->header_count= -2;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
676 /* no sync found : move by one byte (inefficient, but simple!) */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
677 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
678 s->inbuf_ptr--;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
679 dprintf("skip %x\n", header);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
680 /* reset free format frame size to give a chance
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
681 to get a new bitrate */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
682 s->free_format_frame_size = 0;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
683 } else {
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
684 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
685 s->header_count= -3;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
686 s->header= header;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
687 s->header_count++;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
688 s->frame_size = ret;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
689
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
690 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
691 /* free format: prepare to compute frame size */
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
692 if (decode_header(s, header) == 1) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
693 s->frame_size = -1;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
694 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
695 #endif
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
696 }
2470
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
697 if(s->header_count <= 0)
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
698 avctx->sample_rate= sr; //FIXME ugly
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
699 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
700 } else
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
701 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
702 if (s->frame_size == -1) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
703 /* free format : find next sync to compute frame size */
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
704 len = MPA_MAX_CODED_FRAME_SIZE - len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
705 if (len > buf_size)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
706 len = buf_size;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
707 if (len == 0) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
708 /* frame too long: resync */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
709 s->frame_size = 0;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
710 memmove(s->inbuf, s->inbuf + 1, s->inbuf_ptr - s->inbuf - 1);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
711 s->inbuf_ptr--;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
712 } else {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
713 uint8_t *p, *pend;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
714 uint32_t header1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
715 int padding;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
716
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
717 memcpy(s->inbuf_ptr, buf_ptr, len);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
718 /* check for header */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
719 p = s->inbuf_ptr - 3;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
720 pend = s->inbuf_ptr + len - 4;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
721 while (p <= pend) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
722 header = (p[0] << 24) | (p[1] << 16) |
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
723 (p[2] << 8) | p[3];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
724 header1 = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) |
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
725 (s->inbuf[2] << 8) | s->inbuf[3];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
726 /* check with high probability that we have a
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
727 valid header */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
728 if ((header & SAME_HEADER_MASK) ==
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
729 (header1 & SAME_HEADER_MASK)) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
730 /* header found: update pointers */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
731 len = (p + 4) - s->inbuf_ptr;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
732 buf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
733 buf_size -= len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
734 s->inbuf_ptr = p;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
735 /* compute frame size */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
736 s->free_format_next_header = header;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
737 s->free_format_frame_size = s->inbuf_ptr - s->inbuf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
738 padding = (header1 >> 9) & 1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
739 if (s->layer == 1)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
740 s->free_format_frame_size -= padding * 4;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
741 else
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
742 s->free_format_frame_size -= padding;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
743 dprintf("free frame size=%d padding=%d\n",
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
744 s->free_format_frame_size, padding);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
745 decode_header(s, header1);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
746 goto next_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
747 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
748 p++;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
749 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
750 /* not found: simply increase pointers */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
751 buf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
752 s->inbuf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
753 buf_size -= len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
754 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
755 } else
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
756 #endif
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
757 if (len < s->frame_size) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
758 if (s->frame_size > MPA_MAX_CODED_FRAME_SIZE)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
759 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
760 len = FFMIN(s->frame_size - len, buf_size);
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
761 memcpy(s->inbuf_ptr, buf_ptr, len);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
762 buf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
763 s->inbuf_ptr += len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
764 buf_size -= len;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
765 }
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
766
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
767 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
768 && 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
769 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
770 *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
771 *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
772 }
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
773 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
774 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
775 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
776 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
777 }
949bc256f1e3 dont copy frame if the whole mp1/2/3 frame is available in one piece in the input
michael
parents: 3456
diff changeset
778
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
779 // next_data:
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
780 if (s->frame_size > 0 &&
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
781 (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
782 if(s->header_count > 0){
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
783 *poutbuf = s->inbuf;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
784 *poutbuf_size = s->inbuf_ptr - s->inbuf;
06aafb585f69 require a few valid and equal mp3 headers for resync
michael
parents: 2389
diff changeset
785 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
786 s->inbuf_ptr = s->inbuf;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
787 s->frame_size = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
788 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
789 }
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
790 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
791 return buf_ptr - buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
792 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
793 #endif /* CONFIG_MPEGAUDIO_PARSER */
1613
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 #if defined(CONFIG_AC3_PARSER) || defined(CONFIG_AAC_PARSER)
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
796 /* also used for ADTS AAC */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
797 typedef struct AC3ParseContext {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
798 uint8_t *inbuf_ptr;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
799 int frame_size;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
800 int header_size;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
801 int (*sync)(const uint8_t *buf, int *channels, int *sample_rate,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
802 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
803 uint8_t inbuf[8192]; /* input buffer */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
804 } AC3ParseContext;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
805
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
806 #define AC3_HEADER_SIZE 7
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
807 #define AAC_HEADER_SIZE 7
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
808
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
809 #ifdef CONFIG_AC3_PARSER
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
810 static const int ac3_sample_rates[4] = {
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
811 48000, 44100, 32000, 0
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
812 };
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
813
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
814 static const int ac3_frame_sizes[64][3] = {
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
815 { 64, 69, 96 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
816 { 64, 70, 96 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
817 { 80, 87, 120 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
818 { 80, 88, 120 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
819 { 96, 104, 144 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
820 { 96, 105, 144 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
821 { 112, 121, 168 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
822 { 112, 122, 168 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
823 { 128, 139, 192 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
824 { 128, 140, 192 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
825 { 160, 174, 240 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
826 { 160, 175, 240 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
827 { 192, 208, 288 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
828 { 192, 209, 288 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
829 { 224, 243, 336 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
830 { 224, 244, 336 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
831 { 256, 278, 384 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
832 { 256, 279, 384 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
833 { 320, 348, 480 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
834 { 320, 349, 480 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
835 { 384, 417, 576 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
836 { 384, 418, 576 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
837 { 448, 487, 672 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
838 { 448, 488, 672 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
839 { 512, 557, 768 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
840 { 512, 558, 768 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
841 { 640, 696, 960 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
842 { 640, 697, 960 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
843 { 768, 835, 1152 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
844 { 768, 836, 1152 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
845 { 896, 975, 1344 },
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
846 { 896, 976, 1344 },
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
847 { 1024, 1114, 1536 },
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
848 { 1024, 1115, 1536 },
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
849 { 1152, 1253, 1728 },
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
850 { 1152, 1254, 1728 },
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
851 { 1280, 1393, 1920 },
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
852 { 1280, 1394, 1920 },
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
853 };
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
854
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
855 static const int ac3_bitrates[64] = {
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
856 32, 32, 40, 40, 48, 48, 56, 56, 64, 64, 80, 80, 96, 96, 112, 112,
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
857 128, 128, 160, 160, 192, 192, 224, 224, 256, 256, 320, 320, 384,
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
858 384, 448, 448, 512, 512, 576, 576, 640, 640,
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
859 };
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
860
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
861 static const int ac3_channels[8] = {
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
862 2, 1, 2, 3, 3, 4, 4, 5
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
863 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
864 #endif /* CONFIG_AC3_PARSER */
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
865
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
866 #ifdef CONFIG_AAC_PARSER
3456
fa0b285144f0 make some tables const
mru
parents: 3455
diff changeset
867 static const int aac_sample_rates[16] = {
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
868 96000, 88200, 64000, 48000, 44100, 32000,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
869 24000, 22050, 16000, 12000, 11025, 8000, 7350
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
870 };
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
871
3456
fa0b285144f0 make some tables const
mru
parents: 3455
diff changeset
872 static const int aac_channels[8] = {
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
873 0, 1, 2, 3, 4, 5, 6, 8
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
874 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
875 #endif
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
876
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
877 #ifdef CONFIG_AC3_PARSER
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
878 static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
879 int *bit_rate, int *samples)
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
880 {
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
881 unsigned int fscod, frmsizecod, acmod, bsid, lfeon;
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
882 GetBitContext bits;
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
883
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
884 init_get_bits(&bits, buf, AC3_HEADER_SIZE * 8);
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
885
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
886 if(get_bits(&bits, 16) != 0x0b77)
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
887 return 0;
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
888
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
889 skip_bits(&bits, 16); /* crc */
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
890 fscod = get_bits(&bits, 2);
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
891 frmsizecod = get_bits(&bits, 6);
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
892
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
893 if(!ac3_sample_rates[fscod])
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
894 return 0;
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
895
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
896 bsid = get_bits(&bits, 5);
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
897 if(bsid > 8)
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
898 return 0;
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
899 skip_bits(&bits, 3); /* bsmod */
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
900 acmod = get_bits(&bits, 3);
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
901 if(acmod & 1 && acmod != 1)
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
902 skip_bits(&bits, 2); /* cmixlev */
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
903 if(acmod & 4)
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
904 skip_bits(&bits, 2); /* surmixlev */
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
905 if(acmod & 2)
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
906 skip_bits(&bits, 2); /* dsurmod */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
907 lfeon = get_bits1(&bits);
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
908
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
909 *sample_rate = ac3_sample_rates[fscod];
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
910 *bit_rate = ac3_bitrates[frmsizecod] * 1000;
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
911 *channels = ac3_channels[acmod] + lfeon;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
912 *samples = 6 * 256;
3059
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
913
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
914 return ac3_frame_sizes[frmsizecod][fscod] * 2;
61b4cc042988 native ac3 parser
mru
parents: 3036
diff changeset
915 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
916 #endif /* CONFIG_AC3_PARSER */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
917
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
918 #ifdef CONFIG_AAC_PARSER
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
919 static int aac_sync(const uint8_t *buf, int *channels, int *sample_rate,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
920 int *bit_rate, int *samples)
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
921 {
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
922 GetBitContext bits;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
923 int size, rdb, ch, sr;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
924
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
925 init_get_bits(&bits, buf, AAC_HEADER_SIZE * 8);
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
926
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
927 if(get_bits(&bits, 12) != 0xfff)
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
928 return 0;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
929
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
930 skip_bits1(&bits); /* id */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
931 skip_bits(&bits, 2); /* layer */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
932 skip_bits1(&bits); /* protection_absent */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
933 skip_bits(&bits, 2); /* profile_objecttype */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
934 sr = get_bits(&bits, 4); /* sample_frequency_index */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
935 if(!aac_sample_rates[sr])
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
936 return 0;
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
937 skip_bits1(&bits); /* private_bit */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
938 ch = get_bits(&bits, 3); /* channel_configuration */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
939 if(!aac_channels[ch])
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
940 return 0;
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
941 skip_bits1(&bits); /* original/copy */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
942 skip_bits1(&bits); /* home */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
943
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
944 /* adts_variable_header */
3104
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
945 skip_bits1(&bits); /* copyright_identification_bit */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
946 skip_bits1(&bits); /* copyright_identification_start */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
947 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
948 skip_bits(&bits, 11); /* adts_buffer_fullness */
78d6bfc238f3 use get_bits1/skip_bits[1] in ac3 and aac parsers
mru
parents: 3098
diff changeset
949 rdb = get_bits(&bits, 2); /* number_of_raw_data_blocks_in_frame */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
950
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
951 *channels = aac_channels[ch];
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
952 *sample_rate = aac_sample_rates[sr];
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
953 *samples = (rdb + 1) * 1024;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
954 *bit_rate = size * 8 * *sample_rate / *samples;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
955
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
956 return size;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
957 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
958 #endif /* CONFIG_AAC_PARSER */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
959
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
960 #ifdef CONFIG_AC3_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
961 static int ac3_parse_init(AVCodecParserContext *s1)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
962 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
963 AC3ParseContext *s = s1->priv_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
964 s->inbuf_ptr = s->inbuf;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
965 s->header_size = AC3_HEADER_SIZE;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
966 s->sync = ac3_sync;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
967 return 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
968 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
969 #endif
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
970
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
971 #ifdef CONFIG_AAC_PARSER
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
972 static int aac_parse_init(AVCodecParserContext *s1)
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
973 {
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
974 AC3ParseContext *s = s1->priv_data;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
975 s->inbuf_ptr = s->inbuf;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
976 s->header_size = AAC_HEADER_SIZE;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
977 s->sync = aac_sync;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
978 return 0;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
979 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
980 #endif
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
981
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
982 /* also used for ADTS AAC */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
983 static int ac3_parse(AVCodecParserContext *s1,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
984 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
985 uint8_t **poutbuf, int *poutbuf_size,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
986 const uint8_t *buf, int buf_size)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
987 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
988 AC3ParseContext *s = s1->priv_data;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
989 const uint8_t *buf_ptr;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
990 int len, sample_rate, bit_rate, channels, samples;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
991
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
992 *poutbuf = NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
993 *poutbuf_size = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
994
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
995 buf_ptr = buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
996 while (buf_size > 0) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
997 len = s->inbuf_ptr - s->inbuf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
998 if (s->frame_size == 0) {
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
999 /* no header seen : find one. We need at least s->header_size
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1000 bytes to parse it */
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1001 len = FFMIN(s->header_size - len, buf_size);
3082
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
1002
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1003 memcpy(s->inbuf_ptr, buf_ptr, len);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1004 buf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1005 s->inbuf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1006 buf_size -= len;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1007 if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1008 len = s->sync(s->inbuf, &channels, &sample_rate, &bit_rate,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1009 &samples);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1010 if (len == 0) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1011 /* no sync found : move by one byte (inefficient, but simple!) */
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1012 memmove(s->inbuf, s->inbuf + 1, s->header_size - 1);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1013 s->inbuf_ptr--;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1014 } else {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1015 s->frame_size = len;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1016 /* update codec info */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1017 avctx->sample_rate = sample_rate;
1987
d9e067853051 >2 channels decoding fix
michael
parents: 1696
diff changeset
1018 /* 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
1019 if(avctx->codec_id == CODEC_ID_AC3){
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1020 if(avctx->channels!=1 && avctx->channels!=2){
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1021 avctx->channels = channels;
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1022 }
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1023 } else {
3063
f02d0b59279c Remove all stray tabs and trailing whitespace, this time for good.
diego
parents: 3059
diff changeset
1024 avctx->channels = channels;
1987
d9e067853051 >2 channels decoding fix
michael
parents: 1696
diff changeset
1025 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
1026 avctx->bit_rate = bit_rate;
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1027 avctx->frame_size = samples;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1028 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1029 }
3082
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
1030 } else {
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
1031 len = FFMIN(s->frame_size - len, buf_size);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1032
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1033 memcpy(s->inbuf_ptr, buf_ptr, len);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1034 buf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1035 s->inbuf_ptr += len;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1036 buf_size -= len;
3082
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
1037
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
1038 if(s->inbuf_ptr - s->inbuf == s->frame_size){
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
1039 *poutbuf = s->inbuf;
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
1040 *poutbuf_size = s->frame_size;
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
1041 s->inbuf_ptr = s->inbuf;
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
1042 s->frame_size = 0;
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
1043 break;
d85afa120256 output last ac3 frame and simplify
michael
parents: 3063
diff changeset
1044 }
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1045 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1046 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1047 return buf_ptr - buf;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1048 }
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
1049 #endif /* CONFIG_AC3_PARSER || CONFIG_AAC_PARSER */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1050
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
1051 #ifdef CONFIG_MPEGVIDEO_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1052 AVCodecParser mpegvideo_parser = {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1053 { CODEC_ID_MPEG1VIDEO, CODEC_ID_MPEG2VIDEO },
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1054 sizeof(ParseContext1),
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1055 NULL,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1056 mpegvideo_parse,
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
1057 parse1_close,
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
1058 mpegvideo_split,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1059 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
1060 #endif
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
1061 #ifdef CONFIG_MPEG4VIDEO_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1062 AVCodecParser mpeg4video_parser = {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1063 { CODEC_ID_MPEG4 },
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1064 sizeof(ParseContext1),
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1065 mpeg4video_parse_init,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1066 mpeg4video_parse,
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
1067 parse1_close,
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
1068 mpeg4video_split,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1069 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
1070 #endif
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
1071 #ifdef CONFIG_CAVSVIDEO_PARSER
3395
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
1072 AVCodecParser cavsvideo_parser = {
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
1073 { CODEC_ID_CAVS },
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
1074 sizeof(ParseContext1),
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
1075 NULL,
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
1076 cavsvideo_parse,
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
1077 parse1_close,
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
1078 mpeg4video_split,
adccbf4a1040 CAVS decoder by (Stefan Gehrer stefan.gehrer gmx.de)
michael
parents: 3344
diff changeset
1079 };
3432
ab49baf4adad Fix compilation with --disable-decoders.
diego
parents: 3421
diff changeset
1080 #endif
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
1081 #ifdef CONFIG_MPEGAUDIO_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1082 AVCodecParser mpegaudio_parser = {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1083 { CODEC_ID_MP2, CODEC_ID_MP3 },
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1084 sizeof(MpegAudioParseContext),
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1085 mpegaudio_parse_init,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1086 mpegaudio_parse,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1087 NULL,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1088 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
1089 #endif
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
1090 #ifdef CONFIG_AC3_PARSER
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1091 AVCodecParser ac3_parser = {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1092 { CODEC_ID_AC3 },
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1093 sizeof(AC3ParseContext),
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1094 ac3_parse_init,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1095 ac3_parse,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1096 NULL,
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1097 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
1098 #endif
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
1099 #ifdef CONFIG_AAC_PARSER
3098
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1100 AVCodecParser aac_parser = {
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1101 { CODEC_ID_AAC },
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1102 sizeof(AC3ParseContext),
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1103 aac_parse_init,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1104 ac3_parse,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1105 NULL,
eb3d3988aff2 adts aac parser
mru
parents: 3086
diff changeset
1106 };
3455
cc4b4ea83e29 --enable/disable parsers. Warning: some combinations are broken.
mru
parents: 3432
diff changeset
1107 #endif