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