annotate parser.c @ 3344:f9d739057d6c libavcodec

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