Mercurial > libavcodec.hg
annotate h263.c @ 10752:56e57dc0fe19 libavcodec
cosmetics: Move H.263-related functions around to avoid forward declarations.
author | diego |
---|---|
date | Wed, 30 Dec 2009 14:34:14 +0000 |
parents | 1550e82f6183 |
children | 3790420a84b6 |
rev | line source |
---|---|
0 | 1 /* |
2 * H263/MPEG4 backend for ffmpeg encoder and decoder | |
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8627
diff
changeset
|
3 * Copyright (c) 2000,2001 Fabrice Bellard |
78 | 4 * H263+ support. |
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8627
diff
changeset
|
5 * Copyright (c) 2001 Juan J. Sierralta P |
1739
07a484280a82
copyright year update of the files i touched and remembered, things look annoyingly unmaintained otherwise
michael
parents:
1708
diff
changeset
|
6 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> |
0 | 7 * |
5214 | 8 * ac prediction encoding, B-frame support, error resilience, optimizations, |
9 * qpel decoding, gmc decoding, interlaced decoding | |
10 * by Michael Niedermayer <michaelni@gmx.at> | |
11 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3791
diff
changeset
|
12 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3791
diff
changeset
|
13 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3791
diff
changeset
|
14 * FFmpeg is free software; you can redistribute it and/or |
429 | 15 * modify it under the terms of the GNU Lesser General Public |
16 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3791
diff
changeset
|
17 * version 2.1 of the License, or (at your option) any later version. |
0 | 18 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3791
diff
changeset
|
19 * FFmpeg is distributed in the hope that it will be useful, |
0 | 20 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
429 | 21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
22 * Lesser General Public License for more details. | |
0 | 23 * |
429 | 24 * You should have received a copy of the GNU Lesser General Public |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3791
diff
changeset
|
25 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
3024
diff
changeset
|
26 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 27 */ |
1034 | 28 |
29 /** | |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8691
diff
changeset
|
30 * @file libavcodec/h263.c |
1106 | 31 * h263/mpeg4 codec. |
1034 | 32 */ |
2967 | 33 |
355 | 34 //#define DEBUG |
1490
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
35 #include <limits.h> |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
36 |
0 | 37 #include "dsputil.h" |
38 #include "avcodec.h" | |
39 #include "mpegvideo.h" | |
40 #include "h263data.h" | |
41 #include "mpeg4data.h" | |
8627
d6bab465b82c
moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents:
8612
diff
changeset
|
42 #include "mathops.h" |
9103
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
43 #include "unary.h" |
0 | 44 |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
45 //#undef NDEBUG |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
46 //#include <assert.h> |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
47 |
544 | 48 #define INTRA_MCBPC_VLC_BITS 6 |
1482 | 49 #define INTER_MCBPC_VLC_BITS 7 |
544 | 50 #define CBPY_VLC_BITS 6 |
51 #define MV_VLC_BITS 9 | |
52 #define DC_VLC_BITS 9 | |
53 #define SPRITE_TRAJ_VLC_BITS 6 | |
54 #define MB_TYPE_B_VLC_BITS 4 | |
55 #define TEX_VLC_BITS 9 | |
1655 | 56 #define H263_MBTYPE_B_VLC_BITS 6 |
57 #define CBPC_B_VLC_BITS 3 | |
544 | 58 |
453 | 59 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); |
60 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, | |
1132 | 61 int n, int coded, int intra, int rvlc); |
8739
037e54d6c9c3
Remove pointless '#if CONFIG_ENCODERS' around forward declarations.
diego
parents:
8718
diff
changeset
|
62 |
1914 | 63 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb); |
2003 | 64 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding); |
1064 | 65 |
8590 | 66 #if CONFIG_ENCODERS |
10721
07c893df0334
cosmetics: Move a bunch of forward declarations below a CONFIG_ENCODERS #ifdef.
diego
parents:
10664
diff
changeset
|
67 static void mpeg4_encode_visual_object_header(MpegEncContext *s); |
07c893df0334
cosmetics: Move a bunch of forward declarations below a CONFIG_ENCODERS #ifdef.
diego
parents:
10664
diff
changeset
|
68 static void mpeg4_encode_vol_header(MpegEncContext *s, int vo_number, |
07c893df0334
cosmetics: Move a bunch of forward declarations below a CONFIG_ENCODERS #ifdef.
diego
parents:
10664
diff
changeset
|
69 int vol_number); |
07c893df0334
cosmetics: Move a bunch of forward declarations below a CONFIG_ENCODERS #ifdef.
diego
parents:
10664
diff
changeset
|
70 static inline void mpeg4_encode_block(MpegEncContext *s, DCTELEM *block, |
07c893df0334
cosmetics: Move a bunch of forward declarations below a CONFIG_ENCODERS #ifdef.
diego
parents:
10664
diff
changeset
|
71 int n, int dc, uint8_t *scan_table, |
07c893df0334
cosmetics: Move a bunch of forward declarations below a CONFIG_ENCODERS #ifdef.
diego
parents:
10664
diff
changeset
|
72 PutBitContext *dc_pb, |
07c893df0334
cosmetics: Move a bunch of forward declarations below a CONFIG_ENCODERS #ifdef.
diego
parents:
10664
diff
changeset
|
73 PutBitContext *ac_pb); |
07c893df0334
cosmetics: Move a bunch of forward declarations below a CONFIG_ENCODERS #ifdef.
diego
parents:
10664
diff
changeset
|
74 static int mpeg4_get_block_length(MpegEncContext *s, DCTELEM *block, int n, |
07c893df0334
cosmetics: Move a bunch of forward declarations below a CONFIG_ENCODERS #ifdef.
diego
parents:
10664
diff
changeset
|
75 int intra_dc, uint8_t *scan_table); |
07c893df0334
cosmetics: Move a bunch of forward declarations below a CONFIG_ENCODERS #ifdef.
diego
parents:
10664
diff
changeset
|
76 |
1064 | 77 static uint8_t uni_DCtab_lum_len[512]; |
78 static uint8_t uni_DCtab_chrom_len[512]; | |
79 static uint16_t uni_DCtab_lum_bits[512]; | |
80 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
|
81 |
4655 | 82 static uint8_t mv_penalty[MAX_FCODE+1][MAX_MV*2+1]; |
1064 | 83 static uint8_t fcode_tab[MAX_MV*2+1]; |
84 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
|
85 |
945 | 86 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2]; |
87 static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2]; | |
88 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2]; | |
89 static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2]; | |
2253 | 90 static uint8_t uni_h263_intra_aic_rl_len [64*64*2*2]; |
91 static uint8_t uni_h263_inter_rl_len [64*64*2*2]; | |
945 | 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 |
4672 | 107 static uint8_t static_rl_table_store[5][2][2*MAX_RUN + MAX_LEVEL + 3]; |
108 | |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
109 #if 0 //3IV1 is quite rare and it slows things down a tiny bit |
8612 | 110 #define IS_3IV1 s->codec_tag == AV_RL32("3IV1") |
2967 | 111 #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
|
112 #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
|
113 #endif |
293 | 114 |
0 | 115 int h263_get_picture_format(int width, int height) |
116 { | |
117 int format; | |
118 | |
119 if (width == 128 && height == 96) | |
355 | 120 format = 1; |
0 | 121 else if (width == 176 && height == 144) |
355 | 122 format = 2; |
0 | 123 else if (width == 352 && height == 288) |
355 | 124 format = 3; |
0 | 125 else if (width == 704 && height == 576) |
355 | 126 format = 4; |
0 | 127 else if (width == 1408 && height == 1152) |
355 | 128 format = 5; |
0 | 129 else |
130 format = 7; | |
131 return format; | |
132 } | |
133 | |
5403 | 134 static void show_pict_info(MpegEncContext *s){ |
135 av_log(s->avctx, AV_LOG_DEBUG, "qp:%d %c size:%d rnd:%d%s%s%s%s%s%s%s%s%s %d/%d\n", | |
136 s->qscale, av_get_pict_type_char(s->pict_type), | |
137 s->gb.size_in_bits, 1-s->no_rounding, | |
138 s->obmc ? " AP" : "", | |
139 s->umvplus ? " UMV" : "", | |
140 s->h263_long_vectors ? " LONG" : "", | |
141 s->h263_plus ? " +" : "", | |
142 s->h263_aic ? " AIC" : "", | |
143 s->alt_inter_vlc ? " AIV" : "", | |
144 s->modified_quant ? " MQ" : "", | |
145 s->loop_filter ? " LOOP" : "", | |
146 s->h263_slice_structured ? " SS" : "", | |
147 s->avctx->time_base.den, s->avctx->time_base.num | |
148 ); | |
149 } | |
150 | |
8590 | 151 #if CONFIG_ENCODERS |
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
|
152 |
1548 | 153 static void aspect_to_info(MpegEncContext * s, AVRational aspect){ |
887 | 154 int i; |
155 | |
1548 | 156 if(aspect.num==0) aspect= (AVRational){1,1}; |
157 | |
887 | 158 for(i=1; i<6; i++){ |
1548 | 159 if(av_cmp_q(pixel_aspect[i], aspect) == 0){ |
887 | 160 s->aspect_ratio_info=i; |
161 return; | |
162 } | |
163 } | |
2967 | 164 |
887 | 165 s->aspect_ratio_info= FF_ASPECT_EXTENDED; |
880 | 166 } |
167 | |
1354 | 168 void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number) |
0 | 169 { |
1354 | 170 int format; |
171 | |
172 align_put_bits(&s->pb); | |
173 | |
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
174 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
|
175 put_bits(&s->pb, 5, (s->h263_flv-1)); /* 0: h263 escape codes 1: 11-bit escape codes */ |
2637 | 176 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->time_base.num) / //FIXME use timestamp |
177 s->avctx->time_base.den) & 0xff); /* TemporalReference */ | |
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
178 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
|
179 format = 2; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
180 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
|
181 format = 3; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
182 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
|
183 format = 4; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
184 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
|
185 format = 5; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
186 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
|
187 format = 6; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
188 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
|
189 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
|
190 else |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
191 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
|
192 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
|
193 if (format == 0) { |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
194 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
|
195 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
|
196 } else if (format == 1) { |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
197 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
|
198 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
|
199 } |
6481 | 200 put_bits(&s->pb, 2, s->pict_type == FF_P_TYPE); /* PictureType */ |
1390
39d07c0263de
patch for flv deblocking by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1389
diff
changeset
|
201 put_bits(&s->pb, 1, 1); /* DeblockingFlag: on */ |
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
202 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
|
203 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
|
204 |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
205 if(s->h263_aic){ |
2967 | 206 s->y_dc_scale_table= |
1639 | 207 s->c_dc_scale_table= ff_aic_dc_scale_table; |
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
208 }else{ |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
209 s->y_dc_scale_table= |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
210 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
|
211 } |
1354 | 212 } |
213 | |
214 void h263_encode_picture_header(MpegEncContext * s, int picture_number) | |
215 { | |
1872 | 216 int format, coded_frame_rate, coded_frame_rate_base, i, temp_ref; |
217 int best_clock_code=1; | |
218 int best_divisor=60; | |
219 int best_error= INT_MAX; | |
2967 | 220 |
1872 | 221 if(s->h263_plus){ |
222 for(i=0; i<2; i++){ | |
223 int div, error; | |
2637 | 224 div= (s->avctx->time_base.num*1800000LL + 500LL*s->avctx->time_base.den) / ((1000LL+i)*s->avctx->time_base.den); |
5075
33d50e0e1823
Correct the parameter order for the call to "av_clip".
takis
parents:
4984
diff
changeset
|
225 div= av_clip(div, 1, 127); |
4001 | 226 error= FFABS(s->avctx->time_base.num*1800000LL - (1000LL+i)*s->avctx->time_base.den*div); |
1872 | 227 if(error < best_error){ |
228 best_error= error; | |
229 best_divisor= div; | |
230 best_clock_code= i; | |
231 } | |
232 } | |
233 } | |
234 s->custom_pcf= best_clock_code!=1 || best_divisor!=60; | |
235 coded_frame_rate= 1800000; | |
236 coded_frame_rate_base= (1000+best_clock_code)*best_divisor; | |
1354 | 237 |
238 align_put_bits(&s->pb); | |
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
239 |
231 | 240 /* Update the pointer to last GOB */ |
9431 | 241 s->ptr_lastgob = put_bits_ptr(&s->pb); |
231 | 242 put_bits(&s->pb, 22, 0x20); /* PSC */ |
2637 | 243 temp_ref= s->picture_number * (int64_t)coded_frame_rate * s->avctx->time_base.num / //FIXME use timestamp |
244 (coded_frame_rate_base * (int64_t)s->avctx->time_base.den); | |
7260
3ec34b551aae
bitstream: move put_sbits() from flacenc.c to bitstream.h and use it
ramiro
parents:
7098
diff
changeset
|
245 put_sbits(&s->pb, 8, temp_ref); /* TemporalReference */ |
0 | 246 |
2979 | 247 put_bits(&s->pb, 1, 1); /* marker */ |
248 put_bits(&s->pb, 1, 0); /* h263 id */ | |
249 put_bits(&s->pb, 1, 0); /* split screen off */ | |
250 put_bits(&s->pb, 1, 0); /* camera off */ | |
251 put_bits(&s->pb, 1, 0); /* freeze picture release off */ | |
2967 | 252 |
78 | 253 format = h263_get_picture_format(s->width, s->height); |
0 | 254 if (!s->h263_plus) { |
255 /* H.263v1 */ | |
256 put_bits(&s->pb, 3, format); | |
6481 | 257 put_bits(&s->pb, 1, (s->pict_type == FF_P_TYPE)); |
0 | 258 /* By now UMV IS DISABLED ON H.263v1, since the restrictions |
259 of H.263v1 UMV implies to check the predicted MV after | |
260 calculation of the current MB to see if we're on the limits */ | |
2979 | 261 put_bits(&s->pb, 1, 0); /* Unrestricted Motion Vector: off */ |
262 put_bits(&s->pb, 1, 0); /* SAC: off */ | |
263 put_bits(&s->pb, 1, s->obmc); /* Advanced Prediction */ | |
264 put_bits(&s->pb, 1, 0); /* only I/P frames, no PB frame */ | |
0 | 265 put_bits(&s->pb, 5, s->qscale); |
2979 | 266 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */ |
0 | 267 } else { |
1872 | 268 int ufep=1; |
0 | 269 /* H.263v2 */ |
270 /* H.263 Plus PTYPE */ | |
2967 | 271 |
0 | 272 put_bits(&s->pb, 3, 7); |
1872 | 273 put_bits(&s->pb,3,ufep); /* Update Full Extended PTYPE */ |
78 | 274 if (format == 7) |
275 put_bits(&s->pb,3,6); /* Custom Source Format */ | |
276 else | |
277 put_bits(&s->pb, 3, format); | |
2967 | 278 |
1872 | 279 put_bits(&s->pb,1, s->custom_pcf); |
1661 | 280 put_bits(&s->pb,1, s->umvplus); /* Unrestricted Motion Vector */ |
0 | 281 put_bits(&s->pb,1,0); /* SAC: off */ |
1633 | 282 put_bits(&s->pb,1,s->obmc); /* Advanced Prediction Mode */ |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
283 put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */ |
1644 | 284 put_bits(&s->pb,1,s->loop_filter); /* Deblocking Filter */ |
1661 | 285 put_bits(&s->pb,1,s->h263_slice_structured); /* Slice Structured */ |
0 | 286 put_bits(&s->pb,1,0); /* Reference Picture Selection: off */ |
287 put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */ | |
1637 | 288 put_bits(&s->pb,1,s->alt_inter_vlc); /* Alternative Inter VLC */ |
1644 | 289 put_bits(&s->pb,1,s->modified_quant); /* Modified Quantization: */ |
0 | 290 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */ |
291 put_bits(&s->pb,3,0); /* Reserved */ | |
2967 | 292 |
6481 | 293 put_bits(&s->pb, 3, s->pict_type == FF_P_TYPE); |
2967 | 294 |
0 | 295 put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */ |
296 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
|
297 put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */ |
0 | 298 put_bits(&s->pb,2,0); /* Reserved */ |
299 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */ | |
2967 | 300 |
0 | 301 /* This should be here if PLUSPTYPE */ |
2979 | 302 put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */ |
303 | |
304 if (format == 7) { | |
78 | 305 /* Custom Picture Format (CPFMT) */ |
1548 | 306 aspect_to_info(s, s->avctx->sample_aspect_ratio); |
880 | 307 |
308 put_bits(&s->pb,4,s->aspect_ratio_info); | |
78 | 309 put_bits(&s->pb,9,(s->width >> 2) - 1); |
310 put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */ | |
311 put_bits(&s->pb,9,(s->height >> 2)); | |
1548 | 312 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){ |
313 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num); | |
314 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den); | |
2979 | 315 } |
78 | 316 } |
1872 | 317 if(s->custom_pcf){ |
318 if(ufep){ | |
319 put_bits(&s->pb, 1, best_clock_code); | |
320 put_bits(&s->pb, 7, best_divisor); | |
321 } | |
7260
3ec34b551aae
bitstream: move put_sbits() from flacenc.c to bitstream.h and use it
ramiro
parents:
7098
diff
changeset
|
322 put_sbits(&s->pb, 2, temp_ref>>8); |
1872 | 323 } |
2967 | 324 |
0 | 325 /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */ |
79
82e579c37bc3
Moved some H.263+ variables to MpegEncContext to be thread-safe.
pulento
parents:
78
diff
changeset
|
326 if (s->umvplus) |
1089 | 327 // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */ |
1644 | 328 //FIXME check actual requested range |
1089 | 329 put_bits(&s->pb,2,1); /* unlimited */ |
1661 | 330 if(s->h263_slice_structured) |
331 put_bits(&s->pb,2,0); /* no weird submodes */ | |
1089 | 332 |
0 | 333 put_bits(&s->pb, 5, s->qscale); |
334 } | |
335 | |
2979 | 336 put_bits(&s->pb, 1, 0); /* no PEI */ |
498 | 337 |
1670 | 338 if(s->h263_slice_structured){ |
339 put_bits(&s->pb, 1, 1); | |
2967 | 340 |
1670 | 341 assert(s->mb_x == 0 && s->mb_y == 0); |
342 ff_h263_encode_mba(s); | |
343 | |
344 put_bits(&s->pb, 1, 1); | |
345 } | |
346 | |
498 | 347 if(s->h263_aic){ |
2967 | 348 s->y_dc_scale_table= |
1639 | 349 s->c_dc_scale_table= ff_aic_dc_scale_table; |
498 | 350 }else{ |
351 s->y_dc_scale_table= | |
352 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; | |
353 } | |
0 | 354 } |
355 | |
766 | 356 /** |
357 * Encodes a group of blocks header. | |
358 */ | |
1661 | 359 void h263_encode_gob_header(MpegEncContext * s, int mb_line) |
162 | 360 { |
1661 | 361 put_bits(&s->pb, 17, 1); /* GBSC */ |
362 | |
363 if(s->h263_slice_structured){ | |
364 put_bits(&s->pb, 1, 1); | |
365 | |
366 ff_h263_encode_mba(s); | |
367 | |
368 if(s->mb_num > 1583) | |
369 put_bits(&s->pb, 1, 1); | |
370 put_bits(&s->pb, 5, s->qscale); /* GQUANT */ | |
371 put_bits(&s->pb, 1, 1); | |
6481 | 372 put_bits(&s->pb, 2, s->pict_type == FF_I_TYPE); /* GFID */ |
1661 | 373 }else{ |
374 int gob_number= mb_line / s->gob_index; | |
375 | |
376 put_bits(&s->pb, 5, gob_number); /* GN */ | |
6481 | 377 put_bits(&s->pb, 2, s->pict_type == FF_I_TYPE); /* GFID */ |
1661 | 378 put_bits(&s->pb, 5, s->qscale); /* GQUANT */ |
379 } | |
162 | 380 } |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
381 |
1492 | 382 static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){ |
383 int last=0; | |
384 int j; | |
385 int rate=0; | |
386 | |
387 for(j=1; j<=block_last_index; j++){ | |
388 const int index= scantable[j]; | |
389 int level= block[index]; | |
390 if(level){ | |
391 level+= 64; | |
392 if((level&(~127)) == 0){ | |
393 if(j<block_last_index) rate+= s->intra_ac_vlc_length [UNI_AC_ENC_INDEX(j-last-1, level)]; | |
394 else rate+= s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j-last-1, level)]; | |
395 }else | |
396 rate += s->ac_esc_length; | |
397 | |
398 last= j; | |
399 } | |
400 } | |
2967 | 401 |
1492 | 402 return rate; |
403 } | |
404 | |
405 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6]) | |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
406 { |
1492 | 407 int score= 0; |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
408 int i, n; |
903 | 409 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
|
410 |
1492 | 411 memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6); |
2967 | 412 |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
413 for(n=0; n<6; n++){ |
1064 | 414 int16_t *ac_val, *ac_val1; |
2967 | 415 |
1492 | 416 score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated); |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
417 |
266 | 418 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
|
419 ac_val1= ac_val; |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
420 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
|
421 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
|
422 /* top prediction */ |
266 | 423 ac_val-= s->block_wrap[n]*16; |
903 | 424 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
|
425 /* same qscale */ |
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
426 for(i=1; i<8; i++){ |
1092 | 427 const int level= block[n][s->dsp.idct_permutation[i ]]; |
1492 | 428 block[n][s->dsp.idct_permutation[i ]] = level - ac_val[i+8]; |
1092 | 429 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
|
430 ac_val1[i+8]= level; |
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
431 } |
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
432 }else{ |
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
433 /* different qscale, we must rescale */ |
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
434 for(i=1; i<8; i++){ |
1092 | 435 const int level= block[n][s->dsp.idct_permutation[i ]]; |
1492 | 436 block[n][s->dsp.idct_permutation[i ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale); |
1092 | 437 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
|
438 ac_val1[i+8]= level; |
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
439 } |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
440 } |
1492 | 441 st[n]= s->intra_h_scantable.permutated; |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
442 }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
|
443 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
|
444 /* left prediction */ |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
445 ac_val-= 16; |
903 | 446 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
|
447 /* same qscale */ |
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
448 for(i=1; i<8; i++){ |
1092 | 449 const int level= block[n][s->dsp.idct_permutation[i<<3]]; |
1492 | 450 block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i]; |
692
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
451 ac_val1[i ]= level; |
1092 | 452 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
|
453 } |
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
454 }else{ |
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
455 /* different qscale, we must rescale */ |
852b5a416161
fixing ac prediction encoding with adaptive quantization
michaelni
parents:
690
diff
changeset
|
456 for(i=1; i<8; i++){ |
1092 | 457 const int level= block[n][s->dsp.idct_permutation[i<<3]]; |
1492 | 458 block[n][s->dsp.idct_permutation[i<<3]]= 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
|
459 ac_val1[i ]= level; |
1092 | 460 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
|
461 } |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
462 } |
1492 | 463 st[n]= s->intra_v_scantable.permutated; |
464 } | |
465 | |
466 for(i=63; i>0; i--) //FIXME optimize | |
467 if(block[n][ st[n][i] ]) break; | |
468 s->block_last_index[n]= i; | |
469 | |
470 score += get_block_rate(s, block[n], s->block_last_index[n], st[n]); | |
471 } | |
472 | |
473 return score < 0; | |
474 } | |
475 | |
476 static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6]) | |
477 { | |
478 int i, n; | |
479 memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6); | |
480 | |
481 for(n=0; n<6; n++){ | |
482 int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16; | |
483 | |
484 st[n]= s->intra_scantable.permutated; | |
485 if(dir[n]){ | |
486 /* top prediction */ | |
487 for(i=1; i<8; i++){ | |
488 block[n][s->dsp.idct_permutation[i ]] = ac_val[i+8]; | |
489 } | |
490 }else{ | |
491 /* left prediction */ | |
492 for(i=1; i<8; i++){ | |
493 block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i ]; | |
494 } | |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
495 } |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
496 } |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
497 } |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
498 |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
499 /** |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
500 * 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
|
501 */ |
695 | 502 void ff_clean_h263_qscales(MpegEncContext *s){ |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
503 int i; |
903 | 504 int8_t * const qscale_table= s->current_picture.qscale_table; |
2967 | 505 |
4316 | 506 ff_init_qscale_tab(s); |
507 | |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
508 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
|
509 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
|
510 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
|
511 } |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
512 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
|
513 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
|
514 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
|
515 } |
1983 | 516 |
517 if(s->codec_id != CODEC_ID_H263P){ | |
518 for(i=1; i<s->mb_num; i++){ | |
519 int mb_xy= s->mb_index2xy[i]; | |
2967 | 520 |
1983 | 521 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTER4V)){ |
522 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_INTER; | |
523 } | |
524 } | |
525 } | |
695 | 526 } |
527 | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
528 /** |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
529 * 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
|
530 */ |
695 | 531 void ff_clean_mpeg4_qscales(MpegEncContext *s){ |
532 int i; | |
903 | 533 int8_t * const qscale_table= s->current_picture.qscale_table; |
534 | |
695 | 535 ff_clean_h263_qscales(s); |
2967 | 536 |
6481 | 537 if(s->pict_type== FF_B_TYPE){ |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
538 int odd=0; |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
539 /* ok, come on, this isn't funny anymore, there's more code for handling this mpeg4 mess than for the actual adaptive quantization */ |
2967 | 540 |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
541 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
|
542 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
|
543 odd += qscale_table[mb_xy]&1; |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
544 } |
2967 | 545 |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
546 if(2*odd > s->mb_num) odd=1; |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
547 else odd=0; |
2967 | 548 |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
549 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
|
550 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
|
551 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
|
552 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
|
553 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
|
554 qscale_table[mb_xy]= 31; |
2967 | 555 } |
556 | |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
557 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
|
558 int mb_xy= s->mb_index2xy[i]; |
1708 | 559 if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_DIRECT)){ |
560 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_BIDIR; | |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
561 } |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
562 } |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
563 } |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
564 } |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
565 |
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
|
566 #endif //CONFIG_ENCODERS |
3247 | 567 |
8042 | 568 #define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0])) |
3255
183e3eb0824a
100l to loren. at least this fixes the compile error, but the code is still broken (decoding buggy/crashing)
rfelker
parents:
3247
diff
changeset
|
569 #define tab_bias (tab_size/2) |
183e3eb0824a
100l to loren. at least this fixes the compile error, but the code is still broken (decoding buggy/crashing)
rfelker
parents:
3247
diff
changeset
|
570 |
3791
b1d5ef809e11
fix rv20 b frames (broke since r5264 Mon Apr 3 07:52:24 2006 UTC 2x faster ff_mpeg4_set_direct_mv)
michael
parents:
3781
diff
changeset
|
571 void ff_mpeg4_init_direct_mv(MpegEncContext *s){ |
3247 | 572 int i; |
573 for(i=0; i<tab_size; i++){ | |
574 s->direct_scale_mv[0][i] = (i-tab_bias)*s->pb_time/s->pp_time; | |
575 s->direct_scale_mv[1][i] = (i-tab_bias)*(s->pb_time-s->pp_time)/s->pp_time; | |
576 } | |
577 } | |
578 | |
579 static inline void ff_mpeg4_set_one_direct_mv(MpegEncContext *s, int mx, int my, int i){ | |
580 int xy= s->block_index[i]; | |
581 uint16_t time_pp= s->pp_time; | |
582 uint16_t time_pb= s->pb_time; | |
583 int p_mx, p_my; | |
584 | |
585 p_mx= s->next_picture.motion_val[0][xy][0]; | |
586 if((unsigned)(p_mx + tab_bias) < tab_size){ | |
587 s->mv[0][i][0] = s->direct_scale_mv[0][p_mx + tab_bias] + mx; | |
588 s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx | |
589 : s->direct_scale_mv[1][p_mx + tab_bias]; | |
590 }else{ | |
591 s->mv[0][i][0] = p_mx*time_pb/time_pp + mx; | |
592 s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx | |
593 : p_mx*(time_pb - time_pp)/time_pp; | |
594 } | |
595 p_my= s->next_picture.motion_val[0][xy][1]; | |
596 if((unsigned)(p_my + tab_bias) < tab_size){ | |
597 s->mv[0][i][1] = s->direct_scale_mv[0][p_my + tab_bias] + my; | |
598 s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my | |
599 : s->direct_scale_mv[1][p_my + tab_bias]; | |
600 }else{ | |
601 s->mv[0][i][1] = p_my*time_pb/time_pp + my; | |
602 s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my | |
603 : p_my*(time_pb - time_pp)/time_pp; | |
604 } | |
605 } | |
606 | |
3255
183e3eb0824a
100l to loren. at least this fixes the compile error, but the code is still broken (decoding buggy/crashing)
rfelker
parents:
3247
diff
changeset
|
607 #undef tab_size |
183e3eb0824a
100l to loren. at least this fixes the compile error, but the code is still broken (decoding buggy/crashing)
rfelker
parents:
3247
diff
changeset
|
608 #undef tab_bias |
183e3eb0824a
100l to loren. at least this fixes the compile error, but the code is still broken (decoding buggy/crashing)
rfelker
parents:
3247
diff
changeset
|
609 |
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
|
610 /** |
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
|
611 * |
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
|
612 * @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
|
613 */ |
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
|
614 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
|
615 const int mb_index= s->mb_x + s->mb_y*s->mb_stride; |
1708 | 616 const int colocated_mb_type= s->next_picture.mb_type[mb_index]; |
9484
fb240cb99bcf
Remove useless init from ff_mpeg4_set_direct_mv() found by CSA.
michael
parents:
9481
diff
changeset
|
617 uint16_t time_pp; |
fb240cb99bcf
Remove useless init from ff_mpeg4_set_direct_mv() found by CSA.
michael
parents:
9481
diff
changeset
|
618 uint16_t time_pb; |
936 | 619 int i; |
2967 | 620 |
936 | 621 //FIXME avoid divides |
3247 | 622 // try special case with shifts for 1 and 3 B-frames? |
2967 | 623 |
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
|
624 if(IS_8X8(colocated_mb_type)){ |
936 | 625 s->mv_type = MV_TYPE_8X8; |
626 for(i=0; i<4; i++){ | |
3247 | 627 ff_mpeg4_set_one_direct_mv(s, mx, my, i); |
936 | 628 } |
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
|
629 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
|
630 } else if(IS_INTERLACED(colocated_mb_type)){ |
936 | 631 s->mv_type = MV_TYPE_FIELD; |
632 for(i=0; i<2; i++){ | |
1948 | 633 int field_select= s->next_picture.ref_index[0][s->block_index[2*i]]; |
3205 | 634 s->field_select[0][i]= field_select; |
635 s->field_select[1][i]= i; | |
936 | 636 if(s->top_field_first){ |
1948 | 637 time_pp= s->pp_field_time - field_select + i; |
638 time_pb= s->pb_field_time - field_select + i; | |
936 | 639 }else{ |
1948 | 640 time_pp= s->pp_field_time + field_select - i; |
641 time_pb= s->pb_field_time + field_select - i; | |
936 | 642 } |
1708 | 643 s->mv[0][i][0] = s->p_field_mv_table[i][0][mb_index][0]*time_pb/time_pp + mx; |
644 s->mv[0][i][1] = s->p_field_mv_table[i][0][mb_index][1]*time_pb/time_pp + my; | |
645 s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->p_field_mv_table[i][0][mb_index][0] | |
646 : s->p_field_mv_table[i][0][mb_index][0]*(time_pb - time_pp)/time_pp; | |
2967 | 647 s->mv[1][i][1] = my ? s->mv[0][i][1] - s->p_field_mv_table[i][0][mb_index][1] |
1708 | 648 : s->p_field_mv_table[i][0][mb_index][1]*(time_pb - time_pp)/time_pp; |
936 | 649 } |
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
|
650 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
|
651 }else{ |
3247 | 652 ff_mpeg4_set_one_direct_mv(s, mx, my, 0); |
653 s->mv[0][1][0] = s->mv[0][2][0] = s->mv[0][3][0] = s->mv[0][0][0]; | |
654 s->mv[0][1][1] = s->mv[0][2][1] = s->mv[0][3][1] = s->mv[0][0][1]; | |
655 s->mv[1][1][0] = s->mv[1][2][0] = s->mv[1][3][0] = s->mv[1][0][0]; | |
656 s->mv[1][1][1] = s->mv[1][2][1] = s->mv[1][3][1] = s->mv[1][0][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
|
657 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
|
658 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
|
659 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
|
660 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
|
661 return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1; //Note see prev line |
936 | 662 } |
663 } | |
664 | |
1389 | 665 void ff_h263_update_motion_val(MpegEncContext * s){ |
666 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; | |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
667 //FIXME a lot of that is only needed for !low_delay |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
668 const int wrap = s->b8_stride; |
1389 | 669 const int xy = s->block_index[0]; |
2967 | 670 |
671 s->current_picture.mbskip_table[mb_xy]= s->mb_skipped; | |
1389 | 672 |
673 if(s->mv_type != MV_TYPE_8X8){ | |
674 int motion_x, motion_y; | |
675 if (s->mb_intra) { | |
676 motion_x = 0; | |
677 motion_y = 0; | |
678 } else if (s->mv_type == MV_TYPE_16X16) { | |
679 motion_x = s->mv[0][0][0]; | |
680 motion_y = s->mv[0][0][1]; | |
681 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ { | |
682 int i; | |
683 motion_x = s->mv[0][0][0] + s->mv[0][1][0]; | |
684 motion_y = s->mv[0][0][1] + s->mv[0][1][1]; | |
685 motion_x = (motion_x>>1) | (motion_x&1); | |
686 for(i=0; i<2; i++){ | |
1708 | 687 s->p_field_mv_table[i][0][mb_xy][0]= s->mv[0][i][0]; |
688 s->p_field_mv_table[i][0][mb_xy][1]= s->mv[0][i][1]; | |
1389 | 689 } |
1948 | 690 s->current_picture.ref_index[0][xy ]= |
691 s->current_picture.ref_index[0][xy + 1]= s->field_select[0][0]; | |
692 s->current_picture.ref_index[0][xy + wrap ]= | |
693 s->current_picture.ref_index[0][xy + wrap + 1]= s->field_select[0][1]; | |
1389 | 694 } |
1948 | 695 |
1389 | 696 /* no update if 8X8 because it has been done during parsing */ |
1668
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1666
diff
changeset
|
697 s->current_picture.motion_val[0][xy][0] = motion_x; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1666
diff
changeset
|
698 s->current_picture.motion_val[0][xy][1] = motion_y; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1666
diff
changeset
|
699 s->current_picture.motion_val[0][xy + 1][0] = motion_x; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1666
diff
changeset
|
700 s->current_picture.motion_val[0][xy + 1][1] = motion_y; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1666
diff
changeset
|
701 s->current_picture.motion_val[0][xy + wrap][0] = motion_x; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1666
diff
changeset
|
702 s->current_picture.motion_val[0][xy + wrap][1] = motion_y; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1666
diff
changeset
|
703 s->current_picture.motion_val[0][xy + 1 + wrap][0] = motion_x; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1666
diff
changeset
|
704 s->current_picture.motion_val[0][xy + 1 + wrap][1] = motion_y; |
1389 | 705 } |
706 | |
707 if(s->encoding){ //FIXME encoding MUST be cleaned up | |
2967 | 708 if (s->mv_type == MV_TYPE_8X8) |
1389 | 709 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_8x8; |
1633 | 710 else if(s->mb_intra) |
711 s->current_picture.mb_type[mb_xy]= MB_TYPE_INTRA; | |
1389 | 712 else |
713 s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_16x16; | |
714 } | |
715 } | |
716 | |
8590 | 717 #if CONFIG_ENCODERS |
1490
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
718 |
2502 | 719 static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){ |
720 int l, bit_size, code; | |
721 | |
722 if (val == 0) { | |
723 return mvtab[0][1]; | |
724 } else { | |
725 bit_size = f_code - 1; | |
726 /* modulo encoding */ | |
727 l= INT_BIT - 6 - bit_size; | |
728 val = (val<<l)>>l; | |
729 val--; | |
730 code = (val >> bit_size) + 1; | |
731 | |
732 return mvtab[code][1] + 1 + bit_size; | |
733 } | |
734 } | |
735 | |
736 static inline void ff_h263_encode_motion_vector(MpegEncContext * s, int x, int y, int f_code){ | |
737 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){ | |
2967 | 738 skip_put_bits(&s->pb, |
2502 | 739 h263_get_motion_length(s, x, f_code) |
740 +h263_get_motion_length(s, y, f_code)); | |
741 }else{ | |
742 ff_h263_encode_motion(s, x, f_code); | |
743 ff_h263_encode_motion(s, y, f_code); | |
744 } | |
745 } | |
746 | |
1490
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
747 static inline int get_p_cbp(MpegEncContext * s, |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
748 DCTELEM block[6][64], |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
749 int motion_x, int motion_y){ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
750 int cbp, i; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
751 |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
752 if(s->flags & CODEC_FLAG_CBP_RD){ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
753 int best_cbpy_score= INT_MAX; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
754 int best_cbpc_score= INT_MAX; |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
755 int cbpc = (-1), cbpy= (-1); |
1490
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
756 const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0); |
1505
010f76d07a27
use lagrange multipler instead of qp for ratecontrol, this may break some things, tell me ASAP if u notice anything broken
michaelni
parents:
1492
diff
changeset
|
757 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6); |
1490
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
758 |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
759 for(i=0; i<4; i++){ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
760 int score= inter_MCBPC_bits[i + offset] * lambda; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
761 if(i&1) score += s->coded_score[5]; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
762 if(i&2) score += s->coded_score[4]; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
763 |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
764 if(score < best_cbpc_score){ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
765 best_cbpc_score= score; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
766 cbpc= i; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
767 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
768 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
769 |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
770 for(i=0; i<16; i++){ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
771 int score= cbpy_tab[i ^ 0xF][1] * lambda; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
772 if(i&1) score += s->coded_score[3]; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
773 if(i&2) score += s->coded_score[2]; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
774 if(i&4) score += s->coded_score[1]; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
775 if(i&8) score += s->coded_score[0]; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
776 |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
777 if(score < best_cbpy_score){ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
778 best_cbpy_score= score; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
779 cbpy= i; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
780 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
781 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
782 cbp= cbpc + 4*cbpy; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
783 if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
784 if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0) |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
785 cbp= 0; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
786 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
787 |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
788 for (i = 0; i < 6; i++) { |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
789 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
790 s->block_last_index[i]= -1; |
8288 | 791 s->dsp.clear_block(s->block[i]); |
1490
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
792 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
793 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
794 }else{ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
795 cbp= 0; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
796 for (i = 0; i < 6; i++) { |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
797 if (s->block_last_index[i] >= 0) |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
798 cbp |= 1 << (5 - i); |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
799 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
800 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
801 return cbp; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
802 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
803 |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
804 static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64], |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
805 int motion_x, int motion_y, int mb_type){ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
806 int cbp=0, i; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
807 |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
808 if(s->flags & CODEC_FLAG_CBP_RD){ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
809 int score=0; |
1505
010f76d07a27
use lagrange multipler instead of qp for ratecontrol, this may break some things, tell me ASAP if u notice anything broken
michaelni
parents:
1492
diff
changeset
|
810 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6); |
2967 | 811 |
1490
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
812 for(i=0; i<6; i++){ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
813 if(s->coded_score[i] < 0){ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
814 score += s->coded_score[i]; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
815 cbp |= 1 << (5 - i); |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
816 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
817 } |
2967 | 818 |
1490
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
819 if(cbp){ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
820 int zero_score= -6; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
821 if ((motion_x | motion_y | s->dquant | mb_type) == 0){ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
822 zero_score-= 4; //2*MV + mb_type + cbp bit |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
823 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
824 |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
825 zero_score*= lambda; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
826 if(zero_score <= score){ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
827 cbp=0; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
828 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
829 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
830 |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
831 for (i = 0; i < 6; i++) { |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
832 if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
833 s->block_last_index[i]= -1; |
8288 | 834 s->dsp.clear_block(s->block[i]); |
1490
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
835 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
836 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
837 }else{ |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
838 for (i = 0; i < 6; i++) { |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
839 if (s->block_last_index[i] >= 0) |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
840 cbp |= 1 << (5 - i); |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
841 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
842 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
843 return cbp; |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
844 } |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
845 |
2967 | 846 static inline void mpeg4_encode_blocks(MpegEncContext * s, DCTELEM block[6][64], int intra_dc[6], |
2502 | 847 uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb){ |
848 int i; | |
2967 | 849 |
2502 | 850 if(scan_table){ |
851 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){ | |
852 for (i = 0; i < 6; i++) { | |
853 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, intra_dc[i], scan_table[i])); | |
854 } | |
855 }else{ | |
856 /* encode each block */ | |
857 for (i = 0; i < 6; i++) { | |
858 mpeg4_encode_block(s, block[i], i, intra_dc[i], scan_table[i], dc_pb, ac_pb); | |
859 } | |
860 } | |
861 }else{ | |
862 if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){ | |
863 for (i = 0; i < 6; i++) { | |
864 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, 0, s->intra_scantable.permutated)); | |
865 } | |
866 }else{ | |
867 /* encode each block */ | |
868 for (i = 0; i < 6; i++) { | |
869 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, dc_pb, ac_pb); | |
870 } | |
871 } | |
872 } | |
873 } | |
874 | |
8644 | 875 static const int dquant_code[5]= {1,0,9,2,3}; |
876 | |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
877 void mpeg4_encode_mb(MpegEncContext * s, |
2979 | 878 DCTELEM block[6][64], |
879 int motion_x, int motion_y) | |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
880 { |
1057 | 881 int cbpc, cbpy, pred_x, pred_y; |
453 | 882 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb; |
6481 | 883 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=FF_B_TYPE ? &s->tex_pb : &s->pb; |
884 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=FF_I_TYPE ? &s->pb2 : &s->pb; | |
453 | 885 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0; |
2967 | 886 |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
887 if (!s->mb_intra) { |
1490
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
888 int i, cbp; |
2967 | 889 |
6481 | 890 if(s->pict_type==FF_B_TYPE){ |
5445
5581a40c673a
exchange the values of MV_DIR_FORWARD and MV_DIR_BACKWARD (this is more sane,
michael
parents:
5405
diff
changeset
|
891 static const int mb_type_table[8]= {-1, 3, 2, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */ |
324 | 892 int mb_type= mb_type_table[s->mv_dir]; |
1708 | 893 |
324 | 894 if(s->mb_x==0){ |
1708 | 895 for(i=0; i<2; i++){ |
2967 | 896 s->last_mv[i][0][0]= |
897 s->last_mv[i][0][1]= | |
898 s->last_mv[i][1][0]= | |
1708 | 899 s->last_mv[i][1][1]= 0; |
900 } | |
324 | 901 } |
2967 | 902 |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
903 assert(s->dquant>=-2 && s->dquant<=2); |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
904 assert((s->dquant&1)==0); |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
905 assert(mb_type>=0); |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
906 |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
907 /* nothing to do if this MB was skipped 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
|
908 if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ... |
324 | 909 s->skip_count++; |
2967 | 910 s->mv[0][0][0]= |
911 s->mv[0][0][1]= | |
912 s->mv[1][0][0]= | |
324 | 913 s->mv[1][0][1]= 0; |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
914 s->mv_dir= MV_DIR_FORWARD; //doesn't matter |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
915 s->qscale -= s->dquant; |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
916 // s->mb_skipped=1; |
903 | 917 |
324 | 918 return; |
919 } | |
2967 | 920 |
1490
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
921 cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type); |
2967 | 922 |
324 | 923 if ((cbp | motion_x | motion_y | mb_type) ==0) { |
924 /* direct MB with MV={0,0} */ | |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
925 assert(s->dquant==0); |
2967 | 926 |
324 | 927 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */ |
453 | 928 |
929 if(interleaved_stats){ | |
930 s->misc_bits++; | |
931 s->last_bits++; | |
932 } | |
324 | 933 s->skip_count++; |
934 return; | |
935 } | |
2967 | 936 |
2979 | 937 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */ |
324 | 938 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
939 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we don't need it :) |
324 | 940 if(cbp) put_bits(&s->pb, 6, cbp); |
2967 | 941 |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
942 if(cbp && mb_type){ |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
943 if(s->dquant) |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
944 put_bits(&s->pb, 2, (s->dquant>>2)+3); |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
945 else |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
946 put_bits(&s->pb, 1, 0); |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
947 }else |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
948 s->qscale -= s->dquant; |
2967 | 949 |
697 | 950 if(!s->progressive_sequence){ |
951 if(cbp) | |
952 put_bits(&s->pb, 1, s->interlaced_dct); | |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
953 if(mb_type) // not direct mode |
1708 | 954 put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD); |
697 | 955 } |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
956 |
453 | 957 if(interleaved_stats){ |
1164 | 958 s->misc_bits+= get_bits_diff(s); |
453 | 959 } |
295 | 960 |
1708 | 961 if(mb_type == 0){ |
962 assert(s->mv_dir & MV_DIRECT); | |
2502 | 963 ff_h263_encode_motion_vector(s, motion_x, motion_y, 1); |
656
e47fa3e3f2d5
statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents:
654
diff
changeset
|
964 s->b_count++; |
e47fa3e3f2d5
statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents:
654
diff
changeset
|
965 s->f_count++; |
1708 | 966 }else{ |
967 assert(mb_type > 0 && mb_type < 4); | |
968 if(s->mv_type != MV_TYPE_FIELD){ | |
969 if(s->mv_dir & MV_DIR_FORWARD){ | |
2502 | 970 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - s->last_mv[0][0][0], |
971 s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code); | |
1708 | 972 s->last_mv[0][0][0]= s->last_mv[0][1][0]= s->mv[0][0][0]; |
973 s->last_mv[0][0][1]= s->last_mv[0][1][1]= s->mv[0][0][1]; | |
974 s->f_count++; | |
975 } | |
976 if(s->mv_dir & MV_DIR_BACKWARD){ | |
2502 | 977 ff_h263_encode_motion_vector(s, s->mv[1][0][0] - s->last_mv[1][0][0], |
978 s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code); | |
1708 | 979 s->last_mv[1][0][0]= s->last_mv[1][1][0]= s->mv[1][0][0]; |
980 s->last_mv[1][0][1]= s->last_mv[1][1][1]= s->mv[1][0][1]; | |
981 s->b_count++; | |
982 } | |
983 }else{ | |
984 if(s->mv_dir & MV_DIR_FORWARD){ | |
985 put_bits(&s->pb, 1, s->field_select[0][0]); | |
986 put_bits(&s->pb, 1, s->field_select[0][1]); | |
987 } | |
988 if(s->mv_dir & MV_DIR_BACKWARD){ | |
989 put_bits(&s->pb, 1, s->field_select[1][0]); | |
990 put_bits(&s->pb, 1, s->field_select[1][1]); | |
991 } | |
992 if(s->mv_dir & MV_DIR_FORWARD){ | |
993 for(i=0; i<2; i++){ | |
2502 | 994 ff_h263_encode_motion_vector(s, s->mv[0][i][0] - s->last_mv[0][i][0] , |
995 s->mv[0][i][1] - s->last_mv[0][i][1]/2, s->f_code); | |
1708 | 996 s->last_mv[0][i][0]= s->mv[0][i][0]; |
997 s->last_mv[0][i][1]= s->mv[0][i][1]*2; | |
998 } | |
999 s->f_count++; | |
1000 } | |
1001 if(s->mv_dir & MV_DIR_BACKWARD){ | |
1002 for(i=0; i<2; i++){ | |
2502 | 1003 ff_h263_encode_motion_vector(s, s->mv[1][i][0] - s->last_mv[1][i][0] , |
1004 s->mv[1][i][1] - s->last_mv[1][i][1]/2, s->b_code); | |
1708 | 1005 s->last_mv[1][i][0]= s->mv[1][i][0]; |
1006 s->last_mv[1][i][1]= s->mv[1][i][1]*2; | |
1007 } | |
1008 s->b_count++; | |
1009 } | |
1010 } | |
324 | 1011 } |
453 | 1012 |
1013 if(interleaved_stats){ | |
1164 | 1014 s->mv_bits+= get_bits_diff(s); |
453 | 1015 } |
295 | 1016 |
2502 | 1017 mpeg4_encode_blocks(s, block, NULL, NULL, NULL, &s->pb); |
453 | 1018 |
1019 if(interleaved_stats){ | |
1164 | 1020 s->p_tex_bits+= get_bits_diff(s); |
453 | 1021 } |
1708 | 1022 |
6481 | 1023 }else{ /* s->pict_type==FF_B_TYPE */ |
1490
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
1024 cbp= get_p_cbp(s, block, motion_x, motion_y); |
2967 | 1025 |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
1026 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) { |
2967 | 1027 /* check if the B frames can skip it too, as we must skip it if we skip here |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
1028 why didn't they just compress the skip-mb bits instead of reusing them ?! */ |
331 | 1029 if(s->max_b_frames>0){ |
1030 int i; | |
364
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
1031 int x,y, offset; |
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
1032 uint8_t *p_pic; |
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
1033 |
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
1034 x= s->mb_x*16; |
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
1035 y= s->mb_y*16; |
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
1036 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
|
1037 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
|
1038 |
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
1039 offset= x + y*s->linesize; |
903 | 1040 p_pic= s->new_picture.data[0] + offset; |
2967 | 1041 |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
1042 s->mb_skipped=1; |
331 | 1043 for(i=0; i<s->max_b_frames; i++){ |
339 | 1044 uint8_t *b_pic; |
1045 int diff; | |
903 | 1046 Picture *pic= s->reordered_input_picture[i+1]; |
1047 | |
6481 | 1048 if(pic==NULL || pic->pict_type!=FF_B_TYPE) break; |
903 | 1049 |
3068 | 1050 b_pic= pic->data[0] + offset; |
1051 if(pic->type != FF_BUFFER_TYPE_SHARED) | |
1052 b_pic+= INPLACE_OFFSET; | |
2979 | 1053 diff= s->dsp.sad[0](NULL, p_pic, b_pic, s->linesize, 16); |
364
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
1054 if(diff>s->qscale*70){ //FIXME check that 70 is optimal |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
1055 s->mb_skipped=0; |
331 | 1056 break; |
1057 } | |
1058 } | |
1059 }else | |
2967 | 1060 s->mb_skipped=1; |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
1061 |
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
1062 if(s->mb_skipped==1){ |
331 | 1063 /* skip macroblock */ |
1064 put_bits(&s->pb, 1, 1); | |
453 | 1065 |
1066 if(interleaved_stats){ | |
1067 s->misc_bits++; | |
1068 s->last_bits++; | |
1069 } | |
331 | 1070 s->skip_count++; |
2967 | 1071 |
331 | 1072 return; |
1073 } | |
295 | 1074 } |
364
6b6332e7008a
segfault fix for b-frame encoding with height%16!=0
michaelni
parents:
360
diff
changeset
|
1075 |
2979 | 1076 put_bits(&s->pb, 1, 0); /* mb coded */ |
1633 | 1077 cbpc = cbp & 3; |
1078 cbpy = cbp >> 2; | |
1079 cbpy ^= 0xf; | |
324 | 1080 if(s->mv_type==MV_TYPE_16X16){ |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
1081 if(s->dquant) cbpc+= 8; |
324 | 1082 put_bits(&s->pb, |
1083 inter_MCBPC_bits[cbpc], | |
1084 inter_MCBPC_code[cbpc]); | |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
1085 |
453 | 1086 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
|
1087 if(s->dquant) |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
1088 put_bits(pb2, 2, dquant_code[s->dquant+2]); |
697 | 1089 |
1090 if(!s->progressive_sequence){ | |
1091 if(cbp) | |
1092 put_bits(pb2, 1, s->interlaced_dct); | |
1708 | 1093 put_bits(pb2, 1, 0); |
697 | 1094 } |
2967 | 1095 |
453 | 1096 if(interleaved_stats){ |
1164 | 1097 s->misc_bits+= get_bits_diff(s); |
453 | 1098 } |
324 | 1099 |
1100 /* motion vectors: 16x16 mode */ | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
1101 h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
2967 | 1102 |
2502 | 1103 ff_h263_encode_motion_vector(s, motion_x - pred_x, |
1104 motion_y - pred_y, s->f_code); | |
1708 | 1105 }else if(s->mv_type==MV_TYPE_FIELD){ |
1106 if(s->dquant) cbpc+= 8; | |
1107 put_bits(&s->pb, | |
1108 inter_MCBPC_bits[cbpc], | |
1109 inter_MCBPC_code[cbpc]); | |
1110 | |
1111 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); | |
1112 if(s->dquant) | |
1113 put_bits(pb2, 2, dquant_code[s->dquant+2]); | |
1114 | |
1115 assert(!s->progressive_sequence); | |
1116 if(cbp) | |
1117 put_bits(pb2, 1, s->interlaced_dct); | |
1118 put_bits(pb2, 1, 1); | |
2967 | 1119 |
1708 | 1120 if(interleaved_stats){ |
1121 s->misc_bits+= get_bits_diff(s); | |
1122 } | |
1123 | |
1124 /* motion vectors: 16x8 interlaced mode */ | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
1125 h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
1708 | 1126 pred_y /=2; |
2967 | 1127 |
1708 | 1128 put_bits(&s->pb, 1, s->field_select[0][0]); |
1129 put_bits(&s->pb, 1, s->field_select[0][1]); | |
2967 | 1130 |
2502 | 1131 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - pred_x, |
1132 s->mv[0][0][1] - pred_y, s->f_code); | |
1133 ff_h263_encode_motion_vector(s, s->mv[0][1][0] - pred_x, | |
1134 s->mv[0][1][1] - pred_y, s->f_code); | |
324 | 1135 }else{ |
1708 | 1136 assert(s->mv_type==MV_TYPE_8X8); |
324 | 1137 put_bits(&s->pb, |
1633 | 1138 inter_MCBPC_bits[cbpc+16], |
1139 inter_MCBPC_code[cbpc+16]); | |
453 | 1140 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); |
1141 | |
757 | 1142 if(!s->progressive_sequence){ |
1143 if(cbp) | |
1144 put_bits(pb2, 1, s->interlaced_dct); | |
1145 } | |
2967 | 1146 |
453 | 1147 if(interleaved_stats){ |
1164 | 1148 s->misc_bits+= get_bits_diff(s); |
453 | 1149 } |
324 | 1150 |
1151 for(i=0; i<4; i++){ | |
1152 /* motion vectors: 8x8 mode*/ | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
1153 h263_pred_motion(s, i, 0, &pred_x, &pred_y); |
324 | 1154 |
2502 | 1155 ff_h263_encode_motion_vector(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x, |
1156 s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code); | |
324 | 1157 } |
1158 } | |
453 | 1159 |
2967 | 1160 if(interleaved_stats){ |
1164 | 1161 s->mv_bits+= get_bits_diff(s); |
453 | 1162 } |
324 | 1163 |
2502 | 1164 mpeg4_encode_blocks(s, block, NULL, NULL, NULL, tex_pb); |
453 | 1165 |
1166 if(interleaved_stats){ | |
1164 | 1167 s->p_tex_bits+= get_bits_diff(s); |
453 | 1168 } |
656
e47fa3e3f2d5
statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents:
654
diff
changeset
|
1169 s->f_count++; |
295 | 1170 } |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1171 } else { |
324 | 1172 int cbp; |
2967 | 1173 int dc_diff[6]; //dc values with the dc prediction subtracted |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1174 int dir[6]; //prediction direction |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1175 int zigzag_last_index[6]; |
2979 | 1176 uint8_t *scan_table[6]; |
1057 | 1177 int i; |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1178 |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1179 for(i=0; i<6; i++){ |
2003 | 1180 dc_diff[i]= ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1); |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1181 } |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1182 |
1492 | 1183 if(s->flags & CODEC_FLAG_AC_PRED){ |
1184 s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index); | |
1185 if(!s->ac_pred) | |
1186 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index); | |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1187 }else{ |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1188 for(i=0; i<6; i++) |
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
702
diff
changeset
|
1189 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
|
1190 } |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1191 |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1192 /* compute cbp */ |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1193 cbp = 0; |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1194 for (i = 0; i < 6; i++) { |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1195 if (s->block_last_index[i] >= 1) |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1196 cbp |= 1 << (5 - i); |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1197 } |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1198 |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1199 cbpc = cbp & 3; |
6481 | 1200 if (s->pict_type == FF_I_TYPE) { |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
1201 if(s->dquant) cbpc+=4; |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1202 put_bits(&s->pb, |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1203 intra_MCBPC_bits[cbpc], |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1204 intra_MCBPC_code[cbpc]); |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1205 } else { |
690
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
1206 if(s->dquant) cbpc+=8; |
2979 | 1207 put_bits(&s->pb, 1, 0); /* mb coded */ |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1208 put_bits(&s->pb, |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1209 inter_MCBPC_bits[cbpc + 4], |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1210 inter_MCBPC_code[cbpc + 4]); |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1211 } |
453 | 1212 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
|
1213 cbpy = cbp >> 2; |
453 | 1214 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
|
1215 if(s->dquant) |
a1c69cb685b3
adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents:
676
diff
changeset
|
1216 put_bits(dc_pb, 2, dquant_code[s->dquant+2]); |
453 | 1217 |
697 | 1218 if(!s->progressive_sequence){ |
1219 put_bits(dc_pb, 1, s->interlaced_dct); | |
1220 } | |
1221 | |
453 | 1222 if(interleaved_stats){ |
1164 | 1223 s->misc_bits+= get_bits_diff(s); |
453 | 1224 } |
286 | 1225 |
2502 | 1226 mpeg4_encode_blocks(s, block, dc_diff, scan_table, dc_pb, tex_pb); |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1227 |
453 | 1228 if(interleaved_stats){ |
1164 | 1229 s->i_tex_bits+= get_bits_diff(s); |
453 | 1230 } |
286 | 1231 s->i_count++; |
1232 | |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1233 /* restore ac coeffs & last_index stuff if we messed them up with the prediction */ |
1492 | 1234 if(s->ac_pred) |
1235 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index); | |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1236 } |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1237 } |
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
1238 |
10752
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1239 /** |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1240 * encodes a 8x8 block. |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1241 * @param block the 8x8 block |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1242 * @param n block index (0-3 are luma, 4-5 are chroma) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1243 */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1244 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1245 { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1246 int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1247 RLTable *rl; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1248 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1249 rl = &rl_inter; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1250 if (s->mb_intra && !s->h263_aic) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1251 /* DC coef */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1252 level = block[0]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1253 /* 255 cannot be represented, so we clamp */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1254 if (level > 254) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1255 level = 254; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1256 block[0] = 254; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1257 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1258 /* 0 cannot be represented also */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1259 else if (level < 1) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1260 level = 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1261 block[0] = 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1262 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1263 if (level == 128) //FIXME check rv10 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1264 put_bits(&s->pb, 8, 0xff); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1265 else |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1266 put_bits(&s->pb, 8, level); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1267 i = 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1268 } else { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1269 i = 0; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1270 if (s->h263_aic && s->mb_intra) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1271 rl = &rl_intra_aic; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1272 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1273 if(s->alt_inter_vlc && !s->mb_intra){ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1274 int aic_vlc_bits=0; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1275 int inter_vlc_bits=0; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1276 int wrong_pos=-1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1277 int aic_code; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1278 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1279 last_index = s->block_last_index[n]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1280 last_non_zero = i - 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1281 for (; i <= last_index; i++) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1282 j = s->intra_scantable.permutated[i]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1283 level = block[j]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1284 if (level) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1285 run = i - last_non_zero - 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1286 last = (i == last_index); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1287 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1288 if(level<0) level= -level; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1289 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1290 code = get_rl_index(rl, last, run, level); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1291 aic_code = get_rl_index(&rl_intra_aic, last, run, level); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1292 inter_vlc_bits += rl->table_vlc[code][1]+1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1293 aic_vlc_bits += rl_intra_aic.table_vlc[aic_code][1]+1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1294 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1295 if (code == rl->n) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1296 inter_vlc_bits += 1+6+8-1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1297 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1298 if (aic_code == rl_intra_aic.n) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1299 aic_vlc_bits += 1+6+8-1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1300 wrong_pos += run + 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1301 }else |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1302 wrong_pos += wrong_run[aic_code]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1303 last_non_zero = i; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1304 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1305 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1306 i = 0; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1307 if(aic_vlc_bits < inter_vlc_bits && wrong_pos > 63) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1308 rl = &rl_intra_aic; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1309 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1310 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1311 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1312 /* AC coefs */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1313 last_index = s->block_last_index[n]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1314 last_non_zero = i - 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1315 for (; i <= last_index; i++) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1316 j = s->intra_scantable.permutated[i]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1317 level = block[j]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1318 if (level) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1319 run = i - last_non_zero - 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1320 last = (i == last_index); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1321 sign = 0; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1322 slevel = level; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1323 if (level < 0) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1324 sign = 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1325 level = -level; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1326 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1327 code = get_rl_index(rl, last, run, level); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1328 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1329 if (code == rl->n) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1330 if(s->h263_flv <= 1){ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1331 put_bits(&s->pb, 1, last); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1332 put_bits(&s->pb, 6, run); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1333 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1334 assert(slevel != 0); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1335 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1336 if(level < 128) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1337 put_sbits(&s->pb, 8, slevel); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1338 else{ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1339 put_bits(&s->pb, 8, 128); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1340 put_sbits(&s->pb, 5, slevel); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1341 put_sbits(&s->pb, 6, slevel>>5); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1342 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1343 }else{ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1344 if(level < 64) { // 7-bit level |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1345 put_bits(&s->pb, 1, 0); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1346 put_bits(&s->pb, 1, last); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1347 put_bits(&s->pb, 6, run); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1348 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1349 put_sbits(&s->pb, 7, slevel); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1350 } else { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1351 /* 11-bit level */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1352 put_bits(&s->pb, 1, 1); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1353 put_bits(&s->pb, 1, last); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1354 put_bits(&s->pb, 6, run); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1355 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1356 put_sbits(&s->pb, 11, slevel); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1357 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1358 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1359 } else { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1360 put_bits(&s->pb, 1, sign); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1361 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1362 last_non_zero = i; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1363 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1364 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1365 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1366 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1367 /* Encode MV differences on H.263+ with Unrestricted MV mode */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1368 static void h263p_encode_umotion(MpegEncContext * s, int val) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1369 { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1370 short sval = 0; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1371 short i = 0; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1372 short n_bits = 0; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1373 short temp_val; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1374 int code = 0; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1375 int tcode; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1376 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1377 if ( val == 0) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1378 put_bits(&s->pb, 1, 1); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1379 else if (val == 1) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1380 put_bits(&s->pb, 3, 0); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1381 else if (val == -1) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1382 put_bits(&s->pb, 3, 2); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1383 else { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1384 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1385 sval = ((val < 0) ? (short)(-val):(short)val); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1386 temp_val = sval; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1387 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1388 while (temp_val != 0) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1389 temp_val = temp_val >> 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1390 n_bits++; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1391 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1392 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1393 i = n_bits - 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1394 while (i > 0) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1395 tcode = (sval & (1 << (i-1))) >> (i-1); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1396 tcode = (tcode << 1) | 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1397 code = (code << 2) | tcode; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1398 i--; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1399 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1400 code = ((code << 1) | (val < 0)) << 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1401 put_bits(&s->pb, (2*n_bits)+1, code); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1402 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1403 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1404 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1405 static int h263_pred_dc(MpegEncContext * s, int n, int16_t **dc_val_ptr) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1406 { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1407 int x, y, wrap, a, c, pred_dc; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1408 int16_t *dc_val; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1409 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1410 /* find prediction */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1411 if (n < 4) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1412 x = 2 * s->mb_x + (n & 1); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1413 y = 2 * s->mb_y + ((n & 2) >> 1); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1414 wrap = s->b8_stride; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1415 dc_val = s->dc_val[0]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1416 } else { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1417 x = s->mb_x; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1418 y = s->mb_y; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1419 wrap = s->mb_stride; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1420 dc_val = s->dc_val[n - 4 + 1]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1421 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1422 /* B C |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1423 * A X |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1424 */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1425 a = dc_val[(x - 1) + (y) * wrap]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1426 c = dc_val[(x) + (y - 1) * wrap]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1427 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1428 /* No prediction outside GOB boundary */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1429 if(s->first_slice_line && n!=3){ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1430 if(n!=2) c= 1024; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1431 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1432 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1433 /* just DC prediction */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1434 if (a != 1024 && c != 1024) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1435 pred_dc = (a + c) >> 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1436 else if (a != 1024) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1437 pred_dc = a; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1438 else |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1439 pred_dc = c; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1440 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1441 /* we assume pred is positive */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1442 *dc_val_ptr = &dc_val[x + y * wrap]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1443 return pred_dc; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1444 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
1445 |
0 | 1446 void h263_encode_mb(MpegEncContext * s, |
2979 | 1447 DCTELEM block[6][64], |
1448 int motion_x, int motion_y) | |
0 | 1449 { |
1450 int cbpc, cbpy, i, cbp, pred_x, pred_y; | |
1064 | 1451 int16_t pred_dc; |
1452 int16_t rec_intradc[6]; | |
3781 | 1453 int16_t *dc_ptr[6]; |
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1454 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1); |
2967 | 1455 |
324 | 1456 if (!s->mb_intra) { |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1457 /* compute cbp */ |
1490
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
1458 cbp= get_p_cbp(s, block, motion_x, motion_y); |
0355f2b3519a
rate distortion optimal cbp support (h263/mpeg4 non intra only)
michaelni
parents:
1483
diff
changeset
|
1459 |
1789 | 1460 if ((cbp | motion_x | motion_y | s->dquant | (s->mv_type - MV_TYPE_16X16)) == 0) { |
324 | 1461 /* skip macroblock */ |
1462 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
|
1463 if(interleaved_stats){ |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1464 s->misc_bits++; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1465 s->last_bits++; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1466 } |
1757
3906ddbaffec
optimization & bugfix extracted from the 4k line diff between ffmpeg 0.4.7 and http://www.alicestreet.com/ffh263.html
michael
parents:
1752
diff
changeset
|
1467 s->skip_count++; |
3906ddbaffec
optimization & bugfix extracted from the 4k line diff between ffmpeg 0.4.7 and http://www.alicestreet.com/ffh263.html
michael
parents:
1752
diff
changeset
|
1468 |
324 | 1469 return; |
1470 } | |
2979 | 1471 put_bits(&s->pb, 1, 0); /* mb coded */ |
2967 | 1472 |
324 | 1473 cbpc = cbp & 3; |
1637 | 1474 cbpy = cbp >> 2; |
1475 if(s->alt_inter_vlc==0 || cbpc!=3) | |
1476 cbpy ^= 0xF; | |
695 | 1477 if(s->dquant) cbpc+= 8; |
1633 | 1478 if(s->mv_type==MV_TYPE_16X16){ |
1479 put_bits(&s->pb, | |
1480 inter_MCBPC_bits[cbpc], | |
1481 inter_MCBPC_code[cbpc]); | |
1482 | |
1483 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); | |
1484 if(s->dquant) | |
1485 put_bits(&s->pb, 2, dquant_code[s->dquant+2]); | |
2967 | 1486 |
1633 | 1487 if(interleaved_stats){ |
1488 s->misc_bits+= get_bits_diff(s); | |
1489 } | |
1490 | |
1491 /* motion vectors: 16x16 mode */ | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
1492 h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
2967 | 1493 |
1494 if (!s->umvplus) { | |
2502 | 1495 ff_h263_encode_motion_vector(s, motion_x - pred_x, |
1496 motion_y - pred_y, 1); | |
1633 | 1497 } |
1498 else { | |
1499 h263p_encode_umotion(s, motion_x - pred_x); | |
1500 h263p_encode_umotion(s, motion_y - pred_y); | |
1501 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1)) | |
1502 /* To prevent Start Code emulation */ | |
1503 put_bits(&s->pb,1,1); | |
1504 } | |
1505 }else{ | |
1506 put_bits(&s->pb, | |
1507 inter_MCBPC_bits[cbpc+16], | |
1508 inter_MCBPC_code[cbpc+16]); | |
1509 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); | |
1510 if(s->dquant) | |
1511 put_bits(&s->pb, 2, dquant_code[s->dquant+2]); | |
1512 | |
1513 if(interleaved_stats){ | |
1514 s->misc_bits+= get_bits_diff(s); | |
1515 } | |
1516 | |
1517 for(i=0; i<4; i++){ | |
1518 /* motion vectors: 8x8 mode*/ | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
1519 h263_pred_motion(s, i, 0, &pred_x, &pred_y); |
1633 | 1520 |
1668
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1666
diff
changeset
|
1521 motion_x= s->current_picture.motion_val[0][ s->block_index[i] ][0]; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1666
diff
changeset
|
1522 motion_y= s->current_picture.motion_val[0][ s->block_index[i] ][1]; |
2967 | 1523 if (!s->umvplus) { |
2502 | 1524 ff_h263_encode_motion_vector(s, motion_x - pred_x, |
1525 motion_y - pred_y, 1); | |
1633 | 1526 } |
1527 else { | |
1528 h263p_encode_umotion(s, motion_x - pred_x); | |
1529 h263p_encode_umotion(s, motion_y - pred_y); | |
1530 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1)) | |
1531 /* To prevent Start Code emulation */ | |
1532 put_bits(&s->pb,1,1); | |
1533 } | |
1534 } | |
324 | 1535 } |
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1536 |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1537 if(interleaved_stats){ |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1538 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
|
1539 } |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1540 } else { |
1639 | 1541 assert(s->mb_intra); |
2967 | 1542 |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1543 cbp = 0; |
1666 | 1544 if (s->h263_aic) { |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1545 /* Predict DC */ |
1666 | 1546 for(i=0; i<6; i++) { |
1064 | 1547 int16_t level = block[i][0]; |
1666 | 1548 int scale; |
2967 | 1549 |
1666 | 1550 if(i<4) scale= s->y_dc_scale; |
1551 else scale= s->c_dc_scale; | |
1552 | |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1553 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
|
1554 level -= pred_dc; |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1555 /* Quant */ |
1666 | 1556 if (level >= 0) |
1557 level = (level + (scale>>1))/scale; | |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1558 else |
1666 | 1559 level = (level - (scale>>1))/scale; |
2967 | 1560 |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1561 /* AIC can change CBP */ |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1562 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
|
1563 s->block_last_index[i] = -1; |
1666 | 1564 |
1565 if(!s->modified_quant){ | |
1566 if (level < -127) | |
1567 level = -127; | |
1568 else if (level > 127) | |
1569 level = 127; | |
1570 } | |
1571 | |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1572 block[i][0] = level; |
2967 | 1573 /* Reconstruction */ |
1666 | 1574 rec_intradc[i] = scale*level + pred_dc; |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1575 /* Oddify */ |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1576 rec_intradc[i] |= 1; |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1577 //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
|
1578 // rec_intradc[i]++; |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1579 /* Clipping */ |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1580 if (rec_intradc[i] < 0) |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1581 rec_intradc[i] = 0; |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1582 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
|
1583 rec_intradc[i] = 2047; |
2967 | 1584 |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1585 /* Update AC/DC tables */ |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1586 *dc_ptr[i] = rec_intradc[i]; |
1666 | 1587 if (s->block_last_index[i] >= 0) |
1588 cbp |= 1 << (5 - i); | |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1589 } |
1666 | 1590 }else{ |
1591 for(i=0; i<6; i++) { | |
1592 /* compute cbp */ | |
1593 if (s->block_last_index[i] >= 1) | |
1594 cbp |= 1 << (5 - i); | |
1595 } | |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1596 } |
0 | 1597 |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1598 cbpc = cbp & 3; |
6481 | 1599 if (s->pict_type == FF_I_TYPE) { |
695 | 1600 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
|
1601 put_bits(&s->pb, |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1602 intra_MCBPC_bits[cbpc], |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1603 intra_MCBPC_code[cbpc]); |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1604 } else { |
695 | 1605 if(s->dquant) cbpc+=8; |
2979 | 1606 put_bits(&s->pb, 1, 0); /* mb coded */ |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1607 put_bits(&s->pb, |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1608 inter_MCBPC_bits[cbpc + 4], |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1609 inter_MCBPC_code[cbpc + 4]); |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1610 } |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1611 if (s->h263_aic) { |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1612 /* XXX: currently, we do not try to use ac prediction */ |
2979 | 1613 put_bits(&s->pb, 1, 0); /* no AC prediction */ |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1614 } |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1615 cbpy = cbp >> 2; |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1616 put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); |
695 | 1617 if(s->dquant) |
1618 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
|
1619 |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1620 if(interleaved_stats){ |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1621 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
|
1622 } |
0 | 1623 } |
1624 | |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1625 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
|
1626 /* encode each block */ |
1354 | 1627 h263_encode_block(s, block[i], i); |
2967 | 1628 |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1629 /* Update INTRADC for decoding */ |
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1630 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
|
1631 block[i][0] = rec_intradc[i]; |
2967 | 1632 |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1633 } |
0 | 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 if(interleaved_stats){ |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1637 if (!s->mb_intra) { |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1638 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
|
1639 s->f_count++; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1640 }else{ |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1641 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
|
1642 s->i_count++; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1643 } |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
1644 } |
0 | 1645 } |
815
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
1646 #endif |
0 | 1647 |
1656 | 1648 void ff_h263_loop_filter(MpegEncContext * s){ |
1644 | 1649 int qp_c; |
1650 const int linesize = s->linesize; | |
1651 const int uvlinesize= s->uvlinesize; | |
1652 const int xy = s->mb_y * s->mb_stride + s->mb_x; | |
1653 uint8_t *dest_y = s->dest[0]; | |
1654 uint8_t *dest_cb= s->dest[1]; | |
1655 uint8_t *dest_cr= s->dest[2]; | |
2967 | 1656 |
6481 | 1657 // if(s->pict_type==FF_B_TYPE && !s->readable) return; |
1644 | 1658 |
1659 /* | |
1660 Diag Top | |
1661 Left Center | |
1662 */ | |
1663 if(!IS_SKIP(s->current_picture.mb_type[xy])){ | |
1664 qp_c= s->qscale; | |
1665 s->dsp.h263_v_loop_filter(dest_y+8*linesize , linesize, qp_c); | |
1666 s->dsp.h263_v_loop_filter(dest_y+8*linesize+8, linesize, qp_c); | |
1667 }else | |
1668 qp_c= 0; | |
1669 | |
1670 if(s->mb_y){ | |
8297
20e0f0809b27
s/qp_t/qp_tt/ to avoid bad examples that could lead to issues with reserved
michael
parents:
8288
diff
changeset
|
1671 int qp_dt, qp_tt, qp_tc; |
1644 | 1672 |
1673 if(IS_SKIP(s->current_picture.mb_type[xy-s->mb_stride])) | |
8297
20e0f0809b27
s/qp_t/qp_tt/ to avoid bad examples that could lead to issues with reserved
michael
parents:
8288
diff
changeset
|
1674 qp_tt=0; |
2967 | 1675 else |
8297
20e0f0809b27
s/qp_t/qp_tt/ to avoid bad examples that could lead to issues with reserved
michael
parents:
8288
diff
changeset
|
1676 qp_tt= s->current_picture.qscale_table[xy-s->mb_stride]; |
1644 | 1677 |
2967 | 1678 if(qp_c) |
1644 | 1679 qp_tc= qp_c; |
1680 else | |
8297
20e0f0809b27
s/qp_t/qp_tt/ to avoid bad examples that could lead to issues with reserved
michael
parents:
8288
diff
changeset
|
1681 qp_tc= qp_tt; |
2967 | 1682 |
1644 | 1683 if(qp_tc){ |
1684 const int chroma_qp= s->chroma_qscale_table[qp_tc]; | |
1685 s->dsp.h263_v_loop_filter(dest_y , linesize, qp_tc); | |
1686 s->dsp.h263_v_loop_filter(dest_y+8, linesize, qp_tc); | |
2967 | 1687 |
1644 | 1688 s->dsp.h263_v_loop_filter(dest_cb , uvlinesize, chroma_qp); |
1689 s->dsp.h263_v_loop_filter(dest_cr , uvlinesize, chroma_qp); | |
1690 } | |
2967 | 1691 |
8297
20e0f0809b27
s/qp_t/qp_tt/ to avoid bad examples that could lead to issues with reserved
michael
parents:
8288
diff
changeset
|
1692 if(qp_tt) |
20e0f0809b27
s/qp_t/qp_tt/ to avoid bad examples that could lead to issues with reserved
michael
parents:
8288
diff
changeset
|
1693 s->dsp.h263_h_loop_filter(dest_y-8*linesize+8 , linesize, qp_tt); |
2967 | 1694 |
1644 | 1695 if(s->mb_x){ |
8297
20e0f0809b27
s/qp_t/qp_tt/ to avoid bad examples that could lead to issues with reserved
michael
parents:
8288
diff
changeset
|
1696 if(qp_tt || IS_SKIP(s->current_picture.mb_type[xy-1-s->mb_stride])) |
20e0f0809b27
s/qp_t/qp_tt/ to avoid bad examples that could lead to issues with reserved
michael
parents:
8288
diff
changeset
|
1697 qp_dt= qp_tt; |
1644 | 1698 else |
1699 qp_dt= s->current_picture.qscale_table[xy-1-s->mb_stride]; | |
2967 | 1700 |
1644 | 1701 if(qp_dt){ |
1702 const int chroma_qp= s->chroma_qscale_table[qp_dt]; | |
1703 s->dsp.h263_h_loop_filter(dest_y -8*linesize , linesize, qp_dt); | |
1704 s->dsp.h263_h_loop_filter(dest_cb-8*uvlinesize, uvlinesize, chroma_qp); | |
2178 | 1705 s->dsp.h263_h_loop_filter(dest_cr-8*uvlinesize, uvlinesize, chroma_qp); |
1644 | 1706 } |
1707 } | |
1708 } | |
1709 | |
1710 if(qp_c){ | |
1711 s->dsp.h263_h_loop_filter(dest_y +8, linesize, qp_c); | |
1712 if(s->mb_y + 1 == s->mb_height) | |
1713 s->dsp.h263_h_loop_filter(dest_y+8*linesize+8, linesize, qp_c); | |
1714 } | |
2967 | 1715 |
1644 | 1716 if(s->mb_x){ |
1717 int qp_lc; | |
1718 if(qp_c || IS_SKIP(s->current_picture.mb_type[xy-1])) | |
1719 qp_lc= qp_c; | |
1720 else | |
1721 qp_lc= s->current_picture.qscale_table[xy-1]; | |
2967 | 1722 |
1644 | 1723 if(qp_lc){ |
1724 s->dsp.h263_h_loop_filter(dest_y, linesize, qp_lc); | |
1725 if(s->mb_y + 1 == s->mb_height){ | |
1726 const int chroma_qp= s->chroma_qscale_table[qp_lc]; | |
1727 s->dsp.h263_h_loop_filter(dest_y +8* linesize, linesize, qp_lc); | |
1728 s->dsp.h263_h_loop_filter(dest_cb , uvlinesize, chroma_qp); | |
1729 s->dsp.h263_h_loop_filter(dest_cr , uvlinesize, chroma_qp); | |
1730 } | |
1731 } | |
1732 } | |
1733 } | |
1734 | |
1057 | 1735 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
|
1736 { |
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1737 int x, y, wrap, a, c, pred_dc, scale, i; |
3781 | 1738 int16_t *dc_val, *ac_val, *ac_val1; |
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1739 |
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1740 /* find prediction */ |
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1741 if (n < 4) { |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
1742 x = 2 * s->mb_x + (n & 1); |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
1743 y = 2 * s->mb_y + (n>> 1); |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
1744 wrap = s->b8_stride; |
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1745 dc_val = s->dc_val[0]; |
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1746 ac_val = s->ac_val[0][0]; |
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1747 scale = s->y_dc_scale; |
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1748 } else { |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
1749 x = s->mb_x; |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
1750 y = s->mb_y; |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
1751 wrap = s->mb_stride; |
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1752 dc_val = s->dc_val[n - 4 + 1]; |
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1753 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
|
1754 scale = s->c_dc_scale; |
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1755 } |
2967 | 1756 |
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1757 ac_val += ((y) * wrap + (x)) * 16; |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1758 ac_val1 = ac_val; |
2967 | 1759 |
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1760 /* B C |
2967 | 1761 * A X |
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1762 */ |
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1763 a = dc_val[(x - 1) + (y) * wrap]; |
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1764 c = dc_val[(x) + (y - 1) * wrap]; |
2967 | 1765 |
350
6ebbecc10063
- Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents:
346
diff
changeset
|
1766 /* No prediction outside GOB boundary */ |
1639 | 1767 if(s->first_slice_line && n!=3){ |
1768 if(n!=2) c= 1024; | |
1769 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024; | |
1770 } | |
2967 | 1771 |
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1772 if (s->ac_pred) { |
1639 | 1773 pred_dc = 1024; |
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1774 if (s->h263_aic_dir) { |
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1775 /* left prediction */ |
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1776 if (a != 1024) { |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1777 ac_val -= 16; |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1778 for(i=1;i<8;i++) { |
1092 | 1779 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
|
1780 } |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1781 pred_dc = a; |
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1782 } |
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1783 } else { |
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1784 /* top prediction */ |
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1785 if (c != 1024) { |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1786 ac_val -= 16 * wrap; |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1787 for(i=1;i<8;i++) { |
1092 | 1788 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
|
1789 } |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1790 pred_dc = c; |
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1791 } |
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1792 } |
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1793 } else { |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1794 /* just DC prediction */ |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1795 if (a != 1024 && c != 1024) |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1796 pred_dc = (a + c) >> 1; |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1797 else if (a != 1024) |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1798 pred_dc = a; |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1799 else |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1800 pred_dc = c; |
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1801 } |
2967 | 1802 |
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1803 /* we assume pred is positive */ |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1804 block[0]=block[0]*scale + pred_dc; |
2967 | 1805 |
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1806 if (block[0] < 0) |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1807 block[0] = 0; |
2967 | 1808 else |
1639 | 1809 block[0] |= 1; |
2967 | 1810 |
249
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1811 /* Update AC/DC tables */ |
42a0b7b16738
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents:
248
diff
changeset
|
1812 dc_val[(x) + (y) * wrap] = block[0]; |
2967 | 1813 |
248
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1814 /* left copy */ |
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1815 for(i=1;i<8;i++) |
1092 | 1816 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
|
1817 /* top copy */ |
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1818 for(i=1;i<8;i++) |
1092 | 1819 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
|
1820 } |
56ee684c48bb
- H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents:
245
diff
changeset
|
1821 |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
1822 int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir, |
0 | 1823 int *px, int *py) |
1824 { | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
1825 int wrap; |
1655 | 1826 int16_t *A, *B, *C, (*mot_val)[2]; |
1827 static const int off[4]= {2, 1, 1, -1}; | |
1828 | |
1829 wrap = s->b8_stride; | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
1830 mot_val = s->current_picture.motion_val[dir] + s->block_index[block]; |
1655 | 1831 |
1832 A = mot_val[ - 1]; | |
1833 /* special case for first (slice) line */ | |
1834 if (s->first_slice_line && block<3) { | |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
1835 // we can't just change some MVs to simulate that as we need them for the B frames (and ME) |
1655 | 1836 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :( |
1837 if(block==0){ //most common case | |
1838 if(s->mb_x == s->resync_mb_x){ //rare | |
1839 *px= *py = 0; | |
1840 }else if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare | |
1841 C = mot_val[off[block] - wrap]; | |
1842 if(s->mb_x==0){ | |
1843 *px = C[0]; | |
1844 *py = C[1]; | |
1845 }else{ | |
1846 *px = mid_pred(A[0], 0, C[0]); | |
1847 *py = mid_pred(A[1], 0, C[1]); | |
1848 } | |
1849 }else{ | |
1850 *px = A[0]; | |
1851 *py = A[1]; | |
1852 } | |
1853 }else if(block==1){ | |
1854 if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare | |
1855 C = mot_val[off[block] - wrap]; | |
1856 *px = mid_pred(A[0], 0, C[0]); | |
1857 *py = mid_pred(A[1], 0, C[1]); | |
1858 }else{ | |
1859 *px = A[0]; | |
1860 *py = A[1]; | |
1861 } | |
1862 }else{ /* block==2*/ | |
1863 B = mot_val[ - wrap]; | |
1864 C = mot_val[off[block] - wrap]; | |
1865 if(s->mb_x == s->resync_mb_x) //rare | |
1866 A[0]=A[1]=0; | |
2967 | 1867 |
1655 | 1868 *px = mid_pred(A[0], B[0], C[0]); |
1869 *py = mid_pred(A[1], B[1], C[1]); | |
1870 } | |
1871 } else { | |
1872 B = mot_val[ - wrap]; | |
1873 C = mot_val[off[block] - wrap]; | |
1874 *px = mid_pred(A[0], B[0], C[0]); | |
1875 *py = mid_pred(A[1], B[1], C[1]); | |
1876 } | |
1877 return *mot_val; | |
1878 } | |
1879 | |
8590 | 1880 #if CONFIG_ENCODERS |
2017 | 1881 void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code) |
0 | 1882 { |
702 | 1883 int range, l, bit_size, sign, code, bits; |
0 | 1884 |
1885 if (val == 0) { | |
1886 /* zero vector */ | |
1887 code = 0; | |
1888 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]); | |
1889 } else { | |
324 | 1890 bit_size = f_code - 1; |
0 | 1891 range = 1 << bit_size; |
1892 /* modulo encoding */ | |
2093 | 1893 l= INT_BIT - 6 - bit_size; |
1894 val = (val<<l)>>l; | |
702 | 1895 sign = val>>31; |
1896 val= (val^sign)-sign; | |
1897 sign&=1; | |
2093 | 1898 |
312 | 1899 val--; |
1900 code = (val >> bit_size) + 1; | |
1901 bits = val & (range - 1); | |
0 | 1902 |
2967 | 1903 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign); |
0 | 1904 if (bit_size > 0) { |
1905 put_bits(&s->pb, bit_size, bits); | |
1906 } | |
1907 } | |
1908 } | |
1909 | |
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1910 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
|
1911 { |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1912 int f_code; |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1913 int mv; |
2967 | 1914 |
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1915 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
|
1916 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
|
1917 int len; |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1918 |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1919 if(mv==0) len= mvtab[0][1]; |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1920 else{ |
9465
9dcb191f1df3
Remove unused variable in init_mv_penalty_and_fcode() found by CSA.
michael
parents:
9458
diff
changeset
|
1921 int val, bit_size, code; |
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1922 |
1893
779bdf5063ce
1000000l (using uninitalized variable for initalizing bits per MV table)
michael
parents:
1873
diff
changeset
|
1923 bit_size = f_code - 1; |
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1924 |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1925 val=mv; |
2967 | 1926 if (val < 0) |
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1927 val = -val; |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1928 val--; |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1929 code = (val >> bit_size) + 1; |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1930 if(code<33){ |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1931 len= mvtab[code][1] + 1 + bit_size; |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1932 }else{ |
2985 | 1933 len= mvtab[32][1] + av_log2(code>>5) + 2 + bit_size; |
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1934 } |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1935 } |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1936 |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1937 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
|
1938 } |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1939 } |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1940 |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1941 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
|
1942 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
|
1943 fcode_tab[mv+MAX_MV]= f_code; |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1944 } |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1945 } |
287 | 1946 |
1947 for(mv=0; mv<MAX_MV*2+1; mv++){ | |
1948 umv_fcode_tab[mv]= 1; | |
1949 } | |
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
1950 } |
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
|
1951 |
468 | 1952 static void init_uni_dc_tab(void) |
293 | 1953 { |
1954 int level, uni_code, uni_len; | |
1955 | |
312 | 1956 for(level=-256; level<256; level++){ |
293 | 1957 int size, v, l; |
1958 /* find number of bits */ | |
1959 size = 0; | |
1960 v = abs(level); | |
1961 while (v) { | |
1962 v >>= 1; | |
2979 | 1963 size++; |
293 | 1964 } |
1965 | |
1966 if (level < 0) | |
1967 l= (-level) ^ ((1 << size) - 1); | |
1968 else | |
1969 l= level; | |
1970 | |
1971 /* luminance */ | |
1972 uni_code= DCtab_lum[size][0]; | |
1973 uni_len = DCtab_lum[size][1]; | |
1974 | |
1975 if (size > 0) { | |
1976 uni_code<<=size; uni_code|=l; | |
1977 uni_len+=size; | |
1978 if (size > 8){ | |
1979 uni_code<<=1; uni_code|=1; | |
1980 uni_len++; | |
1981 } | |
1982 } | |
1013 | 1983 uni_DCtab_lum_bits[level+256]= uni_code; |
1984 uni_DCtab_lum_len [level+256]= uni_len; | |
293 | 1985 |
1986 /* chrominance */ | |
1987 uni_code= DCtab_chrom[size][0]; | |
1988 uni_len = DCtab_chrom[size][1]; | |
2967 | 1989 |
293 | 1990 if (size > 0) { |
1991 uni_code<<=size; uni_code|=l; | |
1992 uni_len+=size; | |
1993 if (size > 8){ | |
1994 uni_code<<=1; uni_code|=1; | |
1995 uni_len++; | |
1996 } | |
1997 } | |
1013 | 1998 uni_DCtab_chrom_bits[level+256]= uni_code; |
1999 uni_DCtab_chrom_len [level+256]= uni_len; | |
293 | 2000 |
2001 } | |
2002 } | |
2003 | |
1064 | 2004 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
|
2005 int slevel, run, last; |
2967 | 2006 |
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
|
2007 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
|
2008 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
|
2009 |
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
|
2010 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
|
2011 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
|
2012 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
|
2013 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
|
2014 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
|
2015 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
|
2016 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
|
2017 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
|
2018 int level1, run1; |
2967 | 2019 |
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
|
2020 len_tab[index]= 100; |
2967 | 2021 |
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
|
2022 /* 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
|
2023 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
|
2024 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
|
2025 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
|
2026 bits=bits*2+sign; len++; |
2967 | 2027 |
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
|
2028 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
|
2029 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
|
2030 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
|
2031 } |
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
|
2032 /* 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
|
2033 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
|
2034 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
|
2035 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
|
2036 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
|
2037 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
|
2038 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
|
2039 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
|
2040 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
|
2041 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
|
2042 bits=bits*2+sign; len++; |
2967 | 2043 |
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
|
2044 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
|
2045 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
|
2046 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
|
2047 } |
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
|
2048 } |
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
|
2049 /* 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
|
2050 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
|
2051 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
|
2052 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
|
2053 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
|
2054 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
|
2055 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
|
2056 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
|
2057 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
|
2058 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
|
2059 bits=bits*2+sign; len++; |
2967 | 2060 |
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
|
2061 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
|
2062 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
|
2063 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
|
2064 } |
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
|
2065 } |
2967 | 2066 /* ESC3 */ |
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
|
2067 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
|
2068 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
|
2069 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
|
2070 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
|
2071 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
|
2072 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
|
2073 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
|
2074 bits=bits*2+1; len++; //marker |
2967 | 2075 |
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
|
2076 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
|
2077 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
|
2078 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
|
2079 } |
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
|
2080 } |
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
|
2081 } |
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
|
2082 } |
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
|
2083 } |
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
|
2084 |
2253 | 2085 static void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){ |
2086 int slevel, run, last; | |
2967 | 2087 |
2253 | 2088 assert(MAX_LEVEL >= 64); |
2089 assert(MAX_RUN >= 63); | |
2090 | |
2091 for(slevel=-64; slevel<64; slevel++){ | |
2092 if(slevel==0) continue; | |
2093 for(run=0; run<64; run++){ | |
2094 for(last=0; last<=1; last++){ | |
2095 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64); | |
2096 int level= slevel < 0 ? -slevel : slevel; | |
2097 int sign= slevel < 0 ? 1 : 0; | |
2098 int bits, len, code; | |
2967 | 2099 |
2253 | 2100 len_tab[index]= 100; |
2967 | 2101 |
2253 | 2102 /* ESC0 */ |
2103 code= get_rl_index(rl, last, run, level); | |
2104 bits= rl->table_vlc[code][0]; | |
2105 len= rl->table_vlc[code][1]; | |
2106 bits=bits*2+sign; len++; | |
2967 | 2107 |
2253 | 2108 if(code!=rl->n && len < len_tab[index]){ |
2109 if(bits_tab) bits_tab[index]= bits; | |
2110 len_tab [index]= len; | |
2111 } | |
2112 /* ESC */ | |
2113 bits= rl->table_vlc[rl->n][0]; | |
2114 len = rl->table_vlc[rl->n][1]; | |
2115 bits=bits*2+last; len++; | |
2116 bits=bits*64+run; len+=6; | |
2117 bits=bits*256+(level&0xff); len+=8; | |
2967 | 2118 |
2253 | 2119 if(len < len_tab[index]){ |
2120 if(bits_tab) bits_tab[index]= bits; | |
2121 len_tab [index]= len; | |
2122 } | |
2123 } | |
2124 } | |
2125 } | |
2126 } | |
2127 | |
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
2128 void h263_encode_init(MpegEncContext *s) |
0 | 2129 { |
2130 static int done = 0; | |
2131 | |
2132 if (!done) { | |
2133 done = 1; | |
293 | 2134 |
2135 init_uni_dc_tab(); | |
2136 | |
4668 | 2137 init_rl(&rl_inter, static_rl_table_store[0]); |
2138 init_rl(&rl_intra, static_rl_table_store[1]); | |
2139 init_rl(&rl_intra_aic, static_rl_table_store[2]); | |
2967 | 2140 |
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
|
2141 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
|
2142 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
|
2143 |
2253 | 2144 init_uni_h263_rl_tab(&rl_intra_aic, NULL, uni_h263_intra_aic_rl_len); |
2145 init_uni_h263_rl_tab(&rl_inter , NULL, uni_h263_inter_rl_len); | |
2146 | |
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
274
diff
changeset
|
2147 init_mv_penalty_and_fcode(s); |
0 | 2148 } |
936 | 2149 s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p |
2967 | 2150 |
2253 | 2151 s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len; |
2152 s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64; | |
2153 if(s->h263_aic){ | |
2154 s->intra_ac_vlc_length = uni_h263_intra_aic_rl_len; | |
2155 s->intra_ac_vlc_last_length= uni_h263_intra_aic_rl_len + 128*64; | |
2156 } | |
2157 s->ac_esc_length= 7+1+6+8; | |
2158 | |
287 | 2159 // use fcodes >1 only for mpeg4 & h263 & h263p FIXME |
344 | 2160 switch(s->codec_id){ |
2161 case CODEC_ID_MPEG4: | |
2162 s->fcode_tab= fcode_tab; | |
2163 s->min_qcoeff= -2048; | |
2164 s->max_qcoeff= 2047; | |
945 | 2165 s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len; |
2166 s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64; | |
2167 s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len; | |
2168 s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64; | |
1013 | 2169 s->luma_dc_vlc_length= uni_DCtab_lum_len; |
2170 s->chroma_dc_vlc_length= uni_DCtab_chrom_len; | |
945 | 2171 s->ac_esc_length= 7+2+1+6+1+12+1; |
1799 | 2172 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; |
2173 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table; | |
2174 | |
1424 | 2175 if(s->flags & CODEC_FLAG_GLOBAL_HEADER){ |
1483 | 2176 |
1424 | 2177 s->avctx->extradata= av_malloc(1024); |
1522
79dddc5cd990
removed the obsolete and unused parameters of init_put_bits
alex
parents:
1521
diff
changeset
|
2178 init_put_bits(&s->pb, s->avctx->extradata, 1024); |
2967 | 2179 |
2572
c22ad129a91b
support omiting various headers in mpeg4 as WMP seems to have difficulty with them
michael
parents:
2554
diff
changeset
|
2180 if(!(s->workaround_bugs & FF_BUG_MS)) |
c22ad129a91b
support omiting various headers in mpeg4 as WMP seems to have difficulty with them
michael
parents:
2554
diff
changeset
|
2181 mpeg4_encode_visual_object_header(s); |
1424 | 2182 mpeg4_encode_vol_header(s, 0, 0); |
2183 | |
2184 // ff_mpeg4_stuffing(&s->pb); ? | |
2185 flush_put_bits(&s->pb); | |
1786 | 2186 s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3; |
1424 | 2187 } |
2967 | 2188 |
344 | 2189 break; |
2190 case CODEC_ID_H263P: | |
1666 | 2191 if(s->umvplus) |
2192 s->fcode_tab= umv_fcode_tab; | |
2193 if(s->modified_quant){ | |
2194 s->min_qcoeff= -2047; | |
2195 s->max_qcoeff= 2047; | |
2196 }else{ | |
2197 s->min_qcoeff= -127; | |
2198 s->max_qcoeff= 127; | |
2199 } | |
344 | 2200 break; |
2967 | 2201 //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
|
2202 case CODEC_ID_FLV1: |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
2203 if (s->h263_flv > 1) { |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
2204 s->min_qcoeff= -1023; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
2205 s->max_qcoeff= 1023; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
2206 } else { |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
2207 s->min_qcoeff= -127; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
2208 s->max_qcoeff= 127; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
2209 } |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
2210 s->y_dc_scale_table= |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
2211 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
|
2212 break; |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
2213 default: //nothing needed - default table already set in mpegvideo.c |
1089 | 2214 s->min_qcoeff= -127; |
344 | 2215 s->max_qcoeff= 127; |
498 | 2216 s->y_dc_scale_table= |
2217 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; | |
344 | 2218 } |
0 | 2219 } |
2220 | |
2221 /***************************************************/ | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2222 /** |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2223 * add mpeg4 stuffing bits (01...1) |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2224 */ |
453 | 2225 void ff_mpeg4_stuffing(PutBitContext * pbc) |
262 | 2226 { |
2227 int length; | |
2228 put_bits(pbc, 1, 0); | |
1786 | 2229 length= (-put_bits_count(pbc))&7; |
453 | 2230 if(length) put_bits(pbc, length, (1<<length)-1); |
262 | 2231 } |
2232 | |
327 | 2233 /* must be called before writing the header */ |
5273
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5268
diff
changeset
|
2234 void ff_set_mpeg4_time(MpegEncContext * s){ |
6481 | 2235 if(s->pict_type==FF_B_TYPE){ |
3247 | 2236 ff_mpeg4_init_direct_mv(s); |
327 | 2237 }else{ |
2238 s->last_time_base= s->time_base; | |
5273
101f20612a94
Split ff_set_mpeg4_time() and move the non mpeg4 specific part
aurel
parents:
5268
diff
changeset
|
2239 s->time_base= s->time/s->avctx->time_base.den; |
327 | 2240 } |
2241 } | |
2242 | |
942 | 2243 static void mpeg4_encode_gop_header(MpegEncContext * s){ |
2244 int hours, minutes, seconds; | |
1763
951403db901f
first coded vs. first displayed pts (segfault & pts fix if b frames are used)
michael
parents:
1760
diff
changeset
|
2245 int64_t time; |
2967 | 2246 |
942 | 2247 put_bits(&s->pb, 16, 0); |
2248 put_bits(&s->pb, 16, GOP_STARTCODE); | |
2967 | 2249 |
1831
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1829
diff
changeset
|
2250 time= s->current_picture_ptr->pts; |
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1829
diff
changeset
|
2251 if(s->reordered_input_picture[1]) |
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1829
diff
changeset
|
2252 time= FFMIN(time, s->reordered_input_picture[1]->pts); |
2637 | 2253 time= time*s->avctx->time_base.num; |
2254 | |
2255 seconds= time/s->avctx->time_base.den; | |
942 | 2256 minutes= seconds/60; seconds %= 60; |
2257 hours= minutes/60; minutes %= 60; | |
2258 hours%=24; | |
2259 | |
2260 put_bits(&s->pb, 5, hours); | |
2261 put_bits(&s->pb, 6, minutes); | |
2262 put_bits(&s->pb, 1, 1); | |
2263 put_bits(&s->pb, 6, seconds); | |
2967 | 2264 |
2265 put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP)); | |
942 | 2266 put_bits(&s->pb, 1, 0); //broken link == NO |
2967 | 2267 |
2268 s->last_time_base= time / s->avctx->time_base.den; | |
942 | 2269 |
2270 ff_mpeg4_stuffing(&s->pb); | |
2271 } | |
2272 | |
2273 static void mpeg4_encode_visual_object_header(MpegEncContext * s){ | |
2274 int profile_and_level_indication; | |
2275 int vo_ver_id; | |
2967 | 2276 |
2167 | 2277 if(s->avctx->profile != FF_PROFILE_UNKNOWN){ |
2278 profile_and_level_indication = s->avctx->profile << 4; | |
2279 }else if(s->max_b_frames || s->quarter_sample){ | |
2280 profile_and_level_indication= 0xF0; // adv simple | |
2281 }else{ | |
2282 profile_and_level_indication= 0x00; // simple | |
2283 } | |
2284 | |
2285 if(s->avctx->level != FF_LEVEL_UNKNOWN){ | |
2286 profile_and_level_indication |= s->avctx->level; | |
2287 }else{ | |
2288 profile_and_level_indication |= 1; //level 1 | |
2289 } | |
2290 | |
2291 if(profile_and_level_indication>>4 == 0xF){ | |
942 | 2292 vo_ver_id= 5; |
2293 }else{ | |
2294 vo_ver_id= 1; | |
2295 } | |
2167 | 2296 |
942 | 2297 //FIXME levels |
2298 | |
2299 put_bits(&s->pb, 16, 0); | |
2300 put_bits(&s->pb, 16, VOS_STARTCODE); | |
1350
e7c8051e1849
the reference sw doesnt like some legal headers ...
michaelni
parents:
1346
diff
changeset
|
2301 |
942 | 2302 put_bits(&s->pb, 8, profile_and_level_indication); |
1350
e7c8051e1849
the reference sw doesnt like some legal headers ...
michaelni
parents:
1346
diff
changeset
|
2303 |
942 | 2304 put_bits(&s->pb, 16, 0); |
2305 put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE); | |
2967 | 2306 |
942 | 2307 put_bits(&s->pb, 1, 1); |
2308 put_bits(&s->pb, 4, vo_ver_id); | |
2309 put_bits(&s->pb, 3, 1); //priority | |
2967 | 2310 |
942 | 2311 put_bits(&s->pb, 4, 1); //visual obj type== video obj |
2967 | 2312 |
942 | 2313 put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME |
2314 | |
2315 ff_mpeg4_stuffing(&s->pb); | |
2316 } | |
2317 | |
2318 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number) | |
0 | 2319 { |
942 | 2320 int vo_ver_id; |
336 | 2321 |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
2322 if (!CONFIG_MPEG4_ENCODER) return; |
5275
91416b4f1929
Better place to disable some mpeg4 code and ensure that
aurel
parents:
5274
diff
changeset
|
2323 |
942 | 2324 if(s->max_b_frames || s->quarter_sample){ |
2325 vo_ver_id= 5; | |
923 | 2326 s->vo_type= ADV_SIMPLE_VO_TYPE; |
2327 }else{ | |
942 | 2328 vo_ver_id= 1; |
923 | 2329 s->vo_type= SIMPLE_VO_TYPE; |
2330 } | |
336 | 2331 |
263 | 2332 put_bits(&s->pb, 16, 0); |
942 | 2333 put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */ |
263 | 2334 put_bits(&s->pb, 16, 0); |
942 | 2335 put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */ |
263 | 2336 |
2979 | 2337 put_bits(&s->pb, 1, 0); /* random access vol */ |
2338 put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */ | |
2572
c22ad129a91b
support omiting various headers in mpeg4 as WMP seems to have difficulty with them
michael
parents:
2554
diff
changeset
|
2339 if(s->workaround_bugs & FF_BUG_MS) { |
2979 | 2340 put_bits(&s->pb, 1, 0); /* is obj layer id= no */ |
2572
c22ad129a91b
support omiting various headers in mpeg4 as WMP seems to have difficulty with them
michael
parents:
2554
diff
changeset
|
2341 } else { |
2979 | 2342 put_bits(&s->pb, 1, 1); /* is obj layer id= yes */ |
2343 put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */ | |
2344 put_bits(&s->pb, 3, 1); /* is obj layer priority */ | |
2572
c22ad129a91b
support omiting various headers in mpeg4 as WMP seems to have difficulty with them
michael
parents:
2554
diff
changeset
|
2345 } |
2967 | 2346 |
1548 | 2347 aspect_to_info(s, s->avctx->sample_aspect_ratio); |
880 | 2348 |
2349 put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */ | |
1548 | 2350 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){ |
2351 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num); | |
2352 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den); | |
669
b4bddbde44f3
aspect (ext. par too) support for h263 and mpeg4 (inc. build becouse of new vars)
al3x
parents:
667
diff
changeset
|
2353 } |
336 | 2354 |
2572
c22ad129a91b
support omiting various headers in mpeg4 as WMP seems to have difficulty with them
michael
parents:
2554
diff
changeset
|
2355 if(s->workaround_bugs & FF_BUG_MS) { // |
2979 | 2356 put_bits(&s->pb, 1, 0); /* vol control parameters= no @@@ */ |
2572
c22ad129a91b
support omiting various headers in mpeg4 as WMP seems to have difficulty with them
michael
parents:
2554
diff
changeset
|
2357 } else { |
2979 | 2358 put_bits(&s->pb, 1, 1); /* vol control parameters= yes */ |
2359 put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */ | |
2572
c22ad129a91b
support omiting various headers in mpeg4 as WMP seems to have difficulty with them
michael
parents:
2554
diff
changeset
|
2360 put_bits(&s->pb, 1, s->low_delay); |
2979 | 2361 put_bits(&s->pb, 1, 0); /* vbv parameters= no */ |
2362 } | |
2363 | |
2364 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */ | |
2365 put_bits(&s->pb, 1, 1); /* marker bit */ | |
2967 | 2366 |
2637 | 2367 put_bits(&s->pb, 16, s->avctx->time_base.den); |
263 | 2368 if (s->time_increment_bits < 1) |
2369 s->time_increment_bits = 1; | |
2979 | 2370 put_bits(&s->pb, 1, 1); /* marker bit */ |
2371 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */ | |
2372 put_bits(&s->pb, 1, 1); /* marker bit */ | |
2373 put_bits(&s->pb, 13, s->width); /* vol width */ | |
2374 put_bits(&s->pb, 1, 1); /* marker bit */ | |
2375 put_bits(&s->pb, 13, s->height); /* vol height */ | |
2376 put_bits(&s->pb, 1, 1); /* marker bit */ | |
697 | 2377 put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1); |
2979 | 2378 put_bits(&s->pb, 1, 1); /* obmc disable */ |
263 | 2379 if (vo_ver_id == 1) { |
2979 | 2380 put_bits(&s->pb, 1, s->vol_sprite_usage); /* sprite enable */ |
942 | 2381 }else{ |
2979 | 2382 put_bits(&s->pb, 2, s->vol_sprite_usage); /* sprite enable */ |
2383 } | |
2384 | |
2385 put_bits(&s->pb, 1, 0); /* not 8 bit == false */ | |
2386 put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/ | |
1411 | 2387 |
2388 if(s->mpeg_quant){ | |
2389 ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix); | |
2390 ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix); | |
2391 } | |
599 | 2392 |
263 | 2393 if (vo_ver_id != 1) |
936 | 2394 put_bits(&s->pb, 1, s->quarter_sample); |
2979 | 2395 put_bits(&s->pb, 1, 1); /* complexity estimation disable */ |
453 | 2396 s->resync_marker= s->rtp_mode; |
2397 put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */ | |
2398 put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0); | |
2399 if(s->data_partitioning){ | |
2979 | 2400 put_bits(&s->pb, 1, 0); /* no rvlc */ |
453 | 2401 } |
2402 | |
263 | 2403 if (vo_ver_id != 1){ |
2979 | 2404 put_bits(&s->pb, 1, 0); /* newpred */ |
2405 put_bits(&s->pb, 1, 0); /* reduced res vop */ | |
2406 } | |
2407 put_bits(&s->pb, 1, 0); /* scalability */ | |
2967 | 2408 |
453 | 2409 ff_mpeg4_stuffing(&s->pb); |
676 | 2410 |
2411 /* user data */ | |
1092 | 2412 if(!(s->flags & CODEC_FLAG_BITEXACT)){ |
676 | 2413 put_bits(&s->pb, 16, 0); |
2979 | 2414 put_bits(&s->pb, 16, 0x1B2); /* user_data */ |
2415 ff_put_string(&s->pb, LIBAVCODEC_IDENT, 0); | |
676 | 2416 } |
263 | 2417 } |
2418 | |
2419 /* write mpeg4 VOP header */ | |
2420 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number) | |
2421 { | |
324 | 2422 int time_incr; |
2423 int time_div, time_mod; | |
2967 | 2424 |
6481 | 2425 if(s->pict_type==FF_I_TYPE){ |
953 | 2426 if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){ |
2658
d1609cfeb1d0
#defines for strict_std_compliance and split between inofficial extensions and non standarized things
michael
parents:
2646
diff
changeset
|
2427 if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT) //HACK, the reference sw is buggy |
1350
e7c8051e1849
the reference sw doesnt like some legal headers ...
michaelni
parents:
1346
diff
changeset
|
2428 mpeg4_encode_visual_object_header(s); |
2658
d1609cfeb1d0
#defines for strict_std_compliance and split between inofficial extensions and non standarized things
michael
parents:
2646
diff
changeset
|
2429 if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT || picture_number==0) //HACK, the reference sw is buggy |
1350
e7c8051e1849
the reference sw doesnt like some legal headers ...
michaelni
parents:
1346
diff
changeset
|
2430 mpeg4_encode_vol_header(s, 0, 0); |
942 | 2431 } |
2572
c22ad129a91b
support omiting various headers in mpeg4 as WMP seems to have difficulty with them
michael
parents:
2554
diff
changeset
|
2432 if(!(s->workaround_bugs & FF_BUG_MS)) |
c22ad129a91b
support omiting various headers in mpeg4 as WMP seems to have difficulty with them
michael
parents:
2554
diff
changeset
|
2433 mpeg4_encode_gop_header(s); |
453 | 2434 } |
2967 | 2435 |
6481 | 2436 s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE; |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2437 |
2979 | 2438 put_bits(&s->pb, 16, 0); /* vop header */ |
2439 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */ | |
2440 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */ | |
324 | 2441 |
2679 | 2442 assert(s->time>=0); |
2637 | 2443 time_div= s->time/s->avctx->time_base.den; |
2444 time_mod= s->time%s->avctx->time_base.den; | |
324 | 2445 time_incr= time_div - s->last_time_base; |
1936
e5b0b33cf8aa
assert(time_incr >= 0) so its clear that this MUST be the case
michael
parents:
1914
diff
changeset
|
2446 assert(time_incr >= 0); |
324 | 2447 while(time_incr--) |
2448 put_bits(&s->pb, 1, 1); | |
2967 | 2449 |
0 | 2450 put_bits(&s->pb, 1, 0); |
2451 | |
2979 | 2452 put_bits(&s->pb, 1, 1); /* marker */ |
2453 put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */ | |
2454 put_bits(&s->pb, 1, 1); /* marker */ | |
2455 put_bits(&s->pb, 1, 1); /* vop coded */ | |
6481 | 2456 if ( s->pict_type == FF_P_TYPE |
2457 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) { | |
2979 | 2458 put_bits(&s->pb, 1, s->no_rounding); /* rounding type */ |
2459 } | |
2460 put_bits(&s->pb, 3, 0); /* intra dc VLC threshold */ | |
697 | 2461 if(!s->progressive_sequence){ |
1659 | 2462 put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first); |
697 | 2463 put_bits(&s->pb, 1, s->alternate_scan); |
2464 } | |
263 | 2465 //FIXME sprite stuff |
0 | 2466 |
2467 put_bits(&s->pb, 5, s->qscale); | |
2468 | |
6481 | 2469 if (s->pict_type != FF_I_TYPE) |
2979 | 2470 put_bits(&s->pb, 3, s->f_code); /* fcode_for */ |
6481 | 2471 if (s->pict_type == FF_B_TYPE) |
2979 | 2472 put_bits(&s->pb, 3, s->b_code); /* fcode_back */ |
0 | 2473 } |
2474 | |
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
|
2475 #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
|
2476 |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2477 /** |
1034 | 2478 * predicts the dc. |
2003 | 2479 * encoding quantized level -> quantized diff |
2967 | 2480 * decoding quantized diff -> quantized level |
1034 | 2481 * @param n block index (0-3 are luma, 4-5 are chroma) |
2482 * @param dir_ptr pointer to an integer where the prediction direction will be stored | |
2483 */ | |
2003 | 2484 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding) |
0 | 2485 { |
2003 | 2486 int a, b, c, wrap, pred, scale, ret; |
3781 | 2487 int16_t *dc_val; |
0 | 2488 |
2489 /* find prediction */ | |
2490 if (n < 4) { | |
2979 | 2491 scale = s->y_dc_scale; |
0 | 2492 } else { |
2979 | 2493 scale = s->c_dc_scale; |
0 | 2494 } |
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
|
2495 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
|
2496 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
|
2497 |
266 | 2498 wrap= s->block_wrap[n]; |
2499 dc_val = s->dc_val[0] + s->block_index[n]; | |
0 | 2500 |
2501 /* B C | |
2967 | 2502 * A X |
0 | 2503 */ |
266 | 2504 a = dc_val[ - 1]; |
2505 b = dc_val[ - 1 - wrap]; | |
2506 c = dc_val[ - wrap]; | |
0 | 2507 |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
2508 /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */ |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2509 if(s->first_slice_line && n!=3){ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2510 if(n!=2) b=c= 1024; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2511 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
|
2512 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2513 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
|
2514 if(n==0 || n==4 || n==5) |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2515 b=1024; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2516 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2517 |
0 | 2518 if (abs(a - b) < abs(b - c)) { |
2979 | 2519 pred = c; |
0 | 2520 *dir_ptr = 1; /* top */ |
2521 } else { | |
2979 | 2522 pred = a; |
0 | 2523 *dir_ptr = 0; /* left */ |
2524 } | |
2525 /* 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
|
2526 pred = FASTDIV((pred + (scale >> 1)), scale); |
0 | 2527 |
2003 | 2528 if(encoding){ |
2529 ret = level - pred; | |
2530 }else{ | |
2531 level += pred; | |
2532 ret= level; | |
7831 | 2533 if(s->error_recognition>=3){ |
2003 | 2534 if(level<0){ |
2535 av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y); | |
2536 return -1; | |
2537 } | |
2538 if(level*scale > 2048 + scale){ | |
2539 av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y); | |
2540 return -1; | |
2541 } | |
2542 } | |
2543 } | |
2544 level *=scale; | |
2004 | 2545 if(level&(~2047)){ |
2967 | 2546 if(level<0) |
2004 | 2547 level=0; |
2548 else if(!(s->workaround_bugs&FF_BUG_DC_CLIP)) | |
2549 level=2047; | |
2550 } | |
2003 | 2551 dc_val[0]= level; |
2552 | |
2553 return ret; | |
0 | 2554 } |
2555 | |
1034 | 2556 /** |
2557 * predicts the ac. | |
2558 * @param n block index (0-3 are luma, 4-5 are chroma) | |
2559 * @param dir the ac prediction direction | |
2560 */ | |
1008 | 2561 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, |
0 | 2562 int dir) |
2563 { | |
266 | 2564 int i; |
1064 | 2565 int16_t *ac_val, *ac_val1; |
903 | 2566 int8_t * const qscale_table= s->current_picture.qscale_table; |
0 | 2567 |
2568 /* find prediction */ | |
266 | 2569 ac_val = s->ac_val[0][0] + s->block_index[n] * 16; |
0 | 2570 ac_val1 = ac_val; |
2571 if (s->ac_pred) { | |
2572 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
|
2573 const int xy= s->mb_x-1 + s->mb_y*s->mb_stride; |
0 | 2574 /* left prediction */ |
2575 ac_val -= 16; | |
2967 | 2576 |
903 | 2577 if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){ |
575 | 2578 /* same qscale */ |
2579 for(i=1;i<8;i++) { | |
1092 | 2580 block[s->dsp.idct_permutation[i<<3]] += ac_val[i]; |
575 | 2581 } |
2582 }else{ | |
2583 /* different qscale, we must rescale */ | |
2584 for(i=1;i<8;i++) { | |
1092 | 2585 block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale); |
575 | 2586 } |
0 | 2587 } |
2588 } 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
|
2589 const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride; |
0 | 2590 /* top prediction */ |
266 | 2591 ac_val -= 16 * s->block_wrap[n]; |
575 | 2592 |
903 | 2593 if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){ |
575 | 2594 /* same qscale */ |
2595 for(i=1;i<8;i++) { | |
1092 | 2596 block[s->dsp.idct_permutation[i]] += ac_val[i + 8]; |
575 | 2597 } |
2598 }else{ | |
2599 /* different qscale, we must rescale */ | |
2600 for(i=1;i<8;i++) { | |
1092 | 2601 block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale); |
575 | 2602 } |
0 | 2603 } |
2604 } | |
2605 } | |
2606 /* left copy */ | |
2607 for(i=1;i<8;i++) | |
1092 | 2608 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]]; |
591 | 2609 |
0 | 2610 /* top copy */ |
2611 for(i=1;i<8;i++) | |
1092 | 2612 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]]; |
591 | 2613 |
0 | 2614 } |
2615 | |
8590 | 2616 #if CONFIG_ENCODERS |
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
|
2617 |
1034 | 2618 /** |
2619 * encodes the dc value. | |
2620 * @param n block index (0-3 are luma, 4-5 are chroma) | |
2621 */ | |
453 | 2622 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
|
2623 { |
293 | 2624 #if 1 |
2625 level+=256; | |
2626 if (n < 4) { | |
2979 | 2627 /* luminance */ |
2628 put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]); | |
293 | 2629 } else { |
2979 | 2630 /* chrominance */ |
2631 put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]); | |
293 | 2632 } |
2633 #else | |
265
4e9e728021d8
use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents:
264
diff
changeset
|
2634 int size, v; |
0 | 2635 /* find number of bits */ |
2636 size = 0; | |
2637 v = abs(level); | |
2638 while (v) { | |
2979 | 2639 v >>= 1; |
2640 size++; | |
0 | 2641 } |
2642 | |
2643 if (n < 4) { | |
2979 | 2644 /* luminance */ |
2645 put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]); | |
0 | 2646 } else { |
2979 | 2647 /* chrominance */ |
2648 put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]); | |
0 | 2649 } |
2650 | |
2651 /* encode remaining bits */ | |
2652 if (size > 0) { | |
2979 | 2653 if (level < 0) |
2654 level = (-level) ^ ((1 << size) - 1); | |
2655 put_bits(&s->pb, size, level); | |
2656 if (size > 8) | |
2657 put_bits(&s->pb, 1, 1); | |
0 | 2658 } |
293 | 2659 #endif |
0 | 2660 } |
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
|
2661 |
2502 | 2662 static inline int mpeg4_get_dc_length(int level, int n){ |
2663 if (n < 4) { | |
2664 return uni_DCtab_lum_len[level + 256]; | |
2665 } else { | |
2666 return uni_DCtab_chrom_len[level + 256]; | |
2667 } | |
2668 } | |
2669 | |
1034 | 2670 /** |
2671 * encodes a 8x8 block | |
2672 * @param n block index (0-3 are luma, 4-5 are chroma) | |
2673 */ | |
2967 | 2674 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, |
1064 | 2675 uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb) |
0 | 2676 { |
751 | 2677 int i, last_non_zero; |
2678 #if 0 //variables for the outcommented version | |
2679 int code, sign, last; | |
2680 #endif | |
0 | 2681 const RLTable *rl; |
1064 | 2682 uint32_t *bits_tab; |
2683 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
|
2684 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
|
2685 |
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
|
2686 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away |
2979 | 2687 /* mpeg4 based DC predictor */ |
2688 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
|
2689 if(last_index<1) return; |
2979 | 2690 i = 1; |
0 | 2691 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
|
2692 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
|
2693 len_tab = uni_mpeg4_intra_rl_len; |
0 | 2694 } 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
|
2695 if(last_index<0) return; |
2979 | 2696 i = 0; |
0 | 2697 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
|
2698 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
|
2699 len_tab = uni_mpeg4_inter_rl_len; |
0 | 2700 } |
2701 | |
2702 /* AC coefs */ | |
2703 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
|
2704 #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
|
2705 for (; i < last_index; i++) { |
2979 | 2706 int level = block[ scan_table[i] ]; |
2707 if (level) { | |
2708 int run = i - last_non_zero - 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
|
2709 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
|
2710 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
|
2711 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
|
2712 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
|
2713 }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
|
2714 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
|
2715 } |
2979 | 2716 last_non_zero = i; |
2717 } | |
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
|
2718 } |
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
|
2719 /*if(i<=last_index)*/{ |
2979 | 2720 int level = block[ scan_table[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
|
2721 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
|
2722 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
|
2723 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
|
2724 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
|
2725 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
|
2726 }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
|
2727 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
|
2728 } |
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
|
2729 } |
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
|
2730 #else |
0 | 2731 for (; i <= last_index; i++) { |
2979 | 2732 const int slevel = block[ scan_table[i] ]; |
2733 if (slevel) { | |
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
|
2734 int level; |
2979 | 2735 int run = i - last_non_zero - 1; |
2736 last = (i == last_index); | |
2737 sign = 0; | |
2738 level = slevel; | |
2739 if (level < 0) { | |
2740 sign = 1; | |
2741 level = -level; | |
2742 } | |
0 | 2743 code = get_rl_index(rl, last, run, level); |
453 | 2744 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); |
0 | 2745 if (code == rl->n) { |
2746 int level1, run1; | |
2747 level1 = level - rl->max_level[last][run]; | |
2967 | 2748 if (level1 < 1) |
0 | 2749 goto esc2; |
2750 code = get_rl_index(rl, last, run, level1); | |
2751 if (code == rl->n) { | |
2752 esc2: | |
453 | 2753 put_bits(ac_pb, 1, 1); |
0 | 2754 if (level > MAX_LEVEL) |
2755 goto esc3; | |
2756 run1 = run - rl->max_run[last][level] - 1; | |
2757 if (run1 < 0) | |
2758 goto esc3; | |
2759 code = get_rl_index(rl, last, run1, level); | |
2760 if (code == rl->n) { | |
2761 esc3: | |
2762 /* third escape */ | |
453 | 2763 put_bits(ac_pb, 1, 1); |
2764 put_bits(ac_pb, 1, last); | |
2765 put_bits(ac_pb, 6, run); | |
2766 put_bits(ac_pb, 1, 1); | |
7260
3ec34b551aae
bitstream: move put_sbits() from flacenc.c to bitstream.h and use it
ramiro
parents:
7098
diff
changeset
|
2767 put_sbits(ac_pb, 12, slevel); |
453 | 2768 put_bits(ac_pb, 1, 1); |
0 | 2769 } else { |
2770 /* second escape */ | |
453 | 2771 put_bits(ac_pb, 1, 0); |
2772 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); | |
2773 put_bits(ac_pb, 1, sign); | |
0 | 2774 } |
2775 } else { | |
2776 /* first escape */ | |
453 | 2777 put_bits(ac_pb, 1, 0); |
2778 put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); | |
2779 put_bits(ac_pb, 1, sign); | |
0 | 2780 } |
2781 } else { | |
453 | 2782 put_bits(ac_pb, 1, sign); |
0 | 2783 } |
2979 | 2784 last_non_zero = i; |
2785 } | |
0 | 2786 } |
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
|
2787 #endif |
0 | 2788 } |
936 | 2789 |
2967 | 2790 static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, |
1064 | 2791 uint8_t *scan_table) |
936 | 2792 { |
2793 int i, last_non_zero; | |
1064 | 2794 uint8_t *len_tab; |
936 | 2795 const int last_index = s->block_last_index[n]; |
2796 int len=0; | |
2797 | |
2798 if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away | |
2979 | 2799 /* mpeg4 based DC predictor */ |
2800 len += mpeg4_get_dc_length(intra_dc, n); | |
936 | 2801 if(last_index<1) return len; |
2979 | 2802 i = 1; |
936 | 2803 len_tab = uni_mpeg4_intra_rl_len; |
2804 } else { | |
2805 if(last_index<0) return 0; | |
2979 | 2806 i = 0; |
936 | 2807 len_tab = uni_mpeg4_inter_rl_len; |
2808 } | |
2809 | |
2810 /* AC coefs */ | |
2811 last_non_zero = i - 1; | |
2812 for (; i < last_index; i++) { | |
2979 | 2813 int level = block[ scan_table[i] ]; |
2814 if (level) { | |
2815 int run = i - last_non_zero - 1; | |
936 | 2816 level+=64; |
2817 if((level&(~127)) == 0){ | |
2818 const int index= UNI_MPEG4_ENC_INDEX(0, run, level); | |
2819 len += len_tab[index]; | |
2820 }else{ //ESC3 | |
2821 len += 7+2+1+6+1+12+1; | |
2822 } | |
2979 | 2823 last_non_zero = i; |
2824 } | |
936 | 2825 } |
2826 /*if(i<=last_index)*/{ | |
2979 | 2827 int level = block[ scan_table[i] ]; |
936 | 2828 int run = i - last_non_zero - 1; |
2829 level+=64; | |
2830 if((level&(~127)) == 0){ | |
2831 const int index= UNI_MPEG4_ENC_INDEX(1, run, level); | |
2832 len += len_tab[index]; | |
2833 }else{ //ESC3 | |
2834 len += 7+2+1+6+1+12+1; | |
2835 } | |
2836 } | |
2967 | 2837 |
936 | 2838 return len; |
2839 } | |
2840 | |
815
78accc54493b
put a few large tables under #ifdef CONFIG_ENCODERS or dynamically allocate them
michaelni
parents:
770
diff
changeset
|
2841 #endif |
0 | 2842 |
2843 | |
2844 /***********************************************/ | |
2845 /* decoding */ | |
2846 | |
2847 static VLC intra_MCBPC_vlc; | |
2848 static VLC inter_MCBPC_vlc; | |
2849 static VLC cbpy_vlc; | |
2850 static VLC mv_vlc; | |
2851 static VLC dc_lum, dc_chrom; | |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
2852 static VLC sprite_trajectory; |
262 | 2853 static VLC mb_type_b_vlc; |
1655 | 2854 static VLC h263_mbtype_b_vlc; |
2855 static VLC cbpc_b_vlc; | |
0 | 2856 |
2857 /* init vlcs */ | |
2858 | |
2859 /* XXX: find a better solution to handle static init */ | |
2860 void h263_decode_init_vlc(MpegEncContext *s) | |
2861 { | |
2862 static int done = 0; | |
2863 | |
2864 if (!done) { | |
2865 done = 1; | |
2866 | |
7098 | 2867 INIT_VLC_STATIC(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9, |
0 | 2868 intra_MCBPC_bits, 1, 1, |
7098 | 2869 intra_MCBPC_code, 1, 1, 72); |
2870 INIT_VLC_STATIC(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28, | |
0 | 2871 inter_MCBPC_bits, 1, 1, |
7098 | 2872 inter_MCBPC_code, 1, 1, 198); |
2873 INIT_VLC_STATIC(&cbpy_vlc, CBPY_VLC_BITS, 16, | |
0 | 2874 &cbpy_tab[0][1], 2, 1, |
7098 | 2875 &cbpy_tab[0][0], 2, 1, 64); |
2876 INIT_VLC_STATIC(&mv_vlc, MV_VLC_BITS, 33, | |
0 | 2877 &mvtab[0][1], 2, 1, |
7098 | 2878 &mvtab[0][0], 2, 1, 538); |
4668 | 2879 init_rl(&rl_inter, static_rl_table_store[0]); |
2880 init_rl(&rl_intra, static_rl_table_store[1]); | |
2881 init_rl(&rvlc_rl_inter, static_rl_table_store[3]); | |
2882 init_rl(&rvlc_rl_intra, static_rl_table_store[4]); | |
2883 init_rl(&rl_intra_aic, static_rl_table_store[2]); | |
6940
778ecab25dd8
Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents:
6918
diff
changeset
|
2884 INIT_VLC_RL(rl_inter, 554); |
778ecab25dd8
Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents:
6918
diff
changeset
|
2885 INIT_VLC_RL(rl_intra, 554); |
778ecab25dd8
Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents:
6918
diff
changeset
|
2886 INIT_VLC_RL(rvlc_rl_inter, 1072); |
778ecab25dd8
Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents:
6918
diff
changeset
|
2887 INIT_VLC_RL(rvlc_rl_intra, 1072); |
778ecab25dd8
Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents:
6918
diff
changeset
|
2888 INIT_VLC_RL(rl_intra_aic, 554); |
7098 | 2889 INIT_VLC_STATIC(&dc_lum, DC_VLC_BITS, 10 /* 13 */, |
0 | 2890 &DCtab_lum[0][1], 2, 1, |
7098 | 2891 &DCtab_lum[0][0], 2, 1, 512); |
2892 INIT_VLC_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */, | |
0 | 2893 &DCtab_chrom[0][1], 2, 1, |
7098 | 2894 &DCtab_chrom[0][0], 2, 1, 512); |
2895 INIT_VLC_STATIC(&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
|
2896 &sprite_trajectory_tab[0][1], 4, 2, |
7098 | 2897 &sprite_trajectory_tab[0][0], 4, 2, 128); |
2898 INIT_VLC_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4, | |
262 | 2899 &mb_type_b_tab[0][1], 2, 1, |
7098 | 2900 &mb_type_b_tab[0][0], 2, 1, 16); |
2901 INIT_VLC_STATIC(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15, | |
1655 | 2902 &h263_mbtype_b_tab[0][1], 2, 1, |
7098 | 2903 &h263_mbtype_b_tab[0][0], 2, 1, 80); |
2904 INIT_VLC_STATIC(&cbpc_b_vlc, CBPC_B_VLC_BITS, 4, | |
1655 | 2905 &cbpc_b_tab[0][1], 2, 1, |
7098 | 2906 &cbpc_b_tab[0][0], 2, 1, 8); |
0 | 2907 } |
2908 } | |
2909 | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2910 /** |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2911 * 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
|
2912 */ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2913 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
|
2914 if (s->height <= 400) |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2915 return 1; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2916 else if (s->height <= 800) |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2917 return 2; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2918 else |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2919 return 4; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2920 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2921 |
1661 | 2922 int ff_h263_decode_mba(MpegEncContext *s) |
2923 { | |
2924 int i, mb_pos; | |
2925 | |
2926 for(i=0; i<6; i++){ | |
1670 | 2927 if(s->mb_num-1 <= ff_mba_max[i]) break; |
1661 | 2928 } |
2929 mb_pos= get_bits(&s->gb, ff_mba_length[i]); | |
2930 s->mb_x= mb_pos % s->mb_width; | |
2931 s->mb_y= mb_pos / s->mb_width; | |
2932 | |
2933 return mb_pos; | |
2934 } | |
2935 | |
2936 void ff_h263_encode_mba(MpegEncContext *s) | |
2937 { | |
2938 int i, mb_pos; | |
2939 | |
2940 for(i=0; i<6; i++){ | |
1670 | 2941 if(s->mb_num-1 <= ff_mba_max[i]) break; |
1661 | 2942 } |
2943 mb_pos= s->mb_x + s->mb_width*s->mb_y; | |
2944 put_bits(&s->pb, ff_mba_length[i], mb_pos); | |
2945 } | |
2946 | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2947 /** |
1661 | 2948 * decodes the group of blocks header or slice header. |
6524 | 2949 * @return <0 if an error occurred |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2950 */ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2951 static int h263_decode_gob_header(MpegEncContext *s) |
162 | 2952 { |
1661 | 2953 unsigned int val, gfid, gob_number; |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2954 int left; |
2967 | 2955 |
162 | 2956 /* Check for GOB Start Code */ |
2957 val = show_bits(&s->gb, 16); | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2958 if(val) |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2959 return -1; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2960 |
162 | 2961 /* 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
|
2962 skip_bits(&s->gb, 16); /* Drop the zeros */ |
10535
95f3daa991a2
Use get_bits_left() instead of size_in_bits - get_bits_count().
rbultje
parents:
9999
diff
changeset
|
2963 left= get_bits_left(&s->gb); |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2964 //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
|
2965 for(;left>13; left--){ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2966 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
|
2967 } |
2967 | 2968 if(left<=13) |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2969 return -1; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2970 |
1661 | 2971 if(s->h263_slice_structured){ |
2972 if(get_bits1(&s->gb)==0) | |
2973 return -1; | |
2974 | |
2975 ff_h263_decode_mba(s); | |
2976 | |
2977 if(s->mb_num > 1583) | |
2978 if(get_bits1(&s->gb)==0) | |
2979 return -1; | |
2967 | 2980 |
1661 | 2981 s->qscale = get_bits(&s->gb, 5); /* SQUANT */ |
2982 if(get_bits1(&s->gb)==0) | |
2983 return -1; | |
2984 gfid = get_bits(&s->gb, 2); /* GFID */ | |
2985 }else{ | |
2986 gob_number = get_bits(&s->gb, 5); /* GN */ | |
2987 s->mb_x= 0; | |
2988 s->mb_y= s->gob_index* gob_number; | |
2989 gfid = get_bits(&s->gb, 2); /* GFID */ | |
2990 s->qscale = get_bits(&s->gb, 5); /* GQUANT */ | |
2991 } | |
2967 | 2992 |
2993 if(s->mb_y >= s->mb_height) | |
1661 | 2994 return -1; |
2995 | |
2967 | 2996 if(s->qscale==0) |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
2997 return -1; |
1644 | 2998 |
162 | 2999 return 0; |
3000 } | |
3001 | |
290 | 3002 static inline void memsetw(short *tab, int val, int n) |
3003 { | |
3004 int i; | |
3005 for(i=0;i<n;i++) | |
3006 tab[i] = val; | |
3007 } | |
3008 | |
8590 | 3009 #if CONFIG_ENCODERS |
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
|
3010 |
453 | 3011 void ff_mpeg4_init_partitions(MpegEncContext *s) |
3012 { | |
9431 | 3013 uint8_t *start= put_bits_ptr(&s->pb); |
1799 | 3014 uint8_t *end= s->pb.buf_end; |
3015 int size= end - start; | |
9259 | 3016 int pb_size = (((intptr_t)start + size/3)&(~3)) - (intptr_t)start; |
1912 | 3017 int tex_size= (size - 2*pb_size)&(~3); |
2967 | 3018 |
1799 | 3019 set_put_bits_buffer_size(&s->pb, pb_size); |
3020 init_put_bits(&s->tex_pb, start + pb_size , tex_size); | |
1910
5c21b165abf6
ensure that the bitstream buffers for encoding partitioned frames are aligned
michael
parents:
1896
diff
changeset
|
3021 init_put_bits(&s->pb2 , start + pb_size + tex_size, pb_size); |
453 | 3022 } |
3023 | |
3024 void ff_mpeg4_merge_partitions(MpegEncContext *s) | |
290 | 3025 { |
1786 | 3026 const int pb2_len = put_bits_count(&s->pb2 ); |
3027 const int tex_pb_len= put_bits_count(&s->tex_pb); | |
3028 const int bits= put_bits_count(&s->pb); | |
453 | 3029 |
6481 | 3030 if(s->pict_type==FF_I_TYPE){ |
453 | 3031 put_bits(&s->pb, 19, DC_MARKER); |
3032 s->misc_bits+=19 + pb2_len + bits - s->last_bits; | |
3033 s->i_tex_bits+= tex_pb_len; | |
3034 }else{ | |
3035 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
|
3036 s->misc_bits+=17 + pb2_len; |
453 | 3037 s->mv_bits+= bits - s->last_bits; |
3038 s->p_tex_bits+= tex_pb_len; | |
3039 } | |
3040 | |
3041 flush_put_bits(&s->pb2); | |
3042 flush_put_bits(&s->tex_pb); | |
3043 | |
1799 | 3044 set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf); |
3045 ff_copy_bits(&s->pb, s->pb2.buf , pb2_len); | |
3046 ff_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len); | |
1786 | 3047 s->last_bits= put_bits_count(&s->pb); |
453 | 3048 } |
3049 | |
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
|
3050 #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
|
3051 |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3052 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
|
3053 switch(s->pict_type){ |
6481 | 3054 case FF_I_TYPE: |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3055 return 16; |
6481 | 3056 case FF_P_TYPE: |
3057 case FF_S_TYPE: | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3058 return s->f_code+15; |
6481 | 3059 case FF_B_TYPE: |
6655
22cca5d3173a
Implement FFMAX3(a,b,c) - maximum over three arguments.
voroshil
parents:
6524
diff
changeset
|
3060 return FFMAX3(s->f_code, s->b_code, 2) + 15; |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3061 default: |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3062 return -1; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3063 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3064 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3065 |
8590 | 3066 #if CONFIG_ENCODERS |
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
|
3067 |
453 | 3068 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s) |
3069 { | |
3070 int mb_num_bits= av_log2(s->mb_num - 1) + 1; | |
3071 | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3072 put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0); |
453 | 3073 put_bits(&s->pb, 1, 1); |
2967 | 3074 |
453 | 3075 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
|
3076 put_bits(&s->pb, s->quant_precision, s->qscale); |
453 | 3077 put_bits(&s->pb, 1, 0); /* no HEC */ |
3078 } | |
3079 | |
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
|
3080 #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
|
3081 |
453 | 3082 /** |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3083 * 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
|
3084 * @return 0 if not |
453 | 3085 */ |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3086 static inline int mpeg4_is_resync(MpegEncContext *s){ |
4161
f81bca10a740
100l for me, iam being to stupid to read the mpeg4 spec / eat stuffing mbs a the end of the picture
michael
parents:
4155
diff
changeset
|
3087 int bits_count= get_bits_count(&s->gb); |
f81bca10a740
100l for me, iam being to stupid to read the mpeg4 spec / eat stuffing mbs a the end of the picture
michael
parents:
4155
diff
changeset
|
3088 int v= show_bits(&s->gb, 16); |
2967 | 3089 |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3090 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
|
3091 return 0; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3092 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3093 |
4161
f81bca10a740
100l for me, iam being to stupid to read the mpeg4 spec / eat stuffing mbs a the end of the picture
michael
parents:
4155
diff
changeset
|
3094 while(v<=0xFF){ |
6481 | 3095 if(s->pict_type==FF_B_TYPE || (v>>(8-s->pict_type)!=1) || s->partitioned_frame) |
4161
f81bca10a740
100l for me, iam being to stupid to read the mpeg4 spec / eat stuffing mbs a the end of the picture
michael
parents:
4155
diff
changeset
|
3096 break; |
f81bca10a740
100l for me, iam being to stupid to read the mpeg4 spec / eat stuffing mbs a the end of the picture
michael
parents:
4155
diff
changeset
|
3097 skip_bits(&s->gb, 8+s->pict_type); |
f81bca10a740
100l for me, iam being to stupid to read the mpeg4 spec / eat stuffing mbs a the end of the picture
michael
parents:
4155
diff
changeset
|
3098 bits_count+= 8+s->pict_type; |
f81bca10a740
100l for me, iam being to stupid to read the mpeg4 spec / eat stuffing mbs a the end of the picture
michael
parents:
4155
diff
changeset
|
3099 v= show_bits(&s->gb, 16); |
f81bca10a740
100l for me, iam being to stupid to read the mpeg4 spec / eat stuffing mbs a the end of the picture
michael
parents:
4155
diff
changeset
|
3100 } |
f81bca10a740
100l for me, iam being to stupid to read the mpeg4 spec / eat stuffing mbs a the end of the picture
michael
parents:
4155
diff
changeset
|
3101 |
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
|
3102 if(bits_count + 8 >= s->gb.size_in_bits){ |
4161
f81bca10a740
100l for me, iam being to stupid to read the mpeg4 spec / eat stuffing mbs a the end of the picture
michael
parents:
4155
diff
changeset
|
3103 v>>=8; |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3104 v|= 0x7F >> (7-(bits_count&7)); |
2967 | 3105 |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3106 if(v==0x7F) |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3107 return 1; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3108 }else{ |
4161
f81bca10a740
100l for me, iam being to stupid to read the mpeg4 spec / eat stuffing mbs a the end of the picture
michael
parents:
4155
diff
changeset
|
3109 if(v == ff_mpeg4_resync_prefix[bits_count&7]){ |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3110 int len; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3111 GetBitContext gb= s->gb; |
2967 | 3112 |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3113 skip_bits(&s->gb, 1); |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3114 align_get_bits(&s->gb); |
2967 | 3115 |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3116 for(len=0; len<32; len++){ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3117 if(get_bits1(&s->gb)) break; |
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 |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3120 s->gb= gb; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3121 |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3122 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
|
3123 return 1; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3124 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3125 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3126 return 0; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3127 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3128 |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3129 /** |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3130 * decodes the next video packet. |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3131 * @return <0 if something went wrong |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3132 */ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3133 static int mpeg4_decode_video_packet_header(MpegEncContext *s) |
453 | 3134 { |
290 | 3135 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
|
3136 int header_extension=0, mb_num, len; |
2967 | 3137 |
453 | 3138 /* 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
|
3139 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
|
3140 |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3141 for(len=0; len<32; len++){ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3142 if(get_bits1(&s->gb)) break; |
453 | 3143 } |
3144 | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3145 if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
3146 av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n"); |
453 | 3147 return -1; |
3148 } | |
2967 | 3149 |
453 | 3150 if(s->shape != RECT_SHAPE){ |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3151 header_extension= get_bits1(&s->gb); |
453 | 3152 //FIXME more stuff here |
3153 } | |
3154 | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3155 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
|
3156 if(mb_num>=s->mb_num){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
3157 av_log(s->avctx, AV_LOG_ERROR, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num); |
453 | 3158 return -1; |
3159 } | |
6481 | 3160 if(s->pict_type == FF_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
|
3161 while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++; |
6497 | 3162 if(mb_num >= s->mb_num) return -1; // slice contains just skipped MBs which where already decoded |
1176 | 3163 } |
2967 | 3164 |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3165 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
|
3166 s->mb_y= mb_num / s->mb_width; |
453 | 3167 |
3168 if(s->shape != BIN_ONLY_SHAPE){ | |
2967 | 3169 int qscale= get_bits(&s->gb, s->quant_precision); |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3170 if(qscale) |
1644 | 3171 s->chroma_qscale=s->qscale= qscale; |
290 | 3172 } |
3173 | |
3174 if(s->shape == RECT_SHAPE){ | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3175 header_extension= get_bits1(&s->gb); |
290 | 3176 } |
3177 if(header_extension){ | |
453 | 3178 int time_increment; |
290 | 3179 int time_incr=0; |
453 | 3180 |
2967 | 3181 while (get_bits1(&s->gb) != 0) |
290 | 3182 time_incr++; |
3183 | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3184 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
|
3185 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
|
3186 check_marker(&s->gb, "before vop_coding_type in video packed header"); |
2967 | 3187 |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3188 skip_bits(&s->gb, 2); /* vop coding type */ |
290 | 3189 //FIXME not rect stuff here |
3190 | |
3191 if(s->shape != BIN_ONLY_SHAPE){ | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3192 skip_bits(&s->gb, 3); /* intra dc vlc threshold */ |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
3193 //FIXME don't just ignore everything |
6481 | 3194 if(s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){ |
1914 | 3195 mpeg4_decode_sprite_trajectory(s, &s->gb); |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
3196 av_log(s->avctx, AV_LOG_ERROR, "untested\n"); |
290 | 3197 } |
3198 | |
3199 //FIXME reduced res stuff here | |
2967 | 3200 |
6481 | 3201 if (s->pict_type != FF_I_TYPE) { |
2979 | 3202 int f_code = get_bits(&s->gb, 3); /* fcode_for */ |
660 | 3203 if(f_code==0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
3204 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (f_code=0)\n"); |
290 | 3205 } |
3206 } | |
6481 | 3207 if (s->pict_type == FF_B_TYPE) { |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3208 int b_code = get_bits(&s->gb, 3); |
660 | 3209 if(b_code==0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
3210 av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (b_code=0)\n"); |
660 | 3211 } |
2967 | 3212 } |
290 | 3213 } |
3214 } | |
3215 //FIXME new-pred stuff | |
2967 | 3216 |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3217 return 0; |
453 | 3218 } |
3219 | |
3220 void ff_mpeg4_clean_buffers(MpegEncContext *s) | |
3221 { | |
3222 int c_wrap, c_xy, l_wrap, l_xy; | |
290 | 3223 |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
3224 l_wrap= s->b8_stride; |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
3225 l_xy= (2*s->mb_y-1)*l_wrap + s->mb_x*2 - 1; |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
3226 c_wrap= s->mb_stride; |
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
3227 c_xy= (s->mb_y-1)*c_wrap + s->mb_x - 1; |
290 | 3228 |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3229 #if 0 |
290 | 3230 /* clean DC */ |
453 | 3231 memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1); |
3232 memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1); | |
3233 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
|
3234 #endif |
290 | 3235 |
3236 /* clean AC */ | |
1064 | 3237 memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t)); |
3238 memset(s->ac_val[1] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t)); | |
3239 memset(s->ac_val[2] + c_xy, 0, (c_wrap +1)*16*sizeof(int16_t)); | |
290 | 3240 |
3241 /* clean MV */ | |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
3242 // we can't clear the MVs as they might be needed by a b frame |
1064 | 3243 // memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t)); |
3244 // memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2)); | |
453 | 3245 s->last_mv[0][0][0]= |
3246 s->last_mv[0][0][1]= | |
3247 s->last_mv[1][0][0]= | |
3248 s->last_mv[1][0][1]= 0; | |
3249 } | |
3250 | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3251 /** |
9024
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3252 * finds the next resync_marker |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3253 * @param p pointer to buffer to scan |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3254 * @param end pointer to the end of the buffer |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3255 * @return pointer to the next resync_marker, or \p end if none was found |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3256 */ |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3257 const uint8_t *ff_h263_find_resync_marker(const uint8_t *restrict p, const uint8_t * restrict end) |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3258 { |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3259 assert(p < end); |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3260 |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3261 end-=2; |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3262 p++; |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3263 for(;p<end; p+=2){ |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3264 if(!*p){ |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3265 if (!p[-1] && p[1]) return p - 1; |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3266 else if(!p[ 1] && p[2]) return p; |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3267 } |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3268 } |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3269 return end+2; |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3270 } |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3271 |
2bf694251330
Add ff_h263_find_resync_marker() to find the bit position of the next resync_marker, if any.
michael
parents:
9008
diff
changeset
|
3272 /** |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3273 * decodes the group of blocks / video packet header. |
8691
25aa5388fa97
Make ff_h263_resync() return the bit position of the resync_marker or
benoit
parents:
8690
diff
changeset
|
3274 * @return bit position of the resync_marker, or <0 if none was found |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3275 */ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3276 int ff_h263_resync(MpegEncContext *s){ |
8691
25aa5388fa97
Make ff_h263_resync() return the bit position of the resync_marker or
benoit
parents:
8690
diff
changeset
|
3277 int left, pos, ret; |
2967 | 3278 |
1521 | 3279 if(s->codec_id==CODEC_ID_MPEG4){ |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3280 skip_bits1(&s->gb); |
1521 | 3281 align_get_bits(&s->gb); |
3282 } | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3283 |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3284 if(show_bits(&s->gb, 16)==0){ |
8691
25aa5388fa97
Make ff_h263_resync() return the bit position of the resync_marker or
benoit
parents:
8690
diff
changeset
|
3285 pos= get_bits_count(&s->gb); |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3286 if(s->codec_id==CODEC_ID_MPEG4) |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3287 ret= mpeg4_decode_video_packet_header(s); |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3288 else |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3289 ret= h263_decode_gob_header(s); |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3290 if(ret>=0) |
8691
25aa5388fa97
Make ff_h263_resync() return the bit position of the resync_marker or
benoit
parents:
8690
diff
changeset
|
3291 return pos; |
453 | 3292 } |
5129 | 3293 //OK, it's not where it is supposed to be ... |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3294 s->gb= s->last_resync_gb; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3295 align_get_bits(&s->gb); |
10535
95f3daa991a2
Use get_bits_left() instead of size_in_bits - get_bits_count().
rbultje
parents:
9999
diff
changeset
|
3296 left= get_bits_left(&s->gb); |
2967 | 3297 |
3298 for(;left>16+1+5+5; left-=8){ | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3299 if(show_bits(&s->gb, 16)==0){ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3300 GetBitContext bak= s->gb; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3301 |
8691
25aa5388fa97
Make ff_h263_resync() return the bit position of the resync_marker or
benoit
parents:
8690
diff
changeset
|
3302 pos= get_bits_count(&s->gb); |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3303 if(s->codec_id==CODEC_ID_MPEG4) |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3304 ret= mpeg4_decode_video_packet_header(s); |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3305 else |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3306 ret= h263_decode_gob_header(s); |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3307 if(ret>=0) |
8691
25aa5388fa97
Make ff_h263_resync() return the bit position of the resync_marker or
benoit
parents:
8690
diff
changeset
|
3308 return pos; |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3309 |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3310 s->gb= bak; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3311 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3312 skip_bits(&s->gb, 8); |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3313 } |
2967 | 3314 |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3315 return -1; |
453 | 3316 } |
3317 | |
10752
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3318 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3319 { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3320 int code, val, sign, shift, l; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3321 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3322 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3323 if (code == 0) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3324 return pred; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3325 if (code < 0) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3326 return 0xffff; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3327 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3328 sign = get_bits1(&s->gb); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3329 shift = f_code - 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3330 val = code; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3331 if (shift) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3332 val = (val - 1) << shift; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3333 val |= get_bits(&s->gb, shift); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3334 val++; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3335 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3336 if (sign) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3337 val = -val; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3338 val += pred; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3339 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3340 /* modulo decoding */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3341 if (!s->h263_long_vectors) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3342 l = INT_BIT - 5 - f_code; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3343 val = (val<<l)>>l; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3344 } else { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3345 /* horrible h263 long vector mode */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3346 if (pred < -31 && val < -63) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3347 val += 64; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3348 if (pred > 32 && val > 63) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3349 val -= 64; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3350 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3351 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3352 return val; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3353 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3354 |
453 | 3355 /** |
1034 | 3356 * gets the average motion vector for a GMC MB. |
753 | 3357 * @param n either 0 for the x component or 1 for y |
3358 * @returns the average MV for a GMC MB | |
3359 */ | |
3360 static inline int get_amv(MpegEncContext *s, int n){ | |
3361 int x, y, mb_v, sum, dx, dy, shift; | |
3362 int len = 1 << (s->f_code + 4); | |
3363 const int a= s->sprite_warping_accuracy; | |
2967 | 3364 |
1997 | 3365 if(s->workaround_bugs & FF_BUG_AMV) |
3366 len >>= s->quarter_sample; | |
753 | 3367 |
3368 if(s->real_sprite_warping_points==1){ | |
3369 if(s->divx_version==500 && s->divx_build==413) | |
3370 sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample)); | |
3371 else | |
3372 sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a); | |
3373 }else{ | |
3374 dx= s->sprite_delta[n][0]; | |
3375 dy= s->sprite_delta[n][1]; | |
3376 shift= s->sprite_shift[0]; | |
3377 if(n) dy -= 1<<(shift + a + 1); | |
3378 else dx -= 1<<(shift + a + 1); | |
3379 mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16; | |
3380 | |
3381 sum=0; | |
3382 for(y=0; y<16; y++){ | |
3383 int v; | |
2967 | 3384 |
753 | 3385 v= mb_v + dy*y; |
3386 //XXX FIXME optimize | |
3387 for(x=0; x<16; x++){ | |
3388 sum+= v>>shift; | |
3389 v+= dx; | |
3390 } | |
3391 } | |
999
74dc4105e147
average motion vector rounding like the reference says and not what the standard says
michaelni
parents:
953
diff
changeset
|
3392 sum= RSHIFT(sum, a+8-s->quarter_sample); |
753 | 3393 } |
3394 | |
3395 if (sum < -len) sum= -len; | |
3396 else if (sum >= len) sum= len-1; | |
3397 | |
3398 return sum; | |
3399 } | |
3400 | |
3401 /** | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3402 * decodes first partition. |
6524 | 3403 * @return number of MBs decoded or <0 if an error occurred |
453 | 3404 */ |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3405 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
|
3406 int mb_num; |
1064 | 3407 static const int8_t quant_tab[4] = { -1, -2, 1, 2 }; |
2967 | 3408 |
453 | 3409 /* decode first partition */ |
3410 mb_num=0; | |
290 | 3411 s->first_slice_line=1; |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3412 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
|
3413 ff_init_block_index(s); |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3414 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
|
3415 const int xy= s->mb_x + s->mb_y*s->mb_stride; |
453 | 3416 int cbpc; |
3417 int dir=0; | |
2967 | 3418 |
453 | 3419 mb_num++; |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3420 ff_update_block_index(s); |
453 | 3421 if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1) |
3422 s->first_slice_line=0; | |
2967 | 3423 |
6481 | 3424 if(s->pict_type==FF_I_TYPE){ |
453 | 3425 int i; |
3426 | |
1482 | 3427 do{ |
1873 | 3428 if(show_bits_long(&s->gb, 19)==DC_MARKER){ |
3429 return mb_num-1; | |
3430 } | |
3431 | |
1482 | 3432 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2); |
3433 if (cbpc < 0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
3434 av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y); |
1482 | 3435 return -1; |
3436 } | |
3437 }while(cbpc == 8); | |
2967 | 3438 |
453 | 3439 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
|
3440 s->current_picture.mb_type[xy]= MB_TYPE_INTRA; |
453 | 3441 s->mb_intra = 1; |
3442 | |
3443 if(cbpc & 4) { | |
1652 | 3444 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); |
453 | 3445 } |
903 | 3446 s->current_picture.qscale_table[xy]= s->qscale; |
453 | 3447 |
3448 s->mbintra_table[xy]= 1; | |
3449 for(i=0; i<6; i++){ | |
3450 int dc_pred_dir; | |
2967 | 3451 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir); |
453 | 3452 if(dc < 0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
3453 av_log(s->avctx, AV_LOG_ERROR, "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
|
3454 return -1; |
453 | 3455 } |
3456 dir<<=1; | |
3457 if(dc_pred_dir) dir|=1; | |
3458 } | |
3459 s->pred_dir_table[xy]= dir; | |
3460 }else{ /* P/S_TYPE */ | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3461 int mx, my, pred_x, pred_y, bits; |
1668
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1666
diff
changeset
|
3462 int16_t * const mot_val= s->current_picture.motion_val[0][s->block_index[0]]; |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
3463 const int stride= s->b8_stride*2; |
453 | 3464 |
1873 | 3465 try_again: |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3466 bits= show_bits(&s->gb, 17); |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3467 if(bits==MOTION_MARKER){ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3468 return mb_num-1; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3469 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3470 skip_bits1(&s->gb); |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3471 if(bits&0x10000){ |
453 | 3472 /* skip mb */ |
6481 | 3473 if(s->pict_type==FF_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
|
3474 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0; |
753 | 3475 mx= get_amv(s, 0); |
3476 my= get_amv(s, 1); | |
453 | 3477 }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
|
3478 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; |
753 | 3479 mx=my=0; |
453 | 3480 } |
3481 mot_val[0 ]= mot_val[2 ]= | |
3482 mot_val[0+stride]= mot_val[2+stride]= mx; | |
3483 mot_val[1 ]= mot_val[3 ]= | |
3484 mot_val[1+stride]= mot_val[3+stride]= my; | |
3485 | |
3486 if(s->mbintra_table[xy]) | |
3487 ff_clean_intra_table_entries(s); | |
3488 continue; | |
3489 } | |
1482 | 3490 |
544 | 3491 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2); |
453 | 3492 if (cbpc < 0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
3493 av_log(s->avctx, AV_LOG_ERROR, "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
|
3494 return -1; |
453 | 3495 } |
1873 | 3496 if(cbpc == 20) |
3497 goto try_again; | |
1482 | 3498 |
453 | 3499 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant |
2967 | 3500 |
453 | 3501 s->mb_intra = ((cbpc & 4) != 0); |
2967 | 3502 |
453 | 3503 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
|
3504 s->current_picture.mb_type[xy]= MB_TYPE_INTRA; |
453 | 3505 s->mbintra_table[xy]= 1; |
2967 | 3506 mot_val[0 ]= mot_val[2 ]= |
453 | 3507 mot_val[0+stride]= mot_val[2+stride]= 0; |
3508 mot_val[1 ]= mot_val[3 ]= | |
3509 mot_val[1+stride]= mot_val[3+stride]= 0; | |
3510 }else{ | |
3511 if(s->mbintra_table[xy]) | |
3512 ff_clean_intra_table_entries(s); | |
3513 | |
6481 | 3514 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0) |
453 | 3515 s->mcsel= get_bits1(&s->gb); |
3516 else s->mcsel= 0; | |
2967 | 3517 |
453 | 3518 if ((cbpc & 16) == 0) { |
3519 /* 16x16 motion prediction */ | |
3520 | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
3521 h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
753 | 3522 if(!s->mcsel){ |
3523 mx = h263_decode_motion(s, pred_x, s->f_code); | |
3524 if (mx >= 0xffff) | |
3525 return -1; | |
3526 | |
3527 my = h263_decode_motion(s, pred_y, s->f_code); | |
3528 if (my >= 0xffff) | |
3529 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
|
3530 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0; |
753 | 3531 } else { |
3532 mx = get_amv(s, 0); | |
3533 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
|
3534 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0; |
453 | 3535 } |
753 | 3536 |
453 | 3537 mot_val[0 ]= mot_val[2 ] = |
3538 mot_val[0+stride]= mot_val[2+stride]= mx; | |
3539 mot_val[1 ]= mot_val[3 ]= | |
3540 mot_val[1+stride]= mot_val[3+stride]= my; | |
3541 } else { | |
3542 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
|
3543 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0; |
453 | 3544 for(i=0;i<4;i++) { |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
3545 int16_t *mot_val= h263_pred_motion(s, i, 0, &pred_x, &pred_y); |
453 | 3546 mx = h263_decode_motion(s, pred_x, s->f_code); |
3547 if (mx >= 0xffff) | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3548 return -1; |
2967 | 3549 |
453 | 3550 my = h263_decode_motion(s, pred_y, s->f_code); |
3551 if (my >= 0xffff) | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3552 return -1; |
453 | 3553 mot_val[0] = mx; |
3554 mot_val[1] = my; | |
3555 } | |
3556 } | |
3557 } | |
3558 } | |
3559 } | |
3560 s->mb_x= 0; | |
3561 } | |
3562 | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3563 return mb_num; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3564 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3565 |
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 * decode second partition. |
6524 | 3568 * @return <0 if an error occurred |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3569 */ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3570 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
|
3571 int mb_num=0; |
1064 | 3572 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
|
3573 |
453 | 3574 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
|
3575 s->first_slice_line=1; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3576 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
|
3577 ff_init_block_index(s); |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3578 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
|
3579 const int xy= s->mb_x + s->mb_y*s->mb_stride; |
453 | 3580 |
3581 mb_num++; | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3582 ff_update_block_index(s); |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3583 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
|
3584 s->first_slice_line=0; |
2967 | 3585 |
6481 | 3586 if(s->pict_type==FF_I_TYPE){ |
453 | 3587 int ac_pred= get_bits1(&s->gb); |
544 | 3588 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
453 | 3589 if(cbpy<0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
3590 av_log(s->avctx, AV_LOG_ERROR, "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
|
3591 return -1; |
453 | 3592 } |
2967 | 3593 |
453 | 3594 s->cbp_table[xy]|= cbpy<<2; |
2967 | 3595 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED; |
453 | 3596 }else{ /* P || S_TYPE */ |
2967 | 3597 if(IS_INTRA(s->current_picture.mb_type[xy])){ |
453 | 3598 int dir=0,i; |
3599 int ac_pred = get_bits1(&s->gb); | |
544 | 3600 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
453 | 3601 |
3602 if(cbpy<0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
3603 av_log(s->avctx, AV_LOG_ERROR, "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
|
3604 return -1; |
453 | 3605 } |
2967 | 3606 |
453 | 3607 if(s->cbp_table[xy] & 8) { |
1652 | 3608 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); |
453 | 3609 } |
903 | 3610 s->current_picture.qscale_table[xy]= s->qscale; |
453 | 3611 |
3612 for(i=0; i<6; i++){ | |
3613 int dc_pred_dir; | |
2967 | 3614 int dc= mpeg4_decode_dc(s, i, &dc_pred_dir); |
453 | 3615 if(dc < 0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
3616 av_log(s->avctx, AV_LOG_ERROR, "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
|
3617 return -1; |
453 | 3618 } |
3619 dir<<=1; | |
3620 if(dc_pred_dir) dir|=1; | |
3621 } | |
3622 s->cbp_table[xy]&= 3; //remove dquant | |
3623 s->cbp_table[xy]|= cbpy<<2; | |
2967 | 3624 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED; |
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
|
3625 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
|
3626 }else if(IS_SKIP(s->current_picture.mb_type[xy])){ |
903 | 3627 s->current_picture.qscale_table[xy]= s->qscale; |
453 | 3628 s->cbp_table[xy]= 0; |
3629 }else{ | |
544 | 3630 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
453 | 3631 |
3632 if(cbpy<0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
3633 av_log(s->avctx, AV_LOG_ERROR, "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
|
3634 return -1; |
453 | 3635 } |
2967 | 3636 |
453 | 3637 if(s->cbp_table[xy] & 8) { |
1652 | 3638 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); |
453 | 3639 } |
903 | 3640 s->current_picture.qscale_table[xy]= s->qscale; |
453 | 3641 |
3642 s->cbp_table[xy]&= 3; //remove dquant | |
3643 s->cbp_table[xy]|= (cbpy^0xf)<<2; | |
3644 } | |
3645 } | |
3646 } | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3647 if(mb_num >= mb_count) return 0; |
453 | 3648 s->mb_x= 0; |
3649 } | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3650 return 0; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3651 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3652 |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3653 /** |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3654 * decodes the first & second partition |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3655 * @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
|
3656 */ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3657 int ff_mpeg4_decode_partitions(MpegEncContext *s) |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3658 { |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3659 int mb_num; |
6481 | 3660 const int part_a_error= s->pict_type==FF_I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR; |
3661 const int part_a_end = s->pict_type==FF_I_TYPE ? (DC_END |MV_END) : MV_END; | |
2967 | 3662 |
3663 mb_num= mpeg4_decode_partition_a(s); | |
1144 | 3664 if(mb_num<0){ |
3665 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
|
3666 return -1; |
1144 | 3667 } |
2967 | 3668 |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3669 if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
3670 av_log(s->avctx, AV_LOG_ERROR, "slice below monitor ...\n"); |
1144 | 3671 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
|
3672 return -1; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3673 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3674 |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3675 s->mb_num_left= mb_num; |
2967 | 3676 |
6481 | 3677 if(s->pict_type==FF_I_TYPE){ |
1873 | 3678 while(show_bits(&s->gb, 9) == 1) |
3679 skip_bits(&s->gb, 9); | |
1257 | 3680 if(get_bits_long(&s->gb, 19)!=DC_MARKER){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
3681 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first I partition 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
|
3682 return -1; |
1144 | 3683 } |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3684 }else{ |
1873 | 3685 while(show_bits(&s->gb, 10) == 1) |
3686 skip_bits(&s->gb, 10); | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3687 if(get_bits(&s->gb, 17)!=MOTION_MARKER){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
3688 av_log(s->avctx, AV_LOG_ERROR, "marker missing after first P partition 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
|
3689 return -1; |
1144 | 3690 } |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3691 } |
1144 | 3692 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end); |
2967 | 3693 |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3694 if( mpeg4_decode_partition_b(s, mb_num) < 0){ |
6481 | 3695 if(s->pict_type==FF_P_TYPE) |
1144 | 3696 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
|
3697 return -1; |
1144 | 3698 }else{ |
6481 | 3699 if(s->pict_type==FF_P_TYPE) |
1144 | 3700 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
|
3701 } |
453 | 3702 |
2967 | 3703 return 0; |
453 | 3704 } |
3705 | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3706 /** |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3707 * decode partition C of one MB. |
6524 | 3708 * @return <0 if an error occurred |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3709 */ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3710 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64]) |
453 | 3711 { |
3712 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
|
3713 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
|
3714 |
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
|
3715 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
|
3716 cbp = s->cbp_table[xy]; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3717 |
3282 | 3718 s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold; |
3719 | |
903 | 3720 if(s->current_picture.qscale_table[xy] != s->qscale){ |
1652 | 3721 ff_set_qscale(s, s->current_picture.qscale_table[xy] ); |
453 | 3722 } |
2967 | 3723 |
6481 | 3724 if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) { |
453 | 3725 int i; |
3726 for(i=0; i<4; i++){ | |
1668
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1666
diff
changeset
|
3727 s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0]; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1666
diff
changeset
|
3728 s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1]; |
453 | 3729 } |
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
|
3730 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
|
3731 |
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
|
3732 if (IS_SKIP(mb_type)) { |
453 | 3733 /* skip mb */ |
3734 for(i=0;i<6;i++) | |
3735 s->block_last_index[i] = -1; | |
3736 s->mv_dir = MV_DIR_FORWARD; | |
3737 s->mv_type = MV_TYPE_16X16; | |
6481 | 3738 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){ |
453 | 3739 s->mcsel=1; |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
3740 s->mb_skipped = 0; |
453 | 3741 }else{ |
3742 s->mcsel=0; | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
3743 s->mb_skipped = 1; |
453 | 3744 } |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3745 }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
|
3746 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); |
453 | 3747 }else if(!s->mb_intra){ |
3748 // s->mcsel= 0; //FIXME do we need to init that | |
2967 | 3749 |
453 | 3750 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
|
3751 if (IS_8X8(mb_type)) { |
453 | 3752 s->mv_type = MV_TYPE_8X8; |
3753 } else { | |
3754 s->mv_type = MV_TYPE_16X16; | |
3755 } | |
3756 } | |
3757 } else { /* I-Frame */ | |
3758 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
|
3759 s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); |
1132 | 3760 } |
3761 | |
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
|
3762 if (!IS_SKIP(mb_type)) { |
1132 | 3763 int i; |
2632 | 3764 s->dsp.clear_blocks(s->block[0]); |
453 | 3765 /* decode each block */ |
3766 for (i = 0; i < 6; i++) { | |
1132 | 3767 if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
3768 av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra); |
453 | 3769 return -1; |
3770 } | |
718 | 3771 cbp+=cbp; |
453 | 3772 } |
3773 } | |
290 | 3774 |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3775 /* per-MB end of slice check */ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3776 |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3777 if(--s->mb_num_left <= 0){ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3778 if(mpeg4_is_resync(s)) |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3779 return SLICE_END; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3780 else |
2967 | 3781 return SLICE_NOEND; |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3782 }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
|
3783 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
|
3784 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
|
3785 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
|
3786 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
|
3787 } |
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
|
3788 return SLICE_OK; |
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3789 } |
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
3790 } |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
3791 |
10752
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3792 /* Decodes RVLC of H.263+ UMV */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3793 static int h263p_decode_umotion(MpegEncContext * s, int pred) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3794 { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3795 int code = 0, sign; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3796 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3797 if (get_bits1(&s->gb)) /* Motion difference = 0 */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3798 return pred; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3799 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3800 code = 2 + get_bits1(&s->gb); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3801 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3802 while (get_bits1(&s->gb)) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3803 { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3804 code <<= 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3805 code += get_bits1(&s->gb); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3806 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3807 sign = code & 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3808 code >>= 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3809 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3810 code = (sign) ? (pred - code) : (pred + code); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3811 dprintf(s->avctx,"H.263+ UMV Motion = %d\n", code); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3812 return code; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3813 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3814 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3815 |
1633 | 3816 /** |
3817 * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :) | |
3818 */ | |
3819 static void preview_obmc(MpegEncContext *s){ | |
3820 GetBitContext gb= s->gb; | |
2967 | 3821 |
1633 | 3822 int cbpc, i, pred_x, pred_y, mx, my; |
3823 int16_t *mot_val; | |
3824 const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride; | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
3825 const int stride= s->b8_stride*2; |
2967 | 3826 |
1633 | 3827 for(i=0; i<4; i++) |
3828 s->block_index[i]+= 2; | |
3829 for(i=4; i<6; i++) | |
3830 s->block_index[i]+= 1; | |
3831 s->mb_x++; | |
2967 | 3832 |
6481 | 3833 assert(s->pict_type == FF_P_TYPE); |
1633 | 3834 |
3835 do{ | |
3836 if (get_bits1(&s->gb)) { | |
3837 /* skip mb */ | |
1668
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1666
diff
changeset
|
3838 mot_val = s->current_picture.motion_val[0][ s->block_index[0] ]; |
2967 | 3839 mot_val[0 ]= mot_val[2 ]= |
1633 | 3840 mot_val[0+stride]= mot_val[2+stride]= 0; |
3841 mot_val[1 ]= mot_val[3 ]= | |
3842 mot_val[1+stride]= mot_val[3+stride]= 0; | |
2967 | 3843 |
1633 | 3844 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; |
3845 goto end; | |
3846 } | |
3847 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2); | |
3848 }while(cbpc == 20); | |
2967 | 3849 |
1633 | 3850 if(cbpc & 4){ |
3851 s->current_picture.mb_type[xy]= MB_TYPE_INTRA; | |
3852 }else{ | |
3853 get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); | |
3854 if (cbpc & 8) { | |
1656 | 3855 if(s->modified_quant){ |
3856 if(get_bits1(&s->gb)) skip_bits(&s->gb, 1); | |
3857 else skip_bits(&s->gb, 5); | |
3858 }else | |
3859 skip_bits(&s->gb, 2); | |
1633 | 3860 } |
2967 | 3861 |
1633 | 3862 if ((cbpc & 16) == 0) { |
2967 | 3863 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0; |
1633 | 3864 /* 16x16 motion prediction */ |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
3865 mot_val= h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
1633 | 3866 if (s->umvplus) |
3867 mx = h263p_decode_umotion(s, pred_x); | |
3868 else | |
1655 | 3869 mx = h263_decode_motion(s, pred_x, 1); |
2967 | 3870 |
1633 | 3871 if (s->umvplus) |
3872 my = h263p_decode_umotion(s, pred_y); | |
3873 else | |
1655 | 3874 my = h263_decode_motion(s, pred_y, 1); |
2967 | 3875 |
3876 mot_val[0 ]= mot_val[2 ]= | |
1633 | 3877 mot_val[0+stride]= mot_val[2+stride]= mx; |
3878 mot_val[1 ]= mot_val[3 ]= | |
3879 mot_val[1+stride]= mot_val[3+stride]= my; | |
3880 } else { | |
2967 | 3881 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0; |
1633 | 3882 for(i=0;i<4;i++) { |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
3883 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y); |
1633 | 3884 if (s->umvplus) |
3885 mx = h263p_decode_umotion(s, pred_x); | |
3886 else | |
1655 | 3887 mx = h263_decode_motion(s, pred_x, 1); |
2967 | 3888 |
1633 | 3889 if (s->umvplus) |
3890 my = h263p_decode_umotion(s, pred_y); | |
2967 | 3891 else |
1655 | 3892 my = h263_decode_motion(s, pred_y, 1); |
1633 | 3893 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1) |
3894 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */ | |
3895 mot_val[0] = mx; | |
3896 mot_val[1] = my; | |
3897 } | |
3898 } | |
3899 } | |
3900 end: | |
2967 | 3901 |
1633 | 3902 for(i=0; i<4; i++) |
3903 s->block_index[i]-= 2; | |
3904 for(i=4; i<6; i++) | |
3905 s->block_index[i]-= 1; | |
3906 s->mb_x--; | |
3907 | |
3908 s->gb= gb; | |
3909 } | |
3910 | |
1656 | 3911 static void h263_decode_dquant(MpegEncContext *s){ |
3912 static const int8_t quant_tab[4] = { -1, -2, 1, 2 }; | |
3913 | |
3914 if(s->modified_quant){ | |
3915 if(get_bits1(&s->gb)) | |
3916 s->qscale= modified_quant_tab[get_bits1(&s->gb)][ s->qscale ]; | |
3917 else | |
3918 s->qscale= get_bits(&s->gb, 5); | |
3919 }else | |
3920 s->qscale += quant_tab[get_bits(&s->gb, 2)]; | |
3921 ff_set_qscale(s, s->qscale); | |
3922 } | |
3923 | |
10752
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3924 static int h263_decode_block(MpegEncContext * s, DCTELEM * block, |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3925 int n, int coded) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3926 { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3927 int code, level, i, j, last, run; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3928 RLTable *rl = &rl_inter; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3929 const uint8_t *scan_table; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3930 GetBitContext gb= s->gb; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3931 |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3932 scan_table = s->intra_scantable.permutated; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3933 if (s->h263_aic && s->mb_intra) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3934 rl = &rl_intra_aic; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3935 i = 0; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3936 if (s->ac_pred) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3937 if (s->h263_aic_dir) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3938 scan_table = s->intra_v_scantable.permutated; /* left */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3939 else |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3940 scan_table = s->intra_h_scantable.permutated; /* top */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3941 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3942 } else if (s->mb_intra) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3943 /* DC coef */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3944 if(s->codec_id == CODEC_ID_RV10){ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3945 #if CONFIG_RV10_DECODER |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3946 if (s->rv10_version == 3 && s->pict_type == FF_I_TYPE) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3947 int component, diff; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3948 component = (n <= 3 ? 0 : n - 4 + 1); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3949 level = s->last_dc[component]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3950 if (s->rv10_first_dc_coded[component]) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3951 diff = rv_decode_dc(s, n); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3952 if (diff == 0xffff) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3953 return -1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3954 level += diff; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3955 level = level & 0xff; /* handle wrap round */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3956 s->last_dc[component] = level; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3957 } else { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3958 s->rv10_first_dc_coded[component] = 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3959 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3960 } else { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3961 level = get_bits(&s->gb, 8); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3962 if (level == 255) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3963 level = 128; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3964 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3965 #endif |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3966 }else{ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3967 level = get_bits(&s->gb, 8); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3968 if((level&0x7F) == 0){ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3969 av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3970 if(s->error_recognition >= FF_ER_COMPLIANT) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3971 return -1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3972 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3973 if (level == 255) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3974 level = 128; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3975 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3976 block[0] = level; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3977 i = 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3978 } else { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3979 i = 0; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3980 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3981 if (!coded) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3982 if (s->mb_intra && s->h263_aic) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3983 goto not_coded; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3984 s->block_last_index[n] = i - 1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3985 return 0; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3986 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3987 retry: |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3988 for(;;) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3989 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3990 if (code < 0){ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3991 av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3992 return -1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3993 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3994 if (code == rl->n) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3995 /* escape */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3996 if (s->h263_flv > 1) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3997 int is11 = get_bits1(&s->gb); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3998 last = get_bits1(&s->gb); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
3999 run = get_bits(&s->gb, 6); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4000 if(is11){ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4001 level = get_sbits(&s->gb, 11); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4002 } else { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4003 level = get_sbits(&s->gb, 7); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4004 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4005 } else { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4006 last = get_bits1(&s->gb); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4007 run = get_bits(&s->gb, 6); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4008 level = (int8_t)get_bits(&s->gb, 8); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4009 if(level == -128){ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4010 if (s->codec_id == CODEC_ID_RV10) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4011 /* XXX: should patch encoder too */ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4012 level = get_sbits(&s->gb, 12); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4013 }else{ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4014 level = get_bits(&s->gb, 5); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4015 level |= get_sbits(&s->gb, 6)<<5; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4016 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4017 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4018 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4019 } else { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4020 run = rl->table_run[code]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4021 level = rl->table_level[code]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4022 last = code >= rl->last; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4023 if (get_bits1(&s->gb)) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4024 level = -level; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4025 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4026 i += run; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4027 if (i >= 64){ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4028 if(s->alt_inter_vlc && rl == &rl_inter && !s->mb_intra){ |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4029 //Looks like a hack but no, it's the way it is supposed to work ... |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4030 rl = &rl_intra_aic; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4031 i = 0; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4032 s->gb= gb; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4033 s->dsp.clear_block(block); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4034 goto retry; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4035 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4036 av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", s->mb_x, s->mb_y, s->mb_intra); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4037 return -1; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4038 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4039 j = scan_table[i]; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4040 block[j] = level; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4041 if (last) |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4042 break; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4043 i++; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4044 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4045 not_coded: |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4046 if (s->mb_intra && s->h263_aic) { |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4047 h263_pred_acdc(s, block, n); |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4048 i = 63; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4049 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4050 s->block_last_index[n] = i; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4051 return 0; |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4052 } |
56e57dc0fe19
cosmetics: Move H.263-related functions around to avoid forward declarations.
diego
parents:
10726
diff
changeset
|
4053 |
9103
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4054 static int h263_skip_b_part(MpegEncContext *s, int cbp) |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4055 { |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4056 DECLARE_ALIGNED(16, DCTELEM, dblock[64]); |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4057 int i, mbi; |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4058 |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4059 /* we have to set s->mb_intra to zero to decode B-part of PB-frame correctly |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4060 * but real value should be restored in order to be used later (in OBMC condition) |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4061 */ |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4062 mbi = s->mb_intra; |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4063 s->mb_intra = 0; |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4064 for (i = 0; i < 6; i++) { |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4065 if (h263_decode_block(s, dblock, i, cbp&32) < 0) |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4066 return -1; |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4067 cbp+=cbp; |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4068 } |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4069 s->mb_intra = mbi; |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4070 return 0; |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4071 } |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4072 |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4073 static int h263_get_modb(GetBitContext *gb, int pb_frame, int *cbpb) |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4074 { |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4075 int c, mv = 1; |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4076 |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4077 if (pb_frame < 3) { // h.263 Annex G and i263 PB-frame |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4078 c = get_bits1(gb); |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4079 if (pb_frame == 2 && c) |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4080 mv = !get_bits1(gb); |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4081 } else { // h.263 Annex M improved PB-frame |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4082 mv = get_unary(gb, 0, 4) + 1; |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4083 c = mv & 1; |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4084 mv = !!(mv & 2); |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4085 } |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4086 if(c) |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4087 *cbpb = get_bits(gb, 6); |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4088 return mv; |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4089 } |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4090 |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4091 int ff_h263_decode_mb(MpegEncContext *s, |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4092 DCTELEM block[6][64]) |
0 | 4093 { |
4094 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; | |
1064 | 4095 int16_t *mot_val; |
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
|
4096 const int xy= s->mb_x + s->mb_y * s->mb_stride; |
9103
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4097 int cbpb = 0, pb_mv_count = 0; |
2967 | 4098 |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4099 assert(!s->h263_pred); |
2967 | 4100 |
6481 | 4101 if (s->pict_type == FF_P_TYPE) { |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4102 do{ |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4103 if (get_bits1(&s->gb)) { |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4104 /* skip mb */ |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4105 s->mb_intra = 0; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4106 for(i=0;i<6;i++) |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4107 s->block_last_index[i] = -1; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4108 s->mv_dir = MV_DIR_FORWARD; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4109 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
|
4110 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; |
255 | 4111 s->mv[0][0][0] = 0; |
4112 s->mv[0][0][1] = 0; | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
4113 s->mb_skipped = !(s->obmc | s->loop_filter); |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4114 goto end; |
255 | 4115 } |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4116 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4117 if (cbpc < 0){ |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4118 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4119 return -1; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4120 } |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4121 }while(cbpc == 20); |
2967 | 4122 |
2632 | 4123 s->dsp.clear_blocks(s->block[0]); |
2967 | 4124 |
0 | 4125 dquant = cbpc & 8; |
4126 s->mb_intra = ((cbpc & 4) != 0); | |
262 | 4127 if (s->mb_intra) goto intra; |
2967 | 4128 |
9103
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4129 if(s->pb_frame && get_bits1(&s->gb)) |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4130 pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb); |
544 | 4131 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
2967 | 4132 |
1637 | 4133 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3) |
4134 cbpy ^= 0xF; | |
2967 | 4135 |
1637 | 4136 cbp = (cbpc & 3) | (cbpy << 2); |
0 | 4137 if (dquant) { |
1656 | 4138 h263_decode_dquant(s); |
0 | 4139 } |
2967 | 4140 |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4141 s->mv_dir = MV_DIR_FORWARD; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4142 if ((cbpc & 16) == 0) { |
2967 | 4143 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0; |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4144 /* 16x16 motion prediction */ |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4145 s->mv_type = MV_TYPE_16X16; |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
4146 h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4147 if (s->umvplus) |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4148 mx = h263p_decode_umotion(s, pred_x); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4149 else |
1655 | 4150 mx = h263_decode_motion(s, pred_x, 1); |
2967 | 4151 |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4152 if (mx >= 0xffff) |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4153 return -1; |
2967 | 4154 |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4155 if (s->umvplus) |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4156 my = h263p_decode_umotion(s, pred_y); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4157 else |
1655 | 4158 my = h263_decode_motion(s, pred_y, 1); |
2967 | 4159 |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4160 if (my >= 0xffff) |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4161 return -1; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4162 s->mv[0][0][0] = mx; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4163 s->mv[0][0][1] = my; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4164 |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4165 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1) |
2967 | 4166 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */ |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4167 } else { |
2967 | 4168 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0; |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4169 s->mv_type = MV_TYPE_8X8; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4170 for(i=0;i<4;i++) { |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
4171 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y); |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4172 if (s->umvplus) |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4173 mx = h263p_decode_umotion(s, pred_x); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4174 else |
1655 | 4175 mx = h263_decode_motion(s, pred_x, 1); |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4176 if (mx >= 0xffff) |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4177 return -1; |
2967 | 4178 |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4179 if (s->umvplus) |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4180 my = h263p_decode_umotion(s, pred_y); |
2967 | 4181 else |
1655 | 4182 my = h263_decode_motion(s, pred_y, 1); |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4183 if (my >= 0xffff) |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4184 return -1; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4185 s->mv[0][i][0] = mx; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4186 s->mv[0][i][1] = my; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4187 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1) |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4188 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */ |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4189 mot_val[0] = mx; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4190 mot_val[1] = my; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4191 } |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4192 } |
6481 | 4193 } else if(s->pict_type==FF_B_TYPE) { |
1655 | 4194 int mb_type; |
4195 const int stride= s->b8_stride; | |
1701 | 4196 int16_t *mot_val0 = s->current_picture.motion_val[0][ 2*(s->mb_x + s->mb_y*stride) ]; |
4197 int16_t *mot_val1 = s->current_picture.motion_val[1][ 2*(s->mb_x + s->mb_y*stride) ]; | |
1655 | 4198 // const int mv_xy= s->mb_x + 1 + s->mb_y * s->mb_stride; |
4199 | |
2967 | 4200 //FIXME ugly |
4201 mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*stride]= mot_val0[2+2*stride]= | |
4202 mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*stride]= mot_val0[3+2*stride]= | |
4203 mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*stride]= mot_val1[2+2*stride]= | |
1701 | 4204 mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*stride]= mot_val1[3+2*stride]= 0; |
1655 | 4205 |
4206 do{ | |
4207 mb_type= get_vlc2(&s->gb, h263_mbtype_b_vlc.table, H263_MBTYPE_B_VLC_BITS, 2); | |
4208 if (mb_type < 0){ | |
4209 av_log(s->avctx, AV_LOG_ERROR, "b mb_type damaged at %d %d\n", s->mb_x, s->mb_y); | |
4210 return -1; | |
4211 } | |
4212 | |
4213 mb_type= h263_mb_type_b_map[ mb_type ]; | |
4214 }while(!mb_type); | |
4215 | |
4216 s->mb_intra = IS_INTRA(mb_type); | |
4217 if(HAS_CBP(mb_type)){ | |
2632 | 4218 s->dsp.clear_blocks(s->block[0]); |
1655 | 4219 cbpc = get_vlc2(&s->gb, cbpc_b_vlc.table, CBPC_B_VLC_BITS, 1); |
4220 if(s->mb_intra){ | |
4221 dquant = IS_QUANT(mb_type); | |
4222 goto intra; | |
4223 } | |
4224 | |
4225 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); | |
4226 | |
4227 if (cbpy < 0){ | |
4228 av_log(s->avctx, AV_LOG_ERROR, "b cbpy damaged at %d %d\n", s->mb_x, s->mb_y); | |
4229 return -1; | |
4230 } | |
2967 | 4231 |
1655 | 4232 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3) |
4233 cbpy ^= 0xF; | |
2967 | 4234 |
1655 | 4235 cbp = (cbpc & 3) | (cbpy << 2); |
4236 }else | |
4237 cbp=0; | |
2967 | 4238 |
1655 | 4239 assert(!s->mb_intra); |
4240 | |
4241 if(IS_QUANT(mb_type)){ | |
1656 | 4242 h263_decode_dquant(s); |
1655 | 4243 } |
4244 | |
4245 if(IS_DIRECT(mb_type)){ | |
4246 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; | |
4247 mb_type |= ff_mpeg4_set_direct_mv(s, 0, 0); | |
4248 }else{ | |
4249 s->mv_dir = 0; | |
4250 s->mv_type= MV_TYPE_16X16; | |
4251 //FIXME UMV | |
4252 | |
4253 if(USES_LIST(mb_type, 0)){ | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
4254 int16_t *mot_val= h263_pred_motion(s, 0, 0, &mx, &my); |
1655 | 4255 s->mv_dir = MV_DIR_FORWARD; |
4256 | |
4257 mx = h263_decode_motion(s, mx, 1); | |
4258 my = h263_decode_motion(s, my, 1); | |
2967 | 4259 |
1655 | 4260 s->mv[0][0][0] = mx; |
4261 s->mv[0][0][1] = my; | |
1701 | 4262 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx; |
4263 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my; | |
1655 | 4264 } |
2967 | 4265 |
1655 | 4266 if(USES_LIST(mb_type, 1)){ |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
4267 int16_t *mot_val= h263_pred_motion(s, 0, 1, &mx, &my); |
1655 | 4268 s->mv_dir |= MV_DIR_BACKWARD; |
2967 | 4269 |
1655 | 4270 mx = h263_decode_motion(s, mx, 1); |
4271 my = h263_decode_motion(s, my, 1); | |
1701 | 4272 |
1655 | 4273 s->mv[1][0][0] = mx; |
4274 s->mv[1][0][1] = my; | |
1701 | 4275 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx; |
4276 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my; | |
1655 | 4277 } |
4278 } | |
2967 | 4279 |
1655 | 4280 s->current_picture.mb_type[xy]= mb_type; |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4281 } else { /* I-Frame */ |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4282 do{ |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4283 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4284 if (cbpc < 0){ |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4285 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4286 return -1; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4287 } |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4288 }while(cbpc == 8); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4289 |
2632 | 4290 s->dsp.clear_blocks(s->block[0]); |
4291 | |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4292 dquant = cbpc & 4; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4293 s->mb_intra = 1; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4294 intra: |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4295 s->current_picture.mb_type[xy]= MB_TYPE_INTRA; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4296 if (s->h263_aic) { |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4297 s->ac_pred = get_bits1(&s->gb); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4298 if(s->ac_pred){ |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4299 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED; |
2967 | 4300 |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4301 s->h263_aic_dir = get_bits1(&s->gb); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4302 } |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4303 }else |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4304 s->ac_pred = 0; |
2967 | 4305 |
9103
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4306 if(s->pb_frame && get_bits1(&s->gb)) |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4307 pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb); |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4308 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4309 if(cbpy<0){ |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4310 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4311 return -1; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4312 } |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4313 cbp = (cbpc & 3) | (cbpy << 2); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4314 if (dquant) { |
1656 | 4315 h263_decode_dquant(s); |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4316 } |
9103
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4317 |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4318 pb_mv_count += !!s->pb_frame; |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4319 } |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4320 |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4321 while(pb_mv_count--){ |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4322 h263_decode_motion(s, 0, 1); |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4323 h263_decode_motion(s, 0, 1); |
9093 | 4324 } |
4325 | |
4326 /* decode each block */ | |
4327 for (i = 0; i < 6; i++) { | |
4328 if (h263_decode_block(s, block[i], i, cbp&32) < 0) | |
4329 return -1; | |
4330 cbp+=cbp; | |
4331 } | |
4332 | |
9103
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4333 if(s->pb_frame && h263_skip_b_part(s, cbpb) < 0) |
b626fed816d7
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
kostya
parents:
9093
diff
changeset
|
4334 return -1; |
9093 | 4335 if(s->obmc && !s->mb_intra){ |
4336 if(s->pict_type == FF_P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1) | |
4337 preview_obmc(s); | |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4338 } |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4339 end: |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4340 |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4341 /* per-MB end of slice check */ |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4342 { |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4343 int v= show_bits(&s->gb, 16); |
2967 | 4344 |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4345 if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){ |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4346 v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4347 } |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4348 |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4349 if(v==0) |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4350 return SLICE_END; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4351 } |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4352 |
2967 | 4353 return SLICE_OK; |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4354 } |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4355 |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4356 int ff_mpeg4_decode_mb(MpegEncContext *s, |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4357 DCTELEM block[6][64]) |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4358 { |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4359 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4360 int16_t *mot_val; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4361 static int8_t quant_tab[4] = { -1, -2, 1, 2 }; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4362 const int xy= s->mb_x + s->mb_y * s->mb_stride; |
2967 | 4363 |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4364 assert(s->h263_pred); |
2967 | 4365 |
6481 | 4366 if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) { |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4367 do{ |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4368 if (get_bits1(&s->gb)) { |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4369 /* skip mb */ |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4370 s->mb_intra = 0; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4371 for(i=0;i<6;i++) |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4372 s->block_last_index[i] = -1; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4373 s->mv_dir = MV_DIR_FORWARD; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4374 s->mv_type = MV_TYPE_16X16; |
6481 | 4375 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){ |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4376 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4377 s->mcsel=1; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4378 s->mv[0][0][0]= get_amv(s, 0); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4379 s->mv[0][0][1]= get_amv(s, 1); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4380 |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
4381 s->mb_skipped = 0; |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4382 }else{ |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4383 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4384 s->mcsel=0; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4385 s->mv[0][0][0] = 0; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4386 s->mv[0][0][1] = 0; |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
4387 s->mb_skipped = 1; |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4388 } |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4389 goto end; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4390 } |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4391 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4392 if (cbpc < 0){ |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4393 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4394 return -1; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4395 } |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4396 }while(cbpc == 20); |
2967 | 4397 |
2632 | 4398 s->dsp.clear_blocks(s->block[0]); |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4399 dquant = cbpc & 8; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4400 s->mb_intra = ((cbpc & 4) != 0); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4401 if (s->mb_intra) goto intra; |
2967 | 4402 |
6481 | 4403 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0) |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4404 s->mcsel= get_bits1(&s->gb); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4405 else s->mcsel= 0; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4406 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1) ^ 0x0F; |
2967 | 4407 |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4408 cbp = (cbpc & 3) | (cbpy << 2); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4409 if (dquant) { |
1652 | 4410 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4411 } |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4412 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
|
4413 s->interlaced_dct= get_bits1(&s->gb); |
2967 | 4414 |
0 | 4415 s->mv_dir = MV_DIR_FORWARD; |
4416 if ((cbpc & 16) == 0) { | |
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4417 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
|
4418 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
|
4419 /* 16x16 global motion prediction */ |
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4420 s->mv_type = MV_TYPE_16X16; |
753 | 4421 mx= get_amv(s, 0); |
4422 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
|
4423 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
|
4424 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
|
4425 }else if((!s->progressive_sequence) && get_bits1(&s->gb)){ |
2967 | 4426 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
|
4427 /* 16x8 field motion prediction */ |
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4428 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
|
4429 |
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4430 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
|
4431 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
|
4432 |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
4433 h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
2967 | 4434 |
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4435 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
|
4436 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
|
4437 if (mx >= 0xffff) |
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4438 return -1; |
2967 | 4439 |
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4440 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
|
4441 if (my >= 0xffff) |
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4442 return -1; |
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4443 |
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4444 s->mv[0][i][0] = mx; |
661 | 4445 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
|
4446 } |
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4447 }else{ |
2967 | 4448 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
|
4449 /* 16x16 motion prediction */ |
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4450 s->mv_type = MV_TYPE_16X16; |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
4451 h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4452 mx = h263_decode_motion(s, pred_x, s->f_code); |
2967 | 4453 |
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4454 if (mx >= 0xffff) |
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4455 return -1; |
2967 | 4456 |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4457 my = h263_decode_motion(s, pred_y, s->f_code); |
2967 | 4458 |
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4459 if (my >= 0xffff) |
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4460 return -1; |
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4461 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
|
4462 s->mv[0][0][1] = my; |
255 | 4463 } |
0 | 4464 } else { |
2967 | 4465 s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0; |
0 | 4466 s->mv_type = MV_TYPE_8X8; |
4467 for(i=0;i<4;i++) { | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1936
diff
changeset
|
4468 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y); |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4469 mx = h263_decode_motion(s, pred_x, s->f_code); |
0 | 4470 if (mx >= 0xffff) |
4471 return -1; | |
2967 | 4472 |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4473 my = h263_decode_motion(s, pred_y, s->f_code); |
0 | 4474 if (my >= 0xffff) |
4475 return -1; | |
4476 s->mv[0][i][0] = mx; | |
4477 s->mv[0][i][1] = my; | |
4478 mot_val[0] = mx; | |
4479 mot_val[1] = my; | |
4480 } | |
4481 } | |
6481 | 4482 } else if(s->pict_type==FF_B_TYPE) { |
262 | 4483 int modb1; // first bit of modb |
4484 int modb2; // second bit of modb | |
4485 int mb_type; | |
4486 | |
4487 s->mb_intra = 0; //B-frames never contain intra blocks | |
4488 s->mcsel=0; // ... true gmc blocks | |
4489 | |
4490 if(s->mb_x==0){ | |
674 | 4491 for(i=0; i<2; i++){ |
2967 | 4492 s->last_mv[i][0][0]= |
4493 s->last_mv[i][0][1]= | |
4494 s->last_mv[i][1][0]= | |
674 | 4495 s->last_mv[i][1][1]= 0; |
4496 } | |
262 | 4497 } |
4498 | |
4499 /* if we skipped it in the future P Frame than skip it now too */ | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
4500 s->mb_skipped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC |
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
4501 |
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
4502 if(s->mb_skipped){ |
262 | 4503 /* skip mb */ |
4504 for(i=0;i<6;i++) | |
4505 s->block_last_index[i] = -1; | |
4506 | |
4507 s->mv_dir = MV_DIR_FORWARD; | |
4508 s->mv_type = MV_TYPE_16X16; | |
4509 s->mv[0][0][0] = 0; | |
4510 s->mv[0][0][1] = 0; | |
4511 s->mv[1][0][0] = 0; | |
4512 s->mv[1][0][1] = 0; | |
2967 | 4513 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
|
4514 goto end; |
262 | 4515 } |
4516 | |
2967 | 4517 modb1= get_bits1(&s->gb); |
666 | 4518 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
|
4519 mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded |
666 | 4520 cbp=0; |
4521 }else{ | |
262 | 4522 modb2= get_bits1(&s->gb); |
544 | 4523 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
|
4524 if(mb_type<0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
4525 av_log(s->avctx, AV_LOG_ERROR, "illegal MB_type\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
|
4526 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
|
4527 } |
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
|
4528 mb_type= mb_type_b_map[ mb_type ]; |
666 | 4529 if(modb2) cbp= 0; |
2632 | 4530 else{ |
4531 s->dsp.clear_blocks(s->block[0]); | |
4532 cbp= get_bits(&s->gb, 6); | |
4533 } | |
666 | 4534 |
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
|
4535 if ((!IS_DIRECT(mb_type)) && cbp) { |
262 | 4536 if(get_bits1(&s->gb)){ |
1652 | 4537 ff_set_qscale(s, s->qscale + get_bits1(&s->gb)*4 - 2); |
262 | 4538 } |
4539 } | |
664 | 4540 |
4541 if(!s->progressive_sequence){ | |
4542 if(cbp) | |
4543 s->interlaced_dct= get_bits1(&s->gb); | |
4544 | |
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
|
4545 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
|
4546 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
|
4547 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
|
4548 |
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
|
4549 if(USES_LIST(mb_type, 0)){ |
667 | 4550 s->field_select[0][0]= get_bits1(&s->gb); |
4551 s->field_select[0][1]= get_bits1(&s->gb); | |
4552 } | |
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
|
4553 if(USES_LIST(mb_type, 1)){ |
667 | 4554 s->field_select[1][0]= get_bits1(&s->gb); |
4555 s->field_select[1][1]= get_bits1(&s->gb); | |
4556 } | |
4557 } | |
666 | 4558 } |
4559 | |
667 | 4560 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
|
4561 if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){ |
666 | 4562 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
|
4563 |
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
|
4564 if(USES_LIST(mb_type, 0)){ |
666 | 4565 s->mv_dir = MV_DIR_FORWARD; |
4566 | |
4567 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code); | |
4568 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code); | |
4569 s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx; | |
4570 s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my; | |
667 | 4571 } |
2967 | 4572 |
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
|
4573 if(USES_LIST(mb_type, 1)){ |
666 | 4574 s->mv_dir |= MV_DIR_BACKWARD; |
4575 | |
4576 mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code); | |
4577 my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code); | |
4578 s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx; | |
4579 s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my; | |
4580 } | |
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
|
4581 }else if(!IS_DIRECT(mb_type)){ |
666 | 4582 s->mv_type= MV_TYPE_FIELD; |
667 | 4583 |
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
|
4584 if(USES_LIST(mb_type, 0)){ |
666 | 4585 s->mv_dir = MV_DIR_FORWARD; |
2967 | 4586 |
666 | 4587 for(i=0; i<2; i++){ |
4588 mx = h263_decode_motion(s, s->last_mv[0][i][0] , s->f_code); | |
4589 my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code); | |
4590 s->last_mv[0][i][0]= s->mv[0][i][0] = mx; | |
4591 s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2; | |
4592 } | |
667 | 4593 } |
2967 | 4594 |
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
|
4595 if(USES_LIST(mb_type, 1)){ |
666 | 4596 s->mv_dir |= MV_DIR_BACKWARD; |
4597 | |
4598 for(i=0; i<2; i++){ | |
4599 mx = h263_decode_motion(s, s->last_mv[1][i][0] , s->b_code); | |
4600 my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code); | |
4601 s->last_mv[1][i][0]= s->mv[1][i][0] = mx; | |
4602 s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2; | |
664 | 4603 } |
4604 } | |
4605 } | |
4606 } | |
2967 | 4607 |
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
|
4608 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
|
4609 if(IS_SKIP(mb_type)) |
666 | 4610 mx=my=0; |
4611 else{ | |
4612 mx = h263_decode_motion(s, 0, 1); | |
4613 my = h263_decode_motion(s, 0, 1); | |
4614 } | |
2967 | 4615 |
262 | 4616 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
|
4617 mb_type |= ff_mpeg4_set_direct_mv(s, mx, my); |
664 | 4618 } |
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
|
4619 s->current_picture.mb_type[xy]= mb_type; |
262 | 4620 } else { /* I-Frame */ |
1482 | 4621 do{ |
4622 cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2); | |
4623 if (cbpc < 0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
4624 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y); |
1482 | 4625 return -1; |
4626 } | |
4627 }while(cbpc == 8); | |
4628 | |
262 | 4629 dquant = cbpc & 4; |
4630 s->mb_intra = 1; | |
4631 intra: | |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4632 s->ac_pred = get_bits1(&s->gb); |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4633 if(s->ac_pred) |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4634 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4635 else |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4636 s->current_picture.mb_type[xy]= MB_TYPE_INTRA; |
2967 | 4637 |
544 | 4638 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
1482 | 4639 if(cbpy<0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
4640 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y); |
1482 | 4641 return -1; |
4642 } | |
0 | 4643 cbp = (cbpc & 3) | (cbpy << 2); |
3282 | 4644 |
4645 s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold; | |
4646 | |
0 | 4647 if (dquant) { |
1652 | 4648 ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); |
0 | 4649 } |
2967 | 4650 |
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4651 if(!s->progressive_sequence) |
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
4652 s->interlaced_dct= get_bits1(&s->gb); |
575 | 4653 |
2632 | 4654 s->dsp.clear_blocks(s->block[0]); |
575 | 4655 /* decode each block */ |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4656 for (i = 0; i < 6; i++) { |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4657 if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0) |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4658 return -1; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4659 cbp+=cbp; |
575 | 4660 } |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4661 goto end; |
0 | 4662 } |
4663 | |
4664 /* decode each block */ | |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4665 for (i = 0; i < 6; i++) { |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4666 if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0) |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4667 return -1; |
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
4668 cbp+=cbp; |
0 | 4669 } |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4670 end: |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4671 |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4672 /* per-MB end of slice check */ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4673 if(s->codec_id==CODEC_ID_MPEG4){ |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4674 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
|
4675 const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1; |
6481 | 4676 if(s->pict_type==FF_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
|
4677 return SLICE_OK; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4678 return SLICE_END; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4679 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4680 } |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4681 |
2967 | 4682 return SLICE_OK; |
0 | 4683 } |
4684 | |
1034 | 4685 /** |
4686 * decodes the dc value. | |
4687 * @param n block index (0-3 are luma, 4-5 are chroma) | |
4688 * @param dir_ptr the prediction direction will be stored here | |
4689 * @return the quantized dc | |
4690 */ | |
453 | 4691 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) |
0 | 4692 { |
2003 | 4693 int level, code; |
0 | 4694 |
2967 | 4695 if (n < 4) |
544 | 4696 code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1); |
2967 | 4697 else |
544 | 4698 code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1); |
453 | 4699 if (code < 0 || code > 9 /* && s->nbit<9 */){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
4700 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n"); |
0 | 4701 return -1; |
453 | 4702 } |
0 | 4703 if (code == 0) { |
4704 level = 0; | |
4705 } 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
|
4706 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
|
4707 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
|
4708 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
|
4709 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
|
4710 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
|
4711 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
|
4712 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
|
4713 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
|
4714 } |
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
|
4715 }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
|
4716 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
|
4717 } |
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
|
4718 |
453 | 4719 if (code > 8){ |
4720 if(get_bits1(&s->gb)==0){ /* marker */ | |
7831 | 4721 if(s->error_recognition>=2){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
4722 av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n"); |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4723 return -1; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4724 } |
453 | 4725 } |
4726 } | |
0 | 4727 } |
2003 | 4728 |
4729 return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0); | |
0 | 4730 } |
4731 | |
453 | 4732 /** |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4733 * decodes a block. |
6524 | 4734 * @return <0 if an error occurred |
453 | 4735 */ |
4736 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, | |
1132 | 4737 int n, int coded, int intra, int rvlc) |
0 | 4738 { |
549 | 4739 int level, i, last, run; |
6211
ed359f380aa7
Revert r11689 and r11690 (uninitalized warning fix) as its theoretically
michael
parents:
6209
diff
changeset
|
4740 int dc_pred_dir; |
575 | 4741 RLTable * rl; |
4742 RL_VLC_ELEM * rl_vlc; | |
1064 | 4743 const uint8_t * scan_table; |
549 | 4744 int qmul, qadd; |
0 | 4745 |
1132 | 4746 //Note intra & rvlc should be optimized away if this is inlined |
2967 | 4747 |
575 | 4748 if(intra) { |
3282 | 4749 if(s->use_intra_dc_vlc){ |
2979 | 4750 /* DC coef */ |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4751 if(s->partitioned_frame){ |
453 | 4752 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
|
4753 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
|
4754 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
|
4755 dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32; |
453 | 4756 }else{ |
4757 level = mpeg4_decode_dc(s, n, &dc_pred_dir); | |
4758 if (level < 0) | |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
4759 return -1; |
453 | 4760 } |
0 | 4761 block[0] = level; |
549 | 4762 i = 0; |
1520 | 4763 }else{ |
4764 i = -1; | |
3182 | 4765 ff_mpeg4_pred_dc(s, n, 0, &dc_pred_dir, 0); |
2967 | 4766 } |
6201 | 4767 if (!coded) |
4768 goto not_coded; | |
4769 | |
4770 if(rvlc){ | |
4771 rl = &rvlc_rl_intra; | |
4772 rl_vlc = rvlc_rl_intra.rl_vlc[0]; | |
4773 }else{ | |
4774 rl = &rl_intra; | |
4775 rl_vlc = rl_intra.rl_vlc[0]; | |
4776 } | |
4777 if (s->ac_pred) { | |
4778 if (dc_pred_dir == 0) | |
4779 scan_table = s->intra_v_scantable.permutated; /* left */ | |
4780 else | |
4781 scan_table = s->intra_h_scantable.permutated; /* top */ | |
4782 } else { | |
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
702
diff
changeset
|
4783 scan_table = s->intra_scantable.permutated; |
6201 | 4784 } |
4785 qmul=1; | |
4786 qadd=0; | |
0 | 4787 } else { |
549 | 4788 i = -1; |
0 | 4789 if (!coded) { |
549 | 4790 s->block_last_index[n] = i; |
0 | 4791 return 0; |
4792 } | |
1132 | 4793 if(rvlc) rl = &rvlc_rl_inter; |
4794 else rl = &rl_inter; | |
2967 | 4795 |
718 | 4796 scan_table = s->intra_scantable.permutated; |
661 | 4797 |
591 | 4798 if(s->mpeg_quant){ |
4799 qmul=1; | |
4800 qadd=0; | |
2967 | 4801 if(rvlc){ |
4802 rl_vlc = rvlc_rl_inter.rl_vlc[0]; | |
1132 | 4803 }else{ |
2967 | 4804 rl_vlc = rl_inter.rl_vlc[0]; |
1132 | 4805 } |
591 | 4806 }else{ |
4807 qmul = s->qscale << 1; | |
4808 qadd = (s->qscale - 1) | 1; | |
2967 | 4809 if(rvlc){ |
4810 rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale]; | |
1132 | 4811 }else{ |
2967 | 4812 rl_vlc = rl_inter.rl_vlc[s->qscale]; |
1132 | 4813 } |
591 | 4814 } |
0 | 4815 } |
549 | 4816 { |
4817 OPEN_READER(re, &s->gb); | |
0 | 4818 for(;;) { |
549 | 4819 UPDATE_CACHE(re, &s->gb); |
2615
0d88e3f89379
avoid UPDATE_CACHE() in GET_RL_VLC() if not needed
michael
parents:
2572
diff
changeset
|
4820 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0); |
549 | 4821 if (level==0) { |
2967 | 4822 /* escape */ |
1132 | 4823 if(rvlc){ |
4824 if(SHOW_UBITS(re, &s->gb, 1)==0){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
4825 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n"); |
1132 | 4826 return -1; |
4827 }; SKIP_CACHE(re, &s->gb, 1); | |
2967 | 4828 |
1132 | 4829 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); |
4830 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); | |
4831 SKIP_COUNTER(re, &s->gb, 1+1+6); | |
4832 UPDATE_CACHE(re, &s->gb); | |
2967 | 4833 |
1132 | 4834 if(SHOW_UBITS(re, &s->gb, 1)==0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
4835 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n"); |
1132 | 4836 return -1; |
4837 }; SKIP_CACHE(re, &s->gb, 1); | |
2967 | 4838 |
1132 | 4839 level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11); |
2967 | 4840 |
1132 | 4841 if(SHOW_UBITS(re, &s->gb, 5)!=0x10){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
4842 av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n"); |
1132 | 4843 return -1; |
4844 }; SKIP_CACHE(re, &s->gb, 5); | |
4845 | |
4846 level= level * qmul + qadd; | |
4847 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1); | |
4848 SKIP_COUNTER(re, &s->gb, 1+11+5+1); | |
4849 | |
4850 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
|
4851 if(last) i+=192; |
1132 | 4852 }else{ |
549 | 4853 int cache; |
4854 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
|
4855 |
2967 | 4856 if(IS_3IV1) |
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
|
4857 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
|
4858 |
549 | 4859 if (cache&0x80000000) { |
4860 if (cache&0x40000000) { | |
0 | 4861 /* third escape */ |
549 | 4862 SKIP_CACHE(re, &s->gb, 2); |
4863 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); | |
4864 run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); | |
4865 SKIP_COUNTER(re, &s->gb, 2+1+6); | |
4866 UPDATE_CACHE(re, &s->gb); | |
4867 | |
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
|
4868 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
|
4869 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
|
4870 }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
|
4871 if(SHOW_UBITS(re, &s->gb, 1)==0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
4872 av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n"); |
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
|
4873 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
|
4874 }; 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
|
4875 |
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
|
4876 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
|
4877 |
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
|
4878 if(SHOW_UBITS(re, &s->gb, 1)==0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
4879 av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n"); |
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
|
4880 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
|
4881 }; 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
|
4882 |
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
|
4883 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
|
4884 } |
2967 | 4885 |
1525
39efe24058ad
dont check if the ac esc 3 could have been stored as vlc as this detects only very few errors allthough it detects several buggy encoders
michael
parents:
1522
diff
changeset
|
4886 #if 0 |
7831 | 4887 if(s->error_recognition >= FF_ER_COMPLIANT){ |
4001 | 4888 const int abs_level= FFABS(level); |
1525
39efe24058ad
dont check if the ac esc 3 could have been stored as vlc as this detects only very few errors allthough it detects several buggy encoders
michael
parents:
1522
diff
changeset
|
4889 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){ |
498 | 4890 const int run1= run - rl->max_run[last][abs_level] - 1; |
453 | 4891 if(abs_level <= rl->max_level[last][run]){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
4892 av_log(s->avctx, AV_LOG_ERROR, "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
|
4893 return -1; |
453 | 4894 } |
7831 | 4895 if(s->error_recognition > FF_ER_COMPLIANT){ |
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
|
4896 if(abs_level <= rl->max_level[last][run]*2){ |
2846
40765c51a7a9
Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents:
2814
diff
changeset
|
4897 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n"); |
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
|
4898 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
|
4899 } |
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
|
4900 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){ |
2846
40765c51a7a9
Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents:
2814
diff
changeset
|
4901 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n"); |
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
|
4902 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
|
4903 } |
453 | 4904 } |
4905 } | |
4906 } | |
4907 #endif | |
2979 | 4908 if (level>0) level= level * qmul + qadd; |
549 | 4909 else level= level * qmul - qadd; |
4910 | |
2080 | 4911 if((unsigned)(level + 2048) > 4095){ |
7831 | 4912 if(s->error_recognition > FF_ER_COMPLIANT){ |
2080 | 4913 if(level > 2560 || level<-2560){ |
4914 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale); | |
4915 return -1; | |
4916 } | |
4917 } | |
4918 level= level<0 ? -2048 : 2047; | |
4919 } | |
4920 | |
549 | 4921 i+= run + 1; |
4922 if(last) i+=192; | |
0 | 4923 } else { |
4924 /* second escape */ | |
549 | 4925 #if MIN_CACHE_BITS < 20 |
4926 LAST_SKIP_BITS(re, &s->gb, 2); | |
4927 UPDATE_CACHE(re, &s->gb); | |
4928 #else | |
4929 SKIP_BITS(re, &s->gb, 2); | |
4930 #endif | |
2615
0d88e3f89379
avoid UPDATE_CACHE() in GET_RL_VLC() if not needed
michael
parents:
2572
diff
changeset
|
4931 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); |
549 | 4932 i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing |
4933 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
4934 LAST_SKIP_BITS(re, &s->gb, 1); | |
0 | 4935 } |
4936 } else { | |
4937 /* first escape */ | |
549 | 4938 #if MIN_CACHE_BITS < 19 |
4939 LAST_SKIP_BITS(re, &s->gb, 1); | |
4940 UPDATE_CACHE(re, &s->gb); | |
4941 #else | |
4942 SKIP_BITS(re, &s->gb, 1); | |
4943 #endif | |
2615
0d88e3f89379
avoid UPDATE_CACHE() in GET_RL_VLC() if not needed
michael
parents:
2572
diff
changeset
|
4944 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); |
549 | 4945 i+= run; |
4946 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing | |
4947 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
4948 LAST_SKIP_BITS(re, &s->gb, 1); | |
0 | 4949 } |
1132 | 4950 } |
0 | 4951 } else { |
549 | 4952 i+= run; |
4953 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
4954 LAST_SKIP_BITS(re, &s->gb, 1); | |
0 | 4955 } |
549 | 4956 if (i > 62){ |
4957 i-= 192; | |
4958 if(i&(~63)){ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
4959 av_log(s->avctx, AV_LOG_ERROR, "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
|
4960 return -1; |
549 | 4961 } |
4962 | |
4963 block[scan_table[i]] = level; | |
0 | 4964 break; |
549 | 4965 } |
4966 | |
4967 block[scan_table[i]] = level; | |
0 | 4968 } |
549 | 4969 CLOSE_READER(re, &s->gb); |
4970 } | |
0 | 4971 not_coded: |
1520 | 4972 if (intra) { |
3282 | 4973 if(!s->use_intra_dc_vlc){ |
2003 | 4974 block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0); |
2967 | 4975 |
3181 | 4976 i -= i>>31; //if(i == -1) i=0; |
1520 | 4977 } |
4978 | |
0 | 4979 mpeg4_pred_ac(s, block, n, dc_pred_dir); |
4980 if (s->ac_pred) { | |
549 | 4981 i = 63; /* XXX: not optimal */ |
0 | 4982 } |
4983 } | |
549 | 4984 s->block_last_index[n] = i; |
0 | 4985 return 0; |
4986 } | |
4987 | |
4988 /* most is hardcoded. should extend to handle all h263 streams */ | |
4989 int h263_decode_picture_header(MpegEncContext *s) | |
4990 { | |
1278
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4991 int format, width, height, i; |
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4992 uint32_t startcode; |
2967 | 4993 |
1278
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4994 align_get_bits(&s->gb); |
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4995 |
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4996 startcode= get_bits(&s->gb, 22-8); |
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4997 |
10535
95f3daa991a2
Use get_bits_left() instead of size_in_bits - get_bits_count().
rbultje
parents:
9999
diff
changeset
|
4998 for(i= get_bits_left(&s->gb); i>24; i-=8) { |
1278
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
4999 startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF; |
2967 | 5000 |
1278
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
5001 if(startcode == 0x20) |
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
5002 break; |
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
5003 } |
2967 | 5004 |
1278
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
5005 if (startcode != 0x20) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5006 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n"); |
0 | 5007 return -1; |
355 | 5008 } |
5009 /* temporal reference */ | |
1865 | 5010 i = get_bits(&s->gb, 8); /* picture timestamp */ |
5011 if( (s->picture_number&~0xFF)+i < s->picture_number) | |
5012 i+= 256; | |
2886 | 5013 s->current_picture_ptr->pts= |
1865 | 5014 s->picture_number= (s->picture_number&~0xFF) + i; |
355 | 5015 |
2967 | 5016 /* PTYPE starts here */ |
355 | 5017 if (get_bits1(&s->gb) != 1) { |
5018 /* marker */ | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5019 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n"); |
355 | 5020 return -1; |
5021 } | |
5022 if (get_bits1(&s->gb) != 0) { | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5023 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n"); |
2979 | 5024 return -1; /* h263 id */ |
5025 } | |
5026 skip_bits1(&s->gb); /* split screen off */ | |
5027 skip_bits1(&s->gb); /* camera off */ | |
5028 skip_bits1(&s->gb); /* freeze picture release off */ | |
0 | 5029 |
5030 format = get_bits(&s->gb, 3); | |
355 | 5031 /* |
5032 0 forbidden | |
5033 1 sub-QCIF | |
5034 10 QCIF | |
2979 | 5035 7 extended PTYPE (PLUSPTYPE) |
355 | 5036 */ |
0 | 5037 |
161 | 5038 if (format != 7 && format != 6) { |
0 | 5039 s->h263_plus = 0; |
5040 /* H.263v1 */ | |
5041 width = h263_format[format][0]; | |
5042 height = h263_format[format][1]; | |
5043 if (!width) | |
5044 return -1; | |
2967 | 5045 |
6481 | 5046 s->pict_type = FF_I_TYPE + get_bits1(&s->gb); |
0 | 5047 |
2967 | 5048 s->h263_long_vectors = get_bits1(&s->gb); |
0 | 5049 |
355 | 5050 if (get_bits1(&s->gb) != 0) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5051 av_log(s->avctx, AV_LOG_ERROR, "H263 SAC not supported\n"); |
2979 | 5052 return -1; /* SAC: off */ |
355 | 5053 } |
1633 | 5054 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */ |
5055 s->unrestricted_mv = s->h263_long_vectors || s->obmc; | |
2967 | 5056 |
9104 | 5057 s->pb_frame = get_bits1(&s->gb); |
1644 | 5058 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5); |
2979 | 5059 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */ |
1393 | 5060 |
5061 s->width = width; | |
5062 s->height = height; | |
1865 | 5063 s->avctx->sample_aspect_ratio= (AVRational){12,11}; |
2637 | 5064 s->avctx->time_base= (AVRational){1001, 30000}; |
0 | 5065 } else { |
161 | 5066 int ufep; |
2967 | 5067 |
0 | 5068 /* H.263v2 */ |
161 | 5069 s->h263_plus = 1; |
5070 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */ | |
355 | 5071 |
2967 | 5072 /* ufep other than 0 and 1 are reserved */ |
161 | 5073 if (ufep == 1) { |
2967 | 5074 /* OPPTYPE */ |
161 | 5075 format = get_bits(&s->gb, 3); |
4652 | 5076 dprintf(s->avctx, "ufep=1, format: %d\n", format); |
1872 | 5077 s->custom_pcf= get_bits1(&s->gb); |
5513 | 5078 s->umvplus = get_bits1(&s->gb); /* Unrestricted Motion Vector */ |
1644 | 5079 if (get_bits1(&s->gb) != 0) { |
5080 av_log(s->avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n"); | |
5081 } | |
1633 | 5082 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */ |
5083 s->h263_aic = get_bits1(&s->gb); /* Advanced Intra Coding (AIC) */ | |
1644 | 5084 s->loop_filter= get_bits1(&s->gb); |
5085 s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter; | |
2967 | 5086 |
1661 | 5087 s->h263_slice_structured= get_bits1(&s->gb); |
1278
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
5088 if (get_bits1(&s->gb) != 0) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5089 av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n"); |
1278
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
5090 } |
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
5091 if (get_bits1(&s->gb) != 0) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5092 av_log(s->avctx, AV_LOG_ERROR, "Independent Segment Decoding not supported\n"); |
1278
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
5093 } |
1637 | 5094 s->alt_inter_vlc= get_bits1(&s->gb); |
1639 | 5095 s->modified_quant= get_bits1(&s->gb); |
1644 | 5096 if(s->modified_quant) |
5097 s->chroma_qscale_table= ff_h263_chroma_qscale_table; | |
2967 | 5098 |
1278
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
5099 skip_bits(&s->gb, 1); /* Prevent start code emulation */ |
355 | 5100 |
161 | 5101 skip_bits(&s->gb, 3); /* Reserved */ |
355 | 5102 } else if (ufep != 0) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5103 av_log(s->avctx, AV_LOG_ERROR, "Bad UFEP type (%d)\n", ufep); |
0 | 5104 return -1; |
355 | 5105 } |
2967 | 5106 |
78 | 5107 /* MPPTYPE */ |
1655 | 5108 s->pict_type = get_bits(&s->gb, 3); |
5109 switch(s->pict_type){ | |
6481 | 5110 case 0: s->pict_type= FF_I_TYPE;break; |
5111 case 1: s->pict_type= FF_P_TYPE;break; | |
9104 | 5112 case 2: s->pict_type= FF_P_TYPE;s->pb_frame = 3;break; |
6481 | 5113 case 3: s->pict_type= FF_B_TYPE;break; |
5114 case 7: s->pict_type= FF_I_TYPE;break; //ZYGO | |
1655 | 5115 default: |
0 | 5116 return -1; |
1655 | 5117 } |
250
3449316664b5
- Bug fix on RTYPE (rounding type) not being honoured by H.263+ decoder.
pulento
parents:
249
diff
changeset
|
5118 skip_bits(&s->gb, 2); |
3449316664b5
- Bug fix on RTYPE (rounding type) not being honoured by H.263+ decoder.
pulento
parents:
249
diff
changeset
|
5119 s->no_rounding = get_bits1(&s->gb); |
3449316664b5
- Bug fix on RTYPE (rounding type) not being honoured by H.263+ decoder.
pulento
parents:
249
diff
changeset
|
5120 skip_bits(&s->gb, 4); |
2967 | 5121 |
78 | 5122 /* Get the picture dimensions */ |
161 | 5123 if (ufep) { |
5124 if (format == 6) { | |
5125 /* Custom Picture Format (CPFMT) */ | |
355 | 5126 s->aspect_ratio_info = get_bits(&s->gb, 4); |
4652 | 5127 dprintf(s->avctx, "aspect: %d\n", s->aspect_ratio_info); |
355 | 5128 /* aspect ratios: |
5129 0 - forbidden | |
5130 1 - 1:1 | |
5131 2 - 12:11 (CIF 4:3) | |
5132 3 - 10:11 (525-type 4:3) | |
5133 4 - 16:11 (CIF 16:9) | |
5134 5 - 40:33 (525-type 16:9) | |
5135 6-14 - reserved | |
5136 */ | |
161 | 5137 width = (get_bits(&s->gb, 9) + 1) * 4; |
5138 skip_bits1(&s->gb); | |
5139 height = get_bits(&s->gb, 9) * 4; | |
4652 | 5140 dprintf(s->avctx, "\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
|
5141 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) { |
355 | 5142 /* aspected dimensions */ |
1548 | 5143 s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8); |
5144 s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8); | |
887 | 5145 }else{ |
1548 | 5146 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info]; |
355 | 5147 } |
5148 } else { | |
161 | 5149 width = h263_format[format][0]; |
5150 height = h263_format[format][1]; | |
1865 | 5151 s->avctx->sample_aspect_ratio= (AVRational){12,11}; |
161 | 5152 } |
5153 if ((width == 0) || (height == 0)) | |
5154 return -1; | |
5155 s->width = width; | |
5156 s->height = height; | |
1872 | 5157 |
5158 if(s->custom_pcf){ | |
5159 int gcd; | |
2637 | 5160 s->avctx->time_base.den= 1800000; |
5161 s->avctx->time_base.num= 1000 + get_bits1(&s->gb); | |
5162 s->avctx->time_base.num*= get_bits(&s->gb, 7); | |
5163 if(s->avctx->time_base.num == 0){ | |
1872 | 5164 av_log(s, AV_LOG_ERROR, "zero framerate\n"); |
5165 return -1; | |
5166 } | |
8611 | 5167 gcd= av_gcd(s->avctx->time_base.den, s->avctx->time_base.num); |
2637 | 5168 s->avctx->time_base.den /= gcd; |
5169 s->avctx->time_base.num /= gcd; | |
1872 | 5170 }else{ |
2637 | 5171 s->avctx->time_base= (AVRational){1001, 30000}; |
1872 | 5172 } |
5173 } | |
2967 | 5174 |
1872 | 5175 if(s->custom_pcf){ |
5176 skip_bits(&s->gb, 2); //extended Temporal reference | |
5177 } | |
5178 | |
5179 if (ufep) { | |
1089 | 5180 if (s->umvplus) { |
5181 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */ | |
2967 | 5182 skip_bits1(&s->gb); |
161 | 5183 } |
1661 | 5184 if(s->h263_slice_structured){ |
5185 if (get_bits1(&s->gb) != 0) { | |
5186 av_log(s->avctx, AV_LOG_ERROR, "rectangular slices not supported\n"); | |
5187 } | |
5188 if (get_bits1(&s->gb) != 0) { | |
5189 av_log(s->avctx, AV_LOG_ERROR, "unordered slices not supported\n"); | |
5190 } | |
5191 } | |
78 | 5192 } |
2967 | 5193 |
0 | 5194 s->qscale = get_bits(&s->gb, 5); |
5195 } | |
1670 | 5196 |
1896
ef87d53ca87a
h.263 ssm + aic fix by (Maarten Daniels <maarten dot daniels at student dot luc dot ac dot be>)
michael
parents:
1893
diff
changeset
|
5197 s->mb_width = (s->width + 15) / 16; |
ef87d53ca87a
h.263 ssm + aic fix by (Maarten Daniels <maarten dot daniels at student dot luc dot ac dot be>)
michael
parents:
1893
diff
changeset
|
5198 s->mb_height = (s->height + 15) / 16; |
ef87d53ca87a
h.263 ssm + aic fix by (Maarten Daniels <maarten dot daniels at student dot luc dot ac dot be>)
michael
parents:
1893
diff
changeset
|
5199 s->mb_num = s->mb_width * s->mb_height; |
ef87d53ca87a
h.263 ssm + aic fix by (Maarten Daniels <maarten dot daniels at student dot luc dot ac dot be>)
michael
parents:
1893
diff
changeset
|
5200 |
9104 | 5201 if (s->pb_frame) { |
5202 skip_bits(&s->gb, 3); /* Temporal reference for B-pictures */ | |
5203 if (s->custom_pcf) | |
5204 skip_bits(&s->gb, 2); //extended Temporal reference | |
5205 skip_bits(&s->gb, 2); /* Quantization information for B-pictures */ | |
5206 } | |
5207 | |
0 | 5208 /* PEI */ |
21 | 5209 while (get_bits1(&s->gb) != 0) { |
5210 skip_bits(&s->gb, 8); | |
0 | 5211 } |
1896
ef87d53ca87a
h.263 ssm + aic fix by (Maarten Daniels <maarten dot daniels at student dot luc dot ac dot be>)
michael
parents:
1893
diff
changeset
|
5212 |
1670 | 5213 if(s->h263_slice_structured){ |
5214 if (get_bits1(&s->gb) != 1) { | |
5215 av_log(s->avctx, AV_LOG_ERROR, "SEPB1 marker missing\n"); | |
5216 return -1; | |
5217 } | |
5218 | |
5219 ff_h263_decode_mba(s); | |
5220 | |
5221 if (get_bits1(&s->gb) != 1) { | |
5222 av_log(s->avctx, AV_LOG_ERROR, "SEPB2 marker missing\n"); | |
5223 return -1; | |
5224 } | |
5225 } | |
0 | 5226 s->f_code = 1; |
2967 | 5227 |
498 | 5228 if(s->h263_aic){ |
2967 | 5229 s->y_dc_scale_table= |
1639 | 5230 s->c_dc_scale_table= ff_aic_dc_scale_table; |
498 | 5231 }else{ |
5232 s->y_dc_scale_table= | |
5233 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; | |
5234 } | |
5235 | |
1278
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
5236 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ |
5403 | 5237 show_pict_info(s); |
1278
483db104bb7b
truncated h263 decoding support / H263-ES "demuxer"
michaelni
parents:
1273
diff
changeset
|
5238 } |
8612 | 5239 if (s->pict_type == FF_I_TYPE && s->codec_tag == AV_RL32("ZYGO")){ |
1584
3615999a7284
dumping funny numbers from first zygo i frame header
michael
parents:
1583
diff
changeset
|
5240 int i,j; |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5241 for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb)); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5242 av_log(s->avctx, AV_LOG_DEBUG, "\n"); |
1584
3615999a7284
dumping funny numbers from first zygo i frame header
michael
parents:
1583
diff
changeset
|
5243 for(i=0; i<13; i++){ |
3615999a7284
dumping funny numbers from first zygo i frame header
michael
parents:
1583
diff
changeset
|
5244 for(j=0; j<3; j++){ |
3615999a7284
dumping funny numbers from first zygo i frame header
michael
parents:
1583
diff
changeset
|
5245 int v= get_bits(&s->gb, 8); |
3615999a7284
dumping funny numbers from first zygo i frame header
michael
parents:
1583
diff
changeset
|
5246 v |= get_sbits(&s->gb, 8)<<8; |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5247 av_log(s->avctx, AV_LOG_DEBUG, " %5d", v); |
1584
3615999a7284
dumping funny numbers from first zygo i frame header
michael
parents:
1583
diff
changeset
|
5248 } |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5249 av_log(s->avctx, AV_LOG_DEBUG, "\n"); |
1584
3615999a7284
dumping funny numbers from first zygo i frame header
michael
parents:
1583
diff
changeset
|
5250 } |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5251 for(i=0; i<50; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb)); |
1584
3615999a7284
dumping funny numbers from first zygo i frame header
michael
parents:
1583
diff
changeset
|
5252 } |
3615999a7284
dumping funny numbers from first zygo i frame header
michael
parents:
1583
diff
changeset
|
5253 |
0 | 5254 return 0; |
5255 } | |
5256 | |
1914 | 5257 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb) |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5258 { |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5259 int i; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5260 int a= 2<<s->sprite_warping_accuracy; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5261 int rho= 3-s->sprite_warping_accuracy; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5262 int r=16/a; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5263 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
|
5264 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
|
5265 int sprite_ref[4][2]; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5266 int virtual_ref[2][2]; |
753 | 5267 int w2, h2, w3, h3; |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5268 int alpha=0, beta=0; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5269 int w= s->width; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5270 int h= s->height; |
753 | 5271 int min_ab; |
5272 | |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5273 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
|
5274 int length; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5275 int x=0, y=0; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5276 |
3024
67d3bb5a4ce1
get_vlc -> get_vlc2 transition and get_vlc() removed from bitstream.h
banan
parents:
2985
diff
changeset
|
5277 length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3); |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5278 if(length){ |
1914 | 5279 x= get_xbits(gb, length); |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5280 } |
1914 | 5281 if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(gb); /* marker bit */ |
2967 | 5282 |
3024
67d3bb5a4ce1
get_vlc -> get_vlc2 transition and get_vlc() removed from bitstream.h
banan
parents:
2985
diff
changeset
|
5283 length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3); |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5284 if(length){ |
1914 | 5285 y=get_xbits(gb, length); |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5286 } |
1914 | 5287 skip_bits1(gb); /* marker bit */ |
9290
0bd35457454e
Record MPEG-4 sprite trajectory points [up to num_sprite_warping_points][isY].
gb
parents:
9259
diff
changeset
|
5288 s->sprite_traj[i][0]= d[i][0]= x; |
0bd35457454e
Record MPEG-4 sprite trajectory points [up to num_sprite_warping_points][isY].
gb
parents:
9259
diff
changeset
|
5289 s->sprite_traj[i][1]= d[i][1]= y; |
0bd35457454e
Record MPEG-4 sprite trajectory points [up to num_sprite_warping_points][isY].
gb
parents:
9259
diff
changeset
|
5290 } |
0bd35457454e
Record MPEG-4 sprite trajectory points [up to num_sprite_warping_points][isY].
gb
parents:
9259
diff
changeset
|
5291 for(; i<4; i++) |
0bd35457454e
Record MPEG-4 sprite trajectory points [up to num_sprite_warping_points][isY].
gb
parents:
9259
diff
changeset
|
5292 s->sprite_traj[i][0]= s->sprite_traj[i][1]= 0; |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5293 |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5294 while((1<<alpha)<w) alpha++; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5295 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
|
5296 w2= 1<<alpha; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5297 h2= 1<<beta; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5298 |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
5299 // Note, the 4th point isn't used for GMC |
262 | 5300 if(s->divx_version==500 && s->divx_build==413){ |
5301 sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0]; | |
5302 sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1]; | |
5303 sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0]; | |
5304 sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1]; | |
5305 sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0]; | |
5306 sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1]; | |
5307 } else { | |
5308 sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]); | |
5309 sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]); | |
5310 sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]); | |
5311 sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]); | |
5312 sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]); | |
5313 sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]); | |
5314 } | |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5315 /* 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
|
5316 sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */ |
2967 | 5317 |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5318 // 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
|
5319 // 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
|
5320 // 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
|
5321 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form |
2967 | 5322 virtual_ref[0][0]= 16*(vop_ref[0][0] + w2) |
359 | 5323 + 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); |
2967 | 5324 virtual_ref[0][1]= 16*vop_ref[0][1] |
359 | 5325 + 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); |
2967 | 5326 virtual_ref[1][0]= 16*vop_ref[0][0] |
359 | 5327 + 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); |
2967 | 5328 virtual_ref[1][1]= 16*(vop_ref[0][1] + h2) |
359 | 5329 + 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); |
2967 | 5330 |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5331 switch(s->num_sprite_warping_points) |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5332 { |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5333 case 0: |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5334 s->sprite_offset[0][0]= 0; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5335 s->sprite_offset[0][1]= 0; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5336 s->sprite_offset[1][0]= 0; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5337 s->sprite_offset[1][1]= 0; |
753 | 5338 s->sprite_delta[0][0]= a; |
5339 s->sprite_delta[0][1]= 0; | |
5340 s->sprite_delta[1][0]= 0; | |
5341 s->sprite_delta[1][1]= a; | |
5342 s->sprite_shift[0]= 0; | |
5343 s->sprite_shift[1]= 0; | |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5344 break; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5345 case 1: //GMC only |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5346 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
|
5347 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
|
5348 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
|
5349 s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2); |
753 | 5350 s->sprite_delta[0][0]= a; |
5351 s->sprite_delta[0][1]= 0; | |
5352 s->sprite_delta[1][0]= 0; | |
5353 s->sprite_delta[1][1]= a; | |
5354 s->sprite_shift[0]= 0; | |
5355 s->sprite_shift[1]= 0; | |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5356 break; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5357 case 2: |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5358 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho)) |
753 | 5359 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0]) |
5360 + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1]) | |
5361 + (1<<(alpha+rho-1)); | |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5362 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho)) |
753 | 5363 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0]) |
5364 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1]) | |
5365 + (1<<(alpha+rho-1)); | |
5366 s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1) | |
5367 +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1) | |
2967 | 5368 +2*w2*r*sprite_ref[0][0] |
5369 - 16*w2 | |
753 | 5370 + (1<<(alpha+rho+1))); |
2967 | 5371 s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1) |
753 | 5372 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1) |
2967 | 5373 +2*w2*r*sprite_ref[0][1] |
753 | 5374 - 16*w2 |
5375 + (1<<(alpha+rho+1))); | |
5376 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0]); | |
5377 s->sprite_delta[0][1]= (+r*sprite_ref[0][1] - virtual_ref[0][1]); | |
5378 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1]); | |
5379 s->sprite_delta[1][1]= (-r*sprite_ref[0][0] + virtual_ref[0][0]); | |
2967 | 5380 |
753 | 5381 s->sprite_shift[0]= alpha+rho; |
5382 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
|
5383 break; |
753 | 5384 case 3: |
847 | 5385 min_ab= FFMIN(alpha, beta); |
753 | 5386 w3= w2>>min_ab; |
5387 h3= h2>>min_ab; | |
5388 s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+beta+rho-min_ab)) | |
5389 + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0]) | |
5390 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1]) | |
5391 + (1<<(alpha+beta+rho-min_ab-1)); | |
5392 s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+beta+rho-min_ab)) | |
5393 + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0]) | |
5394 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1]) | |
5395 + (1<<(alpha+beta+rho-min_ab-1)); | |
5396 s->sprite_offset[1][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1) | |
5397 + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1) | |
5398 + 2*w2*h3*r*sprite_ref[0][0] | |
5399 - 16*w2*h3 | |
5400 + (1<<(alpha+beta+rho-min_ab+1)); | |
5401 s->sprite_offset[1][1]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1) | |
5402 + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1) | |
5403 + 2*w2*h3*r*sprite_ref[0][1] | |
5404 - 16*w2*h3 | |
5405 + (1<<(alpha+beta+rho-min_ab+1)); | |
5406 s->sprite_delta[0][0]= (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3; | |
5407 s->sprite_delta[0][1]= (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3; | |
5408 s->sprite_delta[1][0]= (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3; | |
5409 s->sprite_delta[1][1]= (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3; | |
2967 | 5410 |
753 | 5411 s->sprite_shift[0]= alpha + beta + rho - min_ab; |
5412 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
|
5413 break; |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5414 } |
2967 | 5415 /* try to simplify the situation */ |
753 | 5416 if( s->sprite_delta[0][0] == a<<s->sprite_shift[0] |
5417 && s->sprite_delta[0][1] == 0 | |
5418 && s->sprite_delta[1][0] == 0 | |
5419 && s->sprite_delta[1][1] == a<<s->sprite_shift[0]) | |
255 | 5420 { |
753 | 5421 s->sprite_offset[0][0]>>=s->sprite_shift[0]; |
5422 s->sprite_offset[0][1]>>=s->sprite_shift[0]; | |
5423 s->sprite_offset[1][0]>>=s->sprite_shift[1]; | |
5424 s->sprite_offset[1][1]>>=s->sprite_shift[1]; | |
5425 s->sprite_delta[0][0]= a; | |
5426 s->sprite_delta[0][1]= 0; | |
5427 s->sprite_delta[1][0]= 0; | |
5428 s->sprite_delta[1][1]= a; | |
5429 s->sprite_shift[0]= 0; | |
5430 s->sprite_shift[1]= 0; | |
255 | 5431 s->real_sprite_warping_points=1; |
5432 } | |
753 | 5433 else{ |
5434 int shift_y= 16 - s->sprite_shift[0]; | |
5435 int shift_c= 16 - s->sprite_shift[1]; | |
5436 for(i=0; i<2; i++){ | |
5437 s->sprite_offset[0][i]<<= shift_y; | |
5438 s->sprite_offset[1][i]<<= shift_c; | |
5439 s->sprite_delta[0][i]<<= shift_y; | |
5440 s->sprite_delta[1][i]<<= shift_y; | |
5441 s->sprite_shift[i]= 16; | |
5442 } | |
255 | 5443 s->real_sprite_warping_points= s->num_sprite_warping_points; |
753 | 5444 } |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5445 } |
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5446 |
942 | 5447 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){ |
5448 int hours, minutes, seconds; | |
5449 | |
5450 hours= get_bits(gb, 5); | |
5451 minutes= get_bits(gb, 6); | |
5452 skip_bits1(gb); | |
5453 seconds= get_bits(gb, 6); | |
5454 | |
5455 s->time_base= seconds + 60*(minutes + 60*hours); | |
5456 | |
5457 skip_bits1(gb); | |
5458 skip_bits1(gb); | |
2967 | 5459 |
942 | 5460 return 0; |
5461 } | |
5462 | |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5463 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
|
5464 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
|
5465 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5466 /* vol header */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5467 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
|
5468 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
|
5469 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
|
5470 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
|
5471 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
|
5472 } else { |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5473 vo_ver_id = 1; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5474 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5475 s->aspect_ratio_info= get_bits(gb, 4); |
2967 | 5476 if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){ |
1548 | 5477 s->avctx->sample_aspect_ratio.num= get_bits(gb, 8); // par_width |
5478 s->avctx->sample_aspect_ratio.den= get_bits(gb, 8); // par_height | |
887 | 5479 }else{ |
1548 | 5480 s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info]; |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5481 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5482 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5483 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
|
5484 int chroma_format= get_bits(gb, 2); |
8690 | 5485 if(chroma_format!=CHROMA_420){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5486 av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n"); |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5487 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5488 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
|
5489 if(get_bits1(gb)){ /* vbv parameters */ |
2979 | 5490 get_bits(gb, 15); /* first_half_bitrate */ |
5491 skip_bits1(gb); /* marker */ | |
5492 get_bits(gb, 15); /* latter_half_bitrate */ | |
5493 skip_bits1(gb); /* marker */ | |
5494 get_bits(gb, 15); /* first_half_vbv_buffer_size */ | |
5495 skip_bits1(gb); /* marker */ | |
5496 get_bits(gb, 3); /* latter_half_vbv_buffer_size */ | |
5497 get_bits(gb, 11); /* first_half_vbv_occupancy */ | |
5498 skip_bits1(gb); /* marker */ | |
5499 get_bits(gb, 15); /* latter_half_vbv_occupancy */ | |
5500 skip_bits1(gb); /* marker */ | |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5501 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5502 }else{ |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
5503 // set low delay flag only once the smartest? low delay detection won't be overriden |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5504 if(s->picture_number==0) |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5505 s->low_delay=0; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5506 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5507 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5508 s->shape = get_bits(gb, 2); /* vol shape */ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5509 if(s->shape != RECT_SHAPE) av_log(s->avctx, AV_LOG_ERROR, "only rectangular vol supported\n"); |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5510 if(s->shape == GRAY_SHAPE && vo_ver_id != 1){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5511 av_log(s->avctx, AV_LOG_ERROR, "Gray shape not supported\n"); |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5512 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
|
5513 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5514 |
1411 | 5515 check_marker(gb, "before time_increment_resolution"); |
2967 | 5516 |
2637 | 5517 s->avctx->time_base.den = get_bits(gb, 16); |
2812 | 5518 if(!s->avctx->time_base.den){ |
5519 av_log(s->avctx, AV_LOG_ERROR, "time_base.den==0\n"); | |
5520 return -1; | |
5521 } | |
2967 | 5522 |
2637 | 5523 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1; |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5524 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
|
5525 s->time_increment_bits = 1; |
2967 | 5526 |
1411 | 5527 check_marker(gb, "before fixed_vop_rate"); |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5528 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5529 if (get_bits1(gb) != 0) { /* fixed_vop_rate */ |
2637 | 5530 s->avctx->time_base.num = get_bits(gb, s->time_increment_bits); |
5531 }else | |
5532 s->avctx->time_base.num = 1; | |
5533 | |
2034 | 5534 s->t_frame=0; |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5535 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5536 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
|
5537 if (s->shape == RECT_SHAPE) { |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5538 skip_bits1(gb); /* marker */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5539 width = get_bits(gb, 13); |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5540 skip_bits1(gb); /* marker */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5541 height = get_bits(gb, 13); |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5542 skip_bits1(gb); /* marker */ |
8612 | 5543 if(width && height && !(s->width && s->codec_tag == AV_RL32("MP4S"))){ /* they should be non zero but who knows ... */ |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5544 s->width = width; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5545 s->height = height; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5546 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5547 } |
2967 | 5548 |
5549 s->progressive_sequence= | |
1659 | 5550 s->progressive_frame= get_bits1(gb)^1; |
3192 | 5551 s->interlaced_dct=0; |
2967 | 5552 if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO)) |
1644 | 5553 av_log(s->avctx, AV_LOG_INFO, "MPEG4 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
|
5554 if (vo_ver_id == 1) { |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5555 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
|
5556 } else { |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5557 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
|
5558 } |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5559 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "Static Sprites not supported\n"); |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5560 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
|
5561 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
|
5562 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
|
5563 skip_bits1(gb); /* marker */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5564 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
|
5565 skip_bits1(gb); /* marker */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5566 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
|
5567 skip_bits1(gb); /* marker */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5568 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
|
5569 skip_bits1(gb); /* marker */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5570 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5571 s->num_sprite_warping_points= get_bits(gb, 6); |
4930
655d25351bfc
fix possibly exploitable stack overflow with num_sprite_warping_points (found by reimar)
michael
parents:
4672
diff
changeset
|
5572 if(s->num_sprite_warping_points > 3){ |
655d25351bfc
fix possibly exploitable stack overflow with num_sprite_warping_points (found by reimar)
michael
parents:
4672
diff
changeset
|
5573 av_log(s->avctx, AV_LOG_ERROR, "%d sprite_warping_points\n", s->num_sprite_warping_points); |
655d25351bfc
fix possibly exploitable stack overflow with num_sprite_warping_points (found by reimar)
michael
parents:
4672
diff
changeset
|
5574 s->num_sprite_warping_points= 0; |
655d25351bfc
fix possibly exploitable stack overflow with num_sprite_warping_points (found by reimar)
michael
parents:
4672
diff
changeset
|
5575 return -1; |
655d25351bfc
fix possibly exploitable stack overflow with num_sprite_warping_points (found by reimar)
michael
parents:
4672
diff
changeset
|
5576 } |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5577 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
|
5578 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
|
5579 if(s->vol_sprite_usage==STATIC_SPRITE) |
2967 | 5580 s->low_latency_sprite= get_bits1(gb); |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5581 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5582 // FIXME sadct disable bit if verid!=1 && shape not rect |
2967 | 5583 |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5584 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
|
5585 s->quant_precision = get_bits(gb, 4); /* quant_precision */ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5586 if(get_bits(gb, 4)!=8) av_log(s->avctx, AV_LOG_ERROR, "N-bit not supported\n"); /* bits_per_pixel */ |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
5587 if(s->quant_precision!=5) av_log(s->avctx, AV_LOG_ERROR, "quant precision %d\n", s->quant_precision); |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5588 } else { |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5589 s->quant_precision = 5; |
0 | 5590 } |
2967 | 5591 |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5592 // 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
|
5593 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5594 if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */ |
1057 | 5595 int i, v; |
2967 | 5596 |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5597 /* load default matrixes */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5598 for(i=0; i<64; i++){ |
1092 | 5599 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
|
5600 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
|
5601 s->intra_matrix[j]= v; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5602 s->chroma_intra_matrix[j]= v; |
2967 | 5603 |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5604 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
|
5605 s->inter_matrix[j]= v; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5606 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
|
5607 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5608 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5609 /* load custom intra matrix */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5610 if(get_bits1(gb)){ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5611 int last=0; |
2979 | 5612 for(i=0; i<64; i++){ |
1057 | 5613 int j; |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5614 v= get_bits(gb, 8); |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5615 if(v==0) break; |
2967 | 5616 |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5617 last= v; |
1092 | 5618 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
|
5619 s->intra_matrix[j]= v; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5620 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
|
5621 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5622 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5623 /* replicate last value */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5624 for(; i<64; i++){ |
2979 | 5625 int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; |
1411 | 5626 s->intra_matrix[j]= last; |
5627 s->chroma_intra_matrix[j]= last; | |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5628 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5629 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5630 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5631 /* load custom non intra matrix */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5632 if(get_bits1(gb)){ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5633 int last=0; |
2979 | 5634 for(i=0; i<64; i++){ |
1057 | 5635 int j; |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5636 v= get_bits(gb, 8); |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5637 if(v==0) break; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5638 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5639 last= v; |
1092 | 5640 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
|
5641 s->inter_matrix[j]= v; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5642 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
|
5643 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5644 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5645 /* replicate last value */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5646 for(; i<64; i++){ |
2979 | 5647 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
|
5648 s->inter_matrix[j]= last; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5649 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
|
5650 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5651 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5652 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5653 // 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
|
5654 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5655 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5656 if(vo_ver_id != 1) |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5657 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
|
5658 else s->quarter_sample=0; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5659 |
8251
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5660 if(!get_bits1(gb)){ |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5661 int pos= get_bits_count(gb); |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5662 int estimation_method= get_bits(gb, 2); |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5663 if(estimation_method<2){ |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5664 if(!get_bits1(gb)){ |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5665 s->cplx_estimation_trash_i += 8*get_bits1(gb); //opaque |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5666 s->cplx_estimation_trash_i += 8*get_bits1(gb); //transparent |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5667 s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_cae |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5668 s->cplx_estimation_trash_i += 8*get_bits1(gb); //inter_cae |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5669 s->cplx_estimation_trash_i += 8*get_bits1(gb); //no_update |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5670 s->cplx_estimation_trash_i += 8*get_bits1(gb); //upampling |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5671 } |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5672 if(!get_bits1(gb)){ |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5673 s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_blocks |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5674 s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter_blocks |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5675 s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter4v_blocks |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5676 s->cplx_estimation_trash_i += 8*get_bits1(gb); //not coded blocks |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5677 } |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5678 if(!check_marker(gb, "in complexity estimation part 1")){ |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5679 skip_bits_long(gb, pos - get_bits_count(gb)); |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5680 goto no_cplx_est; |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5681 } |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5682 if(!get_bits1(gb)){ |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5683 s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_coeffs |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5684 s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_lines |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5685 s->cplx_estimation_trash_i += 8*get_bits1(gb); //vlc_syms |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5686 s->cplx_estimation_trash_i += 4*get_bits1(gb); //vlc_bits |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5687 } |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5688 if(!get_bits1(gb)){ |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5689 s->cplx_estimation_trash_p += 8*get_bits1(gb); //apm |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5690 s->cplx_estimation_trash_p += 8*get_bits1(gb); //npm |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5691 s->cplx_estimation_trash_b += 8*get_bits1(gb); //interpolate_mc_q |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5692 s->cplx_estimation_trash_p += 8*get_bits1(gb); //forwback_mc_q |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5693 s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel2 |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5694 s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel4 |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5695 } |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5696 if(!check_marker(gb, "in complexity estimation part 2")){ |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5697 skip_bits_long(gb, pos - get_bits_count(gb)); |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5698 goto no_cplx_est; |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5699 } |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5700 if(estimation_method==1){ |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5701 s->cplx_estimation_trash_i += 8*get_bits1(gb); //sadct |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5702 s->cplx_estimation_trash_p += 8*get_bits1(gb); //qpel |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5703 } |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5704 }else |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5705 av_log(s->avctx, AV_LOG_ERROR, "Invalid Complexity estimation method %d\n", estimation_method); |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5706 }else{ |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5707 no_cplx_est: |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5708 s->cplx_estimation_trash_i= |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5709 s->cplx_estimation_trash_p= |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5710 s->cplx_estimation_trash_b= 0; |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5711 } |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5712 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5713 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
|
5714 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5715 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
|
5716 if(s->data_partitioning){ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5717 s->rvlc= get_bits1(gb); |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5718 } |
2967 | 5719 |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5720 if(vo_ver_id != 1) { |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5721 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
|
5722 if(s->new_pred){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5723 av_log(s->avctx, AV_LOG_ERROR, "new pred not supported\n"); |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5724 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
|
5725 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
|
5726 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5727 s->reduced_res_vop= get_bits1(gb); |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5728 if(s->reduced_res_vop) av_log(s->avctx, AV_LOG_ERROR, "reduced resolution VOP not supported\n"); |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5729 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5730 else{ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5731 s->new_pred=0; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5732 s->reduced_res_vop= 0; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5733 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5734 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5735 s->scalability= get_bits1(gb); |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5736 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5737 if (s->scalability) { |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5738 GetBitContext bak= *gb; |
751 | 5739 int ref_layer_id; |
5740 int ref_layer_sampling_dir; | |
5741 int h_sampling_factor_n; | |
5742 int h_sampling_factor_m; | |
5743 int v_sampling_factor_n; | |
5744 int v_sampling_factor_m; | |
2967 | 5745 |
751 | 5746 s->hierachy_type= get_bits1(gb); |
5747 ref_layer_id= get_bits(gb, 4); | |
5748 ref_layer_sampling_dir= get_bits1(gb); | |
5749 h_sampling_factor_n= get_bits(gb, 5); | |
5750 h_sampling_factor_m= get_bits(gb, 5); | |
5751 v_sampling_factor_n= get_bits(gb, 5); | |
5752 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
|
5753 s->enhancement_type= get_bits1(gb); |
2967 | 5754 |
5755 if( h_sampling_factor_n==0 || h_sampling_factor_m==0 | |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5756 || v_sampling_factor_n==0 || v_sampling_factor_m==0){ |
2967 | 5757 |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5758 s->scalability=0; |
2967 | 5759 |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5760 *gb= bak; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5761 }else |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5762 av_log(s->avctx, AV_LOG_ERROR, "scalability not supported\n"); |
2967 | 5763 |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5764 // bin shape stuff FIXME |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5765 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5766 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5767 return 0; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5768 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5769 |
1034 | 5770 /** |
5771 * decodes the user data stuff in the header. | |
6918 | 5772 * Also initializes divx/xvid/lavc_version/build. |
1034 | 5773 */ |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5774 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
|
5775 char buf[256]; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5776 int i; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5777 int e; |
2966
564788471dd4
bitstream related fixes from [PATCH] from DivX, Part 9: bitstream crashes by (Steve Lhomme | slhomme divxcorp com)
michael
parents:
2962
diff
changeset
|
5778 int ver = 0, build = 0, ver2 = 0, ver3 = 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
|
5779 char last; |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5780 |
3615 | 5781 for(i=0; i<255 && get_bits_count(gb) < gb->size_in_bits; i++){ |
2804 | 5782 if(show_bits(gb, 23) == 0) break; |
5783 buf[i]= get_bits(gb, 8); | |
5784 } | |
5785 buf[i]=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
|
5786 |
761 | 5787 /* 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
|
5788 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
|
5789 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
|
5790 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
|
5791 if(e>=2){ |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5792 s->divx_version= ver; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5793 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
|
5794 s->divx_packed= e==3 && last=='p'; |
8106
2f5101a67500
Only warn about "Invalid and inefficient vfw-avi packed B frames" once.
andoma
parents:
8042
diff
changeset
|
5795 if(s->divx_packed && !s->showed_packed_warning) { |
6893
72dafc993490
Warn about packed B-frames. (especially useful if the file in question is
michael
parents:
6655
diff
changeset
|
5796 av_log(s->avctx, AV_LOG_WARNING, "Invalid and inefficient vfw-avi packed B frames detected\n"); |
8106
2f5101a67500
Only warn about "Invalid and inefficient vfw-avi packed B frames" once.
andoma
parents:
8042
diff
changeset
|
5797 s->showed_packed_warning=1; |
2f5101a67500
Only warn about "Invalid and inefficient vfw-avi packed B frames" once.
andoma
parents:
8042
diff
changeset
|
5798 } |
0 | 5799 } |
2967 | 5800 |
761 | 5801 /* ffmpeg detection */ |
2805
55a6659fc2ee
fix user data parsing code so it suppors pre1 and cvs
michael
parents:
2804
diff
changeset
|
5802 e=sscanf(buf, "FFmpe%*[^b]b%d", &build)+3; |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5803 if(e!=4) |
2967 | 5804 e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build); |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5805 if(e!=4){ |
2814 | 5806 e=sscanf(buf, "Lavc%d.%d.%d", &ver, &ver2, &ver3)+1; |
2966
564788471dd4
bitstream related fixes from [PATCH] from DivX, Part 9: bitstream crashes by (Steve Lhomme | slhomme divxcorp com)
michael
parents:
2962
diff
changeset
|
5807 if (e>1) |
564788471dd4
bitstream related fixes from [PATCH] from DivX, Part 9: bitstream crashes by (Steve Lhomme | slhomme divxcorp com)
michael
parents:
2962
diff
changeset
|
5808 build= (ver<<16) + (ver2<<8) + ver3; |
2814 | 5809 } |
5810 if(e!=4){ | |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5811 if(strcmp(buf, "ffmpeg")==0){ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5812 s->lavc_build= 4600; |
63 | 5813 } |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5814 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5815 if(e==4){ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5816 s->lavc_build= build; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5817 } |
2967 | 5818 |
6908 | 5819 /* Xvid detection */ |
761 | 5820 e=sscanf(buf, "XviD%d", &build); |
5821 if(e==1){ | |
5822 s->xvid_build= build; | |
5823 } | |
5824 | |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5825 return 0; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5826 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5827 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5828 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
|
5829 int time_incr, time_increment; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5830 |
6481 | 5831 s->pict_type = get_bits(gb, 2) + FF_I_TYPE; /* pict type: I = 0 , P = 1 */ |
5832 if(s->pict_type==FF_B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){ | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
5833 av_log(s->avctx, AV_LOG_ERROR, "low_delay flag incorrectly, clearing it\n"); |
365
fdeec2834c79
there are divx5? encoded files without a userdata section but with b-frames :(
michaelni
parents:
364
diff
changeset
|
5834 s->low_delay=0; |
fdeec2834c79
there are divx5? encoded files without a userdata section but with b-frames :(
michaelni
parents:
364
diff
changeset
|
5835 } |
2967 | 5836 |
6481 | 5837 s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE; |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
5838 if(s->partitioned_frame) |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
5839 s->decode_mb= mpeg4_decode_partitioned_mb; |
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
5840 else |
1649
e6a474a5b929
split ff_h263_decode_mb() into h263 and mpeg4 versions
michael
parents:
1646
diff
changeset
|
5841 s->decode_mb= ff_mpeg4_decode_mb; |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
5842 |
262 | 5843 time_incr=0; |
2967 | 5844 while (get_bits1(gb) != 0) |
0 | 5845 time_incr++; |
5846 | |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5847 check_marker(gb, "before time_increment"); |
2666 | 5848 |
5849 if(s->time_increment_bits==0 || !(show_bits(gb, s->time_increment_bits+1)&1)){ | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
5850 av_log(s->avctx, AV_LOG_ERROR, "hmm, seems the headers are not complete, trying to guess time_increment_bits\n"); |
1068 | 5851 |
5852 for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){ | |
10664 | 5853 if ( s->pict_type == FF_P_TYPE |
5854 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) { | |
5855 if((show_bits(gb, s->time_increment_bits+6)&0x37) == 0x30) break; | |
5856 }else | |
5857 if((show_bits(gb, s->time_increment_bits+5)&0x1F) == 0x18) break; | |
1068 | 5858 } |
1396 | 5859 |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5860 av_log(s->avctx, AV_LOG_ERROR, "my guess is %d bits ;)\n",s->time_increment_bits); |
1068 | 5861 } |
2967 | 5862 |
1411 | 5863 if(IS_3IV1) time_increment= get_bits1(gb); //FIXME investigate further |
5864 else time_increment= get_bits(gb, s->time_increment_bits); | |
2967 | 5865 |
6481 | 5866 if(s->pict_type!=FF_B_TYPE){ |
324 | 5867 s->last_time_base= s->time_base; |
262 | 5868 s->time_base+= time_incr; |
2637 | 5869 s->time= s->time_base*s->avctx->time_base.den + time_increment; |
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
718
diff
changeset
|
5870 if(s->workaround_bugs&FF_BUG_UMP4){ |
700
0fb4c66527e1
autodetect UMP4 (by adding a fourcc field to AVCodecContext)
michaelni
parents:
699
diff
changeset
|
5871 if(s->time < s->last_non_b_time){ |
0fb4c66527e1
autodetect UMP4 (by adding a fourcc field to AVCodecContext)
michaelni
parents:
699
diff
changeset
|
5872 s->time_base++; |
2637 | 5873 s->time+= s->avctx->time_base.den; |
700
0fb4c66527e1
autodetect UMP4 (by adding a fourcc field to AVCodecContext)
michaelni
parents:
699
diff
changeset
|
5874 } |
664 | 5875 } |
324 | 5876 s->pp_time= s->time - s->last_non_b_time; |
5877 s->last_non_b_time= s->time; | |
262 | 5878 }else{ |
2637 | 5879 s->time= (s->last_time_base + time_incr)*s->avctx->time_base.den + time_increment; |
664 | 5880 s->pb_time= s->pp_time - (s->last_non_b_time - s->time); |
5881 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){ | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
5882 return FRAME_SKIPPED; |
335 | 5883 } |
3247 | 5884 ff_mpeg4_init_direct_mv(s); |
2967 | 5885 |
2034 | 5886 if(s->t_frame==0) s->t_frame= s->pb_time; |
664 | 5887 if(s->t_frame==0) s->t_frame=1; // 1/0 protection |
2967 | 5888 s->pp_field_time= ( ROUNDED_DIV(s->last_non_b_time, s->t_frame) |
664 | 5889 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2; |
2967 | 5890 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame) |
664 | 5891 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2; |
4346 | 5892 if(!s->progressive_sequence){ |
5893 if(s->pp_field_time <= s->pb_field_time || s->pb_field_time <= 1) | |
5894 return FRAME_SKIPPED; | |
5895 } | |
262 | 5896 } |
2967 | 5897 |
2813
6fd9dbb8c385
try to check for nonsense time_base instead of setting fake one
michael
parents:
2812
diff
changeset
|
5898 if(s->avctx->time_base.num) |
6fd9dbb8c385
try to check for nonsense time_base instead of setting fake one
michael
parents:
2812
diff
changeset
|
5899 s->current_picture_ptr->pts= (s->time + s->avctx->time_base.num/2) / s->avctx->time_base.num; |
6fd9dbb8c385
try to check for nonsense time_base instead of setting fake one
michael
parents:
2812
diff
changeset
|
5900 else |
6fd9dbb8c385
try to check for nonsense time_base instead of setting fake one
michael
parents:
2812
diff
changeset
|
5901 s->current_picture_ptr->pts= AV_NOPTS_VALUE; |
942 | 5902 if(s->avctx->debug&FF_DEBUG_PTS) |
2962 | 5903 av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %"PRId64"\n", s->current_picture_ptr->pts); |
2034 | 5904 |
1068 | 5905 check_marker(gb, "before vop_coded"); |
2967 | 5906 |
0 | 5907 /* vop coded */ |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5908 if (get_bits1(gb) != 1){ |
2271 | 5909 if(s->avctx->debug&FF_DEBUG_PICT_INFO) |
5910 av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n"); | |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
5911 return FRAME_SKIPPED; |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5912 } |
6481 | 5913 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == FF_P_TYPE |
5914 || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) { | |
0 | 5915 /* rounding type for motion estimation */ |
2979 | 5916 s->no_rounding = get_bits1(gb); |
63 | 5917 } else { |
2979 | 5918 s->no_rounding = 0; |
0 | 5919 } |
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
5920 //FIXME reduced res stuff |
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
5921 |
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
5922 if (s->shape != RECT_SHAPE) { |
6481 | 5923 if (s->vol_sprite_usage != 1 || s->pict_type != FF_I_TYPE) { |
63 | 5924 int width, height, hor_spat_ref, ver_spat_ref; |
2967 | 5925 |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5926 width = get_bits(gb, 13); |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5927 skip_bits1(gb); /* marker */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5928 height = get_bits(gb, 13); |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5929 skip_bits1(gb); /* marker */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5930 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
|
5931 skip_bits1(gb); /* marker */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5932 ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */ |
63 | 5933 } |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5934 skip_bits1(gb); /* change_CR_disable */ |
2967 | 5935 |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5936 if (get_bits1(gb) != 0) { |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5937 skip_bits(gb, 8); /* constant_alpha_value */ |
63 | 5938 } |
5939 } | |
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
5940 //FIXME complexity estimation stuff |
2967 | 5941 |
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
5942 if (s->shape != BIN_ONLY_SHAPE) { |
8251
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5943 skip_bits_long(gb, s->cplx_estimation_trash_i); |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5944 if(s->pict_type != FF_I_TYPE) |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5945 skip_bits_long(gb, s->cplx_estimation_trash_p); |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5946 if(s->pict_type == FF_B_TYPE) |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5947 skip_bits_long(gb, s->cplx_estimation_trash_b); |
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5948 |
1520 | 5949 s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ]; |
619
2be2cc8fd0a1
mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents:
617
diff
changeset
|
5950 if(!s->progressive_sequence){ |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5951 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
|
5952 s->alternate_scan= get_bits1(gb); |
661 | 5953 }else |
5954 s->alternate_scan= 0; | |
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
5955 } |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5956 |
718 | 5957 if(s->alternate_scan){ |
1273 | 5958 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan); |
5959 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan); | |
5960 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan); | |
5961 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); | |
718 | 5962 } else{ |
1273 | 5963 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct); |
5964 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct); | |
5965 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan); | |
5966 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); | |
718 | 5967 } |
2967 | 5968 |
6481 | 5969 if(s->pict_type == FF_S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){ |
1914 | 5970 mpeg4_decode_sprite_trajectory(s, gb); |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5971 if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supported\n"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5972 if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supported\n"); |
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
5973 } |
254
b4fed8b24e3a
gmc bitstream decoding support (the real motion compensation isnt implemnted yet)
michaelni
parents:
253
diff
changeset
|
5974 |
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
5975 if (s->shape != BIN_ONLY_SHAPE) { |
1644 | 5976 s->chroma_qscale= 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
|
5977 if(s->qscale==0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5978 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (qscale=0)\n"); |
264
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
263
diff
changeset
|
5979 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
|
5980 } |
2967 | 5981 |
6481 | 5982 if (s->pict_type != FF_I_TYPE) { |
2979 | 5983 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
|
5984 if(s->f_code==0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
5985 av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (f_code=0)\n"); |
264
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
263
diff
changeset
|
5986 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
|
5987 } |
582
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
5988 }else |
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
5989 s->f_code=1; |
2967 | 5990 |
6481 | 5991 if (s->pict_type == FF_B_TYPE) { |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
5992 s->b_code = get_bits(gb, 3); |
582
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
5993 }else |
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
5994 s->b_code=1; |
906 | 5995 |
5996 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ | |
8251
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
5997 av_log(s->avctx, AV_LOG_DEBUG, "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 vot:%d%s dc:%d ce:%d/%d/%d\n", |
2967 | 5998 s->qscale, s->f_code, s->b_code, |
6481 | 5999 s->pict_type == FF_I_TYPE ? "I" : (s->pict_type == FF_P_TYPE ? "P" : (s->pict_type == FF_B_TYPE ? "B" : "S")), |
2967 | 6000 gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first, |
930 | 6001 s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points, |
8251
d256dbf74ea6
Implement complexity estimation parsing and try to detect an incorrectly set
michael
parents:
8106
diff
changeset
|
6002 s->sprite_warping_accuracy, 1-s->no_rounding, s->vo_type, s->vol_control_parameters ? " VOLC" : " ", s->intra_dc_threshold, s->cplx_estimation_trash_i, s->cplx_estimation_trash_p, s->cplx_estimation_trash_b); |
906 | 6003 } |
6004 | |
253
4448dd55d415
parsing more of the mpeg4 header & print some "not supported" stuff
michaelni
parents:
250
diff
changeset
|
6005 if(!s->scalability){ |
6481 | 6006 if (s->shape!=RECT_SHAPE && s->pict_type!=FF_I_TYPE) { |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6007 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
|
6008 } |
575 | 6009 }else{ |
6010 if(s->enhancement_type){ | |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6011 int load_backward_shape= get_bits1(gb); |
575 | 6012 if(load_backward_shape){ |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
6013 av_log(s->avctx, AV_LOG_ERROR, "load backward shape isn't supported\n"); |
575 | 6014 } |
6015 } | |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6016 skip_bits(gb, 2); //ref_select_code |
63 | 6017 } |
6018 } | |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
6019 /* detect buggy encoders which don't set the low_delay flag (divx4/xvid/opendivx)*/ |
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
6020 // note we cannot detect divx5 without b-frames easily (although it's buggy too) |
365
fdeec2834c79
there are divx5? encoded files without a userdata section but with b-frames :(
michaelni
parents:
364
diff
changeset
|
6021 if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6022 av_log(s->avctx, AV_LOG_ERROR, "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
|
6023 s->low_delay=1; |
c2f789fe4945
detecting xvid/divx4/opendivx and set low_delay flag
michaelni
parents:
344
diff
changeset
|
6024 } |
c2f789fe4945
detecting xvid/divx4/opendivx and set low_delay flag
michaelni
parents:
344
diff
changeset
|
6025 |
2646
c735e3e60ca7
Even More spelling errors. patch by (Kevin Baragona <kevinmb500 gawab com)
michael
parents:
2639
diff
changeset
|
6026 s->picture_number++; // better than pic number==0 always ;) |
346
c2f789fe4945
detecting xvid/divx4/opendivx and set low_delay flag
michaelni
parents:
344
diff
changeset
|
6027 |
2967 | 6028 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support |
498 | 6029 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table; |
6030 | |
1366
80067f8d6770
fix edge repeating bug for %16!=0 files, this fixes Quicktime mpeg4 (they arent buggy)
michaelni
parents:
1364
diff
changeset
|
6031 if(s->workaround_bugs&FF_BUG_EDGE){ |
582
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
6032 s->h_edge_pos= s->width; |
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
6033 s->v_edge_pos= s->height; |
5132a4ee50cd
different edge positions fixed with edge emu / dr1
michaelni
parents:
575
diff
changeset
|
6034 } |
63 | 6035 return 0; |
0 | 6036 } |
6037 | |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6038 /** |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6039 * decode mpeg4 headers |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6040 * @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
|
6041 * 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
|
6042 * 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
|
6043 */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6044 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
|
6045 { |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6046 int startcode, v; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6047 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6048 /* search next start code */ |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6049 align_get_bits(gb); |
2406 | 6050 |
8612 | 6051 if(s->codec_tag == AV_RL32("WV1F") && show_bits(gb, 24) == 0x575630){ |
2406 | 6052 skip_bits(gb, 24); |
6053 if(get_bits(gb, 8) == 0xF0) | |
8417
ad4f10287633
Move CODEC_FLAG_LOW_DELAY into ff_mpeg4_decode_picture_header().
michael
parents:
8297
diff
changeset
|
6054 goto end; |
2406 | 6055 } |
6056 | |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6057 startcode = 0xff; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6058 for(;;) { |
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
|
6059 if(get_bits_count(gb) >= gb->size_in_bits){ |
2554
84a8f374bf63
fixing playback of xvid pretending to be divx (sample_vop_nc.avi)
michael
parents:
2522
diff
changeset
|
6060 if(gb->size_in_bits==8 && (s->divx_version || s->xvid_build)){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6061 av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits); |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
6062 return FRAME_SKIPPED; //divx bug |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6063 }else |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6064 return -1; //end of stream |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6065 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6066 |
2966
564788471dd4
bitstream related fixes from [PATCH] from DivX, Part 9: bitstream crashes by (Steve Lhomme | slhomme divxcorp com)
michael
parents:
2962
diff
changeset
|
6067 /* use the bits after the test */ |
564788471dd4
bitstream related fixes from [PATCH] from DivX, Part 9: bitstream crashes by (Steve Lhomme | slhomme divxcorp com)
michael
parents:
2962
diff
changeset
|
6068 v = get_bits(gb, 8); |
564788471dd4
bitstream related fixes from [PATCH] from DivX, Part 9: bitstream crashes by (Steve Lhomme | slhomme divxcorp com)
michael
parents:
2962
diff
changeset
|
6069 startcode = ((startcode << 8) | v) & 0xffffffff; |
564788471dd4
bitstream related fixes from [PATCH] from DivX, Part 9: bitstream crashes by (Steve Lhomme | slhomme divxcorp com)
michael
parents:
2962
diff
changeset
|
6070 |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6071 if((startcode&0xFFFFFF00) != 0x100) |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6072 continue; //no startcode |
2967 | 6073 |
942 | 6074 if(s->avctx->debug&FF_DEBUG_STARTCODE){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6075 av_log(s->avctx, AV_LOG_DEBUG, "startcode: %3X ", startcode); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6076 if (startcode<=0x11F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Start"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6077 else if(startcode<=0x12F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Layer Start"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6078 else if(startcode<=0x13F) av_log(s->avctx, AV_LOG_DEBUG, "Reserved"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6079 else if(startcode<=0x15F) av_log(s->avctx, AV_LOG_DEBUG, "FGS bp start"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6080 else if(startcode<=0x1AF) av_log(s->avctx, AV_LOG_DEBUG, "Reserved"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6081 else if(startcode==0x1B0) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq Start"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6082 else if(startcode==0x1B1) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq End"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6083 else if(startcode==0x1B2) av_log(s->avctx, AV_LOG_DEBUG, "User Data"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6084 else if(startcode==0x1B3) av_log(s->avctx, AV_LOG_DEBUG, "Group of VOP start"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6085 else if(startcode==0x1B4) av_log(s->avctx, AV_LOG_DEBUG, "Video Session Error"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6086 else if(startcode==0x1B5) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Start"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6087 else if(startcode==0x1B6) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Plane start"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6088 else if(startcode==0x1B7) av_log(s->avctx, AV_LOG_DEBUG, "slice start"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6089 else if(startcode==0x1B8) av_log(s->avctx, AV_LOG_DEBUG, "extension start"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6090 else if(startcode==0x1B9) av_log(s->avctx, AV_LOG_DEBUG, "fgs start"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6091 else if(startcode==0x1BA) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object start"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6092 else if(startcode==0x1BB) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object Plane start"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6093 else if(startcode==0x1BC) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object start"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6094 else if(startcode==0x1BD) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object Plane start"); |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
6095 else if(startcode==0x1BE) av_log(s->avctx, AV_LOG_DEBUG, "Still Texture Object start"); |
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
6096 else if(startcode==0x1BF) av_log(s->avctx, AV_LOG_DEBUG, "Texture Spatial Layer start"); |
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
6097 else if(startcode==0x1C0) av_log(s->avctx, AV_LOG_DEBUG, "Texture SNR Layer start"); |
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
6098 else if(startcode==0x1C1) av_log(s->avctx, AV_LOG_DEBUG, "Texture Tile start"); |
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
6099 else if(startcode==0x1C2) av_log(s->avctx, AV_LOG_DEBUG, "Texture Shape Layer start"); |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6100 else if(startcode==0x1C3) av_log(s->avctx, AV_LOG_DEBUG, "stuffing start"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6101 else if(startcode<=0x1C5) av_log(s->avctx, AV_LOG_DEBUG, "reserved"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6102 else if(startcode<=0x1FF) av_log(s->avctx, AV_LOG_DEBUG, "System start"); |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6103 av_log(s->avctx, AV_LOG_DEBUG, " at %d\n", get_bits_count(gb)); |
942 | 6104 } |
6105 | |
1512 | 6106 if(startcode >= 0x120 && startcode <= 0x12F){ |
2967 | 6107 if(decode_vol_header(s, gb) < 0) |
1396 | 6108 return -1; |
1512 | 6109 } |
6110 else if(startcode == USER_DATA_STARTCODE){ | |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6111 decode_user_data(s, gb); |
1512 | 6112 } |
6113 else if(startcode == GOP_STARTCODE){ | |
942 | 6114 mpeg4_decode_gop_header(s, gb); |
1512 | 6115 } |
6116 else if(startcode == VOP_STARTCODE){ | |
8417
ad4f10287633
Move CODEC_FLAG_LOW_DELAY into ff_mpeg4_decode_picture_header().
michael
parents:
8297
diff
changeset
|
6117 break; |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6118 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6119 |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6120 align_get_bits(gb); |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6121 startcode = 0xff; |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6122 } |
8417
ad4f10287633
Move CODEC_FLAG_LOW_DELAY into ff_mpeg4_decode_picture_header().
michael
parents:
8297
diff
changeset
|
6123 end: |
ad4f10287633
Move CODEC_FLAG_LOW_DELAY into ff_mpeg4_decode_picture_header().
michael
parents:
8297
diff
changeset
|
6124 if(s->flags& CODEC_FLAG_LOW_DELAY) |
ad4f10287633
Move CODEC_FLAG_LOW_DELAY into ff_mpeg4_decode_picture_header().
michael
parents:
8297
diff
changeset
|
6125 s->low_delay=1; |
8418
f75be04312dc
Fix PTS returned by the demuxers for mpeg4 without a decoder.
michael
parents:
8417
diff
changeset
|
6126 s->avctx->has_b_frames= !s->low_delay; |
8417
ad4f10287633
Move CODEC_FLAG_LOW_DELAY into ff_mpeg4_decode_picture_header().
michael
parents:
8297
diff
changeset
|
6127 return decode_vop_header(s, gb); |
747
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6128 } |
3d4377531f6c
mpeg4 header parser clenup (needed for parsing of VOL header in avctx->extradata)
michaelni
parents:
745
diff
changeset
|
6129 |
0 | 6130 /* don't understand why they choose a different header ! */ |
6131 int intel_h263_decode_picture_header(MpegEncContext *s) | |
6132 { | |
6133 int format; | |
6134 | |
6135 /* picture header */ | |
1257 | 6136 if (get_bits_long(&s->gb, 22) != 0x20) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6137 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n"); |
0 | 6138 return -1; |
355 | 6139 } |
6140 s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */ | |
0 | 6141 |
355 | 6142 if (get_bits1(&s->gb) != 1) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6143 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n"); |
2979 | 6144 return -1; /* marker */ |
355 | 6145 } |
6146 if (get_bits1(&s->gb) != 0) { | |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6147 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n"); |
2979 | 6148 return -1; /* h263 id */ |
6149 } | |
6150 skip_bits1(&s->gb); /* split screen off */ | |
6151 skip_bits1(&s->gb); /* camera off */ | |
6152 skip_bits1(&s->gb); /* freeze picture release off */ | |
0 | 6153 |
6154 format = get_bits(&s->gb, 3); | |
355 | 6155 if (format != 7) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6156 av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n"); |
0 | 6157 return -1; |
355 | 6158 } |
0 | 6159 s->h263_plus = 0; |
6160 | |
6481 | 6161 s->pict_type = FF_I_TYPE + get_bits1(&s->gb); |
2967 | 6162 |
6163 s->unrestricted_mv = get_bits1(&s->gb); | |
0 | 6164 s->h263_long_vectors = s->unrestricted_mv; |
6165 | |
355 | 6166 if (get_bits1(&s->gb) != 0) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6167 av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n"); |
2979 | 6168 return -1; /* SAC: off */ |
355 | 6169 } |
5405
f15e5b4909e1
remove "Advanced Prediction Mode not supported" spam
michael
parents:
5404
diff
changeset
|
6170 s->obmc= get_bits1(&s->gb); |
9008 | 6171 s->pb_frame = get_bits1(&s->gb); |
6172 | |
6173 if(format == 7){ | |
6174 format = get_bits(&s->gb, 3); | |
6175 if(format == 0 || format == 7){ | |
6176 av_log(s->avctx, AV_LOG_ERROR, "Wrong Intel H263 format\n"); | |
6177 return -1; | |
6178 } | |
6179 if(get_bits(&s->gb, 2)) | |
6180 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n"); | |
6181 s->loop_filter = get_bits1(&s->gb); | |
6182 if(get_bits1(&s->gb)) | |
6183 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n"); | |
6184 if(get_bits1(&s->gb)) | |
6185 s->pb_frame = 2; | |
6186 if(get_bits(&s->gb, 5)) | |
6187 av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n"); | |
6188 if(get_bits(&s->gb, 5) != 1) | |
6189 av_log(s->avctx, AV_LOG_ERROR, "Invalid marker\n"); | |
6190 } | |
6191 if(format == 6){ | |
6192 int ar = get_bits(&s->gb, 4); | |
6193 skip_bits(&s->gb, 9); // display width | |
6194 skip_bits1(&s->gb); | |
6195 skip_bits(&s->gb, 9); // display height | |
6196 if(ar == 15){ | |
6197 skip_bits(&s->gb, 8); // aspect ratio - width | |
6198 skip_bits(&s->gb, 8); // aspect ratio - height | |
6199 } | |
6200 } | |
0 | 6201 |
1644 | 6202 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5); |
2979 | 6203 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */ |
0 | 6204 |
9008 | 6205 if(s->pb_frame){ |
6206 skip_bits(&s->gb, 3); //temporal reference for B-frame | |
6207 skip_bits(&s->gb, 2); //dbquant | |
6208 } | |
6209 | |
0 | 6210 /* PEI */ |
21 | 6211 while (get_bits1(&s->gb) != 0) { |
6212 skip_bits(&s->gb, 8); | |
0 | 6213 } |
6214 s->f_code = 1; | |
770
d1770a34e4f6
segfault fix patch by (Juergen Keil <jk at tools dot de>)
michaelni
parents:
766
diff
changeset
|
6215 |
d1770a34e4f6
segfault fix patch by (Juergen Keil <jk at tools dot de>)
michaelni
parents:
766
diff
changeset
|
6216 s->y_dc_scale_table= |
d1770a34e4f6
segfault fix patch by (Juergen Keil <jk at tools dot de>)
michaelni
parents:
766
diff
changeset
|
6217 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
|
6218 |
5404 | 6219 if(s->avctx->debug&FF_DEBUG_PICT_INFO) |
6220 show_pict_info(s); | |
6221 | |
0 | 6222 return 0; |
6223 } | |
144 | 6224 |
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6225 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
|
6226 { |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6227 int format, width, height; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6228 |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6229 /* picture header */ |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6230 if (get_bits_long(&s->gb, 17) != 1) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6231 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n"); |
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6232 return -1; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6233 } |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6234 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
|
6235 if (format != 0 && format != 1) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6236 av_log(s->avctx, AV_LOG_ERROR, "Bad picture format\n"); |
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6237 return -1; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6238 } |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6239 s->h263_flv = format+1; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6240 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
|
6241 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
|
6242 switch (format) { |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6243 case 0: |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6244 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
|
6245 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
|
6246 break; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6247 case 1: |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6248 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
|
6249 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
|
6250 break; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6251 case 2: |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6252 width = 352; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6253 height = 288; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6254 break; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6255 case 3: |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6256 width = 176; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6257 height = 144; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6258 break; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6259 case 4: |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6260 width = 128; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6261 height = 96; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6262 break; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6263 case 5: |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6264 width = 320; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6265 height = 240; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6266 break; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6267 case 6: |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6268 width = 160; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6269 height = 120; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6270 break; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6271 default: |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6272 width = height = 0; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6273 break; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6274 } |
2422 | 6275 if(avcodec_check_dimensions(s->avctx, width, height)) |
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6276 return -1; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6277 s->width = width; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6278 s->height = height; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6279 |
6481 | 6280 s->pict_type = FF_I_TYPE + get_bits(&s->gb, 2); |
6281 s->dropable= s->pict_type > FF_P_TYPE; | |
1944 | 6282 if (s->dropable) |
6481 | 6283 s->pict_type = FF_P_TYPE; |
2967 | 6284 |
2979 | 6285 skip_bits1(&s->gb); /* deblocking flag */ |
1644 | 6286 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5); |
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6287 |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6288 s->h263_plus = 0; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6289 |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6290 s->unrestricted_mv = 1; |
1364 | 6291 s->h263_long_vectors = 0; |
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6292 |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6293 /* PEI */ |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6294 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
|
6295 skip_bits(&s->gb, 8); |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6296 } |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6297 s->f_code = 1; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6298 |
1364 | 6299 if(s->avctx->debug & FF_DEBUG_PICT_INFO){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1586
diff
changeset
|
6300 av_log(s->avctx, AV_LOG_DEBUG, "%c esc_type:%d, qp:%d num:%d\n", |
2414
18d77621fbc7
print "D" instead of "P" for dropable frames in flv with -debug 1
michael
parents:
2406
diff
changeset
|
6301 s->dropable ? 'D' : av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number); |
1364 | 6302 } |
2967 | 6303 |
1353
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6304 s->y_dc_scale_table= |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6305 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
|
6306 |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6307 return 0; |
cfc80b3a4ada
flash video (flv) support patch by (Garrick Meeker <gmeeker at theoryllc dot com>)
michaelni
parents:
1350
diff
changeset
|
6308 } |