Mercurial > libavcodec.hg
comparison parser.c @ 2769:1394b45a7bf4 libavcodec
support changing in bitstream global headers into extradata style and back
author | michael |
---|---|
date | Mon, 27 Jun 2005 00:04:03 +0000 |
parents | ef44d24680d1 |
children | 09108466b7d0 |
comparison
equal
deleted
inserted
replaced
2768:d2b3f948599d | 2769:1394b45a7bf4 |
---|---|
140 index = 0; | 140 index = 0; |
141 s->cur_offset += index; | 141 s->cur_offset += index; |
142 return index; | 142 return index; |
143 } | 143 } |
144 | 144 |
145 int av_parser_change(AVCodecParserContext *s, | |
146 AVCodecContext *avctx, | |
147 uint8_t **poutbuf, int *poutbuf_size, | |
148 const uint8_t *buf, int buf_size, int keyframe){ | |
149 | |
150 if(s && s->parser->split){ | |
151 if((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) && !(avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)){ | |
152 int i= s->parser->split(avctx, buf, buf_size); | |
153 buf += i; | |
154 buf_size -= i; | |
155 } | |
156 } | |
157 | |
158 *poutbuf= buf; | |
159 *poutbuf_size= buf_size; | |
160 if(avctx->extradata){ | |
161 if( (keyframe && (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)) | |
162 /*||(s->pict_type != I_TYPE && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_NOKEY))*/ | |
163 /*||(? && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_BEGIN)*/){ | |
164 int size= buf_size + avctx->extradata_size; | |
165 *poutbuf_size= size; | |
166 *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE); | |
167 | |
168 memcpy(*poutbuf, avctx->extradata, avctx->extradata_size); | |
169 memcpy((*poutbuf) + avctx->extradata_size, buf, buf_size); | |
170 return 1; | |
171 } | |
172 } | |
173 | |
174 return 0; | |
175 } | |
176 | |
145 void av_parser_close(AVCodecParserContext *s) | 177 void av_parser_close(AVCodecParserContext *s) |
146 { | 178 { |
147 if (s->parser->parser_close) | 179 if (s->parser->parser_close) |
148 s->parser->parser_close(s); | 180 s->parser->parser_close(s); |
149 av_free(s->priv_data); | 181 av_free(s->priv_data); |
292 int32_t start_code; | 324 int32_t start_code; |
293 int frame_rate_index, ext_type, bytes_left; | 325 int frame_rate_index, ext_type, bytes_left; |
294 int frame_rate_ext_n, frame_rate_ext_d; | 326 int frame_rate_ext_n, frame_rate_ext_d; |
295 int picture_structure, top_field_first, repeat_first_field, progressive_frame; | 327 int picture_structure, top_field_first, repeat_first_field, progressive_frame; |
296 int horiz_size_ext, vert_size_ext, bit_rate_ext; | 328 int horiz_size_ext, vert_size_ext, bit_rate_ext; |
297 | 329 //FIXME replace the crap with get_bits() |
298 s->repeat_pict = 0; | 330 s->repeat_pict = 0; |
299 buf_end = buf + buf_size; | 331 buf_end = buf + buf_size; |
300 while (buf < buf_end) { | 332 while (buf < buf_end) { |
301 start_code = find_start_code(&buf, buf_end); | 333 start_code = find_start_code(&buf, buf_end); |
302 bytes_left = buf_end - buf; | 334 bytes_left = buf_end - buf; |
413 *poutbuf = (uint8_t *)buf; | 445 *poutbuf = (uint8_t *)buf; |
414 *poutbuf_size = buf_size; | 446 *poutbuf_size = buf_size; |
415 return next; | 447 return next; |
416 } | 448 } |
417 | 449 |
450 static int mpegvideo_split(AVCodecContext *avctx, | |
451 const uint8_t *buf, int buf_size) | |
452 { | |
453 int i; | |
454 uint32_t state= -1; | |
455 | |
456 for(i=0; i<buf_size; i++){ | |
457 state= (state<<8) | buf[i]; | |
458 if(state != 0x1B3 && state != 0x1B5 && state < 0x200 && state >= 0x100) | |
459 return i-4; | |
460 } | |
461 return 0; | |
462 } | |
463 | |
418 void ff_parse_close(AVCodecParserContext *s) | 464 void ff_parse_close(AVCodecParserContext *s) |
419 { | 465 { |
420 ParseContext *pc = s->priv_data; | 466 ParseContext *pc = s->priv_data; |
421 | 467 |
422 av_free(pc->buffer); | 468 av_free(pc->buffer); |
489 av_mpeg4_decode_header(s, avctx, buf, buf_size); | 535 av_mpeg4_decode_header(s, avctx, buf, buf_size); |
490 | 536 |
491 *poutbuf = (uint8_t *)buf; | 537 *poutbuf = (uint8_t *)buf; |
492 *poutbuf_size = buf_size; | 538 *poutbuf_size = buf_size; |
493 return next; | 539 return next; |
540 } | |
541 | |
542 static int mpeg4video_split(AVCodecContext *avctx, | |
543 const uint8_t *buf, int buf_size) | |
544 { | |
545 int i; | |
546 uint32_t state= -1; | |
547 | |
548 for(i=0; i<buf_size; i++){ | |
549 state= (state<<8) | buf[i]; | |
550 if(state == 0x1B3 || state == 0x1B6) | |
551 return i-4; | |
552 } | |
553 return 0; | |
494 } | 554 } |
495 | 555 |
496 /*************************/ | 556 /*************************/ |
497 | 557 |
498 typedef struct MpegAudioParseContext { | 558 typedef struct MpegAudioParseContext { |
766 { CODEC_ID_MPEG1VIDEO, CODEC_ID_MPEG2VIDEO }, | 826 { CODEC_ID_MPEG1VIDEO, CODEC_ID_MPEG2VIDEO }, |
767 sizeof(ParseContext1), | 827 sizeof(ParseContext1), |
768 NULL, | 828 NULL, |
769 mpegvideo_parse, | 829 mpegvideo_parse, |
770 parse1_close, | 830 parse1_close, |
831 mpegvideo_split, | |
771 }; | 832 }; |
772 | 833 |
773 AVCodecParser mpeg4video_parser = { | 834 AVCodecParser mpeg4video_parser = { |
774 { CODEC_ID_MPEG4 }, | 835 { CODEC_ID_MPEG4 }, |
775 sizeof(ParseContext1), | 836 sizeof(ParseContext1), |
776 mpeg4video_parse_init, | 837 mpeg4video_parse_init, |
777 mpeg4video_parse, | 838 mpeg4video_parse, |
778 parse1_close, | 839 parse1_close, |
840 mpeg4video_split, | |
779 }; | 841 }; |
780 | 842 |
781 AVCodecParser mpegaudio_parser = { | 843 AVCodecParser mpegaudio_parser = { |
782 { CODEC_ID_MP2, CODEC_ID_MP3 }, | 844 { CODEC_ID_MP2, CODEC_ID_MP3 }, |
783 sizeof(MpegAudioParseContext), | 845 sizeof(MpegAudioParseContext), |