Mercurial > mplayer.hg
annotate libvo/jpeg_enc.c @ 27645:83d915449a10
Remove IWMMXT optimizations through libavcodec from libmpeg2.
According to Siarhei Siamashka libavcodec is faster on ARM so it is better to
use it directly instead of creating this hackish mix of two libraries.
Plus, these local changes would never be acceptable upstream, so no good
reason for keeping it in our local patchset remains.
author | diego |
---|---|
date | Wed, 01 Oct 2008 01:01:59 +0000 |
parents | 2a34d9fa52ab |
children | 797c74f9213c |
rev | line source |
---|---|
26739
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
26290
diff
changeset
|
1 /* |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
26290
diff
changeset
|
2 * straightforward (to be) optimized JPEG encoder for the YUV422 format |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
26290
diff
changeset
|
3 * based on MJPEG code from FFmpeg |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
26290
diff
changeset
|
4 * |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
26290
diff
changeset
|
5 * For an excellent introduction to the JPEG format, see: |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
26290
diff
changeset
|
6 * 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
|
7 * |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
8 * Copyright (c) 2002, Rik Snel |
26739
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
26290
diff
changeset
|
9 * 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
|
10 * |
26739
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
26290
diff
changeset
|
11 * This file is part of MPlayer. |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
26290
diff
changeset
|
12 * |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
26290
diff
changeset
|
13 * MPlayer is free software; you can redistribute it and/or modify |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
14 * 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
|
15 * 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
|
16 * (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
|
17 * |
26739
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
26290
diff
changeset
|
18 * MPlayer is distributed in the hope that it will be useful, |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
19 * 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
|
20 * 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
|
21 * 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
|
22 * |
26739
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
26290
diff
changeset
|
23 * You should have received a copy of the GNU General Public License along |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
26290
diff
changeset
|
24 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
26290
diff
changeset
|
25 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
4347
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 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
28 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
29 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
30 #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
|
31 #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
|
32 #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
|
33 #include "config.h" |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
11961
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 |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
11961
diff
changeset
|
38 #include "libavcodec/avcodec.h" |
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
11961
diff
changeset
|
39 #include "libavcodec/dsputil.h" |
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
11961
diff
changeset
|
40 #include "libavcodec/mpegvideo.h" |
25517
788499fc2ae7
Do not duplicate MJpegContext struct, #include the proper header instead.
diego
parents:
25100
diff
changeset
|
41 #include "libavcodec/mjpegenc.h" |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
42 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
43 #include "jpeg_enc.h" |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
44 |
25962 | 45 extern int avcodec_initialized; |
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
|
46 |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
47 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
48 /* Begin excessive code duplication ************************************/ |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
49 /* 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
|
50 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
51 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
|
52 /* 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
|
53 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
|
54 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
|
55 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
|
56 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
|
57 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
|
58 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
|
59 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
|
60 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
|
61 }; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
62 |
7157 | 63 static void convert_matrix(MpegEncContext *s, int (*qmat)[64], |
11258
9627feb8c6fb
ffmpeg sync patch by Alex (thank you), I changed qmin and qmax to be 1 and 31 in the caller
rik
parents:
11211
diff
changeset
|
64 uint16_t (*qmat16)[2][64], const uint16_t *quant_matrix, |
9627feb8c6fb
ffmpeg sync patch by Alex (thank you), I changed qmin and qmax to be 1 and 31 in the caller
rik
parents:
11211
diff
changeset
|
65 int bias, int qmin, int qmax) |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
66 { |
5864 | 67 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
|
68 |
11345
97f11e488141
function convert_matrix() is fixed (off-by-one error) and it is now called with the optimal arguments so that it doesn't do unneeded work, the change was inspired by a comment from Alex
rik
parents:
11258
diff
changeset
|
69 for(qscale=qmin; qscale<=qmax; qscale++){ |
5864 | 70 int i; |
9573 | 71 if (s->dsp.fdct == ff_jpeg_fdct_islow) { |
7157 | 72 for (i = 0; i < 64; i++) { |
9573 | 73 const int j = s->dsp.idct_permutation[i]; |
7157 | 74 /* 16 <= qscale * quant_matrix[i] <= 7905 |
75 * 19952 <= aanscales[i] * \ | |
76 * qscale * quant_matrix[i] <= 205026 | |
77 * (1<<36)/19952 >= (1<<36)/(aanscales[i] * \ | |
78 * qscale * quant_matrix[i]) >= (1<<36)/249205025 | |
79 * 3444240 >= (1<<36)/(aanscales[i] * | |
80 * 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
|
81 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT-3))/ |
7157 | 82 (qscale * quant_matrix[j])); |
83 } | |
9573 | 84 } else if (s->dsp.fdct == fdct_ifast) { |
5864 | 85 for(i=0;i<64;i++) { |
9573 | 86 const int j = s->dsp.idct_permutation[i]; |
5864 | 87 /* 16 <= qscale * quant_matrix[i] <= 7905 */ |
88 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */ | |
89 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */ | |
90 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */ | |
91 | |
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
|
92 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 11)) / |
5864 | 93 (aanscales[i] * qscale * quant_matrix[j])); |
94 } | |
95 } else { | |
96 for(i=0;i<64;i++) { | |
9573 | 97 const int j = s->dsp.idct_permutation[i]; |
5864 | 98 /* We can safely suppose that 16 <= quant_matrix[i] <= 255 |
99 So 16 <= qscale * quant_matrix[i] <= 7905 | |
100 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905 | |
101 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67 | |
102 */ | |
21724
019171a44e19
compilation fixes: define always_inline and don't use uint64_t_C
rik
parents:
19619
diff
changeset
|
103 qmat [qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j])); |
11258
9627feb8c6fb
ffmpeg sync patch by Alex (thank you), I changed qmin and qmax to be 1 and 31 in the caller
rik
parents:
11211
diff
changeset
|
104 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]); |
5864 | 105 |
11258
9627feb8c6fb
ffmpeg sync patch by Alex (thank you), I changed qmin and qmax to be 1 and 31 in the caller
rik
parents:
11211
diff
changeset
|
106 if(qmat16[qscale][0][i]==0 || qmat16[qscale][0][i]==128*256) qmat16[qscale][0][i]=128*256-1; |
9627feb8c6fb
ffmpeg sync patch by Alex (thank you), I changed qmin and qmax to be 1 and 31 in the caller
rik
parents:
11211
diff
changeset
|
107 qmat16[qscale][1][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][0][i]); |
5864 | 108 } |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
109 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
110 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
111 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
112 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
113 static inline void encode_dc(MpegEncContext *s, int val, |
9438 | 114 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
|
115 { |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
116 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
|
117 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
118 if (val == 0) { |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
119 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
|
120 } else { |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
121 mant = val; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
122 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
|
123 val = -val; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
124 mant--; |
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 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
127 /* 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
|
128 nbits = 0; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
129 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
|
130 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
|
131 nbits++; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
132 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
133 |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
134 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
|
135 |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
136 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
|
137 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
138 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
139 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
140 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
|
141 { |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
142 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
|
143 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
|
144 MJpegContext *m = s->mjpeg_ctx; |
9438 | 145 uint8_t *huff_size_ac; |
146 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
|
147 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
148 /* DC coef */ |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
149 component = (n <= 3 ? 0 : n - 4 + 1); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
150 dc = block[0]; /* overflow is impossible */ |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
151 val = dc - s->last_dc[component]; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
152 if (n < 4) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
153 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
|
154 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
|
155 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
|
156 } else { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
157 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
|
158 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
|
159 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
|
160 } |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
161 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
|
162 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
163 /* AC coefs */ |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
164 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
165 run = 0; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
166 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
|
167 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
|
168 j = s->intra_scantable.permutated[i]; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
169 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
|
170 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
|
171 run++; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
172 } else { |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
173 while (run >= 16) { |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
174 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
|
175 run -= 16; |
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 mant = val; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
178 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
|
179 val = -val; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
180 mant--; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
181 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
182 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
183 /* 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
|
184 nbits = 0; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
185 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
|
186 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
|
187 nbits++; |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
188 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
189 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
|
190 |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
191 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
|
192 |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
193 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
|
194 run = 0; |
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 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
198 /* 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
|
199 if (last_index < 63 || run != 0) |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
200 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
|
201 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
202 |
5864 | 203 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index) |
204 { | |
205 int i; | |
206 const int maxlevel= s->max_qcoeff; | |
207 const int minlevel= s->min_qcoeff; | |
208 | |
209 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
|
210 const int j = s->intra_scantable.permutated[i]; |
5864 | 211 int level = block[j]; |
212 | |
213 if (level>maxlevel) level=maxlevel; | |
214 else if(level<minlevel) level=minlevel; | |
215 block[j]= level; | |
216 } | |
217 } | |
218 | |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
219 /* End excessive code duplication **************************************/ |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
220 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
221 /* 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
|
222 * 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
|
223 * 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
|
224 * '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
|
225 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
|
226 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
227 MJpegContext *m = j->s->mjpeg_ctx; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
228 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
229 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
|
230 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
|
231 if (j->bw) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
232 /* U */ |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
233 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
|
234 m->huff_code_dc_chrominance[0]); |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
235 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
|
236 m->huff_code_ac_chrominance[0]); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
237 /* V */ |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
238 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
|
239 m->huff_code_dc_chrominance[0]); |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
240 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
|
241 m->huff_code_ac_chrominance[0]); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
242 } else { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
243 /* 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
|
244 * chrominance huffman tables instead of luminance ones |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
245 * (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
|
246 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
|
247 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
|
248 } |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
249 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
250 |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
251 /* 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
|
252 * 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
|
253 * 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
|
254 * 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
|
255 * 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
|
256 * |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
257 * 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
|
258 * 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
|
259 * 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
|
260 * |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
261 * 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
|
262 * 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
|
263 /* 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
|
264 /* 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
|
265 * 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
|
266 * 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
|
267 * 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
|
268 /* 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
|
269 * cu = 1 means 'perform cheap upsampling' */ |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
270 /* 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
|
271 * 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
|
272 * 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
|
273 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
|
274 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
|
275 int cu, int q, int b) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
276 jpeg_enc_t *j; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
277 int i = 0; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
278 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
|
279 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
|
280 u_rsize, v_psize, v_rsize); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
281 |
9186 | 282 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
|
283 if (j == NULL) return NULL; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
284 |
9186 | 285 j->s = av_malloc(sizeof(MpegEncContext)); |
9976
5843993013a8
fixes to the zr driver (uninit->reinit) by Stephan Bain <sjbain@akamail.com>
rik
parents:
9573
diff
changeset
|
286 memset(j->s,0x00,sizeof(MpegEncContext)); |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
287 if (j->s == NULL) { |
9186 | 288 av_free(j); |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
289 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
|
290 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
291 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
292 /* info on how to access the pixels */ |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
293 j->y_ps = y_psize; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
294 j->u_ps = u_psize; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
295 j->v_ps = v_psize; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
296 j->y_rs = y_rsize; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
297 j->u_rs = u_rsize; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
298 j->v_rs = v_rsize; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
299 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
300 j->s->width = w; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
301 j->s->height = h; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
302 j->s->qscale = q; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
303 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
304 j->s->out_format = FMT_MJPEG; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
305 j->s->intra_only = 1; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
306 j->s->encoding = 1; |
26290 | 307 j->s->pict_type = FF_I_TYPE; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
308 j->s->y_dc_scale = 8; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
309 j->s->c_dc_scale = 8; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
310 |
23369
700408f4cb51
compilation fix: ff_ _encode added and temporarily disabled mjpeg_write_tables
rik
parents:
22339
diff
changeset
|
311 //FIXME j->s->mjpeg_write_tables = 1; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
312 j->s->mjpeg_vsample[0] = 1; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
313 j->s->mjpeg_vsample[1] = 1; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
314 j->s->mjpeg_vsample[2] = 1; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
315 j->s->mjpeg_hsample[0] = 2; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
316 j->s->mjpeg_hsample[1] = 1; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
317 j->s->mjpeg_hsample[2] = 1; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
318 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
319 j->cheap_upsample = cu; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
320 j->bw = b; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
321 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
322 /* 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
|
323 * 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
|
324 * initialize it here. */ |
25962 | 325 if (!avcodec_initialized) { |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
326 /* we need to initialize libavcodec */ |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
327 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
|
328 avcodec_register_all(); |
25962 | 329 avcodec_initialized=1; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
330 } |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
331 |
23369
700408f4cb51
compilation fix: ff_ _encode added and temporarily disabled mjpeg_write_tables
rik
parents:
22339
diff
changeset
|
332 if (ff_mjpeg_encode_init(j->s) < 0) { |
9186 | 333 av_free(j->s); |
334 av_free(j); | |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
335 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
|
336 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
337 |
7136
122efc309784
fixes a segfault which was introduced in this file by the new ratecontrol code
rik
parents:
6703
diff
changeset
|
338 /* 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
|
339 j->s->avctx = calloc(sizeof(*j->s->avctx), 1); |
19619
a83e5b8d2e63
Patch from Karolina Lindqvist <karolina.lindqvist@kramnet.se>
rik
parents:
15310
diff
changeset
|
340 /* Set up to encode mjpeg */ |
a83e5b8d2e63
Patch from Karolina Lindqvist <karolina.lindqvist@kramnet.se>
rik
parents:
15310
diff
changeset
|
341 j->s->avctx->codec_id = CODEC_ID_MJPEG; |
7136
122efc309784
fixes a segfault which was introduced in this file by the new ratecontrol code
rik
parents:
6703
diff
changeset
|
342 |
11961
487d1638d161
fixing segfault: libavcodec doesn't allocate some buffers if avctx->thread_count == 0
rik
parents:
11926
diff
changeset
|
343 /* make MPV_common_init allocate important buffers, like s->block */ |
487d1638d161
fixing segfault: libavcodec doesn't allocate some buffers if avctx->thread_count == 0
rik
parents:
11926
diff
changeset
|
344 j->s->avctx->thread_count = 1; |
487d1638d161
fixing segfault: libavcodec doesn't allocate some buffers if avctx->thread_count == 0
rik
parents:
11926
diff
changeset
|
345 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
346 if (MPV_common_init(j->s) < 0) { |
9186 | 347 av_free(j->s); |
348 av_free(j); | |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
349 return NULL; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
350 } |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
351 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
352 /* correct the value for sc->mb_height */ |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
353 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
|
354 j->s->mb_intra = 1; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
355 |
6703
feeaffcce1fa
adapting to the 'adding fff prefix to avoid global name conflicts' changes in libavcodec
rik
parents:
6328
diff
changeset
|
356 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
|
357 for (i = 1; i < 64; i++) |
22339 | 358 j->s->intra_matrix[i] = av_clip_uint8( |
7567
85e9956a6727
libavcodec sync; zigzag_direct and block_permute_op replaced by non-globals in MpegEncContext
rik
parents:
7157
diff
changeset
|
359 (ff_mpeg1_default_intra_matrix[i]*j->s->qscale) >> 3); |
7157 | 360 convert_matrix(j->s, j->s->q_intra_matrix, j->s->q_intra_matrix16, |
11345
97f11e488141
function convert_matrix() is fixed (off-by-one error) and it is now called with the optimal arguments so that it doesn't do unneeded work, the change was inspired by a comment from Alex
rik
parents:
11258
diff
changeset
|
361 j->s->intra_matrix, j->s->intra_quant_bias, 8, 8); |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
362 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
|
363 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
364 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
365 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
|
366 unsigned char *u_data, unsigned char *v_data, char *bufr) { |
5864 | 367 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
|
368 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
|
369 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
|
370 /* initialize the buffer */ |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
371 |
11211 | 372 init_put_bits(&j->s->pb, bufr, 1024*256); |
4347
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
373 |
23369
700408f4cb51
compilation fix: ff_ _encode added and temporarily disabled mjpeg_write_tables
rik
parents:
22339
diff
changeset
|
374 ff_mjpeg_encode_picture_header(j->s); |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
375 |
11926 | 376 j->s->header_bits = put_bits_count(&j->s->pb); |
8117
dda027d5a845
libavcodec sync (no LIBAVCODEC_BUILD change; no backwards compatibility)
rik
parents:
7902
diff
changeset
|
377 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
378 j->s->last_dc[0] = 128; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
379 j->s->last_dc[1] = 128; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
380 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
|
381 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
382 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
|
383 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
|
384 /* 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
|
385 * 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
|
386 /* 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
|
387 source = mb_y * 8 * j->y_rs + |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
388 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
|
389 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
|
390 for (i = 0; i < 8; i++) { |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
391 for (k = 0; k < 8; k++) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
392 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
|
393 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
394 dest += 8; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
395 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
|
396 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
397 source = mb_y * 8 * j->y_rs + |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
398 (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
|
399 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
|
400 for (i = 0; i < 8; i++) { |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
401 for (k = 0; k < 8; k++) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
402 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
|
403 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
404 dest += 8; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
405 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
|
406 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
407 if (!j->bw && j->cheap_upsample) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
408 source = mb_y*4*j->u_rs + |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
409 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
|
410 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
|
411 for (i = 0; i < 4; i++) { |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
412 for (k = 0; k < 8; k++) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
413 dest[k] = source[k*j->u_ps]; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
414 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
|
415 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
416 dest += 16; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
417 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
|
418 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
419 source = mb_y*4*j->v_rs + |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
420 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
|
421 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
|
422 for (i = 0; i < 4; i++) { |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
423 for (k = 0; k < 8; k++) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
424 dest[k] = source[k*j->v_ps]; |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
425 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
|
426 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
427 dest += 16; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
428 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
|
429 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
430 } else if (!j->bw && !j->cheap_upsample) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
431 source = mb_y*8*j->u_rs + |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
432 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
|
433 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
|
434 for (i = 0; i < 8; i++) { |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
435 for (k = 0; k < 8; k++) |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
436 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
|
437 dest += 8; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
438 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
|
439 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
440 source = mb_y*8*j->v_rs + |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
441 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
|
442 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
|
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->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
|
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 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
449 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
450 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
|
451 |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
452 j->s->block_last_index[0] = |
7157 | 453 j->s->dct_quantize(j->s, j->s->block[0], |
5864 | 454 0, 8, &overflow); |
455 if (overflow) clip_coeffs(j->s, j->s->block[0], | |
456 j->s->block_last_index[0]); | |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
457 j->s->block_last_index[1] = |
7157 | 458 j->s->dct_quantize(j->s, j->s->block[1], |
5864 | 459 1, 8, &overflow); |
460 if (overflow) clip_coeffs(j->s, j->s->block[1], | |
461 j->s->block_last_index[1]); | |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
462 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
463 if (!j->bw) { |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
464 j->s->block_last_index[4] = |
7157 | 465 j->s->dct_quantize(j->s, j->s->block[2], |
5864 | 466 4, 8, &overflow); |
467 if (overflow) clip_coeffs(j->s, j->s->block[2], | |
468 j->s->block_last_index[2]); | |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
469 j->s->block_last_index[5] = |
7157 | 470 j->s->dct_quantize(j->s, j->s->block[3], |
5864 | 471 5, 8, &overflow); |
472 if (overflow) clip_coeffs(j->s, j->s->block[3], | |
473 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
|
474 } |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
475 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
|
476 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
477 } |
d036a9992baf
fast 4:2:2 jpeg encoder, based on libavcodec. - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
diff
changeset
|
478 emms_c(); |
23369
700408f4cb51
compilation fix: ff_ _encode added and temporarily disabled mjpeg_write_tables
rik
parents:
22339
diff
changeset
|
479 ff_mjpeg_encode_picture_trailer(j->s); |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
480 flush_put_bits(&j->s->pb); |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
481 |
23369
700408f4cb51
compilation fix: ff_ _encode added and temporarily disabled mjpeg_write_tables
rik
parents:
22339
diff
changeset
|
482 //FIXME |
700408f4cb51
compilation fix: ff_ _encode added and temporarily disabled mjpeg_write_tables
rik
parents:
22339
diff
changeset
|
483 //if (j->s->mjpeg_write_tables == 1) |
700408f4cb51
compilation fix: ff_ _encode added and temporarily disabled mjpeg_write_tables
rik
parents:
22339
diff
changeset
|
484 // j->s->mjpeg_write_tables = 0; |
4651
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
485 |
4683
fba4289cdb41
we are now able to use the new bitwriter code in libavcodec
rik
parents:
4651
diff
changeset
|
486 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
|
487 } |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
488 |
49f2bc22f880
mjpeg encoder cleanup - patch by Rik Snel <rsnel@cube.dyndns.org>
arpi
parents:
4347
diff
changeset
|
489 void jpeg_enc_uninit(jpeg_enc_t *j) { |
23369
700408f4cb51
compilation fix: ff_ _encode added and temporarily disabled mjpeg_write_tables
rik
parents:
22339
diff
changeset
|
490 ff_mjpeg_encode_close(j->s); |
9186 | 491 av_free(j->s); |
492 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
|
493 } |