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){