annotate a64multienc.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 10b5a51810f9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
06453ad84991 enable a flexible lifetime
bindhammer
parents: 12427
diff changeset
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
87e6af0a6a5a cleanup a bit in a64multi_encode_frame()
bindhammer
parents: 12415
diff changeset
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 };