annotate mpegvideo.c @ 706:e65798d228ea libavcodec

idct permutation cleanup, idct can be selected per context now fixing some threadunsafe code
author michaelni
date Sun, 29 Sep 2002 22:44:22 +0000
parents 9b35329086c7
children afeff6ccb7f5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1 /*
986e461dc072 Initial revision
glantau
parents:
diff changeset
2 * The simplest mpeg encoder (well, it was the simplest!)
429
718a22dc121f license/copyright change
glantau
parents: 396
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: 396
diff changeset
5 * This library is free software; you can redistribute it and/or
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
7 * License as published by the Free Software Foundation; either
718a22dc121f license/copyright change
glantau
parents: 396
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: 396
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: 396
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
718a22dc121f license/copyright change
glantau
parents: 396
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: 396
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
16 * License along with this library; if not, write to the Free Software
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
295
6622b0fd036c mpeg4 4MV encoding
michaelni
parents: 294
diff changeset
18 *
325
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
19 * 4MV & hq & b-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
20 */
701
85b071dfc7e3 ff_get_fourcc() & XVIX support
michaelni
parents: 697
diff changeset
21
85b071dfc7e3 ff_get_fourcc() & XVIX support
michaelni
parents: 697
diff changeset
22 #include <ctype.h>
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
23 #include "avcodec.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
24 #include "dsputil.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
25 #include "mpegvideo.h"
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
26 #include "simple_idct.h"
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
27
17
b69fe46fd708 Adding fastmemcpy stuff to speedup mplayer project
nickols_k
parents: 13
diff changeset
28 #ifdef USE_FASTMEMCPY
b69fe46fd708 Adding fastmemcpy stuff to speedup mplayer project
nickols_k
parents: 13
diff changeset
29 #include "fastmemcpy.h"
b69fe46fd708 Adding fastmemcpy stuff to speedup mplayer project
nickols_k
parents: 13
diff changeset
30 #endif
b69fe46fd708 Adding fastmemcpy stuff to speedup mplayer project
nickols_k
parents: 13
diff changeset
31
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
32 //#undef NDEBUG
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
33 //#include <assert.h>
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
34
13
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
35 static void encode_picture(MpegEncContext *s, int picture_number);
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
36 static void dct_unquantize_mpeg1_c(MpegEncContext *s,
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
37 DCTELEM *block, int n, int qscale);
325
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
38 static void dct_unquantize_mpeg2_c(MpegEncContext *s,
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
39 DCTELEM *block, int n, int qscale);
13
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
40 static void dct_unquantize_h263_c(MpegEncContext *s,
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
41 DCTELEM *block, int n, int qscale);
206
994aa8623443 (commit by michael)
arpi_esp
parents: 200
diff changeset
42 static void draw_edges_c(UINT8 *buf, int wrap, int width, int height, int w);
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
43 static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
206
994aa8623443 (commit by michael)
arpi_esp
parents: 200
diff changeset
44
994aa8623443 (commit by michael)
arpi_esp
parents: 200
diff changeset
45 void (*draw_edges)(UINT8 *buf, int wrap, int width, int height, int w)= draw_edges_c;
566
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
46 static void emulated_edge_mc(MpegEncContext *s, UINT8 *src, int linesize, int block_w, int block_h,
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
47 int src_x, int src_y, int w, int h);
206
994aa8623443 (commit by michael)
arpi_esp
parents: 200
diff changeset
48
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
49 #define EDGE_WIDTH 16
986e461dc072 Initial revision
glantau
parents:
diff changeset
50
986e461dc072 Initial revision
glantau
parents:
diff changeset
51 /* enable all paranoid tests for rounding, overflows, etc... */
986e461dc072 Initial revision
glantau
parents:
diff changeset
52 //#define PARANOID
986e461dc072 Initial revision
glantau
parents:
diff changeset
53
986e461dc072 Initial revision
glantau
parents:
diff changeset
54 //#define DEBUG
986e461dc072 Initial revision
glantau
parents:
diff changeset
55
321
2b00e171b1d4 - ME method compatibility with legacy apps.
pulento
parents: 320
diff changeset
56
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
57 /* for jpeg fast DCT */
986e461dc072 Initial revision
glantau
parents:
diff changeset
58 #define CONST_BITS 14
986e461dc072 Initial revision
glantau
parents:
diff changeset
59
986e461dc072 Initial revision
glantau
parents:
diff changeset
60 static const unsigned short aanscales[64] = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
61 /* precomputed values scaled up by 14 bits */
986e461dc072 Initial revision
glantau
parents:
diff changeset
62 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
986e461dc072 Initial revision
glantau
parents:
diff changeset
63 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
986e461dc072 Initial revision
glantau
parents:
diff changeset
64 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
986e461dc072 Initial revision
glantau
parents:
diff changeset
65 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
986e461dc072 Initial revision
glantau
parents:
diff changeset
66 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
986e461dc072 Initial revision
glantau
parents:
diff changeset
67 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
986e461dc072 Initial revision
glantau
parents:
diff changeset
68 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
986e461dc072 Initial revision
glantau
parents:
diff changeset
69 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
986e461dc072 Initial revision
glantau
parents:
diff changeset
70 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
71
986e461dc072 Initial revision
glantau
parents:
diff changeset
72 static UINT8 h263_chroma_roundtab[16] = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
73 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
986e461dc072 Initial revision
glantau
parents:
diff changeset
74 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
75
292
73a9ce3d9715 fcode_tables where too small, found by Klaas-Pieter Vlieg <vlieg@eurescom.de>
michaelni
parents: 288
diff changeset
76 static UINT16 default_mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
277
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
77 static UINT8 default_fcode_tab[MAX_MV*2+1];
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
78
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
79 /* default motion estimation */
321
2b00e171b1d4 - ME method compatibility with legacy apps.
pulento
parents: 320
diff changeset
80 int motion_estimation_method = ME_EPZS;
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
81
625
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
82 static void convert_matrix(MpegEncContext *s, int (*qmat)[64], uint16_t (*qmat16)[64], uint16_t (*qmat16_bias)[64],
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
83 const UINT16 *quant_matrix, int bias)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
84 {
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
85 int qscale;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
86
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
87 for(qscale=1; qscale<32; qscale++){
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
88 int i;
625
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
89 if (s->fdct == ff_jpeg_fdct_islow) {
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
90 for(i=0;i<64;i++) {
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
91 const int j= s->idct_permutation[i];
625
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
92 /* 16 <= qscale * quant_matrix[i] <= 7905 */
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
93 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
94 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
95 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
96
635
3e0f62e5eed6 dct cleanup
michaelni
parents: 628
diff changeset
97 qmat[qscale][j] = (int)((UINT64_C(1) << QMAT_SHIFT) /
625
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
98 (qscale * quant_matrix[j]));
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
99 }
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
100 } else if (s->fdct == fdct_ifast) {
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
101 for(i=0;i<64;i++) {
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
102 const int j= s->idct_permutation[i];
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
103 /* 16 <= qscale * quant_matrix[i] <= 7905 */
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
104 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
105 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
106 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
107
635
3e0f62e5eed6 dct cleanup
michaelni
parents: 628
diff changeset
108 qmat[qscale][j] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) /
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
109 (aanscales[i] * qscale * quant_matrix[j]));
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
110 }
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
111 } else {
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
112 for(i=0;i<64;i++) {
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
113 const int j= s->idct_permutation[i];
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
114 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
115 So 16 <= qscale * quant_matrix[i] <= 7905
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
116 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
117 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
118 */
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
119 qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]);
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
120 qmat16[qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]);
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
121
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
122 if(qmat16[qscale][i]==0 || qmat16[qscale][i]==128*256) qmat16[qscale][i]=128*256-1;
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
123 qmat16_bias[qscale][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][i]);
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
124 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
125 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
126 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
127 }
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
128 // move into common.c perhaps
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
129 #define CHECKED_ALLOCZ(p, size)\
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
130 {\
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
131 p= av_mallocz(size);\
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
132 if(p==NULL){\
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
133 perror("malloc");\
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
134 goto fail;\
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
135 }\
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
136 }
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
137 /*
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
138 static void build_end(void)
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
139 {
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
140 int lastIndex;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
141 int lastIndexAfterPerm=0;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
142 for(lastIndex=0; lastIndex<64; lastIndex++)
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
143 {
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
144 if(ff_zigzag_direct[lastIndex] > lastIndexAfterPerm)
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
145 lastIndexAfterPerm= ff_zigzag_direct[lastIndex];
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
146 zigzag_end[lastIndex]= lastIndexAfterPerm + 1;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
147 }
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
148 }
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
149 */
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
150 void ff_init_scantable(MpegEncContext *s, ScanTable *st, const UINT8 *src_scantable){
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
151 int i;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
152 int end;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
153
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
154 for(i=0; i<64; i++){
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
155 int j;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
156 j = src_scantable[i];
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
157 st->permutated[i] = s->idct_permutation[j];
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
158 }
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
159
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
160 end=-1;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
161 for(i=0; i<64; i++){
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
162 int j;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
163 j = st->permutated[i];
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
164 if(j>end) end=j;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
165 st->raster_end[i]= end;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
166 }
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
167 }
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
168
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
169 /* XXX: those functions should be suppressed ASAP when all IDCTs are
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
170 converted */
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
171 static void ff_jref_idct_put(UINT8 *dest, int line_size, DCTELEM *block)
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
172 {
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
173 j_rev_dct (block);
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
174 put_pixels_clamped(block, dest, line_size);
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
175 }
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
176 static void ff_jref_idct_add(UINT8 *dest, int line_size, DCTELEM *block)
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
177 {
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
178 j_rev_dct (block);
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
179 add_pixels_clamped(block, dest, line_size);
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
180 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
181
986e461dc072 Initial revision
glantau
parents:
diff changeset
182 /* init common structure for both encoder and decoder */
986e461dc072 Initial revision
glantau
parents:
diff changeset
183 int MPV_common_init(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
184 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
185 int c_size, i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
186 UINT8 *pict;
986e461dc072 Initial revision
glantau
parents:
diff changeset
187
312
8cf5507e6ca5 mpeg4 mpeg quantizer support
michaelni
parents: 311
diff changeset
188 s->dct_unquantize_h263 = dct_unquantize_h263_c;
325
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
189 s->dct_unquantize_mpeg1 = dct_unquantize_mpeg1_c;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
190 s->dct_unquantize_mpeg2 = dct_unquantize_mpeg2_c;
625
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
191 s->dct_quantize= dct_quantize_c;
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
192
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
193 if(s->avctx->dct_algo==FF_DCT_FASTINT)
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
194 s->fdct = fdct_ifast;
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
195 else
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
196 s->fdct = ff_jpeg_fdct_islow; //slow/accurate/default
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
197
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
198 if(s->avctx->idct_algo==FF_IDCT_INT){
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
199 s->idct_put= ff_jref_idct_put;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
200 s->idct_add= ff_jref_idct_add;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
201 for(i=0; i<64; i++)
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
202 s->idct_permutation[i]= (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2);
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
203 }else{ //accurate/default
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
204 s->idct_put= simple_idct_put;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
205 s->idct_add= simple_idct_add;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
206 for(i=0; i<64; i++)
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
207 s->idct_permutation[i]= i;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
208 }
13
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
209
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
210 #ifdef HAVE_MMX
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
211 MPV_common_init_mmx(s);
8
1b4461b5a7fb Sync with mplayer's stuff
nickols_k
parents: 7
diff changeset
212 #endif
514
c9f724e3a797 Update and activate dct_unquantize_h263_mvi. Thanks to M«©ns Rullg«©rd
mellum
parents: 506
diff changeset
213 #ifdef ARCH_ALPHA
c9f724e3a797 Update and activate dct_unquantize_h263_mvi. Thanks to M«©ns Rullg«©rd
mellum
parents: 506
diff changeset
214 MPV_common_init_axp(s);
c9f724e3a797 Update and activate dct_unquantize_h263_mvi. Thanks to M«©ns Rullg«©rd
mellum
parents: 506
diff changeset
215 #endif
628
f596db4aa871 sun solaris compilation bugfix, patch by (Martin Olschewski <olschewski at zpr dot uni-koeln dot de>)
michaelni
parents: 625
diff changeset
216 #ifdef HAVE_MLIB
f596db4aa871 sun solaris compilation bugfix, patch by (Martin Olschewski <olschewski at zpr dot uni-koeln dot de>)
michaelni
parents: 625
diff changeset
217 MPV_common_init_mlib(s);
f596db4aa871 sun solaris compilation bugfix, patch by (Martin Olschewski <olschewski at zpr dot uni-koeln dot de>)
michaelni
parents: 625
diff changeset
218 #endif
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
219
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
220
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
221 /* load & permutate scantables
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
222 note: only wmv uses differnt ones
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
223 */
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
224 ff_init_scantable(s, &s->inter_scantable , ff_zigzag_direct);
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
225 ff_init_scantable(s, &s->intra_scantable , ff_zigzag_direct);
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
226 ff_init_scantable(s, &s->intra_h_scantable, ff_alternate_horizontal_scan);
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
227 ff_init_scantable(s, &s->intra_v_scantable, ff_alternate_vertical_scan);
591
d3f374218030 fixing mpeg4 mpeg quantizers
michaelni
parents: 588
diff changeset
228
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
229 s->mb_width = (s->width + 15) / 16;
986e461dc072 Initial revision
glantau
parents:
diff changeset
230 s->mb_height = (s->height + 15) / 16;
582
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
231
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
232 /* set default edge pos, will be overriden in decode_header if needed */
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
233 s->h_edge_pos= s->mb_width*16;
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
234 s->v_edge_pos= s->mb_height*16;
701
85b071dfc7e3 ff_get_fourcc() & XVIX support
michaelni
parents: 697
diff changeset
235
85b071dfc7e3 ff_get_fourcc() & XVIX support
michaelni
parents: 697
diff changeset
236 /* convert fourcc to upper case */
85b071dfc7e3 ff_get_fourcc() & XVIX support
michaelni
parents: 697
diff changeset
237 s->avctx->fourcc= toupper( s->avctx->fourcc &0xFF)
85b071dfc7e3 ff_get_fourcc() & XVIX support
michaelni
parents: 697
diff changeset
238 + (toupper((s->avctx->fourcc>>8 )&0xFF)<<8 )
85b071dfc7e3 ff_get_fourcc() & XVIX support
michaelni
parents: 697
diff changeset
239 + (toupper((s->avctx->fourcc>>16)&0xFF)<<16)
85b071dfc7e3 ff_get_fourcc() & XVIX support
michaelni
parents: 697
diff changeset
240 + (toupper((s->avctx->fourcc>>24)&0xFF)<<24);
582
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
241
233
3f5b72726118 - More work on preliminary bit rate control, just to be able to get an
pulento
parents: 232
diff changeset
242 s->mb_num = s->mb_width * s->mb_height;
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
243 if(!(s->flags&CODEC_FLAG_DR1)){
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
244 s->linesize = s->mb_width * 16 + 2 * EDGE_WIDTH;
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
245 s->uvlinesize = s->mb_width * 8 + EDGE_WIDTH;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
246
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
247 for(i=0;i<3;i++) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
248 int w, h, shift, pict_start;
986e461dc072 Initial revision
glantau
parents:
diff changeset
249
986e461dc072 Initial revision
glantau
parents:
diff changeset
250 w = s->linesize;
986e461dc072 Initial revision
glantau
parents:
diff changeset
251 h = s->mb_height * 16 + 2 * EDGE_WIDTH;
986e461dc072 Initial revision
glantau
parents:
diff changeset
252 shift = (i == 0) ? 0 : 1;
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
253 c_size = (s->linesize>>shift) * (h >> shift);
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
254 pict_start = (s->linesize>>shift) * (EDGE_WIDTH >> shift) + (EDGE_WIDTH >> shift);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
255
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
256 CHECKED_ALLOCZ(pict, c_size)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
257 s->last_picture_base[i] = pict;
986e461dc072 Initial revision
glantau
parents:
diff changeset
258 s->last_picture[i] = pict + pict_start;
485
20108840b0e5 grayscale only decoding
michaelni
parents: 481
diff changeset
259 if(i>0) memset(s->last_picture_base[i], 128, c_size);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
260
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
261 CHECKED_ALLOCZ(pict, c_size)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
262 s->next_picture_base[i] = pict;
986e461dc072 Initial revision
glantau
parents:
diff changeset
263 s->next_picture[i] = pict + pict_start;
485
20108840b0e5 grayscale only decoding
michaelni
parents: 481
diff changeset
264 if(i>0) memset(s->next_picture_base[i], 128, c_size);
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
265
365
fdeec2834c79 there are divx5? encoded files without a userdata section but with b-frames :(
michaelni
parents: 350
diff changeset
266 if (s->has_b_frames || s->codec_id==CODEC_ID_MPEG4) {
fdeec2834c79 there are divx5? encoded files without a userdata section but with b-frames :(
michaelni
parents: 350
diff changeset
267 /* Note the MPEG4 stuff is here cuz of buggy encoders which dont set the low_delay flag but
fdeec2834c79 there are divx5? encoded files without a userdata section but with b-frames :(
michaelni
parents: 350
diff changeset
268 do low-delay encoding, so we cant allways distinguish b-frame containing streams from low_delay streams */
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
269 CHECKED_ALLOCZ(pict, c_size)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
270 s->aux_picture_base[i] = pict;
986e461dc072 Initial revision
glantau
parents:
diff changeset
271 s->aux_picture[i] = pict + pict_start;
485
20108840b0e5 grayscale only decoding
michaelni
parents: 481
diff changeset
272 if(i>0) memset(s->aux_picture_base[i], 128, c_size);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
273 }
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
274 }
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
275 s->ip_buffer_count= 2;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
276 }
232
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
277
567
5a6eaaa9fba2 larger edge emu buffer (might have been too small)
michaelni
parents: 566
diff changeset
278 CHECKED_ALLOCZ(s->edge_emu_buffer, (s->width+64)*2*17*2); //(width + edge + align)*interlaced*MBsize*tolerance
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
279
232
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
280 if (s->encoding) {
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
281 int j;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
282 int mv_table_size= (s->mb_width+2)*(s->mb_height+2);
239
16cd8a9c4da4 - Minor changes on bitrate control
pulento
parents: 234
diff changeset
283
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
284 CHECKED_ALLOCZ(s->mb_var , s->mb_num * sizeof(INT16))
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
285 CHECKED_ALLOCZ(s->mc_mb_var, s->mb_num * sizeof(INT16))
690
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
286 CHECKED_ALLOCZ(s->mb_mean , s->mb_num * sizeof(INT8))
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
287
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
288 /* Allocate MV tables */
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
289 CHECKED_ALLOCZ(s->p_mv_table , mv_table_size * 2 * sizeof(INT16))
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
290 CHECKED_ALLOCZ(s->b_forw_mv_table , mv_table_size * 2 * sizeof(INT16))
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
291 CHECKED_ALLOCZ(s->b_back_mv_table , mv_table_size * 2 * sizeof(INT16))
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
292 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table , mv_table_size * 2 * sizeof(INT16))
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
293 CHECKED_ALLOCZ(s->b_bidir_back_mv_table , mv_table_size * 2 * sizeof(INT16))
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
294 CHECKED_ALLOCZ(s->b_direct_forw_mv_table, mv_table_size * 2 * sizeof(INT16))
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
295 CHECKED_ALLOCZ(s->b_direct_back_mv_table, mv_table_size * 2 * sizeof(INT16))
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
296 CHECKED_ALLOCZ(s->b_direct_mv_table , mv_table_size * 2 * sizeof(INT16))
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
297
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
298 CHECKED_ALLOCZ(s->me_scratchpad, s->linesize*16*3*sizeof(uint8_t))
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
299
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
300 CHECKED_ALLOCZ(s->me_map , ME_MAP_SIZE*sizeof(uint32_t))
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
301 CHECKED_ALLOCZ(s->me_score_map, ME_MAP_SIZE*sizeof(uint16_t))
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
302
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
303 if(s->max_b_frames){
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
304 for(j=0; j<REORDER_BUFFER_SIZE; j++){
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
305 int i;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
306 for(i=0;i<3;i++) {
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
307 int w, h, shift;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
308
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
309 w = s->linesize;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
310 h = s->mb_height * 16;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
311 shift = (i == 0) ? 0 : 1;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
312 c_size = (w >> shift) * (h >> shift);
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
313
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
314 CHECKED_ALLOCZ(pict, c_size);
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
315 s->picture_buffer[j][i] = pict;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
316 }
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
317 }
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
318 }
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
319
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
320 if(s->codec_id==CODEC_ID_MPEG4){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
321 CHECKED_ALLOCZ(s->tex_pb_buffer, PB_BUFFER_SIZE);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
322 CHECKED_ALLOCZ( s->pb2_buffer, PB_BUFFER_SIZE);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
323 }
612
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
324
650
ef4a33aad86e reducing sizeof MpegEncContext to avoid stack overflow on crap M$ windo$
michaelni
parents: 635
diff changeset
325 if(s->msmpeg4_version){
ef4a33aad86e reducing sizeof MpegEncContext to avoid stack overflow on crap M$ windo$
michaelni
parents: 635
diff changeset
326 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
ef4a33aad86e reducing sizeof MpegEncContext to avoid stack overflow on crap M$ windo$
michaelni
parents: 635
diff changeset
327 }
612
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
328 CHECKED_ALLOCZ(s->avctx->stats_out, 256);
232
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
329 }
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
330
288
f82cce6cb182 10l (motion_val was uninitilized)
michaelni
parents: 287
diff changeset
331 if (s->out_format == FMT_H263 || s->encoding) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
332 int size;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
333 /* Allocate MB type table */
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
334 CHECKED_ALLOCZ(s->mb_type , s->mb_num * sizeof(UINT8))
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
335
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
336 /* MV prediction */
986e461dc072 Initial revision
glantau
parents:
diff changeset
337 size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
338 CHECKED_ALLOCZ(s->motion_val, size * 2 * sizeof(INT16));
664
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
339 }
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
340
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
341 if(s->codec_id==CODEC_ID_MPEG4){
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
342 /* 4mv and interlaced direct mode decoding tables */
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
343 CHECKED_ALLOCZ(s->co_located_type_table, s->mb_num * sizeof(UINT8))
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
344 CHECKED_ALLOCZ(s->field_mv_table, s->mb_num*2*2 * sizeof(INT16))
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
345 CHECKED_ALLOCZ(s->field_select_table, s->mb_num*2* sizeof(INT8))
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
346 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
347
248
56ee684c48bb - H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents: 244
diff changeset
348 if (s->h263_pred || s->h263_plus) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
349 int y_size, c_size, i, size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
350
986e461dc072 Initial revision
glantau
parents:
diff changeset
351 /* dc values */
986e461dc072 Initial revision
glantau
parents:
diff changeset
352
986e461dc072 Initial revision
glantau
parents:
diff changeset
353 y_size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
354 c_size = (s->mb_width + 2) * (s->mb_height + 2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
355 size = y_size + 2 * c_size;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
356 CHECKED_ALLOCZ(s->dc_val[0], size * sizeof(INT16));
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
357 s->dc_val[1] = s->dc_val[0] + y_size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
358 s->dc_val[2] = s->dc_val[1] + c_size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
359 for(i=0;i<size;i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
360 s->dc_val[0][i] = 1024;
986e461dc072 Initial revision
glantau
parents:
diff changeset
361
986e461dc072 Initial revision
glantau
parents:
diff changeset
362 /* ac values */
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
363 CHECKED_ALLOCZ(s->ac_val[0], size * sizeof(INT16) * 16);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
364 s->ac_val[1] = s->ac_val[0] + y_size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
365 s->ac_val[2] = s->ac_val[1] + c_size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
366
986e461dc072 Initial revision
glantau
parents:
diff changeset
367 /* cbp values */
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
368 CHECKED_ALLOCZ(s->coded_block, y_size);
333
8aa87f1dfc52 divx 5.01 support
michaelni
parents: 329
diff changeset
369
8aa87f1dfc52 divx 5.01 support
michaelni
parents: 329
diff changeset
370 /* divx501 bitstream reorder buffer */
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
371 CHECKED_ALLOCZ(s->bitstream_buffer, BITSTREAM_BUFFER_SIZE);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
372
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
373 /* cbp, ac_pred, pred_dir */
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
374 CHECKED_ALLOCZ(s->cbp_table , s->mb_num * sizeof(UINT8))
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
375 CHECKED_ALLOCZ(s->pred_dir_table, s->mb_num * sizeof(UINT8))
197
21abf1b20016 different fix, s->mbintra_table used only if h263_pred set. - patch by Michael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 196
diff changeset
376 }
575
23eee7d73c4b minor optimizations
michaelni
parents: 570
diff changeset
377 CHECKED_ALLOCZ(s->qscale_table , s->mb_num * sizeof(UINT8))
23eee7d73c4b minor optimizations
michaelni
parents: 570
diff changeset
378
611
3214d3f4519e error concealment needs the mbintra_table so it should allways be allocated
michaelni
parents: 608
diff changeset
379 /* which mb is a intra block */
3214d3f4519e error concealment needs the mbintra_table so it should allways be allocated
michaelni
parents: 608
diff changeset
380 CHECKED_ALLOCZ(s->mbintra_table, s->mb_num);
3214d3f4519e error concealment needs the mbintra_table so it should allways be allocated
michaelni
parents: 608
diff changeset
381 memset(s->mbintra_table, 1, s->mb_num);
3214d3f4519e error concealment needs the mbintra_table so it should allways be allocated
michaelni
parents: 608
diff changeset
382
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
383 /* default structure is frame */
986e461dc072 Initial revision
glantau
parents:
diff changeset
384 s->picture_structure = PICT_FRAME;
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
385
7
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
386 /* init macroblock skip table */
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
387 CHECKED_ALLOCZ(s->mbskip_table, s->mb_num);
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
388
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
389 s->block= s->blocks[0];
7
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
390
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
391 s->context_initialized = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
392 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
393 fail:
244
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
394 MPV_common_end(s);
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
395 return -1;
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
396 }
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
397
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
398
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
399 //extern int sads;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
400
244
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
401 /* init common structure for both encoder and decoder */
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
402 void MPV_common_end(MpegEncContext *s)
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
403 {
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
404 int i;
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
405
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
406 av_freep(&s->mb_type);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
407 av_freep(&s->mb_var);
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
408 av_freep(&s->mc_mb_var);
690
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
409 av_freep(&s->mb_mean);
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
410 av_freep(&s->p_mv_table);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
411 av_freep(&s->b_forw_mv_table);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
412 av_freep(&s->b_back_mv_table);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
413 av_freep(&s->b_bidir_forw_mv_table);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
414 av_freep(&s->b_bidir_back_mv_table);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
415 av_freep(&s->b_direct_forw_mv_table);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
416 av_freep(&s->b_direct_back_mv_table);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
417 av_freep(&s->b_direct_mv_table);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
418 av_freep(&s->motion_val);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
419 av_freep(&s->dc_val[0]);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
420 av_freep(&s->ac_val[0]);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
421 av_freep(&s->coded_block);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
422 av_freep(&s->mbintra_table);
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
423 av_freep(&s->cbp_table);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
424 av_freep(&s->pred_dir_table);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
425 av_freep(&s->qscale_table);
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
426 av_freep(&s->me_scratchpad);
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
427 av_freep(&s->me_map);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
428 av_freep(&s->me_score_map);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
429
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
430 av_freep(&s->mbskip_table);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
431 av_freep(&s->bitstream_buffer);
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
432 av_freep(&s->tex_pb_buffer);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
433 av_freep(&s->pb2_buffer);
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
434 av_freep(&s->edge_emu_buffer);
664
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
435 av_freep(&s->co_located_type_table);
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
436 av_freep(&s->field_mv_table);
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
437 av_freep(&s->field_select_table);
612
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
438 av_freep(&s->avctx->stats_out);
650
ef4a33aad86e reducing sizeof MpegEncContext to avoid stack overflow on crap M$ windo$
michaelni
parents: 635
diff changeset
439 av_freep(&s->ac_stats);
612
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
440
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
441 for(i=0;i<3;i++) {
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
442 int j;
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
443 if(!(s->flags&CODEC_FLAG_DR1)){
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
444 av_freep(&s->last_picture_base[i]);
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
445 av_freep(&s->next_picture_base[i]);
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
446 av_freep(&s->aux_picture_base[i]);
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
447 }
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
448 s->last_picture_base[i]=
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
449 s->next_picture_base[i]=
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
450 s->aux_picture_base [i] = NULL;
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
451 s->last_picture[i]=
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
452 s->next_picture[i]=
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
453 s->aux_picture [i] = NULL;
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
454
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
455 for(j=0; j<REORDER_BUFFER_SIZE; j++){
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 376
diff changeset
456 av_freep(&s->picture_buffer[j][i]);
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
457 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
458 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
459 s->context_initialized = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
460 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
461
986e461dc072 Initial revision
glantau
parents:
diff changeset
462 /* init video encoder */
986e461dc072 Initial revision
glantau
parents:
diff changeset
463 int MPV_encode_init(AVCodecContext *avctx)
986e461dc072 Initial revision
glantau
parents:
diff changeset
464 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
465 MpegEncContext *s = avctx->priv_data;
60
35c1141e23d9 moved matrix init away from MPV_common_init()
glantau
parents: 57
diff changeset
466 int i;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
467
315
40d8092e2ff0 * using pixtype as enum - by Philip Gladstone
kabi
parents: 312
diff changeset
468 avctx->pix_fmt = PIX_FMT_YUV420P;
40d8092e2ff0 * using pixtype as enum - by Philip Gladstone
kabi
parents: 312
diff changeset
469
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
470 s->bit_rate = avctx->bit_rate;
268
09ae29b27ed9 hopefully better bitrate controll
michaelni
parents: 266
diff changeset
471 s->bit_rate_tolerance = avctx->bit_rate_tolerance;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
472 s->frame_rate = avctx->frame_rate;
986e461dc072 Initial revision
glantau
parents:
diff changeset
473 s->width = avctx->width;
986e461dc072 Initial revision
glantau
parents:
diff changeset
474 s->height = avctx->height;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
475 if(avctx->gop_size > 600){
462
3fdd0627f6bd typo (found by Bohdan Horst <nexus at hoth.amu.edu.pl>)
michaelni
parents: 461
diff changeset
476 fprintf(stderr, "Warning keyframe interval too large! reducing it ...\n");
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
477 avctx->gop_size=600;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
478 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
479 s->gop_size = avctx->gop_size;
162
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
480 s->rtp_mode = avctx->rtp_mode;
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
481 s->rtp_payload_size = avctx->rtp_payload_size;
231
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
482 if (avctx->rtp_callback)
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
483 s->rtp_callback = avctx->rtp_callback;
268
09ae29b27ed9 hopefully better bitrate controll
michaelni
parents: 266
diff changeset
484 s->qmin= avctx->qmin;
09ae29b27ed9 hopefully better bitrate controll
michaelni
parents: 266
diff changeset
485 s->qmax= avctx->qmax;
09ae29b27ed9 hopefully better bitrate controll
michaelni
parents: 266
diff changeset
486 s->max_qdiff= avctx->max_qdiff;
09ae29b27ed9 hopefully better bitrate controll
michaelni
parents: 266
diff changeset
487 s->qcompress= avctx->qcompress;
09ae29b27ed9 hopefully better bitrate controll
michaelni
parents: 266
diff changeset
488 s->qblur= avctx->qblur;
194
27d1773552c9 mpeg4 encoder fix by Michael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 191
diff changeset
489 s->avctx = avctx;
281
1fc96b02142e mpeg4 aspect_ratio_info in AVCodecContext (requested by alex)
michaelni
parents: 280
diff changeset
490 s->aspect_ratio_info= avctx->aspect_ratio_info;
618
4f3d4a07d374 added aspected_width/height for EXTENDED_PAR
al3x
parents: 612
diff changeset
491 if (avctx->aspect_ratio_info == FF_ASPECT_EXTENDED)
4f3d4a07d374 added aspected_width/height for EXTENDED_PAR
al3x
parents: 612
diff changeset
492 {
4f3d4a07d374 added aspected_width/height for EXTENDED_PAR
al3x
parents: 612
diff changeset
493 s->aspected_width = avctx->aspected_width;
4f3d4a07d374 added aspected_width/height for EXTENDED_PAR
al3x
parents: 612
diff changeset
494 s->aspected_height = avctx->aspected_height;
4f3d4a07d374 added aspected_width/height for EXTENDED_PAR
al3x
parents: 612
diff changeset
495 }
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
496 s->flags= avctx->flags;
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
497 s->max_b_frames= avctx->max_b_frames;
329
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
498 s->b_frame_strategy= avctx->b_frame_strategy;
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
499 s->codec_id= avctx->codec->id;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
500 s->luma_elim_threshold = avctx->luma_elim_threshold;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
501 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
502 s->strict_std_compliance= avctx->strict_std_compliance;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
503 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
599
b1a191202f96 mpeg4 mpeg quantizer encoding
michaelni
parents: 598
diff changeset
504 s->mpeg_quant= avctx->mpeg_quant;
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
505
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
506 if (s->gop_size <= 1) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
507 s->intra_only = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
508 s->gop_size = 12;
986e461dc072 Initial revision
glantau
parents:
diff changeset
509 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
510 s->intra_only = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
511 }
693
b6a7ff92df57 darkness masking (lumi masking does only bright stuff now)
michaelni
parents: 690
diff changeset
512
320
cda7d0857baf - ME setting moved to AVCodecContext/MpegEncContext, no longer a global.
pulento
parents: 315
diff changeset
513 /* ME algorithm */
321
2b00e171b1d4 - ME method compatibility with legacy apps.
pulento
parents: 320
diff changeset
514 if (avctx->me_method == 0)
2b00e171b1d4 - ME method compatibility with legacy apps.
pulento
parents: 320
diff changeset
515 /* For compatibility */
2b00e171b1d4 - ME method compatibility with legacy apps.
pulento
parents: 320
diff changeset
516 s->me_method = motion_estimation_method;
2b00e171b1d4 - ME method compatibility with legacy apps.
pulento
parents: 320
diff changeset
517 else
2b00e171b1d4 - ME method compatibility with legacy apps.
pulento
parents: 320
diff changeset
518 s->me_method = avctx->me_method;
693
b6a7ff92df57 darkness masking (lumi masking does only bright stuff now)
michaelni
parents: 690
diff changeset
519
320
cda7d0857baf - ME setting moved to AVCodecContext/MpegEncContext, no longer a global.
pulento
parents: 315
diff changeset
520 /* Fixed QSCALE */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
521 s->fixed_qscale = (avctx->flags & CODEC_FLAG_QSCALE);
232
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
522
690
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
523 s->adaptive_quant= ( s->avctx->lumi_masking
693
b6a7ff92df57 darkness masking (lumi masking does only bright stuff now)
michaelni
parents: 690
diff changeset
524 || s->avctx->dark_masking
690
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
525 || s->avctx->temporal_cplx_masking
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
526 || s->avctx->spatial_cplx_masking
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
527 || s->avctx->p_masking)
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
528 && !s->fixed_qscale;
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
529
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
530 s->progressive_sequence= !(avctx->flags & CODEC_FLAG_INTERLACED_DCT);
693
b6a7ff92df57 darkness masking (lumi masking does only bright stuff now)
michaelni
parents: 690
diff changeset
531
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
532 switch(avctx->codec->id) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
533 case CODEC_ID_MPEG1VIDEO:
986e461dc072 Initial revision
glantau
parents:
diff changeset
534 s->out_format = FMT_MPEG1;
336
c56b45669214 export delay info
michaelni
parents: 333
diff changeset
535 avctx->delay=0; //FIXME not sure, should check the spec
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
536 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
537 case CODEC_ID_MJPEG:
986e461dc072 Initial revision
glantau
parents:
diff changeset
538 s->out_format = FMT_MJPEG;
986e461dc072 Initial revision
glantau
parents:
diff changeset
539 s->intra_only = 1; /* force intra only for jpeg */
232
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
540 s->mjpeg_write_tables = 1; /* write all tables */
370
0eca28d16cbd clamp intra matrix to 8bit for mjpeg (workaround for qscale>=25)
al3x
parents: 365
diff changeset
541 s->mjpeg_data_only_frames = 0; /* write all the needed headers */
232
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
542 s->mjpeg_vsample[0] = 2; /* set up default sampling factors */
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
543 s->mjpeg_vsample[1] = 1; /* the only currently supported values */
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
544 s->mjpeg_vsample[2] = 1;
370
0eca28d16cbd clamp intra matrix to 8bit for mjpeg (workaround for qscale>=25)
al3x
parents: 365
diff changeset
545 s->mjpeg_hsample[0] = 2;
232
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
546 s->mjpeg_hsample[1] = 1;
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
547 s->mjpeg_hsample[2] = 1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
548 if (mjpeg_init(s) < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
549 return -1;
336
c56b45669214 export delay info
michaelni
parents: 333
diff changeset
550 avctx->delay=0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
551 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
552 case CODEC_ID_H263:
232
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
553 if (h263_get_picture_format(s->width, s->height) == 7) {
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
554 printf("Input picture size isn't suitable for h263 codec! try h263+\n");
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
555 return -1;
232
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
556 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
557 s->out_format = FMT_H263;
336
c56b45669214 export delay info
michaelni
parents: 333
diff changeset
558 avctx->delay=0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
559 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
560 case CODEC_ID_H263P:
986e461dc072 Initial revision
glantau
parents:
diff changeset
561 s->out_format = FMT_H263;
162
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
562 s->rtp_mode = 1;
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
563 s->rtp_payload_size = 1200;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
564 s->h263_plus = 1;
78
92ed1c4f94fa Added support to Unrestricted Motion Vectors (UMV)
pulento
parents: 71
diff changeset
565 s->unrestricted_mv = 1;
350
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 347
diff changeset
566 s->h263_aic = 1;
79
82e579c37bc3 Moved some H.263+ variables to MpegEncContext to be thread-safe.
pulento
parents: 78
diff changeset
567
82e579c37bc3 Moved some H.263+ variables to MpegEncContext to be thread-safe.
pulento
parents: 78
diff changeset
568 /* These are just to be sure */
82e579c37bc3 Moved some H.263+ variables to MpegEncContext to be thread-safe.
pulento
parents: 78
diff changeset
569 s->umvplus = 0;
82e579c37bc3 Moved some H.263+ variables to MpegEncContext to be thread-safe.
pulento
parents: 78
diff changeset
570 s->umvplus_dec = 0;
336
c56b45669214 export delay info
michaelni
parents: 333
diff changeset
571 avctx->delay=0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
572 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
573 case CODEC_ID_RV10:
986e461dc072 Initial revision
glantau
parents:
diff changeset
574 s->out_format = FMT_H263;
986e461dc072 Initial revision
glantau
parents:
diff changeset
575 s->h263_rv10 = 1;
336
c56b45669214 export delay info
michaelni
parents: 333
diff changeset
576 avctx->delay=0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
577 break;
71
79be2c581c01 changed opendivx to mpeg4
glantau
parents: 64
diff changeset
578 case CODEC_ID_MPEG4:
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
579 s->out_format = FMT_H263;
986e461dc072 Initial revision
glantau
parents:
diff changeset
580 s->h263_pred = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
581 s->unrestricted_mv = 1;
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
582 s->has_b_frames= s->max_b_frames ? 1 : 0;
336
c56b45669214 export delay info
michaelni
parents: 333
diff changeset
583 s->low_delay=0;
c56b45669214 export delay info
michaelni
parents: 333
diff changeset
584 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
585 break;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
586 case CODEC_ID_MSMPEG4V1:
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
587 s->out_format = FMT_H263;
986e461dc072 Initial revision
glantau
parents:
diff changeset
588 s->h263_msmpeg4 = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
589 s->h263_pred = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
590 s->unrestricted_mv = 1;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
591 s->msmpeg4_version= 1;
336
c56b45669214 export delay info
michaelni
parents: 333
diff changeset
592 avctx->delay=0;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
593 break;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
594 case CODEC_ID_MSMPEG4V2:
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
595 s->out_format = FMT_H263;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
596 s->h263_msmpeg4 = 1;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
597 s->h263_pred = 1;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
598 s->unrestricted_mv = 1;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
599 s->msmpeg4_version= 2;
336
c56b45669214 export delay info
michaelni
parents: 333
diff changeset
600 avctx->delay=0;
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
601 break;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
602 case CODEC_ID_MSMPEG4V3:
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
603 s->out_format = FMT_H263;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
604 s->h263_msmpeg4 = 1;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
605 s->h263_pred = 1;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
606 s->unrestricted_mv = 1;
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
607 s->msmpeg4_version= 3;
336
c56b45669214 export delay info
michaelni
parents: 333
diff changeset
608 avctx->delay=0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
609 break;
499
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
610 case CODEC_ID_WMV1:
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
611 s->out_format = FMT_H263;
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
612 s->h263_msmpeg4 = 1;
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
613 s->h263_pred = 1;
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
614 s->unrestricted_mv = 1;
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
615 s->msmpeg4_version= 4;
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
616 avctx->delay=0;
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
617 break;
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
618 case CODEC_ID_WMV2:
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
619 s->out_format = FMT_H263;
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
620 s->h263_msmpeg4 = 1;
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
621 s->h263_pred = 1;
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
622 s->unrestricted_mv = 1;
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
623 s->msmpeg4_version= 5;
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
624 avctx->delay=0;
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
625 break;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
626 default:
986e461dc072 Initial revision
glantau
parents:
diff changeset
627 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
628 }
295
6622b0fd036c mpeg4 4MV encoding
michaelni
parents: 294
diff changeset
629
277
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
630 { /* set up some save defaults, some codecs might override them later */
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
631 static int done=0;
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
632 if(!done){
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
633 int i;
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
634 done=1;
292
73a9ce3d9715 fcode_tables where too small, found by Klaas-Pieter Vlieg <vlieg@eurescom.de>
michaelni
parents: 288
diff changeset
635 memset(default_mv_penalty, 0, sizeof(UINT16)*(MAX_FCODE+1)*(2*MAX_MV+1));
277
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
636 memset(default_fcode_tab , 0, sizeof(UINT8)*(2*MAX_MV+1));
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
637
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
638 for(i=-16; i<16; i++){
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
639 default_fcode_tab[i + MAX_MV]= 1;
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
640 }
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
641 }
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
642 }
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
643 s->mv_penalty= default_mv_penalty;
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
644 s->fcode_tab= default_fcode_tab;
506
b9ed0ae72d51 init dc_scale tables to defaults (fixes mjpeg sig11)
michaelni
parents: 499
diff changeset
645 s->y_dc_scale_table=
b9ed0ae72d51 init dc_scale tables to defaults (fixes mjpeg sig11)
michaelni
parents: 499
diff changeset
646 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
b9ed0ae72d51 init dc_scale tables to defaults (fixes mjpeg sig11)
michaelni
parents: 499
diff changeset
647
287
32a3dcce2e9b fixing motion estimation with h263p hopefully
michaelni
parents: 286
diff changeset
648 /* dont use mv_penalty table for crap MV as it would be confused */
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
649 if (s->me_method < ME_EPZS) s->mv_penalty = default_mv_penalty;
287
32a3dcce2e9b fixing motion estimation with h263p hopefully
michaelni
parents: 286
diff changeset
650
7
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
651 s->encoding = 1;
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
652
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
653 /* init */
986e461dc072 Initial revision
glantau
parents:
diff changeset
654 if (MPV_common_init(s) < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
655 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
656
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
657 if (s->out_format == FMT_H263)
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
658 h263_encode_init(s);
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
659 else if (s->out_format == FMT_MPEG1)
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
660 ff_mpeg1_encode_init(s);
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
661 if(s->msmpeg4_version)
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
662 ff_msmpeg4_encode_init(s);
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
663
60
35c1141e23d9 moved matrix init away from MPV_common_init()
glantau
parents: 57
diff changeset
664 /* init default q matrix */
35c1141e23d9 moved matrix init away from MPV_common_init()
glantau
parents: 57
diff changeset
665 for(i=0;i<64;i++) {
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
666 int j= s->idct_permutation[i];
599
b1a191202f96 mpeg4 mpeg quantizer encoding
michaelni
parents: 598
diff changeset
667 if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
668 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
669 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
599
b1a191202f96 mpeg4 mpeg quantizer encoding
michaelni
parents: 598
diff changeset
670 }else if(s->out_format == FMT_H263){
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
671 s->intra_matrix[j] =
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
672 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
599
b1a191202f96 mpeg4 mpeg quantizer encoding
michaelni
parents: 598
diff changeset
673 }else{ /* mpeg1 */
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
674 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
675 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
599
b1a191202f96 mpeg4 mpeg quantizer encoding
michaelni
parents: 598
diff changeset
676 }
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
677 }
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
678
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
679 /* precompute matrix */
350
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 347
diff changeset
680 /* for mjpeg, we do include qscale in the matrix */
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
681 if (s->out_format != FMT_MJPEG) {
625
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
682 convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16, s->q_intra_matrix16_bias,
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
683 s->intra_matrix, s->intra_quant_bias);
625
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
684 convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16, s->q_inter_matrix16_bias,
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
685 s->inter_matrix, s->inter_quant_bias);
60
35c1141e23d9 moved matrix init away from MPV_common_init()
glantau
parents: 57
diff changeset
686 }
35c1141e23d9 moved matrix init away from MPV_common_init()
glantau
parents: 57
diff changeset
687
329
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
688 if(ff_rate_control_init(s) < 0)
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
689 return -1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
690
986e461dc072 Initial revision
glantau
parents:
diff changeset
691 s->picture_number = 0;
277
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
692 s->picture_in_gop_number = 0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
693 s->fake_picture_number = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
694 /* motion detector init */
986e461dc072 Initial revision
glantau
parents:
diff changeset
695 s->f_code = 1;
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
696 s->b_code = 1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
697
986e461dc072 Initial revision
glantau
parents:
diff changeset
698 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
699 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
700
986e461dc072 Initial revision
glantau
parents:
diff changeset
701 int MPV_encode_end(AVCodecContext *avctx)
986e461dc072 Initial revision
glantau
parents:
diff changeset
702 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
703 MpegEncContext *s = avctx->priv_data;
986e461dc072 Initial revision
glantau
parents:
diff changeset
704
986e461dc072 Initial revision
glantau
parents:
diff changeset
705 #ifdef STATS
986e461dc072 Initial revision
glantau
parents:
diff changeset
706 print_stats();
986e461dc072 Initial revision
glantau
parents:
diff changeset
707 #endif
329
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
708
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
709 ff_rate_control_uninit(s);
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
710
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
711 MPV_common_end(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
712 if (s->out_format == FMT_MJPEG)
986e461dc072 Initial revision
glantau
parents:
diff changeset
713 mjpeg_close(s);
232
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
714
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
715 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
716 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
717
986e461dc072 Initial revision
glantau
parents:
diff changeset
718 /* draw the edges of width 'w' of an image of size width, height */
619
2be2cc8fd0a1 mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents: 618
diff changeset
719 //FIXME check that this is ok for mpeg4 interlaced
206
994aa8623443 (commit by michael)
arpi_esp
parents: 200
diff changeset
720 static void draw_edges_c(UINT8 *buf, int wrap, int width, int height, int w)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
721 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
722 UINT8 *ptr, *last_line;
986e461dc072 Initial revision
glantau
parents:
diff changeset
723 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
724
986e461dc072 Initial revision
glantau
parents:
diff changeset
725 last_line = buf + (height - 1) * wrap;
986e461dc072 Initial revision
glantau
parents:
diff changeset
726 for(i=0;i<w;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
727 /* top and bottom */
986e461dc072 Initial revision
glantau
parents:
diff changeset
728 memcpy(buf - (i + 1) * wrap, buf, width);
986e461dc072 Initial revision
glantau
parents:
diff changeset
729 memcpy(last_line + (i + 1) * wrap, last_line, width);
986e461dc072 Initial revision
glantau
parents:
diff changeset
730 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
731 /* left and right */
986e461dc072 Initial revision
glantau
parents:
diff changeset
732 ptr = buf;
986e461dc072 Initial revision
glantau
parents:
diff changeset
733 for(i=0;i<height;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
734 memset(ptr - w, ptr[0], w);
986e461dc072 Initial revision
glantau
parents:
diff changeset
735 memset(ptr + width, ptr[width-1], w);
986e461dc072 Initial revision
glantau
parents:
diff changeset
736 ptr += wrap;
986e461dc072 Initial revision
glantau
parents:
diff changeset
737 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
738 /* corners */
986e461dc072 Initial revision
glantau
parents:
diff changeset
739 for(i=0;i<w;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
740 memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
986e461dc072 Initial revision
glantau
parents:
diff changeset
741 memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
986e461dc072 Initial revision
glantau
parents:
diff changeset
742 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
986e461dc072 Initial revision
glantau
parents:
diff changeset
743 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
986e461dc072 Initial revision
glantau
parents:
diff changeset
744 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
745 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
746
986e461dc072 Initial revision
glantau
parents:
diff changeset
747 /* generic function for encode/decode called before a frame is coded/decoded */
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
748 void MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
749 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
750 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
751 UINT8 *tmp;
986e461dc072 Initial revision
glantau
parents:
diff changeset
752
46
931417475f5b fixed mpeg1 first block bug (pb with black picture optimisation for B frames)
glantau
parents: 40
diff changeset
753 s->mb_skiped = 0;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
754 s->decoding_error=0;
562
23e58889a108 exporting mbskip_table after it has been allocated
michaelni
parents: 557
diff changeset
755 avctx->mbskip_table= s->mbskip_table;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
756
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
757 if(avctx->flags&CODEC_FLAG_DR1){
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
758 avctx->get_buffer_callback(avctx, s->width, s->height, s->pict_type);
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
759
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
760 s->linesize = avctx->dr_stride;
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
761 s->uvlinesize= avctx->dr_uvstride;
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
762 s->ip_buffer_count= avctx->dr_ip_buffer_count;
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
763 }
562
23e58889a108 exporting mbskip_table after it has been allocated
michaelni
parents: 557
diff changeset
764 avctx->dr_ip_buffer_count= s->ip_buffer_count;
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
765
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
766 if (s->pict_type == B_TYPE) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
767 for(i=0;i<3;i++) {
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
768 if(avctx->flags&CODEC_FLAG_DR1)
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
769 s->aux_picture[i]= avctx->dr_buffer[i];
569
395bb978b9ff fixing NULL reference frame with dr1
michaelni
parents: 567
diff changeset
770
395bb978b9ff fixing NULL reference frame with dr1
michaelni
parents: 567
diff changeset
771 //FIXME the following should never be needed, the decoder should drop b frames if no reference is available
395bb978b9ff fixing NULL reference frame with dr1
michaelni
parents: 567
diff changeset
772 if(s->next_picture[i]==NULL)
395bb978b9ff fixing NULL reference frame with dr1
michaelni
parents: 567
diff changeset
773 s->next_picture[i]= s->aux_picture[i];
395bb978b9ff fixing NULL reference frame with dr1
michaelni
parents: 567
diff changeset
774 if(s->last_picture[i]==NULL)
395bb978b9ff fixing NULL reference frame with dr1
michaelni
parents: 567
diff changeset
775 s->last_picture[i]= s->next_picture[i];
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
776
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
777 s->current_picture[i] = s->aux_picture[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
778 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
779 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
780 for(i=0;i<3;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
781 /* swap next and last */
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
782 if(avctx->flags&CODEC_FLAG_DR1)
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
783 tmp= avctx->dr_buffer[i];
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
784 else
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
785 tmp = s->last_picture[i];
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
786
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
787 s->last_picture[i] = s->next_picture[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
788 s->next_picture[i] = tmp;
986e461dc072 Initial revision
glantau
parents:
diff changeset
789 s->current_picture[i] = tmp;
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
790
592
909e50c67d0e last_picture should be never == NULL (it was with dr1) this might fix a segfault with error concealment
michaelni
parents: 591
diff changeset
791 if(s->last_picture[i]==NULL)
909e50c67d0e last_picture should be never == NULL (it was with dr1) this might fix a segfault with error concealment
michaelni
parents: 591
diff changeset
792 s->last_picture[i]= s->next_picture[i];
909e50c67d0e last_picture should be never == NULL (it was with dr1) this might fix a segfault with error concealment
michaelni
parents: 591
diff changeset
793
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
794 s->last_dr_opaque= s->next_dr_opaque;
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
795 s->next_dr_opaque= avctx->dr_opaque_frame;
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
796
557
c1e1be461662 direct rendering for SVQ1
michaelni
parents: 556
diff changeset
797 if(s->has_b_frames && s->last_dr_opaque && s->codec_id!=CODEC_ID_SVQ1)
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
798 avctx->dr_opaque_frame= s->last_dr_opaque;
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
799 else
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
800 avctx->dr_opaque_frame= s->next_dr_opaque;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
801 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
802 }
591
d3f374218030 fixing mpeg4 mpeg quantizers
michaelni
parents: 588
diff changeset
803 /* set dequantizer, we cant do it during init as it might change for mpeg4
d3f374218030 fixing mpeg4 mpeg quantizers
michaelni
parents: 588
diff changeset
804 and we cant do it in the header decode as init isnt called for mpeg4 there yet */
d3f374218030 fixing mpeg4 mpeg quantizers
michaelni
parents: 588
diff changeset
805 if(s->out_format == FMT_H263){
d3f374218030 fixing mpeg4 mpeg quantizers
michaelni
parents: 588
diff changeset
806 if(s->mpeg_quant)
d3f374218030 fixing mpeg4 mpeg quantizers
michaelni
parents: 588
diff changeset
807 s->dct_unquantize = s->dct_unquantize_mpeg2;
d3f374218030 fixing mpeg4 mpeg quantizers
michaelni
parents: 588
diff changeset
808 else
d3f374218030 fixing mpeg4 mpeg quantizers
michaelni
parents: 588
diff changeset
809 s->dct_unquantize = s->dct_unquantize_h263;
d3f374218030 fixing mpeg4 mpeg quantizers
michaelni
parents: 588
diff changeset
810 }else
d3f374218030 fixing mpeg4 mpeg quantizers
michaelni
parents: 588
diff changeset
811 s->dct_unquantize = s->dct_unquantize_mpeg1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
812 }
13
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
813
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
814 /* generic function for encode/decode called after a frame has been coded/decoded */
986e461dc072 Initial revision
glantau
parents:
diff changeset
815 void MPV_frame_end(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
816 {
652
c7647afc3ce5 set pict_type & key_frame on decoding too
michaelni
parents: 651
diff changeset
817 s->avctx->key_frame = (s->pict_type == I_TYPE);
c7647afc3ce5 set pict_type & key_frame on decoding too
michaelni
parents: 651
diff changeset
818 s->avctx->pict_type = s->pict_type;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
819
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
820 /* draw edge for correct motion prediction if outside */
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
821 if (s->pict_type != B_TYPE && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
582
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
822 draw_edges(s->current_picture[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH );
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
823 draw_edges(s->current_picture[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
824 draw_edges(s->current_picture[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
825 }
207
6954f2830e4a (commit by michael)
arpi_esp
parents: 206
diff changeset
826 emms_c();
329
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
827
612
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
828 s->last_pict_type = s->pict_type;
329
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
829 if(s->pict_type!=B_TYPE){
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
830 s->last_non_b_pict_type= s->pict_type;
341
bf26081c373c avcodec_flush_buffers()
michaelni
parents: 339
diff changeset
831 s->num_available_buffers++;
bf26081c373c avcodec_flush_buffers()
michaelni
parents: 339
diff changeset
832 if(s->num_available_buffers>2) s->num_available_buffers= 2;
329
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
833 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
834 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
835
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
836 /* reorder input for encoding */
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
837 void reorder_input(MpegEncContext *s, AVPicture *pict)
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
838 {
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
839 int i, j, index;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
840
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
841 if(s->max_b_frames > FF_MAX_B_FRAMES) s->max_b_frames= FF_MAX_B_FRAMES;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
842
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
843 // delay= s->max_b_frames+1; (or 0 if no b frames cuz decoder diff)
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
844
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
845 for(j=0; j<REORDER_BUFFER_SIZE-1; j++){
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
846 s->coded_order[j]= s->coded_order[j+1];
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
847 }
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
848 s->coded_order[j].picture[0]= s->coded_order[j].picture[1]= s->coded_order[j].picture[2]= NULL; //catch uninitalized buffers
339
b743a6bbab25 segfault fix
michaelni
parents: 336
diff changeset
849 s->coded_order[j].pict_type=0;
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
850
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
851 switch(s->input_pict_type){
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
852 default:
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
853 case I_TYPE:
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
854 case S_TYPE:
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
855 case P_TYPE:
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
856 index= s->max_b_frames - s->b_frames_since_non_b;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
857 s->b_frames_since_non_b=0;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
858 break;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
859 case B_TYPE:
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
860 index= s->max_b_frames + 1;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
861 s->b_frames_since_non_b++;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
862 break;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
863 }
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
864 //printf("index:%d type:%d strides: %d %d\n", index, s->input_pict_type, pict->linesize[0], s->linesize);
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
865 if( (index==0 || (s->flags&CODEC_FLAG_INPUT_PRESERVED))
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
866 && pict->linesize[0] == s->linesize
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
867 && pict->linesize[1] == s->uvlinesize
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
868 && pict->linesize[2] == s->uvlinesize){
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
869 //printf("ptr\n");
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
870 for(i=0; i<3; i++){
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
871 s->coded_order[index].picture[i]= pict->data[i];
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
872 }
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
873 }else{
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
874 //printf("copy\n");
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
875 for(i=0; i<3; i++){
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
876 uint8_t *src = pict->data[i];
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
877 uint8_t *dest;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
878 int src_wrap = pict->linesize[i];
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
879 int dest_wrap = s->linesize;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
880 int w = s->width;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
881 int h = s->height;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
882
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
883 if(index==0) dest= s->last_picture[i]+16; //is current_picture indeed but the switch hapens after reordering
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
884 else dest= s->picture_buffer[s->picture_buffer_index][i];
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
885
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
886 if (i >= 1) {
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
887 dest_wrap >>= 1;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
888 w >>= 1;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
889 h >>= 1;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
890 }
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
891
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
892 s->coded_order[index].picture[i]= dest;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
893 for(j=0;j<h;j++) {
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
894 memcpy(dest, src, w);
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
895 dest += dest_wrap;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
896 src += src_wrap;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
897 }
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
898 }
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
899 if(index!=0){
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
900 s->picture_buffer_index++;
588
9e271424160f max_b_frame=4 bugfix
michaelni
parents: 582
diff changeset
901 if(s->picture_buffer_index >= REORDER_BUFFER_SIZE) s->picture_buffer_index=0;
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
902 }
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
903 }
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
904 s->coded_order[index].pict_type = s->input_pict_type;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
905 s->coded_order[index].qscale = s->input_qscale;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
906 s->coded_order[index].force_type= s->force_input_type;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
907 s->coded_order[index].picture_in_gop_number= s->input_picture_in_gop_number;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
908 s->coded_order[index].picture_number= s->input_picture_number;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
909
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
910 for(i=0; i<3; i++){
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
911 s->new_picture[i]= s->coded_order[0].picture[i];
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
912 }
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
913 }
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
914
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
915 int MPV_encode_picture(AVCodecContext *avctx,
986e461dc072 Initial revision
glantau
parents:
diff changeset
916 unsigned char *buf, int buf_size, void *data)
986e461dc072 Initial revision
glantau
parents:
diff changeset
917 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
918 MpegEncContext *s = avctx->priv_data;
986e461dc072 Initial revision
glantau
parents:
diff changeset
919 AVPicture *pict = data;
986e461dc072 Initial revision
glantau
parents:
diff changeset
920
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
921 s->input_qscale = avctx->quality;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
922
986e461dc072 Initial revision
glantau
parents:
diff changeset
923 init_put_bits(&s->pb, buf, buf_size, NULL, NULL);
986e461dc072 Initial revision
glantau
parents:
diff changeset
924
329
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
925 if(avctx->flags&CODEC_FLAG_TYPE){
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
926 s->input_pict_type=
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
927 s->force_input_type= avctx->key_frame ? I_TYPE : P_TYPE;
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
928 }else if(s->flags&CODEC_FLAG_PASS2){
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
929 s->input_pict_type=
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
930 s->force_input_type= s->rc_context.entry[s->input_picture_number].new_pict_type;
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
931 }else{
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
932 s->force_input_type=0;
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
933 if (!s->intra_only) {
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
934 /* first picture of GOP is intra */
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
935 if (s->input_picture_in_gop_number % s->gop_size==0){
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
936 s->input_pict_type = I_TYPE;
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
937 }else if(s->max_b_frames==0){
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
938 s->input_pict_type = P_TYPE;
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
939 }else{
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
940 if(s->b_frames_since_non_b < s->max_b_frames) //FIXME more IQ
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
941 s->input_pict_type = B_TYPE;
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
942 else
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
943 s->input_pict_type = P_TYPE;
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
944 }
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
945 } else {
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
946 s->input_pict_type = I_TYPE;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
947 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
948 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
949
329
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
950 if(s->input_pict_type==I_TYPE)
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
951 s->input_picture_in_gop_number=0;
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
952
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
953 reorder_input(s, pict);
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
954
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
955 /* output? */
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
956 if(s->coded_order[0].picture[0]){
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
957
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
958 s->pict_type= s->coded_order[0].pict_type;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
959 if (s->fixed_qscale) /* the ratecontrol needs the last qscale so we dont touch it for CBR */
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
960 s->qscale= s->coded_order[0].qscale;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
961 s->force_type= s->coded_order[0].force_type;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
962 s->picture_in_gop_number= s->coded_order[0].picture_in_gop_number;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
963 s->picture_number= s->coded_order[0].picture_number;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
964
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
965 MPV_frame_start(s, avctx);
286
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
966
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
967 encode_picture(s, s->picture_number);
652
c7647afc3ce5 set pict_type & key_frame on decoding too
michaelni
parents: 651
diff changeset
968
376
ba9c3b8088c0 - pict_type exported to AVCodecContext
pulento
parents: 370
diff changeset
969 avctx->real_pict_num = s->picture_number;
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
970 avctx->header_bits = s->header_bits;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
971 avctx->mv_bits = s->mv_bits;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
972 avctx->misc_bits = s->misc_bits;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
973 avctx->i_tex_bits = s->i_tex_bits;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
974 avctx->p_tex_bits = s->p_tex_bits;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
975 avctx->i_count = s->i_count;
656
e47fa3e3f2d5 statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents: 652
diff changeset
976 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
977 avctx->skip_count = s->skip_count;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
978
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
979 MPV_frame_end(s);
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
980
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
981 if (s->out_format == FMT_MJPEG)
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
982 mjpeg_picture_trailer(s);
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
983
690
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
984 if(!s->fixed_qscale)
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
985 avctx->quality = s->qscale;
329
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
986
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
987 if(s->flags&CODEC_FLAG_PASS1)
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
988 ff_write_pass1_stats(s);
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
989
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
990 }
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
991
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
992 s->input_picture_number++;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
993 s->input_picture_in_gop_number++;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
994
986e461dc072 Initial revision
glantau
parents:
diff changeset
995 flush_put_bits(&s->pb);
268
09ae29b27ed9 hopefully better bitrate controll
michaelni
parents: 266
diff changeset
996 s->frame_bits = (pbBufPtr(&s->pb) - s->pb.buf) * 8;
612
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
997
268
09ae29b27ed9 hopefully better bitrate controll
michaelni
parents: 266
diff changeset
998 s->total_bits += s->frame_bits;
286
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
999 avctx->frame_bits = s->frame_bits;
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
1000 //printf("fcode: %d, type: %d, head: %d, mv: %d, misc: %d, frame: %d, itex: %d, ptex: %d\n",
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
1001 //s->f_code, avctx->key_frame, s->header_bits, s->mv_bits, s->misc_bits, s->frame_bits, s->i_tex_bits, s->p_tex_bits);
612
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
1002 #if 0 //dump some stats to stats.txt for testing/debuging
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
1003 if(s->max_b_frames==0)
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
1004 {
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
1005 static FILE *f=NULL;
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
1006 if(!f) f= fopen("stats.txt", "wb");
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
1007 get_psnr(pict->data, s->current_picture,
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
1008 pict->linesize, s->linesize, avctx);
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
1009 fprintf(f, "%7d, %7d, %2.4f\n", pbBufPtr(&s->pb) - s->pb.buf, s->qscale, avctx->psnr_y);
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
1010 }
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
1011 #endif
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 233
diff changeset
1012
252
ddb1a0e94cf4 - Added PSNR feature to libavcodec and ffmpeg. By now just Y PSNR until I'm
pulento
parents: 251
diff changeset
1013 if (avctx->get_psnr) {
ddb1a0e94cf4 - Added PSNR feature to libavcodec and ffmpeg. By now just Y PSNR until I'm
pulento
parents: 251
diff changeset
1014 /* At this point pict->data should have the original frame */
ddb1a0e94cf4 - Added PSNR feature to libavcodec and ffmpeg. By now just Y PSNR until I'm
pulento
parents: 251
diff changeset
1015 /* an s->current_picture should have the coded/decoded frame */
ddb1a0e94cf4 - Added PSNR feature to libavcodec and ffmpeg. By now just Y PSNR until I'm
pulento
parents: 251
diff changeset
1016 get_psnr(pict->data, s->current_picture,
ddb1a0e94cf4 - Added PSNR feature to libavcodec and ffmpeg. By now just Y PSNR until I'm
pulento
parents: 251
diff changeset
1017 pict->linesize, s->linesize, avctx);
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1018 // printf("%f\n", avctx->psnr_y);
252
ddb1a0e94cf4 - Added PSNR feature to libavcodec and ffmpeg. By now just Y PSNR until I'm
pulento
parents: 251
diff changeset
1019 }
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 233
diff changeset
1020 return pbBufPtr(&s->pb) - s->pb.buf;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1021 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1022
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1023 static inline void gmc1_motion(MpegEncContext *s,
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1024 UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1025 int dest_offset,
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1026 UINT8 **ref_picture, int src_offset,
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1027 int h)
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1028 {
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1029 UINT8 *ptr;
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1030 int offset, src_x, src_y, linesize, uvlinesize;
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1031 int motion_x, motion_y;
566
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
1032 int emu=0;
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1033
265
4e9e728021d8 use ac prediction in mpeg4 encoding (5% smaller intra-blocks/keyframes)
michaelni
parents: 262
diff changeset
1034 if(s->real_sprite_warping_points>1) printf("more than 1 warp point isnt supported\n");
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1035 motion_x= s->sprite_offset[0][0];
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1036 motion_y= s->sprite_offset[0][1];
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1037 src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1038 src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1039 motion_x<<=(3-s->sprite_warping_accuracy);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1040 motion_y<<=(3-s->sprite_warping_accuracy);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1041 src_x = clip(src_x, -16, s->width);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1042 if (src_x == s->width)
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1043 motion_x =0;
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1044 src_y = clip(src_y, -16, s->height);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1045 if (src_y == s->height)
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1046 motion_y =0;
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1047
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1048 linesize = s->linesize;
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1049 uvlinesize = s->uvlinesize;
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1050 ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset;
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1051
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1052 dest_y+=dest_offset;
566
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
1053 if(s->flags&CODEC_FLAG_EMU_EDGE){
582
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1054 if(src_x<0 || src_y<0 || src_x + (motion_x&15) + 16 > s->h_edge_pos
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1055 || src_y + (motion_y&15) + h > s->v_edge_pos){
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1056 emulated_edge_mc(s, ptr, linesize, 17, h+1, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
566
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
1057 ptr= s->edge_emu_buffer;
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
1058 emu=1;
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
1059 }
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
1060 }
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1061 gmc1(dest_y , ptr , linesize, h, motion_x&15, motion_y&15, s->no_rounding);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1062 gmc1(dest_y+8, ptr+8, linesize, h, motion_x&15, motion_y&15, s->no_rounding);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1063
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1064 motion_x= s->sprite_offset[1][0];
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1065 motion_y= s->sprite_offset[1][1];
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1066 src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1067 src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1068 motion_x<<=(3-s->sprite_warping_accuracy);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1069 motion_y<<=(3-s->sprite_warping_accuracy);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1070 src_x = clip(src_x, -8, s->width>>1);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1071 if (src_x == s->width>>1)
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1072 motion_x =0;
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1073 src_y = clip(src_y, -8, s->height>>1);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1074 if (src_y == s->height>>1)
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1075 motion_y =0;
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1076
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1077 offset = (src_y * uvlinesize) + src_x + (src_offset>>1);
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1078 ptr = ref_picture[1] + offset;
566
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
1079 if(emu){
582
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1080 emulated_edge_mc(s, ptr, uvlinesize, 9, (h>>1)+1, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
566
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
1081 ptr= s->edge_emu_buffer;
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
1082 }
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1083 gmc1(dest_cb + (dest_offset>>1), ptr, uvlinesize, h>>1, motion_x&15, motion_y&15, s->no_rounding);
566
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
1084
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1085 ptr = ref_picture[2] + offset;
566
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
1086 if(emu){
582
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1087 emulated_edge_mc(s, ptr, uvlinesize, 9, (h>>1)+1, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
566
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
1088 ptr= s->edge_emu_buffer;
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
1089 }
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1090 gmc1(dest_cr + (dest_offset>>1), ptr, uvlinesize, h>>1, motion_x&15, motion_y&15, s->no_rounding);
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1091
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1092 return;
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1093 }
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1094
566
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
1095 static void emulated_edge_mc(MpegEncContext *s, UINT8 *src, int linesize, int block_w, int block_h,
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1096 int src_x, int src_y, int w, int h){
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1097 int x, y;
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1098 int start_y, start_x, end_y, end_x;
566
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
1099 UINT8 *buf= s->edge_emu_buffer;
582
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1100
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1101 if(src_y>= h){
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1102 src+= (h-1-src_y)*linesize;
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1103 src_y=h-1;
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1104 }else if(src_y<=-block_h){
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1105 src+= (1-block_h-src_y)*linesize;
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1106 src_y=1-block_h;
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1107 }
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1108 if(src_x>= w){
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1109 src+= (w-1-src_x);
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1110 src_x=w-1;
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1111 }else if(src_x<=-block_w){
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1112 src+= (1-block_w-src_x);
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1113 src_x=1-block_w;
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1114 }
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1115
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1116 start_y= MAX(0, -src_y);
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1117 start_x= MAX(0, -src_x);
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1118 end_y= MIN(block_h, h-src_y);
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1119 end_x= MIN(block_w, w-src_x);
566
c376a0b290cf fixing gmc with emu edges
michaelni
parents: 565
diff changeset
1120
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1121 // copy existing part
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1122 for(y=start_y; y<end_y; y++){
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1123 for(x=start_x; x<end_x; x++){
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1124 buf[x + y*linesize]= src[x + y*linesize];
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1125 }
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1126 }
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1127
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1128 //top
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1129 for(y=0; y<start_y; y++){
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1130 for(x=start_x; x<end_x; x++){
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1131 buf[x + y*linesize]= buf[x + start_y*linesize];
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1132 }
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1133 }
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1134
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1135 //bottom
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1136 for(y=end_y; y<block_h; y++){
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1137 for(x=start_x; x<end_x; x++){
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1138 buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1139 }
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1140 }
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1141
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1142 for(y=0; y<block_h; y++){
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1143 //left
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1144 for(x=0; x<start_x; x++){
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1145 buf[x + y*linesize]= buf[start_x + y*linesize];
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1146 }
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1147
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1148 //right
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1149 for(x=end_x; x<block_w; x++){
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1150 buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1151 }
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1152 }
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1153 }
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1154
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1155
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1156 /* apply one mpeg motion vector to the three components */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1157 static inline void mpeg_motion(MpegEncContext *s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1158 UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1159 int dest_offset,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1160 UINT8 **ref_picture, int src_offset,
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1161 int field_based, op_pixels_func (*pix_op)[4],
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1162 int motion_x, int motion_y, int h)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1163 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1164 UINT8 *ptr;
582
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1165 int dxy, offset, mx, my, src_x, src_y, height, v_edge_pos, linesize, uvlinesize;
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1166 int emu=0;
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1167 #if 0
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1168 if(s->quarter_sample)
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1169 {
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1170 motion_x>>=1;
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1171 motion_y>>=1;
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1172 }
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1173 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1174 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1175 src_x = s->mb_x * 16 + (motion_x >> 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1176 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1177
986e461dc072 Initial revision
glantau
parents:
diff changeset
1178 /* WARNING: do no forget half pels */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1179 height = s->height >> field_based;
582
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1180 v_edge_pos = s->v_edge_pos >> field_based;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1181 src_x = clip(src_x, -16, s->width);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1182 if (src_x == s->width)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1183 dxy &= ~1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1184 src_y = clip(src_y, -16, height);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1185 if (src_y == height)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1186 dxy &= ~2;
565
44d744901ded interlaced mpeg2 fix ... replacing linesize>>1 by uvlinesize brainlessly wasnt a good idea
michaelni
parents: 562
diff changeset
1187 linesize = s->linesize << field_based;
44d744901ded interlaced mpeg2 fix ... replacing linesize>>1 by uvlinesize brainlessly wasnt a good idea
michaelni
parents: 562
diff changeset
1188 uvlinesize = s->uvlinesize << field_based;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1189 ptr = ref_picture[0] + (src_y * linesize) + (src_x) + src_offset;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1190 dest_y += dest_offset;
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1191
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1192 if(s->flags&CODEC_FLAG_EMU_EDGE){
582
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1193 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 16 > s->h_edge_pos
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1194 || src_y + (motion_y&1) + h > v_edge_pos){
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1195 emulated_edge_mc(s, ptr, linesize, 17, h+1, src_x, src_y, s->h_edge_pos, v_edge_pos);
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1196 ptr= s->edge_emu_buffer;
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1197 emu=1;
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1198 }
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1199 }
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1200 pix_op[0][dxy](dest_y, ptr, linesize, h);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1201
485
20108840b0e5 grayscale only decoding
michaelni
parents: 481
diff changeset
1202 if(s->flags&CODEC_FLAG_GRAY) return;
20108840b0e5 grayscale only decoding
michaelni
parents: 481
diff changeset
1203
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1204 if (s->out_format == FMT_H263) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1205 dxy = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1206 if ((motion_x & 3) != 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1207 dxy |= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1208 if ((motion_y & 3) != 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1209 dxy |= 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1210 mx = motion_x >> 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1211 my = motion_y >> 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1212 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1213 mx = motion_x / 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1214 my = motion_y / 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1215 dxy = ((my & 1) << 1) | (mx & 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1216 mx >>= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1217 my >>= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1218 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1219
986e461dc072 Initial revision
glantau
parents:
diff changeset
1220 src_x = s->mb_x * 8 + mx;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1221 src_y = s->mb_y * (8 >> field_based) + my;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1222 src_x = clip(src_x, -8, s->width >> 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1223 if (src_x == (s->width >> 1))
986e461dc072 Initial revision
glantau
parents:
diff changeset
1224 dxy &= ~1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1225 src_y = clip(src_y, -8, height >> 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1226 if (src_y == (height >> 1))
986e461dc072 Initial revision
glantau
parents:
diff changeset
1227 dxy &= ~2;
565
44d744901ded interlaced mpeg2 fix ... replacing linesize>>1 by uvlinesize brainlessly wasnt a good idea
michaelni
parents: 562
diff changeset
1228 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1229 ptr = ref_picture[1] + offset;
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1230 if(emu){
582
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1231 emulated_edge_mc(s, ptr, uvlinesize, 9, (h>>1)+1, src_x, src_y, s->h_edge_pos>>1, v_edge_pos>>1);
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1232 ptr= s->edge_emu_buffer;
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1233 }
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1234 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1235
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1236 ptr = ref_picture[2] + offset;
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1237 if(emu){
582
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1238 emulated_edge_mc(s, ptr, uvlinesize, 9, (h>>1)+1, src_x, src_y, s->h_edge_pos>>1, v_edge_pos>>1);
553
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1239 ptr= s->edge_emu_buffer;
18ad513d92fe direct rendering method 1 support
michaelni
parents: 549
diff changeset
1240 }
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1241 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1242 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1243
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1244 static inline void qpel_motion(MpegEncContext *s,
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1245 UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1246 int dest_offset,
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1247 UINT8 **ref_picture, int src_offset,
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1248 int field_based, op_pixels_func (*pix_op)[4],
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1249 qpel_mc_func (*qpix_op)[16],
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1250 int motion_x, int motion_y, int h)
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1251 {
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1252 UINT8 *ptr;
671
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1253 int dxy, offset, mx, my, src_x, src_y, height, v_edge_pos, linesize, uvlinesize;
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1254 int emu=0;
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1256 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1257 src_x = s->mb_x * 16 + (motion_x >> 2);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1258 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1259
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1260 height = s->height >> field_based;
582
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1261 v_edge_pos = s->v_edge_pos >> field_based;
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1262 src_x = clip(src_x, -16, s->width);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1263 if (src_x == s->width)
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1264 dxy &= ~3;
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1265 src_y = clip(src_y, -16, height);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1266 if (src_y == height)
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1267 dxy &= ~12;
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1268 linesize = s->linesize << field_based;
671
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1269 uvlinesize = s->uvlinesize << field_based;
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1270 ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset;
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1271 dest_y += dest_offset;
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1272 //printf("%d %d %d\n", src_x, src_y, dxy);
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1273
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1274 if(s->flags&CODEC_FLAG_EMU_EDGE){
582
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1275 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 16 > s->h_edge_pos
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1276 || src_y + (motion_y&3) + h > v_edge_pos){
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1277 emulated_edge_mc(s, ptr, linesize, 17, h+1, src_x, src_y, s->h_edge_pos, v_edge_pos);
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1278 ptr= s->edge_emu_buffer;
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1279 emu=1;
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1280 }
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1281 }
671
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1282 if(!field_based)
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1283 qpix_op[0][dxy](dest_y, ptr, linesize);
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1284 else{
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1285 //damn interlaced mode
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1286 //FIXME boundary mirroring is not exactly correct here
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1287 qpix_op[1][dxy](dest_y , ptr , linesize);
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1288 qpix_op[1][dxy](dest_y+8, ptr+8, linesize);
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1289 }
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1290
485
20108840b0e5 grayscale only decoding
michaelni
parents: 481
diff changeset
1291 if(s->flags&CODEC_FLAG_GRAY) return;
20108840b0e5 grayscale only decoding
michaelni
parents: 481
diff changeset
1292
671
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1293 if(field_based){
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1294 mx= motion_x/2;
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1295 my= motion_y>>1;
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1296 }else if(s->divx_version){
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1297 mx= (motion_x>>1)|(motion_x&1);
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1298 my= (motion_y>>1)|(motion_y&1);
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1299 }else{
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1300 mx= motion_x/2;
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1301 my= motion_y/2;
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1302 }
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1303 mx= (mx>>1)|(mx&1);
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1304 my= (my>>1)|(my&1);
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1305 dxy= (mx&1) | ((my&1)<<1);
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1306 mx>>=1;
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1307 my>>=1;
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1308
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1309 src_x = s->mb_x * 8 + mx;
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1310 src_y = s->mb_y * (8 >> field_based) + my;
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1311 src_x = clip(src_x, -8, s->width >> 1);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1312 if (src_x == (s->width >> 1))
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1313 dxy &= ~1;
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1314 src_y = clip(src_y, -8, height >> 1);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1315 if (src_y == (height >> 1))
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1316 dxy &= ~2;
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1317
671
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1318 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1319 ptr = ref_picture[1] + offset;
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1320 if(emu){
671
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1321 emulated_edge_mc(s, ptr, uvlinesize, 9, (h>>1)+1, src_x, src_y, s->h_edge_pos>>1, v_edge_pos>>1);
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1322 ptr= s->edge_emu_buffer;
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1323 }
671
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1324 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1325
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1326 ptr = ref_picture[2] + offset;
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1327 if(emu){
671
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1328 emulated_edge_mc(s, ptr, uvlinesize, 9, (h>>1)+1, src_x, src_y, s->h_edge_pos>>1, v_edge_pos>>1);
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1329 ptr= s->edge_emu_buffer;
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1330 }
671
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1331 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1332 }
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1333
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1334
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1335 static inline void MPV_motion(MpegEncContext *s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1336 UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1337 int dir, UINT8 **ref_picture,
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1338 op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1339 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1340 int dxy, offset, mx, my, src_x, src_y, motion_x, motion_y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1341 int mb_x, mb_y, i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1342 UINT8 *ptr, *dest;
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1343 int emu=0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1344
986e461dc072 Initial revision
glantau
parents:
diff changeset
1345 mb_x = s->mb_x;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1346 mb_y = s->mb_y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1347
986e461dc072 Initial revision
glantau
parents:
diff changeset
1348 switch(s->mv_type) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1349 case MV_TYPE_16X16:
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1350 if(s->mcsel){
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1351 gmc1_motion(s, dest_y, dest_cb, dest_cr, 0,
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1352 ref_picture, 0,
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1353 16);
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1354 }else if(s->quarter_sample){
255
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1355 qpel_motion(s, dest_y, dest_cb, dest_cr, 0,
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1356 ref_picture, 0,
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1357 0, pix_op, qpix_op,
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1358 s->mv[dir][0][0], s->mv[dir][0][1], 16);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1359 }else{
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1360 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1361 ref_picture, 0,
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1362 0, pix_op,
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1363 s->mv[dir][0][0], s->mv[dir][0][1], 16);
db20b987c32d divx5-gmc support
michaelni
parents: 252
diff changeset
1364 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1365 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1366 case MV_TYPE_8X8:
673
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1367 mx = 0;
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1368 my = 0;
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1369 if(s->quarter_sample){
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1370 for(i=0;i<4;i++) {
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1371 motion_x = s->mv[dir][i][0];
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1372 motion_y = s->mv[dir][i][1];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1373
673
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1374 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1375 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1376 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1377
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1378 /* WARNING: do no forget half pels */
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1379 src_x = clip(src_x, -16, s->width);
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1380 if (src_x == s->width)
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1381 dxy &= ~3;
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1382 src_y = clip(src_y, -16, s->height);
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1383 if (src_y == s->height)
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1384 dxy &= ~12;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1385
673
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1386 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1387 if(s->flags&CODEC_FLAG_EMU_EDGE){
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1388 if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 8 > s->h_edge_pos
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1389 || src_y + (motion_y&3) + 8 > s->v_edge_pos){
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1390 emulated_edge_mc(s, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1391 ptr= s->edge_emu_buffer;
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1392 }
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1393 }
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1394 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1395 qpix_op[1][dxy](dest, ptr, s->linesize);
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1396
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1397 mx += s->mv[dir][i][0]/2;
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1398 my += s->mv[dir][i][1]/2;
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1399 }
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1400 }else{
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1401 for(i=0;i<4;i++) {
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1402 motion_x = s->mv[dir][i][0];
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1403 motion_y = s->mv[dir][i][1];
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1404
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1405 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1406 src_x = mb_x * 16 + (motion_x >> 1) + (i & 1) * 8;
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1407 src_y = mb_y * 16 + (motion_y >> 1) + (i >>1) * 8;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1408
673
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1409 /* WARNING: do no forget half pels */
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1410 src_x = clip(src_x, -16, s->width);
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1411 if (src_x == s->width)
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1412 dxy &= ~1;
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1413 src_y = clip(src_y, -16, s->height);
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1414 if (src_y == s->height)
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1415 dxy &= ~2;
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1416
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1417 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1418 if(s->flags&CODEC_FLAG_EMU_EDGE){
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1419 if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 8 > s->h_edge_pos
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1420 || src_y + (motion_y&1) + 8 > s->v_edge_pos){
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1421 emulated_edge_mc(s, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1422 ptr= s->edge_emu_buffer;
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1423 }
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1424 }
673
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1425 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1426 pix_op[1][dxy](dest, ptr, s->linesize, 8);
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1427
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1428 mx += s->mv[dir][i][0];
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1429 my += s->mv[dir][i][1];
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1430 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1431 }
673
242f0f7d8c15 fixing qpel 4mv
michaelni
parents: 671
diff changeset
1432
485
20108840b0e5 grayscale only decoding
michaelni
parents: 481
diff changeset
1433 if(s->flags&CODEC_FLAG_GRAY) break;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1434 /* In case of 8X8, we construct a single chroma motion vector
986e461dc072 Initial revision
glantau
parents:
diff changeset
1435 with a special rounding */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1436 for(i=0;i<4;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1437 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1438 if (mx >= 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1439 mx = (h263_chroma_roundtab[mx & 0xf] + ((mx >> 3) & ~1));
986e461dc072 Initial revision
glantau
parents:
diff changeset
1440 else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1441 mx = -mx;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1442 mx = -(h263_chroma_roundtab[mx & 0xf] + ((mx >> 3) & ~1));
986e461dc072 Initial revision
glantau
parents:
diff changeset
1443 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1444 if (my >= 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1445 my = (h263_chroma_roundtab[my & 0xf] + ((my >> 3) & ~1));
986e461dc072 Initial revision
glantau
parents:
diff changeset
1446 else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1447 my = -my;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1448 my = -(h263_chroma_roundtab[my & 0xf] + ((my >> 3) & ~1));
986e461dc072 Initial revision
glantau
parents:
diff changeset
1449 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1450 dxy = ((my & 1) << 1) | (mx & 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1451 mx >>= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1452 my >>= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1453
986e461dc072 Initial revision
glantau
parents:
diff changeset
1454 src_x = mb_x * 8 + mx;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1455 src_y = mb_y * 8 + my;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1456 src_x = clip(src_x, -8, s->width/2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1457 if (src_x == s->width/2)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1458 dxy &= ~1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1459 src_y = clip(src_y, -8, s->height/2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1460 if (src_y == s->height/2)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1461 dxy &= ~2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1462
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1463 offset = (src_y * (s->uvlinesize)) + src_x;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1464 ptr = ref_picture[1] + offset;
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1465 if(s->flags&CODEC_FLAG_EMU_EDGE){
582
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1466 if(src_x<0 || src_y<0 || src_x + (dxy &1) + 8 > s->h_edge_pos>>1
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1467 || src_y + (dxy>>1) + 8 > s->v_edge_pos>>1){
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1468 emulated_edge_mc(s, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1469 ptr= s->edge_emu_buffer;
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1470 emu=1;
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1471 }
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1472 }
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1473 pix_op[1][dxy](dest_cb, ptr, s->uvlinesize, 8);
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1474
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1475 ptr = ref_picture[2] + offset;
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1476 if(emu){
582
5132a4ee50cd different edge positions fixed with edge emu / dr1
michaelni
parents: 575
diff changeset
1477 emulated_edge_mc(s, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
554
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1478 ptr= s->edge_emu_buffer;
3eb6fe38019a 4mv & qpel edge emu
michaelni
parents: 553
diff changeset
1479 }
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1480 pix_op[1][dxy](dest_cr, ptr, s->uvlinesize, 8);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1481 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1482 case MV_TYPE_FIELD:
986e461dc072 Initial revision
glantau
parents:
diff changeset
1483 if (s->picture_structure == PICT_FRAME) {
671
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1484 if(s->quarter_sample){
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1485 /* top field */
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1486 qpel_motion(s, dest_y, dest_cb, dest_cr, 0,
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1487 ref_picture, s->field_select[dir][0] ? s->linesize : 0,
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1488 1, pix_op, qpix_op,
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1489 s->mv[dir][0][0], s->mv[dir][0][1], 8);
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1490 /* bottom field */
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1491 qpel_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1492 ref_picture, s->field_select[dir][1] ? s->linesize : 0,
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1493 1, pix_op, qpix_op,
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1494 s->mv[dir][1][0], s->mv[dir][1][1], 8);
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1495 }else{
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1496 /* top field */
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1497 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1498 ref_picture, s->field_select[dir][0] ? s->linesize : 0,
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1499 1, pix_op,
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1500 s->mv[dir][0][0], s->mv[dir][0][1], 8);
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1501 /* bottom field */
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1502 mpeg_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1503 ref_picture, s->field_select[dir][1] ? s->linesize : 0,
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1504 1, pix_op,
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1505 s->mv[dir][1][0], s->mv[dir][1][1], 8);
3f2e5a282f61 interlaced qpel mpeg4 fixed
michaelni
parents: 664
diff changeset
1506 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1507 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1508
986e461dc072 Initial revision
glantau
parents:
diff changeset
1509
986e461dc072 Initial revision
glantau
parents:
diff changeset
1510 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1511 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1512 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1513 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1514
986e461dc072 Initial revision
glantau
parents:
diff changeset
1515
986e461dc072 Initial revision
glantau
parents:
diff changeset
1516 /* put block[] to dest[] */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1517 static inline void put_dct(MpegEncContext *s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1518 DCTELEM *block, int i, UINT8 *dest, int line_size)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1519 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1520 if (!s->mpeg2)
13
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
1521 s->dct_unquantize(s, block, i, s->qscale);
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1522 s->idct_put (dest, line_size, block);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1523 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1524
986e461dc072 Initial revision
glantau
parents:
diff changeset
1525 /* add block[] to dest[] */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1526 static inline void add_dct(MpegEncContext *s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1527 DCTELEM *block, int i, UINT8 *dest, int line_size)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1528 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1529 if (s->block_last_index[i] >= 0) {
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1530 s->idct_add (dest, line_size, block);
481
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1531 }
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1532 }
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1533
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1534 static inline void add_dequant_dct(MpegEncContext *s,
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1535 DCTELEM *block, int i, UINT8 *dest, int line_size)
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1536 {
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1537 if (s->block_last_index[i] >= 0) {
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1538 s->dct_unquantize(s, block, i, s->qscale);
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1539
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1540 s->idct_add (dest, line_size, block);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1541 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1542 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1543
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1544 /**
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1545 * cleans dc, ac, coded_block for the current non intra MB
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1546 */
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1547 void ff_clean_intra_table_entries(MpegEncContext *s)
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1548 {
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1549 int wrap = s->block_wrap[0];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1550 int xy = s->block_index[0];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1551
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1552 s->dc_val[0][xy ] =
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1553 s->dc_val[0][xy + 1 ] =
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1554 s->dc_val[0][xy + wrap] =
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1555 s->dc_val[0][xy + 1 + wrap] = 1024;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1556 /* ac pred */
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1557 memset(s->ac_val[0][xy ], 0, 32 * sizeof(INT16));
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1558 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(INT16));
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1559 if (s->msmpeg4_version>=3) {
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1560 s->coded_block[xy ] =
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1561 s->coded_block[xy + 1 ] =
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1562 s->coded_block[xy + wrap] =
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1563 s->coded_block[xy + 1 + wrap] = 0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1564 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1565 /* chroma */
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1566 wrap = s->block_wrap[4];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1567 xy = s->mb_x + 1 + (s->mb_y + 1) * wrap;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1568 s->dc_val[1][xy] =
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1569 s->dc_val[2][xy] = 1024;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1570 /* ac pred */
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1571 memset(s->ac_val[1][xy], 0, 16 * sizeof(INT16));
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1572 memset(s->ac_val[2][xy], 0, 16 * sizeof(INT16));
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1573
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1574 s->mbintra_table[s->mb_x + s->mb_y*s->mb_width]= 0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1575 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1576
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1577 /* generic function called after a macroblock has been parsed by the
986e461dc072 Initial revision
glantau
parents:
diff changeset
1578 decoder or after it has been encoded by the encoder.
986e461dc072 Initial revision
glantau
parents:
diff changeset
1579
986e461dc072 Initial revision
glantau
parents:
diff changeset
1580 Important variables used:
986e461dc072 Initial revision
glantau
parents:
diff changeset
1581 s->mb_intra : true if intra macroblock
986e461dc072 Initial revision
glantau
parents:
diff changeset
1582 s->mv_dir : motion vector direction
986e461dc072 Initial revision
glantau
parents:
diff changeset
1583 s->mv_type : motion vector type
986e461dc072 Initial revision
glantau
parents:
diff changeset
1584 s->mv : motion vector
986e461dc072 Initial revision
glantau
parents:
diff changeset
1585 s->interlaced_dct : true if interlaced dct used (mpeg2)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1586 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1587 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
986e461dc072 Initial revision
glantau
parents:
diff changeset
1588 {
244
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
1589 int mb_x, mb_y;
481
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1590 const int mb_xy = s->mb_y * s->mb_width + s->mb_x;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1591
986e461dc072 Initial revision
glantau
parents:
diff changeset
1592 mb_x = s->mb_x;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1593 mb_y = s->mb_y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1594
108
1e4a4af694d1 exporting qscale data for postprocessing (for MPlayer)
arpi_esp
parents: 79
diff changeset
1595 #ifdef FF_POSTPROCESS
466
805714c0c10f new field for communicating with external postprocessing
nickols_k
parents: 462
diff changeset
1596 /* Obsolete. Exists for compatibility with mplayer only. */
108
1e4a4af694d1 exporting qscale data for postprocessing (for MPlayer)
arpi_esp
parents: 79
diff changeset
1597 quant_store[mb_y][mb_x]=s->qscale;
1e4a4af694d1 exporting qscale data for postprocessing (for MPlayer)
arpi_esp
parents: 79
diff changeset
1598 //printf("[%02d][%02d] %d\n",mb_x,mb_y,s->qscale);
466
805714c0c10f new field for communicating with external postprocessing
nickols_k
parents: 462
diff changeset
1599 #else
575
23eee7d73c4b minor optimizations
michaelni
parents: 570
diff changeset
1600 /* even more obsolete, exists for mplayer xp only */
467
ad65941c8eb5 use qstride instead of fixed constants
nickols_k
parents: 466
diff changeset
1601 if(s->avctx->quant_store) s->avctx->quant_store[mb_y*s->avctx->qstride+mb_x] = s->qscale;
108
1e4a4af694d1 exporting qscale data for postprocessing (for MPlayer)
arpi_esp
parents: 79
diff changeset
1602 #endif
575
23eee7d73c4b minor optimizations
michaelni
parents: 570
diff changeset
1603 s->qscale_table[mb_xy]= s->qscale;
108
1e4a4af694d1 exporting qscale data for postprocessing (for MPlayer)
arpi_esp
parents: 79
diff changeset
1604
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1605 /* update DC predictors for P macroblocks */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1606 if (!s->mb_intra) {
249
42a0b7b16738 - Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents: 248
diff changeset
1607 if (s->h263_pred || s->h263_aic) {
481
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1608 if(s->mbintra_table[mb_xy])
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1609 ff_clean_intra_table_entries(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1610 } else {
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1611 s->last_dc[0] =
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1612 s->last_dc[1] =
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1613 s->last_dc[2] = 128 << s->intra_dc_precision;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1614 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1615 }
249
42a0b7b16738 - Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents: 248
diff changeset
1616 else if (s->h263_pred || s->h263_aic)
481
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1617 s->mbintra_table[mb_xy]=1;
191
883f184537e6 AC table reset (memset) optimization - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 189
diff changeset
1618
280
3dc1ca4ba717 fixing epzs & mpeg1 (hopefully now really ...)
michaelni
parents: 279
diff changeset
1619 /* update motion predictor, not for B-frames as they need the motion_val from the last P/S-Frame */
481
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1620 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE) { //FIXME move into h263.c if possible, format specific stuff shouldnt be here
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1621
481
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1622 const int wrap = s->block_wrap[0];
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1623 const int xy = s->block_index[0];
664
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
1624 const int mb_index= s->mb_x + s->mb_y*s->mb_width;
619
2be2cc8fd0a1 mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents: 618
diff changeset
1625 if(s->mv_type == MV_TYPE_8X8){
664
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
1626 s->co_located_type_table[mb_index]= CO_LOCATED_TYPE_4MV;
619
2be2cc8fd0a1 mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents: 618
diff changeset
1627 } else {
2be2cc8fd0a1 mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents: 618
diff changeset
1628 int motion_x, motion_y;
2be2cc8fd0a1 mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents: 618
diff changeset
1629 if (s->mb_intra) {
2be2cc8fd0a1 mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents: 618
diff changeset
1630 motion_x = 0;
2be2cc8fd0a1 mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents: 618
diff changeset
1631 motion_y = 0;
664
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
1632 if(s->co_located_type_table)
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
1633 s->co_located_type_table[mb_index]= 0;
619
2be2cc8fd0a1 mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents: 618
diff changeset
1634 } else if (s->mv_type == MV_TYPE_16X16) {
2be2cc8fd0a1 mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents: 618
diff changeset
1635 motion_x = s->mv[0][0][0];
2be2cc8fd0a1 mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents: 618
diff changeset
1636 motion_y = s->mv[0][0][1];
664
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
1637 if(s->co_located_type_table)
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
1638 s->co_located_type_table[mb_index]= 0;
619
2be2cc8fd0a1 mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents: 618
diff changeset
1639 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
664
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
1640 int i;
619
2be2cc8fd0a1 mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents: 618
diff changeset
1641 motion_x = s->mv[0][0][0] + s->mv[0][1][0];
2be2cc8fd0a1 mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents: 618
diff changeset
1642 motion_y = s->mv[0][0][1] + s->mv[0][1][1];
2be2cc8fd0a1 mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents: 618
diff changeset
1643 motion_x = (motion_x>>1) | (motion_x&1);
664
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
1644 for(i=0; i<2; i++){
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
1645 s->field_mv_table[mb_index][i][0]= s->mv[0][i][0];
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
1646 s->field_mv_table[mb_index][i][1]= s->mv[0][i][1];
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
1647 s->field_select_table[mb_index][i]= s->field_select[0][i];
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
1648 }
00a882f626bd interlaced mpeg4 b frame decoding
michaelni
parents: 661
diff changeset
1649 s->co_located_type_table[mb_index]= CO_LOCATED_TYPE_FIELDMV;
619
2be2cc8fd0a1 mpeg4 interlaced decoding support (not completly implemented/tested due to lack of samples)
michaelni
parents: 618
diff changeset
1650 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1651 /* no update if 8X8 because it has been done during parsing */
244
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
1652 s->motion_val[xy][0] = motion_x;
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
1653 s->motion_val[xy][1] = motion_y;
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
1654 s->motion_val[xy + 1][0] = motion_x;
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
1655 s->motion_val[xy + 1][1] = motion_y;
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
1656 s->motion_val[xy + wrap][0] = motion_x;
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
1657 s->motion_val[xy + wrap][1] = motion_y;
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
1658 s->motion_val[xy + 1 + wrap][0] = motion_x;
3860331a1ecb * eliminating duplicated code from MPV_common_end
kabi
parents: 239
diff changeset
1659 s->motion_val[xy + 1 + wrap][1] = motion_y;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1660 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1661 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1662
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1663 if (!(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1664 UINT8 *dest_y, *dest_cb, *dest_cr;
481
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1665 int dct_linesize, dct_offset;
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1666 op_pixels_func (*op_pix)[4];
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1667 qpel_mc_func (*op_qpix)[16];
7
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
1668
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1669 /* avoid copy if macroblock skipped in last frame too
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1670 dont touch it for B-frames as they need the skip info from the next p-frame */
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1671 if (s->pict_type != B_TYPE) {
481
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1672 UINT8 *mbskip_ptr = &s->mbskip_table[mb_xy];
7
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
1673 if (s->mb_skiped) {
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
1674 s->mb_skiped = 0;
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1675
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1676 (*mbskip_ptr) ++; /* indicate that this time we skiped it */
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1677 if(*mbskip_ptr >99) *mbskip_ptr= 99;
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1678
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1679 /* if previous was skipped too, then nothing to do !
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1680 skip only during decoding as we might trash the buffers during encoding a bit */
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1681 if (*mbskip_ptr >= s->ip_buffer_count && !s->encoding)
7
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
1682 goto the_end;
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
1683 } else {
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
1684 *mbskip_ptr = 0; /* not skipped */
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
1685 }
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
1686 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1687
562
23e58889a108 exporting mbskip_table after it has been allocated
michaelni
parents: 557
diff changeset
1688 dest_y = s->current_picture [0] + (mb_y * 16* s->linesize ) + mb_x * 16;
23e58889a108 exporting mbskip_table after it has been allocated
michaelni
parents: 557
diff changeset
1689 dest_cb = s->current_picture[1] + (mb_y * 8 * s->uvlinesize) + mb_x * 8;
23e58889a108 exporting mbskip_table after it has been allocated
michaelni
parents: 557
diff changeset
1690 dest_cr = s->current_picture[2] + (mb_y * 8 * s->uvlinesize) + mb_x * 8;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1691
986e461dc072 Initial revision
glantau
parents:
diff changeset
1692 if (s->interlaced_dct) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1693 dct_linesize = s->linesize * 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1694 dct_offset = s->linesize;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1695 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1696 dct_linesize = s->linesize;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1697 dct_offset = s->linesize * 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1698 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1699
986e461dc072 Initial revision
glantau
parents:
diff changeset
1700 if (!s->mb_intra) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1701 /* motion handling */
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1702 /* decoding or more than one mb_type (MC was allready done otherwise) */
481
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1703 if((!s->encoding) || (s->mb_type[mb_xy]&(s->mb_type[mb_xy]-1))){
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
1704 if ((!s->no_rounding) || s->pict_type==B_TYPE){
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1705 op_pix = put_pixels_tab;
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1706 op_qpix= put_qpel_pixels_tab;
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1707 }else{
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1708 op_pix = put_no_rnd_pixels_tab;
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1709 op_qpix= put_no_rnd_qpel_pixels_tab;
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1710 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1711
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1712 if (s->mv_dir & MV_DIR_FORWARD) {
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1713 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture, op_pix, op_qpix);
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1714 op_pix = avg_pixels_tab;
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
1715 op_qpix= avg_qpel_pixels_tab;
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1716 }
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1717 if (s->mv_dir & MV_DIR_BACKWARD) {
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1718 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture, op_pix, op_qpix);
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1719 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1720 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1721
481
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1722 /* skip dequant / idct if we are really late ;) */
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1723 if(s->hurry_up>1) goto the_end;
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1724
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1725 /* add dct residue */
591
d3f374218030 fixing mpeg4 mpeg quantizers
michaelni
parents: 588
diff changeset
1726 if(s->encoding || !(s->mpeg2 || s->h263_msmpeg4 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
481
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1727 add_dequant_dct(s, block[0], 0, dest_y, dct_linesize);
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1728 add_dequant_dct(s, block[1], 1, dest_y + 8, dct_linesize);
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1729 add_dequant_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1730 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1731
485
20108840b0e5 grayscale only decoding
michaelni
parents: 481
diff changeset
1732 if(!(s->flags&CODEC_FLAG_GRAY)){
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1733 add_dequant_dct(s, block[4], 4, dest_cb, s->uvlinesize);
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1734 add_dequant_dct(s, block[5], 5, dest_cr, s->uvlinesize);
485
20108840b0e5 grayscale only decoding
michaelni
parents: 481
diff changeset
1735 }
481
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1736 } else {
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1737 add_dct(s, block[0], 0, dest_y, dct_linesize);
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1738 add_dct(s, block[1], 1, dest_y + 8, dct_linesize);
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1739 add_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1740 add_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1741
485
20108840b0e5 grayscale only decoding
michaelni
parents: 481
diff changeset
1742 if(!(s->flags&CODEC_FLAG_GRAY)){
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1743 add_dct(s, block[4], 4, dest_cb, s->uvlinesize);
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1744 add_dct(s, block[5], 5, dest_cr, s->uvlinesize);
485
20108840b0e5 grayscale only decoding
michaelni
parents: 481
diff changeset
1745 }
481
29a7e17d19dd optimizing MPV_decode_mb
michaelni
parents: 478
diff changeset
1746 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1747 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1748 /* dct only in intra block */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1749 put_dct(s, block[0], 0, dest_y, dct_linesize);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1750 put_dct(s, block[1], 1, dest_y + 8, dct_linesize);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1751 put_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1752 put_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1753
485
20108840b0e5 grayscale only decoding
michaelni
parents: 481
diff changeset
1754 if(!(s->flags&CODEC_FLAG_GRAY)){
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1755 put_dct(s, block[4], 4, dest_cb, s->uvlinesize);
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
1756 put_dct(s, block[5], 5, dest_cr, s->uvlinesize);
485
20108840b0e5 grayscale only decoding
michaelni
parents: 481
diff changeset
1757 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1758 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1759 }
7
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
1760 the_end:
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
1761 emms_c(); //FIXME remove
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
1762 }
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
1763
605
40874804a5af same dc skip behavior for chroma & luma elimination, its confusing otherwise imho
michaelni
parents: 604
diff changeset
1764 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1765 {
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1766 static const char tab[64]=
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1767 {3,2,2,1,1,1,1,1,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1768 1,1,1,1,1,1,1,1,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1769 1,1,1,1,1,1,1,1,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1770 0,0,0,0,0,0,0,0,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1771 0,0,0,0,0,0,0,0,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1772 0,0,0,0,0,0,0,0,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1773 0,0,0,0,0,0,0,0,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1774 0,0,0,0,0,0,0,0};
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1775 int score=0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1776 int run=0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1777 int i;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1778 DCTELEM *block= s->block[n];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1779 const int last_index= s->block_last_index[n];
605
40874804a5af same dc skip behavior for chroma & luma elimination, its confusing otherwise imho
michaelni
parents: 604
diff changeset
1780 int skip_dc;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1781
604
4344cc8033bd skip blocks with small chroma dc too (if the user wants it) needed to avoid IDCT(input coeffs !=0) == 0 problems which cause catastrophic error accumulation at qp=1
michaelni
parents: 599
diff changeset
1782 if(threshold<0){
4344cc8033bd skip blocks with small chroma dc too (if the user wants it) needed to avoid IDCT(input coeffs !=0) == 0 problems which cause catastrophic error accumulation at qp=1
michaelni
parents: 599
diff changeset
1783 skip_dc=0;
4344cc8033bd skip blocks with small chroma dc too (if the user wants it) needed to avoid IDCT(input coeffs !=0) == 0 problems which cause catastrophic error accumulation at qp=1
michaelni
parents: 599
diff changeset
1784 threshold= -threshold;
605
40874804a5af same dc skip behavior for chroma & luma elimination, its confusing otherwise imho
michaelni
parents: 604
diff changeset
1785 }else
40874804a5af same dc skip behavior for chroma & luma elimination, its confusing otherwise imho
michaelni
parents: 604
diff changeset
1786 skip_dc=1;
604
4344cc8033bd skip blocks with small chroma dc too (if the user wants it) needed to avoid IDCT(input coeffs !=0) == 0 problems which cause catastrophic error accumulation at qp=1
michaelni
parents: 599
diff changeset
1787
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1788 /* are all which we could set to zero are allready zero? */
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1789 if(last_index<=skip_dc - 1) return;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1790
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1791 for(i=0; i<=last_index; i++){
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1792 const int j = s->intra_scantable.permutated[i];
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1793 const int level = ABS(block[j]);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1794 if(level==1){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1795 if(skip_dc && i==0) continue;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1796 score+= tab[run];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1797 run=0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1798 }else if(level>1){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1799 return;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1800 }else{
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1801 run++;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1802 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1803 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1804 if(score >= threshold) return;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1805 for(i=skip_dc; i<=last_index; i++){
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1806 const int j = s->intra_scantable.permutated[i];
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1807 block[j]=0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1808 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1809 if(block[0]) s->block_last_index[n]= 0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1810 else s->block_last_index[n]= -1;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1811 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1812
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
1813 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
1814 {
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
1815 int i;
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
1816 const int maxlevel= s->max_qcoeff;
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
1817 const int minlevel= s->min_qcoeff;
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1818
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1819 if(s->mb_intra){
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1820 i=1; //skip clipping of intra dc
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1821 }else
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1822 i=0;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1823
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1824 for(;i<=last_index; i++){
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1825 const int j= s->intra_scantable.permutated[i];
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
1826 int level = block[j];
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
1827
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
1828 if (level>maxlevel) level=maxlevel;
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
1829 else if(level<minlevel) level=minlevel;
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
1830 block[j]= level;
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
1831 }
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
1832 }
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1833
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1834 static inline void requantize_coeffs(MpegEncContext *s, DCTELEM block[64], int oldq, int newq, int n)
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1835 {
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1836 int i;
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1837
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1838 if(s->mb_intra){
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1839 i=1; //skip clipping of intra dc
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1840 //FIXME requantize, note (mpeg1/h263/h263p-aic dont need it,...)
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1841 }else
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1842 i=0;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1843
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1844 for(;i<=s->block_last_index[n]; i++){
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1845 const int j = s->intra_scantable.permutated[i];
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1846 int level = block[j];
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1847
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1848 block[j]= ROUNDED_DIV(level*oldq, newq);
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1849 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1850
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1851 for(i=s->block_last_index[n]; i>=0; i--){
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1852 const int j = s->intra_scantable.permutated[i];
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1853 if(block[j]) break;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1854 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1855 s->block_last_index[n]= i;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1856 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1857
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1858 static inline void auto_requantize_coeffs(MpegEncContext *s, DCTELEM block[6][64])
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1859 {
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1860 int i,n, newq;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1861 const int maxlevel= s->max_qcoeff;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1862 const int minlevel= s->min_qcoeff;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1863 int largest=0, smallest=0;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1864
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1865 assert(s->adaptive_quant);
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1866
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1867 for(n=0; n<6; n++){
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1868 if(s->mb_intra){
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1869 i=1; //skip clipping of intra dc
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1870 //FIXME requantize, note (mpeg1/h263/h263p-aic dont need it,...)
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1871 }else
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1872 i=0;
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1873
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1874 for(;i<=s->block_last_index[n]; i++){
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
1875 const int j = s->intra_scantable.permutated[i];
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1876 int level = block[n][j];
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1877 if(largest < level) largest = level;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1878 if(smallest > level) smallest= level;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1879 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1880 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1881
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1882 for(newq=s->qscale+1; newq<32; newq++){
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1883 if( ROUNDED_DIV(smallest*s->qscale, newq) >= minlevel
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1884 && ROUNDED_DIV(largest *s->qscale, newq) <= maxlevel)
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1885 break;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1886 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1887
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1888 if(s->out_format==FMT_H263){
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1889 /* h263 like formats cannot change qscale by more than 2 easiely */
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1890 if(s->avctx->qmin + 2 < newq)
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1891 newq= s->avctx->qmin + 2;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1892 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1893
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1894 for(n=0; n<6; n++){
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1895 requantize_coeffs(s, block[n], s->qscale, newq, n);
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1896 clip_coeffs(s, block[n], s->block_last_index[n]);
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1897 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1898
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1899 s->dquant+= newq - s->qscale;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1900 s->qscale= newq;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1901 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1902 #if 0
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1903 static int pix_vcmp16x8(UINT8 *s, int stride){ //FIXME move to dsputil & optimize
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1904 int score=0;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1905 int x,y;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1906
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1907 for(y=0; y<7; y++){
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1908 for(x=0; x<16; x+=4){
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1909 score+= ABS(s[x ] - s[x +stride]) + ABS(s[x+1] - s[x+1+stride])
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1910 +ABS(s[x+2] - s[x+2+stride]) + ABS(s[x+3] - s[x+3+stride]);
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1911 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1912 s+= stride;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1913 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1914
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1915 return score;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1916 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1917
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1918 static int pix_diff_vcmp16x8(UINT8 *s1, UINT8*s2, int stride){ //FIXME move to dsputil & optimize
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1919 int score=0;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1920 int x,y;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1921
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1922 for(y=0; y<7; y++){
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1923 for(x=0; x<16; x++){
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1924 score+= ABS(s1[x ] - s2[x ] - s1[x +stride] + s2[x +stride]);
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1925 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1926 s1+= stride;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1927 s2+= stride;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1928 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1929
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1930 return score;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1931 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1932 #else
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1933 #define SQ(a) ((a)*(a))
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1934
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1935 static int pix_vcmp16x8(UINT8 *s, int stride){ //FIXME move to dsputil & optimize
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1936 int score=0;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1937 int x,y;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1938
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1939 for(y=0; y<7; y++){
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1940 for(x=0; x<16; x+=4){
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1941 score+= SQ(s[x ] - s[x +stride]) + SQ(s[x+1] - s[x+1+stride])
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1942 +SQ(s[x+2] - s[x+2+stride]) + SQ(s[x+3] - s[x+3+stride]);
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1943 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1944 s+= stride;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1945 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1946
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1947 return score;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1948 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1949
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1950 static int pix_diff_vcmp16x8(UINT8 *s1, UINT8*s2, int stride){ //FIXME move to dsputil & optimize
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1951 int score=0;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1952 int x,y;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1953
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1954 for(y=0; y<7; y++){
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1955 for(x=0; x<16; x++){
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1956 score+= SQ(s1[x ] - s2[x ] - s1[x +stride] + s2[x +stride]);
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1957 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1958 s1+= stride;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1959 s2+= stride;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1960 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1961
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1962 return score;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1963 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1964
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1965 #endif
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1966 static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
1967 {
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
1968 const int mb_x= s->mb_x;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
1969 const int mb_y= s->mb_y;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
1970 int i;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1971 int skip_dct[6];
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1972 int dct_offset = s->linesize*8; //default for progressive frames
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1973
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
1974 for(i=0; i<6; i++) skip_dct[i]=0;
690
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
1975
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
1976 if(s->adaptive_quant){
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
1977 s->dquant= s->qscale_table[mb_x + mb_y*s->mb_width] - s->qscale;
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1978
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1979 if(s->out_format==FMT_H263){
690
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
1980 if (s->dquant> 2) s->dquant= 2;
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
1981 else if(s->dquant<-2) s->dquant=-2;
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1982 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1983
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1984 if(s->codec_id==CODEC_ID_MPEG4){
690
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
1985 if(!s->mb_intra){
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
1986 assert(s->dquant==0 || s->mv_type!=MV_TYPE_8X8);
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
1987
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
1988 if(s->mv_dir&MV_DIRECT)
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
1989 s->dquant=0;
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
1990 }
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
1991 }
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
1992 s->qscale+= s->dquant;
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
1993 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
1994 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
1995 }
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
1996
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1997 if (s->mb_intra) {
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
1998 UINT8 *ptr;
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
1999 int wrap_y;
570
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2000 int emu=0;
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2001
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2002 wrap_y = s->linesize;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2003 ptr = s->new_picture[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2004
570
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2005 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2006 emulated_edge_mc(s, ptr, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height);
570
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2007 ptr= s->edge_emu_buffer;
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2008 emu=1;
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2009 }
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2010
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2011 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2012 int progressive_score, interlaced_score;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2013
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2014 progressive_score= pix_vcmp16x8(ptr, wrap_y ) + pix_vcmp16x8(ptr + wrap_y*8, wrap_y );
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2015 interlaced_score = pix_vcmp16x8(ptr, wrap_y*2) + pix_vcmp16x8(ptr + wrap_y , wrap_y*2);
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2016
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2017 if(progressive_score > interlaced_score + 100){
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2018 s->interlaced_dct=1;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2019
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2020 dct_offset= wrap_y;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2021 wrap_y<<=1;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2022 }else
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2023 s->interlaced_dct=0;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2024 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2025
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2026 get_pixels(s->block[0], ptr , wrap_y);
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2027 get_pixels(s->block[1], ptr + 8, wrap_y);
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2028 get_pixels(s->block[2], ptr + dct_offset , wrap_y);
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2029 get_pixels(s->block[3], ptr + dct_offset + 8, wrap_y);
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2030
487
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2031 if(s->flags&CODEC_FLAG_GRAY){
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2032 skip_dct[4]= 1;
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2033 skip_dct[5]= 1;
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2034 }else{
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2035 int wrap_c = s->uvlinesize;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2036 ptr = s->new_picture[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
570
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2037 if(emu){
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2038 emulated_edge_mc(s, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
570
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2039 ptr= s->edge_emu_buffer;
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2040 }
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2041 get_pixels(s->block[4], ptr, wrap_c);
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2042
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2043 ptr = s->new_picture[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
570
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2044 if(emu){
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2045 emulated_edge_mc(s, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
570
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2046 ptr= s->edge_emu_buffer;
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2047 }
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2048 get_pixels(s->block[5], ptr, wrap_c);
487
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2049 }
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2050 }else{
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
2051 op_pixels_func (*op_pix)[4];
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
2052 qpel_mc_func (*op_qpix)[16];
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2053 UINT8 *dest_y, *dest_cb, *dest_cr;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2054 UINT8 *ptr_y, *ptr_cb, *ptr_cr;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2055 int wrap_y, wrap_c;
570
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2056 int emu=0;
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2057
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2058 dest_y = s->current_picture[0] + (mb_y * 16 * s->linesize ) + mb_x * 16;
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
2059 dest_cb = s->current_picture[1] + (mb_y * 8 * (s->uvlinesize)) + mb_x * 8;
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
2060 dest_cr = s->current_picture[2] + (mb_y * 8 * (s->uvlinesize)) + mb_x * 8;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2061 wrap_y = s->linesize;
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2062 wrap_c = s->uvlinesize;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2063 ptr_y = s->new_picture[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2064 ptr_cb = s->new_picture[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2065 ptr_cr = s->new_picture[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2066
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2067 if ((!s->no_rounding) || s->pict_type==B_TYPE){
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2068 op_pix = put_pixels_tab;
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
2069 op_qpix= put_qpel_pixels_tab;
295
6622b0fd036c mpeg4 4MV encoding
michaelni
parents: 294
diff changeset
2070 }else{
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2071 op_pix = put_no_rnd_pixels_tab;
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
2072 op_qpix= put_no_rnd_qpel_pixels_tab;
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2073 }
295
6622b0fd036c mpeg4 4MV encoding
michaelni
parents: 294
diff changeset
2074
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2075 if (s->mv_dir & MV_DIR_FORWARD) {
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2076 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture, op_pix, op_qpix);
651
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
2077 op_pix = avg_pixels_tab;
45e8f39fda50 put/avg_pixels16
michaelni
parents: 650
diff changeset
2078 op_qpix= avg_qpel_pixels_tab;
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2079 }
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2080 if (s->mv_dir & MV_DIR_BACKWARD) {
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2081 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture, op_pix, op_qpix);
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2082 }
295
6622b0fd036c mpeg4 4MV encoding
michaelni
parents: 294
diff changeset
2083
570
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2084 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2085 emulated_edge_mc(s, ptr_y, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height);
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2086 ptr_y= s->edge_emu_buffer;
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2087 emu=1;
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2088 }
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2089
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2090 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2091 int progressive_score, interlaced_score;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2092
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2093 progressive_score= pix_diff_vcmp16x8(ptr_y , dest_y , wrap_y )
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2094 + pix_diff_vcmp16x8(ptr_y + wrap_y*8, dest_y + wrap_y*8, wrap_y );
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2095 interlaced_score = pix_diff_vcmp16x8(ptr_y , dest_y , wrap_y*2)
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2096 + pix_diff_vcmp16x8(ptr_y + wrap_y , dest_y + wrap_y , wrap_y*2);
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2097
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2098 if(progressive_score > interlaced_score + 600){
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2099 s->interlaced_dct=1;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2100
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2101 dct_offset= wrap_y;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2102 wrap_y<<=1;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2103 }else
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2104 s->interlaced_dct=0;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2105 }
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2106
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2107 diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2108 diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2109 diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2110 diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
487
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2111
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2112 if(s->flags&CODEC_FLAG_GRAY){
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2113 skip_dct[4]= 1;
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2114 skip_dct[5]= 1;
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2115 }else{
570
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2116 if(emu){
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2117 emulated_edge_mc(s, ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2118 ptr_cb= s->edge_emu_buffer;
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2119 }
487
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2120 diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
570
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2121 if(emu){
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2122 emulated_edge_mc(s, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2123 ptr_cr= s->edge_emu_buffer;
274d9c5a75ee use edge emu for encoding of width or height %16!=0 files
michaelni
parents: 569
diff changeset
2124 }
487
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2125 diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2126 }
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2127
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2128 /* pre quantization */
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2129 if(s->mc_mb_var[s->mb_width*mb_y+ mb_x]<2*s->qscale*s->qscale){
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2130 //FIXME optimize
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2131 if(pix_abs8x8(ptr_y , dest_y , wrap_y) < 20*s->qscale) skip_dct[0]= 1;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2132 if(pix_abs8x8(ptr_y + 8, dest_y + 8, wrap_y) < 20*s->qscale) skip_dct[1]= 1;
697
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2133 if(pix_abs8x8(ptr_y +dct_offset , dest_y +dct_offset , wrap_y) < 20*s->qscale) skip_dct[2]= 1;
c622224012f0 mpeg4 interlaced dct encoding
michaelni
parents: 695
diff changeset
2134 if(pix_abs8x8(ptr_y +dct_offset+ 8, dest_y +dct_offset+ 8, wrap_y) < 20*s->qscale) skip_dct[3]= 1;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2135 if(pix_abs8x8(ptr_cb , dest_cb , wrap_y) < 20*s->qscale) skip_dct[4]= 1;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2136 if(pix_abs8x8(ptr_cr , dest_cr , wrap_y) < 20*s->qscale) skip_dct[5]= 1;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2137 #if 0
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2138 {
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2139 static int stat[7];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2140 int num=0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2141 for(i=0; i<6; i++)
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2142 if(skip_dct[i]) num++;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2143 stat[num]++;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2144
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2145 if(s->mb_x==0 && s->mb_y==0){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2146 for(i=0; i<7; i++){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2147 printf("%6d %1d\n", stat[i], i);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2148 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2149 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2150 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2151 #endif
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2152 }
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2153
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2154 }
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2155
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2156 #if 0
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2157 {
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2158 float adap_parm;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2159
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2160 adap_parm = ((s->avg_mb_var << 1) + s->mb_var[s->mb_width*mb_y+mb_x] + 1.0) /
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2161 ((s->mb_var[s->mb_width*mb_y+mb_x] << 1) + s->avg_mb_var + 1.0);
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2162
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2163 printf("\ntype=%c qscale=%2d adap=%0.2f dquant=%4.2f var=%4d avgvar=%4d",
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2164 (s->mb_type[s->mb_width*mb_y+mb_x] > 0) ? 'I' : 'P',
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2165 s->qscale, adap_parm, s->qscale*adap_parm,
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2166 s->mb_var[s->mb_width*mb_y+mb_x], s->avg_mb_var);
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2167 }
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2168 #endif
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2169 /* DCT & quantize */
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2170 if(s->out_format==FMT_MJPEG){
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2171 for(i=0;i<6;i++) {
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2172 int overflow;
625
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
2173 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, 8, &overflow);
350
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 347
diff changeset
2174 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2175 }
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2176 }else{
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2177 for(i=0;i<6;i++) {
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2178 if(!skip_dct[i]){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2179 int overflow;
625
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
2180 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2181 // FIXME we could decide to change to quantizer instead of clipping
350
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 347
diff changeset
2182 // JS: I don't think that would be a good idea it could lower quality instead
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 347
diff changeset
2183 // of improve it. Just INTRADC clipping deserves changes in quantizer
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2184 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2185 }else
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2186 s->block_last_index[i]= -1;
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2187 }
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2188 if(s->luma_elim_threshold && !s->mb_intra)
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2189 for(i=0; i<4; i++)
605
40874804a5af same dc skip behavior for chroma & luma elimination, its confusing otherwise imho
michaelni
parents: 604
diff changeset
2190 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2191 if(s->chroma_elim_threshold && !s->mb_intra)
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2192 for(i=4; i<6; i++)
605
40874804a5af same dc skip behavior for chroma & luma elimination, its confusing otherwise imho
michaelni
parents: 604
diff changeset
2193 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2194 }
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2195
487
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2196 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2197 s->block_last_index[4]=
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2198 s->block_last_index[5]= 0;
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2199 s->block[4][0]=
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2200 s->block[5][0]= 128;
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2201 }
cee02f2f4a5a grayscale only encoding
michaelni
parents: 485
diff changeset
2202
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2203 /* huffman encode */
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2204 switch(s->out_format) {
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2205 case FMT_MPEG1:
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2206 mpeg1_encode_mb(s, s->block, motion_x, motion_y);
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2207 break;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2208 case FMT_H263:
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2209 if (s->h263_msmpeg4)
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2210 msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2211 else if(s->h263_pred)
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2212 mpeg4_encode_mb(s, s->block, motion_x, motion_y);
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2213 else
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2214 h263_encode_mb(s, s->block, motion_x, motion_y);
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2215 break;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2216 case FMT_MJPEG:
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2217 mjpeg_encode_mb(s, s->block);
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2218 break;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2219 }
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2220 }
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2221
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2222 void ff_copy_bits(PutBitContext *pb, UINT8 *src, int length)
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2223 {
326
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2224 int bytes= length>>4;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2225 int bits= length&15;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2226 int i;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2227
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2228 if(length==0) return;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2229
326
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2230 for(i=0; i<bytes; i++) put_bits(pb, 16, be2me_16(((uint16_t*)src)[i]));
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2231 put_bits(pb, bits, be2me_16(((uint16_t*)src)[i])>>(16-bits));
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2232 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2233
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2234 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
326
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2235 int i;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2236
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2237 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2238
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2239 /* mpeg1 */
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2240 d->mb_incr= s->mb_incr;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2241 for(i=0; i<3; i++)
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2242 d->last_dc[i]= s->last_dc[i];
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2243
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2244 /* statistics */
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2245 d->mv_bits= s->mv_bits;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2246 d->i_tex_bits= s->i_tex_bits;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2247 d->p_tex_bits= s->p_tex_bits;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2248 d->i_count= s->i_count;
656
e47fa3e3f2d5 statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents: 652
diff changeset
2249 d->f_count= s->f_count;
e47fa3e3f2d5 statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents: 652
diff changeset
2250 d->b_count= s->b_count;
326
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2251 d->skip_count= s->skip_count;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2252 d->misc_bits= s->misc_bits;
329
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
2253 d->last_bits= 0;
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2254
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2255 d->mb_skiped= s->mb_skiped;
326
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2256 }
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2257
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2258 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
326
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2259 int i;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2260
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2261 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2262 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2263
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2264 /* mpeg1 */
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2265 d->mb_incr= s->mb_incr;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2266 for(i=0; i<3; i++)
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2267 d->last_dc[i]= s->last_dc[i];
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2268
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2269 /* statistics */
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2270 d->mv_bits= s->mv_bits;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2271 d->i_tex_bits= s->i_tex_bits;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2272 d->p_tex_bits= s->p_tex_bits;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2273 d->i_count= s->i_count;
656
e47fa3e3f2d5 statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents: 652
diff changeset
2274 d->f_count= s->f_count;
e47fa3e3f2d5 statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents: 652
diff changeset
2275 d->b_count= s->b_count;
326
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2276 d->skip_count= s->skip_count;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2277 d->misc_bits= s->misc_bits;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2278
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2279 d->mb_intra= s->mb_intra;
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2280 d->mb_skiped= s->mb_skiped;
326
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2281 d->mv_type= s->mv_type;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2282 d->mv_dir= s->mv_dir;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2283 d->pb= s->pb;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2284 if(s->data_partitioning){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2285 d->pb2= s->pb2;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2286 d->tex_pb= s->tex_pb;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2287 }
326
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2288 d->block= s->block;
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2289 for(i=0; i<6; i++)
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2290 d->block_last_index[i]= s->block_last_index[i];
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2291 }
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2292
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2293 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2294 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2295 int *dmin, int *next_block, int motion_x, int motion_y)
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2296 {
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2297 int bits_count;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2298
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2299 copy_context_before_encode(s, backup, type);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2300
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2301 s->block= s->blocks[*next_block];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2302 s->pb= pb[*next_block];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2303 if(s->data_partitioning){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2304 s->pb2 = pb2 [*next_block];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2305 s->tex_pb= tex_pb[*next_block];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2306 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2307
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2308 encode_mb(s, motion_x, motion_y);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2309
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2310 bits_count= get_bit_count(&s->pb);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2311 if(s->data_partitioning){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2312 bits_count+= get_bit_count(&s->pb2);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2313 bits_count+= get_bit_count(&s->tex_pb);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2314 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2315
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2316 if(bits_count<*dmin){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2317 *dmin= bits_count;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2318 *next_block^=1;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2319
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2320 copy_context_after_encode(best, s, type);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2321 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2322 }
326
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2323
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2324 static void encode_picture(MpegEncContext *s, int picture_number)
986e461dc072 Initial revision
glantau
parents:
diff changeset
2325 {
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2326 int mb_x, mb_y, last_gob, pdif = 0;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2327 int i;
286
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
2328 int bits;
326
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2329 MpegEncContext best_s, backup_s;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2330 UINT8 bit_buf[2][3000];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2331 UINT8 bit_buf2[2][3000];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2332 UINT8 bit_buf_tex[2][3000];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2333 PutBitContext pb[2], pb2[2], tex_pb[2];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2334
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2335 for(i=0; i<2; i++){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2336 init_put_bits(&pb [i], bit_buf [i], 3000, NULL, NULL);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2337 init_put_bits(&pb2 [i], bit_buf2 [i], 3000, NULL, NULL);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2338 init_put_bits(&tex_pb[i], bit_buf_tex[i], 3000, NULL, NULL);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2339 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2340
986e461dc072 Initial revision
glantau
parents:
diff changeset
2341 s->picture_number = picture_number;
268
09ae29b27ed9 hopefully better bitrate controll
michaelni
parents: 266
diff changeset
2342
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2343 s->block_wrap[0]=
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2344 s->block_wrap[1]=
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2345 s->block_wrap[2]=
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2346 s->block_wrap[3]= s->mb_width*2 + 2;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2347 s->block_wrap[4]=
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2348 s->block_wrap[5]= s->mb_width + 2;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2349
268
09ae29b27ed9 hopefully better bitrate controll
michaelni
parents: 266
diff changeset
2350 /* Reset the average MB variance */
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2351 s->mb_var_sum = 0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2352 s->mc_mb_var_sum = 0;
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2353
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2354 /* we need to initialize some time vars before we can encode b-frames */
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2355 if (s->h263_pred && !s->h263_msmpeg4)
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2356 ff_set_mpeg4_time(s, s->picture_number);
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2357
608
98e39397636b better scene change detection
michaelni
parents: 605
diff changeset
2358 s->scene_change_score=0;
690
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
2359
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
2360 s->qscale= (int)(s->frame_qscale + 0.5); //FIXME qscale / ... stuff for ME ratedistoration
608
98e39397636b better scene change detection
michaelni
parents: 605
diff changeset
2361
268
09ae29b27ed9 hopefully better bitrate controll
michaelni
parents: 266
diff changeset
2362 /* Estimate motion for every MB */
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2363 if(s->pict_type != I_TYPE){
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2364 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2365 s->block_index[0]= s->block_wrap[0]*(mb_y*2 + 1) - 1;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2366 s->block_index[1]= s->block_wrap[0]*(mb_y*2 + 1);
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2367 s->block_index[2]= s->block_wrap[0]*(mb_y*2 + 2) - 1;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2368 s->block_index[3]= s->block_wrap[0]*(mb_y*2 + 2);
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2369 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2370 s->mb_x = mb_x;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2371 s->mb_y = mb_y;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2372 s->block_index[0]+=2;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2373 s->block_index[1]+=2;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2374 s->block_index[2]+=2;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2375 s->block_index[3]+=2;
268
09ae29b27ed9 hopefully better bitrate controll
michaelni
parents: 266
diff changeset
2376
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2377 /* compute motion vector & mb_type and store in context */
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2378 if(s->pict_type==B_TYPE)
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2379 ff_estimate_b_frame_motion(s, mb_x, mb_y);
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2380 else
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2381 ff_estimate_p_frame_motion(s, mb_x, mb_y);
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2382 // s->mb_type[mb_y*s->mb_width + mb_x]=MB_TYPE_INTER;
268
09ae29b27ed9 hopefully better bitrate controll
michaelni
parents: 266
diff changeset
2383 }
09ae29b27ed9 hopefully better bitrate controll
michaelni
parents: 266
diff changeset
2384 }
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2385 emms_c();
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2386 }else /* if(s->pict_type == I_TYPE) */{
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2387 /* I-Frame */
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2388 //FIXME do we need to zero them?
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2389 memset(s->motion_val[0], 0, sizeof(INT16)*(s->mb_width*2 + 2)*(s->mb_height*2 + 2)*2);
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2390 memset(s->p_mv_table , 0, sizeof(INT16)*(s->mb_width+2)*(s->mb_height+2)*2);
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2391 memset(s->mb_type , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height);
612
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2392
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2393 if(!s->fixed_qscale){
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2394 /* finding spatial complexity for I-frame rate control */
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2395 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2396 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2397 int xx = mb_x * 16;
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2398 int yy = mb_y * 16;
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2399 uint8_t *pix = s->new_picture[0] + (yy * s->linesize) + xx;
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2400 int varc;
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2401 int sum = pix_sum(pix, s->linesize);
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2402
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2403 sum= (sum+8)>>4;
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2404 varc = (pix_norm1(pix, s->linesize) - sum*sum + 500 + 128)>>8;
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2405
690
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
2406 s->mb_var [s->mb_width * mb_y + mb_x] = varc;
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
2407 s->mb_mean[s->mb_width * mb_y + mb_x] = (sum+7)>>4;
612
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2408 s->mb_var_sum += varc;
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2409 }
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2410 }
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2411 }
268
09ae29b27ed9 hopefully better bitrate controll
michaelni
parents: 266
diff changeset
2412 }
608
98e39397636b better scene change detection
michaelni
parents: 605
diff changeset
2413 if(s->scene_change_score > 0 && s->pict_type == P_TYPE){
271
997aac7d4e3e scene change detection
michaelni
parents: 270
diff changeset
2414 s->pict_type= I_TYPE;
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2415 memset(s->mb_type , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height);
329
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
2416 if(s->max_b_frames==0){
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
2417 s->input_pict_type= I_TYPE;
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
2418 s->input_picture_in_gop_number=0;
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
2419 }
612
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
2420 //printf("Scene change detected, encoding as I Frame %d %d\n", s->mb_var_sum, s->mc_mb_var_sum);
271
997aac7d4e3e scene change detection
michaelni
parents: 270
diff changeset
2421 }
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2422
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2423 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE)
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2424 s->f_code= ff_get_best_fcode(s, s->p_mv_table, MB_TYPE_INTER);
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2425 ff_fix_long_p_mvs(s);
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2426 if(s->pict_type==B_TYPE){
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2427 s->f_code= ff_get_best_fcode(s, s->b_forw_mv_table, MB_TYPE_FORWARD);
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2428 s->b_code= ff_get_best_fcode(s, s->b_back_mv_table, MB_TYPE_BACKWARD);
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2429
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2430 ff_fix_long_b_mvs(s, s->b_forw_mv_table, s->f_code, MB_TYPE_FORWARD);
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2431 ff_fix_long_b_mvs(s, s->b_back_mv_table, s->b_code, MB_TYPE_BACKWARD);
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2432 ff_fix_long_b_mvs(s, s->b_bidir_forw_mv_table, s->f_code, MB_TYPE_BIDIR);
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2433 ff_fix_long_b_mvs(s, s->b_bidir_back_mv_table, s->b_code, MB_TYPE_BIDIR);
277
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
2434 }
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2435
690
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
2436 if (s->fixed_qscale)
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
2437 s->frame_qscale = s->avctx->quality;
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
2438 else
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
2439 s->frame_qscale = ff_rate_estimate_qscale(s);
277
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 271
diff changeset
2440
695
3525da287ee2 adaptive quantization for h263
michaelni
parents: 693
diff changeset
2441 if(s->adaptive_quant){
3525da287ee2 adaptive quantization for h263
michaelni
parents: 693
diff changeset
2442 switch(s->codec_id){
3525da287ee2 adaptive quantization for h263
michaelni
parents: 693
diff changeset
2443 case CODEC_ID_MPEG4:
3525da287ee2 adaptive quantization for h263
michaelni
parents: 693
diff changeset
2444 ff_clean_mpeg4_qscales(s);
3525da287ee2 adaptive quantization for h263
michaelni
parents: 693
diff changeset
2445 break;
3525da287ee2 adaptive quantization for h263
michaelni
parents: 693
diff changeset
2446 case CODEC_ID_H263:
3525da287ee2 adaptive quantization for h263
michaelni
parents: 693
diff changeset
2447 case CODEC_ID_H263P:
3525da287ee2 adaptive quantization for h263
michaelni
parents: 693
diff changeset
2448 ff_clean_h263_qscales(s);
3525da287ee2 adaptive quantization for h263
michaelni
parents: 693
diff changeset
2449 break;
3525da287ee2 adaptive quantization for h263
michaelni
parents: 693
diff changeset
2450 }
3525da287ee2 adaptive quantization for h263
michaelni
parents: 693
diff changeset
2451
690
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
2452 s->qscale= s->qscale_table[0];
695
3525da287ee2 adaptive quantization for h263
michaelni
parents: 693
diff changeset
2453 }else
690
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
2454 s->qscale= (int)(s->frame_qscale + 0.5);
a1c69cb685b3 adaptive quantization (lumi/temporal & spatial complexity masking)
michaelni
parents: 673
diff changeset
2455
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2456 if (s->out_format == FMT_MJPEG) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2457 /* for mjpeg, we do include qscale in the matrix */
533
3c07cf9595de adding ff prefix to avoid global name conficts with xvid (patch by Marko Kreen <marko at l-t.ee>)
michaelni
parents: 514
diff changeset
2458 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2459 for(i=1;i<64;i++){
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2460 int j= s->idct_permutation[i];
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2461
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2462 s->intra_matrix[j] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2463 }
625
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
2464 convert_matrix(s, s->q_intra_matrix, s->q_intra_matrix16,
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2465 s->q_intra_matrix16_bias, s->intra_matrix, s->intra_quant_bias);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2466 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2467
286
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
2468 s->last_bits= get_bit_count(&s->pb);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2469 switch(s->out_format) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2470 case FMT_MJPEG:
986e461dc072 Initial revision
glantau
parents:
diff changeset
2471 mjpeg_picture_header(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
2472 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2473 case FMT_H263:
986e461dc072 Initial revision
glantau
parents:
diff changeset
2474 if (s->h263_msmpeg4)
986e461dc072 Initial revision
glantau
parents:
diff changeset
2475 msmpeg4_encode_picture_header(s, picture_number);
986e461dc072 Initial revision
glantau
parents:
diff changeset
2476 else if (s->h263_pred)
986e461dc072 Initial revision
glantau
parents:
diff changeset
2477 mpeg4_encode_picture_header(s, picture_number);
986e461dc072 Initial revision
glantau
parents:
diff changeset
2478 else if (s->h263_rv10)
986e461dc072 Initial revision
glantau
parents:
diff changeset
2479 rv10_encode_picture_header(s, picture_number);
986e461dc072 Initial revision
glantau
parents:
diff changeset
2480 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
2481 h263_encode_picture_header(s, picture_number);
986e461dc072 Initial revision
glantau
parents:
diff changeset
2482 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2483 case FMT_MPEG1:
986e461dc072 Initial revision
glantau
parents:
diff changeset
2484 mpeg1_encode_picture_header(s, picture_number);
986e461dc072 Initial revision
glantau
parents:
diff changeset
2485 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2486 }
286
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
2487 bits= get_bit_count(&s->pb);
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
2488 s->header_bits= bits - s->last_bits;
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
2489 s->last_bits= bits;
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
2490 s->mv_bits=0;
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
2491 s->misc_bits=0;
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
2492 s->i_tex_bits=0;
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
2493 s->p_tex_bits=0;
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
2494 s->i_count=0;
656
e47fa3e3f2d5 statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents: 652
diff changeset
2495 s->f_count=0;
e47fa3e3f2d5 statistics for forw & back p-MBs instead of just one counter for both
michaelni
parents: 652
diff changeset
2496 s->b_count=0;
286
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
2497 s->skip_count=0;
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
2498
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2499 /* init last dc values */
986e461dc072 Initial revision
glantau
parents:
diff changeset
2500 /* note: quant matrix value (8) is implied here */
986e461dc072 Initial revision
glantau
parents:
diff changeset
2501 s->last_dc[0] = 128;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2502 s->last_dc[1] = 128;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2503 s->last_dc[2] = 128;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2504 s->mb_incr = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2505 s->last_mv[0][0][0] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2506 s->last_mv[0][0][1] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2507
162
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
2508 /* Get the GOB height based on picture height */
231
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2509 if (s->out_format == FMT_H263 && !s->h263_pred && !s->h263_msmpeg4) {
162
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
2510 if (s->height <= 400)
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
2511 s->gob_index = 1;
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
2512 else if (s->height <= 800)
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
2513 s->gob_index = 2;
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
2514 else
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
2515 s->gob_index = 4;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2516 }else if(s->codec_id==CODEC_ID_MPEG4){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2517 s->gob_index = 1;
162
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
2518 }
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2519
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2520 if(s->codec_id==CODEC_ID_MPEG4 && s->data_partitioning && s->pict_type!=B_TYPE)
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2521 ff_mpeg4_init_partitions(s);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2522
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2523 s->resync_mb_x=0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2524 s->resync_mb_y=0;
233
3f5b72726118 - More work on preliminary bit rate control, just to be able to get an
pulento
parents: 232
diff changeset
2525 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2526 /* Put GOB header based on RTP MTU for formats which support it per line (H263*)*/
233
3f5b72726118 - More work on preliminary bit rate control, just to be able to get an
pulento
parents: 232
diff changeset
2527 /* TODO: Put all this stuff in a separate generic function */
3f5b72726118 - More work on preliminary bit rate control, just to be able to get an
pulento
parents: 232
diff changeset
2528 if (s->rtp_mode) {
3f5b72726118 - More work on preliminary bit rate control, just to be able to get an
pulento
parents: 232
diff changeset
2529 if (!mb_y) {
3f5b72726118 - More work on preliminary bit rate control, just to be able to get an
pulento
parents: 232
diff changeset
2530 s->ptr_lastgob = s->pb.buf;
3f5b72726118 - More work on preliminary bit rate control, just to be able to get an
pulento
parents: 232
diff changeset
2531 s->ptr_last_mb_line = s->pb.buf;
3f5b72726118 - More work on preliminary bit rate control, just to be able to get an
pulento
parents: 232
diff changeset
2532 } else if (s->out_format == FMT_H263 && !s->h263_pred && !s->h263_msmpeg4 && !(mb_y % s->gob_index)) {
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2533 // MN: we could move the space check from h263 -> here, as its not h263 specific
233
3f5b72726118 - More work on preliminary bit rate control, just to be able to get an
pulento
parents: 232
diff changeset
2534 last_gob = h263_encode_gob_header(s, mb_y);
3f5b72726118 - More work on preliminary bit rate control, just to be able to get an
pulento
parents: 232
diff changeset
2535 if (last_gob) {
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2536 s->first_slice_line = 1;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2537 }else{
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2538 /*MN: we reset it here instead at the end of each line cuz mpeg4 can have
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2539 slice lines starting & ending in the middle*/
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2540 s->first_slice_line = 0;
233
3f5b72726118 - More work on preliminary bit rate control, just to be able to get an
pulento
parents: 232
diff changeset
2541 }
3f5b72726118 - More work on preliminary bit rate control, just to be able to get an
pulento
parents: 232
diff changeset
2542 }
3f5b72726118 - More work on preliminary bit rate control, just to be able to get an
pulento
parents: 232
diff changeset
2543 }
499
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
2544
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
2545 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
2546 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
233
3f5b72726118 - More work on preliminary bit rate control, just to be able to get an
pulento
parents: 232
diff changeset
2547
266
252444e5259b optimization
michaelni
parents: 265
diff changeset
2548 s->block_index[0]= s->block_wrap[0]*(mb_y*2 + 1) - 1;
252444e5259b optimization
michaelni
parents: 265
diff changeset
2549 s->block_index[1]= s->block_wrap[0]*(mb_y*2 + 1);
252444e5259b optimization
michaelni
parents: 265
diff changeset
2550 s->block_index[2]= s->block_wrap[0]*(mb_y*2 + 2) - 1;
252444e5259b optimization
michaelni
parents: 265
diff changeset
2551 s->block_index[3]= s->block_wrap[0]*(mb_y*2 + 2);
252444e5259b optimization
michaelni
parents: 265
diff changeset
2552 s->block_index[4]= s->block_wrap[4]*(mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2);
252444e5259b optimization
michaelni
parents: 265
diff changeset
2553 s->block_index[5]= s->block_wrap[4]*(mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2);
232
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
2554 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2555 const int mb_type= s->mb_type[mb_y * s->mb_width + mb_x];
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2556 const int xy= (mb_y+1) * (s->mb_width+2) + mb_x + 1;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2557 // int d;
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2558 int dmin=10000000;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2559
232
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
2560 s->mb_x = mb_x;
b640ec5948b0 - Now the ME is done for the entire picture when enconding, the
pulento
parents: 231
diff changeset
2561 s->mb_y = mb_y;
266
252444e5259b optimization
michaelni
parents: 265
diff changeset
2562 s->block_index[0]+=2;
252444e5259b optimization
michaelni
parents: 265
diff changeset
2563 s->block_index[1]+=2;
252444e5259b optimization
michaelni
parents: 265
diff changeset
2564 s->block_index[2]+=2;
252444e5259b optimization
michaelni
parents: 265
diff changeset
2565 s->block_index[3]+=2;
252444e5259b optimization
michaelni
parents: 265
diff changeset
2566 s->block_index[4]++;
252444e5259b optimization
michaelni
parents: 265
diff changeset
2567 s->block_index[5]++;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2568
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2569 /* write gob / video packet header for formats which support it at any MB (MPEG4) */
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2570 if(s->rtp_mode && s->mb_y>0 && s->codec_id==CODEC_ID_MPEG4){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2571 int pdif= pbBufPtr(&s->pb) - s->ptr_lastgob;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2572
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2573 //the *2 is there so we stay below the requested size
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2574 if(pdif + s->mb_line_avgsize/s->mb_width >= s->rtp_payload_size){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2575 if(s->codec_id==CODEC_ID_MPEG4){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2576 if(s->data_partitioning && s->pict_type!=B_TYPE){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2577 ff_mpeg4_merge_partitions(s);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2578 ff_mpeg4_init_partitions(s);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2579 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2580 ff_mpeg4_encode_video_packet_header(s);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2581
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2582 if(s->flags&CODEC_FLAG_PASS1){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2583 int bits= get_bit_count(&s->pb);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2584 s->misc_bits+= bits - s->last_bits;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2585 s->last_bits= bits;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2586 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2587 ff_mpeg4_clean_buffers(s);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2588 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2589 s->ptr_lastgob = pbBufPtr(&s->pb);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2590 s->first_slice_line=1;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2591 s->resync_mb_x=mb_x;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2592 s->resync_mb_y=mb_y;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2593 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2594
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2595 if( (s->resync_mb_x == s->mb_x)
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2596 && s->resync_mb_y+1 == s->mb_y){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2597 s->first_slice_line=0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2598 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2599 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2600
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2601 if(mb_type & (mb_type-1)){ // more than 1 MB type possible
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2602 int next_block=0;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2603 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
326
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2604
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2605 copy_context_before_encode(&backup_s, s, -1);
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2606 backup_s.pb= s->pb;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2607 best_s.data_partitioning= s->data_partitioning;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2608 if(s->data_partitioning){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2609 backup_s.pb2= s->pb2;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2610 backup_s.tex_pb= s->tex_pb;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2611 }
326
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2612
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2613 if(mb_type&MB_TYPE_INTER){
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2614 s->mv_dir = MV_DIR_FORWARD;
295
6622b0fd036c mpeg4 4MV encoding
michaelni
parents: 294
diff changeset
2615 s->mv_type = MV_TYPE_16X16;
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2616 s->mb_intra= 0;
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2617 s->mv[0][0][0] = s->p_mv_table[xy][0];
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2618 s->mv[0][0][1] = s->p_mv_table[xy][1];
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2619 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_INTER, pb, pb2, tex_pb,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2620 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2621 }
326
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2622 if(mb_type&MB_TYPE_INTER4V){
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2623 s->mv_dir = MV_DIR_FORWARD;
295
6622b0fd036c mpeg4 4MV encoding
michaelni
parents: 294
diff changeset
2624 s->mv_type = MV_TYPE_8X8;
6622b0fd036c mpeg4 4MV encoding
michaelni
parents: 294
diff changeset
2625 s->mb_intra= 0;
6622b0fd036c mpeg4 4MV encoding
michaelni
parents: 294
diff changeset
2626 for(i=0; i<4; i++){
6622b0fd036c mpeg4 4MV encoding
michaelni
parents: 294
diff changeset
2627 s->mv[0][i][0] = s->motion_val[s->block_index[i]][0];
6622b0fd036c mpeg4 4MV encoding
michaelni
parents: 294
diff changeset
2628 s->mv[0][i][1] = s->motion_val[s->block_index[i]][1];
6622b0fd036c mpeg4 4MV encoding
michaelni
parents: 294
diff changeset
2629 }
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2630 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_INTER4V, pb, pb2, tex_pb,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2631 &dmin, &next_block, 0, 0);
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2632 }
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2633 if(mb_type&MB_TYPE_FORWARD){
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2634 s->mv_dir = MV_DIR_FORWARD;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2635 s->mv_type = MV_TYPE_16X16;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2636 s->mb_intra= 0;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2637 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2638 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2639 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_FORWARD, pb, pb2, tex_pb,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2640 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2641 }
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2642 if(mb_type&MB_TYPE_BACKWARD){
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2643 s->mv_dir = MV_DIR_BACKWARD;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2644 s->mv_type = MV_TYPE_16X16;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2645 s->mb_intra= 0;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2646 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2647 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2648 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_BACKWARD, pb, pb2, tex_pb,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2649 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2650 }
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2651 if(mb_type&MB_TYPE_BIDIR){
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2652 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2653 s->mv_type = MV_TYPE_16X16;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2654 s->mb_intra= 0;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2655 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2656 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2657 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2658 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2659 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_BIDIR, pb, pb2, tex_pb,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2660 &dmin, &next_block, 0, 0);
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2661 }
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2662 if(mb_type&MB_TYPE_DIRECT){
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2663 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2664 s->mv_type = MV_TYPE_16X16; //FIXME
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2665 s->mb_intra= 0;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2666 s->mv[0][0][0] = s->b_direct_forw_mv_table[xy][0];
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2667 s->mv[0][0][1] = s->b_direct_forw_mv_table[xy][1];
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2668 s->mv[1][0][0] = s->b_direct_back_mv_table[xy][0];
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2669 s->mv[1][0][1] = s->b_direct_back_mv_table[xy][1];
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2670 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_DIRECT, pb, pb2, tex_pb,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2671 &dmin, &next_block, s->b_direct_mv_table[xy][0], s->b_direct_mv_table[xy][1]);
295
6622b0fd036c mpeg4 4MV encoding
michaelni
parents: 294
diff changeset
2672 }
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2673 if(mb_type&MB_TYPE_INTRA){
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2674 s->mv_dir = MV_DIR_FORWARD;
295
6622b0fd036c mpeg4 4MV encoding
michaelni
parents: 294
diff changeset
2675 s->mv_type = MV_TYPE_16X16;
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2676 s->mb_intra= 1;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2677 s->mv[0][0][0] = 0;
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2678 s->mv[0][0][1] = 0;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2679 encode_mb_hq(s, &backup_s, &best_s, MB_TYPE_INTRA, pb, pb2, tex_pb,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2680 &dmin, &next_block, 0, 0);
326
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2681 /* force cleaning of ac/dc pred stuff if needed ... */
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2682 if(s->h263_pred || s->h263_aic)
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2683 s->mbintra_table[mb_x + mb_y*s->mb_width]=1;
295
6622b0fd036c mpeg4 4MV encoding
michaelni
parents: 294
diff changeset
2684 }
326
6ebb8680885d fixing hq mode with mpeg1 and 2-pass
michaelni
parents: 325
diff changeset
2685 copy_context_after_encode(s, &best_s, -1);
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2686
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2687 pb_bits_count= get_bit_count(&s->pb);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2688 flush_put_bits(&s->pb);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2689 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2690 s->pb= backup_s.pb;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2691
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2692 if(s->data_partitioning){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2693 pb2_bits_count= get_bit_count(&s->pb2);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2694 flush_put_bits(&s->pb2);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2695 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2696 s->pb2= backup_s.pb2;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2697
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2698 tex_pb_bits_count= get_bit_count(&s->tex_pb);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2699 flush_put_bits(&s->tex_pb);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2700 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2701 s->tex_pb= backup_s.tex_pb;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2702 }
329
5cc47d0ba53e fixed ratecontrol & b-frames
michaelni
parents: 327
diff changeset
2703 s->last_bits= get_bit_count(&s->pb);
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2704 } else {
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2705 int motion_x, motion_y;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2706 s->mv_type=MV_TYPE_16X16;
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2707 // only one MB-Type possible
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2708 switch(mb_type){
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2709 case MB_TYPE_INTRA:
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2710 s->mv_dir = MV_DIR_FORWARD;
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2711 s->mb_intra= 1;
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2712 motion_x= s->mv[0][0][0] = 0;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2713 motion_y= s->mv[0][0][1] = 0;
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2714 break;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2715 case MB_TYPE_INTER:
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2716 s->mv_dir = MV_DIR_FORWARD;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2717 s->mb_intra= 0;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2718 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2719 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2720 break;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2721 case MB_TYPE_INTER4V:
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2722 s->mv_dir = MV_DIR_FORWARD;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2723 s->mv_type = MV_TYPE_8X8;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2724 s->mb_intra= 0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2725 for(i=0; i<4; i++){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2726 s->mv[0][i][0] = s->motion_val[s->block_index[i]][0];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2727 s->mv[0][i][1] = s->motion_val[s->block_index[i]][1];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2728 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2729 motion_x= motion_y= 0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2730 break;
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2731 case MB_TYPE_DIRECT:
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2732 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2733 s->mb_intra= 0;
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2734 motion_x=s->b_direct_mv_table[xy][0];
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2735 motion_y=s->b_direct_mv_table[xy][1];
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2736 s->mv[0][0][0] = s->b_direct_forw_mv_table[xy][0];
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2737 s->mv[0][0][1] = s->b_direct_forw_mv_table[xy][1];
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2738 s->mv[1][0][0] = s->b_direct_back_mv_table[xy][0];
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2739 s->mv[1][0][1] = s->b_direct_back_mv_table[xy][1];
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2740 break;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2741 case MB_TYPE_BIDIR:
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2742 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2743 s->mb_intra= 0;
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2744 motion_x=0;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2745 motion_y=0;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2746 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2747 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2748 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2749 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2750 break;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2751 case MB_TYPE_BACKWARD:
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2752 s->mv_dir = MV_DIR_BACKWARD;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2753 s->mb_intra= 0;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2754 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2755 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2756 break;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2757 case MB_TYPE_FORWARD:
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2758 s->mv_dir = MV_DIR_FORWARD;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2759 s->mb_intra= 0;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2760 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2761 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2762 // printf(" %d %d ", motion_x, motion_y);
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2763 break;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2764 default:
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2765 motion_x=motion_y=0; //gcc warning fix
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2766 printf("illegal MB type\n");
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2767 }
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 321
diff changeset
2768 encode_mb(s, motion_x, motion_y);
248
56ee684c48bb - H.263+ decoder support for Advanded INTRA Coding (buggy)
pulento
parents: 244
diff changeset
2769 }
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2770 /* clean the MV table in IPS frames for direct mode in B frames */
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2771 if(s->mb_intra /* && I,P,S_TYPE */){
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2772 s->p_mv_table[xy][0]=0;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2773 s->p_mv_table[xy][1]=0;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 326
diff changeset
2774 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2775
13
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
2776 MPV_decode_mb(s, s->block);
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2777 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_width, get_bit_count(&s->pb));
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2778 }
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 233
diff changeset
2779
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 233
diff changeset
2780
231
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2781 /* Obtain average GOB size for RTP */
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2782 if (s->rtp_mode) {
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2783 if (!mb_y)
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 233
diff changeset
2784 s->mb_line_avgsize = pbBufPtr(&s->pb) - s->ptr_last_mb_line;
231
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2785 else if (!(mb_y % s->gob_index)) {
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 233
diff changeset
2786 s->mb_line_avgsize = (s->mb_line_avgsize + pbBufPtr(&s->pb) - s->ptr_last_mb_line) >> 1;
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 233
diff changeset
2787 s->ptr_last_mb_line = pbBufPtr(&s->pb);
231
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2788 }
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2789 //fprintf(stderr, "\nMB line: %d\tSize: %u\tAvg. Size: %u", s->mb_y,
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2790 // (s->pb.buf_ptr - s->ptr_last_mb_line), s->mb_line_avgsize);
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2791 if(s->codec_id!=CODEC_ID_MPEG4) s->first_slice_line = 0; //FIXME clean
231
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2792 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2793 }
294
944632089814 4MV motion estimation (not finished yet)
michaelni
parents: 292
diff changeset
2794 emms_c();
286
91f7c38f5f37 statistics for 2-pass encoding
michaelni
parents: 281
diff changeset
2795
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2796 if(s->codec_id==CODEC_ID_MPEG4 && s->data_partitioning && s->pict_type!=B_TYPE)
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2797 ff_mpeg4_merge_partitions(s);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2798
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2799 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 207
diff changeset
2800 msmpeg4_encode_ext_header(s);
2eb04d6be309 (commit by michael)
arpi_esp
parents: 207
diff changeset
2801
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2802 if(s->codec_id==CODEC_ID_MPEG4)
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2803 ff_mpeg4_stuffing(&s->pb);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2804
162
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
2805 //if (s->gob_number)
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
2806 // fprintf(stderr,"\nNumber of GOB: %d", s->gob_number);
231
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2807
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2808 /* Send the last GOB if RTP */
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2809 if (s->rtp_mode) {
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2810 flush_put_bits(&s->pb);
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 233
diff changeset
2811 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
231
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2812 /* Call the RTP callback to send the last GOB */
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2813 if (s->rtp_callback)
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2814 s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 233
diff changeset
2815 s->ptr_lastgob = pbBufPtr(&s->pb);
231
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2816 //fprintf(stderr,"\nGOB: %2d size: %d (last)", s->gob_number, pdif);
840cd25bf259 - Fixes on RTP and GOB headers for H.263.
pulento
parents: 230
diff changeset
2817 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2818 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2819
220
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
2820 static int dct_quantize_c(MpegEncContext *s,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2821 DCTELEM *block, int n,
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2822 int qscale, int *overflow)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2823 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2824 int i, j, level, last_non_zero, q;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2825 const int *qmat;
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2826 int bias;
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2827 int max=0;
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2828 unsigned int threshold1, threshold2;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
2829
625
bb6a69f9d409 slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents: 619
diff changeset
2830 s->fdct (block);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2831
704
9b35329086c7 An easy way to speed up encoding by 6%.
mellum
parents: 701
diff changeset
2832 #ifndef ARCH_ALPHA /* Alpha uses unpermuted matrix */
64
5aa6292a1660 win32 fixes
glantau
parents: 60
diff changeset
2833 /* we need this permutation so that we correct the IDCT
5aa6292a1660 win32 fixes
glantau
parents: 60
diff changeset
2834 permutation. will be moved into DCT code */
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2835 block_permute(block, s->idct_permutation); //FIXME remove
704
9b35329086c7 An easy way to speed up encoding by 6%.
mellum
parents: 701
diff changeset
2836 #endif
64
5aa6292a1660 win32 fixes
glantau
parents: 60
diff changeset
2837
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2838 if (s->mb_intra) {
350
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 347
diff changeset
2839 if (!s->h263_aic) {
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 347
diff changeset
2840 if (n < 4)
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 347
diff changeset
2841 q = s->y_dc_scale;
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 347
diff changeset
2842 else
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 347
diff changeset
2843 q = s->c_dc_scale;
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 347
diff changeset
2844 q = q << 3;
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 347
diff changeset
2845 } else
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 347
diff changeset
2846 /* For AIC we skip quant/dequant of INTRADC */
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 347
diff changeset
2847 q = 1 << 3;
6ebbecc10063 - Advanced Intra Coding (AIC) support for H.263+ encoder, just DC by now.
pulento
parents: 347
diff changeset
2848
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2849 /* note: block[0] is assumed to be positive */
986e461dc072 Initial revision
glantau
parents:
diff changeset
2850 block[0] = (block[0] + (q >> 1)) / q;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2851 i = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2852 last_non_zero = 0;
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2853 qmat = s->q_intra_matrix[qscale];
635
3e0f62e5eed6 dct cleanup
michaelni
parents: 628
diff changeset
2854 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2855 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2856 i = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2857 last_non_zero = -1;
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2858 qmat = s->q_inter_matrix[qscale];
635
3e0f62e5eed6 dct cleanup
michaelni
parents: 628
diff changeset
2859 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2860 }
635
3e0f62e5eed6 dct cleanup
michaelni
parents: 628
diff changeset
2861 threshold1= (1<<QMAT_SHIFT) - bias - 1;
3e0f62e5eed6 dct cleanup
michaelni
parents: 628
diff changeset
2862 threshold2= (threshold1<<1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2863
986e461dc072 Initial revision
glantau
parents:
diff changeset
2864 for(;i<64;i++) {
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2865 j = s->intra_scantable.permutated[i];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2866 level = block[j];
986e461dc072 Initial revision
glantau
parents:
diff changeset
2867 level = level * qmat[j];
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2868
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2869 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2870 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2871 if(((unsigned)(level+threshold1))>threshold2){
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2872 if(level>0){
635
3e0f62e5eed6 dct cleanup
michaelni
parents: 628
diff changeset
2873 level= (bias + level)>>QMAT_SHIFT;
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2874 block[j]= level;
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2875 }else{
635
3e0f62e5eed6 dct cleanup
michaelni
parents: 628
diff changeset
2876 level= (bias - level)>>QMAT_SHIFT;
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2877 block[j]= -level;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2878 }
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2879 max |=level;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2880 last_non_zero = i;
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2881 }else{
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2882 block[j]=0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2883 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2884 }
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2885 *overflow= s->max_qcoeff < max; //overflow might have happend
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2886
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2887 return last_non_zero;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2888 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2889
13
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
2890 static void dct_unquantize_mpeg1_c(MpegEncContext *s,
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
2891 DCTELEM *block, int n, int qscale)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2892 {
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
2893 int i, level, nCoeffs;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2894 const UINT16 *quant_matrix;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2895
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2896 nCoeffs= s->block_last_index[n];
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
2897
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2898 if (s->mb_intra) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2899 if (n < 4)
986e461dc072 Initial revision
glantau
parents:
diff changeset
2900 block[0] = block[0] * s->y_dc_scale;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2901 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
2902 block[0] = block[0] * s->c_dc_scale;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2903 /* XXX: only mpeg1 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
2904 quant_matrix = s->intra_matrix;
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2905 for(i=1;i<=nCoeffs;i++) {
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2906 int j= s->intra_scantable.permutated[i];
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
2907 level = block[j];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2908 if (level) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2909 if (level < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2910 level = -level;
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
2911 level = (int)(level * qscale * quant_matrix[j]) >> 3;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2912 level = (level - 1) | 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2913 level = -level;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2914 } else {
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
2915 level = (int)(level * qscale * quant_matrix[j]) >> 3;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2916 level = (level - 1) | 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2917 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2918 #ifdef PARANOID
986e461dc072 Initial revision
glantau
parents:
diff changeset
2919 if (level < -2048 || level > 2047)
986e461dc072 Initial revision
glantau
parents:
diff changeset
2920 fprintf(stderr, "unquant error %d %d\n", i, level);
986e461dc072 Initial revision
glantau
parents:
diff changeset
2921 #endif
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
2922 block[j] = level;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2923 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2924 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2925 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2926 i = 0;
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2927 quant_matrix = s->inter_matrix;
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2928 for(;i<=nCoeffs;i++) {
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2929 int j= s->intra_scantable.permutated[i];
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
2930 level = block[j];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2931 if (level) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2932 if (level < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2933 level = -level;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2934 level = (((level << 1) + 1) * qscale *
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
2935 ((int) (quant_matrix[j]))) >> 4;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2936 level = (level - 1) | 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2937 level = -level;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2938 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
2939 level = (((level << 1) + 1) * qscale *
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
2940 ((int) (quant_matrix[j]))) >> 4;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2941 level = (level - 1) | 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
2942 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2943 #ifdef PARANOID
986e461dc072 Initial revision
glantau
parents:
diff changeset
2944 if (level < -2048 || level > 2047)
986e461dc072 Initial revision
glantau
parents:
diff changeset
2945 fprintf(stderr, "unquant error %d %d\n", i, level);
986e461dc072 Initial revision
glantau
parents:
diff changeset
2946 #endif
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
2947 block[j] = level;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
2948 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2949 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2950 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
2951 }
13
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
2952
325
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2953 static void dct_unquantize_mpeg2_c(MpegEncContext *s,
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2954 DCTELEM *block, int n, int qscale)
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2955 {
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2956 int i, level, nCoeffs;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2957 const UINT16 *quant_matrix;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2958
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2959 if(s->alternate_scan) nCoeffs= 63;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2960 else nCoeffs= s->block_last_index[n];
325
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2961
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2962 if (s->mb_intra) {
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2963 if (n < 4)
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2964 block[0] = block[0] * s->y_dc_scale;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2965 else
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2966 block[0] = block[0] * s->c_dc_scale;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2967 quant_matrix = s->intra_matrix;
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2968 for(i=1;i<=nCoeffs;i++) {
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2969 int j= s->intra_scantable.permutated[i];
325
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2970 level = block[j];
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2971 if (level) {
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2972 if (level < 0) {
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2973 level = -level;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2974 level = (int)(level * qscale * quant_matrix[j]) >> 3;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2975 level = -level;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2976 } else {
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2977 level = (int)(level * qscale * quant_matrix[j]) >> 3;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2978 }
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2979 #ifdef PARANOID
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2980 if (level < -2048 || level > 2047)
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2981 fprintf(stderr, "unquant error %d %d\n", i, level);
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2982 #endif
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2983 block[j] = level;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2984 }
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2985 }
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2986 } else {
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2987 int sum=-1;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2988 i = 0;
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 341
diff changeset
2989 quant_matrix = s->inter_matrix;
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2990 for(;i<=nCoeffs;i++) {
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
2991 int j= s->intra_scantable.permutated[i];
325
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2992 level = block[j];
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2993 if (level) {
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2994 if (level < 0) {
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2995 level = -level;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2996 level = (((level << 1) + 1) * qscale *
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2997 ((int) (quant_matrix[j]))) >> 4;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2998 level = -level;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
2999 } else {
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
3000 level = (((level << 1) + 1) * qscale *
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
3001 ((int) (quant_matrix[j]))) >> 4;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
3002 }
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
3003 #ifdef PARANOID
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
3004 if (level < -2048 || level > 2047)
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
3005 fprintf(stderr, "unquant error %d %d\n", i, level);
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
3006 #endif
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
3007 block[j] = level;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
3008 sum+=level;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
3009 }
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
3010 }
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
3011 block[63]^=sum&1;
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
3012 }
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
3013 }
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
3014
15efd80cf51e mpeg2/mpeg4 dequantizer support (c & mmx)
michaelni
parents: 324
diff changeset
3015
13
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3016 static void dct_unquantize_h263_c(MpegEncContext *s,
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3017 DCTELEM *block, int n, int qscale)
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3018 {
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3019 int i, level, qmul, qadd;
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
3020 int nCoeffs;
249
42a0b7b16738 - Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents: 248
diff changeset
3021
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
3022 assert(s->block_last_index[n]>=0);
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
3023
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
3024 qadd = (qscale - 1) | 1;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
3025 qmul = qscale << 1;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
3026
13
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3027 if (s->mb_intra) {
249
42a0b7b16738 - Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents: 248
diff changeset
3028 if (!s->h263_aic) {
42a0b7b16738 - Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents: 248
diff changeset
3029 if (n < 4)
42a0b7b16738 - Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents: 248
diff changeset
3030 block[0] = block[0] * s->y_dc_scale;
42a0b7b16738 - Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents: 248
diff changeset
3031 else
42a0b7b16738 - Bug fixes in H.263+ Advanced INTRA Coding decoder.
pulento
parents: 248
diff changeset
3032 block[0] = block[0] * s->c_dc_scale;
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
3033 }else
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
3034 qadd = 0;
13
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3035 i = 1;
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
3036 nCoeffs= 63; //does not allways use zigzag table
13
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3037 } else {
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3038 i = 0;
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
3039 nCoeffs= s->intra_scantable.raster_end[ s->block_last_index[n] ];
13
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3040 }
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3041
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 704
diff changeset
3042 for(;i<=nCoeffs;i++) {
13
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3043 level = block[i];
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3044 if (level) {
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3045 if (level < 0) {
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3046 level = level * qmul - qadd;
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3047 } else {
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3048 level = level * qmul + qadd;
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3049 }
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3050 #ifdef PARANOID
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3051 if (level < -2048 || level > 2047)
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3052 fprintf(stderr, "unquant error %d %d\n", i, level);
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3053 #endif
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3054 block[i] = level;
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3055 }
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3056 }
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
3057 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
3058
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3059 static void remove_ac(MpegEncContext *s, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, int mb_x, int mb_y)
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3060 {
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3061 int dc, dcb, dcr, y, i;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3062 for(i=0; i<4; i++){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3063 dc= s->dc_val[0][mb_x*2+1 + (i&1) + (mb_y*2+1 + (i>>1))*(s->mb_width*2+2)];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3064 for(y=0; y<8; y++){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3065 int x;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3066 for(x=0; x<8; x++){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3067 dest_y[x + (i&1)*8 + (y + (i>>1)*8)*s->linesize]= dc/8;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3068 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3069 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3070 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3071 dcb = s->dc_val[1][mb_x+1 + (mb_y+1)*(s->mb_width+2)];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3072 dcr= s->dc_val[2][mb_x+1 + (mb_y+1)*(s->mb_width+2)];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3073 for(y=0; y<8; y++){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3074 int x;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3075 for(x=0; x<8; x++){
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
3076 dest_cb[x + y*(s->uvlinesize)]= dcb/8;
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
3077 dest_cr[x + y*(s->uvlinesize)]= dcr/8;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3078 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3079 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3080 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3081
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3082 /**
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3083 * will conceal past errors, and allso drop b frames if needed
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3084 *
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3085 */
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3086 void ff_conceal_past_errors(MpegEncContext *s, int unknown_pos)
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3087 {
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3088 int mb_x= s->mb_x;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3089 int mb_y= s->mb_y;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3090 int mb_dist=0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3091 int i, intra_count=0, inter_count=0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3092 int intra_conceal= s->msmpeg4_version ? 50 : 50; //FIXME finetune
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3093 int inter_conceal= s->msmpeg4_version ? 50 : 50;
612
c0005de2be59 new ratecontrol code
michaelni
parents: 611
diff changeset
3094
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3095 // for last block
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3096 if(mb_x>=s->mb_width) mb_x= s->mb_width -1;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3097 if(mb_y>=s->mb_height) mb_y= s->mb_height-1;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3098
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3099 if(s->decoding_error==0 && unknown_pos){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3100 if(s->data_partitioning && s->pict_type!=B_TYPE)
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3101 s->decoding_error= DECODING_AC_LOST;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3102 else
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3103 s->decoding_error= DECODING_DESYNC;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3104 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3105
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3106 if(s->decoding_error==DECODING_DESYNC && s->pict_type!=B_TYPE) s->next_p_frame_damaged=1;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3107
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3108 for(i=mb_x + mb_y*s->mb_width; i>=0; i--){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3109 if(s->mbintra_table[i]) intra_count++;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3110 else inter_count++;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3111 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3112
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3113 if(s->decoding_error==DECODING_AC_LOST){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3114 intra_conceal*=2;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3115 inter_conceal*=2;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3116 }else if(s->decoding_error==DECODING_ACDC_LOST){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3117 intra_conceal*=2;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3118 inter_conceal*=2;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3119 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3120
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3121 if(unknown_pos && (intra_count<inter_count)){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3122 intra_conceal= inter_conceal= s->mb_num;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3123 // printf("%d %d\n",intra_count, inter_count);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3124 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3125
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3126 fprintf(stderr, "concealing errors\n");
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3127
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3128 /* for all MBs from the current one back until the last resync marker */
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3129 for(; mb_y>=0 && mb_y>=s->resync_mb_y; mb_y--){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3130 for(; mb_x>=0; mb_x--){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3131 uint8_t *dest_y = s->current_picture[0] + (mb_y * 16* s->linesize ) + mb_x * 16;
556
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
3132 uint8_t *dest_cb = s->current_picture[1] + (mb_y * 8 * (s->uvlinesize)) + mb_x * 8;
762c67fd4078 uvlinesize
michaelni
parents: 554
diff changeset
3133 uint8_t *dest_cr = s->current_picture[2] + (mb_y * 8 * (s->uvlinesize)) + mb_x * 8;
456
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3134 int mb_x_backup= s->mb_x; //FIXME pass xy to mpeg_motion
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3135 int mb_y_backup= s->mb_y;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3136 s->mb_x=mb_x;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3137 s->mb_y=mb_y;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3138 if(s->mbintra_table[mb_y*s->mb_width + mb_x] && mb_dist<intra_conceal){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3139 if(s->decoding_error==DECODING_AC_LOST){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3140 remove_ac(s, dest_y, dest_cb, dest_cr, mb_x, mb_y);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3141 // printf("remove ac to %d %d\n", mb_x, mb_y);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3142 }else{
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3143 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3144 s->last_picture, 0, 0, put_pixels_tab,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3145 0/*mx*/, 0/*my*/, 16);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3146 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3147 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3148 else if(!s->mbintra_table[mb_y*s->mb_width + mb_x] && mb_dist<inter_conceal){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3149 int mx=0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3150 int my=0;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3151
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3152 if(s->decoding_error!=DECODING_DESYNC){
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3153 int xy= mb_x*2+1 + (mb_y*2+1)*(s->mb_width*2+2);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3154 mx= s->motion_val[ xy ][0];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3155 my= s->motion_val[ xy ][1];
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3156 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3157
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3158 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3159 s->last_picture, 0, 0, put_pixels_tab,
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3160 mx, my, 16);
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3161 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3162 s->mb_x= mb_x_backup;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3163 s->mb_y= mb_y_backup;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3164
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3165 if(mb_x== s->resync_mb_x && mb_y== s->resync_mb_y) return;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3166 if(!s->mbskip_table[mb_x + mb_y*s->mb_width]) mb_dist++;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3167 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3168 mb_x=s->mb_width-1;
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3169 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3170 }
c006ee838856 single coefficient elimination
michaelni
parents: 429
diff changeset
3171
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
3172 AVCodec mpeg1video_encoder = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
3173 "mpeg1video",
986e461dc072 Initial revision
glantau
parents:
diff changeset
3174 CODEC_TYPE_VIDEO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3175 CODEC_ID_MPEG1VIDEO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3176 sizeof(MpegEncContext),
986e461dc072 Initial revision
glantau
parents:
diff changeset
3177 MPV_encode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3178 MPV_encode_picture,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3179 MPV_encode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3180 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
3181
986e461dc072 Initial revision
glantau
parents:
diff changeset
3182 AVCodec h263_encoder = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
3183 "h263",
986e461dc072 Initial revision
glantau
parents:
diff changeset
3184 CODEC_TYPE_VIDEO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3185 CODEC_ID_H263,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3186 sizeof(MpegEncContext),
986e461dc072 Initial revision
glantau
parents:
diff changeset
3187 MPV_encode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3188 MPV_encode_picture,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3189 MPV_encode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3190 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
3191
986e461dc072 Initial revision
glantau
parents:
diff changeset
3192 AVCodec h263p_encoder = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
3193 "h263p",
986e461dc072 Initial revision
glantau
parents:
diff changeset
3194 CODEC_TYPE_VIDEO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3195 CODEC_ID_H263P,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3196 sizeof(MpegEncContext),
986e461dc072 Initial revision
glantau
parents:
diff changeset
3197 MPV_encode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3198 MPV_encode_picture,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3199 MPV_encode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3200 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
3201
986e461dc072 Initial revision
glantau
parents:
diff changeset
3202 AVCodec rv10_encoder = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
3203 "rv10",
986e461dc072 Initial revision
glantau
parents:
diff changeset
3204 CODEC_TYPE_VIDEO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3205 CODEC_ID_RV10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3206 sizeof(MpegEncContext),
986e461dc072 Initial revision
glantau
parents:
diff changeset
3207 MPV_encode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3208 MPV_encode_picture,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3209 MPV_encode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3210 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
3211
986e461dc072 Initial revision
glantau
parents:
diff changeset
3212 AVCodec mjpeg_encoder = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
3213 "mjpeg",
986e461dc072 Initial revision
glantau
parents:
diff changeset
3214 CODEC_TYPE_VIDEO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3215 CODEC_ID_MJPEG,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3216 sizeof(MpegEncContext),
986e461dc072 Initial revision
glantau
parents:
diff changeset
3217 MPV_encode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3218 MPV_encode_picture,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3219 MPV_encode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3220 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
3221
71
79be2c581c01 changed opendivx to mpeg4
glantau
parents: 64
diff changeset
3222 AVCodec mpeg4_encoder = {
79be2c581c01 changed opendivx to mpeg4
glantau
parents: 64
diff changeset
3223 "mpeg4",
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
3224 CODEC_TYPE_VIDEO,
71
79be2c581c01 changed opendivx to mpeg4
glantau
parents: 64
diff changeset
3225 CODEC_ID_MPEG4,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
3226 sizeof(MpegEncContext),
986e461dc072 Initial revision
glantau
parents:
diff changeset
3227 MPV_encode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3228 MPV_encode_picture,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3229 MPV_encode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3230 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
3231
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3232 AVCodec msmpeg4v1_encoder = {
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3233 "msmpeg4v1",
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
3234 CODEC_TYPE_VIDEO,
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3235 CODEC_ID_MSMPEG4V1,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
3236 sizeof(MpegEncContext),
986e461dc072 Initial revision
glantau
parents:
diff changeset
3237 MPV_encode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3238 MPV_encode_picture,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3239 MPV_encode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
3240 };
307
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3241
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3242 AVCodec msmpeg4v2_encoder = {
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3243 "msmpeg4v2",
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3244 CODEC_TYPE_VIDEO,
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3245 CODEC_ID_MSMPEG4V2,
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3246 sizeof(MpegEncContext),
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3247 MPV_encode_init,
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3248 MPV_encode_picture,
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3249 MPV_encode_end,
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3250 };
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3251
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3252 AVCodec msmpeg4v3_encoder = {
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3253 "msmpeg4",
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3254 CODEC_TYPE_VIDEO,
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3255 CODEC_ID_MSMPEG4V3,
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3256 sizeof(MpegEncContext),
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3257 MPV_encode_init,
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3258 MPV_encode_picture,
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3259 MPV_encode_end,
764aeec1320e msmpeg4v2 decoding (no encoding yet)
michaelni
parents: 302
diff changeset
3260 };
499
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3261
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3262 AVCodec wmv1_encoder = {
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3263 "wmv1",
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3264 CODEC_TYPE_VIDEO,
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3265 CODEC_ID_WMV1,
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3266 sizeof(MpegEncContext),
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3267 MPV_encode_init,
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3268 MPV_encode_picture,
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3269 MPV_encode_end,
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3270 };
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3271
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3272 AVCodec wmv2_encoder = {
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3273 "wmv2",
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3274 CODEC_TYPE_VIDEO,
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3275 CODEC_ID_WMV2,
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3276 sizeof(MpegEncContext),
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3277 MPV_encode_init,
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3278 MPV_encode_picture,
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3279 MPV_encode_end,
8b7a54d58549 wmv1 support
michaelni
parents: 487
diff changeset
3280 };