Mercurial > libavcodec.hg
annotate a64multienc.c @ 12460:7106d2c8f142 libavcodec
Fix vp3_draw_horiz_band to not produce completely chaotical values
that result in overdrawing areas again and again if s->flipped_image
is false.
author | reimar |
---|---|
date | Mon, 06 Sep 2010 19:21:13 +0000 |
parents | 10b5a51810f9 |
children |
rev | line source |
---|---|
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
1 /* |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
2 * a64 video encoder - multicolor modes |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
3 * Copyright (c) 2009 Tobias Bindhammer |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
4 * |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
5 * This file is part of FFmpeg. |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
6 * |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
11 * |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
16 * |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
20 */ |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
21 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
22 /** |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
23 * @file |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
24 * a64 video encoder - multicolor modes |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
25 */ |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
26 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
27 #include "a64enc.h" |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
28 #include "a64colors.h" |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
29 #include "a64tables.h" |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
30 #include "elbg.h" |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
31 #include "libavutil/intreadwrite.h" |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
32 |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
33 #define DITHERSTEPS 8 |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
34 #define CHARSET_CHARS 256 |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
35 #define INTERLACED 1 |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
36 |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
37 /* gray gradient */ |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
38 static const int mc_colors[5]={0x0,0xb,0xc,0xf,0x1}; |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
39 |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
40 /* other possible gradients - to be tested */ |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
41 //static const int mc_colors[5]={0x0,0x8,0xa,0xf,0x7}; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
42 //static const int mc_colors[5]={0x0,0x9,0x8,0xa,0x3}; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
43 |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
44 static void to_meta_with_crop(AVCodecContext *avctx, AVFrame *p, int *dest) |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
45 { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
46 int blockx, blocky, x, y; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
47 int luma = 0; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
48 int height = FFMIN(avctx->height,C64YRES); |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
49 int width = FFMIN(avctx->width ,C64XRES); |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
50 uint8_t *src = p->data[0]; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
51 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
52 for (blocky = 0; blocky < height; blocky += 8) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
53 for (blockx = 0; blockx < C64XRES; blockx += 8) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
54 for (y = blocky; y < blocky+8 && y < height; y++) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
55 for (x = blockx; x < blockx+8 && x < C64XRES; x += 2) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
56 if(x < width) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
57 /* build average over 2 pixels */ |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
58 luma = (src[(x + 0 + y * p->linesize[0])] + |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
59 src[(x + 1 + y * p->linesize[0])]) / 2; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
60 /* write blocks as linear data now so they are suitable for elbg */ |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
61 dest[0] = luma; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
62 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
63 dest++; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
64 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
65 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
66 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
67 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
68 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
69 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
70 static void render_charset(AVCodecContext *avctx, uint8_t *charset, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
71 uint8_t *colrammap) |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
72 { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
73 A64Context *c = avctx->priv_data; |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
74 uint8_t row1, row2; |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
75 int charpos, x, y; |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
76 int a, b; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
77 uint8_t pix; |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
78 int lowdiff, highdiff; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
79 int *best_cb = c->mc_best_cb; |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
80 static uint8_t index1[256]; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
81 static uint8_t index2[256]; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
82 static uint8_t dither[256]; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
83 int i; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
84 int distance; |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
85 |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
86 /* generate lookup-tables for dither and index before looping */ |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
87 i = 0; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
88 for (a=0; a < 256; a++) { |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
89 if(i < 4 && a == c->mc_luma_vals[i+1]) { |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
90 distance = c->mc_luma_vals[i+1] - c->mc_luma_vals[i]; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
91 for(b = 0; b <= distance; b++) { |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
92 dither[c->mc_luma_vals[i]+b] = b * (DITHERSTEPS - 1) / distance; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
93 } |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
94 i++; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
95 } |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
96 if(i >=4 ) dither[a] = 0; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
97 index1[a] = i; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
98 index2[a] = FFMIN(i+1, 4); |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
99 } |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
100 /* and render charset */ |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
101 for (charpos = 0; charpos < CHARSET_CHARS; charpos++) { |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
102 lowdiff = 0; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
103 highdiff = 0; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
104 for (y = 0; y < 8; y++) { |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
105 row1 = 0; row2 = 0; |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
106 for (x = 0; x < 4; x++) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
107 pix = best_cb[y * 4 + x]; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
108 |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
109 /* accumulate error for brightest/darkest color */ |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
110 if (index1[pix] >= 3) |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
111 highdiff += pix - c->mc_luma_vals[3]; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
112 if (index1[pix] < 1) |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
113 lowdiff += c->mc_luma_vals[1] - pix; |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
114 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
115 row1 <<= 2; |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
116 |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
117 if(INTERLACED) { |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
118 row2 <<= 2; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
119 if (interlaced_dither_patterns[dither[pix]][(y & 3) * 2 + 0][x & 3]) |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
120 row1 |= 3-(index2[pix] & 3); |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
121 else |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
122 row1 |= 3-(index1[pix] & 3); |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
123 |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
124 if (interlaced_dither_patterns[dither[pix]][(y & 3) * 2 + 1][x & 3]) |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
125 row2 |= 3-(index2[pix] & 3); |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
126 else |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
127 row2 |= 3-(index1[pix] & 3); |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
128 } |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
129 else { |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
130 if (multi_dither_patterns[dither[pix]][(y & 3)][x & 3]) |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
131 row1 |= 3-(index2[pix] & 3); |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
132 else |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
133 row1 |= 3-(index1[pix] & 3); |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
134 } |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
135 } |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
136 charset[y+0x000] = row1; |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
137 if(INTERLACED) charset[y+0x800] = row2; |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
138 } |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
139 /* do we need to adjust pixels? */ |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
140 if (highdiff > 0 && lowdiff > 0) { |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
141 if (lowdiff > highdiff) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
142 for (x = 0; x < 32; x++) |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
143 best_cb[x] = FFMIN(c->mc_luma_vals[3], best_cb[x]); |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
144 } else { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
145 for (x = 0; x < 32; x++) |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
146 best_cb[x] = FFMAX(c->mc_luma_vals[1], best_cb[x]); |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
147 } |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
148 charpos--; /* redo now adjusted char */ |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
149 /* no adjustment needed, all fine */ |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
150 } else { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
151 /* advance pointers */ |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
152 best_cb += 32; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
153 charset += 8; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
154 |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
155 /* remember colorram value */ |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
156 colrammap[charpos] = (highdiff > 0); |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
157 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
158 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
159 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
160 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
161 static av_cold int a64multi_close_encoder(AVCodecContext *avctx) |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
162 { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
163 A64Context *c = avctx->priv_data; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
164 av_free(c->mc_meta_charset); |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
165 av_free(c->mc_best_cb); |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
166 av_free(c->mc_charset); |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
167 av_free(c->mc_charmap); |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
168 av_free(c->mc_colram); |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
169 return 0; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
170 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
171 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
172 static av_cold int a64multi_init_encoder(AVCodecContext *avctx) |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
173 { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
174 A64Context *c = avctx->priv_data; |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
175 int a; |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
176 av_lfg_init(&c->randctx, 1); |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
177 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
178 if (avctx->global_quality < 1) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
179 c->mc_lifetime = 4; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
180 } else { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
181 c->mc_lifetime = avctx->global_quality /= FF_QP2LAMBDA; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
182 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
183 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
184 av_log(avctx, AV_LOG_INFO, "charset lifetime set to %d frame(s)\n", c->mc_lifetime); |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
185 |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
186 /* precalc luma values for later use */ |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
187 for (a = 0; a < 5; a++) { |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
188 c->mc_luma_vals[a]=a64_palette[mc_colors[a]][0] * 0.30 + |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
189 a64_palette[mc_colors[a]][1] * 0.59 + |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
190 a64_palette[mc_colors[a]][2] * 0.11; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
191 } |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
192 |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
193 c->mc_frame_counter = 0; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
194 c->mc_use_5col = avctx->codec->id == CODEC_ID_A64_MULTI5; |
12446
10b5a51810f9
Checking return values of av_malloc(z) and report an error in case.
bindhammer
parents:
12429
diff
changeset
|
195 |
10b5a51810f9
Checking return values of av_malloc(z) and report an error in case.
bindhammer
parents:
12429
diff
changeset
|
196 if(!(c->mc_meta_charset = av_malloc (32000 * c->mc_lifetime * sizeof(int))) || |
10b5a51810f9
Checking return values of av_malloc(z) and report an error in case.
bindhammer
parents:
12429
diff
changeset
|
197 !(c->mc_best_cb = av_malloc (CHARSET_CHARS * 32 * sizeof(int))) || |
10b5a51810f9
Checking return values of av_malloc(z) and report an error in case.
bindhammer
parents:
12429
diff
changeset
|
198 !(c->mc_charmap = av_mallocz(1000 * c->mc_lifetime * sizeof(int))) || |
10b5a51810f9
Checking return values of av_malloc(z) and report an error in case.
bindhammer
parents:
12429
diff
changeset
|
199 !(c->mc_colram = av_mallocz(CHARSET_CHARS * sizeof(uint8_t))) || |
10b5a51810f9
Checking return values of av_malloc(z) and report an error in case.
bindhammer
parents:
12429
diff
changeset
|
200 !(c->mc_charset = av_malloc (0x800 * (INTERLACED+1) * sizeof(uint8_t)))) { |
10b5a51810f9
Checking return values of av_malloc(z) and report an error in case.
bindhammer
parents:
12429
diff
changeset
|
201 av_log(avctx, AV_LOG_ERROR, "Failed to allocate buffer memory.\n"); |
10b5a51810f9
Checking return values of av_malloc(z) and report an error in case.
bindhammer
parents:
12429
diff
changeset
|
202 return AVERROR(ENOMEM); |
10b5a51810f9
Checking return values of av_malloc(z) and report an error in case.
bindhammer
parents:
12429
diff
changeset
|
203 } |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
204 |
12427
1b8f44e2754e
Setting proper values in extradata for future use in muxer
bindhammer
parents:
12416
diff
changeset
|
205 /* set up extradata */ |
12446
10b5a51810f9
Checking return values of av_malloc(z) and report an error in case.
bindhammer
parents:
12429
diff
changeset
|
206 if(!(avctx->extradata = av_mallocz(8 * 4 + FF_INPUT_BUFFER_PADDING_SIZE))) { |
10b5a51810f9
Checking return values of av_malloc(z) and report an error in case.
bindhammer
parents:
12429
diff
changeset
|
207 av_log(avctx, AV_LOG_ERROR, "Failed to allocate memory for extradata.\n"); |
10b5a51810f9
Checking return values of av_malloc(z) and report an error in case.
bindhammer
parents:
12429
diff
changeset
|
208 return AVERROR(ENOMEM); |
10b5a51810f9
Checking return values of av_malloc(z) and report an error in case.
bindhammer
parents:
12429
diff
changeset
|
209 } |
12427
1b8f44e2754e
Setting proper values in extradata for future use in muxer
bindhammer
parents:
12416
diff
changeset
|
210 avctx->extradata_size = 8 * 4; |
1b8f44e2754e
Setting proper values in extradata for future use in muxer
bindhammer
parents:
12416
diff
changeset
|
211 AV_WB32(avctx->extradata, c->mc_lifetime); |
1b8f44e2754e
Setting proper values in extradata for future use in muxer
bindhammer
parents:
12416
diff
changeset
|
212 AV_WB32(avctx->extradata+16, INTERLACED); |
1b8f44e2754e
Setting proper values in extradata for future use in muxer
bindhammer
parents:
12416
diff
changeset
|
213 |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
214 avcodec_get_frame_defaults(&c->picture); |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
215 avctx->coded_frame = &c->picture; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
216 avctx->coded_frame->pict_type = FF_I_TYPE; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
217 avctx->coded_frame->key_frame = 1; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
218 if (!avctx->codec_tag) |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
219 avctx->codec_tag = AV_RL32("a64m"); |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
220 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
221 return 0; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
222 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
223 |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
224 static void a64_compress_colram(unsigned char *buf, int *charmap, uint8_t *colram) |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
225 { |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
226 int a; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
227 uint8_t temp; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
228 /* only needs to be done in 5col mode */ |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
229 /* XXX could be squeezed to 0x80 bytes */ |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
230 for (a = 0; a < 256; a++) { |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
231 temp = colram[charmap[a + 0x000]] << 0; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
232 temp |= colram[charmap[a + 0x100]] << 1; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
233 temp |= colram[charmap[a + 0x200]] << 2; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
234 if(a < 0xe8) temp |= colram[charmap[a + 0x300]] << 3; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
235 buf[a] = temp << 2; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
236 } |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
237 } |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
238 |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
239 static int a64multi_encode_frame(AVCodecContext *avctx, unsigned char *buf, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
240 int buf_size, void *data) |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
241 { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
242 A64Context *c = avctx->priv_data; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
243 AVFrame *pict = data; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
244 AVFrame *const p = (AVFrame *) & c->picture; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
245 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
246 int frame; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
247 int a; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
248 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
249 int req_size; |
12428 | 250 int num_frames = c->mc_lifetime; |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
251 |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
252 int *charmap = c->mc_charmap; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
253 uint8_t *colram = c->mc_colram; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
254 uint8_t *charset = c->mc_charset; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
255 int *meta = c->mc_meta_charset; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
256 int *best_cb = c->mc_best_cb; |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
257 |
12427
1b8f44e2754e
Setting proper values in extradata for future use in muxer
bindhammer
parents:
12416
diff
changeset
|
258 int charset_size = 0x800 * (INTERLACED + 1); |
1b8f44e2754e
Setting proper values in extradata for future use in muxer
bindhammer
parents:
12416
diff
changeset
|
259 int screen_size = 0x400; |
1b8f44e2754e
Setting proper values in extradata for future use in muxer
bindhammer
parents:
12416
diff
changeset
|
260 int colram_size = 0x100 * c->mc_use_5col; |
1b8f44e2754e
Setting proper values in extradata for future use in muxer
bindhammer
parents:
12416
diff
changeset
|
261 |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
262 /* no data, means end encoding asap */ |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
263 if (!data) { |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
264 /* all done, end encoding */ |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
265 if(!c->mc_lifetime) return 0; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
266 /* no more frames in queue, prepare to flush remaining frames */ |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
267 if(!c->mc_frame_counter) { |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
268 num_frames=c->mc_lifetime; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
269 c->mc_lifetime=0; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
270 } |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
271 /* still frames in queue so limit lifetime to remaining frames */ |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
272 else c->mc_lifetime=c->mc_frame_counter; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
273 } |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
274 /* still new data available */ |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
275 else { |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
276 /* fill up mc_meta_charset with data until lifetime exceeds */ |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
277 if (c->mc_frame_counter < c->mc_lifetime) { |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
278 *p = *pict; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
279 p->pict_type = FF_I_TYPE; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
280 p->key_frame = 1; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
281 to_meta_with_crop(avctx, p, meta + 32000 * c->mc_frame_counter); |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
282 c->mc_frame_counter++; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
283 /* lifetime is not reached so wait for next frame first */ |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
284 return 0; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
285 } |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
286 } |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
287 |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
288 /* lifetime reached so now convert X frames at once */ |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
289 if (c->mc_frame_counter == c->mc_lifetime) { |
12416 | 290 req_size = 0; |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
291 /* any frames to encode? */ |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
292 if(c->mc_lifetime) { |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
293 /* calc optimal new charset + charmaps */ |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
294 ff_init_elbg(meta, 32, 1000 * c->mc_lifetime, best_cb, CHARSET_CHARS, 50, charmap, &c->randctx); |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
295 ff_do_elbg (meta, 32, 1000 * c->mc_lifetime, best_cb, CHARSET_CHARS, 50, charmap, &c->randctx); |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
296 |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
297 /* create colorram map and a c64 readable charset */ |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
298 render_charset(avctx, charset, colram); |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
299 |
12415
04b85031bf00
added/extended some comments in a64multi_encode_frame()
bindhammer
parents:
12410
diff
changeset
|
300 /* copy charset to buf */ |
12429
305987348a98
Clarify code/avoid possible bugs by using precalculated values that are used for extradata as well
bindhammer
parents:
12428
diff
changeset
|
301 memcpy(buf,charset, charset_size); |
12415
04b85031bf00
added/extended some comments in a64multi_encode_frame()
bindhammer
parents:
12410
diff
changeset
|
302 |
04b85031bf00
added/extended some comments in a64multi_encode_frame()
bindhammer
parents:
12410
diff
changeset
|
303 /* advance pointers */ |
12429
305987348a98
Clarify code/avoid possible bugs by using precalculated values that are used for extradata as well
bindhammer
parents:
12428
diff
changeset
|
304 buf += charset_size; |
305987348a98
Clarify code/avoid possible bugs by using precalculated values that are used for extradata as well
bindhammer
parents:
12428
diff
changeset
|
305 charset += charset_size; |
305987348a98
Clarify code/avoid possible bugs by using precalculated values that are used for extradata as well
bindhammer
parents:
12428
diff
changeset
|
306 req_size += charset_size; |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
307 } |
12415
04b85031bf00
added/extended some comments in a64multi_encode_frame()
bindhammer
parents:
12410
diff
changeset
|
308 /* no charset so clean buf */ |
12429
305987348a98
Clarify code/avoid possible bugs by using precalculated values that are used for extradata as well
bindhammer
parents:
12428
diff
changeset
|
309 else memset(buf, 0, charset_size); |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
310 |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
311 /* write x frames to buf */ |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
312 for (frame = 0; frame < c->mc_lifetime; frame++) { |
12415
04b85031bf00
added/extended some comments in a64multi_encode_frame()
bindhammer
parents:
12410
diff
changeset
|
313 /* copy charmap to buf. buf is uchar*, charmap is int*, so no memcpy here, sorry */ |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
314 for (a = 0; a < 1000; a++) { |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
315 buf[a] = charmap[a]; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
316 } |
12415
04b85031bf00
added/extended some comments in a64multi_encode_frame()
bindhammer
parents:
12410
diff
changeset
|
317 /* advance pointers */ |
12429
305987348a98
Clarify code/avoid possible bugs by using precalculated values that are used for extradata as well
bindhammer
parents:
12428
diff
changeset
|
318 buf += screen_size; |
305987348a98
Clarify code/avoid possible bugs by using precalculated values that are used for extradata as well
bindhammer
parents:
12428
diff
changeset
|
319 req_size += screen_size; |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
320 |
12415
04b85031bf00
added/extended some comments in a64multi_encode_frame()
bindhammer
parents:
12410
diff
changeset
|
321 /* compress and copy colram to buf */ |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
322 if(c->mc_use_5col) { |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
323 a64_compress_colram(buf,charmap,colram); |
12415
04b85031bf00
added/extended some comments in a64multi_encode_frame()
bindhammer
parents:
12410
diff
changeset
|
324 /* advance pointers */ |
12429
305987348a98
Clarify code/avoid possible bugs by using precalculated values that are used for extradata as well
bindhammer
parents:
12428
diff
changeset
|
325 buf += colram_size; |
305987348a98
Clarify code/avoid possible bugs by using precalculated values that are used for extradata as well
bindhammer
parents:
12428
diff
changeset
|
326 req_size += colram_size; |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
327 } |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
328 |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
329 /* advance to next charmap */ |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
330 charmap += 1000; |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
331 } |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
332 |
12427
1b8f44e2754e
Setting proper values in extradata for future use in muxer
bindhammer
parents:
12416
diff
changeset
|
333 AV_WB32(avctx->extradata+4, c->mc_frame_counter); |
1b8f44e2754e
Setting proper values in extradata for future use in muxer
bindhammer
parents:
12416
diff
changeset
|
334 AV_WB32(avctx->extradata+8, charset_size); |
1b8f44e2754e
Setting proper values in extradata for future use in muxer
bindhammer
parents:
12416
diff
changeset
|
335 AV_WB32(avctx->extradata+12, screen_size + colram_size); |
1b8f44e2754e
Setting proper values in extradata for future use in muxer
bindhammer
parents:
12416
diff
changeset
|
336 |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
337 /* reset counter */ |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
338 c->mc_frame_counter = 0; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
339 |
12410
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
340 if (req_size > buf_size) { |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
341 av_log(avctx, AV_LOG_ERROR, "buf size too small (need %d, got %d)\n", req_size, buf_size); |
7cf900245fce
added interlacing option and compression option for colorram (lut)
bindhammer
parents:
12409
diff
changeset
|
342 return -1; |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
343 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
344 return req_size; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
345 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
346 return 0; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
347 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
348 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
349 AVCodec a64multi_encoder = { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
350 .name = "a64multi", |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
351 .type = AVMEDIA_TYPE_VIDEO, |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
352 .id = CODEC_ID_A64_MULTI, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
353 .priv_data_size = sizeof(A64Context), |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
354 .init = a64multi_init_encoder, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
355 .encode = a64multi_encode_frame, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
356 .close = a64multi_close_encoder, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
357 .pix_fmts = (enum PixelFormat[]) {PIX_FMT_GRAY8, PIX_FMT_NONE}, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
358 .long_name = NULL_IF_CONFIG_SMALL("Multicolor charset for Commodore 64"), |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
359 .capabilities = CODEC_CAP_DELAY, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
360 }; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
361 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
362 AVCodec a64multi5_encoder = { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
363 .name = "a64multi5", |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
364 .type = AVMEDIA_TYPE_VIDEO, |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
365 .id = CODEC_ID_A64_MULTI5, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
366 .priv_data_size = sizeof(A64Context), |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
367 .init = a64multi_init_encoder, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
368 .encode = a64multi_encode_frame, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
369 .close = a64multi_close_encoder, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
370 .pix_fmts = (enum PixelFormat[]) {PIX_FMT_GRAY8, PIX_FMT_NONE}, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
371 .long_name = NULL_IF_CONFIG_SMALL("Multicolor charset for Commodore 64, extended with 5th color (colram)"), |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
372 .capabilities = CODEC_CAP_DELAY, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
373 }; |