Mercurial > libavcodec.hg
comparison h263.c @ 2966:564788471dd4 libavcodec
bitstream related fixes from [PATCH] from DivX, Part 9: bitstream crashes by (Steve Lhomme | slhomme divxcorp com)
author | michael |
---|---|
date | Sat, 17 Dec 2005 11:31:56 +0000 |
parents | fde28cb7e3d5 |
children | ef2149182f1c |
comparison
equal
deleted
inserted
replaced
2965:40f745e4fdff | 2966:564788471dd4 |
---|---|
5742 */ | 5742 */ |
5743 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){ | 5743 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){ |
5744 char buf[256]; | 5744 char buf[256]; |
5745 int i; | 5745 int i; |
5746 int e; | 5746 int e; |
5747 int ver, build, ver2, ver3; | 5747 int ver = 0, build = 0, ver2 = 0, ver3 = 0; |
5748 char last; | 5748 char last; |
5749 | 5749 |
5750 for(i=0; i<255; i++){ | 5750 for(i=0; i<255 && gb->index < gb->size_in_bits; i++){ |
5751 if(show_bits(gb, 23) == 0) break; | 5751 if(show_bits(gb, 23) == 0) break; |
5752 buf[i]= get_bits(gb, 8); | 5752 buf[i]= get_bits(gb, 8); |
5753 } | 5753 } |
5754 buf[i]=0; | 5754 buf[i]=0; |
5755 | 5755 |
5767 e=sscanf(buf, "FFmpe%*[^b]b%d", &build)+3; | 5767 e=sscanf(buf, "FFmpe%*[^b]b%d", &build)+3; |
5768 if(e!=4) | 5768 if(e!=4) |
5769 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build); | 5769 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build); |
5770 if(e!=4){ | 5770 if(e!=4){ |
5771 e=sscanf(buf, "Lavc%d.%d.%d", &ver, &ver2, &ver3)+1; | 5771 e=sscanf(buf, "Lavc%d.%d.%d", &ver, &ver2, &ver3)+1; |
5772 build= (ver<<16) + (ver2<<8) + ver3; | 5772 if (e>1) |
5773 build= (ver<<16) + (ver2<<8) + ver3; | |
5773 } | 5774 } |
5774 if(e!=4){ | 5775 if(e!=4){ |
5775 if(strcmp(buf, "ffmpeg")==0){ | 5776 if(strcmp(buf, "ffmpeg")==0){ |
5776 s->lavc_build= 4600; | 5777 s->lavc_build= 4600; |
5777 } | 5778 } |
6011 return decode_vop_header(s, gb); | 6012 return decode_vop_header(s, gb); |
6012 } | 6013 } |
6013 | 6014 |
6014 startcode = 0xff; | 6015 startcode = 0xff; |
6015 for(;;) { | 6016 for(;;) { |
6016 v = get_bits(gb, 8); | |
6017 startcode = ((startcode << 8) | v) & 0xffffffff; | |
6018 | |
6019 if(get_bits_count(gb) >= gb->size_in_bits){ | 6017 if(get_bits_count(gb) >= gb->size_in_bits){ |
6020 if(gb->size_in_bits==8 && (s->divx_version || s->xvid_build)){ | 6018 if(gb->size_in_bits==8 && (s->divx_version || s->xvid_build)){ |
6021 av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits); | 6019 av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits); |
6022 return FRAME_SKIPPED; //divx bug | 6020 return FRAME_SKIPPED; //divx bug |
6023 }else | 6021 }else |
6024 return -1; //end of stream | 6022 return -1; //end of stream |
6025 } | 6023 } |
6024 | |
6025 /* use the bits after the test */ | |
6026 v = get_bits(gb, 8); | |
6027 startcode = ((startcode << 8) | v) & 0xffffffff; | |
6026 | 6028 |
6027 if((startcode&0xFFFFFF00) != 0x100) | 6029 if((startcode&0xFFFFFF00) != 0x100) |
6028 continue; //no startcode | 6030 continue; //no startcode |
6029 | 6031 |
6030 if(s->avctx->debug&FF_DEBUG_STARTCODE){ | 6032 if(s->avctx->debug&FF_DEBUG_STARTCODE){ |