comparison msmpeg4.c @ 251:75091bfc577b libavcodec

fixing msmpeg4 decoding if fps < 16 (i thought it was a indicator for the ext header, its the fps indeed)
author michaelni
date Fri, 22 Feb 2002 19:19:01 +0000
parents 214ac77c0948
children fb9e77674bd4
comparison
equal deleted inserted replaced
250:3449316664b5 251:75091bfc577b
19 #include <stdlib.h> 19 #include <stdlib.h>
20 #include <stdio.h> 20 #include <stdio.h>
21 #include "common.h" 21 #include "common.h"
22 #include "dsputil.h" 22 #include "dsputil.h"
23 #include "mpegvideo.h" 23 #include "mpegvideo.h"
24 #include "avcodec.h"
24 25
25 /* 26 /*
26 * You can also call this codec : MPEG4 with a twist ! 27 * You can also call this codec : MPEG4 with a twist !
27 * 28 *
28 * TODO: 29 * TODO:
210 #endif 211 #endif
211 } 212 }
212 213
213 void msmpeg4_encode_ext_header(MpegEncContext * s) 214 void msmpeg4_encode_ext_header(MpegEncContext * s)
214 { 215 {
215 if(s->pict_type == P_TYPE)
216 {
217 return; // P-Frames dont seem to have them and not even a 0 bit
218 }
219 else
220 {
221 s->flipflop_rounding=1; 216 s->flipflop_rounding=1;
222 s->bitrate= 910; 217 s->bitrate= 910; // FIXME
223 218
224 put_bits(&s->pb, 1, 1); // ext header indicator 219 put_bits(&s->pb, 5, s->frame_rate / FRAME_RATE_BASE); //yes 29.97 -> 29
225
226 put_bits(&s->pb, 4, 7); // ?
227 220
228 put_bits(&s->pb, 11, s->bitrate); 221 put_bits(&s->pb, 11, s->bitrate);
229 222
230 put_bits(&s->pb, 1, s->flipflop_rounding); 223 put_bits(&s->pb, 1, s->flipflop_rounding);
231 }
232 } 224 }
233 225
234 /* predict coded block */ 226 /* predict coded block */
235 static inline int coded_block_pred(MpegEncContext * s, int n, UINT8 **coded_block_ptr) 227 static inline int coded_block_pred(MpegEncContext * s, int n, UINT8 **coded_block_ptr)
236 { 228 {
746 return 0; 738 return 0;
747 } 739 }
748 740
749 int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size) 741 int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
750 { 742 {
751 int firstBit=0;
752
753 /* the alt_bitstream reader could read over the end so we need to check it */ 743 /* the alt_bitstream reader could read over the end so we need to check it */
754 if(get_bits_count(&s->gb) < buf_size*8) firstBit= get_bits1(&s->gb); 744 if(get_bits_count(&s->gb) + 16 < buf_size*8)
755
756 if(s->pict_type == P_TYPE)
757 { 745 {
758 if(firstBit) return -1; // havnt seen ext headers in P-Frames yet ;) 746 int fps;
747
748 fps= get_bits(&s->gb, 5);
749 s->bitrate= get_bits(&s->gb, 11);
750 s->flipflop_rounding= get_bits1(&s->gb);
751
752 // printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bitrate, s->flipflop_rounding);
759 } 753 }
760 else 754 else
761 { 755 {
762 int unk; 756 s->flipflop_rounding= 0;
763 if(!firstBit) // no header found 757 s->bitrate= 0;
764 { 758 }
765 s->flipflop_rounding= 0; 759
766 s->bitrate= 0;
767 return 0;
768 }
769
770 unk= get_bits(&s->gb, 4);
771 s->bitrate= get_bits(&s->gb, 11);
772
773 // printf("%2d %4d ;; %1X\n", unk,s->bitrate, unk);
774
775 s->flipflop_rounding= get_bits1(&s->gb);
776 }
777
778 return 0; 760 return 0;
779 } 761 }
780 762
781 static inline void memsetw(short *tab, int val, int n) 763 static inline void memsetw(short *tab, int val, int n)
782 { 764 {