annotate mpegvideo.c @ 229:f418b5c5ff67 libavcodec

PATCH by Rik Snel <rsnel@cube.dyndns.org> this patch enhances the jpeg header writer. It can be asked to omit quantisation and huffman tables and it can write different horizontal and vertical sampling factors. (the last thing is useless for libavcodec itself (because libavcodec only handles YUV420P at ecoder level), but the values are initialized so that operation of libavcodec is not impaired)
author arpi_esp
date Sat, 09 Feb 2002 01:23:41 +0000
parents ec1bc02a0a47
children ba9cd6fb6f0e
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!)
986e461dc072 Initial revision
glantau
parents:
diff changeset
3 * Copyright (c) 2000,2001 Gerard Lantau.
986e461dc072 Initial revision
glantau
parents:
diff changeset
4 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
5 * This program is free software; you can redistribute it and/or modify
986e461dc072 Initial revision
glantau
parents:
diff changeset
6 * it under the terms of the GNU General Public License as published by
986e461dc072 Initial revision
glantau
parents:
diff changeset
7 * the Free Software Foundation; either version 2 of the License, or
986e461dc072 Initial revision
glantau
parents:
diff changeset
8 * (at your option) any later version.
986e461dc072 Initial revision
glantau
parents:
diff changeset
9 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
10 * This program is distributed in the hope that it will be useful,
986e461dc072 Initial revision
glantau
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
986e461dc072 Initial revision
glantau
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
986e461dc072 Initial revision
glantau
parents:
diff changeset
13 * GNU General Public License for more details.
986e461dc072 Initial revision
glantau
parents:
diff changeset
14 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License
986e461dc072 Initial revision
glantau
parents:
diff changeset
16 * along with this program; if not, write to the Free Software
986e461dc072 Initial revision
glantau
parents:
diff changeset
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
986e461dc072 Initial revision
glantau
parents:
diff changeset
18 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
19 #include <stdlib.h>
986e461dc072 Initial revision
glantau
parents:
diff changeset
20 #include <stdio.h>
986e461dc072 Initial revision
glantau
parents:
diff changeset
21 #include <math.h>
986e461dc072 Initial revision
glantau
parents:
diff changeset
22 #include <string.h>
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"
986e461dc072 Initial revision
glantau
parents:
diff changeset
26
17
b69fe46fd708 Adding fastmemcpy stuff to speedup mplayer project
nickols_k
parents: 13
diff changeset
27 #ifdef USE_FASTMEMCPY
b69fe46fd708 Adding fastmemcpy stuff to speedup mplayer project
nickols_k
parents: 13
diff changeset
28 #include "fastmemcpy.h"
b69fe46fd708 Adding fastmemcpy stuff to speedup mplayer project
nickols_k
parents: 13
diff changeset
29 #endif
b69fe46fd708 Adding fastmemcpy stuff to speedup mplayer project
nickols_k
parents: 13
diff changeset
30
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
31 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
32 static void rate_control_init(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
33 static int rate_estimate_qscale(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
34 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
35 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
36 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
37 DCTELEM *block, int n, int qscale);
206
994aa8623443 (commit by michael)
arpi_esp
parents: 200
diff changeset
38 static void draw_edges_c(UINT8 *buf, int wrap, int width, int height, int w);
220
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
39 static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale);
206
994aa8623443 (commit by michael)
arpi_esp
parents: 200
diff changeset
40
220
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
41 int (*dct_quantize)(MpegEncContext *s, DCTELEM *block, int n, int qscale)= dct_quantize_c;
206
994aa8623443 (commit by michael)
arpi_esp
parents: 200
diff changeset
42 void (*draw_edges)(UINT8 *buf, int wrap, int width, int height, int w)= draw_edges_c;
994aa8623443 (commit by michael)
arpi_esp
parents: 200
diff changeset
43
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
44 #define EDGE_WIDTH 16
986e461dc072 Initial revision
glantau
parents:
diff changeset
45
986e461dc072 Initial revision
glantau
parents:
diff changeset
46 /* enable all paranoid tests for rounding, overflows, etc... */
986e461dc072 Initial revision
glantau
parents:
diff changeset
47 //#define PARANOID
986e461dc072 Initial revision
glantau
parents:
diff changeset
48
986e461dc072 Initial revision
glantau
parents:
diff changeset
49 //#define DEBUG
986e461dc072 Initial revision
glantau
parents:
diff changeset
50
986e461dc072 Initial revision
glantau
parents:
diff changeset
51 /* for jpeg fast DCT */
986e461dc072 Initial revision
glantau
parents:
diff changeset
52 #define CONST_BITS 14
986e461dc072 Initial revision
glantau
parents:
diff changeset
53
986e461dc072 Initial revision
glantau
parents:
diff changeset
54 static const unsigned short aanscales[64] = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
55 /* precomputed values scaled up by 14 bits */
986e461dc072 Initial revision
glantau
parents:
diff changeset
56 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
986e461dc072 Initial revision
glantau
parents:
diff changeset
57 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
986e461dc072 Initial revision
glantau
parents:
diff changeset
58 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
986e461dc072 Initial revision
glantau
parents:
diff changeset
59 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
986e461dc072 Initial revision
glantau
parents:
diff changeset
60 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
986e461dc072 Initial revision
glantau
parents:
diff changeset
61 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
986e461dc072 Initial revision
glantau
parents:
diff changeset
62 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
986e461dc072 Initial revision
glantau
parents:
diff changeset
63 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
986e461dc072 Initial revision
glantau
parents:
diff changeset
64 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
65
986e461dc072 Initial revision
glantau
parents:
diff changeset
66 static UINT8 h263_chroma_roundtab[16] = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
67 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
986e461dc072 Initial revision
glantau
parents:
diff changeset
68 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
69
986e461dc072 Initial revision
glantau
parents:
diff changeset
70 /* default motion estimation */
986e461dc072 Initial revision
glantau
parents:
diff changeset
71 int motion_estimation_method = ME_LOG;
986e461dc072 Initial revision
glantau
parents:
diff changeset
72
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
73 extern UINT8 zigzag_end[64];
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
74
220
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
75 static void convert_matrix(int *qmat, UINT16 *qmat16, const UINT16 *quant_matrix, int qscale)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
76 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
77 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
78
986e461dc072 Initial revision
glantau
parents:
diff changeset
79 if (av_fdct == jpeg_fdct_ifast) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
80 for(i=0;i<64;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
81 /* 16 <= qscale * quant_matrix[i] <= 7905 */
220
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
82 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
83 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
84 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
85
220
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
86 qmat[block_permute_op(i)] = (int)((UINT64_C(1) << (QMAT_SHIFT + 11)) /
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
87 (aanscales[i] * qscale * quant_matrix[block_permute_op(i)]));
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
88 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
89 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
90 for(i=0;i<64;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
91 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
220
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
92 So 16 <= qscale * quant_matrix[i] <= 7905
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
93 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
94 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
95 */
220
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
96 qmat[i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]);
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
97 qmat16[i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[block_permute_op(i)]);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
98 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
99 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
100 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
101
986e461dc072 Initial revision
glantau
parents:
diff changeset
102 /* init common structure for both encoder and decoder */
986e461dc072 Initial revision
glantau
parents:
diff changeset
103 int MPV_common_init(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
104 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
105 int c_size, i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
106 UINT8 *pict;
986e461dc072 Initial revision
glantau
parents:
diff changeset
107
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
108 if (s->out_format == FMT_H263)
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
109 s->dct_unquantize = dct_unquantize_h263_c;
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
110 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
111 s->dct_unquantize = dct_unquantize_mpeg1_c;
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
112
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
113 #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
114 MPV_common_init_mmx(s);
8
1b4461b5a7fb Sync with mplayer's stuff
nickols_k
parents: 7
diff changeset
115 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
116 s->mb_width = (s->width + 15) / 16;
986e461dc072 Initial revision
glantau
parents:
diff changeset
117 s->mb_height = (s->height + 15) / 16;
986e461dc072 Initial revision
glantau
parents:
diff changeset
118 s->linesize = s->mb_width * 16 + 2 * EDGE_WIDTH;
986e461dc072 Initial revision
glantau
parents:
diff changeset
119
986e461dc072 Initial revision
glantau
parents:
diff changeset
120 for(i=0;i<3;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
121 int w, h, shift, pict_start;
986e461dc072 Initial revision
glantau
parents:
diff changeset
122
986e461dc072 Initial revision
glantau
parents:
diff changeset
123 w = s->linesize;
986e461dc072 Initial revision
glantau
parents:
diff changeset
124 h = s->mb_height * 16 + 2 * EDGE_WIDTH;
986e461dc072 Initial revision
glantau
parents:
diff changeset
125 shift = (i == 0) ? 0 : 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
126 c_size = (w >> shift) * (h >> shift);
986e461dc072 Initial revision
glantau
parents:
diff changeset
127 pict_start = (w >> shift) * (EDGE_WIDTH >> shift) + (EDGE_WIDTH >> shift);
986e461dc072 Initial revision
glantau
parents:
diff changeset
128
986e461dc072 Initial revision
glantau
parents:
diff changeset
129 pict = av_mallocz(c_size);
986e461dc072 Initial revision
glantau
parents:
diff changeset
130 if (pict == NULL)
986e461dc072 Initial revision
glantau
parents:
diff changeset
131 goto fail;
986e461dc072 Initial revision
glantau
parents:
diff changeset
132 s->last_picture_base[i] = pict;
986e461dc072 Initial revision
glantau
parents:
diff changeset
133 s->last_picture[i] = pict + pict_start;
986e461dc072 Initial revision
glantau
parents:
diff changeset
134
986e461dc072 Initial revision
glantau
parents:
diff changeset
135 pict = av_mallocz(c_size);
986e461dc072 Initial revision
glantau
parents:
diff changeset
136 if (pict == NULL)
986e461dc072 Initial revision
glantau
parents:
diff changeset
137 goto fail;
986e461dc072 Initial revision
glantau
parents:
diff changeset
138 s->next_picture_base[i] = pict;
986e461dc072 Initial revision
glantau
parents:
diff changeset
139 s->next_picture[i] = pict + pict_start;
986e461dc072 Initial revision
glantau
parents:
diff changeset
140
986e461dc072 Initial revision
glantau
parents:
diff changeset
141 if (s->has_b_frames) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
142 pict = av_mallocz(c_size);
986e461dc072 Initial revision
glantau
parents:
diff changeset
143 if (pict == NULL)
986e461dc072 Initial revision
glantau
parents:
diff changeset
144 goto fail;
986e461dc072 Initial revision
glantau
parents:
diff changeset
145 s->aux_picture_base[i] = pict;
986e461dc072 Initial revision
glantau
parents:
diff changeset
146 s->aux_picture[i] = pict + pict_start;
986e461dc072 Initial revision
glantau
parents:
diff changeset
147 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
148 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
149
986e461dc072 Initial revision
glantau
parents:
diff changeset
150 if (s->out_format == FMT_H263) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
151 int size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
152 /* MV prediction */
986e461dc072 Initial revision
glantau
parents:
diff changeset
153 size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
154 s->motion_val = malloc(size * 2 * sizeof(INT16));
986e461dc072 Initial revision
glantau
parents:
diff changeset
155 if (s->motion_val == NULL)
986e461dc072 Initial revision
glantau
parents:
diff changeset
156 goto fail;
986e461dc072 Initial revision
glantau
parents:
diff changeset
157 memset(s->motion_val, 0, size * 2 * sizeof(INT16));
986e461dc072 Initial revision
glantau
parents:
diff changeset
158 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
159
986e461dc072 Initial revision
glantau
parents:
diff changeset
160 if (s->h263_pred) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
161 int y_size, c_size, i, size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
162
986e461dc072 Initial revision
glantau
parents:
diff changeset
163 /* dc values */
986e461dc072 Initial revision
glantau
parents:
diff changeset
164
986e461dc072 Initial revision
glantau
parents:
diff changeset
165 y_size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
166 c_size = (s->mb_width + 2) * (s->mb_height + 2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
167 size = y_size + 2 * c_size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
168 s->dc_val[0] = malloc(size * sizeof(INT16));
986e461dc072 Initial revision
glantau
parents:
diff changeset
169 if (s->dc_val[0] == NULL)
986e461dc072 Initial revision
glantau
parents:
diff changeset
170 goto fail;
986e461dc072 Initial revision
glantau
parents:
diff changeset
171 s->dc_val[1] = s->dc_val[0] + y_size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
172 s->dc_val[2] = s->dc_val[1] + c_size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
173 for(i=0;i<size;i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
174 s->dc_val[0][i] = 1024;
986e461dc072 Initial revision
glantau
parents:
diff changeset
175
986e461dc072 Initial revision
glantau
parents:
diff changeset
176 /* ac values */
986e461dc072 Initial revision
glantau
parents:
diff changeset
177 s->ac_val[0] = av_mallocz(size * sizeof(INT16) * 16);
986e461dc072 Initial revision
glantau
parents:
diff changeset
178 if (s->ac_val[0] == NULL)
986e461dc072 Initial revision
glantau
parents:
diff changeset
179 goto fail;
986e461dc072 Initial revision
glantau
parents:
diff changeset
180 s->ac_val[1] = s->ac_val[0] + y_size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
181 s->ac_val[2] = s->ac_val[1] + c_size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
182
986e461dc072 Initial revision
glantau
parents:
diff changeset
183 /* cbp values */
986e461dc072 Initial revision
glantau
parents:
diff changeset
184 s->coded_block = av_mallocz(y_size);
986e461dc072 Initial revision
glantau
parents:
diff changeset
185 if (!s->coded_block)
986e461dc072 Initial revision
glantau
parents:
diff changeset
186 goto fail;
191
883f184537e6 AC table reset (memset) optimization - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 189
diff changeset
187
883f184537e6 AC table reset (memset) optimization - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 189
diff changeset
188 /* which mb is a intra block */
196
9ffa69cd4ed6 This fixes segfaults because of uninitialized s->mbintra_table variable - patch by Vladimir Dergachev <volodya@mindspring.com>
arpi_esp
parents: 194
diff changeset
189 s->mbintra_table = av_mallocz(s->mb_width * s->mb_height);
191
883f184537e6 AC table reset (memset) optimization - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 189
diff changeset
190 if (!s->mbintra_table)
883f184537e6 AC table reset (memset) optimization - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 189
diff changeset
191 goto fail;
196
9ffa69cd4ed6 This fixes segfaults because of uninitialized s->mbintra_table variable - patch by Vladimir Dergachev <volodya@mindspring.com>
arpi_esp
parents: 194
diff changeset
192 memset(s->mbintra_table, 1, s->mb_width * s->mb_height);
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
193 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
194 /* default structure is frame */
986e461dc072 Initial revision
glantau
parents:
diff changeset
195 s->picture_structure = PICT_FRAME;
986e461dc072 Initial revision
glantau
parents:
diff changeset
196
7
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
197 /* init macroblock skip table */
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
198 if (!s->encoding) {
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
199 s->mbskip_table = av_mallocz(s->mb_width * s->mb_height);
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
200 if (!s->mbskip_table)
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
201 goto fail;
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
202 }
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
203
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
204 s->context_initialized = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
205 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
206 fail:
986e461dc072 Initial revision
glantau
parents:
diff changeset
207 if (s->motion_val)
986e461dc072 Initial revision
glantau
parents:
diff changeset
208 free(s->motion_val);
986e461dc072 Initial revision
glantau
parents:
diff changeset
209 if (s->dc_val[0])
986e461dc072 Initial revision
glantau
parents:
diff changeset
210 free(s->dc_val[0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
211 if (s->ac_val[0])
986e461dc072 Initial revision
glantau
parents:
diff changeset
212 free(s->ac_val[0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
213 if (s->coded_block)
986e461dc072 Initial revision
glantau
parents:
diff changeset
214 free(s->coded_block);
191
883f184537e6 AC table reset (memset) optimization - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 189
diff changeset
215 if (s->mbintra_table)
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
216 free(s->mbintra_table);
7
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
217 if (s->mbskip_table)
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
218 free(s->mbskip_table);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
219 for(i=0;i<3;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
220 if (s->last_picture_base[i])
986e461dc072 Initial revision
glantau
parents:
diff changeset
221 free(s->last_picture_base[i]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
222 if (s->next_picture_base[i])
986e461dc072 Initial revision
glantau
parents:
diff changeset
223 free(s->next_picture_base[i]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
224 if (s->aux_picture_base[i])
986e461dc072 Initial revision
glantau
parents:
diff changeset
225 free(s->aux_picture_base[i]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
226 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
227 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
228 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
229
986e461dc072 Initial revision
glantau
parents:
diff changeset
230 /* init common structure for both encoder and decoder */
986e461dc072 Initial revision
glantau
parents:
diff changeset
231 void MPV_common_end(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
232 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
233 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
234
986e461dc072 Initial revision
glantau
parents:
diff changeset
235 if (s->motion_val)
986e461dc072 Initial revision
glantau
parents:
diff changeset
236 free(s->motion_val);
986e461dc072 Initial revision
glantau
parents:
diff changeset
237 if (s->h263_pred) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
238 free(s->dc_val[0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
239 free(s->ac_val[0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
240 free(s->coded_block);
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
241 free(s->mbintra_table);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
242 }
7
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
243 if (s->mbskip_table)
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
244 free(s->mbskip_table);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
245 for(i=0;i<3;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
246 free(s->last_picture_base[i]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
247 free(s->next_picture_base[i]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
248 if (s->has_b_frames)
986e461dc072 Initial revision
glantau
parents:
diff changeset
249 free(s->aux_picture_base[i]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
250 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
251 s->context_initialized = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
252 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
253
986e461dc072 Initial revision
glantau
parents:
diff changeset
254 /* init video encoder */
986e461dc072 Initial revision
glantau
parents:
diff changeset
255 int MPV_encode_init(AVCodecContext *avctx)
986e461dc072 Initial revision
glantau
parents:
diff changeset
256 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
257 MpegEncContext *s = avctx->priv_data;
60
35c1141e23d9 moved matrix init away from MPV_common_init()
glantau
parents: 57
diff changeset
258 int i;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
259
986e461dc072 Initial revision
glantau
parents:
diff changeset
260 s->bit_rate = avctx->bit_rate;
986e461dc072 Initial revision
glantau
parents:
diff changeset
261 s->frame_rate = avctx->frame_rate;
986e461dc072 Initial revision
glantau
parents:
diff changeset
262 s->width = avctx->width;
986e461dc072 Initial revision
glantau
parents:
diff changeset
263 s->height = avctx->height;
986e461dc072 Initial revision
glantau
parents:
diff changeset
264 s->gop_size = avctx->gop_size;
162
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
265 s->rtp_mode = avctx->rtp_mode;
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
266 s->rtp_payload_size = avctx->rtp_payload_size;
194
27d1773552c9 mpeg4 encoder fix by Michael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 191
diff changeset
267 s->avctx = avctx;
162
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
268
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
269 if (s->gop_size <= 1) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
270 s->intra_only = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
271 s->gop_size = 12;
986e461dc072 Initial revision
glantau
parents:
diff changeset
272 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
273 s->intra_only = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
274 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
275 s->full_search = motion_estimation_method;
986e461dc072 Initial revision
glantau
parents:
diff changeset
276
986e461dc072 Initial revision
glantau
parents:
diff changeset
277 s->fixed_qscale = (avctx->flags & CODEC_FLAG_QSCALE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
278
986e461dc072 Initial revision
glantau
parents:
diff changeset
279 switch(avctx->codec->id) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
280 case CODEC_ID_MPEG1VIDEO:
986e461dc072 Initial revision
glantau
parents:
diff changeset
281 s->out_format = FMT_MPEG1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
282 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
283 case CODEC_ID_MJPEG:
986e461dc072 Initial revision
glantau
parents:
diff changeset
284 s->out_format = FMT_MJPEG;
986e461dc072 Initial revision
glantau
parents:
diff changeset
285 s->intra_only = 1; /* force intra only for jpeg */
229
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 227
diff changeset
286 s->mjpeg_write_tables = 1; /* write all tables */
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 227
diff changeset
287 s->mjpeg_vsample[0] = 2; /* set up default sampling factors */
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 227
diff changeset
288 s->mjpeg_vsample[1] = 1; /* the only currently supported values */
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 227
diff changeset
289 s->mjpeg_vsample[2] = 1;
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 227
diff changeset
290 s->mjpeg_hsample[0] = 2;
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 227
diff changeset
291 s->mjpeg_hsample[1] = 1;
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 227
diff changeset
292 s->mjpeg_hsample[2] = 1;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
293 if (mjpeg_init(s) < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
294 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
295 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
296 case CODEC_ID_H263:
178
374f80a78f0d informal msg
arpi_esp
parents: 176
diff changeset
297 if (h263_get_picture_format(s->width, s->height) == 7){
374f80a78f0d informal msg
arpi_esp
parents: 176
diff changeset
298 printf("Input picture size isn't suitable for h263 codec! try h263+\n");
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
299 return -1;
178
374f80a78f0d informal msg
arpi_esp
parents: 176
diff changeset
300 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
301 s->out_format = FMT_H263;
986e461dc072 Initial revision
glantau
parents:
diff changeset
302 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
303 case CODEC_ID_H263P:
986e461dc072 Initial revision
glantau
parents:
diff changeset
304 s->out_format = FMT_H263;
162
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
305 s->rtp_mode = 1;
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
306 s->rtp_payload_size = 1200;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
307 s->h263_plus = 1;
78
92ed1c4f94fa Added support to Unrestricted Motion Vectors (UMV)
pulento
parents: 71
diff changeset
308 s->unrestricted_mv = 1;
79
82e579c37bc3 Moved some H.263+ variables to MpegEncContext to be thread-safe.
pulento
parents: 78
diff changeset
309
82e579c37bc3 Moved some H.263+ variables to MpegEncContext to be thread-safe.
pulento
parents: 78
diff changeset
310 /* These are just to be sure */
82e579c37bc3 Moved some H.263+ variables to MpegEncContext to be thread-safe.
pulento
parents: 78
diff changeset
311 s->umvplus = 0;
82e579c37bc3 Moved some H.263+ variables to MpegEncContext to be thread-safe.
pulento
parents: 78
diff changeset
312 s->umvplus_dec = 0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
313 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
314 case CODEC_ID_RV10:
986e461dc072 Initial revision
glantau
parents:
diff changeset
315 s->out_format = FMT_H263;
986e461dc072 Initial revision
glantau
parents:
diff changeset
316 s->h263_rv10 = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
317 break;
71
79be2c581c01 changed opendivx to mpeg4
glantau
parents: 64
diff changeset
318 case CODEC_ID_MPEG4:
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
319 s->out_format = FMT_H263;
986e461dc072 Initial revision
glantau
parents:
diff changeset
320 s->h263_pred = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
321 s->unrestricted_mv = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
322 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
323 case CODEC_ID_MSMPEG4:
986e461dc072 Initial revision
glantau
parents:
diff changeset
324 s->out_format = FMT_H263;
986e461dc072 Initial revision
glantau
parents:
diff changeset
325 s->h263_msmpeg4 = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
326 s->h263_pred = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
327 s->unrestricted_mv = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
328 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
329 default:
986e461dc072 Initial revision
glantau
parents:
diff changeset
330 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
331 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
332
986e461dc072 Initial revision
glantau
parents:
diff changeset
333 if (s->out_format == FMT_H263)
986e461dc072 Initial revision
glantau
parents:
diff changeset
334 h263_encode_init_vlc(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
335
7
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
336 s->encoding = 1;
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
337
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
338 /* init */
986e461dc072 Initial revision
glantau
parents:
diff changeset
339 if (MPV_common_init(s) < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
340 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
341
60
35c1141e23d9 moved matrix init away from MPV_common_init()
glantau
parents: 57
diff changeset
342 /* init default q matrix */
35c1141e23d9 moved matrix init away from MPV_common_init()
glantau
parents: 57
diff changeset
343 for(i=0;i<64;i++) {
35c1141e23d9 moved matrix init away from MPV_common_init()
glantau
parents: 57
diff changeset
344 s->intra_matrix[i] = default_intra_matrix[i];
35c1141e23d9 moved matrix init away from MPV_common_init()
glantau
parents: 57
diff changeset
345 s->non_intra_matrix[i] = default_non_intra_matrix[i];
35c1141e23d9 moved matrix init away from MPV_common_init()
glantau
parents: 57
diff changeset
346 }
35c1141e23d9 moved matrix init away from MPV_common_init()
glantau
parents: 57
diff changeset
347
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
348 /* rate control init */
986e461dc072 Initial revision
glantau
parents:
diff changeset
349 rate_control_init(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
350
986e461dc072 Initial revision
glantau
parents:
diff changeset
351 s->picture_number = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
352 s->fake_picture_number = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
353 /* motion detector init */
986e461dc072 Initial revision
glantau
parents:
diff changeset
354 s->f_code = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
355
986e461dc072 Initial revision
glantau
parents:
diff changeset
356 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
357 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
358
986e461dc072 Initial revision
glantau
parents:
diff changeset
359 int MPV_encode_end(AVCodecContext *avctx)
986e461dc072 Initial revision
glantau
parents:
diff changeset
360 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
361 MpegEncContext *s = avctx->priv_data;
986e461dc072 Initial revision
glantau
parents:
diff changeset
362
986e461dc072 Initial revision
glantau
parents:
diff changeset
363 #ifdef STATS
986e461dc072 Initial revision
glantau
parents:
diff changeset
364 print_stats();
986e461dc072 Initial revision
glantau
parents:
diff changeset
365 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
366 MPV_common_end(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
367 if (s->out_format == FMT_MJPEG)
986e461dc072 Initial revision
glantau
parents:
diff changeset
368 mjpeg_close(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
369 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
370 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
371
986e461dc072 Initial revision
glantau
parents:
diff changeset
372 /* draw the edges of width 'w' of an image of size width, height */
206
994aa8623443 (commit by michael)
arpi_esp
parents: 200
diff changeset
373 static void draw_edges_c(UINT8 *buf, int wrap, int width, int height, int w)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
374 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
375 UINT8 *ptr, *last_line;
986e461dc072 Initial revision
glantau
parents:
diff changeset
376 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
377
986e461dc072 Initial revision
glantau
parents:
diff changeset
378 last_line = buf + (height - 1) * wrap;
986e461dc072 Initial revision
glantau
parents:
diff changeset
379 for(i=0;i<w;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
380 /* top and bottom */
986e461dc072 Initial revision
glantau
parents:
diff changeset
381 memcpy(buf - (i + 1) * wrap, buf, width);
986e461dc072 Initial revision
glantau
parents:
diff changeset
382 memcpy(last_line + (i + 1) * wrap, last_line, width);
986e461dc072 Initial revision
glantau
parents:
diff changeset
383 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
384 /* left and right */
986e461dc072 Initial revision
glantau
parents:
diff changeset
385 ptr = buf;
986e461dc072 Initial revision
glantau
parents:
diff changeset
386 for(i=0;i<height;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
387 memset(ptr - w, ptr[0], w);
986e461dc072 Initial revision
glantau
parents:
diff changeset
388 memset(ptr + width, ptr[width-1], w);
986e461dc072 Initial revision
glantau
parents:
diff changeset
389 ptr += wrap;
986e461dc072 Initial revision
glantau
parents:
diff changeset
390 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
391 /* corners */
986e461dc072 Initial revision
glantau
parents:
diff changeset
392 for(i=0;i<w;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
393 memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
986e461dc072 Initial revision
glantau
parents:
diff changeset
394 memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
986e461dc072 Initial revision
glantau
parents:
diff changeset
395 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
986e461dc072 Initial revision
glantau
parents:
diff changeset
396 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
986e461dc072 Initial revision
glantau
parents:
diff changeset
397 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
398 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
399
986e461dc072 Initial revision
glantau
parents:
diff changeset
400 /* generic function for encode/decode called before a frame is coded/decoded */
986e461dc072 Initial revision
glantau
parents:
diff changeset
401 void MPV_frame_start(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
402 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
403 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
404 UINT8 *tmp;
986e461dc072 Initial revision
glantau
parents:
diff changeset
405
46
931417475f5b fixed mpeg1 first block bug (pb with black picture optimisation for B frames)
glantau
parents: 40
diff changeset
406 s->mb_skiped = 0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
407 if (s->pict_type == B_TYPE) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
408 for(i=0;i<3;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
409 s->current_picture[i] = s->aux_picture[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
410 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
411 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
412 for(i=0;i<3;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
413 /* swap next and last */
986e461dc072 Initial revision
glantau
parents:
diff changeset
414 tmp = s->last_picture[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
415 s->last_picture[i] = s->next_picture[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
416 s->next_picture[i] = tmp;
986e461dc072 Initial revision
glantau
parents:
diff changeset
417 s->current_picture[i] = tmp;
986e461dc072 Initial revision
glantau
parents:
diff changeset
418 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
419 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
420 }
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
421
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
422 /* generic function for encode/decode called after a frame has been coded/decoded */
986e461dc072 Initial revision
glantau
parents:
diff changeset
423 void MPV_frame_end(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
424 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
425 /* draw edge for correct motion prediction if outside */
220
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
426 if (s->pict_type != B_TYPE && !s->intra_only) {
198
82ba367b1827 rv10 sig11 fix by Michael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 197
diff changeset
427 if(s->avctx==NULL || s->avctx->codec->id!=CODEC_ID_MPEG4){
176
9ce215ee9216 unrestricted MC fixed - thanks to Michael Niedermayer for idea
arpi_esp
parents: 162
diff changeset
428 draw_edges(s->current_picture[0], s->linesize, s->mb_width*16, s->mb_height*16, EDGE_WIDTH);
9ce215ee9216 unrestricted MC fixed - thanks to Michael Niedermayer for idea
arpi_esp
parents: 162
diff changeset
429 draw_edges(s->current_picture[1], s->linesize/2, s->mb_width*8, s->mb_height*8, EDGE_WIDTH/2);
9ce215ee9216 unrestricted MC fixed - thanks to Michael Niedermayer for idea
arpi_esp
parents: 162
diff changeset
430 draw_edges(s->current_picture[2], s->linesize/2, s->mb_width*8, s->mb_height*8, EDGE_WIDTH/2);
189
42552c1cf360 fix different UMV handling for mpeg4 vs. h263 - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 187
diff changeset
431 }else{
42552c1cf360 fix different UMV handling for mpeg4 vs. h263 - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 187
diff changeset
432 /* OpenDivx, but i dunno how to distinguish it from mpeg4 */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
433 draw_edges(s->current_picture[0], s->linesize, s->width, s->height, EDGE_WIDTH);
986e461dc072 Initial revision
glantau
parents:
diff changeset
434 draw_edges(s->current_picture[1], s->linesize/2, s->width/2, s->height/2, EDGE_WIDTH/2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
435 draw_edges(s->current_picture[2], s->linesize/2, s->width/2, s->height/2, EDGE_WIDTH/2);
189
42552c1cf360 fix different UMV handling for mpeg4 vs. h263 - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 187
diff changeset
436 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
437 }
207
6954f2830e4a (commit by michael)
arpi_esp
parents: 206
diff changeset
438 emms_c();
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
439 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
440
986e461dc072 Initial revision
glantau
parents:
diff changeset
441 int MPV_encode_picture(AVCodecContext *avctx,
986e461dc072 Initial revision
glantau
parents:
diff changeset
442 unsigned char *buf, int buf_size, void *data)
986e461dc072 Initial revision
glantau
parents:
diff changeset
443 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
444 MpegEncContext *s = avctx->priv_data;
986e461dc072 Initial revision
glantau
parents:
diff changeset
445 AVPicture *pict = data;
986e461dc072 Initial revision
glantau
parents:
diff changeset
446 int i, j;
986e461dc072 Initial revision
glantau
parents:
diff changeset
447
986e461dc072 Initial revision
glantau
parents:
diff changeset
448 if (s->fixed_qscale)
986e461dc072 Initial revision
glantau
parents:
diff changeset
449 s->qscale = avctx->quality;
986e461dc072 Initial revision
glantau
parents:
diff changeset
450
986e461dc072 Initial revision
glantau
parents:
diff changeset
451 init_put_bits(&s->pb, buf, buf_size, NULL, NULL);
986e461dc072 Initial revision
glantau
parents:
diff changeset
452
986e461dc072 Initial revision
glantau
parents:
diff changeset
453 if (!s->intra_only) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
454 /* first picture of GOP is intra */
986e461dc072 Initial revision
glantau
parents:
diff changeset
455 if ((s->picture_number % s->gop_size) == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
456 s->pict_type = I_TYPE;
986e461dc072 Initial revision
glantau
parents:
diff changeset
457 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
458 s->pict_type = P_TYPE;
986e461dc072 Initial revision
glantau
parents:
diff changeset
459 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
460 s->pict_type = I_TYPE;
986e461dc072 Initial revision
glantau
parents:
diff changeset
461 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
462 avctx->key_frame = (s->pict_type == I_TYPE);
986e461dc072 Initial revision
glantau
parents:
diff changeset
463
986e461dc072 Initial revision
glantau
parents:
diff changeset
464 MPV_frame_start(s);
220
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
465
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
466 for(i=0;i<3;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
467 UINT8 *src = pict->data[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
468 UINT8 *dest = s->current_picture[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
469 int src_wrap = pict->linesize[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
470 int dest_wrap = s->linesize;
986e461dc072 Initial revision
glantau
parents:
diff changeset
471 int w = s->width;
986e461dc072 Initial revision
glantau
parents:
diff changeset
472 int h = s->height;
986e461dc072 Initial revision
glantau
parents:
diff changeset
473
986e461dc072 Initial revision
glantau
parents:
diff changeset
474 if (i >= 1) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
475 dest_wrap >>= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
476 w >>= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
477 h >>= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
478 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
479
227
ec1bc02a0a47 avoid copying input when encoding non intra stuff too
michaelni
parents: 220
diff changeset
480 if(dest_wrap==src_wrap){
ec1bc02a0a47 avoid copying input when encoding non intra stuff too
michaelni
parents: 220
diff changeset
481 s->new_picture[i] = pict->data[i];
220
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
482 }else {
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
483 for(j=0;j<h;j++) {
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
484 memcpy(dest, src, w);
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
485 dest += dest_wrap;
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
486 src += src_wrap;
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
487 }
227
ec1bc02a0a47 avoid copying input when encoding non intra stuff too
michaelni
parents: 220
diff changeset
488 s->new_picture[i] = s->current_picture[i];
220
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
489 }
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 encode_picture(s, s->picture_number);
986e461dc072 Initial revision
glantau
parents:
diff changeset
493
986e461dc072 Initial revision
glantau
parents:
diff changeset
494 MPV_frame_end(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
495 s->picture_number++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
496
986e461dc072 Initial revision
glantau
parents:
diff changeset
497 if (s->out_format == FMT_MJPEG)
986e461dc072 Initial revision
glantau
parents:
diff changeset
498 mjpeg_picture_trailer(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
499
986e461dc072 Initial revision
glantau
parents:
diff changeset
500 flush_put_bits(&s->pb);
986e461dc072 Initial revision
glantau
parents:
diff changeset
501 s->total_bits += (s->pb.buf_ptr - s->pb.buf) * 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
502 avctx->quality = s->qscale;
986e461dc072 Initial revision
glantau
parents:
diff changeset
503 return s->pb.buf_ptr - s->pb.buf;
986e461dc072 Initial revision
glantau
parents:
diff changeset
504 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
505
986e461dc072 Initial revision
glantau
parents:
diff changeset
506 static inline int clip(int a, int amin, int amax)
986e461dc072 Initial revision
glantau
parents:
diff changeset
507 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
508 if (a < amin)
986e461dc072 Initial revision
glantau
parents:
diff changeset
509 return amin;
986e461dc072 Initial revision
glantau
parents:
diff changeset
510 else if (a > amax)
986e461dc072 Initial revision
glantau
parents:
diff changeset
511 return amax;
986e461dc072 Initial revision
glantau
parents:
diff changeset
512 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
513 return a;
986e461dc072 Initial revision
glantau
parents:
diff changeset
514 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
515
986e461dc072 Initial revision
glantau
parents:
diff changeset
516 /* apply one mpeg motion vector to the three components */
986e461dc072 Initial revision
glantau
parents:
diff changeset
517 static inline void mpeg_motion(MpegEncContext *s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
518 UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,
986e461dc072 Initial revision
glantau
parents:
diff changeset
519 int dest_offset,
986e461dc072 Initial revision
glantau
parents:
diff changeset
520 UINT8 **ref_picture, int src_offset,
986e461dc072 Initial revision
glantau
parents:
diff changeset
521 int field_based, op_pixels_func *pix_op,
986e461dc072 Initial revision
glantau
parents:
diff changeset
522 int motion_x, int motion_y, int h)
986e461dc072 Initial revision
glantau
parents:
diff changeset
523 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
524 UINT8 *ptr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
525 int dxy, offset, mx, my, src_x, src_y, height, linesize;
986e461dc072 Initial revision
glantau
parents:
diff changeset
526
986e461dc072 Initial revision
glantau
parents:
diff changeset
527 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
528 src_x = s->mb_x * 16 + (motion_x >> 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
529 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
530
986e461dc072 Initial revision
glantau
parents:
diff changeset
531 /* WARNING: do no forget half pels */
986e461dc072 Initial revision
glantau
parents:
diff changeset
532 height = s->height >> field_based;
986e461dc072 Initial revision
glantau
parents:
diff changeset
533 src_x = clip(src_x, -16, s->width);
986e461dc072 Initial revision
glantau
parents:
diff changeset
534 if (src_x == s->width)
986e461dc072 Initial revision
glantau
parents:
diff changeset
535 dxy &= ~1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
536 src_y = clip(src_y, -16, height);
986e461dc072 Initial revision
glantau
parents:
diff changeset
537 if (src_y == height)
986e461dc072 Initial revision
glantau
parents:
diff changeset
538 dxy &= ~2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
539 linesize = s->linesize << field_based;
986e461dc072 Initial revision
glantau
parents:
diff changeset
540 ptr = ref_picture[0] + (src_y * linesize) + (src_x) + src_offset;
986e461dc072 Initial revision
glantau
parents:
diff changeset
541 dest_y += dest_offset;
986e461dc072 Initial revision
glantau
parents:
diff changeset
542 pix_op[dxy](dest_y, ptr, linesize, h);
986e461dc072 Initial revision
glantau
parents:
diff changeset
543 pix_op[dxy](dest_y + 8, ptr + 8, linesize, h);
986e461dc072 Initial revision
glantau
parents:
diff changeset
544
986e461dc072 Initial revision
glantau
parents:
diff changeset
545 if (s->out_format == FMT_H263) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
546 dxy = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
547 if ((motion_x & 3) != 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
548 dxy |= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
549 if ((motion_y & 3) != 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
550 dxy |= 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
551 mx = motion_x >> 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
552 my = motion_y >> 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
553 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
554 mx = motion_x / 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
555 my = motion_y / 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
556 dxy = ((my & 1) << 1) | (mx & 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
557 mx >>= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
558 my >>= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
559 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
560
986e461dc072 Initial revision
glantau
parents:
diff changeset
561 src_x = s->mb_x * 8 + mx;
986e461dc072 Initial revision
glantau
parents:
diff changeset
562 src_y = s->mb_y * (8 >> field_based) + my;
986e461dc072 Initial revision
glantau
parents:
diff changeset
563 src_x = clip(src_x, -8, s->width >> 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
564 if (src_x == (s->width >> 1))
986e461dc072 Initial revision
glantau
parents:
diff changeset
565 dxy &= ~1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
566 src_y = clip(src_y, -8, height >> 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
567 if (src_y == (height >> 1))
986e461dc072 Initial revision
glantau
parents:
diff changeset
568 dxy &= ~2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
569
986e461dc072 Initial revision
glantau
parents:
diff changeset
570 offset = (src_y * (linesize >> 1)) + src_x + (src_offset >> 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
571 ptr = ref_picture[1] + offset;
986e461dc072 Initial revision
glantau
parents:
diff changeset
572 pix_op[dxy](dest_cb + (dest_offset >> 1), ptr, linesize >> 1, h >> 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
573 ptr = ref_picture[2] + offset;
986e461dc072 Initial revision
glantau
parents:
diff changeset
574 pix_op[dxy](dest_cr + (dest_offset >> 1), ptr, linesize >> 1, h >> 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
575 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
576
986e461dc072 Initial revision
glantau
parents:
diff changeset
577 static inline void MPV_motion(MpegEncContext *s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
578 UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr,
986e461dc072 Initial revision
glantau
parents:
diff changeset
579 int dir, UINT8 **ref_picture,
986e461dc072 Initial revision
glantau
parents:
diff changeset
580 op_pixels_func *pix_op)
986e461dc072 Initial revision
glantau
parents:
diff changeset
581 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
582 int dxy, offset, mx, my, src_x, src_y, motion_x, motion_y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
583 int mb_x, mb_y, i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
584 UINT8 *ptr, *dest;
986e461dc072 Initial revision
glantau
parents:
diff changeset
585
986e461dc072 Initial revision
glantau
parents:
diff changeset
586 mb_x = s->mb_x;
986e461dc072 Initial revision
glantau
parents:
diff changeset
587 mb_y = s->mb_y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
588
986e461dc072 Initial revision
glantau
parents:
diff changeset
589 switch(s->mv_type) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
590 case MV_TYPE_16X16:
986e461dc072 Initial revision
glantau
parents:
diff changeset
591 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
986e461dc072 Initial revision
glantau
parents:
diff changeset
592 ref_picture, 0,
986e461dc072 Initial revision
glantau
parents:
diff changeset
593 0, pix_op,
986e461dc072 Initial revision
glantau
parents:
diff changeset
594 s->mv[dir][0][0], s->mv[dir][0][1], 16);
986e461dc072 Initial revision
glantau
parents:
diff changeset
595 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
596 case MV_TYPE_8X8:
986e461dc072 Initial revision
glantau
parents:
diff changeset
597 for(i=0;i<4;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
598 motion_x = s->mv[dir][i][0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
599 motion_y = s->mv[dir][i][1];
986e461dc072 Initial revision
glantau
parents:
diff changeset
600
986e461dc072 Initial revision
glantau
parents:
diff changeset
601 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
602 src_x = mb_x * 16 + (motion_x >> 1) + (i & 1) * 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
603 src_y = mb_y * 16 + (motion_y >> 1) + ((i >> 1) & 1) * 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
604
986e461dc072 Initial revision
glantau
parents:
diff changeset
605 /* WARNING: do no forget half pels */
986e461dc072 Initial revision
glantau
parents:
diff changeset
606 src_x = clip(src_x, -16, s->width);
986e461dc072 Initial revision
glantau
parents:
diff changeset
607 if (src_x == s->width)
986e461dc072 Initial revision
glantau
parents:
diff changeset
608 dxy &= ~1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
609 src_y = clip(src_y, -16, s->height);
986e461dc072 Initial revision
glantau
parents:
diff changeset
610 if (src_y == s->height)
986e461dc072 Initial revision
glantau
parents:
diff changeset
611 dxy &= ~2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
612
986e461dc072 Initial revision
glantau
parents:
diff changeset
613 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
986e461dc072 Initial revision
glantau
parents:
diff changeset
614 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
986e461dc072 Initial revision
glantau
parents:
diff changeset
615 pix_op[dxy](dest, ptr, s->linesize, 8);
986e461dc072 Initial revision
glantau
parents:
diff changeset
616 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
617 /* In case of 8X8, we construct a single chroma motion vector
986e461dc072 Initial revision
glantau
parents:
diff changeset
618 with a special rounding */
986e461dc072 Initial revision
glantau
parents:
diff changeset
619 mx = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
620 my = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
621 for(i=0;i<4;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
622 mx += s->mv[dir][i][0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
623 my += s->mv[dir][i][1];
986e461dc072 Initial revision
glantau
parents:
diff changeset
624 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
625 if (mx >= 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
626 mx = (h263_chroma_roundtab[mx & 0xf] + ((mx >> 3) & ~1));
986e461dc072 Initial revision
glantau
parents:
diff changeset
627 else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
628 mx = -mx;
986e461dc072 Initial revision
glantau
parents:
diff changeset
629 mx = -(h263_chroma_roundtab[mx & 0xf] + ((mx >> 3) & ~1));
986e461dc072 Initial revision
glantau
parents:
diff changeset
630 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
631 if (my >= 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
632 my = (h263_chroma_roundtab[my & 0xf] + ((my >> 3) & ~1));
986e461dc072 Initial revision
glantau
parents:
diff changeset
633 else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
634 my = -my;
986e461dc072 Initial revision
glantau
parents:
diff changeset
635 my = -(h263_chroma_roundtab[my & 0xf] + ((my >> 3) & ~1));
986e461dc072 Initial revision
glantau
parents:
diff changeset
636 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
637 dxy = ((my & 1) << 1) | (mx & 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
638 mx >>= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
639 my >>= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
640
986e461dc072 Initial revision
glantau
parents:
diff changeset
641 src_x = mb_x * 8 + mx;
986e461dc072 Initial revision
glantau
parents:
diff changeset
642 src_y = mb_y * 8 + my;
986e461dc072 Initial revision
glantau
parents:
diff changeset
643 src_x = clip(src_x, -8, s->width/2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
644 if (src_x == s->width/2)
986e461dc072 Initial revision
glantau
parents:
diff changeset
645 dxy &= ~1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
646 src_y = clip(src_y, -8, s->height/2);
986e461dc072 Initial revision
glantau
parents:
diff changeset
647 if (src_y == s->height/2)
986e461dc072 Initial revision
glantau
parents:
diff changeset
648 dxy &= ~2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
649
986e461dc072 Initial revision
glantau
parents:
diff changeset
650 offset = (src_y * (s->linesize >> 1)) + src_x;
986e461dc072 Initial revision
glantau
parents:
diff changeset
651 ptr = ref_picture[1] + offset;
986e461dc072 Initial revision
glantau
parents:
diff changeset
652 pix_op[dxy](dest_cb, ptr, s->linesize >> 1, 8);
986e461dc072 Initial revision
glantau
parents:
diff changeset
653 ptr = ref_picture[2] + offset;
986e461dc072 Initial revision
glantau
parents:
diff changeset
654 pix_op[dxy](dest_cr, ptr, s->linesize >> 1, 8);
986e461dc072 Initial revision
glantau
parents:
diff changeset
655 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
656 case MV_TYPE_FIELD:
986e461dc072 Initial revision
glantau
parents:
diff changeset
657 if (s->picture_structure == PICT_FRAME) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
658 /* top field */
986e461dc072 Initial revision
glantau
parents:
diff changeset
659 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
986e461dc072 Initial revision
glantau
parents:
diff changeset
660 ref_picture, s->field_select[dir][0] ? s->linesize : 0,
986e461dc072 Initial revision
glantau
parents:
diff changeset
661 1, pix_op,
986e461dc072 Initial revision
glantau
parents:
diff changeset
662 s->mv[dir][0][0], s->mv[dir][0][1], 8);
986e461dc072 Initial revision
glantau
parents:
diff changeset
663 /* bottom field */
986e461dc072 Initial revision
glantau
parents:
diff changeset
664 mpeg_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
986e461dc072 Initial revision
glantau
parents:
diff changeset
665 ref_picture, s->field_select[dir][1] ? s->linesize : 0,
986e461dc072 Initial revision
glantau
parents:
diff changeset
666 1, pix_op,
986e461dc072 Initial revision
glantau
parents:
diff changeset
667 s->mv[dir][1][0], s->mv[dir][1][1], 8);
986e461dc072 Initial revision
glantau
parents:
diff changeset
668 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
669
986e461dc072 Initial revision
glantau
parents:
diff changeset
670
986e461dc072 Initial revision
glantau
parents:
diff changeset
671 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
672 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
673 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
674 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
675
986e461dc072 Initial revision
glantau
parents:
diff changeset
676
986e461dc072 Initial revision
glantau
parents:
diff changeset
677 /* put block[] to dest[] */
986e461dc072 Initial revision
glantau
parents:
diff changeset
678 static inline void put_dct(MpegEncContext *s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
679 DCTELEM *block, int i, UINT8 *dest, int line_size)
986e461dc072 Initial revision
glantau
parents:
diff changeset
680 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
681 if (!s->mpeg2)
13
174ef88f619a use block[] in structure to have it aligned on 8 bytes for mmx optimizations - dct_unquantize is always a function pointer - added specialized dct_unquantize_h263
glantau
parents: 8
diff changeset
682 s->dct_unquantize(s, block, i, s->qscale);
19
82d4c9be9873 MMX/MMXEXT iDCT support, using external functions currently defined in libmpeg2
arpi_esp
parents: 18
diff changeset
683 ff_idct (block);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
684 put_pixels_clamped(block, dest, line_size);
986e461dc072 Initial revision
glantau
parents:
diff changeset
685 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
686
986e461dc072 Initial revision
glantau
parents:
diff changeset
687 /* add block[] to dest[] */
986e461dc072 Initial revision
glantau
parents:
diff changeset
688 static inline void add_dct(MpegEncContext *s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
689 DCTELEM *block, int i, UINT8 *dest, int line_size)
986e461dc072 Initial revision
glantau
parents:
diff changeset
690 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
691 if (s->block_last_index[i] >= 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
692 if (!s->mpeg2)
206
994aa8623443 (commit by michael)
arpi_esp
parents: 200
diff changeset
693 if(s->encoding || (!s->h263_msmpeg4))
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
694 s->dct_unquantize(s, block, i, s->qscale);
19
82d4c9be9873 MMX/MMXEXT iDCT support, using external functions currently defined in libmpeg2
arpi_esp
parents: 18
diff changeset
695 ff_idct (block);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
696 add_pixels_clamped(block, dest, line_size);
986e461dc072 Initial revision
glantau
parents:
diff changeset
697 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
698 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
699
986e461dc072 Initial revision
glantau
parents:
diff changeset
700 /* generic function called after a macroblock has been parsed by the
986e461dc072 Initial revision
glantau
parents:
diff changeset
701 decoder or after it has been encoded by the encoder.
986e461dc072 Initial revision
glantau
parents:
diff changeset
702
986e461dc072 Initial revision
glantau
parents:
diff changeset
703 Important variables used:
986e461dc072 Initial revision
glantau
parents:
diff changeset
704 s->mb_intra : true if intra macroblock
986e461dc072 Initial revision
glantau
parents:
diff changeset
705 s->mv_dir : motion vector direction
986e461dc072 Initial revision
glantau
parents:
diff changeset
706 s->mv_type : motion vector type
986e461dc072 Initial revision
glantau
parents:
diff changeset
707 s->mv : motion vector
986e461dc072 Initial revision
glantau
parents:
diff changeset
708 s->interlaced_dct : true if interlaced dct used (mpeg2)
986e461dc072 Initial revision
glantau
parents:
diff changeset
709 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
710 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
986e461dc072 Initial revision
glantau
parents:
diff changeset
711 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
712 int mb_x, mb_y, motion_x, motion_y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
713 int dct_linesize, dct_offset;
986e461dc072 Initial revision
glantau
parents:
diff changeset
714 op_pixels_func *op_pix;
986e461dc072 Initial revision
glantau
parents:
diff changeset
715
986e461dc072 Initial revision
glantau
parents:
diff changeset
716 mb_x = s->mb_x;
986e461dc072 Initial revision
glantau
parents:
diff changeset
717 mb_y = s->mb_y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
718
108
1e4a4af694d1 exporting qscale data for postprocessing (for MPlayer)
arpi_esp
parents: 79
diff changeset
719 #ifdef FF_POSTPROCESS
1e4a4af694d1 exporting qscale data for postprocessing (for MPlayer)
arpi_esp
parents: 79
diff changeset
720 quant_store[mb_y][mb_x]=s->qscale;
1e4a4af694d1 exporting qscale data for postprocessing (for MPlayer)
arpi_esp
parents: 79
diff changeset
721 //printf("[%02d][%02d] %d\n",mb_x,mb_y,s->qscale);
1e4a4af694d1 exporting qscale data for postprocessing (for MPlayer)
arpi_esp
parents: 79
diff changeset
722 #endif
1e4a4af694d1 exporting qscale data for postprocessing (for MPlayer)
arpi_esp
parents: 79
diff changeset
723
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
724 /* update DC predictors for P macroblocks */
986e461dc072 Initial revision
glantau
parents:
diff changeset
725 if (!s->mb_intra) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
726 if (s->h263_pred) {
191
883f184537e6 AC table reset (memset) optimization - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 189
diff changeset
727 if(s->mbintra_table[mb_x + mb_y*s->mb_width])
883f184537e6 AC table reset (memset) optimization - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 189
diff changeset
728 {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
729 int wrap, x, y, v;
191
883f184537e6 AC table reset (memset) optimization - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 189
diff changeset
730 s->mbintra_table[mb_x + mb_y*s->mb_width]=0;
883f184537e6 AC table reset (memset) optimization - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 189
diff changeset
731
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
732 wrap = 2 * s->mb_width + 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
733 v = 1024;
986e461dc072 Initial revision
glantau
parents:
diff changeset
734 x = 2 * mb_x + 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
735 y = 2 * mb_y + 1;
191
883f184537e6 AC table reset (memset) optimization - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 189
diff changeset
736
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
737 s->dc_val[0][(x) + (y) * wrap] = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
738 s->dc_val[0][(x + 1) + (y) * wrap] = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
739 s->dc_val[0][(x) + (y + 1) * wrap] = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
740 s->dc_val[0][(x + 1) + (y + 1) * wrap] = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
741 /* ac pred */
986e461dc072 Initial revision
glantau
parents:
diff changeset
742 memset(s->ac_val[0][(x) + (y) * wrap], 0, 16 * sizeof(INT16));
986e461dc072 Initial revision
glantau
parents:
diff changeset
743 memset(s->ac_val[0][(x + 1) + (y) * wrap], 0, 16 * sizeof(INT16));
986e461dc072 Initial revision
glantau
parents:
diff changeset
744 memset(s->ac_val[0][(x) + (y + 1) * wrap], 0, 16 * sizeof(INT16));
986e461dc072 Initial revision
glantau
parents:
diff changeset
745 memset(s->ac_val[0][(x + 1) + (y + 1) * wrap], 0, 16 * sizeof(INT16));
986e461dc072 Initial revision
glantau
parents:
diff changeset
746 if (s->h263_msmpeg4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
747 s->coded_block[(x) + (y) * wrap] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
748 s->coded_block[(x + 1) + (y) * wrap] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
749 s->coded_block[(x) + (y + 1) * wrap] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
750 s->coded_block[(x + 1) + (y + 1) * wrap] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
751 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
752 /* chroma */
986e461dc072 Initial revision
glantau
parents:
diff changeset
753 wrap = s->mb_width + 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
754 x = mb_x + 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
755 y = mb_y + 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
756 s->dc_val[1][(x) + (y) * wrap] = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
757 s->dc_val[2][(x) + (y) * wrap] = v;
986e461dc072 Initial revision
glantau
parents:
diff changeset
758 /* ac pred */
986e461dc072 Initial revision
glantau
parents:
diff changeset
759 memset(s->ac_val[1][(x) + (y) * wrap], 0, 16 * sizeof(INT16));
986e461dc072 Initial revision
glantau
parents:
diff changeset
760 memset(s->ac_val[2][(x) + (y) * wrap], 0, 16 * sizeof(INT16));
191
883f184537e6 AC table reset (memset) optimization - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 189
diff changeset
761 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
762 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
763 s->last_dc[0] = 128 << s->intra_dc_precision;
986e461dc072 Initial revision
glantau
parents:
diff changeset
764 s->last_dc[1] = 128 << s->intra_dc_precision;
986e461dc072 Initial revision
glantau
parents:
diff changeset
765 s->last_dc[2] = 128 << s->intra_dc_precision;
986e461dc072 Initial revision
glantau
parents:
diff changeset
766 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
767 }
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
768 else if (s->h263_pred)
191
883f184537e6 AC table reset (memset) optimization - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 189
diff changeset
769 s->mbintra_table[mb_x + mb_y*s->mb_width]=1;
883f184537e6 AC table reset (memset) optimization - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 189
diff changeset
770
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
771 /* update motion predictor */
986e461dc072 Initial revision
glantau
parents:
diff changeset
772 if (s->out_format == FMT_H263) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
773 int x, y, wrap;
986e461dc072 Initial revision
glantau
parents:
diff changeset
774
986e461dc072 Initial revision
glantau
parents:
diff changeset
775 x = 2 * mb_x + 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
776 y = 2 * mb_y + 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
777 wrap = 2 * s->mb_width + 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
778 if (s->mb_intra) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
779 motion_x = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
780 motion_y = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
781 goto motion_init;
986e461dc072 Initial revision
glantau
parents:
diff changeset
782 } else if (s->mv_type == MV_TYPE_16X16) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
783 motion_x = s->mv[0][0][0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
784 motion_y = s->mv[0][0][1];
986e461dc072 Initial revision
glantau
parents:
diff changeset
785 motion_init:
986e461dc072 Initial revision
glantau
parents:
diff changeset
786 /* no update if 8X8 because it has been done during parsing */
986e461dc072 Initial revision
glantau
parents:
diff changeset
787 s->motion_val[(x) + (y) * wrap][0] = motion_x;
986e461dc072 Initial revision
glantau
parents:
diff changeset
788 s->motion_val[(x) + (y) * wrap][1] = motion_y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
789 s->motion_val[(x + 1) + (y) * wrap][0] = motion_x;
986e461dc072 Initial revision
glantau
parents:
diff changeset
790 s->motion_val[(x + 1) + (y) * wrap][1] = motion_y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
791 s->motion_val[(x) + (y + 1) * wrap][0] = motion_x;
986e461dc072 Initial revision
glantau
parents:
diff changeset
792 s->motion_val[(x) + (y + 1) * wrap][1] = motion_y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
793 s->motion_val[(x + 1) + (y + 1) * wrap][0] = motion_x;
986e461dc072 Initial revision
glantau
parents:
diff changeset
794 s->motion_val[(x + 1) + (y + 1) * wrap][1] = motion_y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
795 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
796 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
797
986e461dc072 Initial revision
glantau
parents:
diff changeset
798 if (!s->intra_only) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
799 UINT8 *dest_y, *dest_cb, *dest_cr;
7
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
800 UINT8 *mbskip_ptr;
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
801
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
802 /* avoid copy if macroblock skipped in last frame too */
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
803 if (!s->encoding && s->pict_type != B_TYPE) {
7
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
804 mbskip_ptr = &s->mbskip_table[s->mb_y * s->mb_width + s->mb_x];
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
805 if (s->mb_skiped) {
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
806 s->mb_skiped = 0;
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
807 /* if previous was skipped too, then nothing to do ! */
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
808 if (*mbskip_ptr != 0)
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
809 goto the_end;
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
810 *mbskip_ptr = 1; /* indicate that this time we skiped it */
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
811 } else {
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
812 *mbskip_ptr = 0; /* not skipped */
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
813 }
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
814 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
815
986e461dc072 Initial revision
glantau
parents:
diff changeset
816 dest_y = s->current_picture[0] + (mb_y * 16 * s->linesize) + mb_x * 16;
986e461dc072 Initial revision
glantau
parents:
diff changeset
817 dest_cb = s->current_picture[1] + (mb_y * 8 * (s->linesize >> 1)) + mb_x * 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
818 dest_cr = s->current_picture[2] + (mb_y * 8 * (s->linesize >> 1)) + mb_x * 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
819
986e461dc072 Initial revision
glantau
parents:
diff changeset
820 if (s->interlaced_dct) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
821 dct_linesize = s->linesize * 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
822 dct_offset = s->linesize;
986e461dc072 Initial revision
glantau
parents:
diff changeset
823 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
824 dct_linesize = s->linesize;
986e461dc072 Initial revision
glantau
parents:
diff changeset
825 dct_offset = s->linesize * 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
826 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
827
986e461dc072 Initial revision
glantau
parents:
diff changeset
828 if (!s->mb_intra) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
829 /* motion handling */
986e461dc072 Initial revision
glantau
parents:
diff changeset
830 if (!s->no_rounding)
986e461dc072 Initial revision
glantau
parents:
diff changeset
831 op_pix = put_pixels_tab;
986e461dc072 Initial revision
glantau
parents:
diff changeset
832 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
833 op_pix = put_no_rnd_pixels_tab;
986e461dc072 Initial revision
glantau
parents:
diff changeset
834
986e461dc072 Initial revision
glantau
parents:
diff changeset
835 if (s->mv_dir & MV_DIR_FORWARD) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
836 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture, op_pix);
986e461dc072 Initial revision
glantau
parents:
diff changeset
837 if (!s->no_rounding)
986e461dc072 Initial revision
glantau
parents:
diff changeset
838 op_pix = avg_pixels_tab;
986e461dc072 Initial revision
glantau
parents:
diff changeset
839 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
840 op_pix = avg_no_rnd_pixels_tab;
986e461dc072 Initial revision
glantau
parents:
diff changeset
841 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
842 if (s->mv_dir & MV_DIR_BACKWARD) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
843 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture, op_pix);
986e461dc072 Initial revision
glantau
parents:
diff changeset
844 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
845
986e461dc072 Initial revision
glantau
parents:
diff changeset
846 /* add dct residue */
986e461dc072 Initial revision
glantau
parents:
diff changeset
847 add_dct(s, block[0], 0, dest_y, dct_linesize);
986e461dc072 Initial revision
glantau
parents:
diff changeset
848 add_dct(s, block[1], 1, dest_y + 8, dct_linesize);
986e461dc072 Initial revision
glantau
parents:
diff changeset
849 add_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
986e461dc072 Initial revision
glantau
parents:
diff changeset
850 add_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
986e461dc072 Initial revision
glantau
parents:
diff changeset
851
57
4efb718f4dc6 fixed mpeg2 interlaced DCT
glantau
parents: 46
diff changeset
852 add_dct(s, block[4], 4, dest_cb, s->linesize >> 1);
4efb718f4dc6 fixed mpeg2 interlaced DCT
glantau
parents: 46
diff changeset
853 add_dct(s, block[5], 5, dest_cr, s->linesize >> 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
854 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
855 /* dct only in intra block */
986e461dc072 Initial revision
glantau
parents:
diff changeset
856 put_dct(s, block[0], 0, dest_y, dct_linesize);
986e461dc072 Initial revision
glantau
parents:
diff changeset
857 put_dct(s, block[1], 1, dest_y + 8, dct_linesize);
986e461dc072 Initial revision
glantau
parents:
diff changeset
858 put_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
986e461dc072 Initial revision
glantau
parents:
diff changeset
859 put_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
986e461dc072 Initial revision
glantau
parents:
diff changeset
860
57
4efb718f4dc6 fixed mpeg2 interlaced DCT
glantau
parents: 46
diff changeset
861 put_dct(s, block[4], 4, dest_cb, s->linesize >> 1);
4efb718f4dc6 fixed mpeg2 interlaced DCT
glantau
parents: 46
diff changeset
862 put_dct(s, block[5], 5, dest_cr, s->linesize >> 1);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
863 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
864 }
7
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
865 the_end:
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
866 emms_c();
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
867 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
868
986e461dc072 Initial revision
glantau
parents:
diff changeset
869 static void encode_picture(MpegEncContext *s, int picture_number)
986e461dc072 Initial revision
glantau
parents:
diff changeset
870 {
162
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
871 int mb_x, mb_y, wrap, last_gob;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
872 UINT8 *ptr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
873 int i, motion_x, motion_y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
874
986e461dc072 Initial revision
glantau
parents:
diff changeset
875 s->picture_number = picture_number;
986e461dc072 Initial revision
glantau
parents:
diff changeset
876 if (!s->fixed_qscale)
986e461dc072 Initial revision
glantau
parents:
diff changeset
877 s->qscale = rate_estimate_qscale(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
878
986e461dc072 Initial revision
glantau
parents:
diff changeset
879 /* precompute matrix */
986e461dc072 Initial revision
glantau
parents:
diff changeset
880 if (s->out_format == FMT_MJPEG) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
881 /* for mjpeg, we do include qscale in the matrix */
986e461dc072 Initial revision
glantau
parents:
diff changeset
882 s->intra_matrix[0] = default_intra_matrix[0];
986e461dc072 Initial revision
glantau
parents:
diff changeset
883 for(i=1;i<64;i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
884 s->intra_matrix[i] = (default_intra_matrix[i] * s->qscale) >> 3;
220
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
885 convert_matrix(s->q_intra_matrix, s->q_intra_matrix16, s->intra_matrix, 8);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
886 } else {
220
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
887 convert_matrix(s->q_intra_matrix, s->q_intra_matrix16, s->intra_matrix, s->qscale);
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
888 convert_matrix(s->q_non_intra_matrix, s->q_non_intra_matrix16, s->non_intra_matrix, s->qscale);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
889 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
890
986e461dc072 Initial revision
glantau
parents:
diff changeset
891 switch(s->out_format) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
892 case FMT_MJPEG:
986e461dc072 Initial revision
glantau
parents:
diff changeset
893 mjpeg_picture_header(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
894 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
895 case FMT_H263:
986e461dc072 Initial revision
glantau
parents:
diff changeset
896 if (s->h263_msmpeg4)
986e461dc072 Initial revision
glantau
parents:
diff changeset
897 msmpeg4_encode_picture_header(s, picture_number);
986e461dc072 Initial revision
glantau
parents:
diff changeset
898 else if (s->h263_pred)
986e461dc072 Initial revision
glantau
parents:
diff changeset
899 mpeg4_encode_picture_header(s, picture_number);
986e461dc072 Initial revision
glantau
parents:
diff changeset
900 else if (s->h263_rv10)
986e461dc072 Initial revision
glantau
parents:
diff changeset
901 rv10_encode_picture_header(s, picture_number);
986e461dc072 Initial revision
glantau
parents:
diff changeset
902 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
903 h263_encode_picture_header(s, picture_number);
986e461dc072 Initial revision
glantau
parents:
diff changeset
904 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
905 case FMT_MPEG1:
986e461dc072 Initial revision
glantau
parents:
diff changeset
906 mpeg1_encode_picture_header(s, picture_number);
986e461dc072 Initial revision
glantau
parents:
diff changeset
907 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
908 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
909
986e461dc072 Initial revision
glantau
parents:
diff changeset
910 /* init last dc values */
986e461dc072 Initial revision
glantau
parents:
diff changeset
911 /* note: quant matrix value (8) is implied here */
986e461dc072 Initial revision
glantau
parents:
diff changeset
912 s->last_dc[0] = 128;
986e461dc072 Initial revision
glantau
parents:
diff changeset
913 s->last_dc[1] = 128;
986e461dc072 Initial revision
glantau
parents:
diff changeset
914 s->last_dc[2] = 128;
986e461dc072 Initial revision
glantau
parents:
diff changeset
915 s->mb_incr = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
916 s->last_mv[0][0][0] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
917 s->last_mv[0][0][1] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
918 s->mv_type = MV_TYPE_16X16;
986e461dc072 Initial revision
glantau
parents:
diff changeset
919 s->mv_dir = MV_DIR_FORWARD;
986e461dc072 Initial revision
glantau
parents:
diff changeset
920
162
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
921 /* Get the GOB height based on picture height */
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
922 if (s->out_format == FMT_H263 && s->h263_plus) {
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
923 if (s->height <= 400)
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
924 s->gob_index = 1;
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
925 else if (s->height <= 800)
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
926 s->gob_index = 2;
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
927 else
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
928 s->gob_index = 4;
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
929 }
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
930
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
931 for(mb_y=0; mb_y < s->mb_height; mb_y++) {
162
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
932 /* Put GOB header based on RTP MTU */
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
933 if (!mb_y) {
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
934 s->ptr_lastgob = s->pb.buf_ptr;
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
935 s->ptr_last_mb_line = s->pb.buf_ptr;
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
936 } else if (s->out_format == FMT_H263 && s->h263_plus) {
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
937 last_gob = h263_encode_gob_header(s, mb_y);
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
938 if (last_gob) {
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
939 //fprintf(stderr,"\nLast GOB size: %d", last_gob);
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
940 s->first_gob_line = 1;
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
941 } else
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
942 s->first_gob_line = 0;
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
943 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
944 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
945
986e461dc072 Initial revision
glantau
parents:
diff changeset
946 s->mb_x = mb_x;
986e461dc072 Initial revision
glantau
parents:
diff changeset
947 s->mb_y = mb_y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
948
986e461dc072 Initial revision
glantau
parents:
diff changeset
949 /* compute motion vector and macro block type (intra or non intra) */
986e461dc072 Initial revision
glantau
parents:
diff changeset
950 motion_x = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
951 motion_y = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
952 if (s->pict_type == P_TYPE) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
953 s->mb_intra = estimate_motion(s, mb_x, mb_y,
986e461dc072 Initial revision
glantau
parents:
diff changeset
954 &motion_x,
986e461dc072 Initial revision
glantau
parents:
diff changeset
955 &motion_y);
986e461dc072 Initial revision
glantau
parents:
diff changeset
956 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
957 s->mb_intra = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
958 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
959
986e461dc072 Initial revision
glantau
parents:
diff changeset
960 /* get the pixels */
986e461dc072 Initial revision
glantau
parents:
diff changeset
961 wrap = s->linesize;
986e461dc072 Initial revision
glantau
parents:
diff changeset
962 ptr = s->new_picture[0] + (mb_y * 16 * wrap) + mb_x * 16;
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
963 get_pixels(s->block[0], ptr, wrap);
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
964 get_pixels(s->block[1], ptr + 8, wrap);
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
965 get_pixels(s->block[2], ptr + 8 * wrap, wrap);
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
966 get_pixels(s->block[3], ptr + 8 * wrap + 8, wrap);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
967 wrap = s->linesize >> 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
968 ptr = s->new_picture[1] + (mb_y * 8 * wrap) + mb_x * 8;
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
969 get_pixels(s->block[4], ptr, wrap);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
970
986e461dc072 Initial revision
glantau
parents:
diff changeset
971 wrap = s->linesize >> 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
972 ptr = s->new_picture[2] + (mb_y * 8 * wrap) + mb_x * 8;
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
973 get_pixels(s->block[5], ptr, wrap);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
974
986e461dc072 Initial revision
glantau
parents:
diff changeset
975 /* subtract previous frame if non intra */
986e461dc072 Initial revision
glantau
parents:
diff changeset
976 if (!s->mb_intra) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
977 int dxy, offset, mx, my;
986e461dc072 Initial revision
glantau
parents:
diff changeset
978
986e461dc072 Initial revision
glantau
parents:
diff changeset
979 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
980 ptr = s->last_picture[0] +
986e461dc072 Initial revision
glantau
parents:
diff changeset
981 ((mb_y * 16 + (motion_y >> 1)) * s->linesize) +
986e461dc072 Initial revision
glantau
parents:
diff changeset
982 (mb_x * 16 + (motion_x >> 1));
986e461dc072 Initial revision
glantau
parents:
diff changeset
983
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
984 sub_pixels_2(s->block[0], ptr, s->linesize, dxy);
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
985 sub_pixels_2(s->block[1], ptr + 8, s->linesize, dxy);
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
986 sub_pixels_2(s->block[2], ptr + s->linesize * 8, s->linesize, dxy);
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
987 sub_pixels_2(s->block[3], ptr + 8 + s->linesize * 8, s->linesize ,dxy);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
988
986e461dc072 Initial revision
glantau
parents:
diff changeset
989 if (s->out_format == FMT_H263) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
990 /* special rounding for h263 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
991 dxy = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
992 if ((motion_x & 3) != 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
993 dxy |= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
994 if ((motion_y & 3) != 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
995 dxy |= 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
996 mx = motion_x >> 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
997 my = motion_y >> 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
998 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
999 mx = motion_x / 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1000 my = motion_y / 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1001 dxy = ((my & 1) << 1) | (mx & 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1002 mx >>= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1003 my >>= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1004 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1005 offset = ((mb_y * 8 + my) * (s->linesize >> 1)) + (mb_x * 8 + mx);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1006 ptr = s->last_picture[1] + offset;
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
1007 sub_pixels_2(s->block[4], ptr, s->linesize >> 1, dxy);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1008 ptr = s->last_picture[2] + offset;
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
1009 sub_pixels_2(s->block[5], ptr, s->linesize >> 1, dxy);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1010 }
7
1d3ac9654178 added skip macroblock optimization (big perf win on black regions for example)
glantau
parents: 0
diff changeset
1011 emms_c();
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1012
986e461dc072 Initial revision
glantau
parents:
diff changeset
1013 /* DCT & quantize */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1014 if (s->h263_msmpeg4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1015 msmpeg4_dc_scale(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1016 } else if (s->h263_pred) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1017 h263_dc_scale(s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1018 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1019 /* default quantization values */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1020 s->y_dc_scale = 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1021 s->c_dc_scale = 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1022 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1023 for(i=0;i<6;i++) {
220
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
1024 s->block_last_index[i] = dct_quantize(s, s->block[i], i, s->qscale);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1025 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1026
986e461dc072 Initial revision
glantau
parents:
diff changeset
1027 /* huffman encode */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1028 switch(s->out_format) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1029 case FMT_MPEG1:
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
1030 mpeg1_encode_mb(s, s->block, motion_x, motion_y);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1031 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1032 case FMT_H263:
986e461dc072 Initial revision
glantau
parents:
diff changeset
1033 if (s->h263_msmpeg4)
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
1034 msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1035 else
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
1036 h263_encode_mb(s, s->block, motion_x, motion_y);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1037 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1038 case FMT_MJPEG:
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
1039 mjpeg_encode_mb(s, s->block);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1040 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1041 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1042
986e461dc072 Initial revision
glantau
parents:
diff changeset
1043 /* decompress blocks so that we keep the state of the decoder */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1044 s->mv[0][0][0] = motion_x;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1045 s->mv[0][0][1] = motion_y;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1046
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
1047 MPV_decode_mb(s, s->block);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1048 }
162
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
1049 /* Obtain average MB line size for RTP */
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
1050 if (!mb_y)
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
1051 s->mb_line_avgsize = s->pb.buf_ptr - s->ptr_last_mb_line;
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
1052 else
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
1053 s->mb_line_avgsize = (s->mb_line_avgsize + s->pb.buf_ptr - s->ptr_last_mb_line) >> 1;
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
1054 //fprintf(stderr, "\nMB line: %d\tSize: %u\tAvg. Size: %u", s->mb_y,
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
1055 // (s->pb.buf_ptr - s->ptr_last_mb_line), s->mb_line_avgsize);
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
1056 s->ptr_last_mb_line = s->pb.buf_ptr;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1057 }
208
2eb04d6be309 (commit by michael)
arpi_esp
parents: 207
diff changeset
1058
2eb04d6be309 (commit by michael)
arpi_esp
parents: 207
diff changeset
1059 if (s->h263_msmpeg4)
2eb04d6be309 (commit by michael)
arpi_esp
parents: 207
diff changeset
1060 msmpeg4_encode_ext_header(s);
2eb04d6be309 (commit by michael)
arpi_esp
parents: 207
diff changeset
1061
162
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
1062 //if (s->gob_number)
de80712db90b - Preliminary RTP friendly mode for H.263.
pulento
parents: 108
diff changeset
1063 // fprintf(stderr,"\nNumber of GOB: %d", s->gob_number);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1064 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1065
220
0b234715e205 (commit by michael)
arpi_esp
parents: 217
diff changeset
1066 static int dct_quantize_c(MpegEncContext *s,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1067 DCTELEM *block, int n,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1068 int qscale)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1069 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1070 int i, j, level, last_non_zero, q;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1071 const int *qmat;
216
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1072 int minLevel, maxLevel;
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1073
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1074 if(s->avctx!=NULL && s->avctx->codec->id==CODEC_ID_MPEG4){
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1075 /* mpeg4 */
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1076 minLevel= -2048;
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1077 maxLevel= 2047;
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1078 }else if(s->out_format==FMT_MPEG1){
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1079 /* mpeg1 */
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1080 minLevel= -255;
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1081 maxLevel= 255;
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1082 }else{
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1083 /* h263 / msmpeg4 */
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1084 minLevel= -128;
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1085 maxLevel= 127;
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1086 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1087
986e461dc072 Initial revision
glantau
parents:
diff changeset
1088 av_fdct (block);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1089
64
5aa6292a1660 win32 fixes
glantau
parents: 60
diff changeset
1090 /* we need this permutation so that we correct the IDCT
5aa6292a1660 win32 fixes
glantau
parents: 60
diff changeset
1091 permutation. will be moved into DCT code */
5aa6292a1660 win32 fixes
glantau
parents: 60
diff changeset
1092 block_permute(block);
5aa6292a1660 win32 fixes
glantau
parents: 60
diff changeset
1093
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1094 if (s->mb_intra) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1095 if (n < 4)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1096 q = s->y_dc_scale;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1097 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
1098 q = s->c_dc_scale;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1099 q = q << 3;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1100
986e461dc072 Initial revision
glantau
parents:
diff changeset
1101 /* note: block[0] is assumed to be positive */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1102 block[0] = (block[0] + (q >> 1)) / q;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1103 i = 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1104 last_non_zero = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1105 if (s->out_format == FMT_H263) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1106 qmat = s->q_non_intra_matrix;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1107 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1108 qmat = s->q_intra_matrix;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1109 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1110 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1111 i = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1112 last_non_zero = -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1113 qmat = s->q_non_intra_matrix;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1114 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1115
986e461dc072 Initial revision
glantau
parents:
diff changeset
1116 for(;i<64;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1117 j = zigzag_direct[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
1118 level = block[j];
986e461dc072 Initial revision
glantau
parents:
diff changeset
1119 level = level * qmat[j];
986e461dc072 Initial revision
glantau
parents:
diff changeset
1120 #ifdef PARANOID
986e461dc072 Initial revision
glantau
parents:
diff changeset
1121 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1122 static int count = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1123 int level1, level2, qmat1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1124 double val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1125 if (qmat == s->q_non_intra_matrix) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1126 qmat1 = default_non_intra_matrix[j] * s->qscale;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1127 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1128 qmat1 = default_intra_matrix[j] * s->qscale;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1129 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1130 if (av_fdct != jpeg_fdct_ifast)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1131 val = ((double)block[j] * 8.0) / (double)qmat1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1132 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
1133 val = ((double)block[j] * 8.0 * 2048.0) /
986e461dc072 Initial revision
glantau
parents:
diff changeset
1134 ((double)qmat1 * aanscales[j]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1135 level1 = (int)val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1136 level2 = level / (1 << (QMAT_SHIFT - 3));
986e461dc072 Initial revision
glantau
parents:
diff changeset
1137 if (level1 != level2) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1138 fprintf(stderr, "%d: quant error qlevel=%d wanted=%d level=%d qmat1=%d qmat=%d wantedf=%0.6f\n",
986e461dc072 Initial revision
glantau
parents:
diff changeset
1139 count, level2, level1, block[j], qmat1, qmat[j],
986e461dc072 Initial revision
glantau
parents:
diff changeset
1140 val);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1141 count++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1142 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1143
986e461dc072 Initial revision
glantau
parents:
diff changeset
1144 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1145 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
1146 /* XXX: slight error for the low range. Test should be equivalent to
986e461dc072 Initial revision
glantau
parents:
diff changeset
1147 (level <= -(1 << (QMAT_SHIFT - 3)) || level >= (1 <<
986e461dc072 Initial revision
glantau
parents:
diff changeset
1148 (QMAT_SHIFT - 3)))
986e461dc072 Initial revision
glantau
parents:
diff changeset
1149 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1150 if (((level << (31 - (QMAT_SHIFT - 3))) >> (31 - (QMAT_SHIFT - 3))) !=
986e461dc072 Initial revision
glantau
parents:
diff changeset
1151 level) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1152 level = level / (1 << (QMAT_SHIFT - 3));
986e461dc072 Initial revision
glantau
parents:
diff changeset
1153 /* XXX: currently, this code is not optimal. the range should be:
986e461dc072 Initial revision
glantau
parents:
diff changeset
1154 mpeg1: -255..255
986e461dc072 Initial revision
glantau
parents:
diff changeset
1155 mpeg2: -2048..2047
986e461dc072 Initial revision
glantau
parents:
diff changeset
1156 h263: -128..127
986e461dc072 Initial revision
glantau
parents:
diff changeset
1157 mpeg4: -2048..2047
986e461dc072 Initial revision
glantau
parents:
diff changeset
1158 */
216
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1159 if (level > maxLevel)
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1160 level = maxLevel;
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1161 else if (level < minLevel)
f8802ed5332b (commit by michael)
arpi_esp
parents: 208
diff changeset
1162 level = minLevel;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1163
986e461dc072 Initial revision
glantau
parents:
diff changeset
1164 block[j] = level;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1165 last_non_zero = i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1166 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1167 block[j] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1168 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1169 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1170 return last_non_zero;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1171 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1172
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
1173 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
1174 DCTELEM *block, int n, int qscale)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1175 {
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1176 int i, level, nCoeffs;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1177 const UINT16 *quant_matrix;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1178
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1179 if(s->alternate_scan) nCoeffs= 64;
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1180 else nCoeffs= s->block_last_index[n]+1;
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1181
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1182 if (s->mb_intra) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1183 if (n < 4)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1184 block[0] = block[0] * s->y_dc_scale;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1185 else
986e461dc072 Initial revision
glantau
parents:
diff changeset
1186 block[0] = block[0] * s->c_dc_scale;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1187 /* XXX: only mpeg1 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1188 quant_matrix = s->intra_matrix;
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1189 for(i=1;i<nCoeffs;i++) {
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1190 int j= zigzag_direct[i];
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1191 level = block[j];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1192 if (level) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1193 if (level < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1194 level = -level;
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1195 level = (int)(level * qscale * quant_matrix[j]) >> 3;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1196 level = (level - 1) | 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1197 level = -level;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1198 } else {
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1199 level = (int)(level * qscale * quant_matrix[j]) >> 3;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1200 level = (level - 1) | 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1201 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1202 #ifdef PARANOID
986e461dc072 Initial revision
glantau
parents:
diff changeset
1203 if (level < -2048 || level > 2047)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1204 fprintf(stderr, "unquant error %d %d\n", i, level);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1205 #endif
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1206 block[j] = level;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1207 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1208 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1209 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1210 i = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1211 quant_matrix = s->non_intra_matrix;
217
de372d04039c (commit by michael)
arpi_esp
parents: 216
diff changeset
1212 for(;i<nCoeffs;i++) {
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1213 int j= zigzag_direct[i];
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1214 level = block[j];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1215 if (level) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1216 if (level < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1217 level = -level;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1218 level = (((level << 1) + 1) * qscale *
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1219 ((int) (quant_matrix[j]))) >> 4;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1220 level = (level - 1) | 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1221 level = -level;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1222 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1223 level = (((level << 1) + 1) * qscale *
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1224 ((int) (quant_matrix[j]))) >> 4;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1225 level = (level - 1) | 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1226 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1227 #ifdef PARANOID
986e461dc072 Initial revision
glantau
parents:
diff changeset
1228 if (level < -2048 || level > 2047)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1229 fprintf(stderr, "unquant error %d %d\n", i, level);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1230 #endif
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1231 block[j] = level;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1232 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1233 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1234 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1235 }
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
1236
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
1237 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
1238 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
1239 {
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
1240 int i, level, qmul, qadd;
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1241 int nCoeffs;
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
1242
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
1243 if (s->mb_intra) {
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
1244 if (n < 4)
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
1245 block[0] = block[0] * s->y_dc_scale;
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
1246 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
1247 block[0] = block[0] * s->c_dc_scale;
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
1248 i = 1;
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1249 nCoeffs= 64; //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
1250 } 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
1251 i = 0;
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1252 nCoeffs= zigzag_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
1253 }
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
1254
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
1255 qmul = s->qscale << 1;
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
1256 qadd = (s->qscale - 1) | 1;
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
1257
200
6ab301aaa652 (commit by michael)
arpi_esp
parents: 198
diff changeset
1258 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
1259 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
1260 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
1261 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
1262 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
1263 } 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
1264 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
1265 }
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
1266 #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
1267 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
1268 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
1269 #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
1270 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
1271 }
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
1272 }
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
1273 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1274
986e461dc072 Initial revision
glantau
parents:
diff changeset
1275 /* rate control */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1276
986e461dc072 Initial revision
glantau
parents:
diff changeset
1277 /* an I frame is I_FRAME_SIZE_RATIO bigger than a P frame */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1278 #define I_FRAME_SIZE_RATIO 3.0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1279 #define QSCALE_K 20
986e461dc072 Initial revision
glantau
parents:
diff changeset
1280
986e461dc072 Initial revision
glantau
parents:
diff changeset
1281 static void rate_control_init(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1282 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1283 s->wanted_bits = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1284
986e461dc072 Initial revision
glantau
parents:
diff changeset
1285 if (s->intra_only) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1286 s->I_frame_bits = ((INT64)s->bit_rate * FRAME_RATE_BASE) / s->frame_rate;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1287 s->P_frame_bits = s->I_frame_bits;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1288 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1289 s->P_frame_bits = (int) ((float)(s->gop_size * s->bit_rate) /
986e461dc072 Initial revision
glantau
parents:
diff changeset
1290 (float)((float)s->frame_rate / FRAME_RATE_BASE * (I_FRAME_SIZE_RATIO + s->gop_size - 1)));
986e461dc072 Initial revision
glantau
parents:
diff changeset
1291 s->I_frame_bits = (int)(s->P_frame_bits * I_FRAME_SIZE_RATIO);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1292 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1293
986e461dc072 Initial revision
glantau
parents:
diff changeset
1294 #if defined(DEBUG)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1295 printf("I_frame_size=%d P_frame_size=%d\n",
986e461dc072 Initial revision
glantau
parents:
diff changeset
1296 s->I_frame_bits, s->P_frame_bits);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1297 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
1298 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1299
986e461dc072 Initial revision
glantau
parents:
diff changeset
1300
986e461dc072 Initial revision
glantau
parents:
diff changeset
1301 /*
986e461dc072 Initial revision
glantau
parents:
diff changeset
1302 * This heuristic is rather poor, but at least we do not have to
986e461dc072 Initial revision
glantau
parents:
diff changeset
1303 * change the qscale at every macroblock.
986e461dc072 Initial revision
glantau
parents:
diff changeset
1304 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1305 static int rate_estimate_qscale(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1306 {
187
3f3b14d3a23d qscale estimate fix, diff extended to 64bit wide. patch by Stephen Davies <steve@daviesfam.org>
arpi_esp
parents: 178
diff changeset
1307 INT64 diff, total_bits = s->total_bits;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1308 float q;
187
3f3b14d3a23d qscale estimate fix, diff extended to 64bit wide. patch by Stephen Davies <steve@daviesfam.org>
arpi_esp
parents: 178
diff changeset
1309 int qscale, qmin;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1310
986e461dc072 Initial revision
glantau
parents:
diff changeset
1311 if (s->pict_type == I_TYPE) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1312 s->wanted_bits += s->I_frame_bits;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1313 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1314 s->wanted_bits += s->P_frame_bits;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1315 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1316 diff = s->wanted_bits - total_bits;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1317 q = 31.0 - (float)diff / (QSCALE_K * s->mb_height * s->mb_width);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1318 /* adjust for I frame */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1319 if (s->pict_type == I_TYPE && !s->intra_only) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1320 q /= I_FRAME_SIZE_RATIO;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1321 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1322
986e461dc072 Initial revision
glantau
parents:
diff changeset
1323 /* using a too small Q scale leeds to problems in mpeg1 and h263
986e461dc072 Initial revision
glantau
parents:
diff changeset
1324 because AC coefficients are clamped to 255 or 127 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
1325 qmin = 3;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1326 if (q < qmin)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1327 q = qmin;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1328 else if (q > 31)
986e461dc072 Initial revision
glantau
parents:
diff changeset
1329 q = 31;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1330 qscale = (int)(q + 0.5);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1331 #if defined(DEBUG)
64
5aa6292a1660 win32 fixes
glantau
parents: 60
diff changeset
1332 printf("%d: total=%0.0f br=%0.1f diff=%d qest=%0.1f\n",
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1333 s->picture_number,
64
5aa6292a1660 win32 fixes
glantau
parents: 60
diff changeset
1334 (double)total_bits,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1335 (float)s->frame_rate / FRAME_RATE_BASE *
986e461dc072 Initial revision
glantau
parents:
diff changeset
1336 total_bits / s->picture_number,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1337 diff, q);
986e461dc072 Initial revision
glantau
parents:
diff changeset
1338 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
1339 return qscale;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1340 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1341
986e461dc072 Initial revision
glantau
parents:
diff changeset
1342 AVCodec mpeg1video_encoder = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1343 "mpeg1video",
986e461dc072 Initial revision
glantau
parents:
diff changeset
1344 CODEC_TYPE_VIDEO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1345 CODEC_ID_MPEG1VIDEO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1346 sizeof(MpegEncContext),
986e461dc072 Initial revision
glantau
parents:
diff changeset
1347 MPV_encode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1348 MPV_encode_picture,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1349 MPV_encode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1350 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
1351
986e461dc072 Initial revision
glantau
parents:
diff changeset
1352 AVCodec h263_encoder = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1353 "h263",
986e461dc072 Initial revision
glantau
parents:
diff changeset
1354 CODEC_TYPE_VIDEO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1355 CODEC_ID_H263,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1356 sizeof(MpegEncContext),
986e461dc072 Initial revision
glantau
parents:
diff changeset
1357 MPV_encode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1358 MPV_encode_picture,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1359 MPV_encode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1360 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
1361
986e461dc072 Initial revision
glantau
parents:
diff changeset
1362 AVCodec h263p_encoder = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1363 "h263p",
986e461dc072 Initial revision
glantau
parents:
diff changeset
1364 CODEC_TYPE_VIDEO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1365 CODEC_ID_H263P,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1366 sizeof(MpegEncContext),
986e461dc072 Initial revision
glantau
parents:
diff changeset
1367 MPV_encode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1368 MPV_encode_picture,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1369 MPV_encode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1370 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
1371
986e461dc072 Initial revision
glantau
parents:
diff changeset
1372 AVCodec rv10_encoder = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1373 "rv10",
986e461dc072 Initial revision
glantau
parents:
diff changeset
1374 CODEC_TYPE_VIDEO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1375 CODEC_ID_RV10,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1376 sizeof(MpegEncContext),
986e461dc072 Initial revision
glantau
parents:
diff changeset
1377 MPV_encode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1378 MPV_encode_picture,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1379 MPV_encode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1380 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
1381
986e461dc072 Initial revision
glantau
parents:
diff changeset
1382 AVCodec mjpeg_encoder = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1383 "mjpeg",
986e461dc072 Initial revision
glantau
parents:
diff changeset
1384 CODEC_TYPE_VIDEO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1385 CODEC_ID_MJPEG,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1386 sizeof(MpegEncContext),
986e461dc072 Initial revision
glantau
parents:
diff changeset
1387 MPV_encode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1388 MPV_encode_picture,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1389 MPV_encode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1390 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
1391
71
79be2c581c01 changed opendivx to mpeg4
glantau
parents: 64
diff changeset
1392 AVCodec mpeg4_encoder = {
79be2c581c01 changed opendivx to mpeg4
glantau
parents: 64
diff changeset
1393 "mpeg4",
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1394 CODEC_TYPE_VIDEO,
71
79be2c581c01 changed opendivx to mpeg4
glantau
parents: 64
diff changeset
1395 CODEC_ID_MPEG4,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1396 sizeof(MpegEncContext),
986e461dc072 Initial revision
glantau
parents:
diff changeset
1397 MPV_encode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1398 MPV_encode_picture,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1399 MPV_encode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1400 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
1401
986e461dc072 Initial revision
glantau
parents:
diff changeset
1402 AVCodec msmpeg4_encoder = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
1403 "msmpeg4",
986e461dc072 Initial revision
glantau
parents:
diff changeset
1404 CODEC_TYPE_VIDEO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1405 CODEC_ID_MSMPEG4,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1406 sizeof(MpegEncContext),
986e461dc072 Initial revision
glantau
parents:
diff changeset
1407 MPV_encode_init,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1408 MPV_encode_picture,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1409 MPV_encode_end,
986e461dc072 Initial revision
glantau
parents:
diff changeset
1410 };