Mercurial > libavcodec.hg
comparison h263dec.c @ 1747:8cfd36bfe504 libavcodec
xvid "packed" stuff support
author | michael |
---|---|
date | Thu, 15 Jan 2004 01:29:26 +0000 |
parents | 07a484280a82 |
children | bdf3927bf8c5 |
comparison
equal
deleted
inserted
replaced
1746:67949dc3117b | 1747:8cfd36bfe504 |
---|---|
423 | 423 |
424 if( ff_combine_frame(s, next, &buf, &buf_size) < 0 ) | 424 if( ff_combine_frame(s, next, &buf, &buf_size) < 0 ) |
425 return buf_size; | 425 return buf_size; |
426 } | 426 } |
427 | 427 |
428 | |
428 retry: | 429 retry: |
429 | 430 |
430 if(s->bitstream_buffer_size && buf_size<20){ //divx 5.01+ frame reorder | 431 if(s->bitstream_buffer_size && (s->divx_packed || buf_size<20)){ //divx 5.01+/xvid frame reorder |
431 init_get_bits(&s->gb, s->bitstream_buffer, s->bitstream_buffer_size*8); | 432 init_get_bits(&s->gb, s->bitstream_buffer, s->bitstream_buffer_size*8); |
432 }else | 433 }else |
433 init_get_bits(&s->gb, buf, buf_size*8); | 434 init_get_bits(&s->gb, buf, buf_size*8); |
434 s->bitstream_buffer_size=0; | 435 s->bitstream_buffer_size=0; |
435 | 436 |
676 } | 677 } |
677 | 678 |
678 /* divx 5.01+ bistream reorder stuff */ | 679 /* divx 5.01+ bistream reorder stuff */ |
679 if(s->codec_id==CODEC_ID_MPEG4 && s->bitstream_buffer_size==0 && s->divx_packed){ | 680 if(s->codec_id==CODEC_ID_MPEG4 && s->bitstream_buffer_size==0 && s->divx_packed){ |
680 int current_pos= get_bits_count(&s->gb)>>3; | 681 int current_pos= get_bits_count(&s->gb)>>3; |
682 int startcode_found=0; | |
681 | 683 |
682 if( buf_size - current_pos > 5 | 684 if( buf_size - current_pos > 5 |
683 && buf_size - current_pos < BITSTREAM_BUFFER_SIZE){ | 685 && buf_size - current_pos < BITSTREAM_BUFFER_SIZE){ |
684 int i; | 686 int i; |
685 int startcode_found=0; | |
686 for(i=current_pos; i<buf_size-3; i++){ | 687 for(i=current_pos; i<buf_size-3; i++){ |
687 if(buf[i]==0 && buf[i+1]==0 && buf[i+2]==1 && buf[i+3]==0xB6){ | 688 if(buf[i]==0 && buf[i+1]==0 && buf[i+2]==1 && buf[i+3]==0xB6){ |
688 startcode_found=1; | 689 startcode_found=1; |
689 break; | 690 break; |
690 } | 691 } |
691 } | 692 } |
692 if(startcode_found){ | 693 } |
693 memcpy(s->bitstream_buffer, buf + current_pos, buf_size - current_pos); | 694 if(s->gb.buffer == s->bitstream_buffer && buf_size>20){ //xvid style |
694 s->bitstream_buffer_size= buf_size - current_pos; | 695 startcode_found=1; |
695 } | 696 current_pos=0; |
697 } | |
698 | |
699 if(startcode_found){ | |
700 memcpy(s->bitstream_buffer, buf + current_pos, buf_size - current_pos); | |
701 s->bitstream_buffer_size= buf_size - current_pos; | |
696 } | 702 } |
697 } | 703 } |
698 | 704 |
699 ff_er_frame_end(s); | 705 ff_er_frame_end(s); |
700 | 706 |