Mercurial > libavcodec.hg
annotate a64multienc.c @ 12409:91db982aaaad libavcodec
fixed some return values and deprecated CODEC_TYPE_VIDEO.
dithering (faster) along a linear gradient now.
author | bindhammer |
---|---|
date | Tue, 24 Aug 2010 14:02:31 +0000 |
parents | f25a00f68cfa |
children | 7cf900245fce |
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 |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
35 |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
36 /* gray gradient */ |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
37 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
|
38 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
39 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
|
40 { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
41 int blockx, blocky, x, y; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
42 int luma = 0; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
43 int height = FFMIN(avctx->height,C64YRES); |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
44 int width = FFMIN(avctx->width ,C64XRES); |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
45 uint8_t *src = p->data[0]; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
46 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
47 for (blocky = 0; blocky < height; blocky += 8) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
48 for (blockx = 0; blockx < C64XRES; blockx += 8) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
49 for (y = blocky; y < blocky+8 && y < height; y++) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
50 for (x = blockx; x < blockx+8 && x < C64XRES; x += 2) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
51 if(x < width) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
52 /* build average over 2 pixels */ |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
53 luma = (src[(x + 0 + y * p->linesize[0])] + |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
54 src[(x + 1 + y * p->linesize[0])]) / 2; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
55 /* 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
|
56 dest[0] = luma; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
57 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
58 dest++; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
59 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
60 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
61 } |
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 } |
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 static void render_charset(AVCodecContext *avctx, uint8_t *charset, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
66 uint8_t *colrammap) |
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 A64Context *c = avctx->priv_data; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
69 uint8_t row1; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
70 int charpos, x, y; |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
71 int a, b; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
72 uint8_t pix; |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
73 int lowdiff, highdiff; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
74 int *best_cb = c->mc_best_cb; |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
75 static uint8_t index1[256]; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
76 static uint8_t index2[256]; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
77 static uint8_t dither[256]; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
78 int i; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
79 int distance; |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
80 |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
81 /* generate lookup-tables for dither and index before looping */ |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
82 i = 0; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
83 for (a=0; a < 256; a++) { |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
84 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
|
85 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
|
86 for(b = 0; b <= distance; b++) { |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
87 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
|
88 } |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
89 i++; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
90 } |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
91 if(i >=4 ) dither[a] = 0; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
92 index1[a] = i; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
93 index2[a] = FFMIN(i+1, 4); |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
94 } |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
95 /* and render charset */ |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
96 for (charpos = 0; charpos < CHARSET_CHARS; charpos++) { |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
97 lowdiff = 0; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
98 highdiff = 0; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
99 for (y = 0; y < 8; y++) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
100 row1 = 0; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
101 for (x = 0; x < 4; x++) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
102 pix = best_cb[y * 4 + x]; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
103 |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
104 /* accumulate error for brightest/darkest color */ |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
105 if (index1[pix] >= 3) |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
106 highdiff += pix - c->mc_luma_vals[3]; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
107 if (index1[pix] < 1) |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
108 lowdiff += c->mc_luma_vals[1] - pix; |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
109 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
110 row1 <<= 2; |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
111 |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
112 if (multi_dither_patterns[dither[pix]][(y & 3)][x & 3]) |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
113 row1 |= 3-(index2[pix] & 3); |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
114 else |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
115 row1 |= 3-(index1[pix] & 3); |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
116 } |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
117 charset[y+0x000] = row1; |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
118 } |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
119 /* do we need to adjust pixels? */ |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
120 if (highdiff > 0 && lowdiff > 0) { |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
121 if (lowdiff > highdiff) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
122 for (x = 0; x < 32; x++) |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
123 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
|
124 } else { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
125 for (x = 0; x < 32; x++) |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
126 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
|
127 } |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
128 charpos--; /* redo now adjusted char */ |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
129 /* no adjustment needed, all fine */ |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
130 } else { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
131 /* advance pointers */ |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
132 best_cb += 32; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
133 charset += 8; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
134 |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
135 /* remember colorram value */ |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
136 colrammap[charpos] = (highdiff > 0) + 8; |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
137 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
138 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
139 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
140 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
141 static av_cold int a64multi_close_encoder(AVCodecContext *avctx) |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
142 { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
143 A64Context *c = avctx->priv_data; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
144 av_free(c->mc_meta_charset); |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
145 av_free(c->mc_best_cb); |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
146 av_free(c->mc_charmap); |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
147 av_free(c->mc_charset); |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
148 return 0; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
149 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
150 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
151 static av_cold int a64multi_init_encoder(AVCodecContext *avctx) |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
152 { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
153 A64Context *c = avctx->priv_data; |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
154 int a; |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
155 av_lfg_init(&c->randctx, 1); |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
156 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
157 if (avctx->global_quality < 1) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
158 c->mc_lifetime = 4; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
159 } else { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
160 c->mc_lifetime = avctx->global_quality /= FF_QP2LAMBDA; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
161 } |
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 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
|
164 |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
165 /* precalc luma values for later use */ |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
166 for (a = 0; a < 5; a++) { |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
167 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
|
168 a64_palette[mc_colors[a]][1] * 0.59 + |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
169 a64_palette[mc_colors[a]][2] * 0.11; |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
170 } |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
171 |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
172 c->mc_frame_counter = 0; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
173 c->mc_use_5col = avctx->codec->id == CODEC_ID_A64_MULTI5; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
174 c->mc_meta_charset = av_malloc(32000 * c->mc_lifetime * sizeof(int)); |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
175 c->mc_best_cb = av_malloc(CHARSET_CHARS * 32 * sizeof(int)); |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
176 c->mc_charmap = av_malloc(1000 * c->mc_lifetime * sizeof(int)); |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
177 c->mc_charset = av_malloc(0x800 * sizeof(uint8_t)); |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
178 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
179 avcodec_get_frame_defaults(&c->picture); |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
180 avctx->coded_frame = &c->picture; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
181 avctx->coded_frame->pict_type = FF_I_TYPE; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
182 avctx->coded_frame->key_frame = 1; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
183 if (!avctx->codec_tag) |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
184 avctx->codec_tag = AV_RL32("a64m"); |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
185 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
186 return 0; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
187 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
188 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
189 static int a64multi_encode_frame(AVCodecContext *avctx, unsigned char *buf, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
190 int buf_size, void *data) |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
191 { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
192 A64Context *c = avctx->priv_data; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
193 AVFrame *pict = data; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
194 AVFrame *const p = (AVFrame *) & c->picture; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
195 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
196 int frame; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
197 int a; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
198 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
199 uint8_t colrammap[256]; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
200 int *charmap = c->mc_charmap; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
201 int *meta = c->mc_meta_charset; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
202 int *best_cb = c->mc_best_cb; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
203 int frm_size = 0x400 + 0x400 * c->mc_use_5col; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
204 int req_size; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
205 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
206 /* it is the last frame so prepare to flush */ |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
207 if (!data) |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
208 c->mc_lifetime = c->mc_frame_counter; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
209 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
210 req_size = 0x800 + frm_size * c->mc_lifetime; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
211 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
212 if (req_size > buf_size) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
213 av_log(avctx, AV_LOG_ERROR, "buf size too small (need %d, got %d)\n", req_size, buf_size); |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
214 return AVERROR(EINVAL); |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
215 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
216 /* fill up mc_meta_charset with framedata until lifetime exceeds */ |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
217 if (c->mc_frame_counter < c->mc_lifetime) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
218 *p = *pict; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
219 p->pict_type = FF_I_TYPE; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
220 p->key_frame = 1; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
221 to_meta_with_crop(avctx, p, meta + 32000 * c->mc_frame_counter); |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
222 c->mc_frame_counter++; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
223 /* lifetime is not reached */ |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
224 return 0; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
225 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
226 /* lifetime exceeded so now convert X frames at once */ |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
227 if (c->mc_frame_counter == c->mc_lifetime && c->mc_lifetime > 0) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
228 c->mc_frame_counter = 0; |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
229 ff_init_elbg(meta, 32, 1000 * c-> mc_lifetime, best_cb, CHARSET_CHARS, 5, charmap, &c->randctx); |
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
230 ff_do_elbg (meta, 32, 1000 * c-> mc_lifetime, best_cb, CHARSET_CHARS, 5, charmap, &c->randctx); |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
231 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
232 render_charset(avctx, buf, colrammap); |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
233 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
234 for (frame = 0; frame < c->mc_lifetime; frame++) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
235 for (a = 0; a < 1000; a++) { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
236 buf[0x800 + a] = charmap[a]; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
237 if (c->mc_use_5col) buf[0xc00 + a] = colrammap[charmap[a]]; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
238 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
239 buf += frm_size; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
240 charmap += 1000; |
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 return req_size; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
243 } |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
244 return 0; |
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 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
247 AVCodec a64multi_encoder = { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
248 .name = "a64multi", |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
249 .type = AVMEDIA_TYPE_VIDEO, |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
250 .id = CODEC_ID_A64_MULTI, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
251 .priv_data_size = sizeof(A64Context), |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
252 .init = a64multi_init_encoder, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
253 .encode = a64multi_encode_frame, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
254 .close = a64multi_close_encoder, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
255 .pix_fmts = (enum PixelFormat[]) {PIX_FMT_GRAY8, PIX_FMT_NONE}, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
256 .long_name = NULL_IF_CONFIG_SMALL("Multicolor charset for Commodore 64"), |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
257 .capabilities = CODEC_CAP_DELAY, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
258 }; |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
259 |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
260 AVCodec a64multi5_encoder = { |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
261 .name = "a64multi5", |
12409
91db982aaaad
fixed some return values and deprecated CODEC_TYPE_VIDEO.
bindhammer
parents:
12401
diff
changeset
|
262 .type = AVMEDIA_TYPE_VIDEO, |
12401
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
263 .id = CODEC_ID_A64_MULTI5, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
264 .priv_data_size = sizeof(A64Context), |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
265 .init = a64multi_init_encoder, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
266 .encode = a64multi_encode_frame, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
267 .close = a64multi_close_encoder, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
268 .pix_fmts = (enum PixelFormat[]) {PIX_FMT_GRAY8, PIX_FMT_NONE}, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
269 .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
|
270 .capabilities = CODEC_CAP_DELAY, |
f25a00f68cfa
Initial version of the a64 (multicolor charset) codec
bindhammer
parents:
diff
changeset
|
271 }; |