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