Mercurial > libavcodec.hg
annotate a64multienc.c @ 12483:0159a19bfff7 libavcodec
aacdec: Rework channel mapping compatibility hacks.
For a PCE based configuration map the channels solely based on tags.
For an indexed configuration map the channels solely based on position.
This works with all known exotic samples including al17, elem_id0, bad_concat,
and lfe_is_sce.
author | alexc |
---|---|
date | Fri, 10 Sep 2010 18:01:48 +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 }; |