annotate mpegvideo.c @ 915:75ee49a4a516 libavcodec

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