Mercurial > mplayer.hg
annotate libvo/jpeg_enc.c @ 9649:0650fe13f36c
ome fixes, like css styles - now ../default.css
author | mpt |
---|---|
date | Sat, 22 Mar 2003 17:29:45 +0000 |
parents | 665974fce630 |
children | 5843993013a8 |
rev | line source |
---|---|
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
1 /* Straightforward (to be) optimized JPEG encoder for the YUV422 format |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
2 * based on mjpeg code from ffmpeg. |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
3 * |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
4 * Copyright (c) 2002, Rik Snel |
7902
c9d1054aa359
sync with libavcodec for unaccellerated dcts (sorry Felix, LIBAVCODEC_BUILD did not change, so also no backwards compatibility this time), and a long overdue copyright update
rik
parents:
7567
diff
changeset
|
5 * Parts from ffmpeg Copyright (c) 2000-2002 Fabrice Bellard |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
6 * |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
7 * This program is free software; you can redistribute it and/or modify |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
8 * it under the terms of the GNU General Public License as published by |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
9 * the Free Software Foundation; either version 2 of the License, or |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
10 * (at your option) any later version. |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
11 * |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
12 * This program is distributed in the hope that it will be useful, |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
15 * GNU General Public License for more details. |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
16 * |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
17 * You should have received a copy of the GNU General Public License |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
18 * along with this program; if not, write to the Free Software |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
20 * |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
21 * For an excellent introduction to the JPEG format, see: |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
22 * http://www.ece.purdue.edu/~bouman/grad-labs/lab8/pdf/lab.pdf |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
23 */ |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
24 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
25 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
26 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
27 #include <sys/types.h> |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
28 #include <stdio.h> |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
29 #include <stdlib.h> |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
30 #include "config.h" |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
31 #ifdef USE_FASTMEMCPY |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
32 #include "fastmemcpy.h" |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
33 #endif |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
34 #include "../mp_msg.h" |
4683
fba4289cdb41
we are now able to use the new bitwriter code in libavcodec
rik
parents:
4651
diff
changeset
|
35 /* We need this #define because we need ../libavcodec/common.h to #define |
fba4289cdb41
we are now able to use the new bitwriter code in libavcodec
rik
parents:
4651
diff
changeset
|
36 * be2me_32, otherwise the linker will complain that it doesn't exist */ |
fba4289cdb41
we are now able to use the new bitwriter code in libavcodec
rik
parents:
4651
diff
changeset
|
37 #define HAVE_AV_CONFIG_H |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
38 #include "../libavcodec/avcodec.h" |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
39 #include "../libavcodec/dsputil.h" |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
40 #include "../libavcodec/mpegvideo.h" |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
41 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
42 #include "jpeg_enc.h" |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
43 |
5391
7a4ea9beebc0
use avcodec_inited instead of av_fdct to see if avcodec was initialized by another part of mplayer
rik
parents:
4683
diff
changeset
|
44 extern int avcodec_inited; |
7a4ea9beebc0
use avcodec_inited instead of av_fdct to see if avcodec was initialized by another part of mplayer
rik
parents:
4683
diff
changeset
|
45 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
46 /* zr_mjpeg_encode_mb needs access to these tables for the black & white |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
47 * option */ |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
48 typedef struct MJpegContext { |
9438 | 49 uint8_t huff_size_dc_luminance[12]; |
50 uint16_t huff_code_dc_luminance[12]; | |
51 uint8_t huff_size_dc_chrominance[12]; | |
52 uint16_t huff_code_dc_chrominance[12]; | |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
53 |
9438 | 54 uint8_t huff_size_ac_luminance[256]; |
55 uint16_t huff_code_ac_luminance[256]; | |
56 uint8_t huff_size_ac_chrominance[256]; | |
57 uint16_t huff_code_ac_chrominance[256]; | |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
58 } MJpegContext; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
59 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
60 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
61 /* Begin excessive code duplication ************************************/ |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
62 /* Code coming from mpegvideo.c and mjpeg.c in ../libavcodec ***********/ |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
63 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
64 static const unsigned short aanscales[64] = { |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
65 /* precomputed values scaled up by 14 bits */ |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
66 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
67 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
68 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
69 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
70 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
71 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
72 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
73 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
74 }; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
75 |
7157 | 76 static void convert_matrix(MpegEncContext *s, int (*qmat)[64], |
77 uint16_t (*qmat16)[64], uint16_t (*qmat16_bias)[64], | |
9438 | 78 const uint16_t *quant_matrix, int bias) |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
79 { |
5864 | 80 int qscale; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
81 |
5864 | 82 for(qscale=1; qscale<32; qscale++){ |
83 int i; | |
9573 | 84 if (s->dsp.fdct == ff_jpeg_fdct_islow) { |
7157 | 85 for (i = 0; i < 64; i++) { |
9573 | 86 const int j = s->dsp.idct_permutation[i]; |
7157 | 87 /* 16 <= qscale * quant_matrix[i] <= 7905 |
88 * 19952 <= aanscales[i] * \ | |
89 * qscale * quant_matrix[i] <= 205026 | |
90 * (1<<36)/19952 >= (1<<36)/(aanscales[i] * \ | |
91 * qscale * quant_matrix[i]) >= (1<<36)/249205025 | |
92 * 3444240 >= (1<<36)/(aanscales[i] * | |
93 * qscale * quant_matrix[i]) >= 275 */ | |
7902
c9d1054aa359
sync with libavcodec for unaccellerated dcts (sorry Felix, LIBAVCODEC_BUILD did not change, so also no backwards compatibility this time), and a long overdue copyright update
rik
parents:
7567
diff
changeset
|
94 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT-3))/ |
7157 | 95 (qscale * quant_matrix[j])); |
96 } | |
9573 | 97 } else if (s->dsp.fdct == fdct_ifast) { |
5864 | 98 for(i=0;i<64;i++) { |
9573 | 99 const int j = s->dsp.idct_permutation[i]; |
5864 | 100 /* 16 <= qscale * quant_matrix[i] <= 7905 */ |
101 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */ | |
102 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */ | |
103 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */ | |
104 | |
7902
c9d1054aa359
sync with libavcodec for unaccellerated dcts (sorry Felix, LIBAVCODEC_BUILD did not change, so also no backwards compatibility this time), and a long overdue copyright update
rik
parents:
7567
diff
changeset
|
105 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 11)) / |
5864 | 106 (aanscales[i] * qscale * quant_matrix[j])); |
107 } | |
108 } else { | |
109 for(i=0;i<64;i++) { | |
9573 | 110 const int j = s->dsp.idct_permutation[i]; |
5864 | 111 /* We can safely suppose that 16 <= quant_matrix[i] <= 255 |
112 So 16 <= qscale * quant_matrix[i] <= 7905 | |
113 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905 | |
114 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67 | |
115 */ | |
116 qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]); | |
7567
85e9956a6727
libavcodec sync; zigzag_direct and block_permute_op replaced by non-globals in MpegEncContext
rik
parents:
7157
diff
changeset
|
117 qmat16[qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]); |
5864 | 118 |
119 if(qmat16[qscale][i]==0 || qmat16[qscale][i]==128*256) qmat16[qscale][i]=128*256-1; | |
120 | |
121 qmat16_bias[qscale][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][i]); | |
122 } | |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
123 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
124 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
125 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
126 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
127 static inline void encode_dc(MpegEncContext *s, int val, |
9438 | 128 uint8_t *huff_size, uint16_t *huff_code) |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
129 { |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
130 int mant, nbits; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
131 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
132 if (val == 0) { |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
133 put_bits(&s->pb, huff_size[0], huff_code[0]); |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
134 } else { |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
135 mant = val; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
136 if (val < 0) { |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
137 val = -val; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
138 mant--; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
139 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
140 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
141 /* compute the log (XXX: optimize) */ |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
142 nbits = 0; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
143 while (val != 0) { |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
144 val = val >> 1; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
145 nbits++; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
146 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
147 |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
148 put_bits(&s->pb, huff_size[nbits], huff_code[nbits]); |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
149 |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
150 put_bits(&s->pb, nbits, mant & ((1 << nbits) - 1)); |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
151 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
152 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
153 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
154 static void encode_block(MpegEncContext *s, DCTELEM *block, int n) |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
155 { |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
156 int mant, nbits, code, i, j; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
157 int component, dc, run, last_index, val; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
158 MJpegContext *m = s->mjpeg_ctx; |
9438 | 159 uint8_t *huff_size_ac; |
160 uint16_t *huff_code_ac; | |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
161 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
162 /* DC coef */ |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
163 component = (n <= 3 ? 0 : n - 4 + 1); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
164 dc = block[0]; /* overflow is impossible */ |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
165 val = dc - s->last_dc[component]; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
166 if (n < 4) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
167 encode_dc(s, val, m->huff_size_dc_luminance, m->huff_code_dc_luminance); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
168 huff_size_ac = m->huff_size_ac_luminance; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
169 huff_code_ac = m->huff_code_ac_luminance; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
170 } else { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
171 encode_dc(s, val, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
172 huff_size_ac = m->huff_size_ac_chrominance; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
173 huff_code_ac = m->huff_code_ac_chrominance; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
174 } |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
175 s->last_dc[component] = dc; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
176 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
177 /* AC coefs */ |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
178 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
179 run = 0; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
180 last_index = s->block_last_index[n]; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
181 for(i=1;i<=last_index;i++) { |
7567
85e9956a6727
libavcodec sync; zigzag_direct and block_permute_op replaced by non-globals in MpegEncContext
rik
parents:
7157
diff
changeset
|
182 j = s->intra_scantable.permutated[i]; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
183 val = block[j]; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
184 if (val == 0) { |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
185 run++; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
186 } else { |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
187 while (run >= 16) { |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
188 put_bits(&s->pb, huff_size_ac[0xf0], huff_code_ac[0xf0]); |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
189 run -= 16; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
190 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
191 mant = val; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
192 if (val < 0) { |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
193 val = -val; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
194 mant--; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
195 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
196 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
197 /* compute the log (XXX: optimize) */ |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
198 nbits = 0; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
199 while (val != 0) { |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
200 val = val >> 1; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
201 nbits++; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
202 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
203 code = (run << 4) | nbits; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
204 |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
205 put_bits(&s->pb, huff_size_ac[code], huff_code_ac[code]); |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
206 |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
207 put_bits(&s->pb, nbits, mant & ((1 << nbits) - 1)); |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
208 run = 0; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
209 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
210 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
211 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
212 /* output EOB only if not already 64 values */ |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
213 if (last_index < 63 || run != 0) |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
214 put_bits(&s->pb, huff_size_ac[0], huff_code_ac[0]); |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
215 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
216 |
5864 | 217 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index) |
218 { | |
219 int i; | |
220 const int maxlevel= s->max_qcoeff; | |
221 const int minlevel= s->min_qcoeff; | |
222 | |
223 for(i=0; i<=last_index; i++){ | |
7567
85e9956a6727
libavcodec sync; zigzag_direct and block_permute_op replaced by non-globals in MpegEncContext
rik
parents:
7157
diff
changeset
|
224 const int j = s->intra_scantable.permutated[i]; |
5864 | 225 int level = block[j]; |
226 | |
227 if (level>maxlevel) level=maxlevel; | |
228 else if(level<minlevel) level=minlevel; | |
229 block[j]= level; | |
230 } | |
231 } | |
232 | |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
233 /* End excessive code duplication **************************************/ |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
234 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
235 /* this function is a reproduction of the one in mjpeg, it includes two |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
236 * changes, it allows for black&white encoding (it skips the U and V |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
237 * macroblocks and it outputs the huffman code for 'no change' (dc) and |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
238 * 'all zero' (ac)) and it takes 4 macroblocks (422) instead of 6 (420) */ |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
239 static void zr_mjpeg_encode_mb(jpeg_enc_t *j) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
240 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
241 MJpegContext *m = j->s->mjpeg_ctx; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
242 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
243 encode_block(j->s, j->s->block[0], 0); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
244 encode_block(j->s, j->s->block[1], 1); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
245 if (j->bw) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
246 /* U */ |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
247 put_bits(&j->s->pb, m->huff_size_dc_chrominance[0], |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
248 m->huff_code_dc_chrominance[0]); |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
249 put_bits(&j->s->pb, m->huff_size_ac_chrominance[0], |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
250 m->huff_code_ac_chrominance[0]); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
251 /* V */ |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
252 put_bits(&j->s->pb, m->huff_size_dc_chrominance[0], |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
253 m->huff_code_dc_chrominance[0]); |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
254 put_bits(&j->s->pb, m->huff_size_ac_chrominance[0], |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
255 m->huff_code_ac_chrominance[0]); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
256 } else { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
257 /* we trick encode_block here so that it uses |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
258 * chrominance huffman tables instead of luminance ones |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
259 * (see the effect of second argument of encode_block) */ |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
260 encode_block(j->s, j->s->block[2], 4); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
261 encode_block(j->s, j->s->block[3], 5); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
262 } |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
263 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
264 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
265 /* this function can take all kinds of YUV colorspaces |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
266 * YV12, YVYU, UYVY. The necesary parameters must be set up by the caller |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
267 * y_ps means "y pixel size", y_rs means "y row size". |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
268 * For YUYV, for example, is u_buf = y_buf + 1, v_buf = y_buf + 3, |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
269 * y_ps = 2, u_ps = 4, v_ps = 4, y_rs = u_rs = v_rs. |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
270 * |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
271 * The actual buffers must be passed with mjpeg_encode_frame, this is |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
272 * to make it possible to call encode on the buffer provided by the |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
273 * codec in draw_frame. |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
274 * |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
275 * The data is straightened out at the moment it is put in DCT |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
276 * blocks, there are therefore no spurious memcopies involved */ |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
277 /* Notice that w must be a multiple of 16 and h must be a multiple of 8 */ |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
278 /* We produce YUV422 jpegs, the colors must be subsampled horizontally, |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
279 * if the colors are also subsampled vertically, then this function |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
280 * performs cheap upsampling (better solution will be: a DCT that is |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
281 * optimized in the case that every two rows are the same) */ |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
282 /* cu = 0 means 'No cheap upsampling' |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
283 * cu = 1 means 'perform cheap upsampling' */ |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
284 /* The encoder doesn't know anything about interlacing, the halve height |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
285 * needs to be passed and the double rowstride. Which field gets encoded |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
286 * is decided by what buffers are passed to mjpeg_encode_frame */ |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
287 jpeg_enc_t *jpeg_enc_init(int w, int h, int y_psize, int y_rsize, |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
288 int u_psize, int u_rsize, int v_psize, int v_rsize, |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
289 int cu, int q, int b) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
290 jpeg_enc_t *j; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
291 int i = 0; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
292 mp_msg(MSGT_VO, MSGL_V, "JPEnc init: %dx%d %d %d %d %d %d %d\n", |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
293 w, h, y_psize, y_rsize, u_psize, |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
294 u_rsize, v_psize, v_rsize); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
295 |
9186 | 296 j = av_malloc(sizeof(jpeg_enc_t)); |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
297 if (j == NULL) return NULL; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
298 |
9186 | 299 j->s = av_malloc(sizeof(MpegEncContext)); |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
300 if (j->s == NULL) { |
9186 | 301 av_free(j); |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
302 return NULL; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
303 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
304 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
305 /* info on how to access the pixels */ |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
306 j->y_ps = y_psize; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
307 j->u_ps = u_psize; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
308 j->v_ps = v_psize; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
309 j->y_rs = y_rsize; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
310 j->u_rs = u_rsize; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
311 j->v_rs = v_rsize; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
312 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
313 j->s->width = w; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
314 j->s->height = h; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
315 j->s->qscale = q; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
316 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
317 j->s->out_format = FMT_MJPEG; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
318 j->s->intra_only = 1; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
319 j->s->encoding = 1; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
320 j->s->pict_type = I_TYPE; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
321 j->s->y_dc_scale = 8; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
322 j->s->c_dc_scale = 8; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
323 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
324 j->s->mjpeg_write_tables = 1; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
325 j->s->mjpeg_vsample[0] = 1; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
326 j->s->mjpeg_vsample[1] = 1; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
327 j->s->mjpeg_vsample[2] = 1; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
328 j->s->mjpeg_hsample[0] = 2; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
329 j->s->mjpeg_hsample[1] = 1; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
330 j->s->mjpeg_hsample[2] = 1; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
331 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
332 j->cheap_upsample = cu; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
333 j->bw = b; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
334 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
335 /* if libavcodec is used by the decoder then we must not |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
336 * initialize again, but if it is not initialized then we must |
5391
7a4ea9beebc0
use avcodec_inited instead of av_fdct to see if avcodec was initialized by another part of mplayer
rik
parents:
4683
diff
changeset
|
337 * initialize it here. */ |
7a4ea9beebc0
use avcodec_inited instead of av_fdct to see if avcodec was initialized by another part of mplayer
rik
parents:
4683
diff
changeset
|
338 if (!avcodec_inited) { |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
339 /* we need to initialize libavcodec */ |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
340 avcodec_init(); |
5391
7a4ea9beebc0
use avcodec_inited instead of av_fdct to see if avcodec was initialized by another part of mplayer
rik
parents:
4683
diff
changeset
|
341 avcodec_register_all(); |
7a4ea9beebc0
use avcodec_inited instead of av_fdct to see if avcodec was initialized by another part of mplayer
rik
parents:
4683
diff
changeset
|
342 avcodec_inited=1; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
343 } |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
344 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
345 if (mjpeg_init(j->s) < 0) { |
9186 | 346 av_free(j->s); |
347 av_free(j); | |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
348 return NULL; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
349 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
350 |
7136
122efc309784
fixes a segfault which was introduced in this file by the new ratecontrol code
rik
parents:
6703
diff
changeset
|
351 /* alloc bogus avctx to keep MPV_common_init from segfaulting */ |
122efc309784
fixes a segfault which was introduced in this file by the new ratecontrol code
rik
parents:
6703
diff
changeset
|
352 j->s->avctx = calloc(sizeof(*j->s->avctx), 1); |
122efc309784
fixes a segfault which was introduced in this file by the new ratecontrol code
rik
parents:
6703
diff
changeset
|
353 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
354 if (MPV_common_init(j->s) < 0) { |
9186 | 355 av_free(j->s); |
356 av_free(j); | |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
357 return NULL; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
358 } |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
359 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
360 /* correct the value for sc->mb_height */ |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
361 j->s->mb_height = j->s->height/8; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
362 j->s->mb_intra = 1; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
363 |
6703
feeaffcce1fa
adapting to the 'adding fff prefix to avoid global name conflicts' changes in libavcodec
rik
parents:
6328
diff
changeset
|
364 j->s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0]; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
365 for (i = 1; i < 64; i++) |
7567
85e9956a6727
libavcodec sync; zigzag_direct and block_permute_op replaced by non-globals in MpegEncContext
rik
parents:
7157
diff
changeset
|
366 j->s->intra_matrix[i] = CLAMP_TO_8BIT( |
85e9956a6727
libavcodec sync; zigzag_direct and block_permute_op replaced by non-globals in MpegEncContext
rik
parents:
7157
diff
changeset
|
367 (ff_mpeg1_default_intra_matrix[i]*j->s->qscale) >> 3); |
7157 | 368 convert_matrix(j->s, j->s->q_intra_matrix, j->s->q_intra_matrix16, |
5864 | 369 j->s->q_intra_matrix16_bias, |
370 j->s->intra_matrix, j->s->intra_quant_bias); | |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
371 return j; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
372 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
373 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
374 int jpeg_enc_frame(jpeg_enc_t *j, unsigned char *y_data, |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
375 unsigned char *u_data, unsigned char *v_data, char *bufr) { |
5864 | 376 int i, k, mb_x, mb_y, overflow; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
377 short int *dest; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
378 unsigned char *source; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
379 /* initialize the buffer */ |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
380 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
381 init_put_bits(&j->s->pb, bufr, 1024*256, NULL, NULL); |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
382 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
383 mjpeg_picture_header(j->s); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
384 |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
385 j->s->header_bits = get_bit_count(&j->s->pb); |
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
386 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
387 j->s->last_dc[0] = 128; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
388 j->s->last_dc[1] = 128; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
389 j->s->last_dc[2] = 128; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
390 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
391 for (mb_y = 0; mb_y < j->s->mb_height; mb_y++) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
392 for (mb_x = 0; mb_x < j->s->mb_width; mb_x++) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
393 /* conversion 8 to 16 bit and filling of blocks |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
394 * must be mmx optimized */ |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
395 /* fill 2 Y macroblocks and one U and one V */ |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
396 source = mb_y * 8 * j->y_rs + |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
397 16 * j->y_ps * mb_x + y_data; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
398 dest = j->s->block[0]; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
399 for (i = 0; i < 8; i++) { |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
400 for (k = 0; k < 8; k++) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
401 dest[k] = source[k*j->y_ps]; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
402 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
403 dest += 8; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
404 source += j->y_rs; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
405 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
406 source = mb_y * 8 * j->y_rs + |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
407 (16*mb_x + 8)*j->y_ps + y_data; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
408 dest = j->s->block[1]; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
409 for (i = 0; i < 8; i++) { |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
410 for (k = 0; k < 8; k++) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
411 dest[k] = source[k*j->y_ps]; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
412 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
413 dest += 8; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
414 source += j->y_rs; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
415 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
416 if (!j->bw && j->cheap_upsample) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
417 source = mb_y*4*j->u_rs + |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
418 8*mb_x*j->u_ps + u_data; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
419 dest = j->s->block[2]; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
420 for (i = 0; i < 4; i++) { |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
421 for (k = 0; k < 8; k++) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
422 dest[k] = source[k*j->u_ps]; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
423 dest[k+8] = source[k*j->u_ps]; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
424 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
425 dest += 16; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
426 source += j->u_rs; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
427 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
428 source = mb_y*4*j->v_rs + |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
429 8*mb_x*j->v_ps + v_data; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
430 dest = j->s->block[3]; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
431 for (i = 0; i < 4; i++) { |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
432 for (k = 0; k < 8; k++) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
433 dest[k] = source[k*j->v_ps]; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
434 dest[k+8] = source[k*j->v_ps]; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
435 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
436 dest += 16; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
437 source += j->u_rs; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
438 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
439 } else if (!j->bw && !j->cheap_upsample) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
440 source = mb_y*8*j->u_rs + |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
441 8*mb_x*j->u_ps + u_data; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
442 dest = j->s->block[2]; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
443 for (i = 0; i < 8; i++) { |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
444 for (k = 0; k < 8; k++) |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
445 dest[k] = source[k*j->u_ps]; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
446 dest += 8; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
447 source += j->u_rs; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
448 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
449 source = mb_y*8*j->v_rs + |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
450 8*mb_x*j->v_ps + v_data; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
451 dest = j->s->block[3]; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
452 for (i = 0; i < 8; i++) { |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
453 for (k = 0; k < 8; k++) |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
454 dest[k] = source[k*j->v_ps]; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
455 dest += 8; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
456 source += j->u_rs; |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
457 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
458 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
459 emms_c(); /* is this really needed? */ |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
460 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
461 j->s->block_last_index[0] = |
7157 | 462 j->s->dct_quantize(j->s, j->s->block[0], |
5864 | 463 0, 8, &overflow); |
464 if (overflow) clip_coeffs(j->s, j->s->block[0], | |
465 j->s->block_last_index[0]); | |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
466 j->s->block_last_index[1] = |
7157 | 467 j->s->dct_quantize(j->s, j->s->block[1], |
5864 | 468 1, 8, &overflow); |
469 if (overflow) clip_coeffs(j->s, j->s->block[1], | |
470 j->s->block_last_index[1]); | |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
471 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
472 if (!j->bw) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
473 j->s->block_last_index[4] = |
7157 | 474 j->s->dct_quantize(j->s, j->s->block[2], |
5864 | 475 4, 8, &overflow); |
476 if (overflow) clip_coeffs(j->s, j->s->block[2], | |
477 j->s->block_last_index[2]); | |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
478 j->s->block_last_index[5] = |
7157 | 479 j->s->dct_quantize(j->s, j->s->block[3], |
5864 | 480 5, 8, &overflow); |
481 if (overflow) clip_coeffs(j->s, j->s->block[3], | |
482 j->s->block_last_index[3]); | |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
483 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
484 zr_mjpeg_encode_mb(j); |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
485 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
486 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
487 emms_c(); |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
488 mjpeg_picture_trailer(j->s); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
489 flush_put_bits(&j->s->pb); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
490 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
491 if (j->s->mjpeg_write_tables == 1) |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
492 j->s->mjpeg_write_tables = 0; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
493 |
4683
fba4289cdb41
we are now able to use the new bitwriter code in libavcodec
rik
parents:
4651
diff
changeset
|
494 return pbBufPtr(&(j->s->pb)) - j->s->pb.buf; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
495 } |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
496 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
497 void jpeg_enc_uninit(jpeg_enc_t *j) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
498 mjpeg_close(j->s); |
9186 | 499 av_free(j->s); |
500 av_free(j); | |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
501 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
502 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
503 #if 0 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
504 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
505 #define W 32 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
506 #define H 32 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
507 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
508 int quant_store[MBR+1][MBC+1]; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
509 unsigned char buf[W*H*3/2]; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
510 char code[256*1024]; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
511 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
512 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
513 main() { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
514 int i, size; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
515 FILE *fp; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
516 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
517 memset(buf, 0, W*H); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
518 memset(buf+W*H, 255, W*H/4); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
519 memset(buf+5*W*H/4, 0, W*H/4); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
520 mjpeg_encoder_init(W, H, 1, W, 1, W/2, 1, W/2, 1, 1, 0); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
521 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
522 size = mjpeg_encode_frame(buf, buf+W*H, buf+5*W*H/4, code); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
523 fp = fopen("test.jpg", "w"); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
524 fwrite(code, 1, size, fp); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
525 fclose(fp); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
526 } |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
527 #endif |