Mercurial > libavcodec.hg
annotate h263.c @ 1353:cfc80b3a4ada libavcodec
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
| author | michaelni |
|---|---|
| date | Wed, 09 Jul 2003 23:10:59 +0000 |
| parents | e7c8051e1849 |
| children | 1f89adb69349 |
| rev | line source |
|---|---|
| 0 | 1 /* |
| 2 * H263/MPEG4 backend for ffmpeg encoder and decoder | |
| 429 | 3 * Copyright (c) 2000,2001 Fabrice Bellard. |
| 78 | 4 * H263+ support. |
| 0 | 5 * Copyright (c) 2001 Juan J. Sierralta P. |
| 6 * | |
| 429 | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Lesser General Public | |
| 9 * License as published by the Free Software Foundation; either | |
| 10 * version 2 of the License, or (at your option) any later version. | |
| 0 | 11 * |
| 429 | 12 * This library is distributed in the hope that it will be useful, |
| 0 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 429 | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 15 * Lesser General Public License for more details. | |
| 0 | 16 * |
| 429 | 17 * You should have received a copy of the GNU Lesser General Public |
| 18 * License along with this library; if not, write to the Free Software | |
| 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
|
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
20 * |
|
656
e47fa3e3f2d5
statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents:
654
diff
changeset
|
21 * ac prediction encoding, b-frame support, error resilience, optimizations, |
|
e47fa3e3f2d5
statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents:
654
diff
changeset
|
22 * qpel decoding, gmc decoding, interlaced decoding, |
|
e47fa3e3f2d5
statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents:
654
diff
changeset
|
23 * by Michael Niedermayer <michaelni@gmx.at> |
| 0 | 24 */ |
| 1034 | 25 |
| 26 /** | |
| 27 * @file h263.c | |
| 1106 | 28 * h263/mpeg4 codec. |
| 1034 | 29 */ |
| 355 | 30 |
| 31 //#define DEBUG | |
| 0 | 32 #include "common.h" |
| 33 #include "dsputil.h" | |
| 34 #include "avcodec.h" | |
| 35 #include "mpegvideo.h" | |
| 36 #include "h263data.h" | |
| 37 #include "mpeg4data.h" | |
| 38 | |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
39 //#undef NDEBUG |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
40 //#include <assert.h> |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
41 |
| 544 | 42 #define INTRA_MCBPC_VLC_BITS 6 |
| 43 #define INTER_MCBPC_VLC_BITS 6 | |
| 44 #define CBPY_VLC_BITS 6 | |
| 45 #define MV_VLC_BITS 9 | |
| 46 #define DC_VLC_BITS 9 | |
| 47 #define SPRITE_TRAJ_VLC_BITS 6 | |
| 48 #define MB_TYPE_B_VLC_BITS 4 | |
| 49 #define TEX_VLC_BITS 9 | |
| 50 | |
|
815
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
51 #ifdef CONFIG_ENCODERS |
| 0 | 52 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, |
|
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
53 int n); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
54 static void h263_flv_encode_block(MpegEncContext * s, DCTELEM * block, |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
55 int n); |
| 324 | 56 static void h263_encode_motion(MpegEncContext * s, int val, int fcode); |
| 78 | 57 static void h263p_encode_umotion(MpegEncContext * s, int val); |
|
648
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
58 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, |
|
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
59 int n, int dc, uint8_t *scan_table, |
| 453 | 60 PutBitContext *dc_pb, PutBitContext *ac_pb); |
|
815
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
61 #endif |
|
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
62 |
| 262 | 63 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode); |
| 78 | 64 static int h263p_decode_umotion(MpegEncContext * s, int pred); |
| 0 | 65 static int h263_decode_block(MpegEncContext * s, DCTELEM * block, |
| 66 int n, int coded); | |
| 453 | 67 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); |
| 68 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, | |
| 1132 | 69 int n, int coded, int intra, int rvlc); |
| 1064 | 70 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr); |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
71 #ifdef CONFIG_ENCODERS |
| 1008 | 72 static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n, |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
73 int dir); |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
74 #endif //CONFIG_ENCODERS |
| 290 | 75 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s); |
| 1064 | 76 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr); |
| 77 | |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
78 #ifdef CONFIG_ENCODERS |
| 1064 | 79 static uint8_t uni_DCtab_lum_len[512]; |
| 80 static uint8_t uni_DCtab_chrom_len[512]; | |
| 81 static uint16_t uni_DCtab_lum_bits[512]; | |
| 82 static uint16_t uni_DCtab_chrom_bits[512]; | |
|
815
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
83 |
| 1162 | 84 static uint8_t (*mv_penalty)[MAX_MV*2+1]= NULL; |
| 1064 | 85 static uint8_t fcode_tab[MAX_MV*2+1]; |
| 86 static uint8_t umv_fcode_tab[MAX_MV*2+1]; | |
|
815
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
87 |
| 945 | 88 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2]; |
| 89 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2]; | |
| 90 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2]; | |
| 91 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2]; | |
| 92 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level)) | |
|
648
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
93 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64) |
| 945 | 94 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level)) |
|
648
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
95 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
96 /* mpeg4 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
97 inter |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
98 max level: 24/6 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
99 max run: 53/63 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
100 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
101 intra |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
102 max level: 53/16 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
103 max run: 29/41 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
104 */ |
|
815
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
105 #endif |
|
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
106 |
|
1271
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
107 #if 0 //3IV1 is quite rare and tis slows things down a tiny bit |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
108 #define IS_3IV1 s->avctx->codec_tag == ff_get_fourcc("3IV1") |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
109 #else |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
110 #define IS_3IV1 0 |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
111 #endif |
| 293 | 112 |
| 0 | 113 int h263_get_picture_format(int width, int height) |
| 114 { | |
| 115 int format; | |
| 116 | |
| 117 if (width == 128 && height == 96) | |
| 355 | 118 format = 1; |
| 0 | 119 else if (width == 176 && height == 144) |
| 355 | 120 format = 2; |
| 0 | 121 else if (width == 352 && height == 288) |
| 355 | 122 format = 3; |
| 0 | 123 else if (width == 704 && height == 576) |
| 355 | 124 format = 4; |
| 0 | 125 else if (width == 1408 && height == 1152) |
| 355 | 126 format = 5; |
| 0 | 127 else |
| 128 format = 7; | |
| 129 return format; | |
| 130 } | |
| 131 | |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
132 #ifdef CONFIG_ENCODERS |
|
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
133 |
| 887 | 134 static void float_aspect_to_info(MpegEncContext * s, float aspect){ |
| 135 int i; | |
| 136 | |
| 137 aspect*= s->height/(double)s->width; | |
| 138 //printf("%f\n", aspect); | |
| 880 | 139 |
| 887 | 140 if(aspect==0) aspect= 1.0; |
| 141 | |
| 880 | 142 ff_float2fraction(&s->aspected_width, &s->aspected_height, aspect, 255); |
| 887 | 143 |
| 144 //printf("%d %d\n", s->aspected_width, s->aspected_height); | |
| 145 for(i=1; i<6; i++){ | |
| 146 if(s->aspected_width == pixel_aspect[i][0] && s->aspected_height== pixel_aspect[i][1]){ | |
| 147 s->aspect_ratio_info=i; | |
| 148 return; | |
| 149 } | |
| 150 } | |
| 880 | 151 |
| 887 | 152 s->aspect_ratio_info= FF_ASPECT_EXTENDED; |
| 880 | 153 } |
| 154 | |
| 0 | 155 void h263_encode_picture_header(MpegEncContext * s, int picture_number) |
| 156 { | |
| 78 | 157 int format; |
| 0 | 158 |
| 159 align_put_bits(&s->pb); | |
| 231 | 160 |
|
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
161 if (s->h263_flv) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
162 put_bits(&s->pb, 17, 1); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
163 put_bits(&s->pb, 5, (s->h263_flv-1)); /* 0: h263 escape codes 1: 11-bit escape codes */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
164 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->frame_rate_base) / |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
165 s->avctx->frame_rate) & 0xff); /* TemporalReference */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
166 if (s->width == 352 && s->height == 288) |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
167 format = 2; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
168 else if (s->width == 176 && s->height == 144) |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
169 format = 3; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
170 else if (s->width == 128 && s->height == 96) |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
171 format = 4; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
172 else if (s->width == 320 && s->height == 240) |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
173 format = 5; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
174 else if (s->width == 160 && s->height == 120) |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
175 format = 6; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
176 else if (s->width <= 255 && s->height <= 255) |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
177 format = 0; /* use 1 byte width & height */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
178 else |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
179 format = 1; /* use 2 bytes width & height */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
180 put_bits(&s->pb, 3, format); /* PictureSize */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
181 if (format == 0) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
182 put_bits(&s->pb, 8, s->width); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
183 put_bits(&s->pb, 8, s->height); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
184 } else if (format == 1) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
185 put_bits(&s->pb, 16, s->width); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
186 put_bits(&s->pb, 16, s->height); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
187 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
188 put_bits(&s->pb, 2, s->pict_type == P_TYPE); /* PictureType */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
189 put_bits(&s->pb, 1, 0); /* DeblockingFlag: off */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
190 put_bits(&s->pb, 5, s->qscale); /* Quantizer */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
191 put_bits(&s->pb, 1, 0); /* ExtraInformation */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
192 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
193 if(s->h263_aic){ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
194 s->y_dc_scale_table= |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
195 s->c_dc_scale_table= h263_aic_dc_scale_table; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
196 }else{ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
197 s->y_dc_scale_table= |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
198 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
199 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
200 return; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
201 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
202 |
| 231 | 203 /* Update the pointer to last GOB */ |
|
234
5fc0c3af3fe4
alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents:
231
diff
changeset
|
204 s->ptr_lastgob = pbBufPtr(&s->pb); |
| 231 | 205 s->gob_number = 0; |
| 206 | |
| 207 put_bits(&s->pb, 22, 0x20); /* PSC */ | |
|
1126
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1118
diff
changeset
|
208 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->frame_rate_base) / |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1118
diff
changeset
|
209 s->avctx->frame_rate) & 0xff); |
| 0 | 210 |
| 211 put_bits(&s->pb, 1, 1); /* marker */ | |
| 212 put_bits(&s->pb, 1, 0); /* h263 id */ | |
| 213 put_bits(&s->pb, 1, 0); /* split screen off */ | |
| 214 put_bits(&s->pb, 1, 0); /* camera off */ | |
| 215 put_bits(&s->pb, 1, 0); /* freeze picture release off */ | |
| 78 | 216 |
| 217 format = h263_get_picture_format(s->width, s->height); | |
| 0 | 218 if (!s->h263_plus) { |
| 219 /* H.263v1 */ | |
| 220 put_bits(&s->pb, 3, format); | |
| 221 put_bits(&s->pb, 1, (s->pict_type == P_TYPE)); | |
| 222 /* By now UMV IS DISABLED ON H.263v1, since the restrictions | |
| 223 of H.263v1 UMV implies to check the predicted MV after | |
| 224 calculation of the current MB to see if we're on the limits */ | |
| 225 put_bits(&s->pb, 1, 0); /* unrestricted motion vector: off */ | |
| 226 put_bits(&s->pb, 1, 0); /* SAC: off */ | |
| 227 put_bits(&s->pb, 1, 0); /* advanced prediction mode: off */ | |
| 228 put_bits(&s->pb, 1, 0); /* not PB frame */ | |
| 229 put_bits(&s->pb, 5, s->qscale); | |
| 230 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */ | |
| 231 } else { | |
| 232 /* H.263v2 */ | |
| 233 /* H.263 Plus PTYPE */ | |
| 234 put_bits(&s->pb, 3, 7); | |
| 235 put_bits(&s->pb,3,1); /* Update Full Extended PTYPE */ | |
| 78 | 236 if (format == 7) |
| 237 put_bits(&s->pb,3,6); /* Custom Source Format */ | |
| 238 else | |
| 239 put_bits(&s->pb, 3, format); | |
| 240 | |
| 0 | 241 put_bits(&s->pb,1,0); /* Custom PCF: off */ |
| 1089 | 242 s->umvplus = s->unrestricted_mv; |
|
79
82e579c37bc3
Moved some H.263+ variables to MpegEncContext to be thread-safe.
pulento
parents:
78
diff
changeset
|
243 put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */ |
| 0 | 244 put_bits(&s->pb,1,0); /* SAC: off */ |
| 245 put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */ | |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
246 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */ |
| 0 | 247 put_bits(&s->pb,1,0); /* Deblocking Filter: off */ |
| 248 put_bits(&s->pb,1,0); /* Slice Structured: off */ | |
| 249 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */ | |
| 250 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */ | |
| 251 put_bits(&s->pb,1,0); /* Alternative Inter VLC: off */ | |
| 252 put_bits(&s->pb,1,0); /* Modified Quantization: off */ | |
| 253 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */ | |
| 254 put_bits(&s->pb,3,0); /* Reserved */ | |
| 255 | |
| 256 put_bits(&s->pb, 3, s->pict_type == P_TYPE); | |
| 257 | |
| 258 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */ | |
| 259 put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */ | |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
260 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */ |
| 0 | 261 put_bits(&s->pb,2,0); /* Reserved */ |
| 262 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */ | |
| 263 | |
| 264 /* This should be here if PLUSPTYPE */ | |
| 265 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */ | |
| 266 | |
| 78 | 267 if (format == 7) { |
| 268 /* Custom Picture Format (CPFMT) */ | |
| 887 | 269 float_aspect_to_info(s, s->avctx->aspect_ratio); |
| 880 | 270 |
| 271 put_bits(&s->pb,4,s->aspect_ratio_info); | |
| 78 | 272 put_bits(&s->pb,9,(s->width >> 2) - 1); |
| 273 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */ | |
| 274 put_bits(&s->pb,9,(s->height >> 2)); | |
|
669
b4bddbde44f3
aspect (ext. par too) support for h263 and mpeg4 (inc. build becouse of new vars)
al3x
parents:
667
diff
changeset
|
275 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) |
|
b4bddbde44f3
aspect (ext. par too) support for h263 and mpeg4 (inc. build becouse of new vars)
al3x
parents:
667
diff
changeset
|
276 { |
|
b4bddbde44f3
aspect (ext. par too) support for h263 and mpeg4 (inc. build becouse of new vars)
al3x
parents:
667
diff
changeset
|
277 put_bits(&s->pb, 8, s->aspected_width); |
|
b4bddbde44f3
aspect (ext. par too) support for h263 and mpeg4 (inc. build becouse of new vars)
al3x
parents:
667
diff
changeset
|
278 put_bits(&s->pb, 8, s->aspected_height); |
|
b4bddbde44f3
aspect (ext. par too) support for h263 and mpeg4 (inc. build becouse of new vars)
al3x
parents:
667
diff
changeset
|
279 } |
| 78 | 280 } |
| 281 | |
| 0 | 282 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */ |
|
79
82e579c37bc3
Moved some H.263+ variables to MpegEncContext to be thread-safe.
pulento
parents:
78
diff
changeset
|
283 if (s->umvplus) |
| 1089 | 284 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */ |
| 285 put_bits(&s->pb,2,1); /* unlimited */ | |
| 286 | |
| 0 | 287 put_bits(&s->pb, 5, s->qscale); |
| 288 } | |
| 289 | |
| 290 put_bits(&s->pb, 1, 0); /* no PEI */ | |
| 498 | 291 |
| 292 if(s->h263_aic){ | |
| 293 s->y_dc_scale_table= | |
| 294 s->c_dc_scale_table= h263_aic_dc_scale_table; | |
| 295 }else{ | |
| 296 s->y_dc_scale_table= | |
| 297 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; | |
| 298 } | |
| 0 | 299 } |
| 300 | |
| 766 | 301 /** |
| 302 * Encodes a group of blocks header. | |
| 303 */ | |
| 162 | 304 int h263_encode_gob_header(MpegEncContext * s, int mb_line) |
| 305 { | |
| 306 align_put_bits(&s->pb); | |
| 231 | 307 flush_put_bits(&s->pb); |
| 308 /* Call the RTP callback to send the last GOB */ | |
| 309 if (s->rtp_callback) { | |
| 766 | 310 int pdif = pbBufPtr(&s->pb) - s->ptr_lastgob; |
| 231 | 311 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number); |
| 312 } | |
| 162 | 313 put_bits(&s->pb, 17, 1); /* GBSC */ |
| 231 | 314 s->gob_number = mb_line / s->gob_index; |
| 162 | 315 put_bits(&s->pb, 5, s->gob_number); /* GN */ |
| 231 | 316 put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */ |
| 162 | 317 put_bits(&s->pb, 5, s->qscale); /* GQUANT */ |
| 231 | 318 //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif); |
| 766 | 319 return 0; |
| 162 | 320 } |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
321 |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
322 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6]) |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
323 { |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
324 int score0=0, score1=0; |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
325 int i, n; |
| 903 | 326 int8_t * const qscale_table= s->current_picture.qscale_table; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
327 |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
328 for(n=0; n<6; n++){ |
| 1064 | 329 int16_t *ac_val, *ac_val1; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
330 |
| 266 | 331 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
332 ac_val1= ac_val; |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
333 if(dir[n]){ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
334 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride; |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
335 /* top prediction */ |
| 266 | 336 ac_val-= s->block_wrap[n]*16; |
| 903 | 337 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){ |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
338 /* same qscale */ |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
339 for(i=1; i<8; i++){ |
| 1092 | 340 const int level= block[n][s->dsp.idct_permutation[i ]]; |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
341 score0+= ABS(level); |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
342 score1+= ABS(level - ac_val[i+8]); |
| 1092 | 343 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]]; |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
344 ac_val1[i+8]= level; |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
345 } |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
346 }else{ |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
347 /* different qscale, we must rescale */ |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
348 for(i=1; i<8; i++){ |
| 1092 | 349 const int level= block[n][s->dsp.idct_permutation[i ]]; |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
350 score0+= ABS(level); |
| 903 | 351 score1+= ABS(level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale)); |
| 1092 | 352 ac_val1[i ]= block[n][s->dsp.idct_permutation[i<<3]]; |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
353 ac_val1[i+8]= level; |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
354 } |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
355 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
356 }else{ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
357 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride; |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
358 /* left prediction */ |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
359 ac_val-= 16; |
| 903 | 360 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){ |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
361 /* same qscale */ |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
362 for(i=1; i<8; i++){ |
| 1092 | 363 const int level= block[n][s->dsp.idct_permutation[i<<3]]; |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
364 score0+= ABS(level); |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
365 score1+= ABS(level - ac_val[i]); |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
366 ac_val1[i ]= level; |
| 1092 | 367 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]]; |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
368 } |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
369 }else{ |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
370 /* different qscale, we must rescale */ |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
371 for(i=1; i<8; i++){ |
| 1092 | 372 const int level= block[n][s->dsp.idct_permutation[i<<3]]; |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
373 score0+= ABS(level); |
| 903 | 374 score1+= ABS(level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale)); |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
375 ac_val1[i ]= level; |
| 1092 | 376 ac_val1[i+8]= block[n][s->dsp.idct_permutation[i ]]; |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
377 } |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
378 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
379 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
380 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
381 |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
382 return score0 > score1 ? 1 : 0; |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
383 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
384 |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
385 /** |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
386 * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
387 */ |
| 695 | 388 void ff_clean_h263_qscales(MpegEncContext *s){ |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
389 int i; |
| 903 | 390 int8_t * const qscale_table= s->current_picture.qscale_table; |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
391 |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
392 for(i=1; i<s->mb_num; i++){ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
393 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2) |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
394 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2; |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
395 } |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
396 for(i=s->mb_num-2; i>=0; i--){ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
397 if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2) |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
398 qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2; |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
399 } |
| 695 | 400 } |
| 401 | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
402 /** |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
403 * modify mb_type & qscale so that encoding is acually possible in mpeg4 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
404 */ |
| 695 | 405 void ff_clean_mpeg4_qscales(MpegEncContext *s){ |
| 406 int i; | |
| 903 | 407 int8_t * const qscale_table= s->current_picture.qscale_table; |
| 408 | |
| 695 | 409 ff_clean_h263_qscales(s); |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
410 |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
411 for(i=1; i<s->mb_num; i++){ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
412 int mb_xy= s->mb_index2xy[i]; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
413 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
414 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&MB_TYPE_INTER4V)){ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
415 s->mb_type[mb_xy]&= ~MB_TYPE_INTER4V; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
416 s->mb_type[mb_xy]|= MB_TYPE_INTER; |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
417 } |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
418 } |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
419 |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
420 if(s->pict_type== B_TYPE){ |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
421 int odd=0; |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
422 /* ok, come on, this isnt funny anymore, theres more code for handling this mpeg4 mess than |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
423 for the actual adaptive quantization */ |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
424 |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
425 for(i=0; i<s->mb_num; i++){ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
426 int mb_xy= s->mb_index2xy[i]; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
427 odd += qscale_table[mb_xy]&1; |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
428 } |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
429 |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
430 if(2*odd > s->mb_num) odd=1; |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
431 else odd=0; |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
432 |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
433 for(i=0; i<s->mb_num; i++){ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
434 int mb_xy= s->mb_index2xy[i]; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
435 if((qscale_table[mb_xy]&1) != odd) |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
436 qscale_table[mb_xy]++; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
437 if(qscale_table[mb_xy] > 31) |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
438 qscale_table[mb_xy]= 31; |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
439 } |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
440 |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
441 for(i=1; i<s->mb_num; i++){ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
442 int mb_xy= s->mb_index2xy[i]; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
443 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&MB_TYPE_DIRECT)){ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
444 s->mb_type[mb_xy]&= ~MB_TYPE_DIRECT; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
445 s->mb_type[mb_xy]|= MB_TYPE_BIDIR; |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
446 } |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
447 } |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
448 } |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
449 } |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
450 |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
451 #endif //CONFIG_ENCODERS |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
452 /** |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
453 * |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
454 * @return the mb_type |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
455 */ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
456 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
457 const int mb_index= s->mb_x + s->mb_y*s->mb_stride; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
458 const int colocated_mb_type= s->next_picture.mb_type[mb_index]; //FIXME or next? |
| 936 | 459 int xy= s->block_index[0]; |
| 460 uint16_t time_pp= s->pp_time; | |
| 461 uint16_t time_pb= s->pb_time; | |
| 462 int i; | |
|
1053
f07fd48c23d4
direct blocksize in bframes fix (might fix qpel+bframe bug)
michaelni
parents:
1042
diff
changeset
|
463 |
| 936 | 464 //FIXME avoid divides |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
465 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
466 if(IS_8X8(colocated_mb_type)){ |
| 936 | 467 s->mv_type = MV_TYPE_8X8; |
| 468 for(i=0; i<4; i++){ | |
| 469 xy= s->block_index[i]; | |
| 470 s->mv[0][i][0] = s->motion_val[xy][0]*time_pb/time_pp + mx; | |
| 471 s->mv[0][i][1] = s->motion_val[xy][1]*time_pb/time_pp + my; | |
| 472 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->motion_val[xy][0] | |
| 473 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp; | |
| 474 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->motion_val[xy][1] | |
| 475 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp; | |
| 476 } | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
477 return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
478 } else if(IS_INTERLACED(colocated_mb_type)){ |
| 936 | 479 s->mv_type = MV_TYPE_FIELD; |
| 480 for(i=0; i<2; i++){ | |
| 481 if(s->top_field_first){ | |
| 482 time_pp= s->pp_field_time - s->field_select_table[mb_index][i] + i; | |
| 483 time_pb= s->pb_field_time - s->field_select_table[mb_index][i] + i; | |
| 484 }else{ | |
| 485 time_pp= s->pp_field_time + s->field_select_table[mb_index][i] - i; | |
| 486 time_pb= s->pb_field_time + s->field_select_table[mb_index][i] - i; | |
| 487 } | |
| 488 s->mv[0][i][0] = s->field_mv_table[mb_index][i][0]*time_pb/time_pp + mx; | |
| 489 s->mv[0][i][1] = s->field_mv_table[mb_index][i][1]*time_pb/time_pp + my; | |
| 490 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->field_mv_table[mb_index][i][0] | |
| 491 : s->field_mv_table[mb_index][i][0]*(time_pb - time_pp)/time_pp; | |
| 492 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->field_mv_table[mb_index][i][1] | |
| 493 : s->field_mv_table[mb_index][i][1]*(time_pb - time_pp)/time_pp; | |
| 494 } | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
495 return MB_TYPE_DIRECT2 | MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_INTERLACED; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
496 }else{ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
497 s->mv[0][0][0] = s->mv[0][1][0] = s->mv[0][2][0] = s->mv[0][3][0] = s->motion_val[xy][0]*time_pb/time_pp + mx; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
498 s->mv[0][0][1] = s->mv[0][1][1] = s->mv[0][2][1] = s->mv[0][3][1] = s->motion_val[xy][1]*time_pb/time_pp + my; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
499 s->mv[1][0][0] = s->mv[1][1][0] = s->mv[1][2][0] = s->mv[1][3][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0] |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
500 : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
501 s->mv[1][0][1] = s->mv[1][1][1] = s->mv[1][2][1] = s->mv[1][3][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1] |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
502 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
503 if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample) |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
504 s->mv_type= MV_TYPE_16X16; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
505 else |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
506 s->mv_type= MV_TYPE_8X8; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
507 return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1; //Note see prev line |
| 936 | 508 } |
| 509 } | |
| 510 | |
|
815
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
511 #ifdef CONFIG_ENCODERS |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
512 void mpeg4_encode_mb(MpegEncContext * s, |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
513 DCTELEM block[6][64], |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
514 int motion_x, int motion_y) |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
515 { |
| 1057 | 516 int cbpc, cbpy, pred_x, pred_y; |
| 286 | 517 int bits; |
| 453 | 518 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb; |
| 519 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb; | |
| 520 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2 : &s->pb; | |
| 521 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0; | |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
522 const int dquant_code[5]= {1,0,9,2,3}; |
| 162 | 523 |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
524 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y); |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
525 if (!s->mb_intra) { |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
526 /* compute cbp */ |
| 1057 | 527 int i, cbp = 0; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
528 for (i = 0; i < 6; i++) { |
| 324 | 529 if (s->block_last_index[i] >= 0) |
| 530 cbp |= 1 << (5 - i); | |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
531 } |
| 324 | 532 |
| 533 if(s->pict_type==B_TYPE){ | |
| 534 static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */ | |
| 535 int mb_type= mb_type_table[s->mv_dir]; | |
| 536 | |
| 537 if(s->mb_x==0){ | |
| 538 s->last_mv[0][0][0]= | |
| 539 s->last_mv[0][0][1]= | |
| 540 s->last_mv[1][0][0]= | |
| 541 s->last_mv[1][0][1]= 0; | |
| 542 } | |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
543 |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
544 assert(s->dquant>=-2 && s->dquant<=2); |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
545 assert((s->dquant&1)==0); |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
546 assert(mb_type>=0); |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
547 |
| 324 | 548 /* nothing to do if this MB was skiped in the next P Frame */ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
549 if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ... |
| 324 | 550 s->skip_count++; |
| 551 s->mv[0][0][0]= | |
| 552 s->mv[0][0][1]= | |
| 553 s->mv[1][0][0]= | |
| 554 s->mv[1][0][1]= 0; | |
| 327 | 555 s->mv_dir= MV_DIR_FORWARD; //doesnt matter |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
556 s->qscale -= s->dquant; |
| 903 | 557 // s->mb_skiped=1; |
| 558 | |
| 324 | 559 return; |
| 560 } | |
| 936 | 561 |
| 324 | 562 if ((cbp | motion_x | motion_y | mb_type) ==0) { |
| 563 /* direct MB with MV={0,0} */ | |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
564 assert(s->dquant==0); |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
565 |
| 324 | 566 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */ |
| 453 | 567 |
| 568 if(interleaved_stats){ | |
| 569 s->misc_bits++; | |
| 570 s->last_bits++; | |
| 571 } | |
| 324 | 572 s->skip_count++; |
| 573 return; | |
| 574 } | |
| 903 | 575 |
| 324 | 576 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */ |
| 577 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge | |
| 578 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we dont need it :) | |
| 579 if(cbp) put_bits(&s->pb, 6, cbp); | |
| 580 | |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
581 if(cbp && mb_type){ |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
582 if(s->dquant) |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
583 put_bits(&s->pb, 2, (s->dquant>>2)+3); |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
584 else |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
585 put_bits(&s->pb, 1, 0); |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
586 }else |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
587 s->qscale -= s->dquant; |
| 697 | 588 |
| 589 if(!s->progressive_sequence){ | |
| 590 if(cbp) | |
| 591 put_bits(&s->pb, 1, s->interlaced_dct); | |
| 592 if(mb_type) // not diect mode | |
| 593 put_bits(&s->pb, 1, 0); // no interlaced ME yet | |
| 594 } | |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
595 |
| 453 | 596 if(interleaved_stats){ |
| 1164 | 597 s->misc_bits+= get_bits_diff(s); |
| 453 | 598 } |
| 295 | 599 |
| 324 | 600 switch(mb_type) |
| 601 { | |
| 602 case 0: /* direct */ | |
| 603 h263_encode_motion(s, motion_x, 1); | |
| 604 h263_encode_motion(s, motion_y, 1); | |
|
656
e47fa3e3f2d5
statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents:
654
diff
changeset
|
605 s->b_count++; |
|
e47fa3e3f2d5
statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents:
654
diff
changeset
|
606 s->f_count++; |
| 324 | 607 break; |
| 608 case 1: /* bidir */ | |
| 609 h263_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code); | |
| 610 h263_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code); | |
| 611 h263_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code); | |
| 612 h263_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code); | |
| 613 s->last_mv[0][0][0]= s->mv[0][0][0]; | |
| 614 s->last_mv[0][0][1]= s->mv[0][0][1]; | |
| 615 s->last_mv[1][0][0]= s->mv[1][0][0]; | |
| 616 s->last_mv[1][0][1]= s->mv[1][0][1]; | |
|
656
e47fa3e3f2d5
statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents:
654
diff
changeset
|
617 s->b_count++; |
|
e47fa3e3f2d5
statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents:
654
diff
changeset
|
618 s->f_count++; |
| 324 | 619 break; |
| 620 case 2: /* backward */ | |
| 621 h263_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code); | |
| 622 h263_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code); | |
| 623 s->last_mv[1][0][0]= motion_x; | |
| 624 s->last_mv[1][0][1]= motion_y; | |
|
656
e47fa3e3f2d5
statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents:
654
diff
changeset
|
625 s->b_count++; |
| 324 | 626 break; |
| 627 case 3: /* forward */ | |
| 628 h263_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code); | |
| 629 h263_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code); | |
| 630 s->last_mv[0][0][0]= motion_x; | |
| 631 s->last_mv[0][0][1]= motion_y; | |
|
656
e47fa3e3f2d5
statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents:
654
diff
changeset
|
632 s->f_count++; |
| 324 | 633 break; |
| 327 | 634 default: |
| 635 printf("unknown mb type\n"); | |
| 324 | 636 return; |
| 637 } | |
| 453 | 638 |
| 639 if(interleaved_stats){ | |
| 1164 | 640 s->mv_bits+= get_bits_diff(s); |
| 453 | 641 } |
| 295 | 642 |
| 324 | 643 /* encode each block */ |
| 644 for (i = 0; i < 6; i++) { | |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
702
diff
changeset
|
645 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, &s->pb); |
| 324 | 646 } |
| 453 | 647 |
| 648 if(interleaved_stats){ | |
| 1164 | 649 s->p_tex_bits+= get_bits_diff(s); |
| 453 | 650 } |
| 324 | 651 }else{ /* s->pict_type==B_TYPE */ |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
652 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) { |
| 331 | 653 /* check if the B frames can skip it too, as we must skip it if we skip here |
| 654 why didnt they just compress the skip-mb bits instead of reusing them ?! */ | |
| 655 if(s->max_b_frames>0){ | |
| 656 int i; | |
|
364
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
657 int x,y, offset; |
|
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
658 uint8_t *p_pic; |
|
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
659 |
|
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
660 x= s->mb_x*16; |
|
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
661 y= s->mb_y*16; |
|
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
662 if(x+16 > s->width) x= s->width-16; |
|
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
663 if(y+16 > s->height) y= s->height-16; |
|
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
664 |
|
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
665 offset= x + y*s->linesize; |
| 903 | 666 p_pic= s->new_picture.data[0] + offset; |
|
364
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
667 |
| 331 | 668 s->mb_skiped=1; |
| 669 for(i=0; i<s->max_b_frames; i++){ | |
| 339 | 670 uint8_t *b_pic; |
| 671 int diff; | |
| 903 | 672 Picture *pic= s->reordered_input_picture[i+1]; |
| 673 | |
| 674 if(pic==NULL || pic->pict_type!=B_TYPE) break; | |
| 675 | |
| 676 b_pic= pic->data[0] + offset + 16; //FIXME +16 | |
|
853
eacc2dd8fd9d
* using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents:
847
diff
changeset
|
677 diff= s->dsp.pix_abs16x16(p_pic, b_pic, s->linesize); |
|
364
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
678 if(diff>s->qscale*70){ //FIXME check that 70 is optimal |
| 331 | 679 s->mb_skiped=0; |
| 680 break; | |
| 681 } | |
| 682 } | |
| 683 }else | |
| 684 s->mb_skiped=1; | |
| 685 | |
| 686 if(s->mb_skiped==1){ | |
| 687 /* skip macroblock */ | |
| 688 put_bits(&s->pb, 1, 1); | |
| 453 | 689 |
| 690 if(interleaved_stats){ | |
| 691 s->misc_bits++; | |
| 692 s->last_bits++; | |
| 693 } | |
| 331 | 694 s->skip_count++; |
|
1271
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
695 |
| 331 | 696 return; |
| 697 } | |
| 295 | 698 } |
|
364
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
699 |
| 324 | 700 put_bits(&s->pb, 1, 0); /* mb coded */ |
| 701 if(s->mv_type==MV_TYPE_16X16){ | |
| 702 cbpc = cbp & 3; | |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
703 if(s->dquant) cbpc+= 8; |
| 324 | 704 put_bits(&s->pb, |
| 705 inter_MCBPC_bits[cbpc], | |
| 706 inter_MCBPC_code[cbpc]); | |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
707 |
| 324 | 708 cbpy = cbp >> 2; |
| 709 cbpy ^= 0xf; | |
| 453 | 710 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
711 if(s->dquant) |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
712 put_bits(pb2, 2, dquant_code[s->dquant+2]); |
| 697 | 713 |
| 714 if(!s->progressive_sequence){ | |
| 715 if(cbp) | |
| 716 put_bits(pb2, 1, s->interlaced_dct); | |
| 717 put_bits(pb2, 1, 0); // no interlaced ME yet | |
| 718 } | |
| 324 | 719 |
| 453 | 720 if(interleaved_stats){ |
| 1164 | 721 s->misc_bits+= get_bits_diff(s); |
| 453 | 722 } |
| 324 | 723 |
| 724 /* motion vectors: 16x16 mode */ | |
| 725 h263_pred_motion(s, 0, &pred_x, &pred_y); | |
| 726 | |
| 727 h263_encode_motion(s, motion_x - pred_x, s->f_code); | |
| 728 h263_encode_motion(s, motion_y - pred_y, s->f_code); | |
| 729 }else{ | |
| 730 cbpc = (cbp & 3)+16; | |
| 731 put_bits(&s->pb, | |
| 732 inter_MCBPC_bits[cbpc], | |
| 733 inter_MCBPC_code[cbpc]); | |
| 734 cbpy = cbp >> 2; | |
| 735 cbpy ^= 0xf; | |
| 453 | 736 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); |
| 737 | |
| 757 | 738 if(!s->progressive_sequence){ |
| 739 if(cbp) | |
| 740 put_bits(pb2, 1, s->interlaced_dct); | |
| 741 } | |
| 742 | |
| 453 | 743 if(interleaved_stats){ |
| 1164 | 744 s->misc_bits+= get_bits_diff(s); |
| 453 | 745 } |
| 324 | 746 |
| 747 for(i=0; i<4; i++){ | |
| 748 /* motion vectors: 8x8 mode*/ | |
| 749 h263_pred_motion(s, i, &pred_x, &pred_y); | |
| 750 | |
| 751 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][0] - pred_x, s->f_code); | |
| 752 h263_encode_motion(s, s->motion_val[ s->block_index[i] ][1] - pred_y, s->f_code); | |
| 753 } | |
| 754 } | |
| 453 | 755 |
| 756 if(interleaved_stats){ | |
| 1164 | 757 s->mv_bits+= get_bits_diff(s); |
| 453 | 758 } |
| 324 | 759 |
| 760 /* encode each block */ | |
| 761 for (i = 0; i < 6; i++) { | |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
702
diff
changeset
|
762 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, NULL, tex_pb); |
| 324 | 763 } |
| 453 | 764 |
| 765 if(interleaved_stats){ | |
| 1164 | 766 s->p_tex_bits+= get_bits_diff(s); |
| 453 | 767 } |
|
656
e47fa3e3f2d5
statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents:
654
diff
changeset
|
768 s->f_count++; |
| 295 | 769 } |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
770 } else { |
| 324 | 771 int cbp; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
772 int dc_diff[6]; //dc values with the dc prediction subtracted |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
773 int dir[6]; //prediction direction |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
774 int zigzag_last_index[6]; |
| 1064 | 775 uint8_t *scan_table[6]; |
| 1057 | 776 int i; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
777 |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
778 for(i=0; i<6; i++){ |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
779 const int level= block[i][0]; |
| 1064 | 780 uint16_t *dc_ptr; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
781 |
| 498 | 782 dc_diff[i]= level - ff_mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]); |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
783 if (i < 4) { |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
784 *dc_ptr = level * s->y_dc_scale; |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
785 } else { |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
786 *dc_ptr = level * s->c_dc_scale; |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
787 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
788 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
789 |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
790 s->ac_pred= decide_ac_pred(s, block, dir); |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
791 |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
792 if(s->ac_pred){ |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
793 for(i=0; i<6; i++){ |
| 1064 | 794 uint8_t *st; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
795 int last_index; |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
796 |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
797 mpeg4_inv_pred_ac(s, block[i], i, dir[i]); |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
702
diff
changeset
|
798 if (dir[i]==0) st = s->intra_v_scantable.permutated; /* left */ |
|
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
702
diff
changeset
|
799 else st = s->intra_h_scantable.permutated; /* top */ |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
800 |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
801 for(last_index=63; last_index>=0; last_index--) //FIXME optimize |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
802 if(block[i][st[last_index]]) break; |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
803 zigzag_last_index[i]= s->block_last_index[i]; |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
804 s->block_last_index[i]= last_index; |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
805 scan_table[i]= st; |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
806 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
807 }else{ |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
808 for(i=0; i<6; i++) |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
702
diff
changeset
|
809 scan_table[i]= s->intra_scantable.permutated; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
810 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
811 |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
812 /* compute cbp */ |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
813 cbp = 0; |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
814 for (i = 0; i < 6; i++) { |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
815 if (s->block_last_index[i] >= 1) |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
816 cbp |= 1 << (5 - i); |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
817 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
818 |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
819 cbpc = cbp & 3; |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
820 if (s->pict_type == I_TYPE) { |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
821 if(s->dquant) cbpc+=4; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
822 put_bits(&s->pb, |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
823 intra_MCBPC_bits[cbpc], |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
824 intra_MCBPC_code[cbpc]); |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
825 } else { |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
826 if(s->dquant) cbpc+=8; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
827 put_bits(&s->pb, 1, 0); /* mb coded */ |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
828 put_bits(&s->pb, |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
829 inter_MCBPC_bits[cbpc + 4], |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
830 inter_MCBPC_code[cbpc + 4]); |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
831 } |
| 453 | 832 put_bits(pb2, 1, s->ac_pred); |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
833 cbpy = cbp >> 2; |
| 453 | 834 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
835 if(s->dquant) |
|
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
836 put_bits(dc_pb, 2, dquant_code[s->dquant+2]); |
| 453 | 837 |
| 697 | 838 if(!s->progressive_sequence){ |
| 839 put_bits(dc_pb, 1, s->interlaced_dct); | |
| 840 } | |
| 841 | |
| 453 | 842 if(interleaved_stats){ |
| 1164 | 843 s->misc_bits+= get_bits_diff(s); |
| 453 | 844 } |
| 286 | 845 |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
846 /* encode each block */ |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
847 for (i = 0; i < 6; i++) { |
| 453 | 848 mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i], dc_pb, tex_pb); |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
849 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
850 |
| 453 | 851 if(interleaved_stats){ |
| 1164 | 852 s->i_tex_bits+= get_bits_diff(s); |
| 453 | 853 } |
| 286 | 854 s->i_count++; |
| 855 | |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
856 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */ |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
857 if(s->ac_pred){ |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
858 for(i=0; i<6; i++){ |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
859 int j; |
| 1064 | 860 int16_t *ac_val; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
861 |
| 266 | 862 ac_val = s->ac_val[0][0] + s->block_index[i] * 16; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
863 |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
864 if(dir[i]){ |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
865 for(j=1; j<8; j++) |
| 1092 | 866 block[i][s->dsp.idct_permutation[j ]]= ac_val[j+8]; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
867 }else{ |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
868 for(j=1; j<8; j++) |
| 1092 | 869 block[i][s->dsp.idct_permutation[j<<3]]= ac_val[j ]; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
870 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
871 s->block_last_index[i]= zigzag_last_index[i]; |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
872 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
873 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
874 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
875 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
876 |
| 0 | 877 void h263_encode_mb(MpegEncContext * s, |
| 878 DCTELEM block[6][64], | |
| 879 int motion_x, int motion_y) | |
| 880 { | |
| 881 int cbpc, cbpy, i, cbp, pred_x, pred_y; | |
| 1064 | 882 int16_t pred_dc; |
| 883 int16_t rec_intradc[6]; | |
| 884 uint16_t *dc_ptr[6]; | |
|
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
885 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1); |
| 695 | 886 const int dquant_code[5]= {1,0,9,2,3}; |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
887 |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
888 //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y); |
| 324 | 889 if (!s->mb_intra) { |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
890 /* compute cbp */ |
| 324 | 891 cbp = 0; |
| 892 for (i = 0; i < 6; i++) { | |
| 893 if (s->block_last_index[i] >= 0) | |
| 894 cbp |= 1 << (5 - i); | |
| 895 } | |
| 695 | 896 if ((cbp | motion_x | motion_y | s->dquant) == 0) { |
| 324 | 897 /* skip macroblock */ |
| 898 put_bits(&s->pb, 1, 1); | |
|
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
899 if(interleaved_stats){ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
900 s->misc_bits++; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
901 s->last_bits++; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
902 } |
| 324 | 903 return; |
| 904 } | |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
905 put_bits(&s->pb, 1, 0); /* mb coded */ |
| 324 | 906 cbpc = cbp & 3; |
| 695 | 907 if(s->dquant) cbpc+= 8; |
| 324 | 908 put_bits(&s->pb, |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
909 inter_MCBPC_bits[cbpc], |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
910 inter_MCBPC_code[cbpc]); |
| 324 | 911 cbpy = cbp >> 2; |
| 912 cbpy ^= 0xf; | |
| 913 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); | |
| 695 | 914 if(s->dquant) |
| 915 put_bits(&s->pb, 2, dquant_code[s->dquant+2]); | |
| 0 | 916 |
|
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
917 if(interleaved_stats){ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
918 s->misc_bits+= get_bits_diff(s); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
919 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
920 |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
921 /* motion vectors: 16x16 mode only now */ |
| 324 | 922 h263_pred_motion(s, 0, &pred_x, &pred_y); |
| 78 | 923 |
| 324 | 924 if (!s->umvplus) { |
| 925 h263_encode_motion(s, motion_x - pred_x, s->f_code); | |
| 926 h263_encode_motion(s, motion_y - pred_y, s->f_code); | |
| 927 } | |
| 928 else { | |
| 929 h263p_encode_umotion(s, motion_x - pred_x); | |
| 930 h263p_encode_umotion(s, motion_y - pred_y); | |
| 931 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1)) | |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
932 /* To prevent Start Code emulation */ |
| 324 | 933 put_bits(&s->pb,1,1); |
| 934 } | |
|
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
935 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
936 if(interleaved_stats){ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
937 s->mv_bits+= get_bits_diff(s); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
938 } |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
939 } else { |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
940 int li = s->h263_aic ? 0 : 1; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
941 |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
942 cbp = 0; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
943 for(i=0; i<6; i++) { |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
944 /* Predict DC */ |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
945 if (s->h263_aic && s->mb_intra) { |
| 1064 | 946 int16_t level = block[i][0]; |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
947 |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
948 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]); |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
949 level -= pred_dc; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
950 /* Quant */ |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
951 if (level < 0) |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
952 level = (level + (s->qscale >> 1))/(s->y_dc_scale); |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
953 else |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
954 level = (level - (s->qscale >> 1))/(s->y_dc_scale); |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
955 |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
956 /* AIC can change CBP */ |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
957 if (level == 0 && s->block_last_index[i] == 0) |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
958 s->block_last_index[i] = -1; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
959 else if (level < -127) |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
960 level = -127; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
961 else if (level > 127) |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
962 level = 127; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
963 |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
964 block[i][0] = level; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
965 /* Reconstruction */ |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
966 rec_intradc[i] = (s->y_dc_scale*level) + pred_dc; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
967 /* Oddify */ |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
968 rec_intradc[i] |= 1; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
969 //if ((rec_intradc[i] % 2) == 0) |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
970 // rec_intradc[i]++; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
971 /* Clipping */ |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
972 if (rec_intradc[i] < 0) |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
973 rec_intradc[i] = 0; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
974 else if (rec_intradc[i] > 2047) |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
975 rec_intradc[i] = 2047; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
976 |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
977 /* Update AC/DC tables */ |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
978 *dc_ptr[i] = rec_intradc[i]; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
979 } |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
980 /* compute cbp */ |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
981 if (s->block_last_index[i] >= li) |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
982 cbp |= 1 << (5 - i); |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
983 } |
| 0 | 984 |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
985 cbpc = cbp & 3; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
986 if (s->pict_type == I_TYPE) { |
| 695 | 987 if(s->dquant) cbpc+=4; |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
988 put_bits(&s->pb, |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
989 intra_MCBPC_bits[cbpc], |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
990 intra_MCBPC_code[cbpc]); |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
991 } else { |
| 695 | 992 if(s->dquant) cbpc+=8; |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
993 put_bits(&s->pb, 1, 0); /* mb coded */ |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
994 put_bits(&s->pb, |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
995 inter_MCBPC_bits[cbpc + 4], |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
996 inter_MCBPC_code[cbpc + 4]); |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
997 } |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
998 if (s->h263_aic) { |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
999 /* XXX: currently, we do not try to use ac prediction */ |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1000 put_bits(&s->pb, 1, 0); /* no AC prediction */ |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1001 } |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1002 cbpy = cbp >> 2; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1003 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); |
| 695 | 1004 if(s->dquant) |
| 1005 put_bits(&s->pb, 2, dquant_code[s->dquant+2]); | |
|
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1006 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1007 if(interleaved_stats){ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1008 s->misc_bits+= get_bits_diff(s); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1009 } |
| 0 | 1010 } |
| 1011 | |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1012 for(i=0; i<6; i++) { |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1013 /* encode each block */ |
|
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1014 if (s->h263_flv > 1) |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1015 h263_flv_encode_block(s, block[i], i); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1016 else |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1017 h263_encode_block(s, block[i], i); |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1018 |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1019 /* Update INTRADC for decoding */ |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1020 if (s->h263_aic && s->mb_intra) { |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1021 block[i][0] = rec_intradc[i]; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1022 |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1023 } |
| 0 | 1024 } |
|
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1025 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1026 if(interleaved_stats){ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1027 if (!s->mb_intra) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1028 s->p_tex_bits+= get_bits_diff(s); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1029 s->f_count++; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1030 }else{ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1031 s->i_tex_bits+= get_bits_diff(s); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1032 s->i_count++; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1033 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1034 } |
| 0 | 1035 } |
|
815
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
1036 #endif |
| 0 | 1037 |
| 1064 | 1038 static int h263_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr) |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1039 { |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1040 int x, y, wrap, a, c, pred_dc, scale; |
| 1064 | 1041 int16_t *dc_val, *ac_val; |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1042 |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1043 /* find prediction */ |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1044 if (n < 4) { |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1045 x = 2 * s->mb_x + 1 + (n & 1); |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1046 y = 2 * s->mb_y + 1 + ((n & 2) >> 1); |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1047 wrap = s->mb_width * 2 + 2; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1048 dc_val = s->dc_val[0]; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1049 ac_val = s->ac_val[0][0]; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1050 scale = s->y_dc_scale; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1051 } else { |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1052 x = s->mb_x + 1; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1053 y = s->mb_y + 1; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1054 wrap = s->mb_width + 2; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1055 dc_val = s->dc_val[n - 4 + 1]; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1056 ac_val = s->ac_val[n - 4 + 1][0]; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1057 scale = s->c_dc_scale; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1058 } |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1059 /* B C |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1060 * A X |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1061 */ |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1062 a = dc_val[(x - 1) + (y) * wrap]; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1063 c = dc_val[(x) + (y - 1) * wrap]; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1064 |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1065 /* No prediction outside GOB boundary */ |
| 453 | 1066 if (s->first_slice_line && ((n < 2) || (n > 3))) |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1067 c = 1024; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1068 pred_dc = 1024; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1069 /* just DC prediction */ |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1070 if (a != 1024 && c != 1024) |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1071 pred_dc = (a + c) >> 1; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1072 else if (a != 1024) |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1073 pred_dc = a; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1074 else |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1075 pred_dc = c; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1076 |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1077 /* we assume pred is positive */ |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1078 //pred_dc = (pred_dc + (scale >> 1)) / scale; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1079 *dc_val_ptr = &dc_val[x + y * wrap]; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1080 return pred_dc; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1081 } |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1082 |
| 1057 | 1083 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n) |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1084 { |
|
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1085 int x, y, wrap, a, c, pred_dc, scale, i; |
| 1064 | 1086 int16_t *dc_val, *ac_val, *ac_val1; |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1087 |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1088 /* find prediction */ |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1089 if (n < 4) { |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1090 x = 2 * s->mb_x + 1 + (n & 1); |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1091 y = 2 * s->mb_y + 1 + ((n & 2) >> 1); |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1092 wrap = s->mb_width * 2 + 2; |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1093 dc_val = s->dc_val[0]; |
|
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1094 ac_val = s->ac_val[0][0]; |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1095 scale = s->y_dc_scale; |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1096 } else { |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1097 x = s->mb_x + 1; |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1098 y = s->mb_y + 1; |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1099 wrap = s->mb_width + 2; |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1100 dc_val = s->dc_val[n - 4 + 1]; |
|
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1101 ac_val = s->ac_val[n - 4 + 1][0]; |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1102 scale = s->c_dc_scale; |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1103 } |
|
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1104 |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1105 ac_val += ((y) * wrap + (x)) * 16; |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1106 ac_val1 = ac_val; |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1107 |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1108 /* B C |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1109 * A X |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1110 */ |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1111 a = dc_val[(x - 1) + (y) * wrap]; |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1112 c = dc_val[(x) + (y - 1) * wrap]; |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1113 |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1114 /* No prediction outside GOB boundary */ |
| 453 | 1115 if (s->first_slice_line && ((n < 2) || (n > 3))) |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1116 c = 1024; |
|
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1117 pred_dc = 1024; |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1118 if (s->ac_pred) { |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1119 if (s->h263_aic_dir) { |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1120 /* left prediction */ |
|
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1121 if (a != 1024) { |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1122 ac_val -= 16; |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1123 for(i=1;i<8;i++) { |
| 1092 | 1124 block[s->dsp.idct_permutation[i<<3]] += ac_val[i]; |
|
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1125 } |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1126 pred_dc = a; |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1127 } |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1128 } else { |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1129 /* top prediction */ |
|
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1130 if (c != 1024) { |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1131 ac_val -= 16 * wrap; |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1132 for(i=1;i<8;i++) { |
| 1092 | 1133 block[s->dsp.idct_permutation[i ]] += ac_val[i + 8]; |
|
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1134 } |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1135 pred_dc = c; |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1136 } |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1137 } |
|
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1138 } else { |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1139 /* just DC prediction */ |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1140 if (a != 1024 && c != 1024) |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1141 pred_dc = (a + c) >> 1; |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1142 else if (a != 1024) |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1143 pred_dc = a; |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1144 else |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1145 pred_dc = c; |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1146 } |
|
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1147 |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1148 /* we assume pred is positive */ |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1149 block[0]=block[0]*scale + pred_dc; |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1150 |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1151 if (block[0] < 0) |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1152 block[0] = 0; |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1153 else if (!(block[0] & 1)) |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1154 block[0]++; |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1155 |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1156 /* Update AC/DC tables */ |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1157 dc_val[(x) + (y) * wrap] = block[0]; |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1158 |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1159 /* left copy */ |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1160 for(i=1;i<8;i++) |
| 1092 | 1161 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]]; |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1162 /* top copy */ |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1163 for(i=1;i<8;i++) |
| 1092 | 1164 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]]; |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1165 } |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1166 |
| 1064 | 1167 int16_t *h263_pred_motion(MpegEncContext * s, int block, |
| 0 | 1168 int *px, int *py) |
| 1169 { | |
| 266 | 1170 int xy, wrap; |
| 1064 | 1171 int16_t *A, *B, *C, *mot_val; |
|
264
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
263
diff
changeset
|
1172 static const int off[4]= {2, 1, 1, -1}; |
| 0 | 1173 |
| 266 | 1174 wrap = s->block_wrap[0]; |
| 1175 xy = s->block_index[block]; | |
| 0 | 1176 |
| 245 | 1177 mot_val = s->motion_val[xy]; |
| 0 | 1178 |
| 453 | 1179 A = s->motion_val[xy - 1]; |
| 1180 /* special case for first (slice) line */ | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
1181 if (s->first_slice_line && block<3) { |
| 453 | 1182 // we cant just change some MVs to simulate that as we need them for the B frames (and ME) |
| 1183 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :( | |
| 1184 if(block==0){ //most common case | |
| 1185 if(s->mb_x == s->resync_mb_x){ //rare | |
| 1186 *px= *py = 0; | |
| 1187 }else if(s->mb_x + 1 == s->resync_mb_x){ //rare | |
| 1188 C = s->motion_val[xy + off[block] - wrap]; | |
| 1189 if(s->mb_x==0){ | |
| 1190 *px = C[0]; | |
| 1191 *py = C[1]; | |
| 1192 }else{ | |
| 1193 *px = mid_pred(A[0], 0, C[0]); | |
| 1194 *py = mid_pred(A[1], 0, C[1]); | |
| 1195 } | |
| 1196 }else{ | |
| 1197 *px = A[0]; | |
| 1198 *py = A[1]; | |
| 1199 } | |
| 1200 }else if(block==1){ | |
| 1201 if(s->mb_x + 1 == s->resync_mb_x){ //rare | |
| 1202 C = s->motion_val[xy + off[block] - wrap]; | |
| 1203 *px = mid_pred(A[0], 0, C[0]); | |
| 1204 *py = mid_pred(A[1], 0, C[1]); | |
| 1205 }else{ | |
| 1206 *px = A[0]; | |
| 1207 *py = A[1]; | |
| 1208 } | |
| 1209 }else{ /* block==2*/ | |
| 1210 B = s->motion_val[xy - wrap]; | |
| 1211 C = s->motion_val[xy + off[block] - wrap]; | |
| 1212 if(s->mb_x == s->resync_mb_x) //rare | |
| 1213 A[0]=A[1]=0; | |
| 1214 | |
| 1215 *px = mid_pred(A[0], B[0], C[0]); | |
| 1216 *py = mid_pred(A[1], B[1], C[1]); | |
| 1217 } | |
| 0 | 1218 } else { |
|
264
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
263
diff
changeset
|
1219 B = s->motion_val[xy - wrap]; |
|
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
263
diff
changeset
|
1220 C = s->motion_val[xy + off[block] - wrap]; |
| 0 | 1221 *px = mid_pred(A[0], B[0], C[0]); |
| 1222 *py = mid_pred(A[1], B[1], C[1]); | |
| 1223 } | |
| 1224 return mot_val; | |
| 1225 } | |
| 1226 | |
|
815
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
1227 #ifdef CONFIG_ENCODERS |
| 324 | 1228 static void h263_encode_motion(MpegEncContext * s, int val, int f_code) |
| 0 | 1229 { |
| 702 | 1230 int range, l, bit_size, sign, code, bits; |
| 0 | 1231 |
| 1232 if (val == 0) { | |
| 1233 /* zero vector */ | |
| 1234 code = 0; | |
| 1235 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]); | |
| 1236 } else { | |
| 324 | 1237 bit_size = f_code - 1; |
| 0 | 1238 range = 1 << bit_size; |
| 1239 /* modulo encoding */ | |
| 1240 l = range * 32; | |
| 702 | 1241 #if 1 |
| 1242 val+= l; | |
| 1243 val&= 2*l-1; | |
| 1244 val-= l; | |
| 1245 sign = val>>31; | |
| 1246 val= (val^sign)-sign; | |
| 1247 sign&=1; | |
| 1248 #else | |
| 0 | 1249 if (val < -l) { |
| 702 | 1250 val += 2*l; |
| 0 | 1251 } else if (val >= l) { |
| 702 | 1252 val -= 2*l; |
| 0 | 1253 } |
| 702 | 1254 |
|
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
1255 assert(val>=-l && val<l); |
| 0 | 1256 |
| 1257 if (val >= 0) { | |
| 1258 sign = 0; | |
| 1259 } else { | |
| 1260 val = -val; | |
| 1261 sign = 1; | |
| 1262 } | |
| 702 | 1263 #endif |
| 312 | 1264 val--; |
| 1265 code = (val >> bit_size) + 1; | |
| 1266 bits = val & (range - 1); | |
| 0 | 1267 |
| 1268 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign); | |
| 1269 if (bit_size > 0) { | |
| 1270 put_bits(&s->pb, bit_size, bits); | |
| 1271 } | |
| 1272 } | |
| 718 | 1273 |
| 0 | 1274 } |
| 1275 | |
| 78 | 1276 /* Encode MV differences on H.263+ with Unrestricted MV mode */ |
| 1277 static void h263p_encode_umotion(MpegEncContext * s, int val) | |
| 1278 { | |
| 1279 short sval = 0; | |
| 1280 short i = 0; | |
| 1281 short n_bits = 0; | |
| 1282 short temp_val; | |
| 1283 int code = 0; | |
| 1284 int tcode; | |
| 1285 | |
| 1286 if ( val == 0) | |
| 1287 put_bits(&s->pb, 1, 1); | |
| 1288 else if (val == 1) | |
| 1289 put_bits(&s->pb, 3, 0); | |
| 1290 else if (val == -1) | |
| 1291 put_bits(&s->pb, 3, 2); | |
| 1292 else { | |
| 1293 | |
| 1294 sval = ((val < 0) ? (short)(-val):(short)val); | |
| 1295 temp_val = sval; | |
| 1296 | |
| 1297 while (temp_val != 0) { | |
| 1298 temp_val = temp_val >> 1; | |
| 1299 n_bits++; | |
| 1300 } | |
| 1301 | |
| 1302 i = n_bits - 1; | |
| 1303 while (i > 0) { | |
| 1304 tcode = (sval & (1 << (i-1))) >> (i-1); | |
| 1305 tcode = (tcode << 1) | 1; | |
| 1306 code = (code << 2) | tcode; | |
| 1307 i--; | |
| 1308 } | |
| 1309 code = ((code << 1) | (val < 0)) << 1; | |
| 1310 put_bits(&s->pb, (2*n_bits)+1, code); | |
| 1311 //printf("\nVal = %d\tCode = %d", sval, code); | |
| 1312 } | |
| 1313 } | |
| 1314 | |
|
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1315 static void init_mv_penalty_and_fcode(MpegEncContext *s) |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1316 { |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1317 int f_code; |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1318 int mv; |
|
815
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
1319 |
|
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
1320 if(mv_penalty==NULL) |
| 1162 | 1321 mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) ); |
|
815
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
1322 |
|
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1323 for(f_code=1; f_code<=MAX_FCODE; f_code++){ |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1324 for(mv=-MAX_MV; mv<=MAX_MV; mv++){ |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1325 int len; |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1326 |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1327 if(mv==0) len= mvtab[0][1]; |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1328 else{ |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1329 int val, bit_size, range, code; |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1330 |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1331 bit_size = s->f_code - 1; |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1332 range = 1 << bit_size; |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1333 |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1334 val=mv; |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1335 if (val < 0) |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1336 val = -val; |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1337 val--; |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1338 code = (val >> bit_size) + 1; |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1339 if(code<33){ |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1340 len= mvtab[code][1] + 1 + bit_size; |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1341 }else{ |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1342 len= mvtab[32][1] + 2 + bit_size; |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1343 } |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1344 } |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1345 |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1346 mv_penalty[f_code][mv+MAX_MV]= len; |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1347 } |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1348 } |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1349 |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1350 for(f_code=MAX_FCODE; f_code>0; f_code--){ |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1351 for(mv=-(16<<f_code); mv<(16<<f_code); mv++){ |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1352 fcode_tab[mv+MAX_MV]= f_code; |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1353 } |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1354 } |
| 287 | 1355 |
| 1356 for(mv=0; mv<MAX_MV*2+1; mv++){ | |
| 1357 umv_fcode_tab[mv]= 1; | |
| 1358 } | |
|
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1359 } |
|
815
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
1360 #endif |
|
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1361 |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
1362 #ifdef CONFIG_ENCODERS |
|
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
1363 |
| 468 | 1364 static void init_uni_dc_tab(void) |
| 293 | 1365 { |
| 1366 int level, uni_code, uni_len; | |
| 1367 | |
| 312 | 1368 for(level=-256; level<256; level++){ |
| 293 | 1369 int size, v, l; |
| 1370 /* find number of bits */ | |
| 1371 size = 0; | |
| 1372 v = abs(level); | |
| 1373 while (v) { | |
| 1374 v >>= 1; | |
| 1375 size++; | |
| 1376 } | |
| 1377 | |
| 1378 if (level < 0) | |
| 1379 l= (-level) ^ ((1 << size) - 1); | |
| 1380 else | |
| 1381 l= level; | |
| 1382 | |
| 1383 /* luminance */ | |
| 1384 uni_code= DCtab_lum[size][0]; | |
| 1385 uni_len = DCtab_lum[size][1]; | |
| 1386 | |
| 1387 if (size > 0) { | |
| 1388 uni_code<<=size; uni_code|=l; | |
| 1389 uni_len+=size; | |
| 1390 if (size > 8){ | |
| 1391 uni_code<<=1; uni_code|=1; | |
| 1392 uni_len++; | |
| 1393 } | |
| 1394 } | |
| 1013 | 1395 uni_DCtab_lum_bits[level+256]= uni_code; |
| 1396 uni_DCtab_lum_len [level+256]= uni_len; | |
| 293 | 1397 |
| 1398 /* chrominance */ | |
| 1399 uni_code= DCtab_chrom[size][0]; | |
| 1400 uni_len = DCtab_chrom[size][1]; | |
| 1401 | |
| 1402 if (size > 0) { | |
| 1403 uni_code<<=size; uni_code|=l; | |
| 1404 uni_len+=size; | |
| 1405 if (size > 8){ | |
| 1406 uni_code<<=1; uni_code|=1; | |
| 1407 uni_len++; | |
| 1408 } | |
| 1409 } | |
| 1013 | 1410 uni_DCtab_chrom_bits[level+256]= uni_code; |
| 1411 uni_DCtab_chrom_len [level+256]= uni_len; | |
| 293 | 1412 |
| 1413 } | |
| 1414 } | |
| 1415 | |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
1416 #endif //CONFIG_ENCODERS |
|
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
1417 |
|
815
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
1418 #ifdef CONFIG_ENCODERS |
| 1064 | 1419 static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){ |
|
648
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1420 int slevel, run, last; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1421 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1422 assert(MAX_LEVEL >= 64); |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1423 assert(MAX_RUN >= 63); |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1424 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1425 for(slevel=-64; slevel<64; slevel++){ |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1426 if(slevel==0) continue; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1427 for(run=0; run<64; run++){ |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1428 for(last=0; last<=1; last++){ |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1429 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64); |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1430 int level= slevel < 0 ? -slevel : slevel; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1431 int sign= slevel < 0 ? 1 : 0; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1432 int bits, len, code; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1433 int level1, run1; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1434 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1435 len_tab[index]= 100; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1436 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1437 /* ESC0 */ |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1438 code= get_rl_index(rl, last, run, level); |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1439 bits= rl->table_vlc[code][0]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1440 len= rl->table_vlc[code][1]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1441 bits=bits*2+sign; len++; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1442 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1443 if(code!=rl->n && len < len_tab[index]){ |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1444 bits_tab[index]= bits; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1445 len_tab [index]= len; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1446 } |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1447 #if 1 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1448 /* ESC1 */ |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1449 bits= rl->table_vlc[rl->n][0]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1450 len= rl->table_vlc[rl->n][1]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1451 bits=bits*2; len++; //esc1 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1452 level1= level - rl->max_level[last][run]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1453 if(level1>0){ |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1454 code= get_rl_index(rl, last, run, level1); |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1455 bits<<= rl->table_vlc[code][1]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1456 len += rl->table_vlc[code][1]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1457 bits += rl->table_vlc[code][0]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1458 bits=bits*2+sign; len++; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1459 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1460 if(code!=rl->n && len < len_tab[index]){ |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1461 bits_tab[index]= bits; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1462 len_tab [index]= len; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1463 } |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1464 } |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1465 #endif |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1466 #if 1 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1467 /* ESC2 */ |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1468 bits= rl->table_vlc[rl->n][0]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1469 len= rl->table_vlc[rl->n][1]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1470 bits=bits*4+2; len+=2; //esc2 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1471 run1 = run - rl->max_run[last][level] - 1; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1472 if(run1>=0){ |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1473 code= get_rl_index(rl, last, run1, level); |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1474 bits<<= rl->table_vlc[code][1]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1475 len += rl->table_vlc[code][1]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1476 bits += rl->table_vlc[code][0]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1477 bits=bits*2+sign; len++; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1478 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1479 if(code!=rl->n && len < len_tab[index]){ |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1480 bits_tab[index]= bits; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1481 len_tab [index]= len; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1482 } |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1483 } |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1484 #endif |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1485 /* ESC3 */ |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1486 bits= rl->table_vlc[rl->n][0]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1487 len = rl->table_vlc[rl->n][1]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1488 bits=bits*4+3; len+=2; //esc3 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1489 bits=bits*2+last; len++; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1490 bits=bits*64+run; len+=6; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1491 bits=bits*2+1; len++; //marker |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1492 bits=bits*4096+(slevel&0xfff); len+=12; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1493 bits=bits*2+1; len++; //marker |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1494 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1495 if(len < len_tab[index]){ |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1496 bits_tab[index]= bits; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1497 len_tab [index]= len; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1498 } |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1499 } |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1500 } |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1501 } |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1502 } |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1503 |
|
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1504 void h263_encode_init(MpegEncContext *s) |
| 0 | 1505 { |
| 1506 static int done = 0; | |
| 1507 | |
| 1508 if (!done) { | |
| 1509 done = 1; | |
| 293 | 1510 |
| 1511 init_uni_dc_tab(); | |
| 1512 | |
| 0 | 1513 init_rl(&rl_inter); |
| 1514 init_rl(&rl_intra); | |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1515 init_rl(&rl_intra_aic); |
|
648
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1516 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1517 init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len); |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
1518 init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len); |
|
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1519 |
|
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1520 init_mv_penalty_and_fcode(s); |
| 0 | 1521 } |
| 936 | 1522 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p |
|
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1523 |
| 287 | 1524 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME |
| 344 | 1525 switch(s->codec_id){ |
| 1526 case CODEC_ID_MPEG4: | |
| 1527 s->fcode_tab= fcode_tab; | |
| 1528 s->min_qcoeff= -2048; | |
| 1529 s->max_qcoeff= 2047; | |
| 945 | 1530 s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len; |
| 1531 s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64; | |
| 1532 s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len; | |
| 1533 s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64; | |
| 1013 | 1534 s->luma_dc_vlc_length= uni_DCtab_lum_len; |
| 1535 s->chroma_dc_vlc_length= uni_DCtab_chrom_len; | |
| 945 | 1536 s->ac_esc_length= 7+2+1+6+1+12+1; |
| 344 | 1537 break; |
| 1538 case CODEC_ID_H263P: | |
| 1539 s->fcode_tab= umv_fcode_tab; | |
| 1089 | 1540 s->min_qcoeff= -127; |
| 344 | 1541 s->max_qcoeff= 127; |
| 1542 break; | |
| 498 | 1543 //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later |
|
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1544 case CODEC_ID_FLV1: |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1545 if (s->h263_flv > 1) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1546 s->min_qcoeff= -1023; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1547 s->max_qcoeff= 1023; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1548 } else { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1549 s->min_qcoeff= -127; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1550 s->max_qcoeff= 127; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1551 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1552 s->y_dc_scale_table= |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1553 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1554 break; |
| 344 | 1555 default: //nothing needed default table allready set in mpegvideo.c |
| 1089 | 1556 s->min_qcoeff= -127; |
| 344 | 1557 s->max_qcoeff= 127; |
| 498 | 1558 s->y_dc_scale_table= |
| 1559 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; | |
| 344 | 1560 } |
| 0 | 1561 } |
| 1562 | |
| 1034 | 1563 /** |
| 1564 * encodes a 8x8 block. | |
| 1565 * @param block the 8x8 block | |
| 1566 * @param n block index (0-3 are luma, 4-5 are chroma) | |
| 1567 */ | |
| 0 | 1568 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n) |
| 1569 { | |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1570 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1571 RLTable *rl; |
| 0 | 1572 |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1573 rl = &rl_inter; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1574 if (s->mb_intra && !s->h263_aic) { |
| 231 | 1575 /* DC coef */ |
| 1089 | 1576 level = block[0]; |
| 0 | 1577 /* 255 cannot be represented, so we clamp */ |
| 1578 if (level > 254) { | |
| 1579 level = 254; | |
| 1580 block[0] = 254; | |
| 1581 } | |
| 231 | 1582 /* 0 cannot be represented also */ |
| 1089 | 1583 else if (level < 1) { |
| 231 | 1584 level = 1; |
| 1585 block[0] = 1; | |
| 1586 } | |
| 1090 | 1587 if (level == 128) //FIXME check rv10 |
| 1089 | 1588 put_bits(&s->pb, 8, 0xff); |
| 1589 else | |
| 1590 put_bits(&s->pb, 8, level & 0xff); | |
| 1591 i = 1; | |
| 0 | 1592 } else { |
| 1089 | 1593 i = 0; |
| 1594 if (s->h263_aic && s->mb_intra) | |
| 1595 rl = &rl_intra_aic; | |
| 0 | 1596 } |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1597 |
| 0 | 1598 /* AC coefs */ |
| 1599 last_index = s->block_last_index[n]; | |
| 1600 last_non_zero = i - 1; | |
| 1601 for (; i <= last_index; i++) { | |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
702
diff
changeset
|
1602 j = s->intra_scantable.permutated[i]; |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1603 level = block[j]; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1604 if (level) { |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1605 run = i - last_non_zero - 1; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1606 last = (i == last_index); |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1607 sign = 0; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1608 slevel = level; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1609 if (level < 0) { |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1610 sign = 1; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1611 level = -level; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1612 } |
| 0 | 1613 code = get_rl_index(rl, last, run, level); |
| 1614 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); | |
| 1615 if (code == rl->n) { | |
| 1616 put_bits(&s->pb, 1, last); | |
| 1617 put_bits(&s->pb, 6, run); | |
| 1089 | 1618 |
| 1619 assert(slevel != 0); | |
| 1620 | |
| 1621 if(slevel < 128 && slevel > -128) | |
| 1622 put_bits(&s->pb, 8, slevel & 0xff); | |
| 1623 else{ | |
| 1624 put_bits(&s->pb, 8, 128); | |
| 1625 put_bits(&s->pb, 5, slevel & 0x1f); | |
| 1626 put_bits(&s->pb, 6, (slevel>>5)&0x3f); | |
| 1627 } | |
| 0 | 1628 } else { |
| 1629 put_bits(&s->pb, 1, sign); | |
| 1630 } | |
|
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1631 last_non_zero = i; |
|
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1632 } |
| 0 | 1633 } |
| 1634 } | |
|
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1635 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1636 /** |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1637 * encodes a 8x8 block. |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1638 * @param block the 8x8 block |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1639 * @param n block index (0-3 are luma, 4-5 are chroma) |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1640 */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1641 static void h263_flv_encode_block(MpegEncContext * s, DCTELEM * block, int n) |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1642 { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1643 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1644 RLTable *rl; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1645 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1646 rl = &rl_inter; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1647 if (s->mb_intra && !s->h263_aic) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1648 /* DC coef */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1649 level = block[0]; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1650 /* 255 cannot be represented, so we clamp */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1651 if (level > 254) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1652 level = 254; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1653 block[0] = 254; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1654 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1655 /* 0 cannot be represented also */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1656 else if (level < 1) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1657 level = 1; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1658 block[0] = 1; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1659 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1660 if (level == 128) //FIXME check rv10 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1661 put_bits(&s->pb, 8, 0xff); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1662 else |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1663 put_bits(&s->pb, 8, level & 0xff); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1664 i = 1; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1665 } else { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1666 i = 0; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1667 if (s->h263_aic && s->mb_intra) |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1668 rl = &rl_intra_aic; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1669 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1670 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1671 /* AC coefs */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1672 last_index = s->block_last_index[n]; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1673 last_non_zero = i - 1; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1674 for (; i <= last_index; i++) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1675 j = s->intra_scantable.permutated[i]; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1676 level = block[j]; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1677 if (level) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1678 run = i - last_non_zero - 1; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1679 last = (i == last_index); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1680 sign = 0; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1681 slevel = level; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1682 if (level < 0) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1683 sign = 1; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1684 level = -level; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1685 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1686 code = get_rl_index(rl, last, run, level); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1687 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1688 if (code == rl->n) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1689 assert(slevel != 0); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1690 if(slevel < 64 && slevel > -64) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1691 /* 7-bit level */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1692 put_bits(&s->pb, 1, 0); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1693 put_bits(&s->pb, 1, last); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1694 put_bits(&s->pb, 6, run); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1695 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1696 put_bits(&s->pb, 7, slevel & 0x7f); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1697 } else { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1698 /* 11-bit level */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1699 put_bits(&s->pb, 1, 1); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1700 put_bits(&s->pb, 1, last); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1701 put_bits(&s->pb, 6, run); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1702 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1703 put_bits(&s->pb, 11, slevel & 0x7ff); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1704 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1705 } else { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1706 put_bits(&s->pb, 1, sign); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1707 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1708 last_non_zero = i; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1709 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1710 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1711 } |
|
815
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
1712 #endif |
| 0 | 1713 |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
1714 #ifdef CONFIG_ENCODERS |
|
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
1715 |
| 0 | 1716 /***************************************************/ |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
1717 /** |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
1718 * add mpeg4 stuffing bits (01...1) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
1719 */ |
| 453 | 1720 void ff_mpeg4_stuffing(PutBitContext * pbc) |
| 262 | 1721 { |
| 1722 int length; | |
| 1723 put_bits(pbc, 1, 0); | |
| 1724 length= (-get_bit_count(pbc))&7; | |
| 453 | 1725 if(length) put_bits(pbc, length, (1<<length)-1); |
| 262 | 1726 } |
| 1727 | |
| 327 | 1728 /* must be called before writing the header */ |
| 1729 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){ | |
| 1730 int time_div, time_mod; | |
| 1731 | |
| 1732 if(s->pict_type==I_TYPE){ //we will encode a vol header | |
|
1126
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1118
diff
changeset
|
1733 int dummy; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1118
diff
changeset
|
1734 av_reduce(&s->time_increment_resolution, &dummy, s->avctx->frame_rate, s->avctx->frame_rate_base, (1<<16)-1); |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1118
diff
changeset
|
1735 |
| 327 | 1736 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1; |
| 1737 } | |
| 654 | 1738 |
| 903 | 1739 if(s->current_picture.pts) |
| 1740 s->time= (s->current_picture.pts*s->time_increment_resolution + 500*1000)/(1000*1000); | |
| 654 | 1741 else |
|
1126
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1118
diff
changeset
|
1742 s->time= av_rescale(picture_number*(int64_t)s->avctx->frame_rate_base, s->time_increment_resolution, s->avctx->frame_rate); |
| 327 | 1743 time_div= s->time/s->time_increment_resolution; |
| 1744 time_mod= s->time%s->time_increment_resolution; | |
| 1745 | |
| 1746 if(s->pict_type==B_TYPE){ | |
| 664 | 1747 s->pb_time= s->pp_time - (s->last_non_b_time - s->time); |
| 327 | 1748 }else{ |
| 1749 s->last_time_base= s->time_base; | |
| 1750 s->time_base= time_div; | |
| 1751 s->pp_time= s->time - s->last_non_b_time; | |
| 1752 s->last_non_b_time= s->time; | |
| 1753 } | |
| 1754 } | |
| 1755 | |
| 942 | 1756 static void mpeg4_encode_gop_header(MpegEncContext * s){ |
| 1757 int hours, minutes, seconds; | |
| 1758 | |
| 1759 put_bits(&s->pb, 16, 0); | |
| 1760 put_bits(&s->pb, 16, GOP_STARTCODE); | |
| 1761 | |
| 1762 seconds= s->time/s->time_increment_resolution; | |
| 1763 minutes= seconds/60; seconds %= 60; | |
| 1764 hours= minutes/60; minutes %= 60; | |
| 1765 hours%=24; | |
| 1766 | |
| 1767 put_bits(&s->pb, 5, hours); | |
| 1768 put_bits(&s->pb, 6, minutes); | |
| 1769 put_bits(&s->pb, 1, 1); | |
| 1770 put_bits(&s->pb, 6, seconds); | |
| 1771 | |
| 1772 put_bits(&s->pb, 1, 0); //closed gov == NO | |
| 1773 put_bits(&s->pb, 1, 0); //broken link == NO | |
| 1774 | |
| 1775 ff_mpeg4_stuffing(&s->pb); | |
| 1776 } | |
| 1777 | |
| 1778 static void mpeg4_encode_visual_object_header(MpegEncContext * s){ | |
| 1779 int profile_and_level_indication; | |
| 1780 int vo_ver_id; | |
| 1781 | |
| 1782 if(s->max_b_frames || s->quarter_sample){ | |
| 1783 profile_and_level_indication= 0xF1; // adv simple level 1 | |
| 1784 vo_ver_id= 5; | |
| 1785 }else{ | |
| 1786 profile_and_level_indication= 0x01; // simple level 1 | |
| 1787 vo_ver_id= 1; | |
| 1788 } | |
| 1789 //FIXME levels | |
| 1790 | |
| 1791 put_bits(&s->pb, 16, 0); | |
| 1792 put_bits(&s->pb, 16, VOS_STARTCODE); | |
|
1350
e7c8051e1849
the reference sw doesnt like some legal headers ...
michaelni
parents:
1346
diff
changeset
|
1793 |
| 942 | 1794 put_bits(&s->pb, 8, profile_and_level_indication); |
|
1350
e7c8051e1849
the reference sw doesnt like some legal headers ...
michaelni
parents:
1346
diff
changeset
|
1795 |
| 942 | 1796 put_bits(&s->pb, 16, 0); |
| 1797 put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE); | |
| 1798 | |
| 1799 put_bits(&s->pb, 1, 1); | |
| 1800 put_bits(&s->pb, 4, vo_ver_id); | |
| 1801 put_bits(&s->pb, 3, 1); //priority | |
| 1802 | |
| 1803 put_bits(&s->pb, 4, 1); //visual obj type== video obj | |
| 1804 | |
| 1805 put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME | |
| 1806 | |
| 1807 ff_mpeg4_stuffing(&s->pb); | |
| 1808 } | |
| 1809 | |
| 1810 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number) | |
| 0 | 1811 { |
| 942 | 1812 int vo_ver_id; |
| 336 | 1813 |
| 942 | 1814 if(s->max_b_frames || s->quarter_sample){ |
| 1815 vo_ver_id= 5; | |
| 923 | 1816 s->vo_type= ADV_SIMPLE_VO_TYPE; |
| 1817 }else{ | |
| 942 | 1818 vo_ver_id= 1; |
| 923 | 1819 s->vo_type= SIMPLE_VO_TYPE; |
| 1820 } | |
| 336 | 1821 |
| 263 | 1822 put_bits(&s->pb, 16, 0); |
| 942 | 1823 put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */ |
| 263 | 1824 put_bits(&s->pb, 16, 0); |
| 942 | 1825 put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */ |
| 263 | 1826 |
| 1827 put_bits(&s->pb, 1, 0); /* random access vol */ | |
| 336 | 1828 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */ |
| 263 | 1829 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */ |
| 1830 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */ | |
| 1831 put_bits(&s->pb, 3, 1); /* is obj layer priority */ | |
| 880 | 1832 |
| 887 | 1833 float_aspect_to_info(s, s->avctx->aspect_ratio); |
| 880 | 1834 |
| 1835 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */ | |
|
669
b4bddbde44f3
aspect (ext. par too) support for h263 and mpeg4 (inc. build becouse of new vars)
al3x
parents:
667
diff
changeset
|
1836 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) |
|
b4bddbde44f3
aspect (ext. par too) support for h263 and mpeg4 (inc. build becouse of new vars)
al3x
parents:
667
diff
changeset
|
1837 { |
|
b4bddbde44f3
aspect (ext. par too) support for h263 and mpeg4 (inc. build becouse of new vars)
al3x
parents:
667
diff
changeset
|
1838 put_bits(&s->pb, 8, s->aspected_width); |
|
b4bddbde44f3
aspect (ext. par too) support for h263 and mpeg4 (inc. build becouse of new vars)
al3x
parents:
667
diff
changeset
|
1839 put_bits(&s->pb, 8, s->aspected_height); |
|
b4bddbde44f3
aspect (ext. par too) support for h263 and mpeg4 (inc. build becouse of new vars)
al3x
parents:
667
diff
changeset
|
1840 } |
| 336 | 1841 |
| 1842 if(s->low_delay){ | |
| 1843 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */ | |
| 341 | 1844 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */ |
| 336 | 1845 put_bits(&s->pb, 1, s->low_delay); |
| 1846 put_bits(&s->pb, 1, 0); /* vbv parameters= no */ | |
| 1847 }else{ | |
| 1848 put_bits(&s->pb, 1, 0); /* vol control parameters= no */ | |
| 1849 } | |
| 1850 | |
| 263 | 1851 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */ |
| 1852 put_bits(&s->pb, 1, 1); /* marker bit */ | |
| 324 | 1853 |
| 1854 put_bits(&s->pb, 16, s->time_increment_resolution); | |
| 263 | 1855 if (s->time_increment_bits < 1) |
| 1856 s->time_increment_bits = 1; | |
| 1857 put_bits(&s->pb, 1, 1); /* marker bit */ | |
| 1858 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */ | |
| 1859 put_bits(&s->pb, 1, 1); /* marker bit */ | |
| 1860 put_bits(&s->pb, 13, s->width); /* vol width */ | |
| 1861 put_bits(&s->pb, 1, 1); /* marker bit */ | |
| 1862 put_bits(&s->pb, 13, s->height); /* vol height */ | |
| 1863 put_bits(&s->pb, 1, 1); /* marker bit */ | |
| 697 | 1864 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1); |
| 263 | 1865 put_bits(&s->pb, 1, 1); /* obmc disable */ |
| 1866 if (vo_ver_id == 1) { | |
| 1867 put_bits(&s->pb, 1, s->vol_sprite_usage=0); /* sprite enable */ | |
| 942 | 1868 }else{ |
| 263 | 1869 put_bits(&s->pb, 2, s->vol_sprite_usage=0); /* sprite enable */ |
| 1870 } | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
1871 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
1872 s->quant_precision=5; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
1873 put_bits(&s->pb, 1, 0); /* not 8 bit == false */ |
| 599 | 1874 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/ |
| 1875 if(s->mpeg_quant) put_bits(&s->pb, 2, 0); /* no custom matrixes */ | |
| 1876 | |
| 263 | 1877 if (vo_ver_id != 1) |
| 936 | 1878 put_bits(&s->pb, 1, s->quarter_sample); |
| 263 | 1879 put_bits(&s->pb, 1, 1); /* complexity estimation disable */ |
| 453 | 1880 s->resync_marker= s->rtp_mode; |
| 1881 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */ | |
| 1882 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0); | |
| 1883 if(s->data_partitioning){ | |
| 1884 put_bits(&s->pb, 1, 0); /* no rvlc */ | |
| 1885 } | |
| 1886 | |
| 263 | 1887 if (vo_ver_id != 1){ |
| 1888 put_bits(&s->pb, 1, 0); /* newpred */ | |
| 1889 put_bits(&s->pb, 1, 0); /* reduced res vop */ | |
| 1890 } | |
| 1891 put_bits(&s->pb, 1, 0); /* scalability */ | |
| 676 | 1892 |
| 453 | 1893 ff_mpeg4_stuffing(&s->pb); |
| 676 | 1894 |
| 1895 /* user data */ | |
| 1092 | 1896 if(!(s->flags & CODEC_FLAG_BITEXACT)){ |
| 676 | 1897 put_bits(&s->pb, 16, 0); |
| 1898 put_bits(&s->pb, 16, 0x1B2); /* user_data */ | |
| 1118 | 1899 put_string(&s->pb, LIBAVCODEC_IDENT); |
| 676 | 1900 ff_mpeg4_stuffing(&s->pb); |
| 1901 } | |
| 263 | 1902 } |
| 1903 | |
| 1904 /* write mpeg4 VOP header */ | |
| 1905 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number) | |
| 1906 { | |
| 324 | 1907 int time_incr; |
| 1908 int time_div, time_mod; | |
| 1909 | |
| 453 | 1910 if(s->pict_type==I_TYPE){ |
| 953 | 1911 if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){ |
|
1350
e7c8051e1849
the reference sw doesnt like some legal headers ...
michaelni
parents:
1346
diff
changeset
|
1912 if(s->strict_std_compliance < 2) //HACK, the reference sw is buggy |
|
e7c8051e1849
the reference sw doesnt like some legal headers ...
michaelni
parents:
1346
diff
changeset
|
1913 mpeg4_encode_visual_object_header(s); |
|
e7c8051e1849
the reference sw doesnt like some legal headers ...
michaelni
parents:
1346
diff
changeset
|
1914 if(s->strict_std_compliance < 2 || picture_number==0) //HACK, the reference sw is buggy |
|
e7c8051e1849
the reference sw doesnt like some legal headers ...
michaelni
parents:
1346
diff
changeset
|
1915 mpeg4_encode_vol_header(s, 0, 0); |
| 942 | 1916 } |
| 1917 mpeg4_encode_gop_header(s); | |
| 453 | 1918 } |
| 324 | 1919 |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
1920 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
1921 |
| 324 | 1922 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE); |
| 1923 | |
|
234
5fc0c3af3fe4
alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents:
231
diff
changeset
|
1924 put_bits(&s->pb, 16, 0); /* vop header */ |
| 942 | 1925 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */ |
| 0 | 1926 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */ |
| 324 | 1927 |
| 327 | 1928 time_div= s->time/s->time_increment_resolution; |
| 1929 time_mod= s->time%s->time_increment_resolution; | |
| 324 | 1930 time_incr= time_div - s->last_time_base; |
| 1931 while(time_incr--) | |
| 1932 put_bits(&s->pb, 1, 1); | |
| 1933 | |
| 0 | 1934 put_bits(&s->pb, 1, 0); |
| 1935 | |
| 1936 put_bits(&s->pb, 1, 1); /* marker */ | |
| 324 | 1937 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */ |
| 0 | 1938 put_bits(&s->pb, 1, 1); /* marker */ |
| 1939 put_bits(&s->pb, 1, 1); /* vop coded */ | |
| 263 | 1940 if ( s->pict_type == P_TYPE |
| 1941 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) { | |
| 0 | 1942 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */ |
| 1943 } | |
| 1944 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */ | |
| 697 | 1945 if(!s->progressive_sequence){ |
| 1946 put_bits(&s->pb, 1, s->top_field_first); | |
| 1947 put_bits(&s->pb, 1, s->alternate_scan); | |
| 1948 } | |
| 263 | 1949 //FIXME sprite stuff |
| 0 | 1950 |
| 1951 put_bits(&s->pb, 5, s->qscale); | |
| 1952 | |
| 1953 if (s->pict_type != I_TYPE) | |
| 1954 put_bits(&s->pb, 3, s->f_code); /* fcode_for */ | |
| 263 | 1955 if (s->pict_type == B_TYPE) |
| 1956 put_bits(&s->pb, 3, s->b_code); /* fcode_back */ | |
| 0 | 1957 // printf("****frame %d\n", picture_number); |
| 498 | 1958 |
| 1959 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support | |
| 1960 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table; | |
|
582
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
1961 s->h_edge_pos= s->width; |
|
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
1962 s->v_edge_pos= s->height; |
| 0 | 1963 } |
| 1964 | |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
1965 #endif //CONFIG_ENCODERS |
|
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
1966 |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
1967 /** |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
1968 * change qscale by given dquant and update qscale dependant variables. |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
1969 */ |
| 698 | 1970 static void change_qscale(MpegEncContext * s, int dquant) |
| 0 | 1971 { |
| 698 | 1972 s->qscale += dquant; |
| 1973 | |
| 1974 if (s->qscale < 1) | |
| 1975 s->qscale = 1; | |
| 1976 else if (s->qscale > 31) | |
| 1977 s->qscale = 31; | |
| 1978 | |
| 498 | 1979 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ]; |
| 1980 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ]; | |
| 0 | 1981 } |
| 1982 | |
| 1034 | 1983 /** |
| 1984 * predicts the dc. | |
| 1985 * @param n block index (0-3 are luma, 4-5 are chroma) | |
| 1986 * @param dc_val_ptr a pointer to the dc_val entry for the current MB will be stored here | |
| 1987 * @param dir_ptr pointer to an integer where the prediction direction will be stored | |
| 1988 * @return the quantized predicted dc | |
| 1989 */ | |
| 1064 | 1990 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, uint16_t **dc_val_ptr, int *dir_ptr) |
| 0 | 1991 { |
| 266 | 1992 int a, b, c, wrap, pred, scale; |
| 1064 | 1993 uint16_t *dc_val; |
| 0 | 1994 |
| 1995 /* find prediction */ | |
| 1996 if (n < 4) { | |
| 1997 scale = s->y_dc_scale; | |
| 1998 } else { | |
| 1999 scale = s->c_dc_scale; | |
| 2000 } | |
|
1271
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
2001 if(IS_3IV1) |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
2002 scale= 8; |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
2003 |
| 266 | 2004 wrap= s->block_wrap[n]; |
| 2005 dc_val = s->dc_val[0] + s->block_index[n]; | |
| 0 | 2006 |
| 2007 /* B C | |
| 2008 * A X | |
| 2009 */ | |
| 266 | 2010 a = dc_val[ - 1]; |
| 2011 b = dc_val[ - 1 - wrap]; | |
| 2012 c = dc_val[ - wrap]; | |
| 0 | 2013 |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2014 /* outside slice handling (we cant do that by memset as we need the dc for error resilience) */ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2015 if(s->first_slice_line && n!=3){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2016 if(n!=2) b=c= 1024; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2017 if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2018 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2019 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2020 if(n==0 || n==4 || n==5) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2021 b=1024; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2022 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2023 |
| 0 | 2024 if (abs(a - b) < abs(b - c)) { |
| 2025 pred = c; | |
| 2026 *dir_ptr = 1; /* top */ | |
| 2027 } else { | |
| 2028 pred = a; | |
| 2029 *dir_ptr = 0; /* left */ | |
| 2030 } | |
| 2031 /* we assume pred is positive */ | |
|
1261
362947395f5c
fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents:
1257
diff
changeset
|
2032 pred = FASTDIV((pred + (scale >> 1)), scale); |
| 0 | 2033 |
| 2034 /* prepare address for prediction update */ | |
| 266 | 2035 *dc_val_ptr = &dc_val[0]; |
| 0 | 2036 |
| 2037 return pred; | |
| 2038 } | |
| 2039 | |
| 1034 | 2040 /** |
| 2041 * predicts the ac. | |
| 2042 * @param n block index (0-3 are luma, 4-5 are chroma) | |
| 2043 * @param dir the ac prediction direction | |
| 2044 */ | |
| 1008 | 2045 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, |
| 0 | 2046 int dir) |
| 2047 { | |
| 266 | 2048 int i; |
| 1064 | 2049 int16_t *ac_val, *ac_val1; |
| 903 | 2050 int8_t * const qscale_table= s->current_picture.qscale_table; |
| 0 | 2051 |
| 2052 /* find prediction */ | |
| 266 | 2053 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
| 0 | 2054 ac_val1 = ac_val; |
| 2055 if (s->ac_pred) { | |
| 2056 if (dir == 0) { | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
2057 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride; |
| 0 | 2058 /* left prediction */ |
| 2059 ac_val -= 16; | |
| 575 | 2060 |
| 903 | 2061 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){ |
| 575 | 2062 /* same qscale */ |
| 2063 for(i=1;i<8;i++) { | |
| 1092 | 2064 block[s->dsp.idct_permutation[i<<3]] += ac_val[i]; |
| 575 | 2065 } |
| 2066 }else{ | |
| 2067 /* different qscale, we must rescale */ | |
| 2068 for(i=1;i<8;i++) { | |
| 1092 | 2069 block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale); |
| 575 | 2070 } |
| 0 | 2071 } |
| 2072 } else { | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
2073 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride; |
| 0 | 2074 /* top prediction */ |
| 266 | 2075 ac_val -= 16 * s->block_wrap[n]; |
| 575 | 2076 |
| 903 | 2077 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){ |
| 575 | 2078 /* same qscale */ |
| 2079 for(i=1;i<8;i++) { | |
| 1092 | 2080 block[s->dsp.idct_permutation[i]] += ac_val[i + 8]; |
| 575 | 2081 } |
| 2082 }else{ | |
| 2083 /* different qscale, we must rescale */ | |
| 2084 for(i=1;i<8;i++) { | |
| 1092 | 2085 block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale); |
| 575 | 2086 } |
| 0 | 2087 } |
| 2088 } | |
| 2089 } | |
| 2090 /* left copy */ | |
| 2091 for(i=1;i<8;i++) | |
| 1092 | 2092 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]]; |
| 591 | 2093 |
| 0 | 2094 /* top copy */ |
| 2095 for(i=1;i<8;i++) | |
| 1092 | 2096 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]]; |
| 591 | 2097 |
| 0 | 2098 } |
| 2099 | |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
2100 #ifdef CONFIG_ENCODERS |
|
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
2101 |
| 1008 | 2102 static void mpeg4_inv_pred_ac(MpegEncContext * s, DCTELEM *block, int n, |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
2103 int dir) |
| 0 | 2104 { |
| 266 | 2105 int i; |
| 1064 | 2106 int16_t *ac_val; |
| 903 | 2107 int8_t * const qscale_table= s->current_picture.qscale_table; |
| 0 | 2108 |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
2109 /* find prediction */ |
| 266 | 2110 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
2111 |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
2112 if (dir == 0) { |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
2113 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
2114 /* left prediction */ |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
2115 ac_val -= 16; |
| 903 | 2116 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){ |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
2117 /* same qscale */ |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
2118 for(i=1;i<8;i++) { |
| 1092 | 2119 block[s->dsp.idct_permutation[i<<3]] -= ac_val[i]; |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
2120 } |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
2121 }else{ |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
2122 /* different qscale, we must rescale */ |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
2123 for(i=1;i<8;i++) { |
| 1092 | 2124 block[s->dsp.idct_permutation[i<<3]] -= ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale); |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
2125 } |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
2126 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
2127 } else { |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
2128 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride; |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
2129 /* top prediction */ |
| 266 | 2130 ac_val -= 16 * s->block_wrap[n]; |
| 903 | 2131 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){ |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
2132 /* same qscale */ |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
2133 for(i=1;i<8;i++) { |
| 1092 | 2134 block[s->dsp.idct_permutation[i]] -= ac_val[i + 8]; |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
2135 } |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
2136 }else{ |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
2137 /* different qscale, we must rescale */ |
|
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
2138 for(i=1;i<8;i++) { |
| 1092 | 2139 block[s->dsp.idct_permutation[i]] -= ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale); |
|
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
2140 } |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
2141 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
2142 } |
|
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
2143 } |
| 0 | 2144 |
| 1034 | 2145 /** |
| 2146 * encodes the dc value. | |
| 2147 * @param n block index (0-3 are luma, 4-5 are chroma) | |
| 2148 */ | |
| 453 | 2149 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n) |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
2150 { |
| 293 | 2151 #if 1 |
| 453 | 2152 // if(level<-255 || level>255) printf("dc overflow\n"); |
| 293 | 2153 level+=256; |
| 2154 if (n < 4) { | |
| 2155 /* luminance */ | |
| 1013 | 2156 put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]); |
| 293 | 2157 } else { |
| 2158 /* chrominance */ | |
| 1013 | 2159 put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]); |
| 293 | 2160 } |
| 2161 #else | |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
2162 int size, v; |
| 0 | 2163 /* find number of bits */ |
| 2164 size = 0; | |
| 2165 v = abs(level); | |
| 2166 while (v) { | |
| 2167 v >>= 1; | |
| 2168 size++; | |
| 2169 } | |
| 2170 | |
| 2171 if (n < 4) { | |
| 2172 /* luminance */ | |
| 2173 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]); | |
| 2174 } else { | |
| 2175 /* chrominance */ | |
| 2176 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]); | |
| 2177 } | |
| 2178 | |
| 2179 /* encode remaining bits */ | |
| 2180 if (size > 0) { | |
| 2181 if (level < 0) | |
| 2182 level = (-level) ^ ((1 << size) - 1); | |
| 2183 put_bits(&s->pb, size, level); | |
| 2184 if (size > 8) | |
| 2185 put_bits(&s->pb, 1, 1); | |
| 2186 } | |
| 293 | 2187 #endif |
| 0 | 2188 } |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
2189 |
| 1034 | 2190 /** |
| 2191 * encodes a 8x8 block | |
| 2192 * @param n block index (0-3 are luma, 4-5 are chroma) | |
| 2193 */ | |
|
648
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2194 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, |
| 1064 | 2195 uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb) |
| 0 | 2196 { |
| 751 | 2197 int i, last_non_zero; |
| 2198 #if 0 //variables for the outcommented version | |
| 2199 int code, sign, last; | |
| 2200 #endif | |
| 0 | 2201 const RLTable *rl; |
| 1064 | 2202 uint32_t *bits_tab; |
| 2203 uint8_t *len_tab; | |
|
648
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2204 const int last_index = s->block_last_index[n]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2205 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2206 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away |
| 0 | 2207 /* mpeg4 based DC predictor */ |
| 453 | 2208 mpeg4_encode_dc(dc_pb, intra_dc, n); |
|
648
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2209 if(last_index<1) return; |
| 0 | 2210 i = 1; |
| 2211 rl = &rl_intra; | |
|
648
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2212 bits_tab= uni_mpeg4_intra_rl_bits; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2213 len_tab = uni_mpeg4_intra_rl_len; |
| 0 | 2214 } else { |
|
648
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2215 if(last_index<0) return; |
| 0 | 2216 i = 0; |
| 2217 rl = &rl_inter; | |
|
648
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2218 bits_tab= uni_mpeg4_inter_rl_bits; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2219 len_tab = uni_mpeg4_inter_rl_len; |
| 0 | 2220 } |
| 2221 | |
| 2222 /* AC coefs */ | |
| 2223 last_non_zero = i - 1; | |
|
648
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2224 #if 1 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2225 for (; i < last_index; i++) { |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2226 int level = block[ scan_table[i] ]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2227 if (level) { |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2228 int run = i - last_non_zero - 1; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2229 level+=64; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2230 if((level&(~127)) == 0){ |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2231 const int index= UNI_MPEG4_ENC_INDEX(0, run, level); |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2232 put_bits(ac_pb, len_tab[index], bits_tab[index]); |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2233 }else{ //ESC3 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2234 put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(0<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1); |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2235 } |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2236 last_non_zero = i; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2237 } |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2238 } |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2239 /*if(i<=last_index)*/{ |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2240 int level = block[ scan_table[i] ]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2241 int run = i - last_non_zero - 1; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2242 level+=64; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2243 if((level&(~127)) == 0){ |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2244 const int index= UNI_MPEG4_ENC_INDEX(1, run, level); |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2245 put_bits(ac_pb, len_tab[index], bits_tab[index]); |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2246 }else{ //ESC3 |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2247 put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(1<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1); |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2248 } |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2249 } |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2250 #else |
| 0 | 2251 for (; i <= last_index; i++) { |
|
648
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2252 const int slevel = block[ scan_table[i] ]; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2253 if (slevel) { |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2254 int level; |
|
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2255 int run = i - last_non_zero - 1; |
| 0 | 2256 last = (i == last_index); |
| 2257 sign = 0; | |
|
648
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2258 level = slevel; |
| 0 | 2259 if (level < 0) { |
| 2260 sign = 1; | |
| 2261 level = -level; | |
| 2262 } | |
| 2263 code = get_rl_index(rl, last, run, level); | |
| 453 | 2264 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); |
| 0 | 2265 if (code == rl->n) { |
| 2266 int level1, run1; | |
| 2267 level1 = level - rl->max_level[last][run]; | |
| 2268 if (level1 < 1) | |
| 2269 goto esc2; | |
| 2270 code = get_rl_index(rl, last, run, level1); | |
| 2271 if (code == rl->n) { | |
| 2272 esc2: | |
| 453 | 2273 put_bits(ac_pb, 1, 1); |
| 0 | 2274 if (level > MAX_LEVEL) |
| 2275 goto esc3; | |
| 2276 run1 = run - rl->max_run[last][level] - 1; | |
| 2277 if (run1 < 0) | |
| 2278 goto esc3; | |
| 2279 code = get_rl_index(rl, last, run1, level); | |
| 2280 if (code == rl->n) { | |
| 2281 esc3: | |
| 2282 /* third escape */ | |
| 453 | 2283 put_bits(ac_pb, 1, 1); |
| 2284 put_bits(ac_pb, 1, last); | |
| 2285 put_bits(ac_pb, 6, run); | |
| 2286 put_bits(ac_pb, 1, 1); | |
| 2287 put_bits(ac_pb, 12, slevel & 0xfff); | |
| 2288 put_bits(ac_pb, 1, 1); | |
| 0 | 2289 } else { |
| 2290 /* second escape */ | |
| 453 | 2291 put_bits(ac_pb, 1, 0); |
| 2292 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); | |
| 2293 put_bits(ac_pb, 1, sign); | |
| 0 | 2294 } |
| 2295 } else { | |
| 2296 /* first escape */ | |
| 453 | 2297 put_bits(ac_pb, 1, 0); |
| 2298 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); | |
| 2299 put_bits(ac_pb, 1, sign); | |
| 0 | 2300 } |
| 2301 } else { | |
| 453 | 2302 put_bits(ac_pb, 1, sign); |
| 0 | 2303 } |
| 2304 last_non_zero = i; | |
| 2305 } | |
| 2306 } | |
|
648
dddcff6841f2
optimizing mpeg4_encode_block(), generates allso slightly shorter bitstream as some codes can be represented as esc1 and esc2 and esc2 is shorter for a few of them
michaelni
parents:
619
diff
changeset
|
2307 #endif |
| 0 | 2308 } |
| 936 | 2309 |
| 2310 static inline int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, | |
| 1064 | 2311 uint8_t *scan_table) |
| 936 | 2312 { |
| 2313 int i, last_non_zero; | |
| 2314 const RLTable *rl; | |
| 1064 | 2315 uint8_t *len_tab; |
| 936 | 2316 const int last_index = s->block_last_index[n]; |
| 2317 int len=0; | |
| 2318 | |
| 2319 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away | |
| 2320 /* mpeg4 based DC predictor */ | |
| 2321 //mpeg4_encode_dc(dc_pb, intra_dc, n); //FIXME | |
| 2322 if(last_index<1) return len; | |
| 2323 i = 1; | |
| 2324 rl = &rl_intra; | |
| 2325 len_tab = uni_mpeg4_intra_rl_len; | |
| 2326 } else { | |
| 2327 if(last_index<0) return 0; | |
| 2328 i = 0; | |
| 2329 rl = &rl_inter; | |
| 2330 len_tab = uni_mpeg4_inter_rl_len; | |
| 2331 } | |
| 2332 | |
| 2333 /* AC coefs */ | |
| 2334 last_non_zero = i - 1; | |
| 2335 for (; i < last_index; i++) { | |
| 2336 int level = block[ scan_table[i] ]; | |
| 2337 if (level) { | |
| 2338 int run = i - last_non_zero - 1; | |
| 2339 level+=64; | |
| 2340 if((level&(~127)) == 0){ | |
| 2341 const int index= UNI_MPEG4_ENC_INDEX(0, run, level); | |
| 2342 len += len_tab[index]; | |
| 2343 }else{ //ESC3 | |
| 2344 len += 7+2+1+6+1+12+1; | |
| 2345 } | |
| 2346 last_non_zero = i; | |
| 2347 } | |
| 2348 } | |
| 2349 /*if(i<=last_index)*/{ | |
| 2350 int level = block[ scan_table[i] ]; | |
| 2351 int run = i - last_non_zero - 1; | |
| 2352 level+=64; | |
| 2353 if((level&(~127)) == 0){ | |
| 2354 const int index= UNI_MPEG4_ENC_INDEX(1, run, level); | |
| 2355 len += len_tab[index]; | |
| 2356 }else{ //ESC3 | |
| 2357 len += 7+2+1+6+1+12+1; | |
| 2358 } | |
| 2359 } | |
| 2360 | |
| 2361 return len; | |
| 2362 } | |
| 2363 | |
|
815
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
2364 #endif |
| 0 | 2365 |
| 2366 | |
| 2367 /***********************************************/ | |
| 2368 /* decoding */ | |
| 2369 | |
| 2370 static VLC intra_MCBPC_vlc; | |
| 2371 static VLC inter_MCBPC_vlc; | |
| 2372 static VLC cbpy_vlc; | |
| 2373 static VLC mv_vlc; | |
| 2374 static VLC dc_lum, dc_chrom; | |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
2375 static VLC sprite_trajectory; |
| 262 | 2376 static VLC mb_type_b_vlc; |
| 0 | 2377 |
| 2378 void init_vlc_rl(RLTable *rl) | |
| 2379 { | |
| 542 | 2380 int i, q; |
| 2381 | |
| 0 | 2382 init_vlc(&rl->vlc, 9, rl->n + 1, |
| 2383 &rl->table_vlc[0][1], 4, 2, | |
| 2384 &rl->table_vlc[0][0], 4, 2); | |
| 542 | 2385 |
| 2386 | |
| 2387 for(q=0; q<32; q++){ | |
| 2388 int qmul= q*2; | |
| 2389 int qadd= (q-1)|1; | |
| 2390 | |
| 2391 if(q==0){ | |
| 2392 qmul=1; | |
| 2393 qadd=0; | |
| 2394 } | |
| 2395 | |
| 2396 rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM)); | |
| 2397 for(i=0; i<rl->vlc.table_size; i++){ | |
| 2398 int code= rl->vlc.table[i][0]; | |
| 2399 int len = rl->vlc.table[i][1]; | |
| 2400 int level, run; | |
| 2401 | |
| 2402 if(len==0){ // illegal code | |
| 563 | 2403 run= 66; |
| 542 | 2404 level= MAX_LEVEL; |
| 2405 }else if(len<0){ //more bits needed | |
| 2406 run= 0; | |
| 2407 level= code; | |
| 2408 }else{ | |
| 2409 if(code==rl->n){ //esc | |
| 563 | 2410 run= 66; |
| 542 | 2411 level= 0; |
| 2412 }else{ | |
| 2413 run= rl->table_run [code] + 1; | |
| 2414 level= rl->table_level[code] * qmul + qadd; | |
| 2415 if(code >= rl->last) run+=192; | |
| 2416 } | |
| 2417 } | |
| 2418 rl->rl_vlc[q][i].len= len; | |
| 2419 rl->rl_vlc[q][i].level= level; | |
| 2420 rl->rl_vlc[q][i].run= run; | |
| 2421 } | |
| 2422 } | |
| 0 | 2423 } |
| 2424 | |
| 2425 /* init vlcs */ | |
| 2426 | |
| 2427 /* XXX: find a better solution to handle static init */ | |
| 2428 void h263_decode_init_vlc(MpegEncContext *s) | |
| 2429 { | |
| 2430 static int done = 0; | |
| 2431 | |
| 2432 if (!done) { | |
| 2433 done = 1; | |
| 2434 | |
| 544 | 2435 init_vlc(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 8, |
| 0 | 2436 intra_MCBPC_bits, 1, 1, |
| 2437 intra_MCBPC_code, 1, 1); | |
| 544 | 2438 init_vlc(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 25, |
| 0 | 2439 inter_MCBPC_bits, 1, 1, |
| 2440 inter_MCBPC_code, 1, 1); | |
| 544 | 2441 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16, |
| 0 | 2442 &cbpy_tab[0][1], 2, 1, |
| 2443 &cbpy_tab[0][0], 2, 1); | |
| 544 | 2444 init_vlc(&mv_vlc, MV_VLC_BITS, 33, |
| 0 | 2445 &mvtab[0][1], 2, 1, |
| 2446 &mvtab[0][0], 2, 1); | |
| 2447 init_rl(&rl_inter); | |
| 2448 init_rl(&rl_intra); | |
| 1132 | 2449 init_rl(&rvlc_rl_inter); |
| 2450 init_rl(&rvlc_rl_intra); | |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
2451 init_rl(&rl_intra_aic); |
| 0 | 2452 init_vlc_rl(&rl_inter); |
| 2453 init_vlc_rl(&rl_intra); | |
| 1132 | 2454 init_vlc_rl(&rvlc_rl_inter); |
| 2455 init_vlc_rl(&rvlc_rl_intra); | |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
2456 init_vlc_rl(&rl_intra_aic); |
| 549 | 2457 init_vlc(&dc_lum, DC_VLC_BITS, 10 /* 13 */, |
| 0 | 2458 &DCtab_lum[0][1], 2, 1, |
| 2459 &DCtab_lum[0][0], 2, 1); | |
| 549 | 2460 init_vlc(&dc_chrom, DC_VLC_BITS, 10 /* 13 */, |
| 0 | 2461 &DCtab_chrom[0][1], 2, 1, |
| 2462 &DCtab_chrom[0][0], 2, 1); | |
| 544 | 2463 init_vlc(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15, |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
2464 &sprite_trajectory_tab[0][1], 4, 2, |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
2465 &sprite_trajectory_tab[0][0], 4, 2); |
| 544 | 2466 init_vlc(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4, |
| 262 | 2467 &mb_type_b_tab[0][1], 2, 1, |
| 2468 &mb_type_b_tab[0][0], 2, 1); | |
| 0 | 2469 } |
| 2470 } | |
| 2471 | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2472 /** |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2473 * Get the GOB height based on picture height. |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2474 */ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2475 int ff_h263_get_gob_height(MpegEncContext *s){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2476 if (s->height <= 400) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2477 return 1; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2478 else if (s->height <= 800) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2479 return 2; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2480 else |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2481 return 4; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2482 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2483 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2484 /** |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2485 * decodes the group of blocks header. |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2486 * @return <0 if an error occured |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2487 */ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2488 static int h263_decode_gob_header(MpegEncContext *s) |
| 162 | 2489 { |
| 2490 unsigned int val, gfid; | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2491 int left; |
| 162 | 2492 |
| 2493 /* Check for GOB Start Code */ | |
| 2494 val = show_bits(&s->gb, 16); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2495 if(val) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2496 return -1; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2497 |
| 162 | 2498 /* We have a GBSC probably with GSTUFF */ |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2499 skip_bits(&s->gb, 16); /* Drop the zeros */ |
|
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1013
diff
changeset
|
2500 left= s->gb.size_in_bits - get_bits_count(&s->gb); |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2501 //MN: we must check the bits left or we might end in a infinite loop (or segfault) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2502 for(;left>13; left--){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2503 if(get_bits1(&s->gb)) break; /* Seek the '1' bit */ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2504 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2505 if(left<=13) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2506 return -1; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2507 |
| 162 | 2508 #ifdef DEBUG |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2509 fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x); |
| 162 | 2510 #endif |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2511 s->gob_number = get_bits(&s->gb, 5); /* GN */ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2512 gfid = get_bits(&s->gb, 2); /* GFID */ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2513 s->qscale = get_bits(&s->gb, 5); /* GQUANT */ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2514 if(s->qscale==0) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2515 return -1; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2516 s->mb_x= 0; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2517 s->mb_y= s->gob_index* s->gob_number; |
| 162 | 2518 #ifdef DEBUG |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2519 fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale); |
| 162 | 2520 #endif |
| 2521 return 0; | |
| 2522 } | |
| 2523 | |
| 290 | 2524 static inline void memsetw(short *tab, int val, int n) |
| 2525 { | |
| 2526 int i; | |
| 2527 for(i=0;i<n;i++) | |
| 2528 tab[i] = val; | |
| 2529 } | |
| 2530 | |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
2531 #ifdef CONFIG_ENCODERS |
|
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
2532 |
| 453 | 2533 void ff_mpeg4_init_partitions(MpegEncContext *s) |
| 2534 { | |
| 2535 init_put_bits(&s->tex_pb, s->tex_pb_buffer, PB_BUFFER_SIZE, NULL, NULL); | |
| 2536 init_put_bits(&s->pb2 , s->pb2_buffer , PB_BUFFER_SIZE, NULL, NULL); | |
| 2537 } | |
| 2538 | |
| 2539 void ff_mpeg4_merge_partitions(MpegEncContext *s) | |
| 290 | 2540 { |
| 453 | 2541 const int pb2_len = get_bit_count(&s->pb2 ); |
| 2542 const int tex_pb_len= get_bit_count(&s->tex_pb); | |
| 2543 const int bits= get_bit_count(&s->pb); | |
| 2544 | |
| 2545 if(s->pict_type==I_TYPE){ | |
| 2546 put_bits(&s->pb, 19, DC_MARKER); | |
| 2547 s->misc_bits+=19 + pb2_len + bits - s->last_bits; | |
| 2548 s->i_tex_bits+= tex_pb_len; | |
| 2549 }else{ | |
| 2550 put_bits(&s->pb, 17, MOTION_MARKER); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2551 s->misc_bits+=17 + pb2_len; |
| 453 | 2552 s->mv_bits+= bits - s->last_bits; |
| 2553 s->p_tex_bits+= tex_pb_len; | |
| 2554 } | |
| 2555 | |
| 2556 flush_put_bits(&s->pb2); | |
| 2557 flush_put_bits(&s->tex_pb); | |
| 2558 | |
| 2559 ff_copy_bits(&s->pb, s->pb2_buffer , pb2_len); | |
| 2560 ff_copy_bits(&s->pb, s->tex_pb_buffer, tex_pb_len); | |
| 2561 s->last_bits= get_bit_count(&s->pb); | |
| 2562 } | |
| 2563 | |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
2564 #endif //CONFIG_ENCODERS |
|
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
2565 |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2566 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2567 switch(s->pict_type){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2568 case I_TYPE: |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2569 return 16; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2570 case P_TYPE: |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2571 case S_TYPE: |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2572 return s->f_code+15; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2573 case B_TYPE: |
| 847 | 2574 return FFMAX(FFMAX(s->f_code, s->b_code)+15, 17); |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2575 default: |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2576 return -1; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2577 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2578 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2579 |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
2580 #ifdef CONFIG_ENCODERS |
|
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
2581 |
| 453 | 2582 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s) |
| 2583 { | |
| 2584 int mb_num_bits= av_log2(s->mb_num - 1) + 1; | |
| 2585 | |
| 2586 ff_mpeg4_stuffing(&s->pb); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2587 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0); |
| 453 | 2588 put_bits(&s->pb, 1, 1); |
| 2589 | |
| 2590 put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2591 put_bits(&s->pb, s->quant_precision, s->qscale); |
| 453 | 2592 put_bits(&s->pb, 1, 0); /* no HEC */ |
| 2593 } | |
| 2594 | |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
2595 #endif //CONFIG_ENCODERS |
|
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1068
diff
changeset
|
2596 |
| 453 | 2597 /** |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2598 * check if the next stuff is a resync marker or the end. |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2599 * @return 0 if not |
| 453 | 2600 */ |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2601 static inline int mpeg4_is_resync(MpegEncContext *s){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2602 const int bits_count= get_bits_count(&s->gb); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2603 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2604 if(s->workaround_bugs&FF_BUG_NO_PADDING){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2605 return 0; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2606 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2607 |
|
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1013
diff
changeset
|
2608 if(bits_count + 8 >= s->gb.size_in_bits){ |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2609 int v= show_bits(&s->gb, 8); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2610 v|= 0x7F >> (7-(bits_count&7)); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2611 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2612 if(v==0x7F) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2613 return 1; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2614 }else{ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2615 if(show_bits(&s->gb, 16) == ff_mpeg4_resync_prefix[bits_count&7]){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2616 int len; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2617 GetBitContext gb= s->gb; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2618 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2619 skip_bits(&s->gb, 1); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2620 align_get_bits(&s->gb); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2621 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2622 for(len=0; len<32; len++){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2623 if(get_bits1(&s->gb)) break; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2624 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2625 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2626 s->gb= gb; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2627 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2628 if(len>=ff_mpeg4_get_video_packet_prefix_length(s)) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2629 return 1; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2630 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2631 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2632 return 0; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2633 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2634 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2635 /** |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2636 * decodes the next video packet. |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2637 * @return <0 if something went wrong |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2638 */ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2639 static int mpeg4_decode_video_packet_header(MpegEncContext *s) |
| 453 | 2640 { |
| 290 | 2641 int mb_num_bits= av_log2(s->mb_num - 1) + 1; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2642 int header_extension=0, mb_num, len; |
| 453 | 2643 |
| 2644 /* is there enough space left for a video packet + header */ | |
|
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1013
diff
changeset
|
2645 if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2646 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2647 for(len=0; len<32; len++){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2648 if(get_bits1(&s->gb)) break; |
| 453 | 2649 } |
| 2650 | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2651 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2652 printf("marker does not match f_code\n"); |
| 453 | 2653 return -1; |
| 2654 } | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2655 |
| 453 | 2656 if(s->shape != RECT_SHAPE){ |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2657 header_extension= get_bits1(&s->gb); |
| 453 | 2658 //FIXME more stuff here |
| 2659 } | |
| 2660 | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2661 mb_num= get_bits(&s->gb, mb_num_bits); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2662 if(mb_num>=s->mb_num){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2663 fprintf(stderr, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num); |
| 453 | 2664 return -1; |
| 2665 } | |
| 1176 | 2666 if(s->pict_type == B_TYPE){ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
2667 while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++; |
| 1176 | 2668 if(mb_num >= s->mb_num) return -1; // slice contains just skiped MBs which where allready decoded |
| 2669 } | |
| 2670 | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2671 s->mb_x= mb_num % s->mb_width; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2672 s->mb_y= mb_num / s->mb_width; |
| 453 | 2673 |
| 2674 if(s->shape != BIN_ONLY_SHAPE){ | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2675 int qscale= get_bits(&s->gb, s->quant_precision); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2676 if(qscale) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2677 s->qscale= qscale; |
| 290 | 2678 } |
| 2679 | |
| 2680 if(s->shape == RECT_SHAPE){ | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2681 header_extension= get_bits1(&s->gb); |
| 290 | 2682 } |
| 2683 if(header_extension){ | |
| 453 | 2684 int time_increment; |
| 290 | 2685 int time_incr=0; |
| 453 | 2686 |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2687 while (get_bits1(&s->gb) != 0) |
| 290 | 2688 time_incr++; |
| 2689 | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2690 check_marker(&s->gb, "before time_increment in video packed header"); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2691 time_increment= get_bits(&s->gb, s->time_increment_bits); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2692 check_marker(&s->gb, "before vop_coding_type in video packed header"); |
| 290 | 2693 |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2694 skip_bits(&s->gb, 2); /* vop coding type */ |
| 290 | 2695 //FIXME not rect stuff here |
| 2696 | |
| 2697 if(s->shape != BIN_ONLY_SHAPE){ | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2698 skip_bits(&s->gb, 3); /* intra dc vlc threshold */ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2699 //FIXME dont just ignore everything |
| 821 | 2700 if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE){ |
| 290 | 2701 mpeg4_decode_sprite_trajectory(s); |
| 660 | 2702 fprintf(stderr, "untested\n"); |
| 290 | 2703 } |
| 2704 | |
| 2705 //FIXME reduced res stuff here | |
| 2706 | |
| 2707 if (s->pict_type != I_TYPE) { | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2708 int f_code = get_bits(&s->gb, 3); /* fcode_for */ |
| 660 | 2709 if(f_code==0){ |
| 2710 printf("Error, video packet header damaged (f_code=0)\n"); | |
| 290 | 2711 } |
| 2712 } | |
| 2713 if (s->pict_type == B_TYPE) { | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2714 int b_code = get_bits(&s->gb, 3); |
| 660 | 2715 if(b_code==0){ |
| 2716 printf("Error, video packet header damaged (b_code=0)\n"); | |
| 2717 } | |
| 290 | 2718 } |
| 2719 } | |
| 2720 } | |
| 2721 //FIXME new-pred stuff | |
| 453 | 2722 |
| 2723 //printf("parse ok %d %d %d %d\n", mb_num, s->mb_x + s->mb_y*s->mb_width, get_bits_count(gb), get_bits_count(&s->gb)); | |
| 2724 | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2725 return 0; |
| 453 | 2726 } |
| 2727 | |
| 2728 void ff_mpeg4_clean_buffers(MpegEncContext *s) | |
| 2729 { | |
| 2730 int c_wrap, c_xy, l_wrap, l_xy; | |
| 290 | 2731 |
| 2732 l_wrap= s->block_wrap[0]; | |
| 453 | 2733 l_xy= s->mb_y*l_wrap*2 + s->mb_x*2; |
| 290 | 2734 c_wrap= s->block_wrap[4]; |
| 453 | 2735 c_xy= s->mb_y*c_wrap + s->mb_x; |
| 290 | 2736 |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2737 #if 0 |
| 290 | 2738 /* clean DC */ |
| 453 | 2739 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1); |
| 2740 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1); | |
| 2741 memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2742 #endif |
| 290 | 2743 |
| 2744 /* clean AC */ | |
| 1064 | 2745 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t)); |
| 2746 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t)); | |
| 2747 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t)); | |
| 290 | 2748 |
| 2749 /* clean MV */ | |
| 453 | 2750 // we cant clear the MVs as they might be needed by a b frame |
| 1064 | 2751 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t)); |
| 2752 // memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2)); | |
| 453 | 2753 s->last_mv[0][0][0]= |
| 2754 s->last_mv[0][0][1]= | |
| 2755 s->last_mv[1][0][0]= | |
| 2756 s->last_mv[1][0][1]= 0; | |
| 2757 } | |
| 2758 | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2759 /** |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2760 * decodes the group of blocks / video packet header. |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2761 * @return <0 if no resync found |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2762 */ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2763 int ff_h263_resync(MpegEncContext *s){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2764 int left, ret; |
| 453 | 2765 |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2766 if(s->codec_id==CODEC_ID_MPEG4) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2767 skip_bits1(&s->gb); |
| 453 | 2768 |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2769 align_get_bits(&s->gb); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2770 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2771 if(show_bits(&s->gb, 16)==0){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2772 if(s->codec_id==CODEC_ID_MPEG4) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2773 ret= mpeg4_decode_video_packet_header(s); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2774 else |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2775 ret= h263_decode_gob_header(s); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2776 if(ret>=0) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2777 return 0; |
| 453 | 2778 } |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2779 //ok, its not where its supposed to be ... |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2780 s->gb= s->last_resync_gb; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2781 align_get_bits(&s->gb); |
|
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1013
diff
changeset
|
2782 left= s->gb.size_in_bits - get_bits_count(&s->gb); |
| 453 | 2783 |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2784 for(;left>16+1+5+5; left-=8){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2785 if(show_bits(&s->gb, 16)==0){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2786 GetBitContext bak= s->gb; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2787 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2788 if(s->codec_id==CODEC_ID_MPEG4) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2789 ret= mpeg4_decode_video_packet_header(s); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2790 else |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2791 ret= h263_decode_gob_header(s); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2792 if(ret>=0) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2793 return 0; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2794 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2795 s->gb= bak; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2796 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2797 skip_bits(&s->gb, 8); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2798 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2799 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2800 return -1; |
| 453 | 2801 } |
| 2802 | |
| 2803 /** | |
| 1034 | 2804 * gets the average motion vector for a GMC MB. |
| 753 | 2805 * @param n either 0 for the x component or 1 for y |
| 2806 * @returns the average MV for a GMC MB | |
| 2807 */ | |
| 2808 static inline int get_amv(MpegEncContext *s, int n){ | |
| 2809 int x, y, mb_v, sum, dx, dy, shift; | |
| 2810 int len = 1 << (s->f_code + 4); | |
| 2811 const int a= s->sprite_warping_accuracy; | |
| 2812 | |
| 2813 if(s->real_sprite_warping_points==1){ | |
| 2814 if(s->divx_version==500 && s->divx_build==413) | |
| 2815 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample)); | |
| 2816 else | |
| 2817 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a); | |
| 2818 }else{ | |
| 2819 dx= s->sprite_delta[n][0]; | |
| 2820 dy= s->sprite_delta[n][1]; | |
| 2821 shift= s->sprite_shift[0]; | |
| 2822 if(n) dy -= 1<<(shift + a + 1); | |
| 2823 else dx -= 1<<(shift + a + 1); | |
| 2824 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16; | |
| 2825 | |
| 2826 sum=0; | |
| 2827 for(y=0; y<16; y++){ | |
| 2828 int v; | |
| 2829 | |
| 2830 v= mb_v + dy*y; | |
| 2831 //XXX FIXME optimize | |
| 2832 for(x=0; x<16; x++){ | |
| 2833 sum+= v>>shift; | |
| 2834 v+= dx; | |
| 2835 } | |
| 2836 } | |
|
999
74dc4105e147
average motion vector rounding like the reference says and not what the standard says
michaelni
parents:
953
diff
changeset
|
2837 sum= RSHIFT(sum, a+8-s->quarter_sample); |
| 753 | 2838 } |
| 2839 | |
| 2840 if (sum < -len) sum= -len; | |
| 2841 else if (sum >= len) sum= len-1; | |
| 2842 | |
| 2843 return sum; | |
| 2844 } | |
| 2845 | |
| 2846 /** | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2847 * decodes first partition. |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2848 * @return number of MBs decoded or <0 if an error occured |
| 453 | 2849 */ |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2850 static int mpeg4_decode_partition_a(MpegEncContext *s){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2851 int mb_num; |
| 1064 | 2852 static const int8_t quant_tab[4] = { -1, -2, 1, 2 }; |
| 453 | 2853 |
| 2854 /* decode first partition */ | |
| 2855 mb_num=0; | |
| 290 | 2856 s->first_slice_line=1; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2857 for(; s->mb_y<s->mb_height; s->mb_y++){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2858 ff_init_block_index(s); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2859 for(; s->mb_x<s->mb_width; s->mb_x++){ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
2860 const int xy= s->mb_x + s->mb_y*s->mb_stride; |
| 453 | 2861 int cbpc; |
| 2862 int dir=0; | |
| 2863 | |
| 2864 mb_num++; | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2865 ff_update_block_index(s); |
| 453 | 2866 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1) |
| 2867 s->first_slice_line=0; | |
| 2868 | |
| 2869 if(s->pict_type==I_TYPE){ | |
| 2870 int i; | |
| 2871 | |
| 1257 | 2872 if(show_bits_long(&s->gb, 19)==DC_MARKER){ |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2873 return mb_num-1; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2874 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2875 |
| 544 | 2876 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1); |
| 453 | 2877 if (cbpc < 0){ |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2878 |
| 453 | 2879 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y); |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2880 return -1; |
| 453 | 2881 } |
| 2882 s->cbp_table[xy]= cbpc & 3; | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
2883 s->current_picture.mb_type[xy]= MB_TYPE_INTRA; |
| 453 | 2884 s->mb_intra = 1; |
| 2885 | |
| 2886 if(cbpc & 4) { | |
| 698 | 2887 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]); |
| 453 | 2888 } |
| 903 | 2889 s->current_picture.qscale_table[xy]= s->qscale; |
| 453 | 2890 |
| 2891 s->mbintra_table[xy]= 1; | |
| 2892 for(i=0; i<6; i++){ | |
| 2893 int dc_pred_dir; | |
| 2894 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir); | |
| 2895 if(dc < 0){ | |
| 2896 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2897 return -1; |
| 453 | 2898 } |
| 2899 dir<<=1; | |
| 2900 if(dc_pred_dir) dir|=1; | |
| 2901 } | |
| 2902 s->pred_dir_table[xy]= dir; | |
| 2903 }else{ /* P/S_TYPE */ | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2904 int mx, my, pred_x, pred_y, bits; |
| 1064 | 2905 int16_t * const mot_val= s->motion_val[s->block_index[0]]; |
| 453 | 2906 const int stride= s->block_wrap[0]*2; |
| 2907 | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2908 bits= show_bits(&s->gb, 17); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2909 if(bits==MOTION_MARKER){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2910 return mb_num-1; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2911 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2912 skip_bits1(&s->gb); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2913 if(bits&0x10000){ |
| 453 | 2914 /* skip mb */ |
| 2915 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){ | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
2916 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0; |
| 753 | 2917 mx= get_amv(s, 0); |
| 2918 my= get_amv(s, 1); | |
| 453 | 2919 }else{ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
2920 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; |
| 753 | 2921 mx=my=0; |
| 453 | 2922 } |
| 2923 mot_val[0 ]= mot_val[2 ]= | |
| 2924 mot_val[0+stride]= mot_val[2+stride]= mx; | |
| 2925 mot_val[1 ]= mot_val[3 ]= | |
| 2926 mot_val[1+stride]= mot_val[3+stride]= my; | |
| 2927 | |
| 2928 if(s->mbintra_table[xy]) | |
| 2929 ff_clean_intra_table_entries(s); | |
| 2930 continue; | |
| 2931 } | |
| 544 | 2932 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2); |
| 453 | 2933 if (cbpc < 0){ |
| 2934 fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2935 return -1; |
| 453 | 2936 } |
| 2937 if (cbpc > 20) | |
| 2938 cbpc+=3; | |
| 2939 else if (cbpc == 20) | |
| 2940 fprintf(stderr, "Stuffing !"); | |
| 2941 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant | |
| 2942 | |
| 2943 s->mb_intra = ((cbpc & 4) != 0); | |
| 2944 | |
| 2945 if(s->mb_intra){ | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
2946 s->current_picture.mb_type[xy]= MB_TYPE_INTRA; |
| 453 | 2947 s->mbintra_table[xy]= 1; |
| 2948 mot_val[0 ]= mot_val[2 ]= | |
| 2949 mot_val[0+stride]= mot_val[2+stride]= 0; | |
| 2950 mot_val[1 ]= mot_val[3 ]= | |
| 2951 mot_val[1+stride]= mot_val[3+stride]= 0; | |
| 2952 }else{ | |
| 2953 if(s->mbintra_table[xy]) | |
| 2954 ff_clean_intra_table_entries(s); | |
| 2955 | |
| 2956 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0) | |
| 2957 s->mcsel= get_bits1(&s->gb); | |
| 2958 else s->mcsel= 0; | |
| 2959 | |
| 2960 if ((cbpc & 16) == 0) { | |
| 2961 /* 16x16 motion prediction */ | |
| 2962 | |
| 2963 h263_pred_motion(s, 0, &pred_x, &pred_y); | |
| 753 | 2964 if(!s->mcsel){ |
| 2965 mx = h263_decode_motion(s, pred_x, s->f_code); | |
| 2966 if (mx >= 0xffff) | |
| 2967 return -1; | |
| 2968 | |
| 2969 my = h263_decode_motion(s, pred_y, s->f_code); | |
| 2970 if (my >= 0xffff) | |
| 2971 return -1; | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
2972 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0; |
| 753 | 2973 } else { |
| 2974 mx = get_amv(s, 0); | |
| 2975 my = get_amv(s, 1); | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
2976 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0; |
| 453 | 2977 } |
| 753 | 2978 |
| 453 | 2979 mot_val[0 ]= mot_val[2 ] = |
| 2980 mot_val[0+stride]= mot_val[2+stride]= mx; | |
| 2981 mot_val[1 ]= mot_val[3 ]= | |
| 2982 mot_val[1+stride]= mot_val[3+stride]= my; | |
| 2983 } else { | |
| 2984 int i; | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
2985 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0; |
| 453 | 2986 for(i=0;i<4;i++) { |
| 1064 | 2987 int16_t *mot_val= h263_pred_motion(s, i, &pred_x, &pred_y); |
| 453 | 2988 mx = h263_decode_motion(s, pred_x, s->f_code); |
| 2989 if (mx >= 0xffff) | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2990 return -1; |
| 453 | 2991 |
| 2992 my = h263_decode_motion(s, pred_y, s->f_code); | |
| 2993 if (my >= 0xffff) | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2994 return -1; |
| 453 | 2995 mot_val[0] = mx; |
| 2996 mot_val[1] = my; | |
| 2997 } | |
| 2998 } | |
| 2999 } | |
| 3000 } | |
| 3001 } | |
| 3002 s->mb_x= 0; | |
| 3003 } | |
| 3004 | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3005 return mb_num; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3006 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3007 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3008 /** |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3009 * decode second partition. |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3010 * @return <0 if an error occured |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3011 */ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3012 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3013 int mb_num=0; |
| 1064 | 3014 static const int8_t quant_tab[4] = { -1, -2, 1, 2 }; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3015 |
| 453 | 3016 s->mb_x= s->resync_mb_x; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3017 s->first_slice_line=1; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3018 for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3019 ff_init_block_index(s); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3020 for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3021 const int xy= s->mb_x + s->mb_y*s->mb_stride; |
| 453 | 3022 |
| 3023 mb_num++; | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3024 ff_update_block_index(s); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3025 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3026 s->first_slice_line=0; |
| 453 | 3027 |
| 3028 if(s->pict_type==I_TYPE){ | |
| 3029 int ac_pred= get_bits1(&s->gb); | |
| 544 | 3030 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
| 453 | 3031 if(cbpy<0){ |
| 3032 fprintf(stderr, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3033 return -1; |
| 453 | 3034 } |
| 3035 | |
| 3036 s->cbp_table[xy]|= cbpy<<2; | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3037 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED; |
| 453 | 3038 }else{ /* P || S_TYPE */ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3039 if(IS_INTRA(s->current_picture.mb_type[xy])){ |
| 453 | 3040 int dir=0,i; |
| 3041 int ac_pred = get_bits1(&s->gb); | |
| 544 | 3042 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
| 453 | 3043 |
| 3044 if(cbpy<0){ | |
| 3045 fprintf(stderr, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3046 return -1; |
| 453 | 3047 } |
| 3048 | |
| 3049 if(s->cbp_table[xy] & 8) { | |
| 698 | 3050 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]); |
| 453 | 3051 } |
| 903 | 3052 s->current_picture.qscale_table[xy]= s->qscale; |
| 453 | 3053 |
| 3054 for(i=0; i<6; i++){ | |
| 3055 int dc_pred_dir; | |
| 3056 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir); | |
| 3057 if(dc < 0){ | |
| 3058 fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3059 return -1; |
| 453 | 3060 } |
| 3061 dir<<=1; | |
| 3062 if(dc_pred_dir) dir|=1; | |
| 3063 } | |
| 3064 s->cbp_table[xy]&= 3; //remove dquant | |
| 3065 s->cbp_table[xy]|= cbpy<<2; | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3066 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3067 s->pred_dir_table[xy]= dir; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3068 }else if(IS_SKIP(s->current_picture.mb_type[xy])){ |
| 903 | 3069 s->current_picture.qscale_table[xy]= s->qscale; |
| 453 | 3070 s->cbp_table[xy]= 0; |
| 3071 }else{ | |
| 544 | 3072 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
| 453 | 3073 |
| 3074 if(cbpy<0){ | |
| 3075 fprintf(stderr, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3076 return -1; |
| 453 | 3077 } |
| 3078 | |
| 3079 if(s->cbp_table[xy] & 8) { | |
| 698 | 3080 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]); |
| 453 | 3081 } |
| 903 | 3082 s->current_picture.qscale_table[xy]= s->qscale; |
| 453 | 3083 |
| 3084 s->cbp_table[xy]&= 3; //remove dquant | |
| 3085 s->cbp_table[xy]|= (cbpy^0xf)<<2; | |
| 3086 } | |
| 3087 } | |
| 3088 } | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3089 if(mb_num >= mb_count) return 0; |
| 453 | 3090 s->mb_x= 0; |
| 3091 } | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3092 return 0; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3093 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3094 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3095 /** |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3096 * decodes the first & second partition |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3097 * @return <0 if error (and sets error type in the error_status_table) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3098 */ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3099 int ff_mpeg4_decode_partitions(MpegEncContext *s) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3100 { |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3101 int mb_num; |
| 1144 | 3102 const int part_a_error= s->pict_type==I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR; |
| 3103 const int part_a_end = s->pict_type==I_TYPE ? (DC_END |MV_END) : MV_END; | |
| 453 | 3104 |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3105 mb_num= mpeg4_decode_partition_a(s); |
| 1144 | 3106 if(mb_num<0){ |
| 3107 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3108 return -1; |
| 1144 | 3109 } |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3110 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3111 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3112 fprintf(stderr, "slice below monitor ...\n"); |
| 1144 | 3113 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error); |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3114 return -1; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3115 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3116 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3117 s->mb_num_left= mb_num; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3118 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3119 if(s->pict_type==I_TYPE){ |
| 1257 | 3120 if(get_bits_long(&s->gb, 19)!=DC_MARKER){ |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3121 fprintf(stderr, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3122 return -1; |
| 1144 | 3123 } |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3124 }else{ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3125 if(get_bits(&s->gb, 17)!=MOTION_MARKER){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3126 fprintf(stderr, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3127 return -1; |
| 1144 | 3128 } |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3129 } |
| 1144 | 3130 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end); |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3131 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3132 if( mpeg4_decode_partition_b(s, mb_num) < 0){ |
| 1144 | 3133 if(s->pict_type==P_TYPE) |
| 3134 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3135 return -1; |
| 1144 | 3136 }else{ |
| 3137 if(s->pict_type==P_TYPE) | |
| 3138 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3139 } |
| 453 | 3140 |
| 3141 return 0; | |
| 3142 } | |
| 3143 | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3144 /** |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3145 * decode partition C of one MB. |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3146 * @return <0 if an error occured |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3147 */ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3148 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64]) |
| 453 | 3149 { |
| 3150 int cbp, mb_type; | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3151 const int xy= s->mb_x + s->mb_y*s->mb_stride; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3152 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3153 mb_type= s->current_picture.mb_type[xy]; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3154 cbp = s->cbp_table[xy]; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3155 |
| 903 | 3156 if(s->current_picture.qscale_table[xy] != s->qscale){ |
| 3157 s->qscale= s->current_picture.qscale_table[xy]; | |
| 698 | 3158 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ]; |
| 3159 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ]; | |
| 453 | 3160 } |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3161 |
| 453 | 3162 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) { |
| 3163 int i; | |
| 3164 for(i=0; i<4; i++){ | |
| 3165 s->mv[0][i][0] = s->motion_val[ s->block_index[i] ][0]; | |
| 3166 s->mv[0][i][1] = s->motion_val[ s->block_index[i] ][1]; | |
| 3167 } | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3168 s->mb_intra = IS_INTRA(mb_type); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3169 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3170 if (IS_SKIP(mb_type)) { |
| 453 | 3171 /* skip mb */ |
| 3172 for(i=0;i<6;i++) | |
| 3173 s->block_last_index[i] = -1; | |
| 3174 s->mv_dir = MV_DIR_FORWARD; | |
| 3175 s->mv_type = MV_TYPE_16X16; | |
| 3176 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){ | |
| 3177 s->mcsel=1; | |
| 3178 s->mb_skiped = 0; | |
| 3179 }else{ | |
| 3180 s->mcsel=0; | |
| 3181 s->mb_skiped = 1; | |
| 3182 } | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3183 }else if(s->mb_intra){ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3184 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); |
| 453 | 3185 }else if(!s->mb_intra){ |
| 3186 // s->mcsel= 0; //FIXME do we need to init that | |
| 3187 | |
| 3188 s->mv_dir = MV_DIR_FORWARD; | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3189 if (IS_8X8(mb_type)) { |
| 453 | 3190 s->mv_type = MV_TYPE_8X8; |
| 3191 } else { | |
| 3192 s->mv_type = MV_TYPE_16X16; | |
| 3193 } | |
| 3194 } | |
| 3195 } else { /* I-Frame */ | |
| 3196 s->mb_intra = 1; | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3197 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); |
| 1132 | 3198 } |
| 3199 | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3200 if (!IS_SKIP(mb_type)) { |
| 1132 | 3201 int i; |
| 453 | 3202 /* decode each block */ |
| 3203 for (i = 0; i < 6; i++) { | |
| 1132 | 3204 if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){ |
| 3205 fprintf(stderr, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra); | |
| 453 | 3206 return -1; |
| 3207 } | |
| 718 | 3208 cbp+=cbp; |
| 453 | 3209 } |
| 3210 } | |
| 290 | 3211 |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3212 /* per-MB end of slice check */ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3213 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3214 if(--s->mb_num_left <= 0){ |
|
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1013
diff
changeset
|
3215 //printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb)); |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3216 if(mpeg4_is_resync(s)) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3217 return SLICE_END; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3218 else |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3219 return SLICE_NOEND; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3220 }else{ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3221 if(mpeg4_is_resync(s)){ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3222 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3223 if(s->cbp_table[xy+delta]) |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3224 return SLICE_END; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3225 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3226 return SLICE_OK; |
|
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3227 } |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3228 } |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3229 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3230 int ff_h263_decode_mb(MpegEncContext *s, |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3231 DCTELEM block[6][64]) |
| 0 | 3232 { |
| 3233 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; | |
| 1064 | 3234 int16_t *mot_val; |
| 3235 static int8_t quant_tab[4] = { -1, -2, 1, 2 }; | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3236 const int xy= s->mb_x + s->mb_y * s->mb_stride; |
| 359 | 3237 |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
3238 if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) { |
| 21 | 3239 if (get_bits1(&s->gb)) { |
| 0 | 3240 /* skip mb */ |
| 3241 s->mb_intra = 0; | |
| 3242 for(i=0;i<6;i++) | |
| 3243 s->block_last_index[i] = -1; | |
| 3244 s->mv_dir = MV_DIR_FORWARD; | |
| 3245 s->mv_type = MV_TYPE_16X16; | |
| 255 | 3246 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3247 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0; |
| 255 | 3248 s->mcsel=1; |
| 753 | 3249 s->mv[0][0][0]= get_amv(s, 0); |
| 3250 s->mv[0][0][1]= get_amv(s, 1); | |
| 255 | 3251 |
| 3252 s->mb_skiped = 0; | |
| 3253 }else{ | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3254 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; |
| 255 | 3255 s->mcsel=0; |
| 3256 s->mv[0][0][0] = 0; | |
| 3257 s->mv[0][0][1] = 0; | |
| 3258 s->mb_skiped = 1; | |
| 3259 } | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3260 goto end; |
| 0 | 3261 } |
| 544 | 3262 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2); |
| 144 | 3263 //fprintf(stderr, "\tCBPC: %d", cbpc); |
| 0 | 3264 if (cbpc < 0) |
| 3265 return -1; | |
| 161 | 3266 if (cbpc > 20) |
| 3267 cbpc+=3; | |
| 3268 else if (cbpc == 20) | |
| 3269 fprintf(stderr, "Stuffing !"); | |
| 144 | 3270 |
| 0 | 3271 dquant = cbpc & 8; |
| 3272 s->mb_intra = ((cbpc & 4) != 0); | |
| 262 | 3273 if (s->mb_intra) goto intra; |
| 3274 | |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
3275 if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0) |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
3276 s->mcsel= get_bits1(&s->gb); |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
3277 else s->mcsel= 0; |
| 544 | 3278 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
| 0 | 3279 cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2); |
| 3280 if (dquant) { | |
| 698 | 3281 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]); |
| 0 | 3282 } |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3283 if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE))) |
|
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3284 s->interlaced_dct= get_bits1(&s->gb); |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3285 |
| 0 | 3286 s->mv_dir = MV_DIR_FORWARD; |
| 3287 if ((cbpc & 16) == 0) { | |
|
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3288 if(s->mcsel){ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3289 s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0; |
|
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3290 /* 16x16 global motion prediction */ |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3291 s->mv_type = MV_TYPE_16X16; |
| 753 | 3292 mx= get_amv(s, 0); |
| 3293 my= get_amv(s, 1); | |
|
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3294 s->mv[0][0][0] = mx; |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3295 s->mv[0][0][1] = my; |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3296 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3297 s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED; |
|
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3298 /* 16x8 field motion prediction */ |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3299 s->mv_type= MV_TYPE_FIELD; |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3300 |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3301 s->field_select[0][0]= get_bits1(&s->gb); |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3302 s->field_select[0][1]= get_bits1(&s->gb); |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3303 |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3304 h263_pred_motion(s, 0, &pred_x, &pred_y); |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3305 |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3306 for(i=0; i<2; i++){ |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3307 mx = h263_decode_motion(s, pred_x, s->f_code); |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3308 if (mx >= 0xffff) |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3309 return -1; |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3310 |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3311 my = h263_decode_motion(s, pred_y/2, s->f_code); |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3312 if (my >= 0xffff) |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3313 return -1; |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3314 |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3315 s->mv[0][i][0] = mx; |
| 661 | 3316 s->mv[0][i][1] = my; |
|
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3317 } |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3318 }else{ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3319 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0; |
|
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3320 /* 16x16 motion prediction */ |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3321 s->mv_type = MV_TYPE_16X16; |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3322 h263_pred_motion(s, 0, &pred_x, &pred_y); |
| 1089 | 3323 if (s->umvplus) |
|
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3324 mx = h263p_decode_umotion(s, pred_x); |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3325 else |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3326 mx = h263_decode_motion(s, pred_x, s->f_code); |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3327 |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3328 if (mx >= 0xffff) |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3329 return -1; |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3330 |
| 1089 | 3331 if (s->umvplus) |
|
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3332 my = h263p_decode_umotion(s, pred_y); |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3333 else |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3334 my = h263_decode_motion(s, pred_y, s->f_code); |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3335 |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3336 if (my >= 0xffff) |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3337 return -1; |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3338 s->mv[0][0][0] = mx; |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3339 s->mv[0][0][1] = my; |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3340 |
| 1089 | 3341 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1) |
|
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3342 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */ |
| 255 | 3343 } |
| 0 | 3344 } else { |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3345 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0; |
| 0 | 3346 s->mv_type = MV_TYPE_8X8; |
| 3347 for(i=0;i<4;i++) { | |
| 3348 mot_val = h263_pred_motion(s, i, &pred_x, &pred_y); | |
| 1089 | 3349 if (s->umvplus) |
| 78 | 3350 mx = h263p_decode_umotion(s, pred_x); |
| 3351 else | |
| 262 | 3352 mx = h263_decode_motion(s, pred_x, s->f_code); |
| 0 | 3353 if (mx >= 0xffff) |
| 3354 return -1; | |
| 78 | 3355 |
| 1089 | 3356 if (s->umvplus) |
| 78 | 3357 my = h263p_decode_umotion(s, pred_y); |
| 3358 else | |
| 262 | 3359 my = h263_decode_motion(s, pred_y, s->f_code); |
| 0 | 3360 if (my >= 0xffff) |
| 3361 return -1; | |
| 3362 s->mv[0][i][0] = mx; | |
| 3363 s->mv[0][i][1] = my; | |
| 1089 | 3364 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1) |
| 78 | 3365 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */ |
| 0 | 3366 mot_val[0] = mx; |
| 3367 mot_val[1] = my; | |
| 3368 } | |
| 3369 } | |
| 262 | 3370 } else if(s->pict_type==B_TYPE) { |
| 3371 int modb1; // first bit of modb | |
| 3372 int modb2; // second bit of modb | |
| 3373 int mb_type; | |
| 3374 | |
| 3375 s->mb_intra = 0; //B-frames never contain intra blocks | |
| 3376 s->mcsel=0; // ... true gmc blocks | |
| 3377 | |
| 3378 if(s->mb_x==0){ | |
| 674 | 3379 for(i=0; i<2; i++){ |
| 3380 s->last_mv[i][0][0]= | |
| 3381 s->last_mv[i][0][1]= | |
| 3382 s->last_mv[i][1][0]= | |
| 3383 s->last_mv[i][1][1]= 0; | |
| 3384 } | |
| 262 | 3385 } |
| 3386 | |
| 3387 /* if we skipped it in the future P Frame than skip it now too */ | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3388 s->mb_skiped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC |
| 262 | 3389 |
| 3390 if(s->mb_skiped){ | |
| 3391 /* skip mb */ | |
| 3392 for(i=0;i<6;i++) | |
| 3393 s->block_last_index[i] = -1; | |
| 3394 | |
| 3395 s->mv_dir = MV_DIR_FORWARD; | |
| 3396 s->mv_type = MV_TYPE_16X16; | |
| 3397 s->mv[0][0][0] = 0; | |
| 3398 s->mv[0][0][1] = 0; | |
| 3399 s->mv[1][0][0] = 0; | |
| 3400 s->mv[1][0][1] = 0; | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3401 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3402 goto end; |
| 262 | 3403 } |
| 3404 | |
| 666 | 3405 modb1= get_bits1(&s->gb); |
| 3406 if(modb1){ | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3407 mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded |
| 666 | 3408 cbp=0; |
| 3409 }else{ | |
| 262 | 3410 modb2= get_bits1(&s->gb); |
| 544 | 3411 mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1); |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3412 if(mb_type<0){ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3413 printf("illegal MB_type\n"); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3414 return -1; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3415 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3416 mb_type= mb_type_b_map[ mb_type ]; |
| 666 | 3417 if(modb2) cbp= 0; |
| 3418 else cbp= get_bits(&s->gb, 6); | |
| 3419 | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3420 if ((!IS_DIRECT(mb_type)) && cbp) { |
| 262 | 3421 if(get_bits1(&s->gb)){ |
| 698 | 3422 change_qscale(s, get_bits1(&s->gb)*4 - 2); |
| 262 | 3423 } |
| 3424 } | |
| 664 | 3425 |
| 3426 if(!s->progressive_sequence){ | |
| 3427 if(cbp) | |
| 3428 s->interlaced_dct= get_bits1(&s->gb); | |
| 3429 | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3430 if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3431 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3432 mb_type &= ~MB_TYPE_16x16; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3433 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3434 if(USES_LIST(mb_type, 0)){ |
| 667 | 3435 s->field_select[0][0]= get_bits1(&s->gb); |
| 3436 s->field_select[0][1]= get_bits1(&s->gb); | |
| 3437 } | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3438 if(USES_LIST(mb_type, 1)){ |
| 667 | 3439 s->field_select[1][0]= get_bits1(&s->gb); |
| 3440 s->field_select[1][1]= get_bits1(&s->gb); | |
| 3441 } | |
| 3442 } | |
| 666 | 3443 } |
| 3444 | |
| 667 | 3445 s->mv_dir = 0; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3446 if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){ |
| 666 | 3447 s->mv_type= MV_TYPE_16X16; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3448 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3449 if(USES_LIST(mb_type, 0)){ |
| 666 | 3450 s->mv_dir = MV_DIR_FORWARD; |
| 3451 | |
| 3452 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code); | |
| 3453 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code); | |
| 3454 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx; | |
| 3455 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my; | |
| 667 | 3456 } |
| 666 | 3457 |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3458 if(USES_LIST(mb_type, 1)){ |
| 666 | 3459 s->mv_dir |= MV_DIR_BACKWARD; |
| 3460 | |
| 3461 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code); | |
| 3462 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code); | |
| 3463 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx; | |
| 3464 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my; | |
| 3465 } | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3466 }else if(!IS_DIRECT(mb_type)){ |
| 666 | 3467 s->mv_type= MV_TYPE_FIELD; |
| 667 | 3468 |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3469 if(USES_LIST(mb_type, 0)){ |
| 666 | 3470 s->mv_dir = MV_DIR_FORWARD; |
| 3471 | |
| 3472 for(i=0; i<2; i++){ | |
| 3473 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code); | |
| 3474 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code); | |
| 3475 s->last_mv[0][i][0]= s->mv[0][i][0] = mx; | |
| 3476 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2; | |
| 3477 } | |
| 667 | 3478 } |
| 666 | 3479 |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3480 if(USES_LIST(mb_type, 1)){ |
| 666 | 3481 s->mv_dir |= MV_DIR_BACKWARD; |
| 3482 | |
| 3483 for(i=0; i<2; i++){ | |
| 3484 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code); | |
| 3485 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code); | |
| 3486 s->last_mv[1][i][0]= s->mv[1][i][0] = mx; | |
| 3487 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2; | |
| 664 | 3488 } |
| 3489 } | |
| 3490 } | |
| 3491 } | |
| 666 | 3492 |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3493 if(IS_DIRECT(mb_type)){ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3494 if(IS_SKIP(mb_type)) |
| 666 | 3495 mx=my=0; |
| 3496 else{ | |
| 3497 mx = h263_decode_motion(s, 0, 1); | |
| 3498 my = h263_decode_motion(s, 0, 1); | |
| 3499 } | |
| 664 | 3500 |
| 262 | 3501 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3502 mb_type |= ff_mpeg4_set_direct_mv(s, mx, my); |
| 664 | 3503 } |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3504 s->current_picture.mb_type[xy]= mb_type; |
| 262 | 3505 } else { /* I-Frame */ |
| 544 | 3506 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1); |
| 262 | 3507 if (cbpc < 0) |
| 3508 return -1; | |
| 3509 dquant = cbpc & 4; | |
| 3510 s->mb_intra = 1; | |
| 3511 intra: | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3512 s->current_picture.mb_type[xy]= MB_TYPE_INTRA; |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
3513 if (s->h263_pred || s->h263_aic) { |
| 21 | 3514 s->ac_pred = get_bits1(&s->gb); |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3515 if(s->ac_pred){ |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3516 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3517 |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3518 if (s->h263_aic) |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3519 s->h263_aic_dir = get_bits1(&s->gb); |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3520 } |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3521 }else |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3522 s->ac_pred = 0; |
| 591 | 3523 |
| 544 | 3524 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
| 453 | 3525 if(cbpy<0) return -1; |
| 0 | 3526 cbp = (cbpc & 3) | (cbpy << 2); |
| 3527 if (dquant) { | |
| 698 | 3528 change_qscale(s, quant_tab[get_bits(&s->gb, 2)]); |
| 0 | 3529 } |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3530 |
|
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3531 if(!s->progressive_sequence) |
|
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3532 s->interlaced_dct= get_bits1(&s->gb); |
| 575 | 3533 |
| 3534 /* decode each block */ | |
| 3535 if (s->h263_pred) { | |
| 3536 for (i = 0; i < 6; i++) { | |
| 1132 | 3537 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0) |
| 575 | 3538 return -1; |
| 718 | 3539 cbp+=cbp; |
| 575 | 3540 } |
| 3541 } else { | |
| 3542 for (i = 0; i < 6; i++) { | |
| 718 | 3543 if (h263_decode_block(s, block[i], i, cbp&32) < 0) |
| 575 | 3544 return -1; |
| 718 | 3545 cbp+=cbp; |
| 575 | 3546 } |
| 3547 } | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3548 goto end; |
| 0 | 3549 } |
| 3550 | |
| 3551 /* decode each block */ | |
| 3552 if (s->h263_pred) { | |
| 575 | 3553 for (i = 0; i < 6; i++) { |
| 1132 | 3554 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0) |
| 0 | 3555 return -1; |
| 718 | 3556 cbp+=cbp; |
| 575 | 3557 } |
| 0 | 3558 } else { |
| 575 | 3559 for (i = 0; i < 6; i++) { |
| 718 | 3560 if (h263_decode_block(s, block[i], i, cbp&32) < 0) |
| 0 | 3561 return -1; |
| 718 | 3562 cbp+=cbp; |
| 575 | 3563 } |
| 0 | 3564 } |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3565 end: |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3566 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3567 /* per-MB end of slice check */ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3568 if(s->codec_id==CODEC_ID_MPEG4){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3569 if(mpeg4_is_resync(s)){ |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3570 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3571 if(s->pict_type==B_TYPE && s->next_picture.mbskip_table[xy + delta]) |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3572 return SLICE_OK; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3573 return SLICE_END; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3574 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3575 }else{ |
|
892
550033bc7e2d
fixing h263+ slices if the padding at the end of the frame is >7 && <16 && there are no zero bytes afterwards
michaelni
parents:
887
diff
changeset
|
3576 int v= show_bits(&s->gb, 16); |
|
550033bc7e2d
fixing h263+ slices if the padding at the end of the frame is >7 && <16 && there are no zero bytes afterwards
michaelni
parents:
887
diff
changeset
|
3577 |
|
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1013
diff
changeset
|
3578 if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){ |
|
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1013
diff
changeset
|
3579 v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3580 } |
|
892
550033bc7e2d
fixing h263+ slices if the padding at the end of the frame is >7 && <16 && there are no zero bytes afterwards
michaelni
parents:
887
diff
changeset
|
3581 |
|
550033bc7e2d
fixing h263+ slices if the padding at the end of the frame is >7 && <16 && there are no zero bytes afterwards
michaelni
parents:
887
diff
changeset
|
3582 if(v==0) |
|
550033bc7e2d
fixing h263+ slices if the padding at the end of the frame is >7 && <16 && there are no zero bytes afterwards
michaelni
parents:
887
diff
changeset
|
3583 return SLICE_END; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3584 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3585 |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3586 return SLICE_OK; |
| 0 | 3587 } |
| 3588 | |
| 262 | 3589 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code) |
| 0 | 3590 { |
|
656
e47fa3e3f2d5
statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents:
654
diff
changeset
|
3591 int code, val, sign, shift, l; |
| 544 | 3592 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2); |
| 0 | 3593 |
| 3594 if (code == 0) | |
| 3595 return pred; | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3596 if (code < 0) |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3597 return 0xffff; |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
702
diff
changeset
|
3598 |
| 21 | 3599 sign = get_bits1(&s->gb); |
| 262 | 3600 shift = f_code - 1; |
|
1255
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1254
diff
changeset
|
3601 val = code; |
|
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1254
diff
changeset
|
3602 if (shift) { |
|
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1254
diff
changeset
|
3603 val = (val - 1) << shift; |
| 0 | 3604 val |= get_bits(&s->gb, shift); |
|
1255
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1254
diff
changeset
|
3605 val++; |
|
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1254
diff
changeset
|
3606 } |
| 0 | 3607 if (sign) |
| 3608 val = -val; | |
| 3609 val += pred; | |
| 475 | 3610 |
| 0 | 3611 /* modulo decoding */ |
| 3612 if (!s->h263_long_vectors) { | |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
702
diff
changeset
|
3613 l = 1 << (f_code + 4); |
|
1255
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1254
diff
changeset
|
3614 val = ((val + l)&(l*2-1)) - l; |
| 0 | 3615 } else { |
| 3616 /* horrible h263 long vector mode */ | |
| 3617 if (pred < -31 && val < -63) | |
| 3618 val += 64; | |
| 3619 if (pred > 32 && val > 63) | |
| 3620 val -= 64; | |
|
154
f914f710b8d0
- Fixed a bug on H.263 MV prediction for MB on GOBs limits.
pulento
parents:
144
diff
changeset
|
3621 |
| 0 | 3622 } |
| 3623 return val; | |
| 3624 } | |
| 3625 | |
| 78 | 3626 /* Decodes RVLC of H.263+ UMV */ |
| 3627 static int h263p_decode_umotion(MpegEncContext * s, int pred) | |
| 3628 { | |
| 3629 int code = 0, sign; | |
| 3630 | |
| 3631 if (get_bits1(&s->gb)) /* Motion difference = 0 */ | |
| 3632 return pred; | |
| 3633 | |
| 3634 code = 2 + get_bits1(&s->gb); | |
| 3635 | |
| 3636 while (get_bits1(&s->gb)) | |
| 3637 { | |
| 3638 code <<= 1; | |
| 3639 code += get_bits1(&s->gb); | |
| 3640 } | |
| 3641 sign = code & 1; | |
| 3642 code >>= 1; | |
| 3643 | |
| 3644 code = (sign) ? (pred - code) : (pred + code); | |
| 3645 #ifdef DEBUG | |
| 3646 fprintf(stderr,"H.263+ UMV Motion = %d\n", code); | |
| 3647 #endif | |
| 3648 return code; | |
| 3649 | |
| 3650 } | |
| 3651 | |
| 0 | 3652 static int h263_decode_block(MpegEncContext * s, DCTELEM * block, |
| 3653 int n, int coded) | |
| 3654 { | |
| 3655 int code, level, i, j, last, run; | |
| 3656 RLTable *rl = &rl_inter; | |
| 1064 | 3657 const uint8_t *scan_table; |
| 0 | 3658 |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
702
diff
changeset
|
3659 scan_table = s->intra_scantable.permutated; |
|
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
3660 if (s->h263_aic && s->mb_intra) { |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
3661 rl = &rl_intra_aic; |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
3662 i = 0; |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
3663 if (s->ac_pred) { |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
3664 if (s->h263_aic_dir) |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
702
diff
changeset
|
3665 scan_table = s->intra_v_scantable.permutated; /* left */ |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
3666 else |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
702
diff
changeset
|
3667 scan_table = s->intra_h_scantable.permutated; /* top */ |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
3668 } |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
3669 } else if (s->mb_intra) { |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
3670 /* DC coef */ |
| 1090 | 3671 if(s->h263_rv10){ |
| 3672 if (s->rv10_version == 3 && s->pict_type == I_TYPE) { | |
| 0 | 3673 int component, diff; |
| 3674 component = (n <= 3 ? 0 : n - 4 + 1); | |
| 3675 level = s->last_dc[component]; | |
| 3676 if (s->rv10_first_dc_coded[component]) { | |
| 3677 diff = rv_decode_dc(s, n); | |
| 3678 if (diff == 0xffff) | |
| 3679 return -1; | |
| 3680 level += diff; | |
| 3681 level = level & 0xff; /* handle wrap round */ | |
| 3682 s->last_dc[component] = level; | |
| 3683 } else { | |
| 3684 s->rv10_first_dc_coded[component] = 1; | |
| 3685 } | |
| 1090 | 3686 } else { |
| 3687 level = get_bits(&s->gb, 8); | |
| 3688 } | |
| 3689 }else{ | |
| 0 | 3690 level = get_bits(&s->gb, 8); |
| 1089 | 3691 if((level&0x7F) == 0){ |
| 1090 | 3692 fprintf(stderr, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y); |
| 1089 | 3693 return -1; |
| 3694 } | |
| 0 | 3695 if (level == 255) |
| 3696 level = 128; | |
| 3697 } | |
| 3698 block[0] = level; | |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
3699 i = 1; |
| 0 | 3700 } else { |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
3701 i = 0; |
| 0 | 3702 } |
| 3703 if (!coded) { | |
|
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
3704 if (s->mb_intra && s->h263_aic) |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
3705 goto not_coded; |
| 0 | 3706 s->block_last_index[n] = i - 1; |
| 3707 return 0; | |
| 3708 } | |
| 3709 | |
| 3710 for(;;) { | |
| 544 | 3711 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2); |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3712 if (code < 0){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3713 fprintf(stderr, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y); |
| 0 | 3714 return -1; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3715 } |
| 0 | 3716 if (code == rl->n) { |
| 3717 /* escape */ | |
|
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3718 if (s->h263_flv > 1) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3719 int is11 = get_bits1(&s->gb); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3720 last = get_bits1(&s->gb); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3721 run = get_bits(&s->gb, 6); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3722 if(is11){ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3723 level = (int8_t)get_sbits(&s->gb, 11); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3724 } else { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3725 level = (int8_t)get_sbits(&s->gb, 7); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3726 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3727 } else { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3728 last = get_bits1(&s->gb); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3729 run = get_bits(&s->gb, 6); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3730 level = (int8_t)get_bits(&s->gb, 8); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3731 if(level == -128){ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3732 if (s->h263_rv10) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3733 /* XXX: should patch encoder too */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3734 level = get_sbits(&s->gb, 12); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3735 }else{ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3736 level = get_bits(&s->gb, 5); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3737 level |= get_sbits(&s->gb, 6)<<5; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
3738 } |
| 1089 | 3739 } |
| 0 | 3740 } |
| 3741 } else { | |
| 3742 run = rl->table_run[code]; | |
| 3743 level = rl->table_level[code]; | |
| 3744 last = code >= rl->last; | |
| 21 | 3745 if (get_bits1(&s->gb)) |
| 0 | 3746 level = -level; |
| 3747 } | |
| 3748 i += run; | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3749 if (i >= 64){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3750 fprintf(stderr, "run overflow at %dx%d\n", s->mb_x, s->mb_y); |
| 0 | 3751 return -1; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3752 } |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
3753 j = scan_table[i]; |
| 0 | 3754 block[j] = level; |
| 3755 if (last) | |
| 3756 break; | |
| 3757 i++; | |
| 3758 } | |
|
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
3759 not_coded: |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
3760 if (s->mb_intra && s->h263_aic) { |
|
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
3761 h263_pred_acdc(s, block, n); |
|
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
3762 i = 63; |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
3763 } |
| 0 | 3764 s->block_last_index[n] = i; |
| 3765 return 0; | |
| 3766 } | |
| 3767 | |
| 1034 | 3768 /** |
| 3769 * decodes the dc value. | |
| 3770 * @param n block index (0-3 are luma, 4-5 are chroma) | |
| 3771 * @param dir_ptr the prediction direction will be stored here | |
| 3772 * @return the quantized dc | |
| 3773 */ | |
| 453 | 3774 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) |
| 0 | 3775 { |
| 3776 int level, pred, code; | |
| 1064 | 3777 uint16_t *dc_val; |
| 0 | 3778 |
| 3779 if (n < 4) | |
| 544 | 3780 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1); |
| 0 | 3781 else |
| 544 | 3782 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1); |
| 453 | 3783 if (code < 0 || code > 9 /* && s->nbit<9 */){ |
| 3784 fprintf(stderr, "illegal dc vlc\n"); | |
| 0 | 3785 return -1; |
| 453 | 3786 } |
| 0 | 3787 if (code == 0) { |
| 3788 level = 0; | |
| 3789 } else { | |
|
1271
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3790 if(IS_3IV1){ |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3791 if(code==1) |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3792 level= 2*get_bits1(&s->gb)-1; |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3793 else{ |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3794 if(get_bits1(&s->gb)) |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3795 level = get_bits(&s->gb, code-1) + (1<<(code-1)); |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3796 else |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3797 level = -get_bits(&s->gb, code-1) - (1<<(code-1)); |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3798 } |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3799 }else{ |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3800 level = get_xbits(&s->gb, code); |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3801 } |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3802 |
| 453 | 3803 if (code > 8){ |
| 3804 if(get_bits1(&s->gb)==0){ /* marker */ | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3805 if(s->error_resilience>=2){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3806 fprintf(stderr, "dc marker bit missing\n"); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3807 return -1; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3808 } |
| 453 | 3809 } |
| 3810 } | |
| 0 | 3811 } |
| 498 | 3812 pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr); |
| 0 | 3813 level += pred; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3814 if (level < 0){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3815 if(s->error_resilience>=3){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3816 fprintf(stderr, "dc<0 at %dx%d\n", s->mb_x, s->mb_y); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3817 return -1; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3818 } |
| 0 | 3819 level = 0; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3820 } |
| 0 | 3821 if (n < 4) { |
| 3822 *dc_val = level * s->y_dc_scale; | |
| 3823 } else { | |
| 3824 *dc_val = level * s->c_dc_scale; | |
| 3825 } | |
|
1271
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3826 if(IS_3IV1) |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3827 *dc_val = level * 8; |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3828 |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3829 if(s->error_resilience>=3){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3830 if(*dc_val > 2048 + s->y_dc_scale + s->c_dc_scale){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3831 fprintf(stderr, "dc overflow at %dx%d\n", s->mb_x, s->mb_y); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3832 return -1; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3833 } |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3834 } |
| 0 | 3835 return level; |
| 3836 } | |
| 3837 | |
| 453 | 3838 /** |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3839 * decodes a block. |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3840 * @return <0 if an error occured |
| 453 | 3841 */ |
| 3842 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, | |
| 1132 | 3843 int n, int coded, int intra, int rvlc) |
| 0 | 3844 { |
| 549 | 3845 int level, i, last, run; |
| 0 | 3846 int dc_pred_dir; |
| 575 | 3847 RLTable * rl; |
| 3848 RL_VLC_ELEM * rl_vlc; | |
| 1064 | 3849 const uint8_t * scan_table; |
| 549 | 3850 int qmul, qadd; |
| 0 | 3851 |
| 1132 | 3852 //Note intra & rvlc should be optimized away if this is inlined |
| 3853 | |
| 575 | 3854 if(intra) { |
| 0 | 3855 /* DC coef */ |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3856 if(s->partitioned_frame){ |
| 453 | 3857 level = s->dc_val[0][ s->block_index[n] ]; |
|
1261
362947395f5c
fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents:
1257
diff
changeset
|
3858 if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale); |
|
362947395f5c
fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents:
1257
diff
changeset
|
3859 else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale); |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1176
diff
changeset
|
3860 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32; |
| 453 | 3861 }else{ |
| 3862 level = mpeg4_decode_dc(s, n, &dc_pred_dir); | |
| 3863 if (level < 0) | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3864 return -1; |
| 453 | 3865 } |
| 0 | 3866 block[0] = level; |
| 549 | 3867 i = 0; |
| 0 | 3868 if (!coded) |
| 3869 goto not_coded; | |
| 1132 | 3870 |
| 3871 if(rvlc){ | |
| 3872 rl = &rvlc_rl_intra; | |
| 3873 rl_vlc = rvlc_rl_intra.rl_vlc[0]; | |
| 3874 }else{ | |
| 3875 rl = &rl_intra; | |
| 3876 rl_vlc = rl_intra.rl_vlc[0]; | |
| 3877 } | |
| 718 | 3878 if (s->ac_pred) { |
| 0 | 3879 if (dc_pred_dir == 0) |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
702
diff
changeset
|
3880 scan_table = s->intra_v_scantable.permutated; /* left */ |
| 0 | 3881 else |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
702
diff
changeset
|
3882 scan_table = s->intra_h_scantable.permutated; /* top */ |
| 0 | 3883 } else { |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
702
diff
changeset
|
3884 scan_table = s->intra_scantable.permutated; |
| 0 | 3885 } |
| 549 | 3886 qmul=1; |
| 3887 qadd=0; | |
| 0 | 3888 } else { |
| 549 | 3889 i = -1; |
| 0 | 3890 if (!coded) { |
| 549 | 3891 s->block_last_index[n] = i; |
| 0 | 3892 return 0; |
| 3893 } | |
| 1132 | 3894 if(rvlc) rl = &rvlc_rl_inter; |
| 3895 else rl = &rl_inter; | |
| 661 | 3896 |
| 718 | 3897 scan_table = s->intra_scantable.permutated; |
| 661 | 3898 |
| 591 | 3899 if(s->mpeg_quant){ |
| 3900 qmul=1; | |
| 3901 qadd=0; | |
| 1132 | 3902 if(rvlc){ |
| 3903 rl_vlc = rvlc_rl_inter.rl_vlc[0]; | |
| 3904 }else{ | |
| 3905 rl_vlc = rl_inter.rl_vlc[0]; | |
| 3906 } | |
| 591 | 3907 }else{ |
| 3908 qmul = s->qscale << 1; | |
| 3909 qadd = (s->qscale - 1) | 1; | |
| 1132 | 3910 if(rvlc){ |
| 3911 rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale]; | |
| 3912 }else{ | |
| 3913 rl_vlc = rl_inter.rl_vlc[s->qscale]; | |
| 3914 } | |
| 591 | 3915 } |
| 0 | 3916 } |
| 549 | 3917 { |
| 3918 OPEN_READER(re, &s->gb); | |
| 0 | 3919 for(;;) { |
| 549 | 3920 UPDATE_CACHE(re, &s->gb); |
| 3921 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2); | |
| 3922 if (level==0) { | |
| 1132 | 3923 /* escape */ |
| 3924 if(rvlc){ | |
| 3925 if(SHOW_UBITS(re, &s->gb, 1)==0){ | |
| 3926 fprintf(stderr, "1. marker bit missing in rvlc esc\n"); | |
| 3927 return -1; | |
| 3928 }; SKIP_CACHE(re, &s->gb, 1); | |
| 3929 | |
| 3930 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); | |
| 3931 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); | |
| 3932 SKIP_COUNTER(re, &s->gb, 1+1+6); | |
| 3933 UPDATE_CACHE(re, &s->gb); | |
| 3934 | |
| 3935 if(SHOW_UBITS(re, &s->gb, 1)==0){ | |
| 3936 fprintf(stderr, "2. marker bit missing in rvlc esc\n"); | |
| 3937 return -1; | |
| 3938 }; SKIP_CACHE(re, &s->gb, 1); | |
| 3939 | |
| 3940 level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11); | |
| 3941 | |
| 3942 if(SHOW_UBITS(re, &s->gb, 5)!=0x10){ | |
| 3943 fprintf(stderr, "reverse esc missing\n"); | |
| 3944 return -1; | |
| 3945 }; SKIP_CACHE(re, &s->gb, 5); | |
| 3946 | |
| 3947 level= level * qmul + qadd; | |
| 3948 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1); | |
| 3949 SKIP_COUNTER(re, &s->gb, 1+11+5+1); | |
| 3950 | |
| 3951 i+= run + 1; | |
|
1271
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3952 if(last) i+=192; |
| 1132 | 3953 }else{ |
| 549 | 3954 int cache; |
| 3955 cache= GET_CACHE(re, &s->gb); | |
|
1271
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3956 |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3957 if(IS_3IV1) |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3958 cache ^= 0xC0000000; |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3959 |
| 549 | 3960 if (cache&0x80000000) { |
| 3961 if (cache&0x40000000) { | |
| 0 | 3962 /* third escape */ |
| 549 | 3963 SKIP_CACHE(re, &s->gb, 2); |
| 3964 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); | |
| 3965 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); | |
| 3966 SKIP_COUNTER(re, &s->gb, 2+1+6); | |
| 3967 UPDATE_CACHE(re, &s->gb); | |
| 3968 | |
|
1271
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3969 if(IS_3IV1){ |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3970 level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12); |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3971 }else{ |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3972 if(SHOW_UBITS(re, &s->gb, 1)==0){ |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3973 fprintf(stderr, "1. marker bit missing in 3. esc\n"); |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3974 return -1; |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3975 }; SKIP_CACHE(re, &s->gb, 1); |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3976 |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3977 level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12); |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3978 |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3979 if(SHOW_UBITS(re, &s->gb, 1)==0){ |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3980 fprintf(stderr, "2. marker bit missing in 3. esc\n"); |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3981 return -1; |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3982 }; LAST_SKIP_CACHE(re, &s->gb, 1); |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3983 |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3984 SKIP_COUNTER(re, &s->gb, 1+12+1); |
|
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
3985 } |
| 549 | 3986 |
| 597 | 3987 if(level*s->qscale>1024 || level*s->qscale<-1024){ |
| 3988 fprintf(stderr, "|level| overflow in 3. esc, qp=%d\n", s->qscale); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3989 return -1; |
| 453 | 3990 } |
| 3991 #if 1 | |
| 3992 { | |
| 3993 const int abs_level= ABS(level); | |
| 921 | 3994 if(abs_level<=MAX_LEVEL && run<=MAX_RUN && !(s->workaround_bugs&FF_BUG_AC_VLC)){ |
| 498 | 3995 const int run1= run - rl->max_run[last][abs_level] - 1; |
| 453 | 3996 if(abs_level <= rl->max_level[last][run]){ |
| 3997 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n"); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3998 return -1; |
| 453 | 3999 } |
|
905
2b93dc762f9a
fixing illegal 3. esc bug (the mpeg4 std only requires encoders to use unescaped symbols but not esc1 or esc2 if they are shorter than esc3, andjust beause its logical to use the shortest possible vlc doesnt mean encoders do that)
michaelni
parents:
903
diff
changeset
|
4000 if(s->error_resilience > FF_ER_COMPLIANT){ |
|
2b93dc762f9a
fixing illegal 3. esc bug (the mpeg4 std only requires encoders to use unescaped symbols but not esc1 or esc2 if they are shorter than esc3, andjust beause its logical to use the shortest possible vlc doesnt mean encoders do that)
michaelni
parents:
903
diff
changeset
|
4001 if(abs_level <= rl->max_level[last][run]*2){ |
|
2b93dc762f9a
fixing illegal 3. esc bug (the mpeg4 std only requires encoders to use unescaped symbols but not esc1 or esc2 if they are shorter than esc3, andjust beause its logical to use the shortest possible vlc doesnt mean encoders do that)
michaelni
parents:
903
diff
changeset
|
4002 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n"); |
|
2b93dc762f9a
fixing illegal 3. esc bug (the mpeg4 std only requires encoders to use unescaped symbols but not esc1 or esc2 if they are shorter than esc3, andjust beause its logical to use the shortest possible vlc doesnt mean encoders do that)
michaelni
parents:
903
diff
changeset
|
4003 return -1; |
|
2b93dc762f9a
fixing illegal 3. esc bug (the mpeg4 std only requires encoders to use unescaped symbols but not esc1 or esc2 if they are shorter than esc3, andjust beause its logical to use the shortest possible vlc doesnt mean encoders do that)
michaelni
parents:
903
diff
changeset
|
4004 } |
|
2b93dc762f9a
fixing illegal 3. esc bug (the mpeg4 std only requires encoders to use unescaped symbols but not esc1 or esc2 if they are shorter than esc3, andjust beause its logical to use the shortest possible vlc doesnt mean encoders do that)
michaelni
parents:
903
diff
changeset
|
4005 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){ |
|
2b93dc762f9a
fixing illegal 3. esc bug (the mpeg4 std only requires encoders to use unescaped symbols but not esc1 or esc2 if they are shorter than esc3, andjust beause its logical to use the shortest possible vlc doesnt mean encoders do that)
michaelni
parents:
903
diff
changeset
|
4006 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n"); |
|
2b93dc762f9a
fixing illegal 3. esc bug (the mpeg4 std only requires encoders to use unescaped symbols but not esc1 or esc2 if they are shorter than esc3, andjust beause its logical to use the shortest possible vlc doesnt mean encoders do that)
michaelni
parents:
903
diff
changeset
|
4007 return -1; |
|
2b93dc762f9a
fixing illegal 3. esc bug (the mpeg4 std only requires encoders to use unescaped symbols but not esc1 or esc2 if they are shorter than esc3, andjust beause its logical to use the shortest possible vlc doesnt mean encoders do that)
michaelni
parents:
903
diff
changeset
|
4008 } |
| 453 | 4009 } |
| 4010 } | |
| 4011 } | |
| 4012 #endif | |
| 549 | 4013 if (level>0) level= level * qmul + qadd; |
| 4014 else level= level * qmul - qadd; | |
| 4015 | |
| 4016 i+= run + 1; | |
| 4017 if(last) i+=192; | |
| 0 | 4018 } else { |
| 4019 /* second escape */ | |
| 549 | 4020 #if MIN_CACHE_BITS < 20 |
| 4021 LAST_SKIP_BITS(re, &s->gb, 2); | |
| 4022 UPDATE_CACHE(re, &s->gb); | |
| 4023 #else | |
| 4024 SKIP_BITS(re, &s->gb, 2); | |
| 4025 #endif | |
| 4026 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2); | |
| 4027 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing | |
| 4028 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 4029 LAST_SKIP_BITS(re, &s->gb, 1); | |
| 0 | 4030 } |
| 4031 } else { | |
| 4032 /* first escape */ | |
| 549 | 4033 #if MIN_CACHE_BITS < 19 |
| 4034 LAST_SKIP_BITS(re, &s->gb, 1); | |
| 4035 UPDATE_CACHE(re, &s->gb); | |
| 4036 #else | |
| 4037 SKIP_BITS(re, &s->gb, 1); | |
| 4038 #endif | |
| 4039 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2); | |
| 4040 i+= run; | |
| 4041 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing | |
| 4042 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 4043 LAST_SKIP_BITS(re, &s->gb, 1); | |
| 0 | 4044 } |
| 1132 | 4045 } |
| 0 | 4046 } else { |
| 549 | 4047 i+= run; |
| 4048 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 4049 LAST_SKIP_BITS(re, &s->gb, 1); | |
| 0 | 4050 } |
| 549 | 4051 if (i > 62){ |
| 4052 i-= 192; | |
| 4053 if(i&(~63)){ | |
| 4054 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4055 return -1; |
| 549 | 4056 } |
| 4057 | |
| 4058 block[scan_table[i]] = level; | |
| 0 | 4059 break; |
| 549 | 4060 } |
| 4061 | |
| 4062 block[scan_table[i]] = level; | |
| 0 | 4063 } |
| 549 | 4064 CLOSE_READER(re, &s->gb); |
| 4065 } | |
| 0 | 4066 not_coded: |
| 4067 if (s->mb_intra) { | |
| 4068 mpeg4_pred_ac(s, block, n, dc_pred_dir); | |
| 4069 if (s->ac_pred) { | |
| 549 | 4070 i = 63; /* XXX: not optimal */ |
| 0 | 4071 } |
| 4072 } | |
| 549 | 4073 s->block_last_index[n] = i; |
| 0 | 4074 return 0; |
| 4075 } | |
| 4076 | |
| 4077 /* most is hardcoded. should extend to handle all h263 streams */ | |
| 4078 int h263_decode_picture_header(MpegEncContext *s) | |
| 4079 { | |
|
1278
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4080 int format, width, height, i; |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4081 uint32_t startcode; |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4082 |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4083 align_get_bits(&s->gb); |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4084 |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4085 startcode= get_bits(&s->gb, 22-8); |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4086 |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4087 for(i= s->gb.size_in_bits - get_bits_count(&s->gb); i>0; i--) { |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4088 startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF; |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4089 |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4090 if(startcode == 0x20) |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4091 break; |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4092 } |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4093 |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4094 if (startcode != 0x20) { |
| 355 | 4095 fprintf(stderr, "Bad picture start code\n"); |
| 0 | 4096 return -1; |
| 355 | 4097 } |
| 4098 /* temporal reference */ | |
| 231 | 4099 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */ |
| 355 | 4100 |
| 4101 /* PTYPE starts here */ | |
| 4102 if (get_bits1(&s->gb) != 1) { | |
| 4103 /* marker */ | |
| 4104 fprintf(stderr, "Bad marker\n"); | |
| 4105 return -1; | |
| 4106 } | |
| 4107 if (get_bits1(&s->gb) != 0) { | |
| 4108 fprintf(stderr, "Bad H263 id\n"); | |
| 0 | 4109 return -1; /* h263 id */ |
| 355 | 4110 } |
| 21 | 4111 skip_bits1(&s->gb); /* split screen off */ |
| 4112 skip_bits1(&s->gb); /* camera off */ | |
| 4113 skip_bits1(&s->gb); /* freeze picture release off */ | |
| 0 | 4114 |
|
155
3c3449bce692
- Bug fix on MV prediction for MPEG4 caused by new H.263 GOB code.
pulento
parents:
154
diff
changeset
|
4115 /* Reset GOB number */ |
|
154
f914f710b8d0
- Fixed a bug on H.263 MV prediction for MB on GOBs limits.
pulento
parents:
144
diff
changeset
|
4116 s->gob_number = 0; |
|
155
3c3449bce692
- Bug fix on MV prediction for MPEG4 caused by new H.263 GOB code.
pulento
parents:
154
diff
changeset
|
4117 |
| 0 | 4118 format = get_bits(&s->gb, 3); |
| 355 | 4119 /* |
| 4120 0 forbidden | |
| 4121 1 sub-QCIF | |
| 4122 10 QCIF | |
| 4123 7 extended PTYPE (PLUSPTYPE) | |
| 4124 */ | |
| 0 | 4125 |
| 161 | 4126 if (format != 7 && format != 6) { |
| 0 | 4127 s->h263_plus = 0; |
| 4128 /* H.263v1 */ | |
| 4129 width = h263_format[format][0]; | |
| 4130 height = h263_format[format][1]; | |
| 4131 if (!width) | |
| 4132 return -1; | |
| 161 | 4133 |
| 4134 s->width = width; | |
| 4135 s->height = height; | |
| 21 | 4136 s->pict_type = I_TYPE + get_bits1(&s->gb); |
| 0 | 4137 |
| 21 | 4138 s->unrestricted_mv = get_bits1(&s->gb); |
| 0 | 4139 s->h263_long_vectors = s->unrestricted_mv; |
| 4140 | |
| 355 | 4141 if (get_bits1(&s->gb) != 0) { |
| 4142 fprintf(stderr, "H263 SAC not supported\n"); | |
| 0 | 4143 return -1; /* SAC: off */ |
| 355 | 4144 } |
| 161 | 4145 if (get_bits1(&s->gb) != 0) { |
| 4146 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */ | |
| 4147 } | |
| 4148 | |
| 355 | 4149 if (get_bits1(&s->gb) != 0) { |
| 4150 fprintf(stderr, "H263 PB frame not supported\n"); | |
| 0 | 4151 return -1; /* not PB frame */ |
| 355 | 4152 } |
| 0 | 4153 s->qscale = get_bits(&s->gb, 5); |
| 21 | 4154 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */ |
| 0 | 4155 } else { |
| 161 | 4156 int ufep; |
| 4157 | |
| 0 | 4158 /* H.263v2 */ |
| 161 | 4159 s->h263_plus = 1; |
| 4160 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */ | |
| 355 | 4161 |
| 4162 /* ufep other than 0 and 1 are reserved */ | |
| 161 | 4163 if (ufep == 1) { |
| 4164 /* OPPTYPE */ | |
| 4165 format = get_bits(&s->gb, 3); | |
| 355 | 4166 dprintf("ufep=1, format: %d\n", format); |
| 161 | 4167 skip_bits(&s->gb,1); /* Custom PCF */ |
| 1089 | 4168 s->umvplus = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */ |
| 161 | 4169 skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */ |
| 4170 if (get_bits1(&s->gb) != 0) { | |
| 4171 s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */ | |
| 4172 } | |
|
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
4173 if (get_bits1(&s->gb) != 0) { /* Advanced Intra Coding (AIC) */ |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
4174 s->h263_aic = 1; |
|
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
4175 } |
| 355 | 4176 |
|
1278
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4177 if (get_bits1(&s->gb) != 0) { |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4178 fprintf(stderr, "Deblocking Filter not supported\n"); |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4179 } |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4180 if (get_bits1(&s->gb) != 0) { |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4181 fprintf(stderr, "Slice Structured not supported\n"); |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4182 } |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4183 if (get_bits1(&s->gb) != 0) { |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4184 fprintf(stderr, "Reference Picture Selection not supported\n"); |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4185 } |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4186 if (get_bits1(&s->gb) != 0) { |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4187 fprintf(stderr, "Independent Segment Decoding not supported\n"); |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4188 } |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4189 if (get_bits1(&s->gb) != 0) { |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4190 fprintf(stderr, "Alternative Inter VLC not supported\n"); |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4191 } |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4192 if (get_bits1(&s->gb) != 0) { |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4193 fprintf(stderr, "Modified Quantization not supported\n"); |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4194 } |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4195 |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4196 skip_bits(&s->gb, 1); /* Prevent start code emulation */ |
| 355 | 4197 |
| 161 | 4198 skip_bits(&s->gb, 3); /* Reserved */ |
| 355 | 4199 } else if (ufep != 0) { |
| 4200 fprintf(stderr, "Bad UFEP type (%d)\n", ufep); | |
| 0 | 4201 return -1; |
| 355 | 4202 } |
| 161 | 4203 |
| 78 | 4204 /* MPPTYPE */ |
| 355 | 4205 s->pict_type = get_bits(&s->gb, 3) + I_TYPE; |
| 4206 dprintf("pict_type: %d\n", s->pict_type); | |
| 0 | 4207 if (s->pict_type != I_TYPE && |
| 4208 s->pict_type != P_TYPE) | |
| 4209 return -1; | |
|
250
3449316664b5
- Bug fix on RTYPE (rounding type) not being honoured by H.263+ decoder.
pulento
parents:
249
diff
changeset
|
4210 skip_bits(&s->gb, 2); |
|
3449316664b5
- Bug fix on RTYPE (rounding type) not being honoured by H.263+ decoder.
pulento
parents:
249
diff
changeset
|
4211 s->no_rounding = get_bits1(&s->gb); |
| 355 | 4212 dprintf("RTYPE: %d\n", s->no_rounding); |
|
250
3449316664b5
- Bug fix on RTYPE (rounding type) not being honoured by H.263+ decoder.
pulento
parents:
249
diff
changeset
|
4213 skip_bits(&s->gb, 4); |
| 78 | 4214 |
| 4215 /* Get the picture dimensions */ | |
| 161 | 4216 if (ufep) { |
| 4217 if (format == 6) { | |
| 4218 /* Custom Picture Format (CPFMT) */ | |
| 355 | 4219 s->aspect_ratio_info = get_bits(&s->gb, 4); |
| 4220 dprintf("aspect: %d\n", s->aspect_ratio_info); | |
| 4221 /* aspect ratios: | |
| 4222 0 - forbidden | |
| 4223 1 - 1:1 | |
| 4224 2 - 12:11 (CIF 4:3) | |
| 4225 3 - 10:11 (525-type 4:3) | |
| 4226 4 - 16:11 (CIF 16:9) | |
| 4227 5 - 40:33 (525-type 16:9) | |
| 4228 6-14 - reserved | |
| 4229 */ | |
| 161 | 4230 width = (get_bits(&s->gb, 9) + 1) * 4; |
| 4231 skip_bits1(&s->gb); | |
| 4232 height = get_bits(&s->gb, 9) * 4; | |
| 355 | 4233 dprintf("\nH.263+ Custom picture: %dx%d\n",width,height); |
|
669
b4bddbde44f3
aspect (ext. par too) support for h263 and mpeg4 (inc. build becouse of new vars)
al3x
parents:
667
diff
changeset
|
4234 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) { |
| 355 | 4235 /* aspected dimensions */ |
|
669
b4bddbde44f3
aspect (ext. par too) support for h263 and mpeg4 (inc. build becouse of new vars)
al3x
parents:
667
diff
changeset
|
4236 s->aspected_width = get_bits(&s->gb, 8); |
|
b4bddbde44f3
aspect (ext. par too) support for h263 and mpeg4 (inc. build becouse of new vars)
al3x
parents:
667
diff
changeset
|
4237 s->aspected_height = get_bits(&s->gb, 8); |
| 887 | 4238 }else{ |
| 4239 s->aspected_width = pixel_aspect[s->aspect_ratio_info][0]; | |
| 4240 s->aspected_height= pixel_aspect[s->aspect_ratio_info][1]; | |
| 355 | 4241 } |
| 4242 } else { | |
| 161 | 4243 width = h263_format[format][0]; |
| 4244 height = h263_format[format][1]; | |
| 4245 } | |
| 4246 if ((width == 0) || (height == 0)) | |
| 4247 return -1; | |
| 4248 s->width = width; | |
| 4249 s->height = height; | |
| 1089 | 4250 if (s->umvplus) { |
| 4251 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */ | |
| 4252 skip_bits1(&s->gb); | |
| 161 | 4253 } |
| 78 | 4254 } |
| 4255 | |
| 0 | 4256 s->qscale = get_bits(&s->gb, 5); |
| 4257 } | |
| 4258 /* PEI */ | |
| 21 | 4259 while (get_bits1(&s->gb) != 0) { |
| 4260 skip_bits(&s->gb, 8); | |
| 0 | 4261 } |
| 4262 s->f_code = 1; | |
| 498 | 4263 |
| 4264 if(s->h263_aic){ | |
| 4265 s->y_dc_scale_table= | |
| 4266 s->c_dc_scale_table= h263_aic_dc_scale_table; | |
| 4267 }else{ | |
| 4268 s->y_dc_scale_table= | |
| 4269 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; | |
| 4270 } | |
| 4271 | |
|
1278
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4272 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4273 printf("qp:%d %c size:%d rnd:%d %s %s %s %s\n", |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4274 s->qscale, av_get_pict_type_char(s->pict_type), |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4275 s->gb.size_in_bits, 1-s->no_rounding, |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4276 s->mv_type == MV_TYPE_8X8 ? "ADV" : "", |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4277 s->umvplus ? "UMV" : "", |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4278 s->h263_long_vectors ? "LONG" : "", |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4279 s->h263_plus ? "+" : "" |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4280 ); |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4281 } |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4282 |
|
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4283 |
| 0 | 4284 return 0; |
| 4285 } | |
| 4286 | |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4287 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s) |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4288 { |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4289 int i; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4290 int a= 2<<s->sprite_warping_accuracy; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4291 int rho= 3-s->sprite_warping_accuracy; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4292 int r=16/a; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4293 const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4294 int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}}; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4295 int sprite_ref[4][2]; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4296 int virtual_ref[2][2]; |
| 753 | 4297 int w2, h2, w3, h3; |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4298 int alpha=0, beta=0; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4299 int w= s->width; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4300 int h= s->height; |
| 753 | 4301 int min_ab; |
| 4302 | |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4303 for(i=0; i<s->num_sprite_warping_points; i++){ |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4304 int length; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4305 int x=0, y=0; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4306 |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4307 length= get_vlc(&s->gb, &sprite_trajectory); |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4308 if(length){ |
|
1254
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1237
diff
changeset
|
4309 x= get_xbits(&s->gb, length); |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4310 } |
| 255 | 4311 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */ |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4312 |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4313 length= get_vlc(&s->gb, &sprite_trajectory); |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4314 if(length){ |
|
1254
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1237
diff
changeset
|
4315 y=get_xbits(&s->gb, length); |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4316 } |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4317 skip_bits1(&s->gb); /* marker bit */ |
| 255 | 4318 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy); |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4319 d[i][0]= x; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4320 d[i][1]= y; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4321 } |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4322 |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4323 while((1<<alpha)<w) alpha++; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4324 while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h' |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4325 w2= 1<<alpha; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4326 h2= 1<<beta; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4327 |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4328 // Note, the 4th point isnt used for GMC |
| 262 | 4329 if(s->divx_version==500 && s->divx_build==413){ |
| 4330 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0]; | |
| 4331 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1]; | |
| 4332 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0]; | |
| 4333 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1]; | |
| 4334 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0]; | |
| 4335 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1]; | |
| 4336 } else { | |
| 4337 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]); | |
| 4338 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]); | |
| 4339 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]); | |
| 4340 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]); | |
| 4341 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]); | |
| 4342 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]); | |
| 4343 } | |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4344 /* sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]); |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4345 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */ |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4346 |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4347 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...) |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4348 // perhaps it should be reordered to be more readable ... |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4349 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4350 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4351 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2) |
| 359 | 4352 + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + w2*(r*sprite_ref[1][0] - 16*vop_ref[1][0])),w); |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4353 virtual_ref[0][1]= 16*vop_ref[0][1] |
| 359 | 4354 + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + w2*(r*sprite_ref[1][1] - 16*vop_ref[1][1])),w); |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4355 virtual_ref[1][0]= 16*vop_ref[0][0] |
| 359 | 4356 + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + h2*(r*sprite_ref[2][0] - 16*vop_ref[2][0])),h); |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4357 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2) |
| 359 | 4358 + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + h2*(r*sprite_ref[2][1] - 16*vop_ref[2][1])),h); |
| 753 | 4359 |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4360 switch(s->num_sprite_warping_points) |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4361 { |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4362 case 0: |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4363 s->sprite_offset[0][0]= 0; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4364 s->sprite_offset[0][1]= 0; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4365 s->sprite_offset[1][0]= 0; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4366 s->sprite_offset[1][1]= 0; |
| 753 | 4367 s->sprite_delta[0][0]= a; |
| 4368 s->sprite_delta[0][1]= 0; | |
| 4369 s->sprite_delta[1][0]= 0; | |
| 4370 s->sprite_delta[1][1]= a; | |
| 4371 s->sprite_shift[0]= 0; | |
| 4372 s->sprite_shift[1]= 0; | |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4373 break; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4374 case 1: //GMC only |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4375 s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0]; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4376 s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1]; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4377 s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2); |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4378 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2); |
| 753 | 4379 s->sprite_delta[0][0]= a; |
| 4380 s->sprite_delta[0][1]= 0; | |
| 4381 s->sprite_delta[1][0]= 0; | |
| 4382 s->sprite_delta[1][1]= a; | |
| 4383 s->sprite_shift[0]= 0; | |
| 4384 s->sprite_shift[1]= 0; | |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4385 break; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4386 case 2: |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4387 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho)) |
| 753 | 4388 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0]) |
| 4389 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1]) | |
| 4390 + (1<<(alpha+rho-1)); | |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4391 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho)) |
| 753 | 4392 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0]) |
| 4393 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1]) | |
| 4394 + (1<<(alpha+rho-1)); | |
| 4395 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1) | |
| 4396 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1) | |
| 4397 +2*w2*r*sprite_ref[0][0] | |
| 4398 - 16*w2 | |
| 4399 + (1<<(alpha+rho+1))); | |
| 4400 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1) | |
| 4401 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1) | |
| 4402 +2*w2*r*sprite_ref[0][1] | |
| 4403 - 16*w2 | |
| 4404 + (1<<(alpha+rho+1))); | |
| 4405 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]); | |
| 4406 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]); | |
| 4407 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]); | |
| 4408 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]); | |
| 4409 | |
| 4410 s->sprite_shift[0]= alpha+rho; | |
| 4411 s->sprite_shift[1]= alpha+rho+2; | |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4412 break; |
| 753 | 4413 case 3: |
| 847 | 4414 min_ab= FFMIN(alpha, beta); |
| 753 | 4415 w3= w2>>min_ab; |
| 4416 h3= h2>>min_ab; | |
| 4417 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab)) | |
| 4418 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0]) | |
| 4419 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1]) | |
| 4420 + (1<<(alpha+beta+rho-min_ab-1)); | |
| 4421 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab)) | |
| 4422 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0]) | |
| 4423 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1]) | |
| 4424 + (1<<(alpha+beta+rho-min_ab-1)); | |
| 4425 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1) | |
| 4426 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1) | |
| 4427 + 2*w2*h3*r*sprite_ref[0][0] | |
| 4428 - 16*w2*h3 | |
| 4429 + (1<<(alpha+beta+rho-min_ab+1)); | |
| 4430 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1) | |
| 4431 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1) | |
| 4432 + 2*w2*h3*r*sprite_ref[0][1] | |
| 4433 - 16*w2*h3 | |
| 4434 + (1<<(alpha+beta+rho-min_ab+1)); | |
| 4435 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3; | |
| 4436 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3; | |
| 4437 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3; | |
| 4438 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3; | |
| 4439 | |
| 4440 s->sprite_shift[0]= alpha + beta + rho - min_ab; | |
| 4441 s->sprite_shift[1]= alpha + beta + rho - min_ab + 2; | |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4442 break; |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4443 } |
| 255 | 4444 /* try to simplify the situation */ |
| 753 | 4445 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0] |
| 4446 && s->sprite_delta[0][1] == 0 | |
| 4447 && s->sprite_delta[1][0] == 0 | |
| 4448 && s->sprite_delta[1][1] == a<<s->sprite_shift[0]) | |
| 255 | 4449 { |
| 753 | 4450 s->sprite_offset[0][0]>>=s->sprite_shift[0]; |
| 4451 s->sprite_offset[0][1]>>=s->sprite_shift[0]; | |
| 4452 s->sprite_offset[1][0]>>=s->sprite_shift[1]; | |
| 4453 s->sprite_offset[1][1]>>=s->sprite_shift[1]; | |
| 4454 s->sprite_delta[0][0]= a; | |
| 4455 s->sprite_delta[0][1]= 0; | |
| 4456 s->sprite_delta[1][0]= 0; | |
| 4457 s->sprite_delta[1][1]= a; | |
| 4458 s->sprite_shift[0]= 0; | |
| 4459 s->sprite_shift[1]= 0; | |
| 255 | 4460 s->real_sprite_warping_points=1; |
| 4461 } | |
| 753 | 4462 else{ |
| 4463 int shift_y= 16 - s->sprite_shift[0]; | |
| 4464 int shift_c= 16 - s->sprite_shift[1]; | |
| 4465 //printf("shifts %d %d\n", shift_y, shift_c); | |
| 4466 for(i=0; i<2; i++){ | |
| 4467 s->sprite_offset[0][i]<<= shift_y; | |
| 4468 s->sprite_offset[1][i]<<= shift_c; | |
| 4469 s->sprite_delta[0][i]<<= shift_y; | |
| 4470 s->sprite_delta[1][i]<<= shift_y; | |
| 4471 s->sprite_shift[i]= 16; | |
| 4472 } | |
| 255 | 4473 s->real_sprite_warping_points= s->num_sprite_warping_points; |
| 753 | 4474 } |
| 4475 #if 0 | |
| 4476 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%d\n", | |
| 4477 vop_ref[0][0], vop_ref[0][1], | |
| 4478 vop_ref[1][0], vop_ref[1][1], | |
| 4479 vop_ref[2][0], vop_ref[2][1], | |
| 4480 sprite_ref[0][0], sprite_ref[0][1], | |
| 4481 sprite_ref[1][0], sprite_ref[1][1], | |
| 4482 sprite_ref[2][0], sprite_ref[2][1], | |
| 4483 virtual_ref[0][0], virtual_ref[0][1], | |
| 4484 virtual_ref[1][0], virtual_ref[1][1] | |
| 4485 ); | |
| 4486 | |
| 4487 printf("offset: %d:%d , delta: %d %d %d %d, shift %d\n", | |
| 4488 s->sprite_offset[0][0], s->sprite_offset[0][1], | |
| 4489 s->sprite_delta[0][0], s->sprite_delta[0][1], | |
| 4490 s->sprite_delta[1][0], s->sprite_delta[1][1], | |
| 4491 s->sprite_shift[0] | |
| 4492 ); | |
| 4493 #endif | |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4494 } |
|
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4495 |
| 942 | 4496 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){ |
| 4497 int hours, minutes, seconds; | |
| 4498 | |
| 4499 hours= get_bits(gb, 5); | |
| 4500 minutes= get_bits(gb, 6); | |
| 4501 skip_bits1(gb); | |
| 4502 seconds= get_bits(gb, 6); | |
| 4503 | |
| 4504 s->time_base= seconds + 60*(minutes + 60*hours); | |
| 4505 | |
| 4506 skip_bits1(gb); | |
| 4507 skip_bits1(gb); | |
| 4508 | |
| 4509 return 0; | |
| 4510 } | |
| 4511 | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4512 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4513 int width, height, vo_ver_id; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4514 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4515 /* vol header */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4516 skip_bits(gb, 1); /* random access */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4517 s->vo_type= get_bits(gb, 8); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4518 if (get_bits1(gb) != 0) { /* is_ol_id */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4519 vo_ver_id = get_bits(gb, 4); /* vo_ver_id */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4520 skip_bits(gb, 3); /* vo_priority */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4521 } else { |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4522 vo_ver_id = 1; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4523 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4524 //printf("vo type:%d\n",s->vo_type); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4525 s->aspect_ratio_info= get_bits(gb, 4); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4526 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4527 s->aspected_width = get_bits(gb, 8); // par_width |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4528 s->aspected_height = get_bits(gb, 8); // par_height |
| 887 | 4529 }else{ |
| 4530 s->aspected_width = pixel_aspect[s->aspect_ratio_info][0]; | |
| 4531 s->aspected_height= pixel_aspect[s->aspect_ratio_info][1]; | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4532 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4533 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4534 if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4535 int chroma_format= get_bits(gb, 2); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4536 if(chroma_format!=1){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4537 printf("illegal chroma format\n"); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4538 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4539 s->low_delay= get_bits1(gb); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4540 if(get_bits1(gb)){ /* vbv parameters */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4541 get_bits(gb, 15); /* first_half_bitrate */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4542 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4543 get_bits(gb, 15); /* latter_half_bitrate */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4544 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4545 get_bits(gb, 15); /* first_half_vbv_buffer_size */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4546 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4547 get_bits(gb, 3); /* latter_half_vbv_buffer_size */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4548 get_bits(gb, 11); /* first_half_vbv_occupancy */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4549 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4550 get_bits(gb, 15); /* latter_half_vbv_occupancy */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4551 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4552 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4553 }else{ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4554 // set low delay flag only once so the smart? low delay detection wont be overriden |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4555 if(s->picture_number==0) |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4556 s->low_delay=0; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4557 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4558 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4559 s->shape = get_bits(gb, 2); /* vol shape */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4560 if(s->shape != RECT_SHAPE) printf("only rectangular vol supported\n"); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4561 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4562 printf("Gray shape not supported\n"); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4563 skip_bits(gb, 4); //video_object_layer_shape_extension |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4564 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4565 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4566 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4567 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4568 s->time_increment_resolution = get_bits(gb, 16); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4569 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4570 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4571 if (s->time_increment_bits < 1) |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4572 s->time_increment_bits = 1; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4573 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4574 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4575 if (get_bits1(gb) != 0) { /* fixed_vop_rate */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4576 skip_bits(gb, s->time_increment_bits); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4577 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4578 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4579 if (s->shape != BIN_ONLY_SHAPE) { |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4580 if (s->shape == RECT_SHAPE) { |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4581 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4582 width = get_bits(gb, 13); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4583 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4584 height = get_bits(gb, 13); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4585 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4586 if(width && height){ /* they should be non zero but who knows ... */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4587 s->width = width; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4588 s->height = height; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4589 // printf("width/height: %d %d\n", width, height); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4590 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4591 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4592 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4593 s->progressive_sequence= get_bits1(gb)^1; |
| 1237 | 4594 if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO)) |
| 4595 printf("OBMC not supported (very likely buggy encoder)\n"); /* OBMC Disable */ | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4596 if (vo_ver_id == 1) { |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4597 s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4598 } else { |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4599 s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4600 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4601 if(s->vol_sprite_usage==STATIC_SPRITE) printf("Static Sprites not supported\n"); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4602 if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4603 if(s->vol_sprite_usage==STATIC_SPRITE){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4604 s->sprite_width = get_bits(gb, 13); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4605 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4606 s->sprite_height= get_bits(gb, 13); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4607 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4608 s->sprite_left = get_bits(gb, 13); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4609 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4610 s->sprite_top = get_bits(gb, 13); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4611 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4612 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4613 s->num_sprite_warping_points= get_bits(gb, 6); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4614 s->sprite_warping_accuracy = get_bits(gb, 2); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4615 s->sprite_brightness_change= get_bits1(gb); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4616 if(s->vol_sprite_usage==STATIC_SPRITE) |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4617 s->low_latency_sprite= get_bits1(gb); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4618 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4619 // FIXME sadct disable bit if verid!=1 && shape not rect |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4620 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4621 if (get_bits1(gb) == 1) { /* not_8_bit */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4622 s->quant_precision = get_bits(gb, 4); /* quant_precision */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4623 if(get_bits(gb, 4)!=8) printf("N-bit not supported\n"); /* bits_per_pixel */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4624 if(s->quant_precision!=5) printf("quant precission %d\n", s->quant_precision); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4625 } else { |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4626 s->quant_precision = 5; |
| 0 | 4627 } |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4628 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4629 // FIXME a bunch of grayscale shape things |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4630 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4631 if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */ |
| 1057 | 4632 int i, v; |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4633 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4634 /* load default matrixes */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4635 for(i=0; i<64; i++){ |
| 1092 | 4636 int j= s->dsp.idct_permutation[i]; |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4637 v= ff_mpeg4_default_intra_matrix[i]; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4638 s->intra_matrix[j]= v; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4639 s->chroma_intra_matrix[j]= v; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4640 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4641 v= ff_mpeg4_default_non_intra_matrix[i]; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4642 s->inter_matrix[j]= v; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4643 s->chroma_inter_matrix[j]= v; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4644 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4645 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4646 /* load custom intra matrix */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4647 if(get_bits1(gb)){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4648 int last=0; |
| 1057 | 4649 for(i=0; i<64; i++){ |
| 4650 int j; | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4651 v= get_bits(gb, 8); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4652 if(v==0) break; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4653 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4654 last= v; |
| 1092 | 4655 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4656 s->intra_matrix[j]= v; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4657 s->chroma_intra_matrix[j]= v; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4658 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4659 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4660 /* replicate last value */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4661 for(; i<64; i++){ |
| 1092 | 4662 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4663 s->intra_matrix[j]= v; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4664 s->chroma_intra_matrix[j]= v; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4665 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4666 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4667 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4668 /* load custom non intra matrix */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4669 if(get_bits1(gb)){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4670 int last=0; |
| 1057 | 4671 for(i=0; i<64; i++){ |
| 4672 int j; | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4673 v= get_bits(gb, 8); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4674 if(v==0) break; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4675 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4676 last= v; |
| 1092 | 4677 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4678 s->inter_matrix[j]= v; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4679 s->chroma_inter_matrix[j]= v; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4680 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4681 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4682 /* replicate last value */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4683 for(; i<64; i++){ |
| 1092 | 4684 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4685 s->inter_matrix[j]= last; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4686 s->chroma_inter_matrix[j]= last; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4687 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4688 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4689 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4690 // FIXME a bunch of grayscale shape things |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4691 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4692 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4693 if(vo_ver_id != 1) |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4694 s->quarter_sample= get_bits1(gb); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4695 else s->quarter_sample=0; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4696 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4697 if(!get_bits1(gb)) printf("Complexity estimation not supported\n"); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4698 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4699 s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4700 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4701 s->data_partitioning= get_bits1(gb); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4702 if(s->data_partitioning){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4703 s->rvlc= get_bits1(gb); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4704 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4705 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4706 if(vo_ver_id != 1) { |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4707 s->new_pred= get_bits1(gb); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4708 if(s->new_pred){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4709 printf("new pred not supported\n"); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4710 skip_bits(gb, 2); /* requested upstream message type */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4711 skip_bits1(gb); /* newpred segment type */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4712 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4713 s->reduced_res_vop= get_bits1(gb); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4714 if(s->reduced_res_vop) printf("reduced resolution VOP not supported\n"); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4715 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4716 else{ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4717 s->new_pred=0; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4718 s->reduced_res_vop= 0; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4719 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4720 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4721 s->scalability= get_bits1(gb); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4722 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4723 if (s->scalability) { |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4724 GetBitContext bak= *gb; |
| 751 | 4725 int ref_layer_id; |
| 4726 int ref_layer_sampling_dir; | |
| 4727 int h_sampling_factor_n; | |
| 4728 int h_sampling_factor_m; | |
| 4729 int v_sampling_factor_n; | |
| 4730 int v_sampling_factor_m; | |
| 4731 | |
| 4732 s->hierachy_type= get_bits1(gb); | |
| 4733 ref_layer_id= get_bits(gb, 4); | |
| 4734 ref_layer_sampling_dir= get_bits1(gb); | |
| 4735 h_sampling_factor_n= get_bits(gb, 5); | |
| 4736 h_sampling_factor_m= get_bits(gb, 5); | |
| 4737 v_sampling_factor_n= get_bits(gb, 5); | |
| 4738 v_sampling_factor_m= get_bits(gb, 5); | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4739 s->enhancement_type= get_bits1(gb); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4740 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4741 if( h_sampling_factor_n==0 || h_sampling_factor_m==0 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4742 || v_sampling_factor_n==0 || v_sampling_factor_m==0){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4743 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4744 // fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaround\n"); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4745 s->scalability=0; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4746 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4747 *gb= bak; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4748 }else |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4749 printf("scalability not supported\n"); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4750 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4751 // bin shape stuff FIXME |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4752 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4753 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4754 return 0; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4755 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4756 |
| 1034 | 4757 /** |
| 4758 * decodes the user data stuff in the header. | |
| 4759 * allso inits divx/xvid/lavc_version/build | |
| 4760 */ | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4761 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4762 char buf[256]; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4763 int i; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4764 int e; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4765 int ver, build, ver2, ver3; |
|
1145
79e8ed620b17
better non conformant divx packed bitstream detection, so unpacked (no b frames) divx MPEG4-ES streams can be read
michaelni
parents:
1144
diff
changeset
|
4766 char last; |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4767 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4768 buf[0]= show_bits(gb, 8); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4769 for(i=1; i<256; i++){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4770 buf[i]= show_bits(gb, 16)&0xFF; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4771 if(buf[i]==0) break; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4772 skip_bits(gb, 8); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4773 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4774 buf[255]=0; |
|
1145
79e8ed620b17
better non conformant divx packed bitstream detection, so unpacked (no b frames) divx MPEG4-ES streams can be read
michaelni
parents:
1144
diff
changeset
|
4775 |
| 761 | 4776 /* divx detection */ |
|
1145
79e8ed620b17
better non conformant divx packed bitstream detection, so unpacked (no b frames) divx MPEG4-ES streams can be read
michaelni
parents:
1144
diff
changeset
|
4777 e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last); |
|
79e8ed620b17
better non conformant divx packed bitstream detection, so unpacked (no b frames) divx MPEG4-ES streams can be read
michaelni
parents:
1144
diff
changeset
|
4778 if(e<2) |
|
79e8ed620b17
better non conformant divx packed bitstream detection, so unpacked (no b frames) divx MPEG4-ES streams can be read
michaelni
parents:
1144
diff
changeset
|
4779 e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last); |
|
79e8ed620b17
better non conformant divx packed bitstream detection, so unpacked (no b frames) divx MPEG4-ES streams can be read
michaelni
parents:
1144
diff
changeset
|
4780 if(e>=2){ |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4781 s->divx_version= ver; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4782 s->divx_build= build; |
|
1145
79e8ed620b17
better non conformant divx packed bitstream detection, so unpacked (no b frames) divx MPEG4-ES streams can be read
michaelni
parents:
1144
diff
changeset
|
4783 s->divx_packed= e==3 && last=='p'; |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4784 if(s->picture_number==0){ |
|
1145
79e8ed620b17
better non conformant divx packed bitstream detection, so unpacked (no b frames) divx MPEG4-ES streams can be read
michaelni
parents:
1144
diff
changeset
|
4785 printf("This file was encoded with DivX%d Build%d", ver, build); |
|
79e8ed620b17
better non conformant divx packed bitstream detection, so unpacked (no b frames) divx MPEG4-ES streams can be read
michaelni
parents:
1144
diff
changeset
|
4786 if(s->divx_packed) |
|
79e8ed620b17
better non conformant divx packed bitstream detection, so unpacked (no b frames) divx MPEG4-ES streams can be read
michaelni
parents:
1144
diff
changeset
|
4787 printf("p\n"); |
|
79e8ed620b17
better non conformant divx packed bitstream detection, so unpacked (no b frames) divx MPEG4-ES streams can be read
michaelni
parents:
1144
diff
changeset
|
4788 else |
|
79e8ed620b17
better non conformant divx packed bitstream detection, so unpacked (no b frames) divx MPEG4-ES streams can be read
michaelni
parents:
1144
diff
changeset
|
4789 printf("\n"); |
| 263 | 4790 } |
| 0 | 4791 } |
| 761 | 4792 |
| 4793 /* ffmpeg detection */ | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4794 e=sscanf(buf, "FFmpeg%d.%d.%db%d", &ver, &ver2, &ver3, &build); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4795 if(e!=4) |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4796 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4797 if(e!=4){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4798 if(strcmp(buf, "ffmpeg")==0){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4799 s->ffmpeg_version= 0x000406; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4800 s->lavc_build= 4600; |
| 63 | 4801 } |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4802 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4803 if(e==4){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4804 s->ffmpeg_version= ver*256*256 + ver2*256 + ver3; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4805 s->lavc_build= build; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4806 if(s->picture_number==0) |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4807 printf("This file was encoded with libavcodec build %d\n", build); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4808 } |
| 761 | 4809 |
| 4810 /* xvid detection */ | |
| 4811 e=sscanf(buf, "XviD%d", &build); | |
| 4812 if(e==1){ | |
| 4813 s->xvid_build= build; | |
| 4814 if(s->picture_number==0) | |
| 4815 printf("This file was encoded with XviD build %d\n", build); | |
| 4816 } | |
| 4817 | |
| 255 | 4818 //printf("User Data: %s\n", buf); |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4819 return 0; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4820 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4821 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4822 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4823 int time_incr, time_increment; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4824 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4825 s->pict_type = get_bits(gb, 2) + I_TYPE; /* pict type: I = 0 , P = 1 */ |
| 1346 | 4826 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){ |
|
365
fdeec2834c79
there are divx5? encoded files without a userdata section but with b-frames :(
michaelni
parents:
364
diff
changeset
|
4827 printf("low_delay flag set, but shouldnt, clearing it\n"); |
|
fdeec2834c79
there are divx5? encoded files without a userdata section but with b-frames :(
michaelni
parents:
364
diff
changeset
|
4828 s->low_delay=0; |
|
fdeec2834c79
there are divx5? encoded files without a userdata section but with b-frames :(
michaelni
parents:
364
diff
changeset
|
4829 } |
| 753 | 4830 |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4831 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4832 if(s->partitioned_frame) |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4833 s->decode_mb= mpeg4_decode_partitioned_mb; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4834 else |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4835 s->decode_mb= ff_h263_decode_mb; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4836 |
|
662
5a158f0d1981
fixing 1/0 if the headers are incomplete (like what M$ encoder generates)
michaelni
parents:
661
diff
changeset
|
4837 if(s->time_increment_resolution==0){ |
|
5a158f0d1981
fixing 1/0 if the headers are incomplete (like what M$ encoder generates)
michaelni
parents:
661
diff
changeset
|
4838 s->time_increment_resolution=1; |
|
5a158f0d1981
fixing 1/0 if the headers are incomplete (like what M$ encoder generates)
michaelni
parents:
661
diff
changeset
|
4839 // fprintf(stderr, "time_increment_resolution is illegal\n"); |
|
5a158f0d1981
fixing 1/0 if the headers are incomplete (like what M$ encoder generates)
michaelni
parents:
661
diff
changeset
|
4840 } |
| 262 | 4841 time_incr=0; |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4842 while (get_bits1(gb) != 0) |
| 0 | 4843 time_incr++; |
| 4844 | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4845 check_marker(gb, "before time_increment"); |
| 1068 | 4846 |
| 4847 if(s->picture_number==0 && (show_bits(gb, s->time_increment_bits+1)&1)==0){ | |
| 4848 printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n"); | |
| 4849 | |
| 4850 | |
| 4851 for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){ | |
| 4852 if(show_bits(gb, s->time_increment_bits+1)&1) break; | |
| 4853 } | |
| 4854 printf("my guess is %d bits ;)\n",s->time_increment_bits); | |
| 4855 } | |
| 4856 | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4857 time_increment= get_bits(gb, s->time_increment_bits); |
| 697 | 4858 //printf(" type:%d modulo_time_base:%d increment:%d\n", s->pict_type, time_incr, time_increment); |
| 262 | 4859 if(s->pict_type!=B_TYPE){ |
| 324 | 4860 s->last_time_base= s->time_base; |
| 262 | 4861 s->time_base+= time_incr; |
| 324 | 4862 s->time= s->time_base*s->time_increment_resolution + time_increment; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4863 if(s->workaround_bugs&FF_BUG_UMP4){ |
|
700
0fb4c66527e1
autodetect UMP4 (by adding a fourcc field to AVCodecContext)
michaelni
parents:
699
diff
changeset
|
4864 if(s->time < s->last_non_b_time){ |
|
0fb4c66527e1
autodetect UMP4 (by adding a fourcc field to AVCodecContext)
michaelni
parents:
699
diff
changeset
|
4865 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n"); |
|
0fb4c66527e1
autodetect UMP4 (by adding a fourcc field to AVCodecContext)
michaelni
parents:
699
diff
changeset
|
4866 s->time_base++; |
|
0fb4c66527e1
autodetect UMP4 (by adding a fourcc field to AVCodecContext)
michaelni
parents:
699
diff
changeset
|
4867 s->time+= s->time_increment_resolution; |
|
0fb4c66527e1
autodetect UMP4 (by adding a fourcc field to AVCodecContext)
michaelni
parents:
699
diff
changeset
|
4868 } |
| 664 | 4869 } |
| 324 | 4870 s->pp_time= s->time - s->last_non_b_time; |
| 4871 s->last_non_b_time= s->time; | |
| 262 | 4872 }else{ |
| 324 | 4873 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment; |
| 664 | 4874 s->pb_time= s->pp_time - (s->last_non_b_time - s->time); |
| 4875 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){ | |
| 335 | 4876 // printf("messed up order, seeking?, skiping current b frame\n"); |
| 4877 return FRAME_SKIPED; | |
| 4878 } | |
| 664 | 4879 |
| 4880 if(s->t_frame==0) s->t_frame= s->time - s->last_time_base; | |
| 4881 if(s->t_frame==0) s->t_frame=1; // 1/0 protection | |
| 4882 //printf("%Ld %Ld %d %d\n", s->last_non_b_time, s->time, s->pp_time, s->t_frame); fflush(stdout); | |
| 4883 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame) | |
| 4884 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2; | |
| 4885 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame) | |
| 4886 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2; | |
| 262 | 4887 } |
| 654 | 4888 |
| 903 | 4889 s->current_picture.pts= s->time*1000LL*1000LL / s->time_increment_resolution; |
| 942 | 4890 if(s->avctx->debug&FF_DEBUG_PTS) |
| 4891 printf("MPEG4 PTS: %f\n", s->current_picture.pts/(1000.0*1000.0)); | |
| 654 | 4892 |
| 1068 | 4893 check_marker(gb, "before vop_coded"); |
| 4894 | |
| 0 | 4895 /* vop coded */ |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4896 if (get_bits1(gb) != 1){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4897 printf("vop not coded\n"); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4898 return FRAME_SKIPED; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4899 } |
| 664 | 4900 //printf("time %d %d %d || %Ld %Ld %Ld\n", s->time_increment_bits, s->time_increment_resolution, s->time_base, |
| 4901 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time); | |
|
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4902 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE |
|
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4903 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) { |
| 0 | 4904 /* rounding type for motion estimation */ |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4905 s->no_rounding = get_bits1(gb); |
| 63 | 4906 } else { |
| 4907 s->no_rounding = 0; | |
| 0 | 4908 } |
|
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4909 //FIXME reduced res stuff |
|
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4910 |
|
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4911 if (s->shape != RECT_SHAPE) { |
| 63 | 4912 if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) { |
| 4913 int width, height, hor_spat_ref, ver_spat_ref; | |
| 4914 | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4915 width = get_bits(gb, 13); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4916 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4917 height = get_bits(gb, 13); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4918 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4919 hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4920 skip_bits1(gb); /* marker */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4921 ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */ |
| 63 | 4922 } |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4923 skip_bits1(gb); /* change_CR_disable */ |
| 63 | 4924 |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4925 if (get_bits1(gb) != 0) { |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4926 skip_bits(gb, 8); /* constant_alpha_value */ |
| 63 | 4927 } |
| 4928 } | |
|
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4929 //FIXME complexity estimation stuff |
|
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4930 |
|
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4931 if (s->shape != BIN_ONLY_SHAPE) { |
| 290 | 4932 int t; |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4933 t=get_bits(gb, 3); /* intra dc VLC threshold */ |
| 290 | 4934 //printf("threshold %d\n", t); |
|
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4935 if(!s->progressive_sequence){ |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4936 s->top_field_first= get_bits1(gb); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4937 s->alternate_scan= get_bits1(gb); |
| 661 | 4938 }else |
| 4939 s->alternate_scan= 0; | |
|
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4940 } |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4941 |
| 718 | 4942 if(s->alternate_scan){ |
| 1273 | 4943 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan); |
| 4944 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan); | |
| 4945 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan); | |
| 4946 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); | |
| 718 | 4947 } else{ |
| 1273 | 4948 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct); |
| 4949 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct); | |
| 4950 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan); | |
| 4951 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); | |
| 718 | 4952 } |
| 4953 | |
|
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4954 if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){ |
| 821 | 4955 mpeg4_decode_sprite_trajectory(s); |
|
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4956 if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n"); |
|
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4957 if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n"); |
|
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4958 } |
|
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
4959 |
|
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4960 if (s->shape != BIN_ONLY_SHAPE) { |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4961 s->qscale = get_bits(gb, s->quant_precision); |
|
264
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
263
diff
changeset
|
4962 if(s->qscale==0){ |
|
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
263
diff
changeset
|
4963 printf("Error, header damaged or not MPEG4 header (qscale=0)\n"); |
|
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
263
diff
changeset
|
4964 return -1; // makes no sense to continue, as there is nothing left from the image then |
|
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
263
diff
changeset
|
4965 } |
| 63 | 4966 |
| 4967 if (s->pict_type != I_TYPE) { | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4968 s->f_code = get_bits(gb, 3); /* fcode_for */ |
|
264
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
263
diff
changeset
|
4969 if(s->f_code==0){ |
|
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
263
diff
changeset
|
4970 printf("Error, header damaged or not MPEG4 header (f_code=0)\n"); |
|
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
263
diff
changeset
|
4971 return -1; // makes no sense to continue, as the MV decoding will break very quickly |
|
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
263
diff
changeset
|
4972 } |
|
582
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
4973 }else |
|
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
4974 s->f_code=1; |
|
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
4975 |
|
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4976 if (s->pict_type == B_TYPE) { |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4977 s->b_code = get_bits(gb, 3); |
|
582
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
4978 }else |
|
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
4979 s->b_code=1; |
| 906 | 4980 |
| 4981 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ | |
|
1271
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
4982 printf("qp:%d fc:%d,%d %s size:%d pro:%d alt:%d top:%d %spel part:%d resync:%d w:%d a:%d rnd:%d\n", |
| 906 | 4983 s->qscale, s->f_code, s->b_code, |
| 4984 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")), | |
|
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1013
diff
changeset
|
4985 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first, |
| 930 | 4986 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points, |
|
1271
42ea05e4a391
improving 3IV1 support (still far from perfect) note, disabled as it requires some checks in the inner loops which would slow things down a tiny bit
michaelni
parents:
1261
diff
changeset
|
4987 s->sprite_warping_accuracy, 1-s->no_rounding); |
| 906 | 4988 } |
| 4989 | |
|
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4990 if(!s->scalability){ |
|
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4991 if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) { |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4992 skip_bits1(gb); // vop shape coding type |
|
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
4993 } |
| 575 | 4994 }else{ |
| 4995 if(s->enhancement_type){ | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
4996 int load_backward_shape= get_bits1(gb); |
| 575 | 4997 if(load_backward_shape){ |
| 4998 printf("load backward shape isnt supported\n"); | |
| 4999 } | |
| 5000 } | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5001 skip_bits(gb, 2); //ref_select_code |
| 63 | 5002 } |
| 5003 } | |
|
346
c2f789fe4945
detecting xvid/divx4/opendivx and set low_delay flag
michaelni
parents:
344
diff
changeset
|
5004 /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/ |
|
c2f789fe4945
detecting xvid/divx4/opendivx and set low_delay flag
michaelni
parents:
344
diff
changeset
|
5005 // note we cannot detect divx5 without b-frames easyly (allthough its buggy too) |
|
365
fdeec2834c79
there are divx5? encoded files without a userdata section but with b-frames :(
michaelni
parents:
364
diff
changeset
|
5006 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){ |
|
fdeec2834c79
there are divx5? encoded files without a userdata section but with b-frames :(
michaelni
parents:
364
diff
changeset
|
5007 printf("looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n"); |
|
346
c2f789fe4945
detecting xvid/divx4/opendivx and set low_delay flag
michaelni
parents:
344
diff
changeset
|
5008 s->low_delay=1; |
|
c2f789fe4945
detecting xvid/divx4/opendivx and set low_delay flag
michaelni
parents:
344
diff
changeset
|
5009 } |
|
c2f789fe4945
detecting xvid/divx4/opendivx and set low_delay flag
michaelni
parents:
344
diff
changeset
|
5010 |
| 255 | 5011 s->picture_number++; // better than pic number==0 allways ;) |
|
346
c2f789fe4945
detecting xvid/divx4/opendivx and set low_delay flag
michaelni
parents:
344
diff
changeset
|
5012 |
| 498 | 5013 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support |
| 5014 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table; | |
| 5015 | |
| 1137 | 5016 if(!(s->workaround_bugs&FF_BUG_EDGE)){ |
|
582
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
5017 s->h_edge_pos= s->width; |
|
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
5018 s->v_edge_pos= s->height; |
|
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
5019 } |
| 63 | 5020 return 0; |
| 0 | 5021 } |
| 5022 | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5023 /** |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5024 * decode mpeg4 headers |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5025 * @return <0 if no VOP found (or a damaged one) |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5026 * FRAME_SKIPPED if a not coded VOP is found |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5027 * 0 if a VOP is found |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5028 */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5029 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb) |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5030 { |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5031 int startcode, v; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5032 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5033 /* search next start code */ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5034 align_get_bits(gb); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5035 startcode = 0xff; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5036 for(;;) { |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5037 v = get_bits(gb, 8); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5038 startcode = ((startcode << 8) | v) & 0xffffffff; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5039 |
|
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1013
diff
changeset
|
5040 if(get_bits_count(gb) >= gb->size_in_bits){ |
|
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1013
diff
changeset
|
5041 if(gb->size_in_bits==8 && s->divx_version){ |
|
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
1013
diff
changeset
|
5042 printf("frame skip %d\n", gb->size_in_bits); |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5043 return FRAME_SKIPED; //divx bug |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5044 }else |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5045 return -1; //end of stream |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5046 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5047 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5048 if((startcode&0xFFFFFF00) != 0x100) |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5049 continue; //no startcode |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5050 |
| 942 | 5051 if(s->avctx->debug&FF_DEBUG_STARTCODE){ |
| 5052 printf("startcode: %3X ", startcode); | |
| 5053 if (startcode<=0x11F) printf("Video Object Start"); | |
| 5054 else if(startcode<=0x12F) printf("Video Object Layer Start"); | |
| 5055 else if(startcode<=0x13F) printf("Reserved"); | |
| 5056 else if(startcode<=0x15F) printf("FGS bp start"); | |
| 5057 else if(startcode<=0x1AF) printf("Reserved"); | |
| 5058 else if(startcode==0x1B0) printf("Visual Object Seq Start"); | |
| 5059 else if(startcode==0x1B1) printf("Visual Object Seq End"); | |
| 5060 else if(startcode==0x1B2) printf("User Data"); | |
| 5061 else if(startcode==0x1B3) printf("Group of VOP start"); | |
| 5062 else if(startcode==0x1B4) printf("Video Session Error"); | |
| 5063 else if(startcode==0x1B5) printf("Visual Object Start"); | |
| 5064 else if(startcode==0x1B6) printf("Video Object Plane start"); | |
| 5065 else if(startcode==0x1B7) printf("slice start"); | |
| 5066 else if(startcode==0x1B8) printf("extension start"); | |
| 5067 else if(startcode==0x1B9) printf("fgs start"); | |
| 5068 else if(startcode==0x1BA) printf("FBA Object start"); | |
| 5069 else if(startcode==0x1BB) printf("FBA Object Plane start"); | |
| 5070 else if(startcode==0x1BC) printf("Mesh Object start"); | |
| 5071 else if(startcode==0x1BD) printf("Mesh Object Plane start"); | |
| 5072 else if(startcode==0x1BE) printf("Still Textutre Object start"); | |
| 5073 else if(startcode==0x1BF) printf("Textutre Spatial Layer start"); | |
| 5074 else if(startcode==0x1C0) printf("Textutre SNR Layer start"); | |
| 5075 else if(startcode==0x1C1) printf("Textutre Tile start"); | |
| 5076 else if(startcode==0x1C2) printf("Textutre Shape Layer start"); | |
| 5077 else if(startcode==0x1C3) printf("stuffing start"); | |
| 5078 else if(startcode<=0x1C5) printf("reserved"); | |
| 5079 else if(startcode<=0x1FF) printf("System start"); | |
| 5080 printf(" at %d\n", get_bits_count(gb)); | |
| 5081 } | |
| 5082 | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5083 switch(startcode){ |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5084 case 0x120: |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5085 decode_vol_header(s, gb); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5086 break; |
| 942 | 5087 case USER_DATA_STARTCODE: |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5088 decode_user_data(s, gb); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5089 break; |
| 942 | 5090 case GOP_STARTCODE: |
| 5091 mpeg4_decode_gop_header(s, gb); | |
| 5092 break; | |
| 5093 case VOP_STARTCODE: | |
|
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5094 return decode_vop_header(s, gb); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5095 default: |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5096 break; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5097 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5098 |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5099 align_get_bits(gb); |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5100 startcode = 0xff; |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5101 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5102 } |
|
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5103 |
| 0 | 5104 /* don't understand why they choose a different header ! */ |
| 5105 int intel_h263_decode_picture_header(MpegEncContext *s) | |
| 5106 { | |
| 5107 int format; | |
| 5108 | |
| 5109 /* picture header */ | |
| 1257 | 5110 if (get_bits_long(&s->gb, 22) != 0x20) { |
| 355 | 5111 fprintf(stderr, "Bad picture start code\n"); |
| 0 | 5112 return -1; |
| 355 | 5113 } |
| 5114 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */ | |
| 0 | 5115 |
| 355 | 5116 if (get_bits1(&s->gb) != 1) { |
| 5117 fprintf(stderr, "Bad marker\n"); | |
| 0 | 5118 return -1; /* marker */ |
| 355 | 5119 } |
| 5120 if (get_bits1(&s->gb) != 0) { | |
| 5121 fprintf(stderr, "Bad H263 id\n"); | |
| 0 | 5122 return -1; /* h263 id */ |
| 355 | 5123 } |
| 21 | 5124 skip_bits1(&s->gb); /* split screen off */ |
| 5125 skip_bits1(&s->gb); /* camera off */ | |
| 5126 skip_bits1(&s->gb); /* freeze picture release off */ | |
| 0 | 5127 |
| 5128 format = get_bits(&s->gb, 3); | |
| 355 | 5129 if (format != 7) { |
| 5130 fprintf(stderr, "Intel H263 free format not supported\n"); | |
| 0 | 5131 return -1; |
| 355 | 5132 } |
| 0 | 5133 s->h263_plus = 0; |
| 5134 | |
| 21 | 5135 s->pict_type = I_TYPE + get_bits1(&s->gb); |
| 0 | 5136 |
| 21 | 5137 s->unrestricted_mv = get_bits1(&s->gb); |
| 0 | 5138 s->h263_long_vectors = s->unrestricted_mv; |
| 5139 | |
| 355 | 5140 if (get_bits1(&s->gb) != 0) { |
| 5141 fprintf(stderr, "SAC not supported\n"); | |
| 0 | 5142 return -1; /* SAC: off */ |
| 355 | 5143 } |
| 5144 if (get_bits1(&s->gb) != 0) { | |
| 5145 fprintf(stderr, "Advanced Prediction Mode not supported\n"); | |
| 0 | 5146 return -1; /* advanced prediction mode: off */ |
| 355 | 5147 } |
| 5148 if (get_bits1(&s->gb) != 0) { | |
| 5149 fprintf(stderr, "PB frame mode no supported\n"); | |
| 5150 return -1; /* PB frame mode */ | |
| 5151 } | |
| 0 | 5152 |
| 5153 /* skip unknown header garbage */ | |
| 21 | 5154 skip_bits(&s->gb, 41); |
| 0 | 5155 |
| 5156 s->qscale = get_bits(&s->gb, 5); | |
| 21 | 5157 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */ |
| 0 | 5158 |
| 5159 /* PEI */ | |
| 21 | 5160 while (get_bits1(&s->gb) != 0) { |
| 5161 skip_bits(&s->gb, 8); | |
| 0 | 5162 } |
| 5163 s->f_code = 1; | |
|
770
d1770a34e4f6
segfault fix patch by (Juergen Keil <jk at tools dot de>)
michaelni
parents:
766
diff
changeset
|
5164 |
|
d1770a34e4f6
segfault fix patch by (Juergen Keil <jk at tools dot de>)
michaelni
parents:
766
diff
changeset
|
5165 s->y_dc_scale_table= |
|
d1770a34e4f6
segfault fix patch by (Juergen Keil <jk at tools dot de>)
michaelni
parents:
766
diff
changeset
|
5166 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; |
|
d1770a34e4f6
segfault fix patch by (Juergen Keil <jk at tools dot de>)
michaelni
parents:
766
diff
changeset
|
5167 |
| 0 | 5168 return 0; |
| 5169 } | |
| 144 | 5170 |
|
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5171 int flv_h263_decode_picture_header(MpegEncContext *s) |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5172 { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5173 int format, width, height; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5174 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5175 /* picture header */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5176 if (get_bits_long(&s->gb, 17) != 1) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5177 fprintf(stderr, "Bad picture start code\n"); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5178 return -1; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5179 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5180 format = get_bits(&s->gb, 5); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5181 if (format != 0 && format != 1) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5182 fprintf(stderr, "Bad picture format\n"); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5183 return -1; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5184 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5185 s->h263_flv = format+1; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5186 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5187 format = get_bits(&s->gb, 3); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5188 switch (format) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5189 case 0: |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5190 width = get_bits(&s->gb, 8); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5191 height = get_bits(&s->gb, 8); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5192 break; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5193 case 1: |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5194 width = get_bits(&s->gb, 16); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5195 height = get_bits(&s->gb, 16); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5196 break; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5197 case 2: |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5198 width = 352; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5199 height = 288; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5200 break; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5201 case 3: |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5202 width = 176; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5203 height = 144; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5204 break; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5205 case 4: |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5206 width = 128; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5207 height = 96; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5208 break; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5209 case 5: |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5210 width = 320; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5211 height = 240; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5212 break; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5213 case 6: |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5214 width = 160; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5215 height = 120; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5216 break; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5217 default: |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5218 width = height = 0; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5219 break; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5220 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5221 if ((width == 0) || (height == 0)) |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5222 return -1; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5223 s->width = width; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5224 s->height = height; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5225 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5226 s->pict_type = I_TYPE + get_bits(&s->gb, 2); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5227 if (s->pict_type > P_TYPE) |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5228 s->pict_type = P_TYPE; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5229 skip_bits1(&s->gb); /* deblocking flag */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5230 s->qscale = get_bits(&s->gb, 5); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5231 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5232 s->h263_plus = 0; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5233 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5234 s->unrestricted_mv = 1; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5235 s->h263_long_vectors = s->unrestricted_mv; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5236 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5237 /* PEI */ |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5238 while (get_bits1(&s->gb) != 0) { |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5239 skip_bits(&s->gb, 8); |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5240 } |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5241 s->f_code = 1; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5242 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5243 s->y_dc_scale_table= |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5244 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5245 |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5246 return 0; |
|
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
5247 } |
