annotate mpeg12.c @ 1516:0f0e9dfa6723 libavcodec

theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
author alex
date Sat, 11 Oct 2003 17:44:21 +0000
parents d53b1fa09b60
children 3b31998fe22f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1 /*
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1098
diff changeset
2 * MPEG1 codec / MPEG2 decoder
429
718a22dc121f license/copyright change
glantau
parents: 401
diff changeset
3 * Copyright (c) 2000,2001 Fabrice Bellard.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
4 *
429
718a22dc121f license/copyright change
glantau
parents: 401
diff changeset
5 * This library is free software; you can redistribute it and/or
718a22dc121f license/copyright change
glantau
parents: 401
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 401
diff changeset
7 * License as published by the Free Software Foundation; either
718a22dc121f license/copyright change
glantau
parents: 401
diff changeset
8 * version 2 of the License, or (at your option) any later version.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
9 *
429
718a22dc121f license/copyright change
glantau
parents: 401
diff changeset
10 * This library is distributed in the hope that it will be useful,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
429
718a22dc121f license/copyright change
glantau
parents: 401
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
718a22dc121f license/copyright change
glantau
parents: 401
diff changeset
13 * Lesser General Public License for more details.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
14 *
429
718a22dc121f license/copyright change
glantau
parents: 401
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 401
diff changeset
16 * License along with this library; if not, write to the Free Software
718a22dc121f license/copyright change
glantau
parents: 401
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
18 */
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1098
diff changeset
19
1e39f273ecd6 per file doxy
michaelni
parents: 1098
diff changeset
20 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1098
diff changeset
21 * @file mpeg12.c
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
22 * MPEG1/2 codec
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1098
diff changeset
23 */
1e39f273ecd6 per file doxy
michaelni
parents: 1098
diff changeset
24
76
0b09bd08ef4b win32 fixes
glantau
parents: 69
diff changeset
25 //#define DEBUG
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
26 #include "avcodec.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
27 #include "dsputil.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
28 #include "mpegvideo.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
29
986e461dc072 Initial revision
glantau
parents:
diff changeset
30 #include "mpeg12data.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
31
694
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
32
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
33 /* Start codes. */
986e461dc072 Initial revision
glantau
parents:
diff changeset
34 #define SEQ_END_CODE 0x000001b7
986e461dc072 Initial revision
glantau
parents:
diff changeset
35 #define SEQ_START_CODE 0x000001b3
986e461dc072 Initial revision
glantau
parents:
diff changeset
36 #define GOP_START_CODE 0x000001b8
986e461dc072 Initial revision
glantau
parents:
diff changeset
37 #define PICTURE_START_CODE 0x00000100
986e461dc072 Initial revision
glantau
parents:
diff changeset
38 #define SLICE_MIN_START_CODE 0x00000101
986e461dc072 Initial revision
glantau
parents:
diff changeset
39 #define SLICE_MAX_START_CODE 0x000001af
986e461dc072 Initial revision
glantau
parents:
diff changeset
40 #define EXT_START_CODE 0x000001b5
986e461dc072 Initial revision
glantau
parents:
diff changeset
41 #define USER_START_CODE 0x000001b2
986e461dc072 Initial revision
glantau
parents:
diff changeset
42
552
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
43 #define DC_VLC_BITS 9
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
44 #define MV_VLC_BITS 9
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
45 #define MBINCR_VLC_BITS 9
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
46 #define MB_PAT_VLC_BITS 9
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
47 #define MB_PTYPE_VLC_BITS 6
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
48 #define MB_BTYPE_VLC_BITS 6
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
49 #define TEX_VLC_BITS 9
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
50
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
51 static void mpeg1_encode_block(MpegEncContext *s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
52 DCTELEM *block,
986e461dc072 Initial revision
glantau
parents:
diff changeset
53 int component);
1051
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
54 static void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code); // RAL: f_code parameter added
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
55 static void mpeg1_skip_picture(MpegEncContext *s, int pict_num);
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
56 static inline int mpeg1_decode_block_inter(MpegEncContext *s,
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
57 DCTELEM *block,
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
58 int n);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
59 static inline int mpeg1_decode_block_intra(MpegEncContext *s,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
60 DCTELEM *block,
986e461dc072 Initial revision
glantau
parents:
diff changeset
61 int n);
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
62 static inline int mpeg2_decode_block_non_intra(MpegEncContext *s,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
63 DCTELEM *block,
986e461dc072 Initial revision
glantau
parents:
diff changeset
64 int n);
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
65 static inline int mpeg2_decode_block_intra(MpegEncContext *s,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
66 DCTELEM *block,
986e461dc072 Initial revision
glantau
parents:
diff changeset
67 int n);
986e461dc072 Initial revision
glantau
parents:
diff changeset
68 static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred);
986e461dc072 Initial revision
glantau
parents:
diff changeset
69
1381
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
70 #ifdef HAVE_XVMC
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
71 extern int XVMC_field_start(MpegEncContext *s, AVCodecContext *avctx);
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
72 extern int XVMC_field_end(MpegEncContext *s);
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
73 #endif
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
74
947
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
75 #ifdef CONFIG_ENCODERS
1162
8c15d82c1893 some static -> dynamic alloc & 16->8 bit
michaelni
parents: 1160
diff changeset
76 static uint8_t (*mv_penalty)[MAX_MV*2+1]= NULL;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
77 static uint8_t fcode_tab[MAX_MV*2+1];
281
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
78
947
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
79 static uint32_t uni_mpeg1_ac_vlc_bits[64*64*2];
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
80 static uint8_t uni_mpeg1_ac_vlc_len [64*64*2];
1325
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1323
diff changeset
81
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1323
diff changeset
82 /* simple include everything table for dc, first byte is bits number next 3 are code*/
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1323
diff changeset
83 static uint32_t mpeg1_lum_dc_uni[512];
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1323
diff changeset
84 static uint32_t mpeg1_chr_dc_uni[512];
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1323
diff changeset
85
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1323
diff changeset
86 static uint8_t mpeg1_index_run[2][64];
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1323
diff changeset
87 static int8_t mpeg1_max_level[2][64];
947
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
88 #endif
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
89
552
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
90 static void init_2d_vlc_rl(RLTable *rl)
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
91 {
620
a5aa53b6e648 warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michaelni
parents: 617
diff changeset
92 int i;
552
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
93
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
94 init_vlc(&rl->vlc, TEX_VLC_BITS, rl->n + 2,
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
95 &rl->table_vlc[0][1], 4, 2,
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
96 &rl->table_vlc[0][0], 4, 2);
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
97
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
98
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
99 rl->rl_vlc[0]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
100 for(i=0; i<rl->vlc.table_size; i++){
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
101 int code= rl->vlc.table[i][0];
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
102 int len = rl->vlc.table[i][1];
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
103 int level, run;
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
104
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
105 if(len==0){ // illegal code
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
106 run= 65;
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
107 level= MAX_LEVEL;
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
108 }else if(len<0){ //more bits needed
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
109 run= 0;
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
110 level= code;
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
111 }else{
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
112 if(code==rl->n){ //esc
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
113 run= 65;
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
114 level= 0;
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
115 }else if(code==rl->n+1){ //eob
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
116 run= 0;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
117 level= 127;
552
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
118 }else{
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
119 run= rl->table_run [code] + 1;
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
120 level= rl->table_level[code];
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
121 }
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
122 }
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
123 rl->rl_vlc[0][i].len= len;
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
124 rl->rl_vlc[0][i].level= level;
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
125 rl->rl_vlc[0][i].run= run;
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
126 }
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
127 }
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
128
1325
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1323
diff changeset
129 #ifdef CONFIG_ENCODERS
947
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
130 static void init_uni_ac_vlc(RLTable *rl, uint32_t *uni_ac_vlc_bits, uint8_t *uni_ac_vlc_len){
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
131 int i;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
132
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
133 for(i=0; i<128; i++){
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
134 int level= i-64;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
135 int run;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
136 for(run=0; run<64; run++){
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
137 int len, bits, code;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
138
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
139 int alevel= ABS(level);
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
140 int sign= (level>>31)&1;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
141
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
142 if (alevel > rl->max_level[0][run])
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
143 code= 111; /*rl->n*/
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
144 else
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
145 code= rl->index_run[0][run] + alevel - 1;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
146
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
147 if (code < 111 /* rl->n */) {
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
148 /* store the vlc & sign at once */
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
149 len= mpeg1_vlc[code][1]+1;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
150 bits= (mpeg1_vlc[code][0]<<1) + sign;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
151 } else {
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
152 len= mpeg1_vlc[111/*rl->n*/][1]+6;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
153 bits= mpeg1_vlc[111/*rl->n*/][0]<<6;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
154
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
155 bits|= run;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
156 if (alevel < 128) {
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
157 bits<<=8; len+=8;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
158 bits|= level & 0xff;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
159 } else {
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
160 bits<<=16; len+=16;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
161 bits|= level & 0xff;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
162 if (level < 0) {
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
163 bits|= 0x8001 + level + 255;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
164 } else {
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
165 bits|= level & 0xffff;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
166 }
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
167 }
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
168 }
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
169
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
170 uni_ac_vlc_bits[UNI_AC_ENC_INDEX(run, i)]= bits;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
171 uni_ac_vlc_len [UNI_AC_ENC_INDEX(run, i)]= len;
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
172 }
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
173 }
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
174 }
552
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
175
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
176 static void put_header(MpegEncContext *s, int header)
986e461dc072 Initial revision
glantau
parents:
diff changeset
177 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
178 align_put_bits(&s->pb);
236
4a090f1da60a optimize mpeg1_encode_block()
michaelni
parents: 76
diff changeset
179 put_bits(&s->pb, 16, header>>16);
4a090f1da60a optimize mpeg1_encode_block()
michaelni
parents: 76
diff changeset
180 put_bits(&s->pb, 16, header&0xFFFF);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
181 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
182
986e461dc072 Initial revision
glantau
parents:
diff changeset
183 /* put sequence header if needed */
986e461dc072 Initial revision
glantau
parents:
diff changeset
184 static void mpeg1_encode_sequence_header(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
185 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
186 unsigned int vbv_buffer_size;
1
383bfb30fc84 fixed unsigned pb
glantau
parents: 0
diff changeset
187 unsigned int fps, v;
918
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
188 int n, i;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
189 uint64_t time_code;
918
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
190 float best_aspect_error= 1E10;
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
191 float aspect_ratio= s->avctx->aspect_ratio;
1479
f718b60fedc2 constraint_parameter_flag fix
michaelni
parents: 1432
diff changeset
192 int constraint_parameter_flag;
918
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
193
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
194 if(aspect_ratio==0.0) aspect_ratio= s->width / (float)s->height; //pixel aspect 1:1 (VGA)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
195
903
22ee74da2cd3 cleanup
michaelni
parents: 890
diff changeset
196 if (s->current_picture.key_frame) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
197 /* mpeg1 header repeated every gop */
986e461dc072 Initial revision
glantau
parents:
diff changeset
198 put_header(s, SEQ_START_CODE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
199
986e461dc072 Initial revision
glantau
parents:
diff changeset
200 /* search closest frame rate */
986e461dc072 Initial revision
glantau
parents:
diff changeset
201 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
202 int i, dmin, d;
986e461dc072 Initial revision
glantau
parents:
diff changeset
203 s->frame_rate_index = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
204 dmin = 0x7fffffff;
1126
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
205 for(i=1;i<14;i++) {
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
206 if(s->avctx->strict_std_compliance >= 0 && i>=9) break;
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
207
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
208 d = abs(MPEG1_FRAME_RATE_BASE*(int64_t)s->avctx->frame_rate/s->avctx->frame_rate_base - frame_rate_tab[i]);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
209 if (d < dmin) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
210 dmin = d;
986e461dc072 Initial revision
glantau
parents:
diff changeset
211 s->frame_rate_index = i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
212 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
213 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
214 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
215
986e461dc072 Initial revision
glantau
parents:
diff changeset
216 put_bits(&s->pb, 12, s->width);
986e461dc072 Initial revision
glantau
parents:
diff changeset
217 put_bits(&s->pb, 12, s->height);
918
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
218
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
219 for(i=1; i<15; i++){
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
220 float error= mpeg1_aspect[i] - s->width/(s->height*aspect_ratio);
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
221 error= ABS(error);
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
222
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
223 if(error < best_aspect_error){
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
224 best_aspect_error= error;
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
225 s->aspect_ratio_info= i;
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
226 }
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
227 }
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
228
f9e54ade14a1 aspect ratio encoding for mpeg1
michaelni
parents: 917
diff changeset
229 put_bits(&s->pb, 4, s->aspect_ratio_info);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
230 put_bits(&s->pb, 4, s->frame_rate_index);
1430
248d9ae1033c bit_rate in mpeg1/2 should be 0x3FFFF for vbr or at least >= max_bitrate
michaelni
parents: 1429
diff changeset
231
248d9ae1033c bit_rate in mpeg1/2 should be 0x3FFFF for vbr or at least >= max_bitrate
michaelni
parents: 1429
diff changeset
232 if(s->avctx->rc_max_rate){
248d9ae1033c bit_rate in mpeg1/2 should be 0x3FFFF for vbr or at least >= max_bitrate
michaelni
parents: 1429
diff changeset
233 v = (s->avctx->rc_max_rate + 399) / 400;
248d9ae1033c bit_rate in mpeg1/2 should be 0x3FFFF for vbr or at least >= max_bitrate
michaelni
parents: 1429
diff changeset
234 if (v > 0x3ffff && s->codec_id == CODEC_ID_MPEG1VIDEO)
248d9ae1033c bit_rate in mpeg1/2 should be 0x3FFFF for vbr or at least >= max_bitrate
michaelni
parents: 1429
diff changeset
235 v = 0x3ffff;
248d9ae1033c bit_rate in mpeg1/2 should be 0x3FFFF for vbr or at least >= max_bitrate
michaelni
parents: 1429
diff changeset
236 }else{
248d9ae1033c bit_rate in mpeg1/2 should be 0x3FFFF for vbr or at least >= max_bitrate
michaelni
parents: 1429
diff changeset
237 v= 0x3FFFF;
248d9ae1033c bit_rate in mpeg1/2 should be 0x3FFFF for vbr or at least >= max_bitrate
michaelni
parents: 1429
diff changeset
238 }
639
f449913e8419 new vbv calculation patch by (Henry Mason <talus25 at speakeasy dot net>) with slight modification by me
michaelni
parents: 620
diff changeset
239
f449913e8419 new vbv calculation patch by (Henry Mason <talus25 at speakeasy dot net>) with slight modification by me
michaelni
parents: 620
diff changeset
240 if(s->avctx->rc_buffer_size)
f449913e8419 new vbv calculation patch by (Henry Mason <talus25 at speakeasy dot net>) with slight modification by me
michaelni
parents: 620
diff changeset
241 vbv_buffer_size = s->avctx->rc_buffer_size;
f449913e8419 new vbv calculation patch by (Henry Mason <talus25 at speakeasy dot net>) with slight modification by me
michaelni
parents: 620
diff changeset
242 else
f449913e8419 new vbv calculation patch by (Henry Mason <talus25 at speakeasy dot net>) with slight modification by me
michaelni
parents: 620
diff changeset
243 /* VBV calculation: Scaled so that a VCD has the proper VBV size of 40 kilobytes */
1430
248d9ae1033c bit_rate in mpeg1/2 should be 0x3FFFF for vbr or at least >= max_bitrate
michaelni
parents: 1429
diff changeset
244 vbv_buffer_size = (( 20 * s->bit_rate) / (1151929 / 2)) * 8 * 1024;
248d9ae1033c bit_rate in mpeg1/2 should be 0x3FFFF for vbr or at least >= max_bitrate
michaelni
parents: 1429
diff changeset
245 vbv_buffer_size= (vbv_buffer_size + 16383) / 16384;
248d9ae1033c bit_rate in mpeg1/2 should be 0x3FFFF for vbr or at least >= max_bitrate
michaelni
parents: 1429
diff changeset
246
248d9ae1033c bit_rate in mpeg1/2 should be 0x3FFFF for vbr or at least >= max_bitrate
michaelni
parents: 1429
diff changeset
247 put_bits(&s->pb, 18, v & 0x3FFFF);
248d9ae1033c bit_rate in mpeg1/2 should be 0x3FFFF for vbr or at least >= max_bitrate
michaelni
parents: 1429
diff changeset
248 put_bits(&s->pb, 1, 1); /* marker */
1479
f718b60fedc2 constraint_parameter_flag fix
michaelni
parents: 1432
diff changeset
249 put_bits(&s->pb, 10, vbv_buffer_size & 0x3FF);
f718b60fedc2 constraint_parameter_flag fix
michaelni
parents: 1432
diff changeset
250
f718b60fedc2 constraint_parameter_flag fix
michaelni
parents: 1432
diff changeset
251 constraint_parameter_flag=
f718b60fedc2 constraint_parameter_flag fix
michaelni
parents: 1432
diff changeset
252 s->width <= 768 && s->height <= 576 &&
f718b60fedc2 constraint_parameter_flag fix
michaelni
parents: 1432
diff changeset
253 s->mb_width * s->mb_height <= 396 &&
f718b60fedc2 constraint_parameter_flag fix
michaelni
parents: 1432
diff changeset
254 s->mb_width * s->mb_height * frame_rate_tab[s->frame_rate_index] <= MPEG1_FRAME_RATE_BASE*396*25 &&
f718b60fedc2 constraint_parameter_flag fix
michaelni
parents: 1432
diff changeset
255 frame_rate_tab[s->frame_rate_index] <= MPEG1_FRAME_RATE_BASE*30 &&
f718b60fedc2 constraint_parameter_flag fix
michaelni
parents: 1432
diff changeset
256 vbv_buffer_size <= 20 &&
f718b60fedc2 constraint_parameter_flag fix
michaelni
parents: 1432
diff changeset
257 v <= 1856000/400 &&
f718b60fedc2 constraint_parameter_flag fix
michaelni
parents: 1432
diff changeset
258 s->codec_id == CODEC_ID_MPEG1VIDEO;
f718b60fedc2 constraint_parameter_flag fix
michaelni
parents: 1432
diff changeset
259
f718b60fedc2 constraint_parameter_flag fix
michaelni
parents: 1432
diff changeset
260 put_bits(&s->pb, 1, constraint_parameter_flag);
1411
c2e63cb94d06 custom quant matrix encoding support
michaelni
parents: 1410
diff changeset
261
c2e63cb94d06 custom quant matrix encoding support
michaelni
parents: 1410
diff changeset
262 ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
c2e63cb94d06 custom quant matrix encoding support
michaelni
parents: 1410
diff changeset
263 ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
264
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
265 if(s->codec_id == CODEC_ID_MPEG2VIDEO){
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
266 put_header(s, EXT_START_CODE);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
267 put_bits(&s->pb, 4, 1); //seq ext
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
268 put_bits(&s->pb, 1, 0); //esc
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
269 put_bits(&s->pb, 3, 4); //profile
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
270 put_bits(&s->pb, 4, 8); //level
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
271 put_bits(&s->pb, 1, s->progressive_sequence=1);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
272 put_bits(&s->pb, 2, 1); //chroma format 4:2:0
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
273 put_bits(&s->pb, 2, 0); //horizontal size ext
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
274 put_bits(&s->pb, 2, 0); //vertical size ext
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
275 put_bits(&s->pb, 12, v>>18); //bitrate ext
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
276 put_bits(&s->pb, 1, 1); //marker
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
277 put_bits(&s->pb, 8, vbv_buffer_size >>10); //vbv buffer ext
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
278 put_bits(&s->pb, 1, s->low_delay);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
279 put_bits(&s->pb, 2, 0); // frame_rate_ext_n
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
280 put_bits(&s->pb, 5, 0); // frame_rate_ext_d
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
281 }
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
282
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
283 put_header(s, GOP_START_CODE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
284 put_bits(&s->pb, 1, 0); /* do drop frame */
986e461dc072 Initial revision
glantau
parents:
diff changeset
285 /* time code : we must convert from the real frame rate to a
986e461dc072 Initial revision
glantau
parents:
diff changeset
286 fake mpeg frame rate in case of low frame rate */
986e461dc072 Initial revision
glantau
parents:
diff changeset
287 fps = frame_rate_tab[s->frame_rate_index];
1126
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
288 time_code = (int64_t)s->fake_picture_number * MPEG1_FRAME_RATE_BASE;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
289 s->gop_picture_number = s->fake_picture_number;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
290 put_bits(&s->pb, 5, (uint32_t)((time_code / (fps * 3600)) % 24));
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
291 put_bits(&s->pb, 6, (uint32_t)((time_code / (fps * 60)) % 60));
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
292 put_bits(&s->pb, 1, 1);
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
293 put_bits(&s->pb, 6, (uint32_t)((time_code / fps) % 60));
1126
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
294 put_bits(&s->pb, 6, (uint32_t)((time_code % fps) / MPEG1_FRAME_RATE_BASE));
1429
a62c54167251 10l (closed gop bit)
michaelni
parents: 1423
diff changeset
295 put_bits(&s->pb, 1, 0); /* closed gop */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
296 put_bits(&s->pb, 1, 0); /* broken link */
986e461dc072 Initial revision
glantau
parents:
diff changeset
297 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
298
1126
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
299 if (s->avctx->frame_rate < (24 * s->avctx->frame_rate_base) && s->picture_number > 0) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
300 /* insert empty P pictures to slow down to the desired
986e461dc072 Initial revision
glantau
parents:
diff changeset
301 frame rate. Each fake pictures takes about 20 bytes */
986e461dc072 Initial revision
glantau
parents:
diff changeset
302 fps = frame_rate_tab[s->frame_rate_index];
1126
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
303 n = av_rescale((int64_t)s->picture_number * s->avctx->frame_rate_base, fps, s->avctx->frame_rate) / MPEG1_FRAME_RATE_BASE - 1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
304 while (s->fake_picture_number < n) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
305 mpeg1_skip_picture(s, s->fake_picture_number -
986e461dc072 Initial revision
glantau
parents:
diff changeset
306 s->gop_picture_number);
986e461dc072 Initial revision
glantau
parents:
diff changeset
307 s->fake_picture_number++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
308 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
309
986e461dc072 Initial revision
glantau
parents:
diff changeset
310 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
311 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
312
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
313 static inline void encode_mb_skip_run(MpegEncContext *s, int run){
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
314 while (run >= 33) {
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
315 put_bits(&s->pb, 11, 0x008);
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
316 run -= 33;
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
317 }
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
318 put_bits(&s->pb, mbAddrIncrTable[run][1],
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
319 mbAddrIncrTable[run][0]);
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
320 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
321
986e461dc072 Initial revision
glantau
parents:
diff changeset
322 /* insert a fake P picture */
986e461dc072 Initial revision
glantau
parents:
diff changeset
323 static void mpeg1_skip_picture(MpegEncContext *s, int pict_num)
986e461dc072 Initial revision
glantau
parents:
diff changeset
324 {
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
325 assert(s->codec_id == CODEC_ID_MPEG1VIDEO); // mpeg2 can do these repeat things
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
326
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
327 /* mpeg1 picture header */
986e461dc072 Initial revision
glantau
parents:
diff changeset
328 put_header(s, PICTURE_START_CODE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
329 /* temporal reference */
986e461dc072 Initial revision
glantau
parents:
diff changeset
330 put_bits(&s->pb, 10, pict_num & 0x3ff);
986e461dc072 Initial revision
glantau
parents:
diff changeset
331
986e461dc072 Initial revision
glantau
parents:
diff changeset
332 put_bits(&s->pb, 3, P_TYPE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
333 put_bits(&s->pb, 16, 0xffff); /* non constant bit rate */
986e461dc072 Initial revision
glantau
parents:
diff changeset
334
986e461dc072 Initial revision
glantau
parents:
diff changeset
335 put_bits(&s->pb, 1, 1); /* integer coordinates */
986e461dc072 Initial revision
glantau
parents:
diff changeset
336 put_bits(&s->pb, 3, 1); /* forward_f_code */
986e461dc072 Initial revision
glantau
parents:
diff changeset
337
986e461dc072 Initial revision
glantau
parents:
diff changeset
338 put_bits(&s->pb, 1, 0); /* extra bit picture */
986e461dc072 Initial revision
glantau
parents:
diff changeset
339
986e461dc072 Initial revision
glantau
parents:
diff changeset
340 /* only one slice */
986e461dc072 Initial revision
glantau
parents:
diff changeset
341 put_header(s, SLICE_MIN_START_CODE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
342 put_bits(&s->pb, 5, 1); /* quantizer scale */
986e461dc072 Initial revision
glantau
parents:
diff changeset
343 put_bits(&s->pb, 1, 0); /* slice extra information */
986e461dc072 Initial revision
glantau
parents:
diff changeset
344
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
345 encode_mb_skip_run(s, 0);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
346
986e461dc072 Initial revision
glantau
parents:
diff changeset
347 /* empty macroblock */
986e461dc072 Initial revision
glantau
parents:
diff changeset
348 put_bits(&s->pb, 3, 1); /* motion only */
986e461dc072 Initial revision
glantau
parents:
diff changeset
349
986e461dc072 Initial revision
glantau
parents:
diff changeset
350 /* zero motion x & y */
986e461dc072 Initial revision
glantau
parents:
diff changeset
351 put_bits(&s->pb, 1, 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
352 put_bits(&s->pb, 1, 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
353
986e461dc072 Initial revision
glantau
parents:
diff changeset
354 /* output a number of empty slice */
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
355 encode_mb_skip_run(s, s->mb_width * s->mb_height - 2);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
356
986e461dc072 Initial revision
glantau
parents:
diff changeset
357 /* empty macroblock */
986e461dc072 Initial revision
glantau
parents:
diff changeset
358 put_bits(&s->pb, 3, 1); /* motion only */
986e461dc072 Initial revision
glantau
parents:
diff changeset
359
986e461dc072 Initial revision
glantau
parents:
diff changeset
360 /* zero motion x & y */
986e461dc072 Initial revision
glantau
parents:
diff changeset
361 put_bits(&s->pb, 1, 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
362 put_bits(&s->pb, 1, 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
363 }
1325
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1323
diff changeset
364 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
365
498
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
366 static void common_init(MpegEncContext *s)
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
367 {
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
368 s->y_dc_scale_table=
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
369 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
370 }
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
371
1325
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1323
diff changeset
372 void ff_mpeg1_clean_buffers(MpegEncContext *s){
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1323
diff changeset
373 s->last_dc[0] = 1 << (7 + s->intra_dc_precision);
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1323
diff changeset
374 s->last_dc[1] = s->last_dc[0];
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1323
diff changeset
375 s->last_dc[2] = s->last_dc[0];
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1323
diff changeset
376 memset(s->last_mv, 0, sizeof(s->last_mv));
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1323
diff changeset
377 }
1cbc2380d172 CONFIG_ENCODERS cleanup
michaelni
parents: 1323
diff changeset
378
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: 1064
diff changeset
379 #ifdef CONFIG_ENCODERS
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
380
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
381 void ff_mpeg1_encode_slice_header(MpegEncContext *s){
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
382 put_header(s, SLICE_MIN_START_CODE + s->mb_y);
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
383 put_bits(&s->pb, 5, s->qscale); /* quantizer scale */
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
384 put_bits(&s->pb, 1, 0); /* slice extra information */
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
385 }
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
386
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
387 void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number)
986e461dc072 Initial revision
glantau
parents:
diff changeset
388 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
389 mpeg1_encode_sequence_header(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
390
986e461dc072 Initial revision
glantau
parents:
diff changeset
391 /* mpeg1 picture header */
986e461dc072 Initial revision
glantau
parents:
diff changeset
392 put_header(s, PICTURE_START_CODE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
393 /* temporal reference */
1051
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
394
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
395 // RAL: s->picture_number instead of s->fake_picture_number
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
396 put_bits(&s->pb, 10, (s->picture_number -
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
397 s->gop_picture_number) & 0x3ff);
276
1e2f9ef286d4 - Fix pts calculation on mpeg mux (A/V sync) - Thanks to Lennert Buytenhek
pulento
parents: 275
diff changeset
398 s->fake_picture_number++;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
399
986e461dc072 Initial revision
glantau
parents:
diff changeset
400 put_bits(&s->pb, 3, s->pict_type);
986e461dc072 Initial revision
glantau
parents:
diff changeset
401 put_bits(&s->pb, 16, 0xffff); /* non constant bit rate */
986e461dc072 Initial revision
glantau
parents:
diff changeset
402
1051
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
403 // RAL: Forward f_code also needed for B frames
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
404 if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
405 put_bits(&s->pb, 1, 0); /* half pel coordinates */
1432
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
406 if(s->codec_id == CODEC_ID_MPEG1VIDEO)
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
407 put_bits(&s->pb, 3, s->f_code); /* forward_f_code */
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
408 else
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
409 put_bits(&s->pb, 3, 7); /* forward_f_code */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
410 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
411
1051
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
412 // RAL: Backward f_code necessary for B frames
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
413 if (s->pict_type == B_TYPE) {
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
414 put_bits(&s->pb, 1, 0); /* half pel coordinates */
1432
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
415 if(s->codec_id == CODEC_ID_MPEG1VIDEO)
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
416 put_bits(&s->pb, 3, s->b_code); /* backward_f_code */
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
417 else
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
418 put_bits(&s->pb, 3, 7); /* backward_f_code */
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
419 }
1051
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
420
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
421 put_bits(&s->pb, 1, 0); /* extra bit picture */
986e461dc072 Initial revision
glantau
parents:
diff changeset
422
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
423 if(s->codec_id == CODEC_ID_MPEG2VIDEO){
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
424 put_header(s, EXT_START_CODE);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
425 put_bits(&s->pb, 4, 8); //pic ext
1432
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
426 if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) {
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
427 put_bits(&s->pb, 4, s->f_code);
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
428 put_bits(&s->pb, 4, s->f_code);
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
429 }else{
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
430 put_bits(&s->pb, 8, 255);
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
431 }
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
432 if (s->pict_type == B_TYPE) {
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
433 put_bits(&s->pb, 4, s->b_code);
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
434 put_bits(&s->pb, 4, s->b_code);
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
435 }else{
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
436 put_bits(&s->pb, 8, 255);
7406ed4479f7 fixing unused f_code values
michaelni
parents: 1430
diff changeset
437 }
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
438 put_bits(&s->pb, 2, s->intra_dc_precision);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
439 put_bits(&s->pb, 2, s->picture_structure= PICT_FRAME);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
440 put_bits(&s->pb, 1, s->top_field_first);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
441 put_bits(&s->pb, 1, s->frame_pred_frame_dct= 1);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
442 put_bits(&s->pb, 1, s->concealment_motion_vectors);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
443 put_bits(&s->pb, 1, s->q_scale_type);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
444 put_bits(&s->pb, 1, s->intra_vlc_format);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
445 put_bits(&s->pb, 1, s->alternate_scan);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
446 put_bits(&s->pb, 1, s->repeat_first_field);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
447 put_bits(&s->pb, 1, s->chroma_420_type=1);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
448 put_bits(&s->pb, 1, s->progressive_frame=1);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
449 put_bits(&s->pb, 1, 0); //composite_display_flag
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
450 }
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
451
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
452 s->mb_y=0;
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
453 ff_mpeg1_encode_slice_header(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
454 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
455
986e461dc072 Initial revision
glantau
parents:
diff changeset
456 void mpeg1_encode_mb(MpegEncContext *s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
457 DCTELEM block[6][64],
986e461dc072 Initial revision
glantau
parents:
diff changeset
458 int motion_x, int motion_y)
986e461dc072 Initial revision
glantau
parents:
diff changeset
459 {
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
460 int i, cbp;
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
461 const int mb_x = s->mb_x;
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
462 const int mb_y = s->mb_y;
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
463 const int first_mb= mb_x == s->resync_mb_x && mb_y == s->resync_mb_y;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
464
986e461dc072 Initial revision
glantau
parents:
diff changeset
465 /* compute cbp */
986e461dc072 Initial revision
glantau
parents:
diff changeset
466 cbp = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
467 for(i=0;i<6;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
468 if (s->block_last_index[i] >= 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
469 cbp |= 1 << (5 - i);
986e461dc072 Initial revision
glantau
parents:
diff changeset
470 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
471
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
472 if (cbp == 0 && !first_mb && (mb_x != s->mb_width - 1 || (mb_y != s->mb_height - 1 && s->codec_id == CODEC_ID_MPEG1VIDEO)) &&
1051
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
473 ((s->pict_type == P_TYPE && (motion_x | motion_y) == 0) ||
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
474 (s->pict_type == B_TYPE && s->mv_dir == s->last_mv_dir && (((s->mv_dir & MV_DIR_FORWARD) ? ((s->mv[0][0][0] - s->last_mv[0][0][0])|(s->mv[0][0][1] - s->last_mv[0][0][1])) : 0) |
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
475 ((s->mv_dir & MV_DIR_BACKWARD) ? ((s->mv[1][0][0] - s->last_mv[1][0][0])|(s->mv[1][0][1] - s->last_mv[1][0][1])) : 0)) == 0))) {
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
476 s->mb_skip_run++;
694
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
477 s->qscale -= s->dquant;
740
585c163c225a mpeg1 2pass encoding
michaelni
parents: 718
diff changeset
478 s->skip_count++;
585c163c225a mpeg1 2pass encoding
michaelni
parents: 718
diff changeset
479 s->misc_bits++;
585c163c225a mpeg1 2pass encoding
michaelni
parents: 718
diff changeset
480 s->last_bits++;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
481 } else {
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
482 if(first_mb){
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
483 assert(s->mb_skip_run == 0);
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
484 encode_mb_skip_run(s, s->mb_x);
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
485 }else{
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
486 encode_mb_skip_run(s, s->mb_skip_run);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
487 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
488
986e461dc072 Initial revision
glantau
parents:
diff changeset
489 if (s->pict_type == I_TYPE) {
694
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
490 if(s->dquant && cbp){
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
491 put_bits(&s->pb, 2, 1); /* macroblock_type : macroblock_quant = 1 */
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
492 put_bits(&s->pb, 5, s->qscale);
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
493 }else{
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
494 put_bits(&s->pb, 1, 1); /* macroblock_type : macroblock_quant = 0 */
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
495 s->qscale -= s->dquant;
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
496 }
740
585c163c225a mpeg1 2pass encoding
michaelni
parents: 718
diff changeset
497 s->misc_bits+= get_bits_diff(s);
585c163c225a mpeg1 2pass encoding
michaelni
parents: 718
diff changeset
498 s->i_count++;
1051
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
499 } else if (s->mb_intra) {
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
500 if(s->dquant && cbp){
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
501 put_bits(&s->pb, 6, 0x01);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
502 put_bits(&s->pb, 5, s->qscale);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
503 }else{
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
504 put_bits(&s->pb, 5, 0x03);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
505 s->qscale -= s->dquant;
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
506 }
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
507 s->misc_bits+= get_bits_diff(s);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
508 s->i_count++;
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
509 s->last_mv[0][0][0] =
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
510 s->last_mv[0][0][1] = 0;
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
511 } else if (s->pict_type == P_TYPE) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
512 if (cbp != 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
513 if (motion_x == 0 && motion_y == 0) {
694
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
514 if(s->dquant){
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
515 put_bits(&s->pb, 5, 1); /* macroblock_pattern & quant */
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
516 put_bits(&s->pb, 5, s->qscale);
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
517 }else{
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
518 put_bits(&s->pb, 2, 1); /* macroblock_pattern only */
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
519 }
740
585c163c225a mpeg1 2pass encoding
michaelni
parents: 718
diff changeset
520 s->misc_bits+= get_bits_diff(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
521 put_bits(&s->pb, mbPatTable[cbp - 1][1], mbPatTable[cbp - 1][0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
522 } else {
694
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
523 if(s->dquant){
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
524 put_bits(&s->pb, 5, 2); /* motion + cbp */
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
525 put_bits(&s->pb, 5, s->qscale);
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
526 }else{
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
527 put_bits(&s->pb, 1, 1); /* motion + cbp */
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
528 }
740
585c163c225a mpeg1 2pass encoding
michaelni
parents: 718
diff changeset
529 s->misc_bits+= get_bits_diff(s);
1051
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
530 mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code); // RAL: f_code parameter added
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
531 mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code); // RAL: f_code parameter added
740
585c163c225a mpeg1 2pass encoding
michaelni
parents: 718
diff changeset
532 s->mv_bits+= get_bits_diff(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
533 put_bits(&s->pb, mbPatTable[cbp - 1][1], mbPatTable[cbp - 1][0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
534 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
535 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
536 put_bits(&s->pb, 3, 1); /* motion only */
1051
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
537 mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code); // RAL: f_code parameter added
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
538 mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code); // RAL: f_code parameter added
694
20810b0193ef adaptive quantization for mpeg1
michaelni
parents: 647
diff changeset
539 s->qscale -= s->dquant;
740
585c163c225a mpeg1 2pass encoding
michaelni
parents: 718
diff changeset
540 s->mv_bits+= get_bits_diff(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
541 }
740
585c163c225a mpeg1 2pass encoding
michaelni
parents: 718
diff changeset
542 s->f_count++;
1051
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
543 } else
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
544 { // RAL: All the following bloc added for B frames:
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
545 if (cbp != 0)
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
546 { // With coded bloc pattern
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
547 if (s->mv_dir == (MV_DIR_FORWARD | MV_DIR_BACKWARD))
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
548 { // Bi-directional motion
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
549 if (s->dquant)
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
550 { // With QScale
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
551 put_bits(&s->pb, 5, 2);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
552 put_bits(&s->pb, 5, s->qscale);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
553 }
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
554 else // Without QScale
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
555 put_bits(&s->pb, 2, 3);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
556 s->misc_bits += get_bits_diff(s);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
557 mpeg1_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
558 mpeg1_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
559 mpeg1_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
560 mpeg1_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
561 s->b_count++;
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
562 s->f_count++;
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
563 s->mv_bits += get_bits_diff(s);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
564 put_bits(&s->pb, mbPatTable[cbp - 1][1], mbPatTable[cbp - 1][0]);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
565 }
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
566 else if (s->mv_dir == MV_DIR_BACKWARD)
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
567 { // Backward motion
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
568 if (s->dquant)
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
569 { // With QScale
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
570 put_bits(&s->pb, 6, 2);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
571 put_bits(&s->pb, 5, s->qscale);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
572 }
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
573 else // Without QScale
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
574 put_bits(&s->pb, 3, 3);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
575 s->misc_bits += get_bits_diff(s);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
576 mpeg1_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
577 mpeg1_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
578 s->b_count++;
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
579 s->mv_bits += get_bits_diff(s);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
580 put_bits(&s->pb, mbPatTable[cbp - 1][1], mbPatTable[cbp - 1][0]);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
581 }
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
582 else if (s->mv_dir == MV_DIR_FORWARD)
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
583 { // Forward motion
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
584 if (s->dquant)
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
585 { // With QScale
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
586 put_bits(&s->pb, 6, 3);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
587 put_bits(&s->pb, 5, s->qscale);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
588 }
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
589 else // Without QScale
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
590 put_bits(&s->pb, 4, 3);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
591 s->misc_bits += get_bits_diff(s);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
592 mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
593 mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
594 s->f_count++;
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
595 s->mv_bits += get_bits_diff(s);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
596 put_bits(&s->pb, mbPatTable[cbp - 1][1], mbPatTable[cbp - 1][0]);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
597 }
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
598 }
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
599 else
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
600 { // No coded bloc pattern
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
601 if (s->mv_dir == (MV_DIR_FORWARD | MV_DIR_BACKWARD))
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: 1064
diff changeset
602 { // Bi-directional motion
1051
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
603 put_bits(&s->pb, 2, 2); /* backward & forward motion */
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
604 mpeg1_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
605 mpeg1_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
606 mpeg1_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
607 mpeg1_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
608 s->b_count++;
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
609 s->f_count++;
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
610 }
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
611 else if (s->mv_dir == MV_DIR_BACKWARD)
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
612 { // Backward motion
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
613 put_bits(&s->pb, 3, 2); /* backward motion only */
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
614 mpeg1_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
615 mpeg1_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
616 s->b_count++;
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
617 }
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
618 else if (s->mv_dir == MV_DIR_FORWARD)
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
619 { // Forward motion
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
620 put_bits(&s->pb, 4, 2); /* forward motion only */
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
621 mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
622 mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
623 s->f_count++;
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
624 }
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
625 s->qscale -= s->dquant;
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
626 s->mv_bits += get_bits_diff(s);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
627 }
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
628 // End of bloc from RAL
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
629 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
630 for(i=0;i<6;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
631 if (cbp & (1 << (5 - i))) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
632 mpeg1_encode_block(s, block[i], i);
986e461dc072 Initial revision
glantau
parents:
diff changeset
633 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
634 }
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
635 s->mb_skip_run = 0;
740
585c163c225a mpeg1 2pass encoding
michaelni
parents: 718
diff changeset
636 if(s->mb_intra)
585c163c225a mpeg1 2pass encoding
michaelni
parents: 718
diff changeset
637 s->i_tex_bits+= get_bits_diff(s);
585c163c225a mpeg1 2pass encoding
michaelni
parents: 718
diff changeset
638 else
585c163c225a mpeg1 2pass encoding
michaelni
parents: 718
diff changeset
639 s->p_tex_bits+= get_bits_diff(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
640 }
1051
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
641
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
642 // RAL: By this:
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
643 if (s->mv_dir & MV_DIR_FORWARD)
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
644 {
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
645 s->last_mv[0][0][0]= s->mv[0][0][0];
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
646 s->last_mv[0][0][1]= s->mv[0][0][1];
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
647 }
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
648 if (s->mv_dir & MV_DIR_BACKWARD)
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
649 {
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
650 s->last_mv[1][0][0]= s->mv[1][0][0];
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
651 s->last_mv[1][0][1]= s->mv[1][0][1];
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
652 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
653 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
654
1051
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
655 // RAL: Parameter added: f_or_b_code
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
656 static void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
657 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
658 int code, bit_size, l, m, bits, range, sign;
986e461dc072 Initial revision
glantau
parents:
diff changeset
659
986e461dc072 Initial revision
glantau
parents:
diff changeset
660 if (val == 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
661 /* zero vector */
986e461dc072 Initial revision
glantau
parents:
diff changeset
662 code = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
663 put_bits(&s->pb,
986e461dc072 Initial revision
glantau
parents:
diff changeset
664 mbMotionVectorTable[0][1],
986e461dc072 Initial revision
glantau
parents:
diff changeset
665 mbMotionVectorTable[0][0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
666 } else {
1051
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
667 bit_size = f_or_b_code - 1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
668 range = 1 << bit_size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
669 /* modulo encoding */
986e461dc072 Initial revision
glantau
parents:
diff changeset
670 l = 16 * range;
986e461dc072 Initial revision
glantau
parents:
diff changeset
671 m = 2 * l;
986e461dc072 Initial revision
glantau
parents:
diff changeset
672 if (val < -l) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
673 val += m;
986e461dc072 Initial revision
glantau
parents:
diff changeset
674 } else if (val >= l) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
675 val -= m;
986e461dc072 Initial revision
glantau
parents:
diff changeset
676 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
677
986e461dc072 Initial revision
glantau
parents:
diff changeset
678 if (val >= 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
679 val--;
986e461dc072 Initial revision
glantau
parents:
diff changeset
680 code = (val >> bit_size) + 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
681 bits = val & (range - 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
682 sign = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
683 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
684 val = -val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
685 val--;
986e461dc072 Initial revision
glantau
parents:
diff changeset
686 code = (val >> bit_size) + 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
687 bits = val & (range - 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
688 sign = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
689 }
1051
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
690
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
691 assert(code > 0 && code <= 16);
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
692
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
693 put_bits(&s->pb,
986e461dc072 Initial revision
glantau
parents:
diff changeset
694 mbMotionVectorTable[code][1],
986e461dc072 Initial revision
glantau
parents:
diff changeset
695 mbMotionVectorTable[code][0]);
1051
e5a9dbf597d4 mpeg1 bframe encoding patch by (Rapha?l LEGRAND) with some modifications by me
michaelni
parents: 1025
diff changeset
696
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
697 put_bits(&s->pb, 1, sign);
986e461dc072 Initial revision
glantau
parents:
diff changeset
698 if (bit_size > 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
699 put_bits(&s->pb, bit_size, bits);
986e461dc072 Initial revision
glantau
parents:
diff changeset
700 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
701 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
702 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
703
498
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
704 void ff_mpeg1_encode_init(MpegEncContext *s)
281
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
705 {
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
706 static int done=0;
498
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
707
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
708 common_init(s);
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
709
281
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
710 if(!done){
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
711 int f_code;
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
712 int mv;
498
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
713 int i;
281
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
714
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
715 done=1;
498
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
716 init_rl(&rl_mpeg1);
947
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
717
498
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
718 for(i=0; i<64; i++)
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
719 {
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
720 mpeg1_max_level[0][i]= rl_mpeg1.max_level[0][i];
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
721 mpeg1_index_run[0][i]= rl_mpeg1.index_run[0][i];
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
722 }
947
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
723
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
724 init_uni_ac_vlc(&rl_mpeg1, uni_mpeg1_ac_vlc_bits, uni_mpeg1_ac_vlc_len);
498
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
725
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
726 /* build unified dc encoding tables */
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
727 for(i=-255; i<256; i++)
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
728 {
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
729 int adiff, index;
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
730 int bits, code;
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
731 int diff=i;
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
732
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
733 adiff = ABS(diff);
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
734 if(diff<0) diff--;
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
735 index = vlc_dc_table[adiff];
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
736
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
737 bits= vlc_dc_lum_bits[index] + index;
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
738 code= (vlc_dc_lum_code[index]<<index) + (diff & ((1 << index) - 1));
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
739 mpeg1_lum_dc_uni[i+255]= bits + (code<<8);
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
740
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
741 bits= vlc_dc_chroma_bits[index] + index;
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
742 code= (vlc_dc_chroma_code[index]<<index) + (diff & ((1 << index) - 1));
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
743 mpeg1_chr_dc_uni[i+255]= bits + (code<<8);
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
744 }
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
745
1162
8c15d82c1893 some static -> dynamic alloc & 16->8 bit
michaelni
parents: 1160
diff changeset
746 mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
8c15d82c1893 some static -> dynamic alloc & 16->8 bit
michaelni
parents: 1160
diff changeset
747
281
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
748 for(f_code=1; f_code<=MAX_FCODE; f_code++){
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
749 for(mv=-MAX_MV; mv<=MAX_MV; mv++){
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
750 int len;
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
751
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
752 if(mv==0) len= mbMotionVectorTable[0][1];
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
753 else{
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
754 int val, bit_size, range, code;
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
755
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
756 bit_size = s->f_code - 1;
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
757 range = 1 << bit_size;
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
758
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
759 val=mv;
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
760 if (val < 0)
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
761 val = -val;
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
762 val--;
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
763 code = (val >> bit_size) + 1;
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
764 if(code<17){
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
765 len= mbMotionVectorTable[code][1] + 1 + bit_size;
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
766 }else{
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
767 len= mbMotionVectorTable[16][1] + 2 + bit_size;
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
768 }
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
769 }
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
770
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
771 mv_penalty[f_code][mv+MAX_MV]= len;
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
772 }
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
773 }
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
774
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
775
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
776 for(f_code=MAX_FCODE; f_code>0; f_code--){
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
777 for(mv=-(8<<f_code); mv<(8<<f_code); mv++){
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
778 fcode_tab[mv+MAX_MV]= f_code;
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
779 }
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
780 }
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
781 }
936
caa77cd960c0 qpel encoding
michaelni
parents: 933
diff changeset
782 s->me.mv_penalty= mv_penalty;
281
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
783 s->fcode_tab= fcode_tab;
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
784 if(s->codec_id == CODEC_ID_MPEG1VIDEO){
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
785 s->min_qcoeff=-255;
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
786 s->max_qcoeff= 255;
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
787 }else{
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
788 s->min_qcoeff=-2047;
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
789 s->max_qcoeff= 2047;
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
790 }
947
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
791 s->intra_ac_vlc_length=
1503
d53b1fa09b60 mpeg1 + trellis quant segfault fix
michaelni
parents: 1484
diff changeset
792 s->inter_ac_vlc_length=
d53b1fa09b60 mpeg1 + trellis quant segfault fix
michaelni
parents: 1484
diff changeset
793 s->intra_ac_vlc_last_length=
d53b1fa09b60 mpeg1 + trellis quant segfault fix
michaelni
parents: 1484
diff changeset
794 s->inter_ac_vlc_last_length= uni_mpeg1_ac_vlc_len;
281
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 277
diff changeset
795 }
498
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
796
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
797 static inline void encode_dc(MpegEncContext *s, int diff, int component)
986e461dc072 Initial revision
glantau
parents:
diff changeset
798 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
799 if (component == 0) {
237
75123d30f862 optimized encode_dc() (+2% speed on P3 for mpeg1 intra only encodings)
michaelni
parents: 236
diff changeset
800 put_bits(
75123d30f862 optimized encode_dc() (+2% speed on P3 for mpeg1 intra only encodings)
michaelni
parents: 236
diff changeset
801 &s->pb,
75123d30f862 optimized encode_dc() (+2% speed on P3 for mpeg1 intra only encodings)
michaelni
parents: 236
diff changeset
802 mpeg1_lum_dc_uni[diff+255]&0xFF,
75123d30f862 optimized encode_dc() (+2% speed on P3 for mpeg1 intra only encodings)
michaelni
parents: 236
diff changeset
803 mpeg1_lum_dc_uni[diff+255]>>8);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
804 } else {
237
75123d30f862 optimized encode_dc() (+2% speed on P3 for mpeg1 intra only encodings)
michaelni
parents: 236
diff changeset
805 put_bits(
75123d30f862 optimized encode_dc() (+2% speed on P3 for mpeg1 intra only encodings)
michaelni
parents: 236
diff changeset
806 &s->pb,
75123d30f862 optimized encode_dc() (+2% speed on P3 for mpeg1 intra only encodings)
michaelni
parents: 236
diff changeset
807 mpeg1_chr_dc_uni[diff+255]&0xFF,
75123d30f862 optimized encode_dc() (+2% speed on P3 for mpeg1 intra only encodings)
michaelni
parents: 236
diff changeset
808 mpeg1_chr_dc_uni[diff+255]>>8);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
809 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
810 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
811
986e461dc072 Initial revision
glantau
parents:
diff changeset
812 static void mpeg1_encode_block(MpegEncContext *s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
813 DCTELEM *block,
986e461dc072 Initial revision
glantau
parents:
diff changeset
814 int n)
986e461dc072 Initial revision
glantau
parents:
diff changeset
815 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
816 int alevel, level, last_non_zero, dc, diff, i, j, run, last_index, sign;
986e461dc072 Initial revision
glantau
parents:
diff changeset
817 int code, component;
236
4a090f1da60a optimize mpeg1_encode_block()
michaelni
parents: 76
diff changeset
818 // RLTable *rl = &rl_mpeg1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
819
986e461dc072 Initial revision
glantau
parents:
diff changeset
820 last_index = s->block_last_index[n];
986e461dc072 Initial revision
glantau
parents:
diff changeset
821
986e461dc072 Initial revision
glantau
parents:
diff changeset
822 /* DC coef */
986e461dc072 Initial revision
glantau
parents:
diff changeset
823 if (s->mb_intra) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
824 component = (n <= 3 ? 0 : n - 4 + 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
825 dc = block[0]; /* overflow is impossible */
986e461dc072 Initial revision
glantau
parents:
diff changeset
826 diff = dc - s->last_dc[component];
986e461dc072 Initial revision
glantau
parents:
diff changeset
827 encode_dc(s, diff, component);
986e461dc072 Initial revision
glantau
parents:
diff changeset
828 s->last_dc[component] = dc;
986e461dc072 Initial revision
glantau
parents:
diff changeset
829 i = 1;
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
830 /*
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
831 if (s->intra_vlc_format)
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
832 rl = &rl_mpeg2;
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
833 else
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
834 rl = &rl_mpeg1;
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
835 */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
836 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
837 /* encode the first coefficient : needs to be done here because
986e461dc072 Initial revision
glantau
parents:
diff changeset
838 it is handled slightly differently */
986e461dc072 Initial revision
glantau
parents:
diff changeset
839 level = block[0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
840 if (abs(level) == 1) {
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
841 code = ((uint32_t)level >> 31); /* the sign bit */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
842 put_bits(&s->pb, 2, code | 0x02);
986e461dc072 Initial revision
glantau
parents:
diff changeset
843 i = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
844 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
845 i = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
846 last_non_zero = -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
847 goto next_coef;
986e461dc072 Initial revision
glantau
parents:
diff changeset
848 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
849 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
850
986e461dc072 Initial revision
glantau
parents:
diff changeset
851 /* now quantify & encode AC coefs */
986e461dc072 Initial revision
glantau
parents:
diff changeset
852 last_non_zero = i - 1;
236
4a090f1da60a optimize mpeg1_encode_block()
michaelni
parents: 76
diff changeset
853
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
854 for(;i<=last_index;i++) {
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 694
diff changeset
855 j = s->intra_scantable.permutated[i];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
856 level = block[j];
986e461dc072 Initial revision
glantau
parents:
diff changeset
857 next_coef:
986e461dc072 Initial revision
glantau
parents:
diff changeset
858 #if 0
986e461dc072 Initial revision
glantau
parents:
diff changeset
859 if (level != 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
860 dprintf("level[%d]=%d\n", i, level);
986e461dc072 Initial revision
glantau
parents:
diff changeset
861 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
862 /* encode using VLC */
986e461dc072 Initial revision
glantau
parents:
diff changeset
863 if (level != 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
864 run = i - last_non_zero - 1;
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 694
diff changeset
865
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 694
diff changeset
866 alevel= level;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 694
diff changeset
867 MASK_ABS(sign, alevel)
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 694
diff changeset
868 sign&=1;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 694
diff changeset
869
236
4a090f1da60a optimize mpeg1_encode_block()
michaelni
parents: 76
diff changeset
870 // code = get_rl_index(rl, 0, run, alevel);
947
9be53be2d1a9 trellis quantization for mpeg1
michaelni
parents: 936
diff changeset
871 if (alevel <= mpeg1_max_level[0][run]){
236
4a090f1da60a optimize mpeg1_encode_block()
michaelni
parents: 76
diff changeset
872 code= mpeg1_index_run[0][run] + alevel - 1;
4a090f1da60a optimize mpeg1_encode_block()
michaelni
parents: 76
diff changeset
873 /* store the vlc & sign at once */
4a090f1da60a optimize mpeg1_encode_block()
michaelni
parents: 76
diff changeset
874 put_bits(&s->pb, mpeg1_vlc[code][1]+1, (mpeg1_vlc[code][0]<<1) + sign);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
875 } else {
236
4a090f1da60a optimize mpeg1_encode_block()
michaelni
parents: 76
diff changeset
876 /* escape seems to be pretty rare <5% so i dont optimize it */
4a090f1da60a optimize mpeg1_encode_block()
michaelni
parents: 76
diff changeset
877 put_bits(&s->pb, mpeg1_vlc[111/*rl->n*/][1], mpeg1_vlc[111/*rl->n*/][0]);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
878 /* escape: only clip in this case */
986e461dc072 Initial revision
glantau
parents:
diff changeset
879 put_bits(&s->pb, 6, run);
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
880 if(s->codec_id == CODEC_ID_MPEG1VIDEO){
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
881 if (alevel < 128) {
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
882 put_bits(&s->pb, 8, level & 0xff);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
883 } else {
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
884 if (level < 0) {
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
885 put_bits(&s->pb, 16, 0x8001 + level + 255);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
886 } else {
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
887 put_bits(&s->pb, 16, level & 0xffff);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
888 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
889 }
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
890 }else{
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
891 put_bits(&s->pb, 12, level & 0xfff);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
892 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
893 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
894 last_non_zero = i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
895 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
896 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
897 /* end of block */
986e461dc072 Initial revision
glantau
parents:
diff changeset
898 put_bits(&s->pb, 2, 0x2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
899 }
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: 1064
diff changeset
900 #endif //CONFIG_ENCODERS
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
901
986e461dc072 Initial revision
glantau
parents:
diff changeset
902 /******************************************/
986e461dc072 Initial revision
glantau
parents:
diff changeset
903 /* decoding */
986e461dc072 Initial revision
glantau
parents:
diff changeset
904
986e461dc072 Initial revision
glantau
parents:
diff changeset
905 static VLC dc_lum_vlc;
986e461dc072 Initial revision
glantau
parents:
diff changeset
906 static VLC dc_chroma_vlc;
986e461dc072 Initial revision
glantau
parents:
diff changeset
907 static VLC mv_vlc;
986e461dc072 Initial revision
glantau
parents:
diff changeset
908 static VLC mbincr_vlc;
986e461dc072 Initial revision
glantau
parents:
diff changeset
909 static VLC mb_ptype_vlc;
986e461dc072 Initial revision
glantau
parents:
diff changeset
910 static VLC mb_btype_vlc;
986e461dc072 Initial revision
glantau
parents:
diff changeset
911 static VLC mb_pat_vlc;
986e461dc072 Initial revision
glantau
parents:
diff changeset
912
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents: 1409
diff changeset
913 static void init_vlcs()
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
914 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
915 static int done = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
916
986e461dc072 Initial revision
glantau
parents:
diff changeset
917 if (!done) {
494
54b88078c361 fixed one mpeg decoder memory leak
bellard
parents: 486
diff changeset
918 done = 1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
919
568
7e7a7282608c hmm ABS(dc-diff) > 512 fix
michaelni
parents: 558
diff changeset
920 init_vlc(&dc_lum_vlc, DC_VLC_BITS, 12,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
921 vlc_dc_lum_bits, 1, 1,
986e461dc072 Initial revision
glantau
parents:
diff changeset
922 vlc_dc_lum_code, 2, 2);
568
7e7a7282608c hmm ABS(dc-diff) > 512 fix
michaelni
parents: 558
diff changeset
923 init_vlc(&dc_chroma_vlc, DC_VLC_BITS, 12,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
924 vlc_dc_chroma_bits, 1, 1,
986e461dc072 Initial revision
glantau
parents:
diff changeset
925 vlc_dc_chroma_code, 2, 2);
545
6df843af36cb optimization (get_vlc() -> get_vlc2())
michaelni
parents: 533
diff changeset
926 init_vlc(&mv_vlc, MV_VLC_BITS, 17,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
927 &mbMotionVectorTable[0][1], 2, 1,
986e461dc072 Initial revision
glantau
parents:
diff changeset
928 &mbMotionVectorTable[0][0], 2, 1);
1181
4c2339f3863a 100l (mpeg2 decoding fixed)
michaelni
parents: 1177
diff changeset
929 init_vlc(&mbincr_vlc, MBINCR_VLC_BITS, 36,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
930 &mbAddrIncrTable[0][1], 2, 1,
986e461dc072 Initial revision
glantau
parents:
diff changeset
931 &mbAddrIncrTable[0][0], 2, 1);
545
6df843af36cb optimization (get_vlc() -> get_vlc2())
michaelni
parents: 533
diff changeset
932 init_vlc(&mb_pat_vlc, MB_PAT_VLC_BITS, 63,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
933 &mbPatTable[0][1], 2, 1,
986e461dc072 Initial revision
glantau
parents:
diff changeset
934 &mbPatTable[0][0], 2, 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
935
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: 1164
diff changeset
936 init_vlc(&mb_ptype_vlc, MB_PTYPE_VLC_BITS, 7,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
937 &table_mb_ptype[0][1], 2, 1,
986e461dc072 Initial revision
glantau
parents:
diff changeset
938 &table_mb_ptype[0][0], 2, 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: 1164
diff changeset
939 init_vlc(&mb_btype_vlc, MB_BTYPE_VLC_BITS, 11,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
940 &table_mb_btype[0][1], 2, 1,
986e461dc072 Initial revision
glantau
parents:
diff changeset
941 &table_mb_btype[0][0], 2, 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
942 init_rl(&rl_mpeg1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
943 init_rl(&rl_mpeg2);
552
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
944
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
945 init_2d_vlc_rl(&rl_mpeg1);
26971b5a271d rl vlc table optimization (not yet used)
michaelni
parents: 545
diff changeset
946 init_2d_vlc_rl(&rl_mpeg2);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
947 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
948 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
949
986e461dc072 Initial revision
glantau
parents:
diff changeset
950 static inline int get_dmv(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
951 {
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
952 if(get_bits1(&s->gb))
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
953 return 1 - (get_bits1(&s->gb) << 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
954 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
955 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
956 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
957
54
764f2eaf711e fixed mpeg2 qscale decoding
glantau
parents: 45
diff changeset
958 static inline int get_qscale(MpegEncContext *s)
764f2eaf711e fixed mpeg2 qscale decoding
glantau
parents: 45
diff changeset
959 {
1253
5642ebadf1b5 small optimize mpeg12.c/get_qscale patch by (BERO <bero at geocities dot co dot jp>) and the return idea by arpi
michaelni
parents: 1220
diff changeset
960 int qscale = get_bits(&s->gb, 5);
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
961 if (s->codec_id == CODEC_ID_MPEG2VIDEO) {
54
764f2eaf711e fixed mpeg2 qscale decoding
glantau
parents: 45
diff changeset
962 if (s->q_scale_type) {
1253
5642ebadf1b5 small optimize mpeg12.c/get_qscale patch by (BERO <bero at geocities dot co dot jp>) and the return idea by arpi
michaelni
parents: 1220
diff changeset
963 return non_linear_qscale[qscale];
54
764f2eaf711e fixed mpeg2 qscale decoding
glantau
parents: 45
diff changeset
964 } else {
1253
5642ebadf1b5 small optimize mpeg12.c/get_qscale patch by (BERO <bero at geocities dot co dot jp>) and the return idea by arpi
michaelni
parents: 1220
diff changeset
965 return qscale << 1;
54
764f2eaf711e fixed mpeg2 qscale decoding
glantau
parents: 45
diff changeset
966 }
764f2eaf711e fixed mpeg2 qscale decoding
glantau
parents: 45
diff changeset
967 }
764f2eaf711e fixed mpeg2 qscale decoding
glantau
parents: 45
diff changeset
968 return qscale;
764f2eaf711e fixed mpeg2 qscale decoding
glantau
parents: 45
diff changeset
969 }
764f2eaf711e fixed mpeg2 qscale decoding
glantau
parents: 45
diff changeset
970
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
971 /* motion type (for mpeg2) */
986e461dc072 Initial revision
glantau
parents:
diff changeset
972 #define MT_FIELD 1
986e461dc072 Initial revision
glantau
parents:
diff changeset
973 #define MT_FRAME 2
986e461dc072 Initial revision
glantau
parents:
diff changeset
974 #define MT_16X8 2
986e461dc072 Initial revision
glantau
parents:
diff changeset
975 #define MT_DMV 3
986e461dc072 Initial revision
glantau
parents:
diff changeset
976
986e461dc072 Initial revision
glantau
parents:
diff changeset
977 static int mpeg_decode_mb(MpegEncContext *s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
978 DCTELEM block[6][64])
986e461dc072 Initial revision
glantau
parents:
diff changeset
979 {
751
cbe316f082bc warning fixes
michaelni
parents: 740
diff changeset
980 int i, j, k, cbp, val, mb_type, motion_type;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
981
986e461dc072 Initial revision
glantau
parents:
diff changeset
982 dprintf("decode_mb: x=%d y=%d\n", s->mb_x, s->mb_y);
986e461dc072 Initial revision
glantau
parents:
diff changeset
983
1021
2d7c9f5738de trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents: 947
diff changeset
984 assert(s->mb_skiped==0);
2d7c9f5738de trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents: 947
diff changeset
985
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
986 if (s->mb_skip_run-- != 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: 1164
diff changeset
987 if(s->pict_type == I_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: 1164
diff changeset
988 fprintf(stderr, "skiped MB in I frame at %d %d\n", s->mb_x, s->mb_y);
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: 1164
diff changeset
989 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: 1164
diff changeset
990 }
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: 1164
diff changeset
991
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
992 /* skip mb */
986e461dc072 Initial revision
glantau
parents:
diff changeset
993 s->mb_intra = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
994 for(i=0;i<6;i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
995 s->block_last_index[i] = -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
996 s->mv_type = MV_TYPE_16X16;
986e461dc072 Initial revision
glantau
parents:
diff changeset
997 if (s->pict_type == P_TYPE) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
998 /* if P type, zero motion vector is implied */
986e461dc072 Initial revision
glantau
parents:
diff changeset
999 s->mv_dir = MV_DIR_FORWARD;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1000 s->mv[0][0][0] = s->mv[0][0][1] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1001 s->last_mv[0][0][0] = s->last_mv[0][0][1] = 0;
59
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
1002 s->last_mv[0][1][0] = s->last_mv[0][1][1] = 0;
1021
2d7c9f5738de trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents: 947
diff changeset
1003 s->mb_skiped = 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: 1164
diff changeset
1004 s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1005 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1006 /* if B type, reuse previous vectors and directions */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1007 s->mv[0][0][0] = s->last_mv[0][0][0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
1008 s->mv[0][0][1] = s->last_mv[0][0][1];
986e461dc072 Initial revision
glantau
parents:
diff changeset
1009 s->mv[1][0][0] = s->last_mv[1][0][0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
1010 s->mv[1][0][1] = s->last_mv[1][0][1];
1021
2d7c9f5738de trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents: 947
diff changeset
1011
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: 1164
diff changeset
1012 s->current_picture.mb_type[ 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: 1164
diff changeset
1013 s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1] | MB_TYPE_SKIP;
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: 1164
diff changeset
1014 // assert(s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1]&(MB_TYPE_16x16|MB_TYPE_16x8));
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: 1164
diff changeset
1015
1021
2d7c9f5738de trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents: 947
diff changeset
1016 if((s->mv[0][0][0]|s->mv[0][0][1]|s->mv[1][0][0]|s->mv[1][0][1])==0)
2d7c9f5738de trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents: 947
diff changeset
1017 s->mb_skiped = 1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1018 }
930
6bcb214d6a17 more debug output
michaelni
parents: 925
diff changeset
1019
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1020 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1021 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1022
986e461dc072 Initial revision
glantau
parents:
diff changeset
1023 switch(s->pict_type) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1024 default:
986e461dc072 Initial revision
glantau
parents:
diff changeset
1025 case I_TYPE:
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1026 if (get_bits1(&s->gb) == 0) {
1376
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
1027 if (get_bits1(&s->gb) == 0){
1377
326852ff8fee vcr2 cleanup
michaelni
parents: 1376
diff changeset
1028 fprintf(stderr, "invalid mb type in I Frame at %d %d\n", s->mb_x, s->mb_y);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1029 return -1;
1376
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
1030 }
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: 1164
diff changeset
1031 mb_type = MB_TYPE_QUANT | MB_TYPE_INTRA;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1032 } 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: 1164
diff changeset
1033 mb_type = MB_TYPE_INTRA;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1034 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1035 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1036 case P_TYPE:
545
6df843af36cb optimization (get_vlc() -> get_vlc2())
michaelni
parents: 533
diff changeset
1037 mb_type = get_vlc2(&s->gb, mb_ptype_vlc.table, MB_PTYPE_VLC_BITS, 1);
568
7e7a7282608c hmm ABS(dc-diff) > 512 fix
michaelni
parents: 558
diff changeset
1038 if (mb_type < 0){
7e7a7282608c hmm ABS(dc-diff) > 512 fix
michaelni
parents: 558
diff changeset
1039 fprintf(stderr, "invalid mb type in P Frame at %d %d\n", s->mb_x, s->mb_y);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1040 return -1;
568
7e7a7282608c hmm ABS(dc-diff) > 512 fix
michaelni
parents: 558
diff changeset
1041 }
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: 1164
diff changeset
1042 mb_type = ptype2mb_type[ mb_type ];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1043 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1044 case B_TYPE:
545
6df843af36cb optimization (get_vlc() -> get_vlc2())
michaelni
parents: 533
diff changeset
1045 mb_type = get_vlc2(&s->gb, mb_btype_vlc.table, MB_BTYPE_VLC_BITS, 1);
568
7e7a7282608c hmm ABS(dc-diff) > 512 fix
michaelni
parents: 558
diff changeset
1046 if (mb_type < 0){
7e7a7282608c hmm ABS(dc-diff) > 512 fix
michaelni
parents: 558
diff changeset
1047 fprintf(stderr, "invalid mb type in B Frame at %d %d\n", s->mb_x, s->mb_y);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1048 return -1;
568
7e7a7282608c hmm ABS(dc-diff) > 512 fix
michaelni
parents: 558
diff changeset
1049 }
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: 1164
diff changeset
1050 mb_type = btype2mb_type[ mb_type ];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1051 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1052 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1053 dprintf("mb_type=%x\n", 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: 1164
diff changeset
1054 // motion_type = 0; /* avoid warning */
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: 1164
diff changeset
1055 if (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: 1164
diff changeset
1056 /* compute dct 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: 1164
diff changeset
1057 if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var?
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: 1164
diff changeset
1058 !s->frame_pred_frame_dct) {
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: 1164
diff changeset
1059 s->interlaced_dct = 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: 1164
diff changeset
1060 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1061
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: 1164
diff changeset
1062 if (IS_QUANT(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: 1164
diff changeset
1063 s->qscale = get_qscale(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: 1164
diff changeset
1064
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1065 if (s->concealment_motion_vectors) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1066 /* just parse them */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1067 if (s->picture_structure != PICT_FRAME)
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1068 skip_bits1(&s->gb); /* field select */
1323
e9da5a651eab fixing concealment MVs prediction
michaelni
parents: 1311
diff changeset
1069
e9da5a651eab fixing concealment MVs prediction
michaelni
parents: 1311
diff changeset
1070 s->mv[0][0][0]= s->last_mv[0][0][0]= s->last_mv[0][1][0] =
e9da5a651eab fixing concealment MVs prediction
michaelni
parents: 1311
diff changeset
1071 mpeg_decode_motion(s, s->mpeg_f_code[0][0], s->last_mv[0][0][0]);
e9da5a651eab fixing concealment MVs prediction
michaelni
parents: 1311
diff changeset
1072 s->mv[0][0][1]= s->last_mv[0][0][1]= s->last_mv[0][1][1] =
e9da5a651eab fixing concealment MVs prediction
michaelni
parents: 1311
diff changeset
1073 mpeg_decode_motion(s, s->mpeg_f_code[0][1], s->last_mv[0][0][1]);
e9da5a651eab fixing concealment MVs prediction
michaelni
parents: 1311
diff changeset
1074
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: 1164
diff changeset
1075 skip_bits1(&s->gb); /* marker */
1323
e9da5a651eab fixing concealment MVs prediction
michaelni
parents: 1311
diff changeset
1076 }else
e9da5a651eab fixing concealment MVs prediction
michaelni
parents: 1311
diff changeset
1077 memset(s->last_mv, 0, sizeof(s->last_mv)); /* reset mv prediction */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1078 s->mb_intra = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1079
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
1080 if (s->codec_id == CODEC_ID_MPEG2VIDEO) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1081 for(i=0;i<6;i++) {
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1082 if (mpeg2_decode_block_intra(s, block[i], i) < 0)
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1083 return -1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1084 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1085 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1086 for(i=0;i<6;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: 1164
diff changeset
1087 if (mpeg1_decode_block_intra(s, block[i], i) < 0)
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1088 return -1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1089 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1090 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1091 } 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: 1164
diff changeset
1092 if (mb_type & MB_TYPE_ZERO_MV){
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: 1164
diff changeset
1093 assert(mb_type & MB_TYPE_PAT);
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: 1164
diff changeset
1094
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: 1164
diff changeset
1095 /* compute dct 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: 1164
diff changeset
1096 if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var?
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: 1164
diff changeset
1097 !s->frame_pred_frame_dct) {
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: 1164
diff changeset
1098 s->interlaced_dct = 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: 1164
diff changeset
1099 }
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: 1164
diff changeset
1100
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: 1164
diff changeset
1101 if (IS_QUANT(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: 1164
diff changeset
1102 s->qscale = get_qscale(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: 1164
diff changeset
1103
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: 1164
diff changeset
1104 s->mv_dir = MV_DIR_FORWARD;
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: 1164
diff changeset
1105 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: 1164
diff changeset
1106 s->last_mv[0][0][0] = 0;
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1107 s->last_mv[0][0][1] = 0;
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1108 s->last_mv[0][1][0] = 0;
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1109 s->last_mv[0][1][1] = 0;
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1110 s->mv[0][0][0] = 0;
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1111 s->mv[0][0][1] = 0;
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1112 }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: 1164
diff changeset
1113 assert(mb_type & 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: 1164
diff changeset
1114 //FIXME decide if MBs in field pictures are 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: 1164
diff changeset
1115 /* get additionnal motion vector 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: 1164
diff changeset
1116 if (s->frame_pred_frame_dct)
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: 1164
diff changeset
1117 motion_type = MT_FRAME;
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: 1164
diff changeset
1118 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: 1164
diff changeset
1119 motion_type = get_bits(&s->gb, 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: 1164
diff changeset
1120 }
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: 1164
diff changeset
1121
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: 1164
diff changeset
1122 /* compute dct 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: 1164
diff changeset
1123 if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var?
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: 1164
diff changeset
1124 !s->frame_pred_frame_dct && IS_PAT(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: 1164
diff changeset
1125 s->interlaced_dct = 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: 1164
diff changeset
1126 }
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: 1164
diff changeset
1127
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: 1164
diff changeset
1128 if (IS_QUANT(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: 1164
diff changeset
1129 s->qscale = get_qscale(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: 1164
diff changeset
1130
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: 1164
diff changeset
1131 /* motion vectors */
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: 1164
diff changeset
1132 s->mv_dir = 0;
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1133 for(i=0;i<2;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: 1164
diff changeset
1134 if (USES_LIST(mb_type, 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: 1164
diff changeset
1135 s->mv_dir |= (MV_DIR_FORWARD >> 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: 1164
diff changeset
1136 dprintf("motion_type=%d\n", motion_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: 1164
diff changeset
1137 switch(motion_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: 1164
diff changeset
1138 case MT_FRAME: /* or MT_16X8 */
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: 1164
diff changeset
1139 if (s->picture_structure == PICT_FRAME) {
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: 1164
diff changeset
1140 /* MT_FRAME */
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: 1164
diff changeset
1141 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: 1164
diff changeset
1142 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: 1164
diff changeset
1143 s->mv[i][0][0]= s->last_mv[i][0][0]= s->last_mv[i][1][0] =
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1144 mpeg_decode_motion(s, s->mpeg_f_code[i][0], s->last_mv[i][0][0]);
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1145 s->mv[i][0][1]= s->last_mv[i][0][1]= s->last_mv[i][1][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: 1164
diff changeset
1146 mpeg_decode_motion(s, s->mpeg_f_code[i][1], s->last_mv[i][0][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: 1164
diff changeset
1147 /* full_pel: only for mpeg1 */
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: 1164
diff changeset
1148 if (s->full_pel[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: 1164
diff changeset
1149 s->mv[i][0][0] <<= 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: 1164
diff changeset
1150 s->mv[i][0][1] <<= 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: 1164
diff changeset
1151 }
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: 1164
diff changeset
1152 } 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: 1164
diff changeset
1153 /* MT_16X8 */
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: 1164
diff changeset
1154 mb_type |= MB_TYPE_16x8;
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: 1164
diff changeset
1155 s->mv_type = MV_TYPE_16X8;
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: 1164
diff changeset
1156 for(j=0;j<2;j++) {
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: 1164
diff changeset
1157 s->field_select[i][j] = 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: 1164
diff changeset
1158 for(k=0;k<2;k++) {
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: 1164
diff changeset
1159 val = mpeg_decode_motion(s, s->mpeg_f_code[i][k],
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: 1164
diff changeset
1160 s->last_mv[i][j][k]);
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: 1164
diff changeset
1161 s->last_mv[i][j][k] = val;
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: 1164
diff changeset
1162 s->mv[i][j][k] = val;
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: 1164
diff changeset
1163 }
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: 1164
diff changeset
1164 }
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: 1164
diff changeset
1165 }
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: 1164
diff changeset
1166 break;
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: 1164
diff changeset
1167 case MT_FIELD:
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: 1164
diff changeset
1168 s->mv_type = MV_TYPE_FIELD;
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: 1164
diff changeset
1169 if (s->picture_structure == PICT_FRAME) {
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: 1164
diff changeset
1170 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: 1164
diff changeset
1171 for(j=0;j<2;j++) {
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: 1164
diff changeset
1172 s->field_select[i][j] = 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: 1164
diff changeset
1173 val = mpeg_decode_motion(s, s->mpeg_f_code[i][0],
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1174 s->last_mv[i][j][0]);
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1175 s->last_mv[i][j][0] = val;
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: 1164
diff changeset
1176 s->mv[i][j][0] = val;
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: 1164
diff changeset
1177 dprintf("fmx=%d\n", val);
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: 1164
diff changeset
1178 val = mpeg_decode_motion(s, s->mpeg_f_code[i][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: 1164
diff changeset
1179 s->last_mv[i][j][1] >> 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: 1164
diff changeset
1180 s->last_mv[i][j][1] = val << 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: 1164
diff changeset
1181 s->mv[i][j][1] = val;
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: 1164
diff changeset
1182 dprintf("fmy=%d\n", val);
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: 1164
diff changeset
1183 }
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: 1164
diff changeset
1184 } 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: 1164
diff changeset
1185 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: 1164
diff changeset
1186 s->field_select[i][0] = 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: 1164
diff changeset
1187 for(k=0;k<2;k++) {
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: 1164
diff changeset
1188 val = mpeg_decode_motion(s, s->mpeg_f_code[i][k],
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: 1164
diff changeset
1189 s->last_mv[i][0][k]);
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: 1164
diff changeset
1190 s->last_mv[i][0][k] = val;
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: 1164
diff changeset
1191 s->last_mv[i][1][k] = val;
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: 1164
diff changeset
1192 s->mv[i][0][k] = val;
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: 1164
diff changeset
1193 }
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: 1164
diff changeset
1194 }
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: 1164
diff changeset
1195 break;
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: 1164
diff changeset
1196 case MT_DMV:
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: 1164
diff changeset
1197 {
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: 1164
diff changeset
1198 int dmx, dmy, mx, my, m;
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: 1164
diff changeset
1199
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: 1164
diff changeset
1200 mx = mpeg_decode_motion(s, s->mpeg_f_code[i][0],
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1201 s->last_mv[i][0][0]);
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1202 s->last_mv[i][0][0] = mx;
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1203 s->last_mv[i][1][0] = mx;
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1204 dmx = get_dmv(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: 1164
diff changeset
1205 my = mpeg_decode_motion(s, s->mpeg_f_code[i][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: 1164
diff changeset
1206 s->last_mv[i][0][1] >> 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: 1164
diff changeset
1207 dmy = get_dmv(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: 1164
diff changeset
1208 s->mv_type = MV_TYPE_DMV;
1326
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1209
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1210
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1211 s->last_mv[i][0][1] = my<<1;
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1212 s->last_mv[i][1][1] = my<<1;
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1213
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1214 s->mv[i][0][0] = mx;
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1215 s->mv[i][0][1] = my;
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1216 s->mv[i][1][0] = mx;//not used
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1217 s->mv[i][1][1] = my;//not used
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1218
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: 1164
diff changeset
1219 if (s->picture_structure == PICT_FRAME) {
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: 1164
diff changeset
1220 mb_type |= MB_TYPE_16x16 | 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: 1164
diff changeset
1221
1326
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1222 //m = 1 + 2 * s->top_field_first;
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1223 m = s->top_field_first ? 1 : 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: 1164
diff changeset
1224
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: 1164
diff changeset
1225 /* top -> top pred */
1326
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1226 s->mv[i][2][0] = ((mx * m + (mx > 0)) >> 1) + dmx;
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1227 s->mv[i][2][1] = ((my * m + (my > 0)) >> 1) + dmy - 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: 1164
diff changeset
1228 m = 4 - m;
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: 1164
diff changeset
1229 s->mv[i][3][0] = ((mx * m + (mx > 0)) >> 1) + dmx;
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: 1164
diff changeset
1230 s->mv[i][3][1] = ((my * m + (my > 0)) >> 1) + dmy + 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: 1164
diff changeset
1231 } 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: 1164
diff changeset
1232 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: 1164
diff changeset
1233
1326
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1234 s->mv[i][2][0] = ((mx + (mx > 0)) >> 1) + dmx;
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1235 s->mv[i][2][1] = ((my + (my > 0)) >> 1) + dmy;
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1236 if(s->picture_structure == PICT_TOP_FIELD)
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1237 s->mv[i][2][1]--;
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1238 else
6cdd3b8f4fd3 DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
michaelni
parents: 1325
diff changeset
1239 s->mv[i][2][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: 1164
diff changeset
1240 }
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: 1164
diff changeset
1241 }
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: 1164
diff changeset
1242 break;
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: 1164
diff changeset
1243 }
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: 1164
diff changeset
1244 }
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: 1164
diff changeset
1245 }
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: 1164
diff changeset
1246 }
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: 1164
diff changeset
1247
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: 1164
diff changeset
1248 s->mb_intra = 0;
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1249
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: 1164
diff changeset
1250 if (IS_PAT(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: 1164
diff changeset
1251 cbp = get_vlc2(&s->gb, mb_pat_vlc.table, MB_PAT_VLC_BITS, 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: 1164
diff changeset
1252 if (cbp < 0){
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1253 fprintf(stderr, "invalid cbp at %d %d\n", s->mb_x, s->mb_y);
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: 1164
diff changeset
1254 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: 1164
diff changeset
1255 }
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: 1164
diff changeset
1256 cbp++;
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: 1164
diff changeset
1257
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
1258 if (s->codec_id == CODEC_ID_MPEG2VIDEO) {
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: 1164
diff changeset
1259 for(i=0;i<6;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: 1164
diff changeset
1260 if (cbp & 32) {
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: 1164
diff changeset
1261 if (mpeg2_decode_block_non_intra(s, block[i], i) < 0)
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1262 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: 1164
diff changeset
1263 } 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: 1164
diff changeset
1264 s->block_last_index[i] = -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: 1164
diff changeset
1265 }
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: 1164
diff changeset
1266 cbp+=cbp;
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: 1164
diff changeset
1267 }
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: 1164
diff changeset
1268 } 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: 1164
diff changeset
1269 for(i=0;i<6;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: 1164
diff changeset
1270 if (cbp & 32) {
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: 1164
diff changeset
1271 if (mpeg1_decode_block_inter(s, block[i], i) < 0)
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1272 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: 1164
diff changeset
1273 } 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: 1164
diff changeset
1274 s->block_last_index[i] = -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: 1164
diff changeset
1275 }
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: 1164
diff changeset
1276 cbp+=cbp;
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: 1164
diff changeset
1277 }
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1278 }
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1279 }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: 1164
diff changeset
1280 for(i=0;i<6;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: 1164
diff changeset
1281 s->block_last_index[i] = -1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1282 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1283 }
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: 1164
diff changeset
1284
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: 1164
diff changeset
1285 s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= 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: 1164
diff changeset
1286
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1287 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1288 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1289
986e461dc072 Initial revision
glantau
parents:
diff changeset
1290 /* as h263, but only 17 codes */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1291 static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1292 {
1255
625ccacd1113 decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1254
diff changeset
1293 int code, sign, val, l, shift;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1294
545
6df843af36cb optimization (get_vlc() -> get_vlc2())
michaelni
parents: 533
diff changeset
1295 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
1177
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1296 if (code == 0) {
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1297 return pred;
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1298 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1299 if (code < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1300 return 0xffff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1301 }
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: 1164
diff changeset
1302
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1303 sign = get_bits1(&s->gb);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1304 shift = fcode - 1;
1255
625ccacd1113 decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1254
diff changeset
1305 val = code;
625ccacd1113 decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1254
diff changeset
1306 if (shift) {
625ccacd1113 decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1254
diff changeset
1307 val = (val - 1) << shift;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1308 val |= get_bits(&s->gb, shift);
1255
625ccacd1113 decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1254
diff changeset
1309 val++;
625ccacd1113 decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1254
diff changeset
1310 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1311 if (sign)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1312 val = -val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1313 val += pred;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1314
986e461dc072 Initial revision
glantau
parents:
diff changeset
1315 /* modulo decoding */
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: 1164
diff changeset
1316 l = 1 << (shift+4);
1255
625ccacd1113 decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1254
diff changeset
1317 val = ((val + l)&(l*2-1)) - l;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1318 return val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1319 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1320
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents: 1409
diff changeset
1321 static inline int decode_dc(GetBitContext *gb, int component)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1322 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1323 int code, diff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1324
986e461dc072 Initial revision
glantau
parents:
diff changeset
1325 if (component == 0) {
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents: 1409
diff changeset
1326 code = get_vlc2(gb, dc_lum_vlc.table, DC_VLC_BITS, 2);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1327 } else {
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents: 1409
diff changeset
1328 code = get_vlc2(gb, dc_chroma_vlc.table, DC_VLC_BITS, 2);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1329 }
568
7e7a7282608c hmm ABS(dc-diff) > 512 fix
michaelni
parents: 558
diff changeset
1330 if (code < 0){
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents: 1409
diff changeset
1331 fprintf(stderr, "invalid dc code at\n");
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1332 return 0xffff;
568
7e7a7282608c hmm ABS(dc-diff) > 512 fix
michaelni
parents: 558
diff changeset
1333 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1334 if (code == 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1335 diff = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1336 } else {
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents: 1409
diff changeset
1337 diff = get_xbits(gb, code);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1338 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1339 return diff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1340 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1341
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1342 static inline int mpeg1_decode_block_intra(MpegEncContext *s,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1343 DCTELEM *block,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1344 int n)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1345 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1346 int level, dc, diff, i, j, run;
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1347 int component;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1348 RLTable *rl = &rl_mpeg1;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
1349 uint8_t * const scantable= s->intra_scantable.permutated;
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
1350 const uint16_t *quant_matrix= s->intra_matrix;
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1351 const int qscale= s->qscale;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1352
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1353 /* DC coef */
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1354 component = (n <= 3 ? 0 : n - 4 + 1);
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents: 1409
diff changeset
1355 diff = decode_dc(&s->gb, component);
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1356 if (diff >= 0xffff)
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1357 return -1;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1358 dc = s->last_dc[component];
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1359 dc += diff;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1360 s->last_dc[component] = dc;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1361 block[0] = dc<<3;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1362 dprintf("dc=%d diff=%d\n", dc, diff);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1363 i = 0;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1364 {
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1365 OPEN_READER(re, &s->gb);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1366 /* now quantify & encode AC coefs */
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1367 for(;;) {
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1368 UPDATE_CACHE(re, &s->gb);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1369 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1370
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1371 if(level == 127){
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1372 break;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1373 } else if(level != 0) {
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1374 i += run;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1375 j = scantable[i];
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1376 level= (level*qscale*quant_matrix[j])>>3;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1377 level= (level-1)|1;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1378 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1379 LAST_SKIP_BITS(re, &s->gb, 1);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1380 } else {
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1381 /* escape */
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1382 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1383 UPDATE_CACHE(re, &s->gb);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1384 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1385 if (level == -128) {
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1386 level = SHOW_UBITS(re, &s->gb, 8) - 256; LAST_SKIP_BITS(re, &s->gb, 8);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1387 } else if (level == 0) {
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1388 level = SHOW_UBITS(re, &s->gb, 8) ; LAST_SKIP_BITS(re, &s->gb, 8);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1389 }
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1390 i += run;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1391 j = scantable[i];
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1392 if(level<0){
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1393 level= -level;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1394 level= (level*qscale*quant_matrix[j])>>3;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1395 level= (level-1)|1;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1396 level= -level;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1397 }else{
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1398 level= (level*qscale*quant_matrix[j])>>3;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1399 level= (level-1)|1;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1400 }
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1401 }
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1402 if (i > 63){
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1403 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1404 return -1;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1405 }
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1406
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1407 block[j] = level;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1408 }
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1409 CLOSE_READER(re, &s->gb);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1410 }
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1411 s->block_last_index[n] = i;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1412 return 0;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1413 }
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1414
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1415 static inline int mpeg1_decode_block_inter(MpegEncContext *s,
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1416 DCTELEM *block,
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1417 int n)
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1418 {
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1419 int level, i, j, run;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1420 RLTable *rl = &rl_mpeg1;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
1421 uint8_t * const scantable= s->intra_scantable.permutated;
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
1422 const uint16_t *quant_matrix= s->inter_matrix;
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1423 const int qscale= s->qscale;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1424
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1425 {
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 498
diff changeset
1426 int v;
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 498
diff changeset
1427 OPEN_READER(re, &s->gb);
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1428 i = -1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1429 /* special case for the first coef. no need to add a second vlc table */
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 498
diff changeset
1430 UPDATE_CACHE(re, &s->gb);
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 498
diff changeset
1431 v= SHOW_UBITS(re, &s->gb, 2);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1432 if (v & 2) {
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1433 LAST_SKIP_BITS(re, &s->gb, 2);
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1434 level= (3*qscale*quant_matrix[0])>>4;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1435 level= (level-1)|1;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1436 if(v&1)
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1437 level= -level;
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1438 block[0] = level;
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1439 i++;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1440 }
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1441
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1442 /* now quantify & encode AC coefs */
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1443 for(;;) {
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1444 UPDATE_CACHE(re, &s->gb);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1445 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1446
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1447 if(level == 127){
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1448 break;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1449 } else if(level != 0) {
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1450 i += run;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1451 j = scantable[i];
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1452 level= ((level*2+1)*qscale*quant_matrix[j])>>4;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1453 level= (level-1)|1;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1454 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1455 LAST_SKIP_BITS(re, &s->gb, 1);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1456 } else {
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1457 /* escape */
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1458 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1459 UPDATE_CACHE(re, &s->gb);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1460 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1461 if (level == -128) {
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1462 level = SHOW_UBITS(re, &s->gb, 8) - 256; LAST_SKIP_BITS(re, &s->gb, 8);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1463 } else if (level == 0) {
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1464 level = SHOW_UBITS(re, &s->gb, 8) ; LAST_SKIP_BITS(re, &s->gb, 8);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1465 }
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1466 i += run;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1467 j = scantable[i];
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1468 if(level<0){
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1469 level= -level;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1470 level= ((level*2+1)*qscale*quant_matrix[j])>>4;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1471 level= (level-1)|1;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1472 level= -level;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1473 }else{
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1474 level= ((level*2+1)*qscale*quant_matrix[j])>>4;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1475 level= (level-1)|1;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1476 }
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1477 }
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1478 if (i > 63){
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1479 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1480 return -1;
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1481 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1482
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1483 block[j] = level;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1484 }
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1485 CLOSE_READER(re, &s->gb);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1486 }
711
dcbcf9676c9f optimizing mpeg1_decode_block()
michaelni
parents: 710
diff changeset
1487 s->block_last_index[n] = i;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1488 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1489 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1490
986e461dc072 Initial revision
glantau
parents:
diff changeset
1491 /* Also does unquantization here, since I will never support mpeg2
986e461dc072 Initial revision
glantau
parents:
diff changeset
1492 encoding */
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1493 static inline int mpeg2_decode_block_non_intra(MpegEncContext *s,
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1494 DCTELEM *block,
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1495 int n)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1496 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1497 int level, i, j, run;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1498 RLTable *rl = &rl_mpeg1;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
1499 uint8_t * const scantable= s->intra_scantable.permutated;
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
1500 const uint16_t *quant_matrix;
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1501 const int qscale= s->qscale;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1502 int mismatch;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1503
986e461dc072 Initial revision
glantau
parents:
diff changeset
1504 mismatch = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1505
986e461dc072 Initial revision
glantau
parents:
diff changeset
1506 {
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 498
diff changeset
1507 int v;
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 498
diff changeset
1508 OPEN_READER(re, &s->gb);
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1509 i = -1;
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 498
diff changeset
1510 if (n < 4)
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1511 quant_matrix = s->inter_matrix;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1512 else
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1513 quant_matrix = s->chroma_inter_matrix;
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 498
diff changeset
1514
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1515 /* special case for the first coef. no need to add a second vlc table */
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 498
diff changeset
1516 UPDATE_CACHE(re, &s->gb);
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 498
diff changeset
1517 v= SHOW_UBITS(re, &s->gb, 2);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1518 if (v & 2) {
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1519 LAST_SKIP_BITS(re, &s->gb, 2);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1520 level= (3*qscale*quant_matrix[0])>>5;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1521 if(v&1)
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1522 level= -level;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1523 block[0] = level;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1524 mismatch ^= level;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1525 i++;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1526 }
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1527
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1528 /* now quantify & encode AC coefs */
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1529 for(;;) {
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1530 UPDATE_CACHE(re, &s->gb);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1531 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1532
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1533 if(level == 127){
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1534 break;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1535 } else if(level != 0) {
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1536 i += run;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1537 j = scantable[i];
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1538 level= ((level*2+1)*qscale*quant_matrix[j])>>5;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1539 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1540 LAST_SKIP_BITS(re, &s->gb, 1);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1541 } else {
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1542 /* escape */
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1543 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1544 UPDATE_CACHE(re, &s->gb);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1545 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1546
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1547 i += run;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1548 j = scantable[i];
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1549 if(level<0){
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1550 level= ((-level*2+1)*qscale*quant_matrix[j])>>5;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1551 level= -level;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1552 }else{
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1553 level= ((level*2+1)*qscale*quant_matrix[j])>>5;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1554 }
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1555 }
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1556 if (i > 63){
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1557 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1558 return -1;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1559 }
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1560
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1561 mismatch ^= level;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1562 block[j] = level;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1563 }
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 498
diff changeset
1564 CLOSE_READER(re, &s->gb);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1565 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1566 block[63] ^= (mismatch & 1);
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1567
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1568 s->block_last_index[n] = i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1569 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1570 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1571
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1572 static inline int mpeg2_decode_block_intra(MpegEncContext *s,
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1573 DCTELEM *block,
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1574 int n)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1575 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1576 int level, dc, diff, i, j, run;
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1577 int component;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1578 RLTable *rl;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
1579 uint8_t * const scantable= s->intra_scantable.permutated;
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
1580 const uint16_t *quant_matrix;
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1581 const int qscale= s->qscale;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1582 int mismatch;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1583
986e461dc072 Initial revision
glantau
parents:
diff changeset
1584 /* DC coef */
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1585 if (n < 4){
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1586 quant_matrix = s->intra_matrix;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1587 component = 0;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1588 }else{
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1589 quant_matrix = s->chroma_intra_matrix;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1590 component = n - 3;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1591 }
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents: 1409
diff changeset
1592 diff = decode_dc(&s->gb, component);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1593 if (diff >= 0xffff)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1594 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1595 dc = s->last_dc[component];
986e461dc072 Initial revision
glantau
parents:
diff changeset
1596 dc += diff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1597 s->last_dc[component] = dc;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1598 block[0] = dc << (3 - s->intra_dc_precision);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1599 dprintf("dc=%d\n", block[0]);
58
0e0a24def67a fixed last zero mv for field - fixed mismatch handling for intra coefs
glantau
parents: 54
diff changeset
1600 mismatch = block[0] ^ 1;
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1601 i = 0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1602 if (s->intra_vlc_format)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1603 rl = &rl_mpeg2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1604 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
1605 rl = &rl_mpeg1;
59
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
1606
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1607 {
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1608 OPEN_READER(re, &s->gb);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1609 /* now quantify & encode AC coefs */
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1610 for(;;) {
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1611 UPDATE_CACHE(re, &s->gb);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1612 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1613
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1614 if(level == 127){
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1615 break;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1616 } else if(level != 0) {
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1617 i += run;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1618 j = scantable[i];
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1619 level= (level*qscale*quant_matrix[j])>>4;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1620 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1621 LAST_SKIP_BITS(re, &s->gb, 1);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1622 } else {
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1623 /* escape */
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1624 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1625 UPDATE_CACHE(re, &s->gb);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1626 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1627 i += run;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1628 j = scantable[i];
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1629 if(level<0){
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1630 level= (-level*qscale*quant_matrix[j])>>4;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1631 level= -level;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1632 }else{
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1633 level= (level*qscale*quant_matrix[j])>>4;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1634 }
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1635 }
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1636 if (i > 63){
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1637 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1638 return -1;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1639 }
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1640
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1641 mismatch^= level;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1642 block[j] = level;
568
7e7a7282608c hmm ABS(dc-diff) > 512 fix
michaelni
parents: 558
diff changeset
1643 }
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1644 CLOSE_READER(re, &s->gb);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1645 }
714
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1646 block[63]^= mismatch&1;
fd0e997616fe optimizing mpeg2 decode block stuff
michaelni
parents: 711
diff changeset
1647
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1648 s->block_last_index[n] = i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1649 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1650 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1651
986e461dc072 Initial revision
glantau
parents:
diff changeset
1652 typedef struct Mpeg1Context {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1653 MpegEncContext mpeg_enc_ctx;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1654 int mpeg_enc_ctx_allocated; /* true if decoding context allocated */
267
e10840e4f773 - Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents: 241
diff changeset
1655 int repeat_field; /* true if we must repeat the field */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1656 } Mpeg1Context;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1657
986e461dc072 Initial revision
glantau
parents:
diff changeset
1658 static int mpeg_decode_init(AVCodecContext *avctx)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1659 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1660 Mpeg1Context *s = avctx->priv_data;
498
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
1661
558
michaelni
parents: 556
diff changeset
1662 s->mpeg_enc_ctx.flags= avctx->flags;
498
0b4450c15067 dc scale simplification/optimization
michaelni
parents: 494
diff changeset
1663 common_init(&s->mpeg_enc_ctx);
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents: 1409
diff changeset
1664 init_vlcs();
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1665
986e461dc072 Initial revision
glantau
parents:
diff changeset
1666 s->mpeg_enc_ctx_allocated = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1667 s->mpeg_enc_ctx.picture_number = 0;
267
e10840e4f773 - Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents: 241
diff changeset
1668 s->repeat_field = 0;
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 313
diff changeset
1669 s->mpeg_enc_ctx.codec_id= avctx->codec->id;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1670 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1671 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1672
986e461dc072 Initial revision
glantau
parents:
diff changeset
1673 /* return the 8 bit start code value and update the search
986e461dc072 Initial revision
glantau
parents:
diff changeset
1674 state. Return -1 if no start code found */
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
1675 static int find_start_code(uint8_t **pbuf_ptr, uint8_t *buf_end)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1676 {
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
1677 uint8_t *buf_ptr;
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
1678 unsigned int state=0xFFFFFFFF, v;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1679 int val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1680
986e461dc072 Initial revision
glantau
parents:
diff changeset
1681 buf_ptr = *pbuf_ptr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1682 while (buf_ptr < buf_end) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1683 v = *buf_ptr++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1684 if (state == 0x000001) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1685 state = ((state << 8) | v) & 0xffffff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1686 val = state;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1687 goto found;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1688 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1689 state = ((state << 8) | v) & 0xffffff;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1690 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1691 val = -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1692 found:
986e461dc072 Initial revision
glantau
parents:
diff changeset
1693 *pbuf_ptr = buf_ptr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1694 return val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1695 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1696
986e461dc072 Initial revision
glantau
parents:
diff changeset
1697 static int mpeg1_decode_picture(AVCodecContext *avctx,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
1698 uint8_t *buf, int buf_size)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1699 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1700 Mpeg1Context *s1 = avctx->priv_data;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1701 MpegEncContext *s = &s1->mpeg_enc_ctx;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1702 int ref, f_code;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1703
1025
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 1021
diff changeset
1704 init_get_bits(&s->gb, buf, buf_size*8);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1705
986e461dc072 Initial revision
glantau
parents:
diff changeset
1706 ref = get_bits(&s->gb, 10); /* temporal ref */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1707 s->pict_type = get_bits(&s->gb, 3);
45
933cc4acab5c fixed mpeg1 last block bug (mb stuffing code was not included in vlc table...)
glantau
parents: 38
diff changeset
1708 dprintf("pict_type=%d number=%d\n", s->pict_type, s->picture_number);
872
8af5c366e3d9 hurry_up=5 support
michaelni
parents: 853
diff changeset
1709
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1710 skip_bits(&s->gb, 16);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1711 if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) {
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1712 s->full_pel[0] = get_bits1(&s->gb);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1713 f_code = get_bits(&s->gb, 3);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1714 if (f_code == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1715 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1716 s->mpeg_f_code[0][0] = f_code;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1717 s->mpeg_f_code[0][1] = f_code;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1718 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1719 if (s->pict_type == B_TYPE) {
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1720 s->full_pel[1] = get_bits1(&s->gb);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1721 f_code = get_bits(&s->gb, 3);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1722 if (f_code == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1723 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1724 s->mpeg_f_code[1][0] = f_code;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1725 s->mpeg_f_code[1][1] = f_code;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1726 }
903
22ee74da2cd3 cleanup
michaelni
parents: 890
diff changeset
1727 s->current_picture.pict_type= s->pict_type;
22ee74da2cd3 cleanup
michaelni
parents: 890
diff changeset
1728 s->current_picture.key_frame= s->pict_type == I_TYPE;
911
4b2c86f1fee9 drop b frames if there are no reference frames
michaelni
parents: 903
diff changeset
1729
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1730 s->y_dc_scale = 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1731 s->c_dc_scale = 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1732 s->first_slice = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1733 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1734 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1735
986e461dc072 Initial revision
glantau
parents:
diff changeset
1736 static void mpeg_decode_sequence_extension(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1737 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1738 int horiz_size_ext, vert_size_ext;
917
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
1739 int bit_rate_ext, vbv_buf_ext;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1740 int frame_rate_ext_n, frame_rate_ext_d;
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
1741 int level, profile;
917
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
1742 float aspect;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1743
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
1744 skip_bits(&s->gb, 1); /* profil and level esc*/
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
1745 profile= get_bits(&s->gb, 3);
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
1746 level= get_bits(&s->gb, 4);
267
e10840e4f773 - Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents: 241
diff changeset
1747 s->progressive_sequence = get_bits1(&s->gb); /* progressive_sequence */
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1748 skip_bits(&s->gb, 2); /* chroma_format */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1749 horiz_size_ext = get_bits(&s->gb, 2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1750 vert_size_ext = get_bits(&s->gb, 2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1751 s->width |= (horiz_size_ext << 12);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1752 s->height |= (vert_size_ext << 12);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1753 bit_rate_ext = get_bits(&s->gb, 12); /* XXX: handle it */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1754 s->bit_rate = ((s->bit_rate / 400) | (bit_rate_ext << 12)) * 400;
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1755 skip_bits1(&s->gb); /* marker */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1756 vbv_buf_ext = get_bits(&s->gb, 8);
1346
44c94325810c CODEC_FLAG_LOW_DELAY fix
michaelni
parents: 1328
diff changeset
1757
917
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
1758 s->low_delay = get_bits1(&s->gb);
1346
44c94325810c CODEC_FLAG_LOW_DELAY fix
michaelni
parents: 1328
diff changeset
1759 if(s->flags & CODEC_FLAG_LOW_DELAY) s->low_delay=1;
44c94325810c CODEC_FLAG_LOW_DELAY fix
michaelni
parents: 1328
diff changeset
1760
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1761 frame_rate_ext_n = get_bits(&s->gb, 2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1762 frame_rate_ext_d = get_bits(&s->gb, 5);
1126
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
1763 av_reduce(
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
1764 &s->avctx->frame_rate,
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
1765 &s->avctx->frame_rate_base,
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
1766 frame_rate_tab[s->frame_rate_index] * (frame_rate_ext_n+1),
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
1767 MPEG1_FRAME_RATE_BASE * (frame_rate_ext_d+1),
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
1768 1<<30);
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
1769
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1770 dprintf("sequence extension\n");
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
1771 s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG2VIDEO;
401
e20655449d4a mpeg1/2 identifier - fixed frame rate for some bad mpeg1 streams
glantau
parents: 391
diff changeset
1772 s->avctx->sub_id = 2; /* indicates mpeg2 found */
917
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
1773
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
1774 aspect= mpeg2_aspect[s->aspect_ratio_info];
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
1775 if(aspect>0.0) s->avctx->aspect_ratio= s->width/(aspect*s->height);
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
1776 else if(aspect<0.0) s->avctx->aspect_ratio= -1.0/aspect;
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
1777
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
1778 if(s->avctx->debug & FF_DEBUG_PICT_INFO)
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
1779 printf("profile: %d, level: %d \n", profile, level);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1780 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1781
986e461dc072 Initial revision
glantau
parents:
diff changeset
1782 static void mpeg_decode_quant_matrix_extension(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1783 {
38
5bf15419d47e changed quant matrix order (should fix mmx mpeg decoding bug)
glantau
parents: 21
diff changeset
1784 int i, v, j;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1785
59
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
1786 dprintf("matrix extension\n");
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
1787
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1788 if (get_bits1(&s->gb)) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1789 for(i=0;i<64;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1790 v = get_bits(&s->gb, 8);
1092
f59c3f66363b MpegEncContext.(i)dct_* -> DspContext.(i)dct_*
michaelni
parents: 1085
diff changeset
1791 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
38
5bf15419d47e changed quant matrix order (should fix mmx mpeg decoding bug)
glantau
parents: 21
diff changeset
1792 s->intra_matrix[j] = v;
5bf15419d47e changed quant matrix order (should fix mmx mpeg decoding bug)
glantau
parents: 21
diff changeset
1793 s->chroma_intra_matrix[j] = v;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1794 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1795 }
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1796 if (get_bits1(&s->gb)) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1797 for(i=0;i<64;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1798 v = get_bits(&s->gb, 8);
1092
f59c3f66363b MpegEncContext.(i)dct_* -> DspContext.(i)dct_*
michaelni
parents: 1085
diff changeset
1799 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 313
diff changeset
1800 s->inter_matrix[j] = v;
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 313
diff changeset
1801 s->chroma_inter_matrix[j] = v;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1802 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1803 }
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1804 if (get_bits1(&s->gb)) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1805 for(i=0;i<64;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1806 v = get_bits(&s->gb, 8);
1092
f59c3f66363b MpegEncContext.(i)dct_* -> DspContext.(i)dct_*
michaelni
parents: 1085
diff changeset
1807 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
38
5bf15419d47e changed quant matrix order (should fix mmx mpeg decoding bug)
glantau
parents: 21
diff changeset
1808 s->chroma_intra_matrix[j] = v;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1809 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1810 }
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1811 if (get_bits1(&s->gb)) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1812 for(i=0;i<64;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1813 v = get_bits(&s->gb, 8);
1092
f59c3f66363b MpegEncContext.(i)dct_* -> DspContext.(i)dct_*
michaelni
parents: 1085
diff changeset
1814 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 313
diff changeset
1815 s->chroma_inter_matrix[j] = v;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1816 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1817 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1818 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1819
986e461dc072 Initial revision
glantau
parents:
diff changeset
1820 static void mpeg_decode_picture_coding_extension(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1821 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1822 s->full_pel[0] = s->full_pel[1] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1823 s->mpeg_f_code[0][0] = get_bits(&s->gb, 4);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1824 s->mpeg_f_code[0][1] = get_bits(&s->gb, 4);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1825 s->mpeg_f_code[1][0] = get_bits(&s->gb, 4);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1826 s->mpeg_f_code[1][1] = get_bits(&s->gb, 4);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1827 s->intra_dc_precision = get_bits(&s->gb, 2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1828 s->picture_structure = get_bits(&s->gb, 2);
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1829 s->top_field_first = get_bits1(&s->gb);
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1830 s->frame_pred_frame_dct = get_bits1(&s->gb);
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1831 s->concealment_motion_vectors = get_bits1(&s->gb);
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1832 s->q_scale_type = get_bits1(&s->gb);
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1833 s->intra_vlc_format = get_bits1(&s->gb);
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1834 s->alternate_scan = get_bits1(&s->gb);
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1835 s->repeat_first_field = get_bits1(&s->gb);
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1836 s->chroma_420_type = get_bits1(&s->gb);
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1837 s->progressive_frame = get_bits1(&s->gb);
715
8b3ccabfce4a move scantable init from block-decode to header parser
michaelni
parents: 714
diff changeset
1838
1096
5e6e505d8997 field picture decoding support (16x16 MC blocks only as i dont have any samples which use other modes ...)
michaelni
parents: 1092
diff changeset
1839 if(s->picture_structure == PICT_FRAME)
5e6e505d8997 field picture decoding support (16x16 MC blocks only as i dont have any samples which use other modes ...)
michaelni
parents: 1092
diff changeset
1840 s->first_field=0;
5e6e505d8997 field picture decoding support (16x16 MC blocks only as i dont have any samples which use other modes ...)
michaelni
parents: 1092
diff changeset
1841 else{
5e6e505d8997 field picture decoding support (16x16 MC blocks only as i dont have any samples which use other modes ...)
michaelni
parents: 1092
diff changeset
1842 s->first_field ^= 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: 1164
diff changeset
1843 memset(s->mbskip_table, 0, s->mb_stride*s->mb_height);
1096
5e6e505d8997 field picture decoding support (16x16 MC blocks only as i dont have any samples which use other modes ...)
michaelni
parents: 1092
diff changeset
1844 }
5e6e505d8997 field picture decoding support (16x16 MC blocks only as i dont have any samples which use other modes ...)
michaelni
parents: 1092
diff changeset
1845
715
8b3ccabfce4a move scantable init from block-decode to header parser
michaelni
parents: 714
diff changeset
1846 if(s->alternate_scan){
1273
a979fab41ed8 ASV1 codec
michaelni
parents: 1255
diff changeset
1847 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
a979fab41ed8 ASV1 codec
michaelni
parents: 1255
diff changeset
1848 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
a979fab41ed8 ASV1 codec
michaelni
parents: 1255
diff changeset
1849 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
a979fab41ed8 ASV1 codec
michaelni
parents: 1255
diff changeset
1850 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
715
8b3ccabfce4a move scantable init from block-decode to header parser
michaelni
parents: 714
diff changeset
1851 }else{
1273
a979fab41ed8 ASV1 codec
michaelni
parents: 1255
diff changeset
1852 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
a979fab41ed8 ASV1 codec
michaelni
parents: 1255
diff changeset
1853 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
a979fab41ed8 ASV1 codec
michaelni
parents: 1255
diff changeset
1854 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
a979fab41ed8 ASV1 codec
michaelni
parents: 1255
diff changeset
1855 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
715
8b3ccabfce4a move scantable init from block-decode to header parser
michaelni
parents: 714
diff changeset
1856 }
8b3ccabfce4a move scantable init from block-decode to header parser
michaelni
parents: 714
diff changeset
1857
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1858 /* composite display not parsed */
267
e10840e4f773 - Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents: 241
diff changeset
1859 dprintf("intra_dc_precision=%d\n", s->intra_dc_precision);
59
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
1860 dprintf("picture_structure=%d\n", s->picture_structure);
383
e6b64bc3bc87 - repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents: 377
diff changeset
1861 dprintf("top field first=%d\n", s->top_field_first);
e6b64bc3bc87 - repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents: 377
diff changeset
1862 dprintf("repeat first field=%d\n", s->repeat_first_field);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1863 dprintf("conceal=%d\n", s->concealment_motion_vectors);
59
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
1864 dprintf("intra_vlc_format=%d\n", s->intra_vlc_format);
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
1865 dprintf("alternate_scan=%d\n", s->alternate_scan);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1866 dprintf("frame_pred_frame_dct=%d\n", s->frame_pred_frame_dct);
267
e10840e4f773 - Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents: 241
diff changeset
1867 dprintf("progressive_frame=%d\n", s->progressive_frame);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1868 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1869
986e461dc072 Initial revision
glantau
parents:
diff changeset
1870 static void mpeg_decode_extension(AVCodecContext *avctx,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
1871 uint8_t *buf, int buf_size)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1872 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1873 Mpeg1Context *s1 = avctx->priv_data;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1874 MpegEncContext *s = &s1->mpeg_enc_ctx;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1875 int ext_type;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1876
1025
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 1021
diff changeset
1877 init_get_bits(&s->gb, buf, buf_size*8);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1878
986e461dc072 Initial revision
glantau
parents:
diff changeset
1879 ext_type = get_bits(&s->gb, 4);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1880 switch(ext_type) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1881 case 0x1:
986e461dc072 Initial revision
glantau
parents:
diff changeset
1882 /* sequence ext */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1883 mpeg_decode_sequence_extension(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1884 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1885 case 0x3:
986e461dc072 Initial revision
glantau
parents:
diff changeset
1886 /* quant matrix extension */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1887 mpeg_decode_quant_matrix_extension(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1888 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1889 case 0x8:
986e461dc072 Initial revision
glantau
parents:
diff changeset
1890 /* picture extension */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1891 mpeg_decode_picture_coding_extension(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1892 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1893 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1894 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1895
1380
b120aed7bf84 ati vcr2 uv swap
michaelni
parents: 1377
diff changeset
1896 static void exchange_uv(AVFrame *f){
b120aed7bf84 ati vcr2 uv swap
michaelni
parents: 1377
diff changeset
1897 uint8_t *t= f->data[1];
b120aed7bf84 ati vcr2 uv swap
michaelni
parents: 1377
diff changeset
1898 f->data[1]= f->data[2];
b120aed7bf84 ati vcr2 uv swap
michaelni
parents: 1377
diff changeset
1899 f->data[2]= t;
b120aed7bf84 ati vcr2 uv swap
michaelni
parents: 1377
diff changeset
1900 }
b120aed7bf84 ati vcr2 uv swap
michaelni
parents: 1377
diff changeset
1901
826
ce240888252d cleanup
michaelni
parents: 825
diff changeset
1902 #define DECODE_SLICE_FATAL_ERROR -2
ce240888252d cleanup
michaelni
parents: 825
diff changeset
1903 #define DECODE_SLICE_ERROR -1
ce240888252d cleanup
michaelni
parents: 825
diff changeset
1904 #define DECODE_SLICE_OK 0
ce240888252d cleanup
michaelni
parents: 825
diff changeset
1905
ce240888252d cleanup
michaelni
parents: 825
diff changeset
1906 /**
ce240888252d cleanup
michaelni
parents: 825
diff changeset
1907 * decodes a slice.
ce240888252d cleanup
michaelni
parents: 825
diff changeset
1908 * @return DECODE_SLICE_FATAL_ERROR if a non recoverable error occured<br>
ce240888252d cleanup
michaelni
parents: 825
diff changeset
1909 * DECODE_SLICE_ERROR if the slice is damaged<br>
ce240888252d cleanup
michaelni
parents: 825
diff changeset
1910 * DECODE_SLICE_OK if this slice is ok<br>
ce240888252d cleanup
michaelni
parents: 825
diff changeset
1911 */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1912 static int mpeg_decode_slice(AVCodecContext *avctx,
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 924
diff changeset
1913 AVFrame *pict,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1914 int start_code,
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
1915 uint8_t **buf, int buf_size)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1916 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1917 Mpeg1Context *s1 = avctx->priv_data;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1918 MpegEncContext *s = &s1->mpeg_enc_ctx;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1919 int ret;
1096
5e6e505d8997 field picture decoding support (16x16 MC blocks only as i dont have any samples which use other modes ...)
michaelni
parents: 1092
diff changeset
1920 const int field_pic= s->picture_structure != PICT_FRAME;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1921
1285
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
1922 s->resync_mb_x= s->mb_x =
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
1923 s->resync_mb_y= s->mb_y = -1;
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
1924
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1925 start_code = (start_code - 1) & 0xff;
568
7e7a7282608c hmm ABS(dc-diff) > 512 fix
michaelni
parents: 558
diff changeset
1926 if (start_code >= s->mb_height){
647
22b22723805e support decoding of the last mpeg "packet" even if no startcode is immedeatly afterwards (fixes bugs with mpeg in avi)
michaelni
parents: 639
diff changeset
1927 fprintf(stderr, "slice below image (%d >= %d)\n", start_code, s->mb_height);
1285
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
1928 return -1;
568
7e7a7282608c hmm ABS(dc-diff) > 512 fix
michaelni
parents: 558
diff changeset
1929 }
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
1930
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
1931 ff_mpeg1_clean_buffers(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: 1164
diff changeset
1932 s->interlaced_dct = 0;
1096
5e6e505d8997 field picture decoding support (16x16 MC blocks only as i dont have any samples which use other modes ...)
michaelni
parents: 1092
diff changeset
1933
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1934 /* start frame decoding */
1138
e10e841c9bf0 field pic decoding cleanup
michaelni
parents: 1126
diff changeset
1935 if (s->first_slice) {
e10e841c9bf0 field pic decoding cleanup
michaelni
parents: 1126
diff changeset
1936 if(s->first_field || s->picture_structure==PICT_FRAME){
771
d4cc92144266 handle direct rendering buffer allocation failure
michaelni
parents: 751
diff changeset
1937 if(MPV_frame_start(s, avctx) < 0)
826
ce240888252d cleanup
michaelni
parents: 825
diff changeset
1938 return DECODE_SLICE_FATAL_ERROR;
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: 1164
diff changeset
1939
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: 1164
diff changeset
1940 ff_er_frame_start(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: 1164
diff changeset
1941
1085
9acf4b552047 move repeat_pict field from AVCodecContext -> AVFrame (closes bug #683536)
michaelni
parents: 1084
diff changeset
1942 /* first check if we must repeat the frame */
1409
62ea3b7d00f0 repeat_pict was never returned
bellard
parents: 1402
diff changeset
1943 s->current_picture_ptr->repeat_pict = 0;
1085
9acf4b552047 move repeat_pict field from AVCodecContext -> AVFrame (closes bug #683536)
michaelni
parents: 1084
diff changeset
1944 if (s->repeat_first_field) {
9acf4b552047 move repeat_pict field from AVCodecContext -> AVFrame (closes bug #683536)
michaelni
parents: 1084
diff changeset
1945 if (s->progressive_sequence) {
9acf4b552047 move repeat_pict field from AVCodecContext -> AVFrame (closes bug #683536)
michaelni
parents: 1084
diff changeset
1946 if (s->top_field_first)
1409
62ea3b7d00f0 repeat_pict was never returned
bellard
parents: 1402
diff changeset
1947 s->current_picture_ptr->repeat_pict = 4;
1085
9acf4b552047 move repeat_pict field from AVCodecContext -> AVFrame (closes bug #683536)
michaelni
parents: 1084
diff changeset
1948 else
1409
62ea3b7d00f0 repeat_pict was never returned
bellard
parents: 1402
diff changeset
1949 s->current_picture_ptr->repeat_pict = 2;
1085
9acf4b552047 move repeat_pict field from AVCodecContext -> AVFrame (closes bug #683536)
michaelni
parents: 1084
diff changeset
1950 } else if (s->progressive_frame) {
1409
62ea3b7d00f0 repeat_pict was never returned
bellard
parents: 1402
diff changeset
1951 s->current_picture_ptr->repeat_pict = 1;
1085
9acf4b552047 move repeat_pict field from AVCodecContext -> AVFrame (closes bug #683536)
michaelni
parents: 1084
diff changeset
1952 }
9acf4b552047 move repeat_pict field from AVCodecContext -> AVFrame (closes bug #683536)
michaelni
parents: 1084
diff changeset
1953 }
1409
62ea3b7d00f0 repeat_pict was never returned
bellard
parents: 1402
diff changeset
1954 //printf("%d\n", s->current_picture_ptr->repeat_pict);
1085
9acf4b552047 move repeat_pict field from AVCodecContext -> AVFrame (closes bug #683536)
michaelni
parents: 1084
diff changeset
1955
930
6bcb214d6a17 more debug output
michaelni
parents: 925
diff changeset
1956 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
1021
2d7c9f5738de trying to fix mb skip bug in mpeg1/2 if slices are not used
michaelni
parents: 947
diff changeset
1957 printf("qp:%d fc:%2d%2d%2d%2d %s %s %s %s dc:%d pstruct:%d fdct:%d cmv:%d qtype:%d ivlc:%d rff:%d %s\n",
930
6bcb214d6a17 more debug output
michaelni
parents: 925
diff changeset
1958 s->qscale, s->mpeg_f_code[0][0],s->mpeg_f_code[0][1],s->mpeg_f_code[1][0],s->mpeg_f_code[1][1],
6bcb214d6a17 more debug output
michaelni
parents: 925
diff changeset
1959 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")),
6bcb214d6a17 more debug output
michaelni
parents: 925
diff changeset
1960 s->progressive_sequence ? "pro" :"", s->alternate_scan ? "alt" :"", s->top_field_first ? "top" :"",
6bcb214d6a17 more debug output
michaelni
parents: 925
diff changeset
1961 s->intra_dc_precision, s->picture_structure, s->frame_pred_frame_dct, s->concealment_motion_vectors,
6bcb214d6a17 more debug output
michaelni
parents: 925
diff changeset
1962 s->q_scale_type, s->intra_vlc_format, s->repeat_first_field, s->chroma_420_type ? "420" :"");
6bcb214d6a17 more debug output
michaelni
parents: 925
diff changeset
1963 }
1138
e10e841c9bf0 field pic decoding cleanup
michaelni
parents: 1126
diff changeset
1964 }else{ //second field
e10e841c9bf0 field pic decoding cleanup
michaelni
parents: 1126
diff changeset
1965 int i;
1182
38e8b8f331cb some checks to avoid segfaults if the decoder is feeded with junk
michaelni
parents: 1181
diff changeset
1966
38e8b8f331cb some checks to avoid segfaults if the decoder is feeded with junk
michaelni
parents: 1181
diff changeset
1967 if(!s->current_picture_ptr){
38e8b8f331cb some checks to avoid segfaults if the decoder is feeded with junk
michaelni
parents: 1181
diff changeset
1968 fprintf(stderr, "first field missing\n");
38e8b8f331cb some checks to avoid segfaults if the decoder is feeded with junk
michaelni
parents: 1181
diff changeset
1969 return -1;
38e8b8f331cb some checks to avoid segfaults if the decoder is feeded with junk
michaelni
parents: 1181
diff changeset
1970 }
38e8b8f331cb some checks to avoid segfaults if the decoder is feeded with junk
michaelni
parents: 1181
diff changeset
1971
1138
e10e841c9bf0 field pic decoding cleanup
michaelni
parents: 1126
diff changeset
1972 for(i=0; i<4; i++){
e10e841c9bf0 field pic decoding cleanup
michaelni
parents: 1126
diff changeset
1973 s->current_picture.data[i] = s->current_picture_ptr->data[i];
e10e841c9bf0 field pic decoding cleanup
michaelni
parents: 1126
diff changeset
1974 if(s->picture_structure == PICT_BOTTOM_FIELD){
e10e841c9bf0 field pic decoding cleanup
michaelni
parents: 1126
diff changeset
1975 s->current_picture.data[i] += s->current_picture_ptr->linesize[i];
e10e841c9bf0 field pic decoding cleanup
michaelni
parents: 1126
diff changeset
1976 }
e10e841c9bf0 field pic decoding cleanup
michaelni
parents: 1126
diff changeset
1977 }
e10e841c9bf0 field pic decoding cleanup
michaelni
parents: 1126
diff changeset
1978 }
1381
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
1979 #ifdef HAVE_XVMC
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
1980 // MPV_frame_start will call this function too,
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
1981 // but we need to call it on every field
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
1982 if(s->avctx->xvmc_acceleration)
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
1983 XVMC_field_start(s,avctx);
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
1984 #endif
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
1985 }//fi(s->first_slice)
1096
5e6e505d8997 field picture decoding support (16x16 MC blocks only as i dont have any samples which use other modes ...)
michaelni
parents: 1092
diff changeset
1986 s->first_slice = 0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1987
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
1988 init_get_bits(&s->gb, *buf, buf_size*8);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1989
54
764f2eaf711e fixed mpeg2 qscale decoding
glantau
parents: 45
diff changeset
1990 s->qscale = get_qscale(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: 1164
diff changeset
1991 if(s->qscale == 0){
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
1992 fprintf(stderr, "qscale == 0\n");
1285
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
1993 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: 1164
diff changeset
1994 }
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: 1164
diff changeset
1995
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1996 /* extra slice info */
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1997 while (get_bits1(&s->gb) != 0) {
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
1998 skip_bits(&s->gb, 8);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1999 }
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: 1164
diff changeset
2000
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: 1164
diff changeset
2001 s->mb_x=0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2002
716
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2003 for(;;) {
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2004 int code = get_vlc2(&s->gb, mbincr_vlc.table, MBINCR_VLC_BITS, 2);
1177
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
2005 if (code < 0){
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
2006 fprintf(stderr, "first mb_incr damaged\n");
1285
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2007 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: 1164
diff changeset
2008 }
716
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2009 if (code >= 33) {
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2010 if (code == 33) {
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2011 s->mb_x += 33;
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2012 }
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2013 /* otherwise, stuffing, nothing to do */
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2014 } else {
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2015 s->mb_x += code;
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2016 break;
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2017 }
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2018 }
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
2019
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: 1164
diff changeset
2020 s->resync_mb_x= s->mb_x;
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: 1164
diff changeset
2021 s->resync_mb_y= s->mb_y = start_code;
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
2022 s->mb_skip_run= 0;
1389
da0b3a50d209 rate distortion mb decision support
michaelni
parents: 1381
diff changeset
2023 ff_init_block_index(s);
716
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2024
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2025 for(;;) {
853
eacc2dd8fd9d * using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents: 844
diff changeset
2026 s->dsp.clear_blocks(s->block[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: 1164
diff changeset
2027
12
4d50c7d89e0f use block[] in structure to have it aligned on 8 bytes for mmx optimizations
glantau
parents: 7
diff changeset
2028 ret = mpeg_decode_mb(s, s->block);
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: 1164
diff changeset
2029
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2030 dprintf("ret=%d\n", ret);
986e461dc072 Initial revision
glantau
parents:
diff changeset
2031 if (ret < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
2032 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: 1164
diff changeset
2033
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: 1164
diff changeset
2034 if(s->motion_val && s->pict_type != B_TYPE){ //note motion_val is normally NULL unless we want to extract the MVs
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: 1164
diff changeset
2035 const int wrap = s->block_wrap[0];
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
2036 const int xy = s->mb_x*2 + 1 + (s->mb_y*2 +1)*wrap;
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: 1164
diff changeset
2037 int motion_x, motion_y;
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: 1164
diff changeset
2038
1285
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2039 if (s->mb_intra) {
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2040 motion_x = motion_y = 0;
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2041 }else if (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: 1164
diff changeset
2042 motion_x = s->mv[0][0][0];
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
2043 motion_y = s->mv[0][0][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: 1164
diff changeset
2044 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
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: 1164
diff changeset
2045 motion_x = s->mv[0][0][0] + s->mv[0][1][0];
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
2046 motion_y = s->mv[0][0][1] + s->mv[0][1][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: 1164
diff changeset
2047 motion_x = (motion_x>>1) | (motion_x&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: 1164
diff changeset
2048 }
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: 1164
diff changeset
2049 s->motion_val[xy][0] = motion_x;
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: 1164
diff changeset
2050 s->motion_val[xy][1] = motion_y;
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: 1164
diff changeset
2051 s->motion_val[xy + 1][0] = motion_x;
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: 1164
diff changeset
2052 s->motion_val[xy + 1][1] = motion_y;
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: 1164
diff changeset
2053 s->motion_val[xy + wrap][0] = motion_x;
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: 1164
diff changeset
2054 s->motion_val[xy + wrap][1] = motion_y;
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: 1164
diff changeset
2055 s->motion_val[xy + 1 + wrap][0] = motion_x;
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: 1164
diff changeset
2056 s->motion_val[xy + 1 + wrap][1] = motion_y;
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: 1164
diff changeset
2057 }
1138
e10e841c9bf0 field pic decoding cleanup
michaelni
parents: 1126
diff changeset
2058
1389
da0b3a50d209 rate distortion mb decision support
michaelni
parents: 1381
diff changeset
2059 s->dest[0] += 16;
da0b3a50d209 rate distortion mb decision support
michaelni
parents: 1381
diff changeset
2060 s->dest[1] += 8;
da0b3a50d209 rate distortion mb decision support
michaelni
parents: 1381
diff changeset
2061 s->dest[2] += 8;
da0b3a50d209 rate distortion mb decision support
michaelni
parents: 1381
diff changeset
2062
716
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2063 MPV_decode_mb(s, s->block);
1389
da0b3a50d209 rate distortion mb decision support
michaelni
parents: 1381
diff changeset
2064
716
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2065 if (++s->mb_x >= s->mb_width) {
1380
b120aed7bf84 ati vcr2 uv swap
michaelni
parents: 1377
diff changeset
2066 if(s->avctx->codec_tag == ff_get_fourcc("VCR2"))
b120aed7bf84 ati vcr2 uv swap
michaelni
parents: 1377
diff changeset
2067 exchange_uv((AVFrame*)s->current_picture_ptr);
b120aed7bf84 ati vcr2 uv swap
michaelni
parents: 1377
diff changeset
2068
1370
45d761c387cd default for slices is display order again
michaelni
parents: 1368
diff changeset
2069 ff_draw_horiz_band(s, 16*s->mb_y, 16);
716
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2070
1380
b120aed7bf84 ati vcr2 uv swap
michaelni
parents: 1377
diff changeset
2071 if(s->avctx->codec_tag == ff_get_fourcc("VCR2"))
b120aed7bf84 ati vcr2 uv swap
michaelni
parents: 1377
diff changeset
2072 exchange_uv((AVFrame*)s->current_picture_ptr);
b120aed7bf84 ati vcr2 uv swap
michaelni
parents: 1377
diff changeset
2073
716
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2074 s->mb_x = 0;
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2075 s->mb_y++;
1289
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2076
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2077 if(s->mb_y<<field_pic >= s->mb_height){
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2078 int left= s->gb.size_in_bits - get_bits_count(&s->gb);
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2079
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2080 if(left < 0 || (left && show_bits(&s->gb, FFMIN(left, 23)))
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2081 || (avctx->error_resilience >= FF_ER_AGGRESSIVE && left>8)){
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2082 fprintf(stderr, "end missmatch left=%d\n", left);
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2083 return -1;
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2084 }else
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2085 goto eos;
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2086 }
1389
da0b3a50d209 rate distortion mb decision support
michaelni
parents: 1381
diff changeset
2087
da0b3a50d209 rate distortion mb decision support
michaelni
parents: 1381
diff changeset
2088 ff_init_block_index(s);
716
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2089 }
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2090
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2091 /* skip mb handling */
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
2092 if (s->mb_skip_run == -1) {
716
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2093 /* read again increment */
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
2094 s->mb_skip_run = 0;
716
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2095 for(;;) {
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2096 int code = get_vlc2(&s->gb, mbincr_vlc.table, MBINCR_VLC_BITS, 2);
1177
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1164
diff changeset
2097 if (code < 0){
1181
4c2339f3863a 100l (mpeg2 decoding fixed)
michaelni
parents: 1177
diff changeset
2098 fprintf(stderr, "mb incr damaged\n");
4c2339f3863a 100l (mpeg2 decoding fixed)
michaelni
parents: 1177
diff changeset
2099 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: 1164
diff changeset
2100 }
716
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2101 if (code >= 33) {
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2102 if (code == 33) {
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
2103 s->mb_skip_run += 33;
1181
4c2339f3863a 100l (mpeg2 decoding fixed)
michaelni
parents: 1177
diff changeset
2104 }else if(code == 35){
4c2339f3863a 100l (mpeg2 decoding fixed)
michaelni
parents: 1177
diff changeset
2105 if(s->mb_skip_run != 0 || show_bits(&s->gb, 15) != 0){
4c2339f3863a 100l (mpeg2 decoding fixed)
michaelni
parents: 1177
diff changeset
2106 fprintf(stderr, "slice missmatch\n");
4c2339f3863a 100l (mpeg2 decoding fixed)
michaelni
parents: 1177
diff changeset
2107 return -1;
4c2339f3863a 100l (mpeg2 decoding fixed)
michaelni
parents: 1177
diff changeset
2108 }
4c2339f3863a 100l (mpeg2 decoding fixed)
michaelni
parents: 1177
diff changeset
2109 goto eos; /* end of slice */
716
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2110 }
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2111 /* otherwise, stuffing, nothing to do */
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2112 } else {
1160
9a5c29575902 mpeg1 slice encoding support
michaelni
parents: 1150
diff changeset
2113 s->mb_skip_run += code;
716
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2114 break;
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2115 }
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2116 }
2ec5bd9f7116 sliced mode for mpeg1/2
michaelni
parents: 715
diff changeset
2117 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2118 }
1285
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2119 eos: // end of slice
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2120 *buf += get_bits_count(&s->gb)/8 - 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: 1164
diff changeset
2121 //printf("y %d %d %d %d\n", s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y);
1285
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2122 return 0;
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2123 }
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: 1164
diff changeset
2124
1285
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2125 /**
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2126 * handles slice ends.
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2127 * @return 1 if it seems to be the last slice of
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2128 */
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2129 static int slice_end(AVCodecContext *avctx, AVFrame *pict)
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2130 {
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2131 Mpeg1Context *s1 = avctx->priv_data;
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2132 MpegEncContext *s = &s1->mpeg_enc_ctx;
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2133
1402
f662e9c86cf2 * fixing a regression in mpeg encoder (not setting pix_fmt),
romansh
parents: 1389
diff changeset
2134 if (!s1->mpeg_enc_ctx_allocated || !s->current_picture_ptr)
1311
fc858abf6b10 fixed segfault if sequence header has not been found before slice decoding
bellard
parents: 1289
diff changeset
2135 return 0;
fc858abf6b10 fixed segfault if sequence header has not been found before slice decoding
bellard
parents: 1289
diff changeset
2136
1381
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2137 #ifdef HAVE_XVMC
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2138 if(s->avctx->xvmc_acceleration)
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2139 XVMC_field_end(s);
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2140 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2141 /* end of slice reached */
1285
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2142 if (/*s->mb_y<<field_pic == s->mb_height &&*/ !s->first_field) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2143 /* end of image */
903
22ee74da2cd3 cleanup
michaelni
parents: 890
diff changeset
2144
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
2145 if(s->codec_id == CODEC_ID_MPEG2VIDEO){
1196
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1182
diff changeset
2146 s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_MPEG2;
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1182
diff changeset
2147 }else
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1182
diff changeset
2148 s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_MPEG1;
2e06398e4647 mpeg2 qscale flag
michaelni
parents: 1182
diff changeset
2149
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: 1164
diff changeset
2150 ff_er_frame_end(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2151
986e461dc072 Initial revision
glantau
parents:
diff changeset
2152 MPV_frame_end(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
2153
924
3814e9115672 cleanup / messup?
michaelni
parents: 918
diff changeset
2154 if (s->pict_type == B_TYPE || s->low_delay) {
1328
michaelni
parents: 1326
diff changeset
2155 *pict= *(AVFrame*)s->current_picture_ptr;
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: 1164
diff changeset
2156 ff_print_debug_info(s, s->current_picture_ptr);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2157 } else {
903
22ee74da2cd3 cleanup
michaelni
parents: 890
diff changeset
2158 s->picture_number++;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2159 /* latency of 1 frame for I and P frames */
986e461dc072 Initial revision
glantau
parents:
diff changeset
2160 /* XXX: use another variable than picture_number */
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2161 if (s->last_picture_ptr != NULL) {
1328
michaelni
parents: 1326
diff changeset
2162 *pict= *(AVFrame*)s->last_picture_ptr;
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: 1164
diff changeset
2163 ff_print_debug_info(s, s->last_picture_ptr);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2164 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2165 }
1380
b120aed7bf84 ati vcr2 uv swap
michaelni
parents: 1377
diff changeset
2166 if(s->avctx->codec_tag == ff_get_fourcc("VCR2"))
b120aed7bf84 ati vcr2 uv swap
michaelni
parents: 1377
diff changeset
2167 exchange_uv(pict);
b120aed7bf84 ati vcr2 uv swap
michaelni
parents: 1377
diff changeset
2168
1285
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2169 return 1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2170 } else {
1285
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2171 return 0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2172 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2173 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2174
986e461dc072 Initial revision
glantau
parents:
diff changeset
2175 static int mpeg1_decode_sequence(AVCodecContext *avctx,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
2176 uint8_t *buf, int buf_size)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2177 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2178 Mpeg1Context *s1 = avctx->priv_data;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2179 MpegEncContext *s = &s1->mpeg_enc_ctx;
38
5bf15419d47e changed quant matrix order (should fix mmx mpeg decoding bug)
glantau
parents: 21
diff changeset
2180 int width, height, i, v, j;
917
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
2181 float aspect;
401
e20655449d4a mpeg1/2 identifier - fixed frame rate for some bad mpeg1 streams
glantau
parents: 391
diff changeset
2182
1025
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 1021
diff changeset
2183 init_get_bits(&s->gb, buf, buf_size*8);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2184
986e461dc072 Initial revision
glantau
parents:
diff changeset
2185 width = get_bits(&s->gb, 12);
986e461dc072 Initial revision
glantau
parents:
diff changeset
2186 height = get_bits(&s->gb, 12);
917
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
2187 s->aspect_ratio_info= get_bits(&s->gb, 4);
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
2188 if(s->codec_id == CODEC_ID_MPEG1VIDEO){
917
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
2189 aspect= mpeg1_aspect[s->aspect_ratio_info];
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
2190 if(aspect!=0.0) avctx->aspect_ratio= width/(aspect*height);
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
2191 }
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
2192
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2193 s->frame_rate_index = get_bits(&s->gb, 4);
986e461dc072 Initial revision
glantau
parents:
diff changeset
2194 if (s->frame_rate_index == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
2195 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2196 s->bit_rate = get_bits(&s->gb, 18) * 400;
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
2197 if (get_bits1(&s->gb) == 0) /* marker */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2198 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2199 if (width <= 0 || height <= 0 ||
986e461dc072 Initial revision
glantau
parents:
diff changeset
2200 (width % 2) != 0 || (height % 2) != 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
2201 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2202 if (width != s->width ||
986e461dc072 Initial revision
glantau
parents:
diff changeset
2203 height != s->height) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2204 /* start new mpeg1 context decoding */
986e461dc072 Initial revision
glantau
parents:
diff changeset
2205 s->out_format = FMT_MPEG1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2206 if (s1->mpeg_enc_ctx_allocated) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2207 MPV_common_end(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
2208 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2209 s->width = width;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2210 s->height = height;
924
3814e9115672 cleanup / messup?
michaelni
parents: 918
diff changeset
2211 avctx->has_b_frames= 1;
69
361631a8d140 copy avctx
glantau
parents: 64
diff changeset
2212 s->avctx = avctx;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2213 avctx->width = width;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2214 avctx->height = height;
1126
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
2215 av_reduce(
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
2216 &avctx->frame_rate,
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
2217 &avctx->frame_rate_base,
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
2218 frame_rate_tab[s->frame_rate_index],
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
2219 MPEG1_FRAME_RATE_BASE, //FIXME store in allready reduced form
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
2220 1<<30
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1106
diff changeset
2221 );
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2222 avctx->bit_rate = s->bit_rate;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2223
1381
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2224 //get_format() or set_video(width,height,aspect,pix_fmt);
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2225 //until then pix_fmt may be changed right after codec init
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2226 if( avctx->pix_fmt == PIX_FMT_XVMC_MPEG2_IDCT )
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2227 avctx->idct_algo = FF_IDCT_SIMPLE;
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2228
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2229 if (MPV_common_init(s) < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
2230 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2231 s1->mpeg_enc_ctx_allocated = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2232 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2233
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
2234 skip_bits(&s->gb, 10); /* vbv_buffer_size */
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
2235 skip_bits(&s->gb, 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2236
986e461dc072 Initial revision
glantau
parents:
diff changeset
2237 /* get matrix */
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
2238 if (get_bits1(&s->gb)) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2239 for(i=0;i<64;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2240 v = get_bits(&s->gb, 8);
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 694
diff changeset
2241 j = s->intra_scantable.permutated[i];
38
5bf15419d47e changed quant matrix order (should fix mmx mpeg decoding bug)
glantau
parents: 21
diff changeset
2242 s->intra_matrix[j] = v;
5bf15419d47e changed quant matrix order (should fix mmx mpeg decoding bug)
glantau
parents: 21
diff changeset
2243 s->chroma_intra_matrix[j] = v;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2244 }
59
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
2245 #ifdef DEBUG
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
2246 dprintf("intra matrix present\n");
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
2247 for(i=0;i<64;i++)
710
97377ab86647 forgot zigzag_direct[] behind #ifdef DEBUG (found by Klaas-Pieter Vlieg <vlieg at eurescom dot de>)
michaelni
parents: 706
diff changeset
2248 dprintf(" %d", s->intra_matrix[s->intra_scantable.permutated[i]]);
59
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
2249 printf("\n");
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
2250 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2251 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2252 for(i=0;i<64;i++) {
1092
f59c3f66363b MpegEncContext.(i)dct_* -> DspContext.(i)dct_*
michaelni
parents: 1085
diff changeset
2253 int j= s->dsp.idct_permutation[i];
533
3c07cf9595de adding ff prefix to avoid global name conficts with xvid (patch by Marko Kreen <marko at l-t.ee>)
michaelni
parents: 520
diff changeset
2254 v = ff_mpeg1_default_intra_matrix[i];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 694
diff changeset
2255 s->intra_matrix[j] = v;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 694
diff changeset
2256 s->chroma_intra_matrix[j] = v;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2257 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2258 }
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 18
diff changeset
2259 if (get_bits1(&s->gb)) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2260 for(i=0;i<64;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2261 v = get_bits(&s->gb, 8);
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 694
diff changeset
2262 j = s->intra_scantable.permutated[i];
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 313
diff changeset
2263 s->inter_matrix[j] = v;
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 313
diff changeset
2264 s->chroma_inter_matrix[j] = v;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2265 }
59
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
2266 #ifdef DEBUG
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
2267 dprintf("non intra matrix present\n");
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
2268 for(i=0;i<64;i++)
710
97377ab86647 forgot zigzag_direct[] behind #ifdef DEBUG (found by Klaas-Pieter Vlieg <vlieg at eurescom dot de>)
michaelni
parents: 706
diff changeset
2269 dprintf(" %d", s->inter_matrix[s->intra_scantable.permutated[i]]);
59
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
2270 printf("\n");
efd3c19f6d62 fixed mpeg2 non intra dequant - fixed MPEG1 and 2 matrix parsing
glantau
parents: 58
diff changeset
2271 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2272 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2273 for(i=0;i<64;i++) {
1092
f59c3f66363b MpegEncContext.(i)dct_* -> DspContext.(i)dct_*
michaelni
parents: 1085
diff changeset
2274 int j= s->dsp.idct_permutation[i];
533
3c07cf9595de adding ff prefix to avoid global name conficts with xvid (patch by Marko Kreen <marko at l-t.ee>)
michaelni
parents: 520
diff changeset
2275 v = ff_mpeg1_default_non_intra_matrix[i];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 694
diff changeset
2276 s->inter_matrix[j] = v;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 694
diff changeset
2277 s->chroma_inter_matrix[j] = v;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2278 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2279 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2280
986e461dc072 Initial revision
glantau
parents:
diff changeset
2281 /* we set mpeg2 parameters so that it emulates mpeg1 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
2282 s->progressive_sequence = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2283 s->progressive_frame = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2284 s->picture_structure = PICT_FRAME;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2285 s->frame_pred_frame_dct = 1;
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
2286 s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG1VIDEO;
401
e20655449d4a mpeg1/2 identifier - fixed frame rate for some bad mpeg1 streams
glantau
parents: 391
diff changeset
2287 avctx->sub_id = 1; /* indicates mpeg1 */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2288 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2289 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2290
1376
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2291 static int vcr2_init_sequence(AVCodecContext *avctx)
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2292 {
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2293 Mpeg1Context *s1 = avctx->priv_data;
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2294 MpegEncContext *s = &s1->mpeg_enc_ctx;
1377
326852ff8fee vcr2 cleanup
michaelni
parents: 1376
diff changeset
2295 int i, v;
1376
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2296
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2297 /* start new mpeg1 context decoding */
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2298 s->out_format = FMT_MPEG1;
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2299 if (s1->mpeg_enc_ctx_allocated) {
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2300 MPV_common_end(s);
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2301 }
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2302 s->width = avctx->width;
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2303 s->height = avctx->height;
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2304 avctx->has_b_frames= 0; //true?
1380
b120aed7bf84 ati vcr2 uv swap
michaelni
parents: 1377
diff changeset
2305 s->low_delay= 1;
1376
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2306 s->avctx = avctx;
1381
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2307
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2308 //get_format() or set_video(width,height,aspect,pix_fmt);
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2309 //until then pix_fmt may be changed right after codec init
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2310 if( avctx->pix_fmt == PIX_FMT_XVMC_MPEG2_IDCT )
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2311 avctx->idct_algo = FF_IDCT_SIMPLE;
1376
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2312
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2313 if (MPV_common_init(s) < 0)
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2314 return -1;
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2315 s1->mpeg_enc_ctx_allocated = 1;
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2316
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2317 for(i=0;i<64;i++) {
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2318 int j= s->dsp.idct_permutation[i];
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2319 v = ff_mpeg1_default_intra_matrix[i];
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2320 s->intra_matrix[j] = v;
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2321 s->chroma_intra_matrix[j] = v;
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2322
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2323 v = ff_mpeg1_default_non_intra_matrix[i];
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2324 s->inter_matrix[j] = v;
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2325 s->chroma_inter_matrix[j] = v;
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2326 }
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2327
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2328 s->progressive_sequence = 1;
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2329 s->progressive_frame = 1;
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2330 s->picture_structure = PICT_FRAME;
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2331 s->frame_pred_frame_dct = 1;
1421
340c90faa1dc mpeg2 encoding
michaelni
parents: 1411
diff changeset
2332 s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG2VIDEO;
1377
326852ff8fee vcr2 cleanup
michaelni
parents: 1376
diff changeset
2333 avctx->sub_id = 2; /* indicates mpeg2 */
1376
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2334 return 0;
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2335 }
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2336
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2337
1084
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2338 static void mpeg_decode_user_data(AVCodecContext *avctx,
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2339 const uint8_t *buf, int buf_size)
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2340 {
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2341 const uint8_t *p;
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2342 int len, flags;
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2343 p = buf;
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2344 len = buf_size;
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2345
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2346 /* we parse the DTG active format information */
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2347 if (len >= 5 &&
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2348 p[0] == 'D' && p[1] == 'T' && p[2] == 'G' && p[3] == '1') {
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2349 flags = p[4];
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2350 p += 5;
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2351 len -= 5;
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2352 if (flags & 0x80) {
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2353 /* skip event id */
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2354 if (len < 2)
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2355 return;
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2356 p += 2;
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2357 len -= 2;
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2358 }
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2359 if (flags & 0x40) {
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2360 if (len < 1)
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2361 return;
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2362 avctx->dtg_active_format = p[0] & 0x0f;
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2363 }
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2364 }
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2365 }
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2366
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2367 /**
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2368 * finds the end of the current frame in the bitstream.
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2369 * @return the position of the first byte of the next frame, or -1
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2370 */
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2371 static int mpeg1_find_frame_end(MpegEncContext *s, uint8_t *buf, int buf_size){
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2372 ParseContext *pc= &s->parse_context;
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2373 int i;
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2374 uint32_t state;
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2375
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2376 state= pc->state;
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2377
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2378 i=0;
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2379 if(!pc->frame_start_found){
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2380 for(i=0; i<buf_size; i++){
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2381 state= (state<<8) | buf[i];
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2382 if(state >= SLICE_MIN_START_CODE && state <= SLICE_MAX_START_CODE){
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2383 i++;
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2384 pc->frame_start_found=1;
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2385 break;
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2386 }
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2387 }
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2388 }
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2389
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2390 if(pc->frame_start_found){
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2391 for(; i<buf_size; i++){
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2392 state= (state<<8) | buf[i];
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2393 if((state&0xFFFFFF00) == 0x100){
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2394 if(state < SLICE_MIN_START_CODE || state > SLICE_MAX_START_CODE){
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2395 pc->frame_start_found=0;
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2396 pc->state=-1;
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2397 return i-3;
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2398 }
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2399 }
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2400 }
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2401 }
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2402 pc->state= state;
1218
358bbc952e27 10l (returning negative number of consumed bytes if the first startcode of a frame was split between 2 buffers)
michaelni
parents: 1211
diff changeset
2403 return END_NOT_FOUND;
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2404 }
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2405
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2406 /* handle buffering and image synchronisation */
986e461dc072 Initial revision
glantau
parents:
diff changeset
2407 static int mpeg_decode_frame(AVCodecContext *avctx,
986e461dc072 Initial revision
glantau
parents:
diff changeset
2408 void *data, int *data_size,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1051
diff changeset
2409 uint8_t *buf, int buf_size)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2410 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2411 Mpeg1Context *s = avctx->priv_data;
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2412 uint8_t *buf_end, *buf_ptr;
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2413 int ret, start_code, input_size;
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 924
diff changeset
2414 AVFrame *picture = data;
267
e10840e4f773 - Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents: 241
diff changeset
2415 MpegEncContext *s2 = &s->mpeg_enc_ctx;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2416 dprintf("fill_buffer\n");
986e461dc072 Initial revision
glantau
parents:
diff changeset
2417
986e461dc072 Initial revision
glantau
parents:
diff changeset
2418 *data_size = 0;
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 313
diff changeset
2419
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2420 /* special case for last picture */
1372
b52e62d17bbb last frame decoding fix
michaelni
parents: 1370
diff changeset
2421 if (buf_size == 0 && s2->low_delay==0 && s2->next_picture_ptr) {
b52e62d17bbb last frame decoding fix
michaelni
parents: 1370
diff changeset
2422 *picture= *(AVFrame*)s2->next_picture_ptr;
b52e62d17bbb last frame decoding fix
michaelni
parents: 1370
diff changeset
2423 s2->next_picture_ptr= NULL;
903
22ee74da2cd3 cleanup
michaelni
parents: 890
diff changeset
2424
1372
b52e62d17bbb last frame decoding fix
michaelni
parents: 1370
diff changeset
2425 *data_size = sizeof(AVFrame);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2426 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2427 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2428
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2429 if(s2->flags&CODEC_FLAG_TRUNCATED){
1218
358bbc952e27 10l (returning negative number of consumed bytes if the first startcode of a frame was split between 2 buffers)
michaelni
parents: 1211
diff changeset
2430 int next= mpeg1_find_frame_end(s2, buf, buf_size);
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2431
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2432 if( ff_combine_frame(s2, next, &buf, &buf_size) < 0 )
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2433 return buf_size;
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2434 }
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2435
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2436 buf_ptr = buf;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2437 buf_end = buf + buf_size;
383
e6b64bc3bc87 - repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents: 377
diff changeset
2438
e6b64bc3bc87 - repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents: 377
diff changeset
2439 #if 0
e6b64bc3bc87 - repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents: 377
diff changeset
2440 if (s->repeat_field % 2 == 1) {
267
e10840e4f773 - Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents: 241
diff changeset
2441 s->repeat_field++;
e10840e4f773 - Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents: 241
diff changeset
2442 //fprintf(stderr,"\nRepeating last frame: %d -> %d! pict: %d %d", avctx->frame_number-1, avctx->frame_number,
383
e6b64bc3bc87 - repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents: 377
diff changeset
2443 // s2->picture_number, s->repeat_field);
e6b64bc3bc87 - repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents: 377
diff changeset
2444 if (avctx->flags & CODEC_FLAG_REPEAT_FIELD) {
e6b64bc3bc87 - repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents: 377
diff changeset
2445 *data_size = sizeof(AVPicture);
e6b64bc3bc87 - repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents: 377
diff changeset
2446 goto the_end;
e6b64bc3bc87 - repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents: 377
diff changeset
2447 }
267
e10840e4f773 - Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents: 241
diff changeset
2448 }
383
e6b64bc3bc87 - repeat_pict meaning changed, now it signals the extra delay for the
pulento
parents: 377
diff changeset
2449 #endif
1376
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2450
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2451 if(s->mpeg_enc_ctx_allocated==0 && avctx->codec_tag == ff_get_fourcc("VCR2"))
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2452 vcr2_init_sequence(avctx);
5d2435fb733d ATI VCR2 decoding support
michaelni
parents: 1372
diff changeset
2453
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2454 for(;;) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2455 /* find start next code */
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2456 start_code = find_start_code(&buf_ptr, buf_end);
1220
michaelni
parents: 1218
diff changeset
2457 if (start_code < 0){
1484
a2930ee10a6b hurry_up fix?
michaelni
parents: 1479
diff changeset
2458 if(s2->pict_type != B_TYPE || avctx->hurry_up==0){
a2930ee10a6b hurry_up fix?
michaelni
parents: 1479
diff changeset
2459 if (slice_end(avctx, picture)) {
a2930ee10a6b hurry_up fix?
michaelni
parents: 1479
diff changeset
2460 if(s2->last_picture_ptr) //FIXME merge with the stuff in mpeg_decode_slice
a2930ee10a6b hurry_up fix?
michaelni
parents: 1479
diff changeset
2461 *data_size = sizeof(AVPicture);
a2930ee10a6b hurry_up fix?
michaelni
parents: 1479
diff changeset
2462 }
1285
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2463 }
1220
michaelni
parents: 1218
diff changeset
2464 return FFMAX(0, buf_ptr - buf - s2->parse_context.last_index);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2465 }
1289
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2466
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2467 input_size = buf_end - buf_ptr;
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2468
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2469 if(avctx->debug & FF_DEBUG_STARTCODE){
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2470 printf("%3X at %d left %d\n", start_code, buf_ptr-buf, input_size);
57172377849a fix mpeg1/2 decoding if there are no 0 bytes after the bitstream
michaelni
parents: 1285
diff changeset
2471 }
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2472
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2473 /* prepare data for next start code */
986e461dc072 Initial revision
glantau
parents:
diff changeset
2474 switch(start_code) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2475 case SEQ_START_CODE:
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2476 mpeg1_decode_sequence(avctx, buf_ptr,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2477 input_size);
986e461dc072 Initial revision
glantau
parents:
diff changeset
2478 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2479
986e461dc072 Initial revision
glantau
parents:
diff changeset
2480 case PICTURE_START_CODE:
986e461dc072 Initial revision
glantau
parents:
diff changeset
2481 /* we have a complete image : we try to decompress it */
986e461dc072 Initial revision
glantau
parents:
diff changeset
2482 mpeg1_decode_picture(avctx,
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2483 buf_ptr, input_size);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2484 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2485 case EXT_START_CODE:
986e461dc072 Initial revision
glantau
parents:
diff changeset
2486 mpeg_decode_extension(avctx,
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2487 buf_ptr, input_size);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2488 break;
1084
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2489 case USER_START_CODE:
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2490 mpeg_decode_user_data(avctx,
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2491 buf_ptr, input_size);
1084
01154fced380 added DTG active format information
bellard
parents: 1070
diff changeset
2492 break;
1348
8f613147c6cb mpeg 2 seeking fix
michaelni
parents: 1346
diff changeset
2493 case GOP_START_CODE:
8f613147c6cb mpeg 2 seeking fix
michaelni
parents: 1346
diff changeset
2494 s2->first_field=0;
8f613147c6cb mpeg 2 seeking fix
michaelni
parents: 1346
diff changeset
2495 break;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2496 default:
986e461dc072 Initial revision
glantau
parents:
diff changeset
2497 if (start_code >= SLICE_MIN_START_CODE &&
911
4b2c86f1fee9 drop b frames if there are no reference frames
michaelni
parents: 903
diff changeset
2498 start_code <= SLICE_MAX_START_CODE) {
917
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
2499
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
2500 /* skip b frames if we dont have reference frames */
1138
e10e841c9bf0 field pic decoding cleanup
michaelni
parents: 1126
diff changeset
2501 if(s2->last_picture_ptr==NULL && s2->pict_type==B_TYPE) break;
917
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
2502 /* skip b frames if we are in a hurry */
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
2503 if(avctx->hurry_up && s2->pict_type==B_TYPE) break;
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
2504 /* skip everything if we are in a hurry>=5 */
d3aa313dc373 mpeg1&2 aspect decoding
michaelni
parents: 911
diff changeset
2505 if(avctx->hurry_up>=5) break;
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2506
1182
38e8b8f331cb some checks to avoid segfaults if the decoder is feeded with junk
michaelni
parents: 1181
diff changeset
2507 if (!s->mpeg_enc_ctx_allocated) break;
38e8b8f331cb some checks to avoid segfaults if the decoder is feeded with junk
michaelni
parents: 1181
diff changeset
2508
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2509 ret = mpeg_decode_slice(avctx, picture,
1211
126f766bc4c5 cleanup mpeg1/2 bitstream parser
michaelni
parents: 1196
diff changeset
2510 start_code, &buf_ptr, input_size);
1285
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2511 emms_c();
1096
5e6e505d8997 field picture decoding support (16x16 MC blocks only as i dont have any samples which use other modes ...)
michaelni
parents: 1092
diff changeset
2512
1285
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2513 if(ret < 0){
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2514 if(s2->resync_mb_x>=0 && s2->resync_mb_y>=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: 1164
diff changeset
2515 ff_er_add_slice(s2, s2->resync_mb_x, s2->resync_mb_y, s2->mb_x, s2->mb_y, AC_ERROR|DC_ERROR|MV_ERROR);
1285
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2516 if(ret==DECODE_SLICE_FATAL_ERROR) return -1;
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2517 }else{
6e039762d5cb motion vector vissualization for mpeg1/2
michaelni
parents: 1273
diff changeset
2518 ff_er_add_slice(s2, s2->resync_mb_x, s2->resync_mb_y, s2->mb_x-1, s2->mb_y, AC_END|DC_END|MV_END);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2519 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2520 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2521 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2522 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2523 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2524 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2525
986e461dc072 Initial revision
glantau
parents:
diff changeset
2526 static int mpeg_decode_end(AVCodecContext *avctx)
986e461dc072 Initial revision
glantau
parents:
diff changeset
2527 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2528 Mpeg1Context *s = avctx->priv_data;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2529
986e461dc072 Initial revision
glantau
parents:
diff changeset
2530 if (s->mpeg_enc_ctx_allocated)
986e461dc072 Initial revision
glantau
parents:
diff changeset
2531 MPV_common_end(&s->mpeg_enc_ctx);
986e461dc072 Initial revision
glantau
parents:
diff changeset
2532 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2533 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2534
1423
2e590fee59bd mpeg2 regression test
michaelni
parents: 1421
diff changeset
2535 AVCodec mpeg1video_decoder = {
2e590fee59bd mpeg2 regression test
michaelni
parents: 1421
diff changeset
2536 "mpeg1video",
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2537 CODEC_TYPE_VIDEO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
2538 CODEC_ID_MPEG1VIDEO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
2539 sizeof(Mpeg1Context),
986e461dc072 Initial revision
glantau
parents:
diff changeset
2540 mpeg_decode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
2541 NULL,
986e461dc072 Initial revision
glantau
parents:
diff changeset
2542 mpeg_decode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
2543 mpeg_decode_frame,
842
e460775adb38 cleanup (breaks compatibility, requested by fabrice)
michaelni
parents: 826
diff changeset
2544 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
1368
0fd38b711f06 AVCodec.flush()
michaelni
parents: 1348
diff changeset
2545 .flush= ff_mpeg_flush,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2546 };
1381
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2547
1423
2e590fee59bd mpeg2 regression test
michaelni
parents: 1421
diff changeset
2548 AVCodec mpeg2video_decoder = {
2e590fee59bd mpeg2 regression test
michaelni
parents: 1421
diff changeset
2549 "mpeg2video",
2e590fee59bd mpeg2 regression test
michaelni
parents: 1421
diff changeset
2550 CODEC_TYPE_VIDEO,
2e590fee59bd mpeg2 regression test
michaelni
parents: 1421
diff changeset
2551 CODEC_ID_MPEG2VIDEO,
2e590fee59bd mpeg2 regression test
michaelni
parents: 1421
diff changeset
2552 sizeof(Mpeg1Context),
2e590fee59bd mpeg2 regression test
michaelni
parents: 1421
diff changeset
2553 mpeg_decode_init,
2e590fee59bd mpeg2 regression test
michaelni
parents: 1421
diff changeset
2554 NULL,
2e590fee59bd mpeg2 regression test
michaelni
parents: 1421
diff changeset
2555 mpeg_decode_end,
2e590fee59bd mpeg2 regression test
michaelni
parents: 1421
diff changeset
2556 mpeg_decode_frame,
2e590fee59bd mpeg2 regression test
michaelni
parents: 1421
diff changeset
2557 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
2e590fee59bd mpeg2 regression test
michaelni
parents: 1421
diff changeset
2558 .flush= ff_mpeg_flush,
2e590fee59bd mpeg2 regression test
michaelni
parents: 1421
diff changeset
2559 };
2e590fee59bd mpeg2 regression test
michaelni
parents: 1421
diff changeset
2560
1381
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2561 #ifdef HAVE_XVMC
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2562 static int mpeg_mc_decode_init(AVCodecContext *avctx){
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2563 Mpeg1Context *s;
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2564
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2565 if( !(avctx->slice_flags & SLICE_FLAG_CODED_ORDER) )
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2566 return -1;
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2567 if( !(avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD) )
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2568 dprintf("mpeg12.c: XvMC decoder will work better if SLICE_FLAG_ALLOW_FIELD is set\n");
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2569
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2570 mpeg_decode_init(avctx);
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2571 s = avctx->priv_data;
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2572
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2573 avctx->pix_fmt = PIX_FMT_XVMC_MPEG2_IDCT;
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2574 avctx->xvmc_acceleration = 1;
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2575
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2576 return 0;
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2577 }
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2578
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2579 AVCodec mpeg_xvmc_decoder = {
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2580 "mpegvideo_xvmc",
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2581 CODEC_TYPE_VIDEO,
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2582 CODEC_ID_MPEG2VIDEO_XVMC,
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2583 sizeof(Mpeg1Context),
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2584 mpeg_mc_decode_init,
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2585 NULL,
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2586 mpeg_decode_end,
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2587 mpeg_decode_frame,
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2588 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2589 };
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2590
f07e17427140 initial XvMC support
iive
parents: 1380
diff changeset
2591 #endif
1410
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents: 1409
diff changeset
2592
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents: 1409
diff changeset
2593 /* this is ugly i know, but the alternative is too make
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents: 1409
diff changeset
2594 hundreds of vars global and prefix them with ff_mpeg1_
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents: 1409
diff changeset
2595 which is far uglier. */
524c904a66b8 PSX MDEC decoder, based upon some code from Sebastian Jedruszkiewicz <elf at frogger dot rules dot pl>
michaelni
parents: 1409
diff changeset
2596 #include "mdec.c"